ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTUxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0wLDAgKzEsNzM2IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBEb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWFpbm1lbnUgIkxpbnV4IEtlcm5lbCBDb25maWd1cmF0aW9uIgorCitjb25maWcgQVJNCisJYm9vbAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBBUk0gc2VyaWVzIGlzIGEgbGluZSBvZiBsb3ctcG93ZXItY29uc3VtcHRpb24gUklTQyBjaGlwIGRlc2lnbnMKKwkgIGxpY2Vuc2VkIGJ5IEFSTSBsdGQgYW5kIHRhcmdldGVkIGF0IGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQKKwkgIGhhbmRoZWxkcyBzdWNoIGFzIHRoZSBDb21wYXEgSVBBUS4gIEFSTS1iYXNlZCBQQ3MgYXJlIG5vIGxvbmdlcgorCSAgbWFudWZhY3R1cmVkLCBidXQgIGxlZ2FjeSBBUk0tYmFzZWQgUEMgaGFyZHdhcmUgcmVtYWlucyBwb3B1bGFyIGluCisJICBFdXJvcGUuICBUaGVyZSBpcyBhbiBBUk0gTGludXggcHJvamVjdCB3aXRoIGEgd2ViIHBhZ2UgYXQKKwkgIDxodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvPi4KKworY29uZmlnIE1NVQorCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEVJU0EKKwlib29sCisJLS0taGVscC0tLQorCSAgVGhlIEV4dGVuZGVkIEluZHVzdHJ5IFN0YW5kYXJkIEFyY2hpdGVjdHVyZSAoRUlTQSkgYnVzIHdhcworCSAgZGV2ZWxvcGVkIGFzIGFuIG9wZW4gYWx0ZXJuYXRpdmUgdG8gdGhlIElCTSBNaWNyb0NoYW5uZWwgYnVzLgorCisJICBUaGUgRUlTQSBidXMgcHJvdmlkZWQgc29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgdGhlIElCTSBNaWNyb0NoYW5uZWwKKwkgIGJ1cyB3aGlsZSBtYWludGFpbmluZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggY2FyZHMgbWFkZSBmb3IKKwkgIHRoZSBvbGRlciBJU0EgYnVzLiAgVGhlIEVJU0EgYnVzIHNhdyBsaW1pdGVkIHVzZSBiZXR3ZWVuIDE5ODggYW5kCisJICAxOTk1IHdoZW4gaXQgd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIFBDSSBidXMuCisKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYW4gRUlTQS1iYXNlZCBtYWNoaW5lLgorCisJICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgU0JVUworCWJvb2wKKworY29uZmlnIE1DQQorCWJvb2wKKwloZWxwCisJICBNaWNyb0NoYW5uZWwgQXJjaGl0ZWN0dXJlIGlzIGZvdW5kIGluIHNvbWUgSUJNIFBTLzIgbWFjaGluZXMgYW5kCisJICBsYXB0b3BzLiAgSXQgaXMgYSBidXMgc3lzdGVtIHNpbWlsYXIgdG8gUENJIG9yIElTQS4gU2VlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21jYS50eHQ+IChhbmQgZXNwZWNpYWxseSB0aGUgd2ViIHBhZ2UgZ2l2ZW4KKwkgIHRoZXJlKSBiZWZvcmUgYXR0ZW1wdGluZyB0byBidWlsZCBhbiBNQ0EgYnVzIGtlcm5lbC4KKworY29uZmlnIFVJRDE2CisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSworCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCisJYm9vbAorCitjb25maWcgR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0JVU1RfU1BJTkxPQ0sKKwlib29sCisKK2NvbmZpZyBHRU5FUklDX0lTQV9ETUEKKwlib29sCisKK2NvbmZpZyBHRU5FUklDX0lPTUFQCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgRklRCisJYm9vbAorCitzb3VyY2UgImluaXQvS2NvbmZpZyIKKworbWVudSAiU3lzdGVtIFR5cGUiCisKK2Nob2ljZQorCXByb21wdCAiQVJNIHN5c3RlbSB0eXBlIgorCWRlZmF1bHQgQVJDSF9SUEMKKworY29uZmlnIEFSQ0hfQ0xQUzc1MDAKKwlib29sICJDaXJydXMtQ0wtUFM3NTAwRkUiCisJc2VsZWN0IFRJTUVSX0FDT1JOCisKK2NvbmZpZyBBUkNIX0NMUFM3MTFYCisJYm9vbCAiQ0xQUzcxMXgvRVA3MjF4LWJhc2VkIgorCitjb25maWcgQVJDSF9DTzI4NQorCWJvb2wgIkNvLUVCU0EyODUiCisJc2VsZWN0IEZPT1RCUklER0UKKwlzZWxlY3QgRk9PVEJSSURHRV9BRERJTgorCitjb25maWcgQVJDSF9FQlNBMTEwCisJYm9vbCAiRUJTQS0xMTAiCisJaGVscAorCSAgVGhpcyBpcyBhbiBldmFsdWF0aW9uIGJvYXJkIGZvciB0aGUgU3Ryb25nQVJNIHByb2Nlc3NvciBhdmFpbGFibGUKKwkgIGZyb20gRGlnaXRhbC4gSXQgaGFzIGxpbWl0ZWQgaGFyZHdhcmUgb24tYm9hcmQsIGluY2x1ZGluZyBhbiBvbmJvYXJkCisJICBFdGhlcm5ldCBpbnRlcmZhY2UsIHR3byBQQ01DSUEgc29ja2V0cywgdHdvIHNlcmlhbCBwb3J0cyBhbmQgYQorCSAgcGFyYWxsZWwgcG9ydC4KKworY29uZmlnIEFSQ0hfQ0FNRUxPVAorCWJvb2wgIkVweGExMGRiIgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBBbHRlcmEncyBFeGNhbGlidXIgWEExMCBkZXZlbG9wbWVudCBib2FyZC4KKwkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIHlvdXIga2VybmVsIHRvIHJ1biBvbiBvbmUgb2YgdGhlc2UgYm9hcmRzCisJICB0aGVuIHlvdSBtdXN0IHNheSAnWScgaGVyZS4gT3RoZXJ3aXNlIHNheSAnTicKKworY29uZmlnIEFSQ0hfRk9PVEJSSURHRQorCWJvb2wgIkZvb3RCcmlkZ2UiCisJc2VsZWN0IEZPT1RCUklER0UKKworY29uZmlnIEFSQ0hfSU5URUdSQVRPUgorCWJvb2wgIkludGVncmF0b3IiCisJc2VsZWN0IEFSTV9BTUJBCisJc2VsZWN0IElDU1Q1MjUKKworY29uZmlnIEFSQ0hfSU9QM1hYCisJYm9vbCAiSU9QM3h4LWJhc2VkIgorCitjb25maWcgQVJDSF9JWFA0WFgKKwlib29sICJJWFA0eHgtYmFzZWQiCisJc2VsZWN0IERNQUJPVU5DRQorCitjb25maWcgQVJDSF9JWFAyMDAwCisJYm9vbCAiSVhQMjQwMC8yODAwLWJhc2VkIgorCitjb25maWcgQVJDSF9MNzIwMAorCWJvb2wgIkxpbmtVcC1MNzIwMCIKKwlzZWxlY3QgRklRCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhIExpbmtVcCBTeXN0ZW1zCisJICBMNzIwMCBTb2Z0d2FyZSBEZXZlbG9wbWVudCBCb2FyZCB3aGljaCB1c2VzIGFuIEFSTTcyMFQgcHJvY2Vzc29yLgorCSAgSW5mb3JtYXRpb24gb24gdGhpcyBib2FyZCBjYW4gYmUgb2J0YWluZWQgYXQ6CisKKwkgIDxodHRwOi8vd3d3Lmxpbmt1cHN5cy5jb20vPgorCisJICBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIG9yIGNvbW1lbnRzIGFib3V0IHRoZSBMaW51eCBrZXJuZWwgcG9ydAorCSAgdG8gdGhpcyBib2FyZCwgc2VuZCBlLW1haWwgdG8gPHNqaGlsbEBjb3R3LmNvbT4uCisKK2NvbmZpZyBBUkNIX1BYQQorCWJvb2wgIlBYQTJ4eC1iYXNlZCIKKworY29uZmlnIEFSQ0hfUlBDCisJYm9vbCAiUmlzY1BDIgorCXNlbGVjdCBBUkNIX0FDT1JOCisJc2VsZWN0IEZJUQorCXNlbGVjdCBUSU1FUl9BQ09STgorCWhlbHAKKwkgIE9uIHRoZSBBY29ybiBSaXNjLVBDLCBMaW51eCBjYW4gc3VwcG9ydCB0aGUgaW50ZXJuYWwgSURFIGRpc2sgYW5kCisJICBDRC1ST00gaW50ZXJmYWNlLCBzZXJpYWwgYW5kIHBhcmFsbGVsIHBvcnQsIGFuZCB0aGUgZmxvcHB5IGRyaXZlLgorCitjb25maWcgQVJDSF9TQTExMDAKKwlib29sICJTQTExMDAtYmFzZWQiCisKK2NvbmZpZyBBUkNIX1MzQzI0MTAKKwlib29sICJTYW1zdW5nIFMzQzI0MTAiCisJaGVscAorCSAgU2Ftc3VuZyBTM0MyNDEwWCBDUFUgYmFzZWQgc3lzdGVtcywgc3VjaCBhcyB0aGUgU2ltdGVjIEVsZWN0cm9uaWNzCisJICBCQVNUICg8aHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvRUIxMTBJVFgvPiksIHRoZSBJUEFRIDE5NDAgb3IKKwkgIHRoZSBTYW1zdW5nIFNNREsyNDEwIGRldmVsb3BtZW50IGJvYXJkIChhbmQgZGVydmlhdGl2ZXMpLgorCitjb25maWcgQVJDSF9TSEFSSworCWJvb2wgIlNoYXJrIgorCitjb25maWcgQVJDSF9MSDdBNDBYCisJYm9vbCAiU2hhcnAgTEg3QTQwWCIKKwloZWxwCisJICBTYXkgWSBoZXJlIGZvciBzeXN0ZW1zIGJhc2VkIG9uIG9uZSBvZiB0aGUgU2hhcnAgTEg3QTQwWAorCSAgU3lzdGVtIG9uIGEgQ2hpcCBwcm9jZXNzb3JzLiAgVGhlc2UgQ1BVcyBpbmNsdWRlIGFuIEFSTTkyMlQKKwkgIGNvcmUgd2l0aCBhIHdpZGUgYXJyYXkgb2YgaW50ZWdyYXRlZCBkZXZpY2VzIGZvcgorCSAgaGFuZC1oZWxkIGFuZCBsb3ctcG93ZXIgYXBwbGljYXRpb25zLgorCitjb25maWcgQVJDSF9PTUFQCisJYm9vbCAiVEkgT01BUCIKKworY29uZmlnIEFSQ0hfVkVSU0FUSUxFCisJYm9vbCAiVmVyc2F0aWxlIgorCXNlbGVjdCBBUk1fQU1CQQorCXNlbGVjdCBJQ1NUMzA3CisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEFSTSBMdGQgVmVyc2F0aWxlIGJvYXJkLgorCitjb25maWcgQVJDSF9JTVgKKwlib29sICJJTVgiCisKK2NvbmZpZyBBUkNIX0g3MjBYCisJYm9vbCAiSHluaXgtSE1TNzIweC1iYXNlZCIKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgSHluaXggSE1TNzIweAorCitlbmRjaG9pY2UKKworc291cmNlICJhcmNoL2FybS9tYWNoLWNscHM3MTF4L0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvYXJtL21hY2gtaW9wM3h4L0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZyIKKworc291cmNlICJhcmNoL2FybS9tYWNoLWl4cDIwMDAvS2NvbmZpZyIKKworc291cmNlICJhcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvYXJtL21hY2gtc2ExMTAwL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC1vbWFwL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC1saDdhNDB4L0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyIKKworc291cmNlICJhcmNoL2FybS9tYWNoLWg3MjB4L0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZyIKKworIyBEZWZpbml0aW9ucyB0byBtYWtlIGxpZmUgZWFzaWVyCitjb25maWcgQVJDSF9BQ09STgorCWJvb2wKKworc291cmNlIGFyY2gvYXJtL21tL0tjb25maWcKKworIyAgYm9vbCAnVXNlIFhTY2FsZSBQTVUgYXMgdGltZXIgc291cmNlJyBDT05GSUdfWFNDQUxFX1BNVV9USU1FUgorY29uZmlnIFhTQ0FMRV9QTVUKKwlib29sCisJZGVwZW5kcyBvbiBDUFVfWFNDQUxFICYmICFYU0NBTEVfUE1VX1RJTUVSCisJZGVmYXVsdCB5CisKK2VuZG1lbnUKKworc291cmNlICJhcmNoL2FybS9jb21tb24vS2NvbmZpZyIKKworY29uZmlnIEZPUkNFX01BWF9aT05FT1JERVIKKwlpbnQKKwlkZXBlbmRzIG9uIFNBMTExMQorCWRlZmF1bHQgIjkiCisKK21lbnUgIkJ1cyBzdXBwb3J0IgorCitjb25maWcgQVJNX0FNQkEKKwlib29sCisKK2NvbmZpZyBJU0EKKwlib29sCisJZGVwZW5kcyBvbiBGT09UQlJJREdFX0hPU1QgfHwgQVJDSF9TSEFSSyB8fCBBUkNIX0NMUFM3NTAwIHx8IEFSQ0hfRUJTQTExMCB8fCBBUkNIX0NEQjg5NzEyIHx8IEFSQ0hfRURCNzIxMSB8fCBBUkNIX1NBMTEwMCB8fCBBUkNIX01YMUFEUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgSVNBIHNsb3RzIG9uIHlvdXIgbW90aGVyYm9hcmQuICBJU0EgaXMgdGhlCisJICBuYW1lIG9mIGEgYnVzIHN5c3RlbSwgaS5lLiB0aGUgd2F5IHRoZSBDUFUgdGFsa3MgdG8gdGhlIG90aGVyIHN0dWZmCisJICBpbnNpZGUgeW91ciBib3guICBPdGhlciBidXMgc3lzdGVtcyBhcmUgUENJLCBFSVNBLCBNaWNyb0NoYW5uZWwKKwkgIChNQ0EpIG9yIFZFU0EuICBJU0EgaXMgYW4gb2xkZXIgc3lzdGVtLCBub3cgYmVpbmcgZGlzcGxhY2VkIGJ5IFBDSTsKKwkgIG5ld2VyIGJvYXJkcyBkb24ndCBzdXBwb3J0IGl0LiAgSWYgeW91IGhhdmUgSVNBLCBzYXkgWSwgb3RoZXJ3aXNlIE4uCisKK2NvbmZpZyBJU0FfRE1BCisJYm9vbAorCWRlcGVuZHMgb24gRk9PVEJSSURHRV9IT1NUIHx8IEFSQ0hfU0hBUksKKwlkZWZhdWx0IHkKKworY29uZmlnIFBDSQorCWJvb2wgIlBDSSBzdXBwb3J0IiBpZiBBUkNIX0lOVEVHUkFUT1JfQVAKKwlkZWZhdWx0IHkgaWYgQVJDSF9TSEFSSyB8fCBGT09UQlJJREdFX0hPU1QgfHwgQVJDSF9JT1AzWFggfHwgQVJDSF9JWFA0WFggfHwgQVJDSF9JWFAyMDAwCisJaGVscAorCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBhIFBDSSBtb3RoZXJib2FyZC4gUENJIGlzIHRoZSBuYW1lIG9mIGEKKwkgIGJ1cyBzeXN0ZW0sIGkuZS4gdGhlIHdheSB0aGUgQ1BVIHRhbGtzIHRvIHRoZSBvdGhlciBzdHVmZiBpbnNpZGUKKwkgIHlvdXIgYm94LiBPdGhlciBidXMgc3lzdGVtcyBhcmUgSVNBLCBFSVNBLCBNaWNyb0NoYW5uZWwgKE1DQSkgb3IKKwkgIFZFU0EuIElmIHlvdSBoYXZlIFBDSSwgc2F5IFksIG90aGVyd2lzZSBOLgorCisJICBUaGUgUENJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgY29udGFpbnMgdmFsdWFibGUKKwkgIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIFBDSSBoYXJkd2FyZSBkb2VzIHdvcmsgdW5kZXIgTGludXggYW5kIHdoaWNoCisJICBkb2Vzbid0LgorCisjIFNlbGVjdCB0aGUgaG9zdCBicmlkZ2UgdHlwZQorY29uZmlnIFBDSV9IT1NUX1ZJQTgyQzUwNQorCWJvb2wKKwlkZXBlbmRzIG9uIFBDSSAmJiBBUkNIX1NIQVJLCisJZGVmYXVsdCB5CisKK3NvdXJjZSAiZHJpdmVycy9wY2kvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3BjbWNpYS9LY29uZmlnIgorCitlbmRtZW51CisKK21lbnUgIktlcm5lbCBGZWF0dXJlcyIKKworY29uZmlnIFNNUAorCWJvb2wgIlN5bW1ldHJpYyBNdWx0aS1Qcm9jZXNzaW5nIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIG4KKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQorCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIGxpa2UgbW9zdCBwZXJzb25hbCBjb21wdXRlcnMsIHNheSBOLiBJZgorCSAgeW91IGhhdmUgYSBzeXN0ZW0gd2l0aCBtb3JlIHRoYW4gb25lIENQVSwgc2F5IFkuCisKKwkgIElmIHlvdSBzYXkgTiBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIHNpbmdsZSBhbmQgbXVsdGlwcm9jZXNzb3IKKwkgIG1hY2hpbmVzLCBidXQgd2lsbCB1c2Ugb25seSBvbmUgQ1BVIG9mIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZS4gSWYKKwkgIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIG1hbnksIGJ1dCBub3QgYWxsLCBzaW5nbGUKKwkgIHByb2Nlc3NvciBtYWNoaW5lcy4gT24gYSBzaW5nbGUgcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwgd2lsbAorCSAgcnVuIGZhc3RlciBpZiB5b3Ugc2F5IE4gaGVyZS4KKworCSAgU2VlIGFsc28gdGhlIDxmaWxlOkRvY3VtZW50YXRpb24vc21wLnRleD4sCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NtcC50eHQ+LCA8ZmlsZTpEb2N1bWVudGF0aW9uL2kzODYvSU8tQVBJQy50eHQ+LAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9ubWlfd2F0Y2hkb2cudHh0PiBhbmQgdGhlIFNNUC1IT1dUTyBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCitjb25maWcgTlJfQ1BVUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0zMikiCisJcmFuZ2UgMiAzMgorCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAiNCIKKworY29uZmlnIFBSRUVNUFQKKwlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgd2hlbiByZWFjdGluZyB0bworCSAgcmVhbC10aW1lIG9yIGludGVyYWN0aXZlIGV2ZW50cyBieSBhbGxvd2luZyBhIGxvdyBwcmlvcml0eSBwcm9jZXNzIHRvCisJICBiZSBwcmVlbXB0ZWQgZXZlbiBpZiBpdCBpcyBpbiBrZXJuZWwgbW9kZSBleGVjdXRpbmcgYSBzeXN0ZW0gY2FsbC4KKwkgIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBydW4gbW9yZSByZWxpYWJseSBldmVuIHdoZW4gdGhlIHN5c3RlbSBpcworCSAgdW5kZXIgbG9hZC4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3AsIGVtYmVkZGVkCisJICBvciByZWFsLXRpbWUgc3lzdGVtLiAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBESVNDT05USUdNRU0KKwlib29sCisJZGVwZW5kcyBvbiBBUkNIX0VEQjcyMTEgfHwgQVJDSF9TQTExMDAgfHwgKEFSQ0hfTEg3QTQwWCAmJiAhTEg3QTQwWF9DT05USUdNRU0pCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgdG8gc3VwcG9ydCBlZmZpY2llbnQgaGFuZGxpbmcgb2YgZGlzY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnksCisJICBmb3IgYXJjaGl0ZWN0dXJlcyB3aGljaCBhcmUgZWl0aGVyIE5VTUEgKE5vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MpCisJICBvciBoYXZlIGh1Z2UgaG9sZXMgaW4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgZm9yIG90aGVyIHJlYXNvbnMuCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92bS9udW1hPiBmb3IgbW9yZS4KKworY29uZmlnIExFRFMKKwlib29sICJUaW1lciBhbmQgQ1BVIHVzYWdlIExFRHMiCisJZGVwZW5kcyBvbiBBUkNIX0NEQjg5NzEyIHx8IEFSQ0hfQ08yODUgfHwgQVJDSF9FQlNBMTEwIHx8IFwKKwkJICAgQVJDSF9FQlNBMjg1IHx8IEFSQ0hfSU1YIHx8IEFSQ0hfSU5URUdSQVRPUiB8fCBcCisJCSAgIEFSQ0hfTFVCQk9DSyB8fCBNQUNIX01BSU5TVE9ORSB8fCBBUkNIX05FVFdJTkRFUiB8fCBcCisJCSAgIEFSQ0hfT01BUCB8fCBBUkNIX1A3MjBUIHx8IEFSQ0hfUFhBX0lEUCB8fCBcCisJCSAgIEFSQ0hfU0ExMTAwIHx8IEFSQ0hfU0hBUksgfHwgQVJDSF9WRVJTQVRJTEUKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIExFRHMgb24geW91ciBtYWNoaW5lIHdpbGwgYmUgdXNlZAorCSAgdG8gcHJvdmlkZSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBjdXJyZW50IHN5c3RlbSBzdGF0dXMuCisKKwkgIElmIHlvdSBhcmUgY29tcGlsaW5nIGEga2VybmVsIGZvciBhIE5ldFdpbmRlciBvciBFQlNBLTI4NSwgeW91IHdpbGwKKwkgIGJlIGFibGUgdG8gc2VsZWN0IHdoaWNoIExFRHMgYXJlIGFjdGl2ZSB1c2luZyB0aGUgb3B0aW9ucyBiZWxvdy4gSWYKKwkgIHlvdSBhcmUgY29tcGlsaW5nIGEga2VybmVsIGZvciB0aGUgRUJTQS0xMTAgb3IgdGhlIExBUlQgaG93ZXZlciwgdGhlCisJICByZWQgTEVEIHdpbGwgc2ltcGx5IGZsYXNoIHJlZ3VsYXJseSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzeXN0ZW0gaXMKKwkgIHN0aWxsIGZ1bmN0aW9uYWwuIEl0IGlzIHNhZmUgdG8gc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIENBVFMKKwkgIHN5c3RlbSwgYnV0IHRoZSBkcml2ZXIgd2lsbCBkbyBub3RoaW5nLgorCitjb25maWcgTEVEU19USU1FUgorCWJvb2wgIlRpbWVyIExFRCIgaWYgKCFBUkNIX0NEQjg5NzEyICYmICFBUkNIX09NQVApIHx8IFwKKwkJCSAgICBNQUNIX09NQVBfSDIgfHwgTUFDSF9PTUFQX1BFUlNFVVMyCisJZGVwZW5kcyBvbiBMRURTCisJZGVmYXVsdCB5IGlmIEFSQ0hfRUJTQTExMAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBvbmUgb2YgdGhlIHN5c3RlbSBMRURzICh0aGUgZ3JlZW4gb25lIG9uIHRoZQorCSAgTmV0V2luZGVyLCB0aGUgYW1iZXIgb25lIG9uIHRoZSBFQlNBMjg1LCBvciB0aGUgcmVkIG9uZSBvbiB0aGUgTEFSVCkKKwkgIHdpbGwgZmxhc2ggcmVndWxhcmx5IHRvIGluZGljYXRlIHRoYXQgdGhlIHN5c3RlbSBpcyBzdGlsbAorCSAgb3BlcmF0aW9uYWwuIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCB0byBrZXJuZWwgaGFja2VycyB3aG8gYXJlCisJICBkZWJ1Z2dpbmcgdW5zdGFibGUga2VybmVscy4KKworCSAgVGhlIExBUlQgdXNlcyB0aGUgc2FtZSBMRUQgZm9yIGJvdGggVGltZXIgTEVEIGFuZCBDUFUgdXNhZ2UgTEVECisJICBmdW5jdGlvbnMuIFlvdSBtYXkgY2hvb3NlIHRvIHVzZSBib3RoLCBidXQgdGhlIFRpbWVyIExFRCBmdW5jdGlvbgorCSAgd2lsbCBvdmVycnVsZSB0aGUgQ1BVIHVzYWdlIExFRC4KKworY29uZmlnIExFRFNfQ1BVCisJYm9vbCAiQ1BVIHVzYWdlIExFRCIgaWYgKCFBUkNIX0NEQjg5NzEyICYmICFBUkNIX0VCU0ExMTAgJiYgXAorCQkJIUFSQ0hfT01BUCkgfHwgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9QRVJTRVVTMgorCWRlcGVuZHMgb24gTEVEUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgcmVkIExFRCB3aWxsIGJlIHVzZWQgdG8gZ2l2ZSBhIGdvb2QgcmVhbAorCSAgdGltZSBpbmRpY2F0aW9uIG9mIENQVSB1c2FnZSwgYnkgbGlnaHRpbmcgd2hlbmV2ZXIgdGhlIGlkbGUgdGFzaworCSAgaXMgbm90IGN1cnJlbnRseSBleGVjdXRpbmcuCisKKwkgIFRoZSBMQVJUIHVzZXMgdGhlIHNhbWUgTEVEIGZvciBib3RoIFRpbWVyIExFRCBhbmQgQ1BVIHVzYWdlIExFRAorCSAgZnVuY3Rpb25zLiBZb3UgbWF5IGNob29zZSB0byB1c2UgYm90aCwgYnV0IHRoZSBUaW1lciBMRUQgZnVuY3Rpb24KKwkgIHdpbGwgb3ZlcnJ1bGUgdGhlIENQVSB1c2FnZSBMRUQuCisKK2NvbmZpZyBBTElHTk1FTlRfVFJBUAorCWJvb2wKKwlkZWZhdWx0IHkgaWYgIUFSQ0hfRUJTQTExMAorCWhlbHAKKwkgIEFSTSBwcm9jZXNzb3JzIGNhbiBub3QgZmV0Y2gvc3RvcmUgaW5mb3JtYXRpb24gd2hpY2ggaXMgbm90CisJICBuYXR1cmFsbHkgYWxpZ25lZCBvbiB0aGUgYnVzLCBpLmUuLCBhIDQgYnl0ZSBmZXRjaCBtdXN0IHN0YXJ0IGF0IGFuCisJICBhZGRyZXNzIGRpdmlzaWJsZSBieSA0LiBPbiAzMi1iaXQgQVJNIHByb2Nlc3NvcnMsIHRoZXNlIG5vbi1hbGlnbmVkCisJICBmZXRjaC9zdG9yZSBpbnN0cnVjdGlvbnMgd2lsbCBiZSBlbXVsYXRlZCBpbiBzb2Z0d2FyZSBpZiB5b3Ugc2F5CisJICBoZXJlLCB3aGljaCBoYXMgYSBzZXZlcmUgcGVyZm9ybWFuY2UgaW1wYWN0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IKKwkgIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIHNvbWUgbmV0d29yayBwcm90b2NvbHMuIFdpdGggYW4gSVAtb25seQorCSAgY29uZmlndXJhdGlvbiBpdCBpcyBzYWZlIHRvIHNheSBOLCBvdGhlcndpc2Ugc2F5IFkuCisKK2VuZG1lbnUKKworbWVudSAiQm9vdCBvcHRpb25zIgorCisjIENvbXByZXNzZWQgYm9vdCBsb2FkZXIgaW4gUk9NLiAgWWVzLCB3ZSByZWFsbHkgd2FudCB0byBhc2sgYWJvdXQKKyMgVEVYVCBhbmQgQlNTIHNvIHdlIHByZXNlcnZlIHRoZWlyIHZhbHVlcyBpbiB0aGUgY29uZmlnIGZpbGVzLgorY29uZmlnIFpCT09UX1JPTV9URVhUCisJaGV4ICJDb21wcmVzc2VkIFJPTSBib290IGxvYWRlciBiYXNlIGFkZHJlc3MiCisJZGVmYXVsdCAiMCIKKwloZWxwCisJICBUaGUgcGh5c2ljYWwgYWRkcmVzcyBhdCB3aGljaCB0aGUgUk9NLWFibGUgekltYWdlIGlzIHRvIGJlCisJICBwbGFjZWQgaW4gdGhlIHRhcmdldC4gIFBsYXRmb3JtcyB3aGljaCBub3JtYWxseSBtYWtlIHVzZSBvZgorCSAgUk9NLWFibGUgekltYWdlIGZvcm1hdHMgbm9ybWFsbHkgc2V0IHRoaXMgdG8gYSBzdWl0YWJsZQorCSAgdmFsdWUgaW4gdGhlaXIgZGVmY29uZmlnIGZpbGUuCisKKwkgIElmIFpCT09UX1JPTSBpcyBub3QgZW5hYmxlZCwgdGhpcyBoYXMgbm8gZWZmZWN0LgorCitjb25maWcgWkJPT1RfUk9NX0JTUworCWhleCAiQ29tcHJlc3NlZCBST00gYm9vdCBsb2FkZXIgQlNTIGFkZHJlc3MiCisJZGVmYXVsdCAiMCIKKwloZWxwCisJICBUaGUgYmFzZSBhZGRyZXNzIG9mIDY0S2lCIG9mIHJlYWQvd3JpdGUgbWVtb3J5IGluIHRoZSB0YXJnZXQKKwkgIGZvciB0aGUgUk9NLWFibGUgekltYWdlLCB3aGljaCBtdXN0IGJlIGF2YWlsYWJsZSB3aGlsZSB0aGUKKwkgIGRlY29tcHJlc3NvciBpcyBydW5uaW5nLiAgUGxhdGZvcm1zIHdoaWNoIG5vcm1hbGx5IG1ha2UgdXNlIG9mCisJICBST00tYWJsZSB6SW1hZ2UgZm9ybWF0cyBub3JtYWxseSBzZXQgdGhpcyB0byBhIHN1aXRhYmxlCisJICB2YWx1ZSBpbiB0aGVpciBkZWZjb25maWcgZmlsZS4KKworCSAgSWYgWkJPT1RfUk9NIGlzIG5vdCBlbmFibGVkLCB0aGlzIGhhcyBubyBlZmZlY3QuCisKK2NvbmZpZyBaQk9PVF9ST00KKwlib29sICJDb21wcmVzc2VkIGJvb3QgbG9hZGVyIGluIFJPTS9mbGFzaCIKKwlkZXBlbmRzIG9uIFpCT09UX1JPTV9URVhUICE9IFpCT09UX1JPTV9CU1MKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gZXhlY3V0ZSB5b3VyIGNvbXByZXNzZWQga2VybmVsIGltYWdlCisJICAoekltYWdlKSBkaXJlY3RseSBmcm9tIFJPTSBvciBmbGFzaC4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDTURMSU5FCisJc3RyaW5nICJEZWZhdWx0IGtlcm5lbCBjb21tYW5kIHN0cmluZyIKKwlkZWZhdWx0ICIiCisJaGVscAorCSAgT24gc29tZSBhcmNoaXRlY3R1cmVzIChFQlNBMTEwIGFuZCBDQVRTKSwgdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheQorCSAgZm9yIHRoZSBib290IGxvYWRlciB0byBwYXNzIGFyZ3VtZW50cyB0byB0aGUga2VybmVsLiBGb3IgdGhlc2UKKwkgIGFyY2hpdGVjdHVyZXMsIHlvdSBzaG91bGQgc3VwcGx5IHNvbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXQgYnVpbGQKKwkgIHRpbWUgYnkgZW50ZXJpbmcgdGhlbSBoZXJlLiBBcyBhIG1pbmltdW0sIHlvdSBzaG91bGQgc3BlY2lmeSB0aGUKKwkgIG1lbW9yeSBzaXplIGFuZCB0aGUgcm9vdCBkZXZpY2UgKGUuZy4sIG1lbT02NE0gcm9vdD0vZGV2L25mcykuCisKK2NvbmZpZyBYSVBfS0VSTkVMCisJYm9vbCAiS2VybmVsIEV4ZWN1dGUtSW4tUGxhY2UgZnJvbSBST00iCisJZGVwZW5kcyBvbiAhWkJPT1RfUk9NCisJaGVscAorCSAgRXhlY3V0ZS1Jbi1QbGFjZSBhbGxvd3MgdGhlIGtlcm5lbCB0byBydW4gZnJvbSBub24tdm9sYXRpbGUgc3RvcmFnZQorCSAgZGlyZWN0bHkgYWRkcmVzc2FibGUgYnkgdGhlIENQVSwgc3VjaCBhcyBOT1IgZmxhc2guIFRoaXMgc2F2ZXMgUkFNCisJICBzcGFjZSBzaW5jZSB0aGUgdGV4dCBzZWN0aW9uIG9mIHRoZSBrZXJuZWwgaXMgbm90IGxvYWRlZCBmcm9tIGZsYXNoCisJICB0byBSQU0uICBSZWFkLXdyaXRlIHNlY3Rpb25zLCBzdWNoIGFzIHRoZSBkYXRhIHNlY3Rpb24gYW5kIHN0YWNrLAorCSAgYXJlIHN0aWxsIGNvcGllZCB0byBSQU0uICBUaGUgWElQIGtlcm5lbCBpcyBub3QgY29tcHJlc3NlZCBzaW5jZQorCSAgaXQgaGFzIHRvIHJ1biBkaXJlY3RseSBmcm9tIGZsYXNoLCBzbyBpdCB3aWxsIHRha2UgbW9yZSBzcGFjZSB0bworCSAgc3RvcmUgaXQuICBUaGUgZmxhc2ggYWRkcmVzcyB1c2VkIHRvIGxpbmsgdGhlIGtlcm5lbCBvYmplY3QgZmlsZXMsCisJICBhbmQgZm9yIHN0b3JpbmcgaXQsIGlzIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW50LiBUaGVyZWZvcmUsIGlmIHlvdQorCSAgc2F5IFkgaGVyZSwgeW91IG11c3Qga25vdyB0aGUgcHJvcGVyIHBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdG8KKwkgIHN0b3JlIHRoZSBrZXJuZWwgaW1hZ2UgZGVwZW5kaW5nIG9uIHlvdXIgb3duIGZsYXNoIG1lbW9yeSB1c2FnZS4KKworCSAgQWxzbyBub3RlIHRoYXQgdGhlIG1ha2UgdGFyZ2V0IGJlY29tZXMgIm1ha2UgeGlwSW1hZ2UiIHJhdGhlciB0aGFuCisJICAibWFrZSB6SW1hZ2UiIG9yICJtYWtlIEltYWdlIi4gIFRoZSBmaW5hbCBrZXJuZWwgYmluYXJ5IHRvIHB1dCBpbgorCSAgUk9NIG1lbW9yeSB3aWxsIGJlIGFyY2gvYXJtL2Jvb3QveGlwSW1hZ2UuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBYSVBfUEhZU19BRERSCisJaGV4ICJYSVAgS2VybmVsIFBoeXNpY2FsIExvY2F0aW9uIgorCWRlcGVuZHMgb24gWElQX0tFUk5FTAorCWRlZmF1bHQgIjB4MDAwODAwMDAiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiB5b3VyIGZsYXNoIG1lbW9yeSB0aGUga2VybmVsIHdpbGwKKwkgIGJlIGxpbmtlZCBmb3IgYW5kIHN0b3JlZCB0by4gIFRoaXMgYWRkcmVzcyBpcyBkZXBlbmRlbnQgb24geW91cgorCSAgb3duIGZsYXNoIHVzYWdlLgorCitlbmRtZW51CisKK2lmIChBUkNIX1NBMTEwMCB8fCBBUkNIX0lOVEVHUkFUT1IpCisKK21lbnUgIkNQVSBGcmVxdWVuY3kgc2NhbGluZyIKKworc291cmNlICJkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyIKKworY29uZmlnIENQVV9GUkVRX1NBMTEwMAorCWJvb2wKKwlkZXBlbmRzIG9uIENQVV9GUkVRICYmIChTQTExMDBfTEFSVCB8fCBTQTExMDBfUExFQikKKwlkZWZhdWx0IHkKKworY29uZmlnIENQVV9GUkVRX1NBMTExMAorCWJvb2wKKwlkZXBlbmRzIG9uIENQVV9GUkVRICYmIChTQTExMDBfQVNTQUJFVCB8fCBTQTExMDBfQ0VSRiB8fCBTQTExMDBfUFRfU1lTVEVNMykKKwlkZWZhdWx0IHkKKworY29uZmlnIENQVV9GUkVRX0lOVEVHUkFUT1IKKwl0cmlzdGF0ZSAiQ1BVZnJlcSBkcml2ZXIgZm9yIEFSTSBJbnRlZ3JhdG9yIENQVXMiCisJZGVwZW5kcyBvbiBBUkNIX0lOVEVHUkFUT1IgJiYgQ1BVX0ZSRVEKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIENQVWZyZXEgZHJpdmVyIGZvciBBUk0gSW50ZWdyYXRvciBDUFVzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcT4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgWS4KKworZW5kbWVudQorCitlbmRpZgorCittZW51ICJGbG9hdGluZyBwb2ludCBlbXVsYXRpb24iCisKK2NvbW1lbnQgIkF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZCIKKworY29uZmlnIEZQRV9OV0ZQRQorCWJvb2wgIk5XRlBFIG1hdGggZW11bGF0aW9uIgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIHRvIGluY2x1ZGUgdGhlIE5XRlBFIGZsb2F0aW5nIHBvaW50IGVtdWxhdG9yIGluIHRoZSBrZXJuZWwuCisJICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBydW4gbW9zdCBiaW5hcmllcy4gTGludXggZG9lcyBub3QgY3VycmVudGx5CisJICBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlIHNvIHlvdSBuZWVkIHRvIHNheSBZIGhlcmUgZXZlbiBpZgorCSAgeW91ciBtYWNoaW5lIGhhcyBhbiBGUEEgb3IgZmxvYXRpbmcgcG9pbnQgY28tcHJvY2Vzc29yIHBvZHVsZS4KKworCSAgWW91IG1heSBzYXkgTiBoZXJlIGlmIHlvdSBhcmUgZ29pbmcgdG8gbG9hZCB0aGUgQWNvcm4gRlBFbXVsYXRvcgorCSAgZWFybHkgaW4gdGhlIGJvb3R1cC4KKworY29uZmlnIEZQRV9OV0ZQRV9YUAorCWJvb2wgIlN1cHBvcnQgZXh0ZW5kZWQgcHJlY2lzaW9uIgorCWRlcGVuZHMgb24gRlBFX05XRlBFICYmICFDUFVfQklHX0VORElBTgorCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgODAtYml0IHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBmbG9hdGluZy1wb2ludAorCSAgZW11bGF0b3IuICBPdGhlcndpc2UsIG9ubHkgMzIgYW5kIDY0LWJpdCBzdXBwb3J0IGlzIGNvbXBpbGVkIGluLgorCSAgTm90ZSB0aGF0IGdjYyBkb2VzIG5vdCBnZW5lcmF0ZSA4MC1iaXQgb3BlcmF0aW9ucyBieSBkZWZhdWx0LAorCSAgc28gaW4gbW9zdCBjYXNlcyB0aGlzIG9wdGlvbiBvbmx5IGVubGFyZ2VzIHRoZSBzaXplIG9mIHRoZQorCSAgZmxvYXRpbmcgcG9pbnQgZW11bGF0b3Igd2l0aG91dCBhbnkgZ29vZCByZWFzb24uCisKKwkgIFlvdSBhbG1vc3Qgc3VyZWx5IHdhbnQgdG8gc2F5IE4gaGVyZS4KKworY29uZmlnIEZQRV9GQVNURlBFCisJYm9vbCAiRmFzdEZQRSBtYXRoIGVtdWxhdGlvbiAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uICFDUFVfMzJ2MyAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIEZBU1QgZmxvYXRpbmcgcG9pbnQgZW11bGF0b3IgaW4gdGhlIGtlcm5lbC4KKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIG11Y2ggZmFzdGVyIGVtdWxhdG9yIHdoaWNoIG5vdyBhbHNvIGhhcyBmdWxsCisJICBwcmVjaXNpb24gZm9yIHRoZSBtYW50aXNzYS4gIEl0IGRvZXMgbm90IHN1cHBvcnQgYW55IGV4Y2VwdGlvbnMuCisJICBJdCBpcyB2ZXJ5IHNpbXBsZSwgYW5kIGFwcHJveGltYXRlbHkgMy02IHRpbWVzIGZhc3RlciB0aGFuIE5XRlBFLgorCisJICBJdCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgbW9zdCBwcm9ncmFtcy4gIEl0IG1heSBiZSBub3Qgc3VpdGFibGUKKwkgIGZvciBzY2llbnRpZmljIGNhbGN1bGF0aW9ucywgYnV0IHlvdSBoYXZlIHRvIGNoZWNrIHRoaXMgZm9yIHlvdXJzZWxmLgorCSAgSWYgeW91IGRvIG5vdCBmZWVsIHlvdSBuZWVkIGEgZmFzdGVyIEZQIGVtdWxhdGlvbiB5b3Ugc2hvdWxkIGJldHRlcgorCSAgY2hvb3NlIE5XRlBFLgorCitjb25maWcgVkZQCisJYm9vbCAiVkZQLWZvcm1hdCBmbG9hdGluZyBwb2ludCBtYXRocyIKKwlkZXBlbmRzIG9uIENQVV9WNiB8fCBDUFVfQVJNOTI2VAorCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgVkZQIHN1cHBvcnQgY29kZSBpbiB0aGUga2VybmVsLiBUaGlzIGlzIG5lZWRlZAorCSAgaWYgeW91ciBoYXJkd2FyZSBpbmNsdWRlcyBhIFZGUCB1bml0LgorCisJICBQbGVhc2Ugc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL1ZGUC9yZWxlYXNlLW5vdGVzLnR4dD4gZm9yCisJICByZWxlYXNlIG5vdGVzIGFuZCBhZGRpdGlvbmFsIHN0YXR1cyBpbmZvcm1hdGlvbi4KKworCSAgU2F5IE4gaWYgeW91ciB0YXJnZXQgZG9lcyBub3QgaGF2ZSBWRlAgaGFyZHdhcmUuCisKK2VuZG1lbnUKKworbWVudSAiVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzIgorCitzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgorCitjb25maWcgQVJUSFVSCisJdHJpc3RhdGUgIlJJU0MgT1MgcGVyc29uYWxpdHkiCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHRoZSBrZXJuZWwgY29kZSBuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gcnVuCisJICBBY29ybiBSSVNDIE9TL0FydGh1ciBiaW5hcmllcyB1bmRlciBMaW51eC4gVGhpcyBjb2RlIGlzIHN0aWxsIHZlcnkKKwkgIGV4cGVyaW1lbnRhbDsgaWYgdGhpcyBzb3VuZHMgZnJpZ2h0ZW5pbmcsIHNheSBOIGFuZCBzbGVlcCBpbiBwZWFjZS4KKwkgIFlvdSBjYW4gYWxzbyBzYXkgTSBoZXJlIHRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlICh3aGljaAorCSAgd2lsbCBiZSBjYWxsZWQgYXJ0aHVyKS4KKworZW5kbWVudQorCittZW51ICJQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMiCisKK2NvbmZpZyBQTQorCWJvb2wgIlBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICAiUG93ZXIgTWFuYWdlbWVudCIgbWVhbnMgdGhhdCBwYXJ0cyBvZiB5b3VyIGNvbXB1dGVyIGFyZSBzaHV0CisJICBvZmYgb3IgcHV0IGludG8gYSBwb3dlciBjb25zZXJ2aW5nICJzbGVlcCIgbW9kZSBpZiB0aGV5IGFyZSBub3QKKwkgIGJlaW5nIHVzZWQuICBUaGVyZSBhcmUgdHdvIGNvbXBldGluZyBzdGFuZGFyZHMgZm9yIGRvaW5nIHRoaXM6IEFQTQorCSAgYW5kIEFDUEkuICBJZiB5b3Ugd2FudCB0byB1c2UgZWl0aGVyIG9uZSwgc2F5IFkgaGVyZSBhbmQgdGhlbiBhbHNvCisJICB0byB0aGUgcmVxdWlzaXRlIHN1cHBvcnQgYmVsb3cuCisKKwkgIFBvd2VyIE1hbmFnZW1lbnQgaXMgbW9zdCBpbXBvcnRhbnQgZm9yIGJhdHRlcnkgcG93ZXJlZCBsYXB0b3AKKwkgIGNvbXB1dGVyczsgaWYgeW91IGhhdmUgYSBsYXB0b3AsIGNoZWNrIG91dCB0aGUgTGludXggTGFwdG9wIGhvbWUKKwkgIHBhZ2Ugb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5saW51eC1vbi1sYXB0b3BzLmNvbS8+IG9yCisJICBUdXhtb2JpbCAtIExpbnV4IG9uIE1vYmlsZSBDb21wdXRlcnMgYXQgPGh0dHA6Ly93d3cudHV4bW9iaWwub3JnLz4KKwkgIGFuZCB0aGUgQmF0dGVyeSBQb3dlcmVkIExpbnV4IG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQsIGV2ZW4gaWYgeW91IHNheSBOIGhlcmUsIExpbnV4IG9uIHRoZSB4ODYgYXJjaGl0ZWN0dXJlCisJICB3aWxsIGlzc3VlIHRoZSBobHQgaW5zdHJ1Y3Rpb24gaWYgbm90aGluZyBpcyB0byBiZSBkb25lLCB0aGVyZWJ5CisJICBzZW5kaW5nIHRoZSBwcm9jZXNzb3IgdG8gc2xlZXAgYW5kIHNhdmluZyBwb3dlci4KKworY29uZmlnIEFQTQorCXRyaXN0YXRlICJBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50IEVtdWxhdGlvbiIKKwlkZXBlbmRzIG9uIFBNCisJLS0taGVscC0tLQorCSAgQVBNIGlzIGEgQklPUyBzcGVjaWZpY2F0aW9uIGZvciBzYXZpbmcgcG93ZXIgdXNpbmcgc2V2ZXJhbCBkaWZmZXJlbnQKKwkgIHRlY2huaXF1ZXMuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgYmF0dGVyeSBwb3dlcmVkIGxhcHRvcHMgd2l0aAorCSAgQVBNIGNvbXBsaWFudCBCSU9TZXMuIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgc3lzdGVtIHRpbWUgd2lsbCBiZQorCSAgcmVzZXQgYWZ0ZXIgYSBSRVNVTUUgb3BlcmF0aW9uLCB0aGUgL3Byb2MvYXBtIGRldmljZSB3aWxsIHByb3ZpZGUKKwkgIGJhdHRlcnkgc3RhdHVzIGluZm9ybWF0aW9uLCBhbmQgdXNlci1zcGFjZSBwcm9ncmFtcyB3aWxsIHJlY2VpdmUKKwkgIG5vdGlmaWNhdGlvbiBvZiBBUE0gImV2ZW50cyIgKGUuZy4gYmF0dGVyeSBzdGF0dXMgY2hhbmdlKS4KKworCSAgSWYgeW91IHNlbGVjdCAiWSIgaGVyZSwgeW91IGNhbiBkaXNhYmxlIGFjdHVhbCB1c2Ugb2YgdGhlIEFQTQorCSAgQklPUyBieSBwYXNzaW5nIHRoZSAiYXBtPW9mZiIgb3B0aW9uIHRvIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLgorCisJICBOb3RlIHRoYXQgdGhlIEFQTSBzdXBwb3J0IGlzIGFsbW9zdCBjb21wbGV0ZWx5IGRpc2FibGVkIGZvcgorCSAgbWFjaGluZXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4KKworCSAgSW4gb3JkZXIgdG8gdXNlIEFQTSwgeW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlLiBGb3IgbG9jYXRpb24KKwkgIGFuZCBtb3JlIGluZm9ybWF0aW9uLCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vcG0udHh0PiBhbmQgdGhlCisJICBCYXR0ZXJ5IFBvd2VyZWQgTGludXggbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHNwaW4gZG93biBkaXNrIGRyaXZlcyAoc2VlIHRoZSBoZHBhcm0oOCkKKwkgIG1hbnBhZ2UgKCJtYW4gOCBoZHBhcm0iKSBmb3IgdGhhdCksIGFuZCBpdCBkb2Vzbid0IHR1cm4gb2ZmCisJICBWRVNBLWNvbXBsaWFudCAiZ3JlZW4iIG1vbml0b3JzLgorCisJICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBUSSA0MDAwTSBUcmF2ZWxNYXRlIGFuZCB0aGUgQUNFUgorCSAgNDg2L0RYNC83NSBiZWNhdXNlIHRoZXkgZG9uJ3QgaGF2ZSBjb21wbGlhbnQgQklPU2VzLiBNYW55ICJncmVlbiIKKwkgIGRlc2t0b3AgbWFjaGluZXMgYWxzbyBkb24ndCBoYXZlIGNvbXBsaWFudCBCSU9TZXMsIGFuZCB0aGlzIGRyaXZlcgorCSAgbWF5IGNhdXNlIHRob3NlIG1hY2hpbmVzIHRvIHBhbmljIGR1cmluZyB0aGUgYm9vdCBwaGFzZS4KKworCSAgR2VuZXJhbGx5LCBpZiB5b3UgZG9uJ3QgaGF2ZSBhIGJhdHRlcnkgaW4geW91ciBtYWNoaW5lLCB0aGVyZSBpc24ndAorCSAgbXVjaCBwb2ludCBpbiB1c2luZyB0aGlzIGRyaXZlciBhbmQgeW91IHNob3VsZCBzYXkgTi4gSWYgeW91IGdldAorCSAgcmFuZG9tIGtlcm5lbCBPT1BTZXMgb3IgcmVib290cyB0aGF0IGRvbid0IHNlZW0gdG8gYmUgcmVsYXRlZCB0bworCSAgYW55dGhpbmcsIHRyeSBkaXNhYmxpbmcvZW5hYmxpbmcgdGhpcyBvcHRpb24gKG9yIGRpc2FibGluZy9lbmFibGluZworCSAgQVBNIGluIHlvdXIgQklPUykuCisKKwkgIFNvbWUgb3RoZXIgdGhpbmdzIHlvdSBzaG91bGQgdHJ5IHdoZW4gZXhwZXJpZW5jaW5nIHNlZW1pbmdseSByYW5kb20sCisJICAid2VpcmQiIHByb2JsZW1zOgorCisJICAxKSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBlbm91Z2ggc3dhcCBzcGFjZSBhbmQgdGhhdCBpdCBpcworCSAgZW5hYmxlZC4KKwkgIDIpIHBhc3MgdGhlICJuby1obHQiIG9wdGlvbiB0byB0aGUga2VybmVsCisJICAzKSBzd2l0Y2ggb24gZmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uIGluIHRoZSBrZXJuZWwgYW5kIHBhc3MKKwkgIHRoZSAibm8zODciIG9wdGlvbiB0byB0aGUga2VybmVsCisJICA0KSBwYXNzIHRoZSAiZmxvcHB5PW5vZG1hIiBvcHRpb24gdG8gdGhlIGtlcm5lbAorCSAgNSkgcGFzcyB0aGUgIm1lbT00TSIgb3B0aW9uIHRvIHRoZSBrZXJuZWwgKHRoZXJlYnkgZGlzYWJsaW5nCisJICBhbGwgYnV0IHRoZSBmaXJzdCA0IE1CIG9mIFJBTSkKKwkgIDYpIG1ha2Ugc3VyZSB0aGF0IHRoZSBDUFUgaXMgbm90IG92ZXIgY2xvY2tlZC4KKwkgIDcpIHJlYWQgdGhlIHNpZzExIEZBUSBhdCA8aHR0cDovL3d3dy5iaXR3aXphcmQubmwvc2lnMTEvPgorCSAgOCkgZGlzYWJsZSB0aGUgY2FjaGUgZnJvbSB5b3VyIEJJT1Mgc2V0dGluZ3MKKwkgIDkpIGluc3RhbGwgYSBmYW4gZm9yIHRoZSB2aWRlbyBjYXJkIG9yIGV4Y2hhbmdlIHZpZGVvIFJBTQorCSAgMTApIGluc3RhbGwgYSBiZXR0ZXIgZmFuIGZvciB0aGUgQ1BVCisJICAxMSkgZXhjaGFuZ2UgUkFNIGNoaXBzCisJICAxMikgZXhjaGFuZ2UgdGhlIG1vdGhlcmJvYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcG0uCisKK2VuZG1lbnUKKworbWVudSAiRGV2aWNlIERyaXZlcnMiCisKK3NvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCisKK2lmIEFMSUdOTUVOVF9UUkFQCitzb3VyY2UgImRyaXZlcnMvbXRkL0tjb25maWciCitlbmRpZgorCitzb3VyY2UgImRyaXZlcnMvcGFycG9ydC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvcG5wL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvYWNvcm4vYmxvY2svS2NvbmZpZyIKKworaWYgQVJDSF9DTFBTNzUwMCB8fCBBUkNIX0lPUDNYWCB8fCBBUkNIX0lYUDRYWCB8fCBBUkNIX0w3MjAwIHx8IEFSQ0hfTEg3QTQwWCB8fCBBUkNIX1BYQSB8fCBBUkNIX1JQQyB8fCBBUkNIX1MzQzI0MTAgfHwgQVJDSF9TQTExMDAgfHwgQVJDSF9TSEFSSyB8fCBGT09UQlJJREdFCitzb3VyY2UgImRyaXZlcnMvaWRlL0tjb25maWciCitlbmRpZgorCitzb3VyY2UgImRyaXZlcnMvc2NzaS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvbWQvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyIKKworc291cmNlICJuZXQvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKKworIyBpbnB1dCBiZWZvcmUgY2hhciAtIGNoYXIvam95c3RpY2sgZGVwZW5kcyBvbiBpdC4gQXMgZG9lcyBVU0IuCisKK3NvdXJjZSAiZHJpdmVycy9pbnB1dC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvY2hhci9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvaTJjL0tjb25maWciCisKKyNzb3VyY2UgImRyaXZlcnMvbDMvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL21pc2MvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL21lZGlhL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy92aWRlby9LY29uZmlnIgorCitzb3VyY2UgInNvdW5kL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy91c2IvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL21tYy9LY29uZmlnIgorCitlbmRtZW51CisKK3NvdXJjZSAiZnMvS2NvbmZpZyIKKworc291cmNlICJhcmNoL2FybS9vcHJvZmlsZS9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvYXJtL0tjb25maWcuZGVidWciCisKK3NvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKKworc291cmNlICJjcnlwdG8vS2NvbmZpZyIKKworc291cmNlICJsaWIvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcuZGVidWcgYi9hcmNoL2FybS9LY29uZmlnLmRlYnVnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTU3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9LY29uZmlnLmRlYnVnCkBAIC0wLDAgKzEsMTA5IEBACittZW51ICJLZXJuZWwgaGFja2luZyIKKworc291cmNlICJsaWIvS2NvbmZpZy5kZWJ1ZyIKKworIyBSTUsgd2FudHMgYXJtIGtlcm5lbHMgY29tcGlsZWQgd2l0aCBmcmFtZSBwb2ludGVycyBzbyBoYXJkd2lyZSB0aGlzIHRvIHkuCisjIElmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBhbmQgYXJlIHdpbGxpbmcgdG8gbGl2ZSB3aXRob3V0IHN0YWNrCisjIHRyYWNlcywgeW91IGNhbiBnZXQgYSBzbGlnaHRseSBzbWFsbGVyIGtlcm5lbCBieSBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvCisjIG4sIGJ1dCB0aGVuIFJNSyB3aWxsIGhhdmUgdG8ga2lsbCB5b3UgOykuCitjb25maWcgRlJBTUVfUE9JTlRFUgorCWJvb2wKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3Ugc2F5IE4gaGVyZSwgdGhlIHJlc3VsdGluZyBrZXJuZWwgd2lsbCBiZSBzbGlnaHRseSBzbWFsbGVyIGFuZAorCSAgZmFzdGVyLiBIb3dldmVyLCB3aGVuIGEgcHJvYmxlbSBvY2N1cnMgd2l0aCB0aGUga2VybmVsLCB0aGUKKwkgIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVwb3J0ZWQgaXMgc2V2ZXJlbHkgbGltaXRlZC4gTW9zdCBwZW9wbGUKKwkgIHNob3VsZCBzYXkgWSBoZXJlLgorCitjb25maWcgREVCVUdfVVNFUgorCWJvb2wgIlZlcmJvc2UgdXNlciBmYXVsdCBtZXNzYWdlcyIKKwloZWxwCisJICBXaGVuIGEgdXNlciBwcm9ncmFtIGNyYXNoZXMgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgdGhlIGtlcm5lbCBjYW4KKwkgIHByaW50IGEgYnJpZWYgbWVzc2FnZSBleHBsYWluaW5nIHdoYXQgdGhlIHByb2JsZW0gd2FzLiBUaGlzIGlzCisJICBzb21ldGltZXMgaGVscGZ1bCBmb3IgZGVidWdnaW5nIGJ1dCBzZXJ2ZXMgbm8gcHVycG9zZSBvbiBhCisJICBwcm9kdWN0aW9uIHN5c3RlbS4gTW9zdCBwZW9wbGUgc2hvdWxkIHNheSBOIGhlcmUuCisKKwkgIEluIGFkZGl0aW9uLCB5b3UgbmVlZCB0byBwYXNzIHVzZXJfZGVidWc9TiBvbiB0aGUga2VybmVsIGNvbW1hbmQKKwkgIGxpbmUgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZS4gIE4gY29uc2lzdHMgb2YgdGhlIHN1bSBvZjoKKworCSAgICAgIDEgLSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gZXZlbnRzCisJICAgICAgMiAtIHN5c3RlbSBjYWxscworCSAgICAgIDQgLSBpbnZhbGlkIGRhdGEgYWJvcnRzCisJICAgICAgOCAtIFNJR1NFR1YgZmF1bHRzCisJICAgICAxNiAtIFNJR0JVUyBmYXVsdHMKKworY29uZmlnIERFQlVHX1dBSVRRCisJYm9vbCAiV2FpdCBxdWV1ZSBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKworY29uZmlnIERFQlVHX0VSUk9SUworCWJvb2wgIlZlcmJvc2Uga2VybmVsIGVycm9yIG1lc3NhZ2VzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgVGhpcyBvcHRpb24gY29udHJvbHMgdmVyYm9zZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggY2FuIGJlCisJICBwcmludGVkIHdoZW4gdGhlIGtlcm5lbCBkZXRlY3RzIGFuIGludGVybmFsIGVycm9yLiBUaGlzIGRlYnVnZ2luZworCSAgaW5mb3JtYXRpb24gaXMgdXNlZnVsIHRvIGtlcm5lbCBoYWNrZXJzIHdoZW4gdHJhY2tpbmcgZG93biBwcm9ibGVtcywKKwkgIGJ1dCBtb3N0bHkgbWVhbmluZ2xlc3MgdG8gb3RoZXIgcGVvcGxlLiBJdCdzIHNhZmUgdG8gc2F5IFkgdW5sZXNzCisJICB5b3UgYXJlIGNvbmNlcm5lZCB3aXRoIHRoZSBjb2RlIHNpemUgb3IgZG9uJ3Qgd2FudCB0byBzZWUgdGhlc2UKKwkgIG1lc3NhZ2VzLgorCisKKyMgVGhlc2Ugb3B0aW9ucyBhcmUgb25seSBmb3IgcmVhbCBrZXJuZWwgaGFja2VycyB3aG8gd2FudCB0byBnZXQgdGhlaXIgaGFuZHMgZGlydHkuCitjb25maWcgREVCVUdfTEwKKwlib29sICJLZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBmdW5jdGlvbnMiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgZGVmaW5pdGlvbnMgb2YgcHJpbnRhc2NpaSwgcHJpbnRjaGFyLCBwcmludGhleAorCSAgaW4gdGhlIGtlcm5lbC4gIFRoaXMgaXMgaGVscGZ1bCBpZiB5b3UgYXJlIGRlYnVnZ2luZyBjb2RlIHRoYXQKKwkgIGV4ZWN1dGVzIGJlZm9yZSB0aGUgY29uc29sZSBpcyBpbml0aWFsaXplZC4KKworY29uZmlnIERFQlVHX0lDRURDQworCWJvb2wgIktlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHZpYSBFbWJlZGRlZElDRSBEQ0MgY2hhbm5lbCIKKwlkZXBlbmRzIG9uIERFQlVHX0xMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgcHJpbnQgcm91dGluZXMgdG8gZGlyZWN0IHRoZWlyCisJICBvdXRwdXQgdG8gdGhlIEVtYmVkZGVkSUNFIG1hY3JvY2VsbCdzIERDQyBjaGFubmVsIHVzaW5nCisJICBjby1wcm9jZXNzb3IgMTQuIFRoaXMgaXMga25vd24gdG8gd29yayBvbiB0aGUgQVJNOSBzdHlsZSBJQ0UKKwkgIGNoYW5uZWwuCisKKwkgIEl0IGRvZXMgaW5jbHVkZSBhIHRpbWVvdXQgdG8gZW5zdXJlIHRoYXQgdGhlIHN5c3RlbSBkb2VzIG5vdAorCSAgdG90YWxseSBmcmVlemUgd2hlbiB0aGVyZSBpcyBub3RoaW5nIGNvbm5lY3RlZCB0byByZWFkLgorCitjb25maWcgREVCVUdfREMyMTI4NV9QT1JUCisJYm9vbCAiS2VybmVsIGxvdy1sZXZlbCBkZWJ1Z2dpbmcgbWVzc2FnZXMgdmlhIGZvb3RicmlkZ2Ugc2VyaWFsIHBvcnQiCisJZGVwZW5kcyBvbiBERUJVR19MTCAmJiBGT09UQlJJREdFCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgcHJpbnQgcm91dGluZXMgdG8gZGlyZWN0IHRoZWlyCisJICBvdXRwdXQgdG8gdGhlIHNlcmlhbCBwb3J0IGluIHRoZSBEQzIxMjg1IChGb290YnJpZGdlKS4gU2F5aW5nIE4KKwkgIHdpbGwgY2F1c2UgdGhlIGRlYnVnIG1lc3NhZ2VzIHRvIGFwcGVhciBvbiB0aGUgZmlyc3QgMTY1NTAKKwkgIHNlcmlhbCBwb3J0LgorCitjb25maWcgREVCVUdfQ0xQUzcxMVhfVUFSVDIKKwlib29sICJLZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBtZXNzYWdlcyB2aWEgVUFSVDIiCisJZGVwZW5kcyBvbiBERUJVR19MTCAmJiBBUkNIX0NMUFM3MTFYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgcHJpbnQgcm91dGluZXMgdG8gZGlyZWN0IHRoZWlyCisJICBvdXRwdXQgdG8gdGhlIHNlY29uZCBzZXJpYWwgcG9ydCBvbiB0aGVzZSBkZXZpY2VzLiAgU2F5aW5nIE4gd2lsbAorCSAgY2F1c2UgdGhlIGRlYnVnIG1lc3NhZ2VzIHRvIGFwcGVhciBvbiB0aGUgZmlyc3Qgc2VyaWFsIHBvcnQuCisKK2NvbmZpZyBERUJVR19TM0MyNDEwX1BPUlQKKwlkZXBlbmRzIG9uIERFQlVHX0xMICYmIEFSQ0hfUzNDMjQxMAorCWJvb2wgIktlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIG1lc3NhZ2VzIHZpYSBTM0MyNDEwIFVBUlQiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBkZWJ1ZyBwcmludCByb3V0aW5lcyB0byBnbyB0byBvbmUgb2YgdGhlCisJICBTM0MyNDEwIGludGVybmFsIFVBUlRzLiBUaGUgY2hvc2VuIFVBUlQgbXVzdCBoYXZlIGJlZW4gY29uZmlndXJlZAorCSAgYmVmb3JlIGl0IGlzIHVzZWQuCisKK2NvbmZpZyBERUJVR19TM0MyNDEwX1VBUlQKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAorCWludCAiUzNDMjQxMCBVQVJUIHRvIHVzZSBmb3IgbG93LWxldmVsIGRlYnVnIgorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgQ2hvaWNlIGZvciBVQVJUIGZvciBrZXJuZWwgbG93LWxldmVsIHVzaW5nIFMzQzI0MTAgVUFSVFMsCisJICBzaG91bGQgYmUgYmV0d2VlbiB6ZXJvIGFuZCB0d28uIFRoZSBwb3J0IG11c3QgaGF2ZSBiZWVuCisJICBpbml0YWxpc2VkIGJ5IHRoZSBib290LWxvYWRlciBiZWZvcmUgdXNlLgorCisJICBUaGUgdW5jb21wcmVzc29yIGNvZGUgcG9ydCBjb25maWd1cmF0aW9uIGlzIG5vdyBoYW5kbGVkCisJICBieSBDT05GSUdfUzNDMjQxMF9MT1dMRVZFTF9VQVJUX1BPUlQuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3N2UzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0wLDAgKzEsMjE2IEBACisjCisjIGFyY2gvYXJtL01ha2VmaWxlCisjCisjIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyMgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDEgYnkgUnVzc2VsbCBLaW5nCisKK0xERkxBR1Nfdm1saW51eAk6PS1wIC0tbm8tdW5kZWZpbmVkIC1YCitDUFBGTEFHU192bWxpbnV4LmxkcyA9IC1EVEVYVEFERFI9JChURVhUQUREUikgLUREQVRBQUREUj0kKERBVEFBRERSKQorT0JKQ09QWUZMQUdTCTo9LU8gYmluYXJ5IC1SIC5ub3RlIC1SIC5jb21tZW50IC1TCitHWkZMQUdTCQk6PS05CisjQ0ZMQUdTCQkrPS1waXBlCisKKyMgRG8gbm90IHVzZSBhcmNoL2FybS9kZWZjb25maWcgLSBpdCdzIGFsd2F5cyBvdXRkYXRlZC4KKyMgU2VsZWN0IGEgcGxhdGZvcm0gdGh0IGlzIGtlcHQgdXAtdG8tZGF0ZQorS0JVSUxEX0RFRkNPTkZJRyA6PSB2ZXJzYXRpbGVfZGVmY29uZmlnCisKK2lmZXEgKCQoQ09ORklHX0ZSQU1FX1BPSU5URVIpLHkpCitDRkxBR1MJCSs9LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLW1hcGNzIC1tbm8tc2NoZWQtcHJvbG9nCitlbmRpZgorCitpZmVxICgkKENPTkZJR19DUFVfQklHX0VORElBTikseSkKK0NQUEZMQUdTCSs9IC1tYmlnLWVuZGlhbgorQVMJCSs9IC1FQgorTEQJCSs9IC1FQgorZWxzZQorQ1BQRkxBR1MJKz0gLW1saXR0bGUtZW5kaWFuCitBUwkJKz0gLUVMCitMRAkJKz0gLUVMCitlbmRpZgorCitjb21tYSA9ICwKKworIyBUaGlzIHNlbGVjdHMgd2hpY2ggaW5zdHJ1Y3Rpb24gc2V0IGlzIHVzZWQuCisjIE5vdGUgdGhhdCBHQ0MgZG9lcyBub3QgbnVtZXJpY2FsbHkgZGVmaW5lIGFuIGFyY2hpdGVjdHVyZSB2ZXJzaW9uCisjIG1hY3JvLCBidXQgaW5zdGVhZCBkZWZpbmVzIGEgd2hvbGUgc2VyaWVzIG9mIG1hY3JvcyB3aGljaCBtYWtlcworIyB0ZXN0aW5nIGZvciBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBvciBsYXRlciByYXRoZXIgaW1wb3NzaWJsZS4KK2FyY2gtJChDT05GSUdfQ1BVXzMydjYpCQk6PS1EX19MSU5VWF9BUk1fQVJDSF9fPTYgJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YXJtdjYsLW1hcmNoPWFybXY1dCAtV2EkKGNvbW1hKS1tYXJjaD1hcm12NikKK2FyY2gtJChDT05GSUdfQ1BVXzMydjUpCQk6PS1EX19MSU5VWF9BUk1fQVJDSF9fPTUgJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YXJtdjV0ZSwtbWFyY2g9YXJtdjQpCithcmNoLSQoQ09ORklHX0NQVV8zMnY0KQkJOj0tRF9fTElOVVhfQVJNX0FSQ0hfXz00IC1tYXJjaD1hcm12NAorYXJjaC0kKENPTkZJR19DUFVfMzJ2MykJCTo9LURfX0xJTlVYX0FSTV9BUkNIX189MyAtbWFyY2g9YXJtdjMKKworIyBUaGlzIHNlbGVjdHMgaG93IHdlIG9wdGltaXNlIGZvciB0aGUgcHJvY2Vzc29yLgordHVuZS0kKENPTkZJR19DUFVfQVJNNjEwKQk6PS1tdHVuZT1hcm02MTAKK3R1bmUtJChDT05GSUdfQ1BVX0FSTTcxMCkJOj0tbXR1bmU9YXJtNzEwCit0dW5lLSQoQ09ORklHX0NQVV9BUk03MjBUKQk6PS1tdHVuZT1hcm03dGRtaQordHVuZS0kKENPTkZJR19DUFVfQVJNOTIwVCkJOj0tbXR1bmU9YXJtOXRkbWkKK3R1bmUtJChDT05GSUdfQ1BVX0FSTTkyMlQpCTo9LW10dW5lPWFybTl0ZG1pCit0dW5lLSQoQ09ORklHX0NQVV9BUk05MjVUKQk6PS1tdHVuZT1hcm05dGRtaQordHVuZS0kKENPTkZJR19DUFVfQVJNOTI2VCkJOj0tbXR1bmU9YXJtOXRkbWkKK3R1bmUtJChDT05GSUdfQ1BVX1NBMTEwKQk6PS1tdHVuZT1zdHJvbmdhcm0xMTAKK3R1bmUtJChDT05GSUdfQ1BVX1NBMTEwMCkJOj0tbXR1bmU9c3Ryb25nYXJtMTEwMAordHVuZS0kKENPTkZJR19DUFVfWFNDQUxFKQk6PSQoY2FsbCBjYy1vcHRpb24sLW10dW5lPXhzY2FsZSwtbXR1bmU9c3Ryb25nYXJtMTEwKSAtV2EsLW1jcHU9eHNjYWxlCit0dW5lLSQoQ09ORklHX0NQVV9WNikJCTo9LW10dW5lPXN0cm9uZ2FybQorCisjIE5lZWQgLVVhcm0gZm9yIGdjYyA8IDMueAorQ0ZMQUdTX0FCSQk6PSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorQ0ZMQUdTCQkrPSQoQ0ZMQUdTX0FCSSkgJChhcmNoLXkpICQodHVuZS15KSAkKGNhbGwgY2Mtb3B0aW9uLC1tc2hvcnQtbG9hZC1ieXRlcywkKGNhbGwgY2Mtb3B0aW9uLC1tYWxpZ25tZW50LXRyYXBzLCkpIC1tc29mdC1mbG9hdCAtVWFybQorQUZMQUdTCQkrPSQoQ0ZMQUdTX0FCSSkgJChhcmNoLXkpICQodHVuZS15KSAtbXNvZnQtZmxvYXQKKworQ0hFQ0tGTEFHUwkrPSAtRF9fYXJtX18KKworI0RlZmF1bHQgdmFsdWUKK2hlYWQteQkJOj0gYXJjaC9hcm0va2VybmVsL2hlYWQubyBhcmNoL2FybS9rZXJuZWwvaW5pdF90YXNrLm8KK3RleHRhZGRyLXkJOj0gMHhDMDAwODAwMAorCisgbWFjaGluZS0kKENPTkZJR19BUkNIX1JQQykJICAgOj0gcnBjCisgbWFjaGluZS0kKENPTkZJR19BUkNIX0VCU0ExMTApCSAgIDo9IGVic2ExMTAKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfQ0xQUzc1MDApICAgOj0gY2xwczc1MDAKKyAgaW5jZGlyLSQoQ09ORklHX0FSQ0hfQ0xQUzc1MDApICAgOj0gY2w3NTAwCisgbWFjaGluZS0kKENPTkZJR19GT09UQlJJREdFKQkgICA6PSBmb290YnJpZGdlCisgIGluY2Rpci0kKENPTkZJR19GT09UQlJJREdFKQkgICA6PSBlYnNhMjg1Cit0ZXh0YWRkci0kKENPTkZJR19BUkNIX0NPMjg1KQkgICA6PSAweDYwMDA4MDAwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX0NPMjg1KQkgICA6PSBmb290YnJpZGdlCisgIGluY2Rpci0kKENPTkZJR19BUkNIX0NPMjg1KQkgICA6PSBlYnNhMjg1CisgbWFjaGluZS0kKENPTkZJR19BUkNIX1NIQVJLKQkgICA6PSBzaGFyaworIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TQTExMDApCSAgIDo9IHNhMTEwMAoraWZlcSAoJChDT05GSUdfQVJDSF9TQTExMDApLHkpCisjIFNBMTExMSBETUEgYnVnOiB3ZSBkb24ndCB3YW50IHRoZSBrZXJuZWwgdG8gbGl2ZSBpbiBwcmVjaW91cyBETUEtYWJsZSBtZW1vcnkKK3RleHRhZGRyLSQoQ09ORklHX1NBMTExMSkJICAgOj0gMHhjMDIwODAwMAorZW5kaWYKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfUFhBKQkgICA6PSBweGEKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTDcyMDApCSAgIDo9IGw3MjAwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX0lOVEVHUkFUT1IpIDo9IGludGVncmF0b3IKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfQ0FNRUxPVCkJICAgOj0gZXB4YTEwZGIKK3RleHRhZGRyLSQoQ09ORklHX0FSQ0hfQ0xQUzcxMVgpICAgOj0gMHhjMDAyODAwMAorIG1hY2hpbmUtJChDT05GSUdfQVJDSF9DTFBTNzExWCkgICA6PSBjbHBzNzExeAordGV4dGFkZHItJChDT05GSUdfQVJDSF9GT1JUVU5FVCkgICA6PSAweGMwMDA4MDAwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX0lPUDNYWCkJICAgOj0gaW9wM3h4CisgbWFjaGluZS0kKENPTkZJR19BUkNIX0lYUDRYWCkJICAgOj0gaXhwNHh4CisgbWFjaGluZS0kKENPTkZJR19BUkNIX0lYUDIwMDApICAgIDo9IGl4cDIwMDAKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfT01BUCkJICAgOj0gb21hcAorIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TM0MyNDEwKQkgICA6PSBzM2MyNDEwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX0xIN0E0MFgpCSAgIDo9IGxoN2E0MHgKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfVkVSU0FUSUxFKSAgOj0gdmVyc2F0aWxlCisgbWFjaGluZS0kKENPTkZJR19BUkNIX0lNWCkJICAgOj0gaW14CisgbWFjaGluZS0kKENPTkZJR19BUkNIX0g3MjBYKQkgICA6PSBoNzIweAorCitpZmVxICgkKENPTkZJR19BUkNIX0VCU0ExMTApLHkpCisjIFRoaXMgaXMgd2hhdCBoYXBwZW5zIGlmIHlvdSBmb3JnZXQgdGhlIElPQ1MxNiBsaW5lLgorIyBQQ01DSUEgY2FyZHMgc3RvcCB3b3JraW5nLgorQ0ZMQUdTXzNjNTg5X2NzLm8gOj0tRElTQV9TSVhURUVOX0JJVF9QRVJJUEhFUkFMCitleHBvcnQgQ0ZMQUdTXzNjNTg5X2NzLm8KK2VuZGlmCisKK1RFWFRBRERSIDo9ICQodGV4dGFkZHIteSkKK2lmZXEgKCQoQ09ORklHX1hJUF9LRVJORUwpLHkpCisgIERBVEFBRERSIDo9ICQoVEVYVEFERFIpCisgIHhpcGFkZHItJChDT05GSUdfQVJDSF9DTzI4NSkgOj0gMHg1ZjAwMDAwMAorICB4aXBhZGRyLXkgPz0gMHhiZjAwMDAwMAorICAjIFJlcGxhY2UgcGh5cyBhZGRyIHdpdGggdmlydCBhZGRyIHdoaWxlIGtlZXBpbmcgb2Zmc2V0IGZyb20gYmFzZS4KKyAgVEVYVEFERFIgOj0gJChzaGVsbCBlY2hvICQoQ09ORklHX1hJUF9QSFlTX0FERFIpICQoeGlwYWRkci15KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICBhd2sgLS1ub24tZGVjaW1hbC1kYXRhICcvWzp4ZGlnaXQ6XS8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiMHgleFxuIiwgYW5kKCQkMSwgMHgwMDBmZmZmZikgKyAkJDIpIH0nICkKK2VuZGlmCisKK2lmZXEgKCQoaW5jZGlyLXkpLCkKK2luY2Rpci15IDo9ICQobWFjaGluZS15KQorZW5kaWYKK0lOQ0RJUiAgIDo9IGFyY2gtJChpbmNkaXIteSkKK2lmbmVxICgkKG1hY2hpbmUteSksKQorTUFDSElORSAgOj0gYXJjaC9hcm0vbWFjaC0kKG1hY2hpbmUteSkvCitlbHNlCitNQUNISU5FICA6PQorZW5kaWYKKyAgCitleHBvcnQJVEVYVEFERFIgREFUQUFERFIgR1pGTEFHUworCisjIERvIHdlIGhhdmUgRkFTVEZQRT8KK0ZBU1RGUEUJCTo9YXJjaC9hcm0vZmFzdGZwZQoraWZlcSAoJChGQVNURlBFKSwkKHdpbGRjYXJkICQoRkFTVEZQRSkpKQorRkFTVEZQRV9PQkoJOj0kKEZBU1RGUEUpLworZW5kaWYKKworIyBJZiB3ZSBoYXZlIGEgbWFjaGluZS1zcGVjaWZpYyBkaXJlY3RvcnksIHRoZW4gaW5jbHVkZSBpdCBpbiB0aGUgYnVpbGQuCitjb3JlLXkJCQkJKz0gYXJjaC9hcm0va2VybmVsLyBhcmNoL2FybS9tbS8gYXJjaC9hcm0vY29tbW9uLworY29yZS15CQkJCSs9ICQoTUFDSElORSkKK2NvcmUtJChDT05GSUdfRlBFX05XRlBFKQkrPSBhcmNoL2FybS9ud2ZwZS8KK2NvcmUtJChDT05GSUdfRlBFX0ZBU1RGUEUpCSs9ICQoRkFTVEZQRV9PQkopCitjb3JlLSQoQ09ORklHX1ZGUCkJCSs9IGFyY2gvYXJtL3ZmcC8KKworZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkgICAgICArPSBhcmNoL2FybS9vcHJvZmlsZS8KK2RyaXZlcnMtJChDT05GSUdfQVJDSF9DTFBTNzUwMCkJKz0gZHJpdmVycy9hY29ybi9jaGFyLworZHJpdmVycy0kKENPTkZJR19BUkNIX0w3MjAwKQkrPSBkcml2ZXJzL2Fjb3JuL2NoYXIvCisKK2xpYnMteQkJCQkrPSBhcmNoL2FybS9saWIvCisKKyMgRGVmYXVsdCB0YXJnZXQgd2hlbiBleGVjdXRpbmcgcGxhaW4gbWFrZQoraWZlcSAoJChDT05GSUdfWElQX0tFUk5FTCkseSkKK2FsbDogeGlwSW1hZ2UKK2Vsc2UKK2FsbDogekltYWdlCitlbmRpZgorCitib290IDo9IGFyY2gvYXJtL2Jvb3QKKworIwlVcGRhdGUgbWFjaGluZSBhcmNoIGFuZCBwcm9jIHN5bWxpbmtzIGlmIHNvbWV0aGluZyB3aGljaCBhZmZlY3RzCisjCXRoZW0gY2hhbmdlZC4gIFdlIHVzZSAuYXJjaCB0byBpbmRpY2F0ZSB3aGVuIHRoZXkgd2VyZSB1cGRhdGVkCisjCWxhc3QsIG90aGVyd2lzZSBtYWtlIHVzZXMgdGhlIHRhcmdldCBkaXJlY3RvcnkgbXRpbWUuCisKK2luY2x1ZGUvYXNtLWFybS8uYXJjaDogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9hcmNoLyouaCkgaW5jbHVkZS9jb25maWcvTUFSS0VSCisJQGVjaG8gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS1hcm0vYXJjaCAtPiBpbmNsdWRlL2FzbS1hcm0vJChJTkNESVIpJworaWZuZXEgKCQoS0JVSUxEX1NSQyksKQorCSQoUSlta2RpciAtcCBpbmNsdWRlL2FzbS1hcm0KKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLWFybS8kKElOQ0RJUikgaW5jbHVkZS9hc20tYXJtL2FyY2gKK2Vsc2UKKwkkKFEpbG4gLWZzbiAkKElOQ0RJUikgaW5jbHVkZS9hc20tYXJtL2FyY2gKK2VuZGlmCisJQHRvdWNoICRACisKK3ByZXBhcmU6IG1ha2V0b29scyBpbmNsdWRlL2FzbS1hcm0vLmFyY2gKKworLlBIT05ZOiBtYWtldG9vbHMgRk9SQ0UKK21ha2V0b29sczogaW5jbHVkZS9hc20tYXJtL2NvbnN0YW50cy5oIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9hcm0vdG9vbHMgaW5jbHVkZS9hc20tYXJtL21hY2gtdHlwZXMuaAorCisjIENvbnZlcnQgYnpJbWFnZSB0byB6SW1hZ2UKK2J6SW1hZ2U6IHpJbWFnZQorCit6SW1hZ2UgSW1hZ2UgeGlwSW1hZ2UgYm9vdHBJbWFnZSB1SW1hZ2U6IHZtbGludXgKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIE1BQ0hJTkU9JChNQUNISU5FKSAkKGJvb3QpLyRACisKK3ppbnN0YWxsIGluc3RhbGw6IHZtbGludXgKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIE1BQ0hJTkU9JChNQUNISU5FKSAkQAorCitDTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS1hcm0vY29uc3RhbnRzLmgqIGluY2x1ZGUvYXNtLWFybS9tYWNoLXR5cGVzLmggXAorCSAgICAgICBpbmNsdWRlL2FzbS1hcm0vYXJjaCBpbmNsdWRlL2FzbS1hcm0vLmFyY2gKKworIyBXZSB1c2UgTVJQUk9QRVJfRklMRVMgYW5kIENMRUFOX0ZJTEVTIG5vdworYXJjaGNsZWFuOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKKworIyBNeSB0ZXN0aW5nIHRhcmdldHMgKGJ5cGFzc2VzIGRlcGVuZGVuY2llcykKK2JwOjsJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJChib290KS9ib290cEltYWdlCitpIHppOjsJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJEAKKworYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCisJCQkJICAgaW5jbHVkZS9hc20tYXJtLy5hcmNoCisKK2luY2x1ZGUvYXNtLSQoQVJDSCkvY29uc3RhbnRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucworCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKKworZGVmaW5lIGFyY2hoZWxwCisgIGVjaG8gICcqIHpJbWFnZSAgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvekltYWdlKScKKyAgZWNobyAgJyAgSW1hZ2UgICAgICAgICAtIFVuY29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvJChBUkNIKS9ib290L0ltYWdlKScKKyAgZWNobyAgJyogeGlwSW1hZ2UgICAgICAtIFhJUCBrZXJuZWwgaW1hZ2UsIGlmIGNvbmZpZ3VyZWQgKGFyY2gvJChBUkNIKS9ib290L3hpcEltYWdlKScKKyAgZWNobyAgJyAgYm9vdHBJbWFnZSAgICAtIENvbWJpbmVkIHpJbWFnZSBhbmQgaW5pdGlhbCBSQU0gZGlzaycgCisgIGVjaG8gICcgICAgICAgICAgICAgICAgICAoc3VwcGx5IGluaXRyZCBpbWFnZSB2aWEgbWFrZSB2YXJpYWJsZSBJTklUUkQ9PHBhdGg+KScKKyAgZWNobyAgJyAgaW5zdGFsbCAgICAgICAtIEluc3RhbGwgdW5jb21wcmVzc2VkIGtlcm5lbCcKKyAgZWNobyAgJyAgemluc3RhbGwgICAgICAtIEluc3RhbGwgY29tcHJlc3NlZCBrZXJuZWwnCisgIGVjaG8gICcgICAgICAgICAgICAgICAgICBJbnN0YWxsIHVzaW5nICh5b3VyKSB+L2Jpbi9pbnN0YWxsa2VybmVsIG9yJworICBlY2hvICAnICAgICAgICAgICAgICAgICAgKGRpc3RyaWJ1dGlvbikgL3NiaW4vaW5zdGFsbGtlcm5lbCBvcicKKyAgZWNobyAgJyAgICAgICAgICAgICAgICAgIGluc3RhbGwgdG8gJCQoSU5TVEFMTF9QQVRIKSBhbmQgcnVuIGxpbG8nCitlbmRlZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZSBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3YTM1MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSw5MSBAQAorIworIyBhcmNoL2FybS9ib290L01ha2VmaWxlCisjCisjIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyMgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgUnVzc2VsbCBLaW5nCisjCisKK01LSU1BR0UgICAgICAgICA6PSAkKHNyY3RyZWUpL3NjcmlwdHMvbWt1Ym9vdC5zaAorCitpZm5lcSAoJChNQUNISU5FKSwpCitpbmNsdWRlICQoc3JjdHJlZSkvJChNQUNISU5FKS9NYWtlZmlsZS5ib290CitlbmRpZgorCisjIE5vdGU6IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBtdXN0IGFsd2F5cyBiZSB0cnVlOgorIyAgIFpSRUxBRERSID09IHZpcnRfdG9fcGh5cyhURVhUQUREUikKKyMgICBQQVJBTVNfUEhZUyBtdXN0IGJlIHdpdGhpbiA0TUIgb2YgWlJFTEFERFIKKyMgICBJTklUUkRfUEhZUyBtdXN0IGJlIGluIFJBTQorWlJFTEFERFIgICAgOj0gJCh6cmVsYWRkci15KQorUEFSQU1TX1BIWVMgOj0gJChwYXJhbXNfcGh5cy15KQorSU5JVFJEX1BIWVMgOj0gJChpbml0cmRfcGh5cy15KQorCitleHBvcnQgWlJFTEFERFIgSU5JVFJEX1BIWVMgUEFSQU1TX1BIWVMKKwordGFyZ2V0cyA6PSBJbWFnZSB6SW1hZ2UgeGlwSW1hZ2UgYm9vdHBJbWFnZSB1SW1hZ2UKKworaWZlcSAoJChDT05GSUdfWElQX0tFUk5FTCkseSkKKworJChvYmopL3hpcEltYWdlOiB2bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKwlAZWNobyAnICBLZXJuZWw6ICRAIGlzIHJlYWR5IChwaHlzaWNhbCBhZGRyZXNzOiAkKENPTkZJR19YSVBfUEhZU19BRERSKSknCisKKyQob2JqKS9JbWFnZSAkKG9iaikvekltYWdlOiBGT1JDRQorCUBlY2hvICdLZXJuZWwgY29uZmlndXJlZCBmb3IgWElQIChDT05GSUdfWElQX0tFUk5FTD15KScKKwlAZWNobyAnT25seSB0aGUgeGlwSW1hZ2UgdGFyZ2V0IGlzIGF2YWlsYWJsZSBpbiB0aGlzIGNhc2UnCisJQGZhbHNlCisKK2Vsc2UKKworJChvYmopL3hpcEltYWdlOiBGT1JDRQorCUBlY2hvICdLZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yIFhJUCAoQ09ORklHX1hJUF9LRVJORUwhPXkpJworCUBmYWxzZQorCiskKG9iaikvSW1hZ2U6IHZtbGludXggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCUBlY2hvICcgIEtlcm5lbDogJEAgaXMgcmVhZHknCisKKyQob2JqKS9jb21wcmVzc2VkL3ZtbGludXg6ICQob2JqKS9JbWFnZSBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQob2JqKS9jb21wcmVzc2VkICRACisKKyQob2JqKS96SW1hZ2U6CSQob2JqKS9jb21wcmVzc2VkL3ZtbGludXggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCUBlY2hvICcgIEtlcm5lbDogJEAgaXMgcmVhZHknCisKK2VuZGlmCisKK3F1aWV0X2NtZF91aW1hZ2UgPSBVSU1BR0UgICRACisgICAgICBjbWRfdWltYWdlID0gJChDT05GSUdfU0hFTEwpICQoTUtJTUFHRSkgLUEgYXJtIC1PIGxpbnV4IC1UIGtlcm5lbCBcCisJCSAgIC1DIG5vbmUgLWEgJChaUkVMQUREUikgLWUgJChaUkVMQUREUikgXAorCQkgICAtbiAnTGludXgtJChLRVJORUxSRUxFQVNFKScgLWQgJDwgJEAKKworJChvYmopL3VJbWFnZToJJChvYmopL3pJbWFnZSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHVpbWFnZSkKKwlAZWNobyAnICBJbWFnZSAkQCBpcyByZWFkeScKKworJChvYmopL2Jvb3RwL2Jvb3RwOiAkKG9iaikvekltYWdlIGluaXRyZCBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQob2JqKS9ib290cCAkQAorCUA6CisKKyQob2JqKS9ib290cEltYWdlOiAkKG9iaikvYm9vdHAvYm9vdHAgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCUBlY2hvICcgIEtlcm5lbDogJEAgaXMgcmVhZHknCisKKy5QSE9OWTogaW5pdHJkIEZPUkNFCitpbml0cmQ6CisJQHRlc3QgIiQoSU5JVFJEX1BIWVMpIiAhPSAiIiB8fCBcCisJKGVjaG8gVGhpcyBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgSU5JVFJEOyBleGl0IC0xKQorCUB0ZXN0ICIkKElOSVRSRCkiICE9ICIiIHx8IFwKKwkoZWNobyBZb3UgbXVzdCBzcGVjaWZ5IElOSVRSRDsgZXhpdCAtMSkKKworaW5zdGFsbDogJChvYmopL0ltYWdlCisJJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggJChLRVJORUxSRUxFQVNFKSBcCisJJChvYmopL0ltYWdlIFN5c3RlbS5tYXAgIiQoSU5TVEFMTF9QQVRIKSIKKworemluc3RhbGw6ICQob2JqKS96SW1hZ2UKKwkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS8kKHNyYykvaW5zdGFsbC5zaCAkKEtFUk5FTFJFTEVBU0UpIFwKKwkkKG9iaikvekltYWdlIFN5c3RlbS5tYXAgIiQoSU5TVEFMTF9QQVRIKSIKKworc3ViZGlyLQkgICAgOj0gYm9vdHAgY29tcHJlc3NlZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9ib290cC9NYWtlZmlsZSBiL2FyY2gvYXJtL2Jvb3QvYm9vdHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4ODc5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvYm9vdHAvTWFrZWZpbGUKQEAgLTAsMCArMSwyNCBAQAorIworIyBsaW51eC9hcmNoL2FybS9ib290L2Jvb3RwL01ha2VmaWxlCisjCisKK0xERkxBR1NfYm9vdHAJOj0tcCAtLW5vLXVuZGVmaW5lZCAtWCBcCisJCSAtLWRlZnN5bSBpbml0cmRfcGh5cz0kKElOSVRSRF9QSFlTKSBcCisJCSAtLWRlZnN5bSBwYXJhbXNfcGh5cz0kKFBBUkFNU19QSFlTKSAtVAorQUZMQUdTX2luaXRyZC5vIDo9LURJTklUUkQ9XCIkKElOSVRSRClcIgorCit0YXJnZXRzCTo9IGJvb3RwIGluaXQubyBrZXJuZWwubyBpbml0cmQubworCisjIE5vdGUgdGhhdCBib290cC5sZHMgcGlja3MgdXAga2VybmVsLm8gYW5kIGluaXRyZC5vCiskKG9iaikvYm9vdHA6CSQoc3JjKS9ib290cC5sZHMgJChhZGRwcmVmaXggJChvYmopLyxpbml0Lm8ga2VybmVsLm8gaW5pdHJkLm8pIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGQpCisJQDoKKworIyBrZXJuZWwubyBhbmQgaW5pdHJkLm8gaW5jbHVkZXMgYSBiaW5hcnkgaW1hZ2UgdXNpbmcKKyMgLmluY2JpbiwgYSBkZXBlbmRlbmN5IHdoaWNoIGlzIG5vdCB0cmFja2VkIGF1dG9tYXRpY2FsbHkKKworJChvYmopL2tlcm5lbC5vOiBhcmNoL2FybS9ib290L3pJbWFnZSBGT1JDRQorCiskKG9iaikvaW5pdHJkLm86ICQoSU5JVFJEKSBGT1JDRQorCisuUEhPTlk6CSQoSU5JVFJEKSBGT1JDRQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9ib290cC9ib290cC5sZHMgYi9hcmNoL2FybS9ib290L2Jvb3RwL2Jvb3RwLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNkODFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9ib290cC9ib290cC5sZHMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9ib290L2Jvb3RwL2Jvb3RwLmxkcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAuID0gMDsKKyAgLnRleHQgOiB7CisgICBfc3RleHQgPSAuOworICAgKiguc3RhcnQpCisgICAqKC50ZXh0KQorICAgaW5pdHJkX3NpemUgPSBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0OworICAgX2V0ZXh0ID0gLjsKKyAgfQorICAKKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2Jvb3RwL2luaXQuUyBiL2FyY2gvYXJtL2Jvb3QvYm9vdHAvaW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmN2JjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2Jvb3RwL2luaXQuUwpAQCAtMCwwICsxLDg2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2Jvb3QvYm9vdHAvaW5pdC5TCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIFJ1c3NlbGwgS2luZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICAiSGVhZGVyIiBmaWxlIGZvciBzcGxpdHRpbmcga2VybmVsICsgaW5pdHJkLiAgTm90ZSB0aGF0IHdlIHBhc3MKKyAqICByMCB0aHJvdWdoIHRvIHIzIHN0cmFpZ2h0IHRocm91Z2guCisgKgorICogIFRoaXMgZGVtb25zdHJhdGVzIGhvdyB0byBhcHBlbmQgY29kZSB0byB0aGUgc3RhcnQgb2YgdGhlIGtlcm5lbAorICogIHpJbWFnZSwgYW5kIGJvb3QgdGhlIGtlcm5lbCB3aXRob3V0IGNvcHlpbmcgaXQgYXJvdW5kLiAgVGhpcworICogIGV4YW1wbGUgd291bGQgYmUgc2ltcGxlcjsgaWYgd2UgZGlkbid0IGhhdmUgYW4gb2JqZWN0IG9mIHVua25vd24KKyAqICBzaXplIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUga2VybmVsLCB3ZSBjb3VsZCBidWlsZCB0aGlzIGludG8KKyAqICBhIGJpbmFyeSBibG9iLCBhbmQgY29uY2F0ZW5hdGUgdGhlIHpJbWFnZSB1c2luZyB0aGUgY2F0IGNvbW1hbmQuCisgKi8KKwkJLnNlY3Rpb24gLnN0YXJ0LCNhbGxvYywjZXhlY2luc3RyCisJCS50eXBlCV9zdGFydCwgI2Z1bmN0aW9uCisJCS5nbG9ibAlfc3RhcnQKKworX3N0YXJ0OgkJYWRkCWxyLCBwYywgIy0weDgJCUAgbHIgPSBjdXJyZW50IGxvYWQgYWRkcgorCQlhZHIJcjEzLCBkYXRhCisJCWxkbWlhCXIxMyEsIHtyNC1yNn0JCUAgcjUgPSBkZXN0LCByNiA9IGxlbmd0aAorCQlhZGQJcjQsIHI0LCBscgkJQCByNCA9IGluaXRyZF9zdGFydCArIGxvYWQgYWRkcgorCQlibAltb3ZlCQkJQCBtb3ZlIHRoZSBpbml0cmQKKworLyoKKyAqIFNldHVwIHRoZSBpbml0cmQgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBrZXJuZWwuICBUaGlzIGNhbiBvbmx5IGJlCisgKiBwYXNzZWQgaW4gdmlhIHRoZSB0YWdnZWQgbGlzdC4KKyAqLworCQlsZG1pYQlyMTMsIHtyNS1yOX0JCUAgZ2V0IHNpemUgYW5kIGFkZHIgb2YgaW5pdHJkCisJCQkJCQlAIHI1ID0gQVRBR19DT1JFCisJCQkJCQlAIHI2ID0gQVRBR19JTklUUkQyCisJCQkJCQlAIHI3ID0gaW5pdHJkIHN0YXJ0CisJCQkJCQlAIHI4ID0gaW5pdHJkIGVuZAorCQkJCQkJQCByOSA9IHBhcmFtX3N0cnVjdCBhZGRyZXNzCisKKwkJbGRyCXIxMCwgW3I5LCAjNF0JCUAgZ2V0IGZpcnN0IHRhZworCQl0ZXEJcjEwLCByNQkJCUAgaXMgaXQgQVRBR19DT1JFPworLyoKKyAqIElmIHdlIGRpZG4ndCBmaW5kIGEgdmFsaWQgdGFnIGxpc3QsIGNyZWF0ZSBhIGR1bW15IEFUQUdfQ09SRSBlbnRyeS4KKyAqLworCQltb3ZuZQlyMTAsICMwCQkJQCB0ZXJtaW5hdG9yCisJCW1vdm5lCXI0LCAjMgkJCUAgU2l6ZSBvZiB0aGlzIGVudHJ5ICgyIHdvcmRzKQorCQlzdG1uZWlhCXI5LCB7cjQsIHI1LCByMTB9CUAgU2l6ZSwgQVRBR19DT1JFLCB0ZXJtaW5hdG9yCisKKy8qCisgKiBmaW5kIHRoZSBlbmQgb2YgdGhlIHRhZyBsaXN0LCBhbmQgdGhlbiBhZGQgYW4gSU5JVFJEIHRhZyBvbiB0aGUgZW5kLgorICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBJTklUUkQgdGFnLCB0aGVuIHdlIGlnbm9yZSBpdDsgdGhlIGxhc3QgSU5JVFJECisgKiB0YWcgdGFrZXMgcHJlY2lkZW5jZS4KKyAqLwordGFnbGlzdDoJbGRyCXIxMCwgW3I5LCAjMF0JCUAgdGFnIGxlbmd0aAorCQl0ZXEJcjEwLCAjMAkJCUAgbGFzdCB0YWcgKHplcm8gbGVuZ3RoKT8KKwkJYWRkbmUJcjksIHI5LCByMTAsIGxzbCAjMgorCQlibmUJdGFnbGlzdAorCisJCW1vdglyNSwgIzQJCQlAIFNpemUgb2YgaW5pdHJkIHRhZyAoNCB3b3JkcykKKwkJc3RtaWEJcjksIHtyNSwgcjYsIHI3LCByOCwgcjEwfQorCQliCWtlcm5lbF9zdGFydAkJQCBjYWxsIGtlcm5lbAorCisvKgorICogTW92ZSB0aGUgYmxvY2sgb2YgbWVtb3J5IGxlbmd0aCByNiBmcm9tIGFkZHJlc3MgcjQgdG8gYWRkcmVzcyByNQorICovCittb3ZlOgkJbGRtaWEJcjQhLCB7cjcgLSByMTB9CQlAIG1vdmUgMzItYnl0ZXMgYXQgYSB0aW1lCisJCXN0bWlhCXI1ISwge3I3IC0gcjEwfQorCQlsZG1pYQlyNCEsIHtyNyAtIHIxMH0KKwkJc3RtaWEJcjUhLCB7cjcgLSByMTB9CisJCXN1YnMJcjYsIHI2LCAjOCAqIDQKKwkJYmNzCW1vdmUKKwkJbW92CXBjLCBscgorCisJCS5zaXplCV9zdGFydCwgLiAtIF9zdGFydAorCisJCS50eXBlCWRhdGEsI29iamVjdAorZGF0YToJCS53b3JkCWluaXRyZF9zdGFydAkJQCBzb3VyY2UgaW5pdHJkIGFkZHJlc3MKKwkJLndvcmQJaW5pdHJkX3BoeXMJCUAgZGVzdGluYXRpb24gaW5pdHJkIGFkZHJlc3MKKwkJLndvcmQJaW5pdHJkX3NpemUJCUAgaW5pdHJkIHNpemUKKworCQkud29yZAkweDU0NDEwMDAxCQlAIHI1ID0gQVRBR19DT1JFCisJCS53b3JkCTB4NTQ0MjAwMDUJCUAgcjYgPSBBVEFHX0lOSVRSRDIKKwkJLndvcmQJaW5pdHJkX3BoeXMJCUAgcjcKKwkJLndvcmQJaW5pdHJkX3NpemUJCUAgcjgKKwkJLndvcmQJcGFyYW1zX3BoeXMJCUAgcjkKKwkJLnNpemUJZGF0YSwgLiAtIGRhdGEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvYm9vdHAvaW5pdHJkLlMgYi9hcmNoL2FybS9ib290L2Jvb3RwL2luaXRyZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MWVhMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2Jvb3RwL2luaXRyZC5TCkBAIC0wLDAgKzEsNiBAQAorCS50eXBlCWluaXRyZF9zdGFydCwjb2JqZWN0CisJLmdsb2JsCWluaXRyZF9zdGFydAoraW5pdHJkX3N0YXJ0OgorCS5pbmNiaW4JSU5JVFJECisJLmdsb2JsCWluaXRyZF9lbmQKK2luaXRyZF9lbmQ6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2Jvb3RwL2tlcm5lbC5TIGIvYXJjaC9hcm0vYm9vdC9ib290cC9rZXJuZWwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODdhMjVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9ib290cC9rZXJuZWwuUwpAQCAtMCwwICsxLDYgQEAKKwkuZ2xvYmwJa2VybmVsX3N0YXJ0CitrZXJuZWxfc3RhcnQ6CisJLmluY2JpbgkiYXJjaC9hcm0vYm9vdC96SW1hZ2UiCisJLmdsb2JsCWtlcm5lbF9lbmQKK2tlcm5lbF9lbmQ6CisJLmFsaWduCTIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjUwNWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0wLDAgKzEsMTE0IEBACisjCisjIGxpbnV4L2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorIworIyBjcmVhdGUgYSBjb21wcmVzc2VkIHZtbGludXogaW1hZ2UgZnJvbSB0aGUgb3JpZ2luYWwgdm1saW51eAorIworCitIRUFECT0gaGVhZC5vCitPQkpTCT0gbWlzYy5vCitGT05UQwk9IGRyaXZlcnMvdmlkZW8vY29uc29sZS9mb250X2Fjb3JuXzh4OC5jCisKK0ZPTlQgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi8uLi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvLCBmb250X2Fjb3JuXzh4OC5vKQorCisjCisjIEFyY2hpdGVjdHVyZSBkZXBlbmRlbmNpZXMKKyMKK2lmZXEgKCQoQ09ORklHX0FSQ0hfQUNPUk4pLHkpCitPQkpTCQkrPSBsbF9jaGFyX3dyLm8gJChGT05UKQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfQVJDSF9TSEFSSykseSkKK09CSlMJCSs9IGhlYWQtc2hhcmsubyBvZnctc2hhcmsubworZW5kaWYKKworaWZlcSAoJChDT05GSUdfQVJDSF9DQU1FTE9UKSx5KQorT0JKUwkJKz0gaGVhZC1lcHhhMTBkYi5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19BUkNIX0w3MjAwKSx5KQorT0JKUwkJKz0gaGVhZC1sNzIwMC5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19BUkNIX0NMUFM3NTAwKSx5KQorSEVBRAkJPSBoZWFkLWNscHM3NTAwLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0FSQ0hfUDcyMFQpLHkpCisjIEJvcnJvdyB0aGlzIGNvZGUgZnJvbSBTQTExMDAKK09CSlMJCSs9IGhlYWQtc2ExMTAwLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0FSQ0hfU0ExMTAwKSx5KQorT0JKUwkJKz0gaGVhZC1zYTExMDAubworZW5kaWYKKworaWZlcSAoJChDT05GSUdfQ1BVX1hTQ0FMRSkseSkKK09CSlMJCSs9IGhlYWQteHNjYWxlLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1BYQV9TSEFSUFNMKSx5KQorT0JKUwkJKz0gaGVhZC1zaGFycHNsLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0RFQlVHX0lDRURDQykseSkKK09CSlMgICAgICAgICAgICArPSBpY2UtZGNjLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0NQVV9CSUdfRU5ESUFOKSx5KQorT0JKUwkJKz0gYmlnLWVuZGlhbi5vCitlbmRpZgorCisjCisjIFdlIG5vdyBoYXZlIGEgUElDIGRlY29tcHJlc3NvciBpbXBsZW1lbnRhdGlvbi4gIERlY29tcHJlc3NvcnMgcnVubmluZworIyBmcm9tIFJBTSBzaG91bGQgbm90IGRlZmluZSBaVEVYVEFERFIuICBEZWNvbXByZXNzb3JzIHJ1bm5pbmcgZGlyZWN0bHkKKyMgZnJvbSBST00gb3IgRmxhc2ggbXVzdCBkZWZpbmUgWlRFWFRBRERSIChwcmVmZXJhYmx5IHZpYSB0aGUgY29uZmlnKQorIyBGSVhNRTogUHJldmlvdXMgYXNzaWdubWVudCB0byB6dGV4dGFkZHIteSBpcyBsb3N0IGhlcmUuIFNlZSBTSEFSSworaWZlcSAoJChDT05GSUdfWkJPT1RfUk9NKSx5KQorWlRFWFRBRERSCTo9ICQoQ09ORklHX1pCT09UX1JPTV9URVhUKQorWkJTU0FERFIJOj0gJChDT05GSUdfWkJPT1RfUk9NX0JTUykKK2Vsc2UKK1pURVhUQUREUgk6PSAwCitaQlNTQUREUgk6PSBBTElHTig0KQorZW5kaWYKKworU0VERkxBR1MJPSBzL1RFWFRfU1RBUlQvJChaVEVYVEFERFIpLztzL0JTU19TVEFSVC8kKFpCU1NBRERSKS8KKwordGFyZ2V0cyAgICAgICA6PSB2bWxpbnV4IHZtbGludXgubGRzIHBpZ2d5Lmd6IHBpZ2d5Lm8gJChGT05UKSBcCisJCSBoZWFkLm8gbWlzYy5vICQoT0JKUykKK0VYVFJBX0NGTEFHUyAgOj0gLWZwaWMKK0VYVFJBX0FGTEFHUyAgOj0KKworIyBTdXBwbHkgWlJFTEFERFIsIElOSVRSRF9QSFlTIGFuZCBQQVJBTVNfUEhZUyB0byB0aGUgZGVjb21wcmVzc29yIHZpYQorIyBsaW5rZXIgc3ltYm9scy4gIFdlIG9ubHkgZGVmaW5lIGluaXRyZF9waHlzIGFuZCBwYXJhbXNfcGh5cyBpZiB0aGUKKyMgbWFjaGluZSBjbGFzcyBkZWZpbmVkIHRoZSBjb3JyZXNwb25kaW5nIG1ha2VmaWxlIHZhcmlhYmxlLgorTERGTEFHU192bWxpbnV4IDo9IC0tZGVmc3ltIHpyZWxhZGRyPSQoWlJFTEFERFIpCitpZm5lcSAoJChJTklUUkRfUEhZUyksKQorTERGTEFHU192bWxpbnV4ICs9IC0tZGVmc3ltIGluaXRyZF9waHlzPSQoSU5JVFJEX1BIWVMpCitlbmRpZgoraWZuZXEgKCQoUEFSQU1TX1BIWVMpLCkKK0xERkxBR1Nfdm1saW51eCArPSAtLWRlZnN5bSBwYXJhbXNfcGh5cz0kKFBBUkFNU19QSFlTKQorZW5kaWYKK0xERkxBR1Nfdm1saW51eCArPSAtcCAtLW5vLXVuZGVmaW5lZCAtWCBcCisJJChzaGVsbCAkKENDKSAkKENGTEFHUykgLS1wcmludC1saWJnY2MtZmlsZS1uYW1lKSAtVAorCisjIERvbid0IGFsbG93IGFueSBzdGF0aWMgZGF0YSBpbiBtaXNjLm8sIHdoaWNoCisjIHdvdWxkIG90aGVyd2lzZSBtZXNzIHVwIG91ciBHT1QgdGFibGUKK0NGTEFHU19taXNjLm8gOj0gLURzdGF0aWM9CisKKyQob2JqKS92bWxpbnV4OiAkKG9iaikvdm1saW51eC5sZHMgJChvYmopLyQoSEVBRCkgJChvYmopL3BpZ2d5Lm8gXAorCSAJJChhZGRwcmVmaXggJChvYmopLywgJChPQkpTKSkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsZCkKKwlAOgorCiskKG9iaikvcGlnZ3kuZ3o6ICQob2JqKS8uLi9JbWFnZSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCisKKyQob2JqKS9waWdneS5vOiAgJChvYmopL3BpZ2d5Lmd6IEZPUkNFCisKK0NGTEFHU19mb250X2Fjb3JuXzh4OC5vIDo9IC1Ec3RhdGljPQorCiskKG9iaikvdm1saW51eC5sZHM6ICQob2JqKS92bWxpbnV4Lmxkcy5pbiBhcmNoL2FybS9ib290L01ha2VmaWxlIC5jb25maWcKKwlAc2VkICIkKFNFREZMQUdTKSIgPCAkPCA+ICRACisKKyQob2JqKS9taXNjLm86ICQob2JqKS9taXNjLmMgaW5jbHVkZS9hc20vYXJjaC91bmNvbXByZXNzLmggbGliL2luZmxhdGUuYworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUuZGVidWcgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUuZGVidWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxYTAzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZS5kZWJ1ZwpAQCAtMCwwICsxLDIzIEBACisjCisjIGxpbnV4L2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorIworIyBjcmVhdGUgYSBjb21wcmVzc2VkIHZtbGludXggaW1hZ2UgZnJvbSB0aGUgb3JpZ2luYWwgdm1saW51eAorIworCitDT01QUkVTU0VEX0VYVFJBPS4uLy4uL2xpYi9sbF9jaGFyX3dyLm8KK09CSkVDVFM9bWlzYy1kZWJ1Zy5vIGxsX2NoYXJfd3IuYW91dC5vCisKK0NGTEFHUz0tRF9fS0VSTkVMX18gLU8yIC1EU1REQ19IRUFERVJTIC1EU1RBTkRBTE9ORV9ERUJVRyAtV2FsbCAtSS4uLy4uLy4uLy4uL2luY2x1ZGUgLWMKKwordGVzdC1nemlwOiBwaWdneS5hb3V0Lm8gJChPQkpFQ1RTKQorCSQoQ0MpIC1vICRAICQoT0JKRUNUUykgcGlnZ3kuYW91dC5vCisKK21pc2MtZGVidWcubzogbWlzYy5jCisJJChDQykgJChDRkxBR1MpIC1vICRAIG1pc2MuYworCitwaWdneS5hb3V0Lm86IHBpZ2d5Lm8KKwlhcm0tbGludXhlbGYtb2JqY29weSAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgLUkgZWxmMzItYXJtIC1PIGFybS1hb3V0MzItbGludXggcGlnZ3kubyBwaWdneS5hb3V0Lm8KKworbGxfY2hhcl93ci5hb3V0Lm86ICQoQ09NUFJFU1NFRF9FWFRSQSkKKwlhcm0tbGludXhlbGYtb2JqY29weSAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgLUkgZWxmMzItYXJtIC1PIGFybS1hb3V0MzItbGludXggJChDT01QUkVTU0VEX0VYVFJBKSBsbF9jaGFyX3dyLmFvdXQubworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvYmlnLWVuZGlhbi5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2JpZy1lbmRpYW4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFiMjZmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2JpZy1lbmRpYW4uUwpAQCAtMCwwICsxLDEzIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9iaWctZW5kaWFuLlMKKyAqCisgKiAgU3dpdGNoIENQVSBpbnRvIGJpZyBlbmRpYW4gbW9kZS4KKyAqICBBdXRob3I6IE5pY29sYXMgUGl0cmUKKyAqLworCisJLnNlY3Rpb24gIi5zdGFydCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAlAIHJlYWQgY29udHJvbCByZWcKKwlvcnIJcjAsIHIwLCAjKDEgPDwgNykJQCBlbmFibGUgYmlnIGVuZGlhbiBtb2RlCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAlAIHdyaXRlIGNvbnRyb2wgcmVnCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWNscHM3NTAwLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1jbHBzNzUwMC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGE2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1jbHBzNzUwMC5TCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxIE5leHVzIEVsZWN0cm9uaWNzIEx0ZAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworCQkvKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IHdheXMgdGhlIGtlcm5lbCBjYW4gYmUKKwkJICAgYm9vdGVkIG9uIGEgNzUwMCBzeXN0ZW06IGZyb20gQW5nZWwgKGxvYWRlZCBpbiBSQU0pLCBmcm9tCisJCSAgIDE2LWJpdCBST00gb3IgZnJvbSAzMi1iaXQgRmxhc2guICBMdWNraWx5LCBhIHNpbmdsZSBrZXJuZWwKKwkJICAgaW1hZ2UgZG9lcyBmb3IgdGhlbSBhbGwuICovCisJCS8qIFRoaXMgYnJhbmNoIGlzIHRha2VuIGlmIHRoZSBDUFUgbWVtb3J5IHdpZHRoIG1hdGNoZXMgdGhlCisJCSAgIGFjdHVhbCBkZXZpY2UgaW4gdXNlLiAgVGhlIGRlZmF1bHQgYXQgcG93ZXIgb24gaXMgMTYgYml0cworCQkgICBzbyB3ZSBtdXN0IGJlIHByZXBhcmVkIGZvciBhIG1pc21hdGNoLiAqLworCQkuc2VjdGlvbiAiLnN0YXJ0IiwgImF4IgorMjoKKwkJYgkxZgorCQkud29yZAkweGZmZmYKKwkJLndvcmQJMHhiNjMyCQlAIG1vdiByMTEsICMweDAzMjAwMDAwCisJCS53b3JkCTB4ZTNhMAorCQkud29yZAkweDAwMDAJCUAgbW92IHIwLCAjMAorCQkud29yZAkweGUzYTAKKwkJLndvcmQJMHgwMDgwCQlAIHN0cmIgcjAsIFtyMTEsICMweDgwXQorCQkud29yZAkweGU1Y2IKKwkJLndvcmQJMHhmMDAwCQlAIG1vdiBwYywgIzAKKwkJLndvcmQJMHhlM2EwCisxOgorCQlhZHIJcjEsIDJiCisJCXRlcQlyMSwgIzAKKwkJYm5lCS5MYW5nZWwKKwkJLyogVGhpcyBpcyBhIGRpcmVjdC1mcm9tLVJPTSBib290LiAgQ29weSB0aGUga2VybmVsIGludG8gCisJCSAgIFJBTSBhbmQgcnVuIGl0IHRoZXJlLiAqLworCQltb3YJcjAsICMweDMwCisJCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKwkJbW92CXIwLCAjMHgxMworCQltc3IJY3Bzcl9jeHNmLCByMAorCQltb3YJcjEyLCAjMHgwMzAwMDAwMAlAIHBvaW50IHRvIExFRHMKKwkJb3JyCXIxMiwgcjEyLCAjMHgwMDAyMDAwMAorCQlvcnIJcjEyLCByMTIsICMweGJhMDAKKwkJbW92CXIwLCAjMHg1NTAwCisJCXN0cglyMCwgW3IxMl0KKwkJbW92CXIwLCAjMHgxMDAwMDAwMAorCQlvcnIJcjAsIHIwLCAjMHg4MDAwCisJCW1vdglyNCwgcjAKKwkJbGRyCXIyLCA9X2VuZAorMjoKKwkJbGRyCXIzLCBbcjFdLCAjNAorCQlzdHIJcjMsIFtyMF0sICM0CisJCXRlcQlyMCwgcjIKKwkJYm5lCTJiCisJCW1vdglyMCwgIzB4ZmYwMAorCQlzdHIJcjAsIFtyMTJdCisxOgkKKwkJbW92CXIxMiwgIzB4MDMwMDAwMDAJQCBwb2ludCB0byBMRURzCisJCW9ycglyMTIsIHIxMiwgIzB4MDAwMjAwMDAKKwkJb3JyCXIxMiwgcjEyLCAjMHhiYTAwCisJCW1vdglyMCwgIzB4ZmUwMAorCQlzdHIJcjAsIFtyMTJdCisKKwkJYWRyCWxyLCAxZgorCQltb3YJcjAsICMwCisJCW1vdglyMSwgIzE0CQkvKiBNQUNIX1RZUEVfQ0xQUzc1MDAgKi8KKwkJbW92CXBjLCBscgorLkxhbmdlbDoKKyNpZmRlZiBDT05GSUdfQU5HRUxCT09UCisJCS8qIENhbGwgQW5nZWwgdG8gc3dpdGNoIGludG8gU1ZDIG1vZGUuICovCisJCW1vdglyMCwgIzB4MTcKKwkJc3dpCTB4MTIzNDU2CisjZW5kaWYKKwkJLyogRW5zdXJlIGFsbCBpbnRlcnJ1cHRzIGFyZSBvZmYgYW5kIE1NVSBkaXNhYmxlZCAqLworCQltcnMJcjAsIGNwc3IKKwkJb3JyCXIwLCByMCwgIzB4YzAKKwkJbXNyCWNwc3JfY3hzZiwgcjAKKworCQlhZHIJbHIsIDFiCisJCW9ycglsciwgbHIsICMweDEwMDAwMDAwCisJCW1vdglyMCwgIzB4MzAJCUAgTU1VIG9mZgorCQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisJCW1vdglyMCwgcjAKKwkgCW1vdglwYywgbHIKKworCQkubHRvcmcKKworMToKKy8qIEFuZCB0aGUgcmVzdCAqLworI2luY2x1ZGUgImhlYWQuUyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWVweGExMGRiLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1lcHhhMTBkYi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NzY4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1lcHhhMTBkYi5TCkBAIC0wLDAgKzEsNSBAQAorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZXhjYWxpYnVyLmg+CisKKwkJLnNlY3Rpb24JIi5zdGFydCIsICJheCIKKwkJbW92CXI3LCAjTUFDSF9UWVBFX0NBTUVMT1QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWw3MjAwLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1sNzIwMC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGJkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1sNzIwMC5TCkBAIC0wLDAgKzEsMzAgQEAKKy8qIAorICogbGludXgvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtbDcyMDAuUworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3RldmUgSGlsbCA8c2poaWxsQGNvdHcuY29tPgorICogCisgKiBTb21lIGNvZGUgYm9ycm93ZWQgZnJvbSBOaWNvbGFzIFBpdHJlJ3MgJ2hlYWQtc2ExMTAwLlMnIGZpbGUuIFRoaXMKKyAqIGlzIG1lcmdlZCB3aXRoIGhlYWQuUyBieSB0aGUgbGlua2VyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaWZuZGVmIENPTkZJR19BUkNIX0w3MjAwCisjZXJyb3IgV2hhdCBhbSBJIGRvaW5nIGhlcmUuLi4KKyNlbmRpZgorCisJCS5zZWN0aW9uICAgICAgICAiLnN0YXJ0IiwgImF4IgorCitfX0w3MjAwX3N0YXJ0OgorCQltb3YJcjAsICMweDAwMTAwMDAwCQlAIEZMQVNIIGFkZHJlc3Mgb2YgaW5pdHJkCisJCW1vdglyMiwgIzB4ZjEwMDAwMDAJCUAgUkFNIGFkZHJlc3Mgb2YgaW5pdHJkCisJCWFkZAlyMywgcjIsICMweDAwNzAwMDAwCUAgU2l6ZSBvZiBpbml0cmQgCisxOgorCQlsZG1pYSAgIHIwISwge3I0LCByNSwgcjYsIHI3fQorCQlzdG1pYSAgIHIyISwge3I0LCByNSwgcjYsIHI3fQorCQljbXAJcjIsIHIzCisJCWJsZQkxYgorCisJCW1vdglyOCwgIzAJCQlAIFplcm8gaXQgb3V0CisJCW1vdglyNywgI01BQ0hfVFlQRV9MNzIwMAlAIFNldCBhcmNoaXRlY3R1cmUgSUQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNhMTEwMC5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2ExMTAwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlZmZmZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNhMTEwMC5TCkBAIC0wLDAgKzEsNDggQEAKKy8qIAorICogbGludXgvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2ExMTAwLlMKKyAqIAorICogQ29weXJpZ2h0IChDKSAxOTk5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqIAorICogU0ExMTAwIHNwZWNpZmljIHR3ZWFrcy4gIFRoaXMgaXMgbWVyZ2VkIGludG8gaGVhZC5TIGJ5IHRoZSBsaW5rZXIuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworCQkuc2VjdGlvbiAgICAgICAgIi5zdGFydCIsICJheCIKKworX19TQTExMDBfc3RhcnQ6CisKKwkJQCBQcmVzZXJ2ZSByOC9yNyBpLmUuIGtlcm5lbCBlbnRyeSB2YWx1ZXMKKyNpZmRlZiBDT05GSUdfU0ExMTAwX0NPTExJRQorCQltb3YJcjcsICNNQUNIX1RZUEVfQ09MTElFCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0ExMTAwX1NJTVBBRAorCQlAIFVOVElMIHdlJ3ZlIHNvbWV0aGluZyBsaWtlIGFuIG9wZW4gYm9vdGxkcgorCQltb3YJcjcsICNNQUNIX1RZUEVfU0lNUEFECUBzaG91bGQgYmUgODcKKyNlbmRpZgorCQltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCUAgcmVhZCBjb250cm9sIHJlZworCQlhbmRzCXIwLCByMCwgIzB4MGQKKwkJYmVxCTk5ZgorCisJCUAgRGF0YSBjYWNoZSBtaWdodCBiZSBhY3RpdmUuCisJCUAgQmUgc3VyZSB0byBmbHVzaCBrZXJuZWwgYmluYXJ5IG91dCBvZiB0aGUgY2FjaGUsCisJCUAgd2hhdGV2ZXIgc3RhdGUgaXQgaXMsIGJlZm9yZSBpdCBpcyB0dXJuZWQgb2ZmLgorCQlAIFRoaXMgaXMgZG9uZSBieSBmZXRjaGluZyB0aHJvdWdoIGN1cnJlbnRseSBleGVjdXRlZAorCQlAIG1lbW9yeSB0byBiZSBzdXJlIHdlIGhpdCB0aGUgc2FtZSBjYWNoZS4KKwkJYmljCXIyLCBwYywgIzB4MWYKKwkJYWRkCXIzLCByMiwgIzB4NDAwMAkJQCAxNiBrYiBpcyBxdWl0ZSBlbm91Z2guLi4KKzE6CQlsZHIJcjAsIFtyMl0sICMzMgorCQl0ZXEJcjIsIHIzCisJCWJuZQkxYgorCQltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAlAIGRyYWluIFdCCisJCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJQCBmbHVzaCBJICYgRCBjYWNoZXMKKworCQlAIGRpc2FibGluZyBNTVUgYW5kIGNhY2hlcworCQltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCUAgcmVhZCBjb250cm9sIHJlZworCQliaWMJcjAsIHIwLCAjMHgwZAkJQCBjbGVhciBXQiwgREMsIE1NVQorCQliaWMJcjAsIHIwLCAjMHgxMDAwCQlAIGNsZWFyIEljYWNoZQorCQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCis5OToKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNoYXJrLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaGFyay5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OGY2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaGFyay5TCkBAIC0wLDAgKzEsMTE1IEBACisvKiBUaGUgaGVhZC1maWxlIGZvciB0aGUgU2hhcmsKKyAqIGJ5IEFsZXhhbmRlciBTY2h1bHoKKyAqCisgKiBEb2VzIHRoZSBmb2xsb3dpbmc6CisgKiAtIGdldCB0aGUgbWVtb3J5IGxheW91dCBmcm9tIGZpcm13YXJlLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYXMgbG9uZyBhcyB0aGUgbW11CisgKiAgIGlzIHN0aWxsIG9uLgorICogLSBzd2l0Y2ggdGhlIG1tdSBvZmYsIHNvIHdlIGhhdmUgcGh5c2ljYWwgYWRkcmVzc2VzCisgKiAtIGNvcHkgdGhlIGtlcm5lbCB0byAweDA4NTA4MDAwLiBUaGlzIGlzIGRvbmUgdG8gaGF2ZSBhIGZpeGVkIGFkZHJlc3Mgd2hlcmUgdGhlCisgKiAgIEMtcGFydHMgKG1pc2MuYykgYXJlIGV4ZWN1dGVkLiBUaGlzIGFkZHJlc3MgbXVzdCBiZSBrbm93biBhdCBjb21waWxlLXRpbWUsCisgKiAgIGJ1dCB0aGUgbG9hZC1hZGRyZXNzIG9mIHRoZSBrZXJuZWwgZGVwZW5kcyBvbiBob3cgbXVjaCBtZW1vcnkgaXMgaW5zdGFsbGVkLgorICogLSBKdW1wIHRvIHRoaXMgbG9jYXRpb24uCisgKiAtIFNldCByOCB3aXRoIDAsIHI3IHdpdGggdGhlIGFyY2hpdGVjdHVyZSBJRCBmb3IgaGVhZC5TCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKwkKKwkJLnNlY3Rpb24JIi5zdGFydCIsICJheCIKKworCQliCV9fYmVnaW5uaW5nCisJCitfX29md19kYXRhOgkubG9uZwkwCQkJCUAgdGhlIG51bWJlciBvZiBtZW1vcnkgYmxvY2tzCisJCS5zcGFjZSAgMTI4CQkJCUAgKHN0YXJ0YWRkcixzaXplKSAuLi4KKwkJLnNwYWNlICAxMjgJCQkJQCBib290YXJncworCQkuYWxpZ24KKworX19iZWdpbm5pbmc6CW1vdglyNCwgcjAJCQkJQCBzYXZlIHRoZSBlbnRyeSB0byB0aGUgZmlybXdhcmUKKworCQltb3YJcjAsICMweEMwCQkJQCBkaXNhYmxlIGlycSBhbmQgZmlxCisJCW1vdglyMSwgcjAKKwkJbXJzCXIzLCBjcHNyCisJCWJpYwlyMiwgcjMsIHIwCisJCWVvcglyMiwgcjIsIHIxCisJCW1zcgljcHNyX2MsIHIyCisKKwkJbW92CXIwLCByNAkJCQlAIGdldCB0aGUgTWVtb3J5IGxheW91dCBmcm9tIGZpcm13YXJlCisJCWFkcglyMSwgX19vZndfZGF0YQorCQlhZGQJcjIsIHIxLCAjNAorCQltb3YJbHIsIHBjCisJCWIJb2Z3X2luaXQKKwkJbW92CXIxLCAjMAorCisJCWFkcglyMiwgX19tbXVfb2ZmCQkJQCBjYWxjdWxhdGUgcGh5c2ljYWwgYWRkcmVzcworCQlzdWIJcjIsIHIyLCAjMHhmMDAwMDAwMAkJQCBvcGVucHJvbSBtYXBzIHVzIGF0IGYwMDAgdmlydCwgMGU1MCBwaHlzCisJCWFkcglyMCwgX19vZndfZGF0YQorCQlsZHIJcjAsIFtyMCwgIzRdCisJCWFkZAlyMiwgcjIsIHIwCisJCWFkZAlyMiwgcjIsICMweDAwNTAwMDAwCisKKwkJbXJjCXAxNSwgMCwgcjMsIGMxLCBjMAorCQliaWMJcjMsIHIzLCAjMHhDCQkJQCBXcml0ZSBCdWZmZXIgYW5kIERDYWNoZQorCQliaWMJcjMsIHIzLCAjMHgxMDAwCQkJQCBJQ2FjaGUKKwkJbWNyCXAxNSwgMCwgcjMsIGMxLCBjMAkJQCBkaXNhYmxlZAorCisJCW1vdglyMCwgIzAKKwkJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNwkJQCBmbHVzaCBJLEQgY2FjaGVzIG9uIHY0CisJCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlciBvbiB2NAorCQltY3IJcDE1LCAwLCByMCwgYzgsIGM3CQlAIGZsdXNoIEksRCBUTEJzIG9uIHY0CisKKwkJYmljCXIzLCByMywgIzB4MQkJCUAgTU1VCisJCW1jcglwMTUsIDAsIHIzLCBjMSwgYzAJCUAgZGlzYWJsZWQKKworCQltb3YJcGMsIHIyCisKK19fY29weV90YXJnZXQ6CS5sb25nCTB4MDg1MDgwMDAKK19fY29weV9lbmQ6CS5sb25nCTB4MDg2MDgwMDAKKwkJCisJCS53b3JkCV9zdGFydAorCQkud29yZAlfX2Jzc19zdGFydAorCisJCS5hbGlnbgorX190ZW1wX3N0YWNrOgkuc3BhY2UgMTI4CisKK19fbW11X29mZjoKKwkJYWRyCXIwLCBfX29md19kYXRhCisJCWxkcglyMCwgW3IwLCAjNF0KKwkJb3JyCXIwLCByMCwgIzB4MDA2MDAwMDAKKwkKKwkJbGRyCXIxLCBfX2NvcHlfZW5kCisJCWxkcglyMywgX19jb3B5X3RhcmdldAorCisvKiByMCA9IDB4MGU2MDAwMDAgKGN1cnJlbnQgZW5kIG9mIGtlcm5lbGNvZGUpCisgKiByMyA9IDB4MDg1MDgwMDAgKHdoZXJlIGl0IHNob3VsZCBiZWdpbikKKyAqIHIxID0gMHgwODYwODAwMCAoZW5kIG9mIGNvcHlpbmcgYXJlYSwgMU1CKQorICogVGhlIGtlcm5lbCBpcyBjb21wcmVzc2VkLCBzbyAxIE1CIHNob3VsZCBiZSBlbm91Z2guCisgKiBjb3B5IHRoZSBrZXJuZWwgdG8gdGhlIGJlZ2lubmluZyBvZiBwaHlzaWNhbCBtZW1vcnkKKyAqIFdlIHN0YXJ0IGZyb20gdGhlIGhpZ2hlc3QgYWRkcmVzcywgc28gd2UgY2FuIGNvcHkKKyAqIGZyb20gMHgwODUwMDAwMCB0byAweDA4NTA4MDAwIGlmIHdlIGhhdmUgb25seSA4TUIKKyAqLworCisJCitfX0NvcHk6CQlsZHIJcjIsIFtyMF0sICMtNAorCQlzdHIJcjIsIFtyMV0sICMtNAorCQl0ZXEJcjEsIHIzCisJCWJuZQlfX0NvcHkKKwkJLyogYW5kIGp1bXAgdG8gaXQgKi8KKwkJYWRyCXIyLCBfX2dvX29uCisJCWFkcglyMCwgX19vZndfZGF0YQorCQlsZHIJcjAsIFtyMCwgIzRdCisJCXN1YglyMiwgcjIsIHIwCisJCXN1YglyMiwgcjIsICMweDAwNTAwMDAwCisJCWxkcglyMCwgX19jb3B5X3RhcmdldAorCQlhZGQJcjIsIHIyLCByMAorCQltb3YJcGMsIHIyCisKK19fZ29fb246CisJCWFkcglzcCwgX190ZW1wX3N0YWNrCisJCWFkZAlzcCwgc3AsICMxMjgKKwkJYWRyCXIwLCBfX29md19kYXRhCisJCW1vdglsciwgcGMKKwkJYgljcmVhdGVfcGFyYW1zCisJCisJCW1vdglyOCwgIzAKKwkJbW92CXI3LCAjMTUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNoYXJwc2wuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNoYXJwc2wuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmJmOGEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2hhcnBzbC5TCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaGFycHNsLlMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+CisgKgorICogU2hhcnAncyBib290bG9hZGVyIGRvZXNuJ3QgcGFzcyBhbnkga2luZCBvZiBtYWNoaW5lIElECisgKiBzbyB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIG1hY2hpbmUgZm9yIG91cnNlbHZlcy4uLgorICoKKyAqIFN1cHBvcnQgZm9yIFBvb2RsZSwgQ29yZ2kgKFNMLUM3MDApLCBTaGVwaGVyZCAoU0wtQzc1MCkKKyAqIGFuZCBIdXNreSAoU0wtQzc2MCkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2lmbmRlZiBDT05GSUdfUFhBX1NIQVJQU0wKKyNlcnJvciBXaGF0IGFtIEkgZG9pbmcgaGVyZS4uLgorI2VuZGlmCisKKwkJLnNlY3Rpb24gICAgICAgICIuc3RhcnQiLCAiYXgiCisKK19fU2hhcnBTTF9zdGFydDoKKworCWxkcglyMSwgLlcxMDBBRERSCQlAIEJhc2UgYWRkcmVzcyBvZiB3MTAwIGNoaXAgKyByZWdzIG9mZnNldAorCisJbW92IHI2LCAjMHgzMQkJCUAgTG9hZCBNYWdpYyBJbml0IHZhbHVlCisJc3RyCXI2LCBbcjEsICMweDI4MF0JQCB0byBTQ1JBVENIX1VNU0sKKwltb3YgcjUsICMweDMwMDAKKy5XMTAwTE9PUDoKKwlzdWJzIHI1LCByNSwgIzEKKyAgICBibmUgLlcxMDBMT09QCisJbW92IHI2LCAjMHgzMAkJCUAgTG9hZCAybmQgTWFnaWMgSW5pdCB2YWx1ZQorCXN0cglyNiwgW3IxLCAjMHgyODBdCUAgdG8gU0NSQVRDSF9VTVNLCisKKwlsZHIJcjYsIFtyMSwgIzBdCQlAIExvYWQgQ2hpcCBJRAorCWxkcglyMywgLlcxMDBJRAorCWxkcglyNywgLlBPT0RMRUlECisJY21wCXI2LCByMworCWJuZQkuU0hBUlBFTkQJCQlAIFdlIGhhdmUgbm8gdzEwMCAtIFBvb2RsZQorCisJbXJjIHAxNSwgMCwgcjYsIGMwLCBjMAlAIEdldCBQcm9jZXNzb3IgSUQKKwlhbmQJcjYsIHI2LCAjMHhmZmZmZmYwMAorCWxkcglyNywgLkNPUkdJSUQKKwlsZHIJcjMsIC5QWEEyNTVJRAorCWNtcAlyNiwgcjMKKwlibG8JLlNIQVJQRU5ECQkJQCBXZSBoYXZlIGEgUFhBMjUwIC0gQ29yZ2kKKworCW1vdglyMSwgIzB4MGMwMDAwMDAJCUAgQmFzZSBhZGRyZXNzIG9mIE5BTkQgY2hpcAorCWxkcmIJcjMsIFtyMSwgIzI0XQlAIExvYWQgRkxBU0hDVEwKKwliaWMJcjMsIHIzLCAjMHgxMQkJQCBTRVQgTkNFCisJb3JyCXIzLCByMywgIzB4MGEJCUAgU0VUIENMUiArIEZMV1AKKwlzdHJiCXIzLCBbcjEsICMyNF0JQCBTYXZlIHRvIEZMQVNIQ1RMCisJbW92IAlyMiwgIzB4OTAJCUAgQ29tbWFuZCAicmVhZGlkIgorCXN0cmIJcjIsIFtyMSwgIzIwXQlAIFNhdmUgdG8gRkxBU0hJTworCWJpYwlyMywgcjMsICMyCQkJQCBDTFIgQ0xFCisJb3JyCXIzLCByMywgIzQJCQlAIFNFVCBBTEUKKwlzdHJiCXIzLCBbcjEsICMyNF0JQCBTYXZlIHRvIEZMQVNIQ1RMCisJbW92CQlyMiwgIzAJCQlAIEFkZHJlc3MgMHgwMAorCXN0cmIJcjIsIFtyMSwgIzIwXQlAIFNhdmUgdG8gRkxBU0hJTworCWJpYwlyMywgcjMsICM0CQkJQCBDTFIgQUxFCisJc3RyYglyMywgW3IxLCAjMjRdCUAgU2F2ZSB0byBGTEFTSENUTAorLlNIQVJQMToKKwlsZHJiCXIzLCBbcjEsICMyNF0JQCBMb2FkIEZMQVNIQ1RMCisJdHN0CXIzLCAjMzIJCQkJQCBJcyBjaGlwIHJlYWR5PworCWJlcQkuU0hBUlAxCisJbGRyYglyMiwgW3IxLCAjMjBdCUAgTkFORCBNYW51ZmFjdHVyZXIgSUQKKwlsZHJiCXIzLCBbcjEsICMyMF0JQCBOQU5EIENoaXAgSUQKKwlsZHIJcjcsIC5TSEVQSEVSRElECisJY21wCXIzLCAjMHg3NgkJCUAgNjRNaUIgZmxhc2gKKwliZXEJLlNIQVJQRU5ECQkJQCBXZSBoYXZlIFNoZXBoZXJkCisJbGRyCXI3LCAuSFVTS1lJRAkJQCBNdXN0IGJlIEh1c2t5CisJYiAuU0hBUlBFTkQKKworLlBYQTI1NUlEOgorCS53b3JkCTB4NjkwNTJkMDAJCUAgUFhBMjU1IFByb2Nlc3NvciBJRAorLlcxMDBJRDoKKwkud29yZAkweDU3NDExMDAyCQlAIHcxMDAgQ2hpcCBJRAorLlcxMDBBRERSOgorCS53b3JkIAkweDA4MDEwMDAwCQlAIHcxMDAgQ2hpcCBJRCBSZWcgQWRkcmVzcworLlBPT0RMRUlEOgorCS53b3JkCU1BQ0hfVFlQRV9QT09ETEUKKy5DT1JHSUlEOgorCS53b3JkCU1BQ0hfVFlQRV9DT1JHSQorLlNIRVBIRVJESUQ6CisJLndvcmQJTUFDSF9UWVBFX1NIRVBIRVJECisuSFVTS1lJRDoKKwkud29yZAlNQUNIX1RZUEVfSFVTS1kKKy5TSEFSUEVORDoKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC14c2NhbGUuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXhzY2FsZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NWJkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC14c2NhbGUuUwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogbGludXgvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQteHNjYWxlLlMKKyAqCisgKiBYU2NhbGUgc3BlY2lmaWMgdHdlYWtzLiAgVGhpcyBpcyBtZXJnZWQgaW50byBoZWFkLlMgYnkgdGhlIGxpbmtlci4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisJCS5zZWN0aW9uICAgICAgICAiLnN0YXJ0IiwgImF4IgorCitfX1hTY2FsZV9zdGFydDoKKworCQlAIFByZXNlcnZlIHI4L3I3IGkuZS4ga2VybmVsIGVudHJ5IHZhbHVlcworCisJCUAgRGF0YSBjYWNoZSBtaWdodCBiZSBhY3RpdmUuCisJCUAgQmUgc3VyZSB0byBmbHVzaCBrZXJuZWwgYmluYXJ5IG91dCBvZiB0aGUgY2FjaGUsCisJCUAgd2hhdGV2ZXIgc3RhdGUgaXQgaXMsIGJlZm9yZSBpdCBpcyB0dXJuZWQgb2ZmLgorCQlAIFRoaXMgaXMgZG9uZSBieSBmZXRjaGluZyB0aHJvdWdoIGN1cnJlbnRseSBleGVjdXRlZAorCQlAIG1lbW9yeSB0byBiZSBzdXJlIHdlIGhpdCB0aGUgc2FtZSBjYWNoZS4KKwkJYmljCXIyLCBwYywgIzB4MWYKKwkJYWRkCXIzLCByMiwgIzB4MTAwMDAJQCA2NCBrYiBpcyBxdWl0ZSBlbm91Z2guLi4KKzE6CQlsZHIJcjAsIFtyMl0sICMzMgorCQl0ZXEJcjIsIHIzCisJCWJuZQkxYgorCQltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAlAIGRyYWluIFdCCisJCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJQCBmbHVzaCBJICYgRCBjYWNoZXMKKworCQlAIGRpc2FibGluZyBNTVUgYW5kIGNhY2hlcworCQltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCUAgcmVhZCBjb250cm9sIHJlZworCQliaWMJcjAsIHIwLCAjMHgwNQkJQCBjbGVhciBEQywgTU1VCisJCWJpYwlyMCwgcjAsICMweDEwMDAJCUAgY2xlYXIgSWNhY2hlCisJCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKworI2lmZGVmIENPTkZJR19BUkNIX0xVQkJPQ0sKKwkJbW92CXI3LCAjTUFDSF9UWVBFX0xVQkJPQ0sKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfQ09UVUxMQV9JRFAKKwkJbW92CXI3LCAjTUFDSF9UWVBFX0NPVFVMTEFfSURQCisjZW5kaWYKKworI2lmZGVmICBDT05GSUdfTUFDSF9HVFdYNTcxNQorICAgICAgICAgICAgICAgbW92ICAgICByNywgIyhNQUNIX1RZUEVfR1RXWDU3MTUgJiAweGZmKQorICAgICAgICAgICAgICAgb3JyICAgICByNywgcjcsICMoTUFDSF9UWVBFX0dUV1g1NzE1ICYgMHhmZjAwKQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTdhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC0wLDAgKzEsNzg2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworLyoKKyAqIERlYnVnZ2luZyBzdHVmZgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBtYWNyb3MgbXVzdCBub3QgY29udGFpbiBhbnkgY29kZSB3aGljaCBpcyBub3QKKyAqIDEwMCUgcmVsb2NhdGFibGUuICBBbnkgYXR0ZW1wdCB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBhIGNyYXNoLgorICogUGxlYXNlIHNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyB3aGVuIHR1cm5pbmcgb24gZGVidWdnaW5nLgorICovCisjaWZkZWYgREVCVUcKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19EQzIxMjg1X1BPUlQpCisJCS5tYWNybwlsb2Fkc3AsIHJiCisJCW1vdglccmIsICMweDQyMDAwMDAwCisJCS5lbmRtCisJCS5tYWNybwl3cml0ZWIsIHJiCisJCXN0cglccmIsIFtyMywgIzB4MTYwXQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfREVCVUdfSUNFRENDKQorCQkubWFjcm8JbG9hZHNwLCByYgorCQkuZW5kbQorCQkubWFjcm8gd3JpdGViLCByYgorCQltY3IJcDE0LCAwLCBccmIsIGMwLCBjMSwgMAorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfRk9PVEJSSURHRSkKKwkJLm1hY3JvCWxvYWRzcCwJcmIKKwkJbW92CVxyYiwgIzB4N2MwMDAwMDAKKwkJLmVuZG0KKwkJLm1hY3JvCXdyaXRlYiwJcmIKKwkJc3RyYglccmIsIFtyMywgIzB4M2Y4XQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9SUEMpCisJCS5tYWNybwlsb2Fkc3AsCXJiCisJCW1vdglccmIsICMweDAzMDAwMDAwCisJCW9ycglccmIsIFxyYiwgIzB4MDAwMTAwMDAKKwkJLmVuZG0KKwkJLm1hY3JvCXdyaXRlYiwJcmIKKwkJc3RyYglccmIsIFtyMywgIzB4M2Y4IDw8IDJdCisJCS5lbmRtCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lOVEVHUkFUT1IpCisJCS5tYWNybwlsb2Fkc3AsIHJiCisJCW1vdglccmIsICMweDE2MDAwMDAwCisJCS5lbmRtCisJCS5tYWNybwl3cml0ZWIsIHJiCisJCXN0cmIJXHJiLCBbcjMsICMwXQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9QWEEpIC8qIFhzY2FsZS10eXBlICovCisJCS5tYWNybyAJbG9hZHNwLCByYgorCQltb3YJXHJiLCAjMHg0MDAwMDAwMAorCQlvcnIJXHJiLCBccmIsICMweDAwMTAwMDAwCisJCS5lbmRtCisJCS5tYWNybwl3cml0ZWIsIHJiCisJCXN0cmIJXHJiLCBbcjMsICMwXQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TQTExMDApCisJCS5tYWNybwlsb2Fkc3AsIHJiCisJCW1vdglccmIsICMweDgwMDAwMDAwCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCisjICBpZiBkZWZpbmVkKENPTkZJR19ERUJVR19MTF9TRVIzKQorCQlhZGQJXHJiLCBccmIsICMweDAwMDUwMDAwCUAgU2VyMworIyAgZWxzZQorCQlhZGQJXHJiLCBccmIsICMweDAwMDEwMDAwCUAgU2VyMQorIyAgZW5kaWYKKwkJLmVuZG0KKwkJLm1hY3JvCXdyaXRlYiwgcmIKKwkJc3RyCVxyYiwgW3IzLCAjMHgxNF0JQCBVVERSCisJCS5lbmRtCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lYUDRYWCkKKwkJLm1hY3JvCWxvYWRzcCwgcmIKKwkJbW92CVxyYiwgIzB4YzgwMDAwMDAKKwkJLmVuZG0KKwkJLm1hY3JvCXdyaXRlYiwgcmIKKwkJc3RyCVxyYiwgW3IzLCAjMF0KKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhQMjAwMCkKKwkJLm1hY3JvCWxvYWRzcCwgcmIKKwkJbW92CVxyYiwgIzB4YzAwMDAwMDAKKwkJb3JyCVxyYiwgXHJiLCAjMHgwMDAzMDAwMAorCQkuZW5kbQorCQkubWFjcm8Jd3JpdGViLCByYgorCQlzdHIJXHJiLCBbcjMsICMwXQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9MSDdBNDBYKQorCQkubWFjcm8JbG9hZHNwLCByYgorCQlsZHIJXHJiLCA9MHg4MDAwMDcwMAlAIFVBUlQyIFVBUlRCQVNFCisJCS5lbmRtCisJCS5tYWNybwl3cml0ZWIsIHJiCisJCXN0cmIJXHJiLCBbcjMsICMwXQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQKQorCQkubWFjcm8gIGxvYWRzcCwgcmIKKwkJbW92CVxyYiwgIzB4ZmYwMDAwMDAJQCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MKKwkJYWRkCVxyYiwgXHJiLCAjMHgwMGZiMDAwMAorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDIpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDMpCisJCWFkZAlccmIsIFxyYiwgIzB4MDAwMDA4MDAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzCisJCWFkZAlccmIsIFxyYiwgIzB4MDAwMDkwMDAKKyNlbmRpZgorCQkuZW5kbQorCQkubWFjcm8Jd3JpdGViLCByYgorCQlzdHJiCVxyYiwgW3IzXQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JT1AzMzEpCisJCS5tYWNybyBsb2Fkc3AsIHJiCisgICAgICAgICAgICAgICAgbW92ICAgCVxyYiwgIzB4ZmYwMDAwMDAKKyAgICAgICAgICAgICAgICBvcnIgICAgIFxyYiwgXHJiLCAjMHgwMGZmMDAwMAorICAgICAgICAgICAgICAgIG9yciAgICAgXHJiLCBccmIsICMweDAwMDBmNzAwICAgQCBsb2NhdGlvbiBvZiB0aGUgVUFSVAorCQkuZW5kbQorCQkubWFjcm8Jd3JpdGViLCByYgorCQlzdHIJXHJiLCBbcjMsICMwXQorCQkuZW5kbQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TM0MyNDEwKQorCQkJLm1hY3JvIGxvYWRzcCwgcmIKKwkJbW92CVxyYiwgIzB4NTAwMDAwMDAKKwkJYWRkCVxyYiwgXHJiLCAjMHg0MDAwICogQ09ORklHX1MzQzI0MTBfTE9XTEVWRUxfVUFSVF9QT1JUCisJCS5lbmRtCisJCS5tYWNybwl3cml0ZWIsIHJiCisJCXN0cmIJXHJiLCBbcjMsICMweDIwXQorCQkuZW5kbQorI2Vsc2UKKyNlcnJvciBubyBzZXJpYWwgYXJjaGl0ZWN0dXJlIGRlZmluZWQKKyNlbmRpZgorI2VuZGlmCisKKwkJLm1hY3JvCWtwdXRjLHZhbAorCQltb3YJcjAsIFx2YWwKKwkJYmwJcHV0YworCQkuZW5kbQorCisJCS5tYWNybwlrcGhleCx2YWwsbGVuCisJCW1vdglyMCwgXHZhbAorCQltb3YJcjEsICNcbGVuCisJCWJsCXBoZXgKKwkJLmVuZG0KKworCQkubWFjcm8JZGVidWdfcmVsb2Nfc3RhcnQKKyNpZmRlZiBERUJVRworCQlrcHV0YwkjJ1xuJworCQlrcGhleAlyNiwgOAkJLyogcHJvY2Vzc29yIGlkICovCisJCWtwdXRjCSMnOicKKwkJa3BoZXgJcjcsIDgJCS8qIGFyY2hpdGVjdHVyZSBpZCAqLworCQlrcHV0YwkjJzonCisJCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAKKwkJa3BoZXgJcjAsIDgJCS8qIGNvbnRyb2wgcmVnICovCisJCWtwdXRjCSMnXG4nCisJCWtwaGV4CXI1LCA4CQkvKiBkZWNvbXByZXNzZWQga2VybmVsIHN0YXJ0ICovCisJCWtwdXRjCSMnLScKKwkJa3BoZXgJcjgsIDgJCS8qIGRlY29tcHJlc3NlZCBrZXJuZWwgZW5kICAqLworCQlrcHV0YwkjJz4nCisJCWtwaGV4CXI0LCA4CQkvKiBrZXJuZWwgZXhlY3V0aW9uIGFkZHJlc3MgKi8KKwkJa3B1dGMJIydcbicKKyNlbmRpZgorCQkuZW5kbQorCisJCS5tYWNybwlkZWJ1Z19yZWxvY19lbmQKKyNpZmRlZiBERUJVRworCQlrcGhleAlyNSwgOAkJLyogZW5kIG9mIGtlcm5lbCAqLworCQlrcHV0YwkjJ1xuJworCQltb3YJcjAsIHI0CisJCWJsCW1lbWR1bXAJCS8qIGR1bXAgMjU2IGJ5dGVzIGF0IHN0YXJ0IG9mIGtlcm5lbCAqLworI2VuZGlmCisJCS5lbmRtCisKKwkJLnNlY3Rpb24gIi5zdGFydCIsICNhbGxvYywgI2V4ZWNpbnN0cgorLyoKKyAqIHNvcnQgb3V0IGRpZmZlcmVudCBjYWxsaW5nIGNvbnZlbnRpb25zCisgKi8KKwkJLmFsaWduCitzdGFydDoKKwkJLnR5cGUJc3RhcnQsI2Z1bmN0aW9uCisJCS5yZXB0CTgKKwkJbW92CXIwLCByMAorCQkuZW5kcgorCisJCWIJMWYKKwkJLndvcmQJMHgwMTZmMjgxOAkJQCBNYWdpYyBudW1iZXJzIHRvIGhlbHAgdGhlIGxvYWRlcgorCQkud29yZAlzdGFydAkJCUAgYWJzb2x1dGUgbG9hZC9ydW4gekltYWdlIGFkZHJlc3MKKwkJLndvcmQJX2VkYXRhCQkJQCB6SW1hZ2UgZW5kIGFkZHJlc3MKKzE6CQltb3YJcjcsIHIxCQkJQCBzYXZlIGFyY2hpdGVjdHVyZSBJRAorCQltb3YJcjgsICMwCQkJQCBzYXZlIHIwCisKKyNpZm5kZWYgX19BUk1fQVJDSF8yX18KKwkJLyoKKwkJICogQm9vdGluZyBmcm9tIEFuZ2VsIC0gbmVlZCB0byBlbnRlciBTVkMgbW9kZSBhbmQgZGlzYWJsZQorCQkgKiBGSVFzL0lSUXMgKG51bWVyaWMgZGVmaW5pdGlvbnMgZnJvbSBhbmdlbCBhcm0uaCBzb3VyY2UpLgorCQkgKiBXZSBvbmx5IGRvIHRoaXMgaWYgd2Ugd2VyZSBpbiB1c2VyIG1vZGUgb24gZW50cnkuCisJCSAqLworCQltcnMJcjIsIGNwc3IJCUAgZ2V0IGN1cnJlbnQgbW9kZQorCQl0c3QJcjIsICMzCQkJQCBub3QgdXNlcj8KKwkJYm5lCW5vdF9hbmdlbAorCQltb3YJcjAsICMweDE3CQlAIGFuZ2VsX1NXSXJlYXNvbl9FbnRlclNWQworCQlzd2kJMHgxMjM0NTYJCUAgYW5nZWxfU1dJX0FSTQorbm90X2FuZ2VsOgorCQltcnMJcjIsIGNwc3IJCUAgdHVybiBvZmYgaW50ZXJydXB0cyB0bworCQlvcnIJcjIsIHIyLCAjMHhjMAkJQCBwcmV2ZW50IGFuZ2VsIGZyb20gcnVubmluZworCQltc3IJY3Bzcl9jLCByMgorI2Vsc2UKKwkJdGVxcAlwYywgIzB4MGMwMDAwMDMJCUAgdHVybiBvZmYgaW50ZXJydXB0cworI2VuZGlmCisKKwkJLyoKKwkJICogTm90ZSB0aGF0IHNvbWUgY2FjaGUgZmx1c2hpbmcgYW5kIG90aGVyIHN0dWZmIG1heQorCQkgKiBiZSBuZWVkZWQgaGVyZSAtIGlzIHRoZXJlIGFuIEFuZ2VsIFNXSSBjYWxsIGZvciB0aGlzPworCQkgKi8KKworCQkvKgorCQkgKiBzb21lIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIGNhbiBiZSBpbnNlcnRlZAorCQkgKiBieSB0aGUgbGlua2VyIGhlcmUsIGJ1dCBpdCBzaG91bGQgcHJlc2VydmUgcjcgYW5kIHI4LgorCQkgKi8KKworCQkudGV4dAorCQlhZHIJcjAsIExDMAorCQlsZG1pYQlyMCwge3IxLCByMiwgcjMsIHI0LCByNSwgcjYsIGlwLCBzcH0KKwkJc3VicwlyMCwgcjAsIHIxCQlAIGNhbGN1bGF0ZSB0aGUgZGVsdGEgb2Zmc2V0CisKKwkJCQkJCUAgaWYgZGVsdGEgaXMgemVybywgd2UgYXJlCisJCWJlcQlub3RfcmVsb2NhdGVkCQlAIHJ1bm5pbmcgYXQgdGhlIGFkZHJlc3Mgd2UKKwkJCQkJCUAgd2VyZSBsaW5rZWQgYXQuCisKKwkJLyoKKwkJICogV2UncmUgcnVubmluZyBhdCBhIGRpZmZlcmVudCBhZGRyZXNzLiAgV2UgbmVlZCB0byBmaXgKKwkJICogdXAgdmFyaW91cyBwb2ludGVyczoKKwkJICogICByNSAtIHpJbWFnZSBiYXNlIGFkZHJlc3MKKwkJICogICByNiAtIEdPVCBzdGFydAorCQkgKiAgIGlwIC0gR09UIGVuZAorCQkgKi8KKwkJYWRkCXI1LCByNSwgcjAKKwkJYWRkCXI2LCByNiwgcjAKKwkJYWRkCWlwLCBpcCwgcjAKKworI2lmbmRlZiBDT05GSUdfWkJPT1RfUk9NCisJCS8qCisJCSAqIElmIHdlJ3JlIHJ1bm5pbmcgZnVsbHkgUElDID09PSBDT05GSUdfWkJPT1RfUk9NID0gbiwKKwkJICogd2UgbmVlZCB0byBmaXggdXAgcG9pbnRlcnMgaW50byB0aGUgQlNTIHJlZ2lvbi4KKwkJICogICByMiAtIEJTUyBzdGFydAorCQkgKiAgIHIzIC0gQlNTIGVuZAorCQkgKiAgIHNwIC0gc3RhY2sgcG9pbnRlcgorCQkgKi8KKwkJYWRkCXIyLCByMiwgcjAKKwkJYWRkCXIzLCByMywgcjAKKwkJYWRkCXNwLCBzcCwgcjAKKworCQkvKgorCQkgKiBSZWxvY2F0ZSBhbGwgZW50cmllcyBpbiB0aGUgR09UIHRhYmxlLgorCQkgKi8KKzE6CQlsZHIJcjEsIFtyNiwgIzBdCQlAIHJlbG9jYXRlIGVudHJpZXMgaW4gdGhlIEdPVAorCQlhZGQJcjEsIHIxLCByMAkJQCB0YWJsZS4gIFRoaXMgZml4ZXMgdXAgdGhlCisJCXN0cglyMSwgW3I2XSwgIzQJCUAgQyByZWZlcmVuY2VzLgorCQljbXAJcjYsIGlwCisJCWJsbwkxYgorI2Vsc2UKKworCQkvKgorCQkgKiBSZWxvY2F0ZSBlbnRyaWVzIGluIHRoZSBHT1QgdGFibGUuICBXZSBvbmx5IHJlbG9jYXRlCisJCSAqIHRoZSBlbnRyaWVzIHRoYXQgYXJlIG91dHNpZGUgdGhlIChyZWxvY2F0ZWQpIEJTUyByZWdpb24uCisJCSAqLworMToJCWxkcglyMSwgW3I2LCAjMF0JCUAgcmVsb2NhdGUgZW50cmllcyBpbiB0aGUgR09UCisJCWNtcAlyMSwgcjIJCQlAIGVudHJ5IDwgYnNzX3N0YXJ0IHx8CisJCWNtcGhzCXIzLCByMQkJCUAgX2VuZCA8IGVudHJ5CisJCWFkZGxvCXIxLCByMSwgcjAJCUAgdGFibGUuICBUaGlzIGZpeGVzIHVwIHRoZQorCQlzdHIJcjEsIFtyNl0sICM0CQlAIEMgcmVmZXJlbmNlcy4KKwkJY21wCXI2LCBpcAorCQlibG8JMWIKKyNlbmRpZgorCitub3RfcmVsb2NhdGVkOgltb3YJcjAsICMwCisxOgkJc3RyCXIwLCBbcjJdLCAjNAkJQCBjbGVhciBic3MKKwkJc3RyCXIwLCBbcjJdLCAjNAorCQlzdHIJcjAsIFtyMl0sICM0CisJCXN0cglyMCwgW3IyXSwgIzQKKwkJY21wCXIyLCByMworCQlibG8JMWIKKworCQkvKgorCQkgKiBUaGUgQyBydW50aW1lIGVudmlyb25tZW50IHNob3VsZCBub3cgYmUgc2V0dXAKKwkJICogc3VmZmljaWVudGx5LiAgVHVybiB0aGUgY2FjaGUgb24sIHNldCB1cCBzb21lCisJCSAqIHBvaW50ZXJzLCBhbmQgc3RhcnQgZGVjb21wcmVzc2luZy4KKwkJICovCisJCWJsCWNhY2hlX29uCisKKwkJbW92CXIxLCBzcAkJCUAgbWFsbG9jIHNwYWNlIGFib3ZlIHN0YWNrCisJCWFkZAlyMiwgc3AsICMweDEwMDAwCUAgNjRrIG1heAorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHdlIHdpbGwgb3ZlcndyaXRlIG91cnNlbHZlcy4KKyAqICAgcjQgPSBmaW5hbCBrZXJuZWwgYWRkcmVzcworICogICByNSA9IHN0YXJ0IG9mIHRoaXMgaW1hZ2UKKyAqICAgcjIgPSBlbmQgb2YgbWFsbG9jIHNwYWNlIChhbmQgdGhlcmVmb3JlIHRoaXMgaW1hZ2UpCisgKiBXZSBiYXNpY2FsbHkgd2FudDoKKyAqICAgcjQgPj0gcjIgLT4gT0sKKyAqICAgcjQgKyBpbWFnZSBsZW5ndGggPD0gcjUgLT4gT0sKKyAqLworCQljbXAJcjQsIHIyCisJCWJocwl3b250X292ZXJ3cml0ZQorCQlhZGQJcjAsIHI0LCAjNDA5NioxMDI0CUAgNE1CIGxhcmdlc3Qga2VybmVsIHNpemUKKwkJY21wCXIwLCByNQorCQlibHMJd29udF9vdmVyd3JpdGUKKworCQltb3YJcjUsIHIyCQkJQCBkZWNvbXByZXNzIGFmdGVyIG1hbGxvYyBzcGFjZQorCQltb3YJcjAsIHI1CisJCW1vdglyMywgcjcKKwkJYmwJZGVjb21wcmVzc19rZXJuZWwKKworCQlhZGQJcjAsIHIwLCAjMTI3CisJCWJpYwlyMCwgcjAsICMxMjcJCUAgYWxpZ24gdGhlIGtlcm5lbCBsZW5ndGgKKy8qCisgKiByMCAgICAgPSBkZWNvbXByZXNzZWQga2VybmVsIGxlbmd0aAorICogcjEtcjMgID0gdW51c2VkCisgKiByNCAgICAgPSBrZXJuZWwgZXhlY3V0aW9uIGFkZHJlc3MKKyAqIHI1ICAgICA9IGRlY29tcHJlc3NlZCBrZXJuZWwgc3RhcnQKKyAqIHI2ICAgICA9IHByb2Nlc3NvciBJRAorICogcjcgICAgID0gYXJjaGl0ZWN0dXJlIElECisgKiByOC1yMTQgPSB1bnVzZWQKKyAqLworCQlhZGQJcjEsIHI1LCByMAkJQCBlbmQgb2YgZGVjb21wcmVzc2VkIGtlcm5lbAorCQlhZHIJcjIsIHJlbG9jX3N0YXJ0CisJCWxkcglyMywgTEMxCisJCWFkZAlyMywgcjIsIHIzCisxOgkJbGRtaWEJcjIhLCB7cjggLSByMTN9CQlAIGNvcHkgcmVsb2NhdGlvbiBjb2RlCisJCXN0bWlhCXIxISwge3I4IC0gcjEzfQorCQlsZG1pYQlyMiEsIHtyOCAtIHIxM30KKwkJc3RtaWEJcjEhLCB7cjggLSByMTN9CisJCWNtcAlyMiwgcjMKKwkJYmxvCTFiCisKKwkJYmwJY2FjaGVfY2xlYW5fZmx1c2gKKwkJYWRkCXBjLCByNSwgcjAJCUAgY2FsbCByZWxvY2F0aW9uIGNvZGUKKworLyoKKyAqIFdlJ3JlIG5vdCBpbiBkYW5nZXIgb2Ygb3ZlcndyaXRpbmcgb3Vyc2VsdmVzLiAgRG8gdGhpcyB0aGUgc2ltcGxlIHdheS4KKyAqCisgKiByNCAgICAgPSBrZXJuZWwgZXhlY3V0aW9uIGFkZHJlc3MKKyAqIHI3ICAgICA9IGFyY2hpdGVjdHVyZSBJRAorICovCit3b250X292ZXJ3cml0ZToJbW92CXIwLCByNAorCQltb3YJcjMsIHI3CisJCWJsCWRlY29tcHJlc3Nfa2VybmVsCisJCWIJY2FsbF9rZXJuZWwKKworCQkudHlwZQlMQzAsICNvYmplY3QKK0xDMDoJCS53b3JkCUxDMAkJCUAgcjEKKwkJLndvcmQJX19ic3Nfc3RhcnQJCUAgcjIKKwkJLndvcmQJX2VuZAkJCUAgcjMKKwkJLndvcmQJenJlbGFkZHIJCUAgcjQKKwkJLndvcmQJX3N0YXJ0CQkJQCByNQorCQkud29yZAlfZ290X3N0YXJ0CQlAIHI2CisJCS53b3JkCV9nb3RfZW5kCQlAIGlwCisJCS53b3JkCXVzZXJfc3RhY2srNDA5NgkJQCBzcAorTEMxOgkJLndvcmQJcmVsb2NfZW5kIC0gcmVsb2Nfc3RhcnQKKwkJLnNpemUJTEMwLCAuIC0gTEMwCisKKyNpZmRlZiBDT05GSUdfQVJDSF9SUEMKKwkJLmdsb2JsCXBhcmFtcworcGFyYW1zOgkJbGRyCXIwLCA9cGFyYW1zX3BoeXMKKwkJbW92CXBjLCBscgorCQkubHRvcmcKKwkJLmFsaWduCisjZW5kaWYKKworLyoKKyAqIFR1cm4gb24gdGhlIGNhY2hlLiAgV2UgbmVlZCB0byBzZXR1cCBzb21lIHBhZ2UgdGFibGVzIHNvIHRoYXQgd2UKKyAqIGNhbiBoYXZlIGJvdGggdGhlIEkgYW5kIEQgY2FjaGVzIG9uLgorICoKKyAqIFdlIHBsYWNlIHRoZSBwYWdlIHRhYmxlcyAxNmsgZG93biBmcm9tIHRoZSBrZXJuZWwgZXhlY3V0aW9uIGFkZHJlc3MsCisgKiBhbmQgd2UgaG9wZSB0aGF0IG5vdGhpbmcgZWxzZSBpcyB1c2luZyBpdC4gIElmIHdlJ3JlIHVzaW5nIGl0LCB3ZQorICogd2lsbCBnbyBwb3AhCisgKgorICogT24gZW50cnksCisgKiAgcjQgPSBrZXJuZWwgZXhlY3V0aW9uIGFkZHJlc3MKKyAqICByNiA9IHByb2Nlc3NvciBJRAorICogIHI3ID0gYXJjaGl0ZWN0dXJlIG51bWJlcgorICogIHI4ID0gcnVuLXRpbWUgYWRkcmVzcyBvZiAic3RhcnQiCisgKiBPbiBleGl0LAorICogIHIxLCByMiwgcjMsIHI4LCByOSwgcjEyIGNvcnJ1cHRlZAorICogVGhpcyByb3V0aW5lIG11c3QgcHJlc2VydmU6CisgKiAgcjQsIHI1LCByNiwgcjcKKyAqLworCQkuYWxpZ24JNQorY2FjaGVfb246CW1vdglyMywgIzgJCQlAIGNhY2hlX29uIGZ1bmN0aW9uCisJCWIJY2FsbF9jYWNoZV9mbgorCitfX3NldHVwX21tdToJc3ViCXIzLCByNCwgIzE2Mzg0CQlAIFBhZ2UgZGlyZWN0b3J5IHNpemUKKwkJYmljCXIzLCByMywgIzB4ZmYJCUAgQWxpZ24gdGhlIHBvaW50ZXIKKwkJYmljCXIzLCByMywgIzB4M2YwMAorLyoKKyAqIEluaXRpYWxpc2UgdGhlIHBhZ2UgdGFibGVzLCB0dXJuaW5nIG9uIHRoZSBjYWNoZWFibGUgYW5kIGJ1ZmZlcmFibGUKKyAqIGJpdHMgZm9yIHRoZSBSQU0gYXJlYSBvbmx5LgorICovCisJCW1vdglyMCwgcjMKKwkJbW92CXI4LCByMCwgbHNyICMxOAorCQltb3YJcjgsIHI4LCBsc2wgIzE4CQlAIHN0YXJ0IG9mIFJBTQorCQlhZGQJcjksIHI4LCAjMHgxMDAwMDAwMAlAIGEgcmVhc29uYWJsZSBSQU0gc2l6ZQorCQltb3YJcjEsICMweDEyCisJCW9ycglyMSwgcjEsICMzIDw8IDEwCisJCWFkZAlyMiwgcjMsICMxNjM4NAorMToJCWNtcAlyMSwgcjgJCQlAIGlmIHZpcnQgPiBzdGFydCBvZiBSQU0KKwkJb3JyaHMJcjEsIHIxLCAjMHgwYwkJQCBzZXQgY2FjaGVhYmxlLCBidWZmZXJhYmxlCisJCWNtcAlyMSwgcjkJCQlAIGlmIHZpcnQgPiBlbmQgb2YgUkFNCisJCWJpY2hzCXIxLCByMSwgIzB4MGMJCUAgY2xlYXIgY2FjaGVhYmxlLCBidWZmZXJhYmxlCisJCXN0cglyMSwgW3IwXSwgIzQJCUAgMToxIG1hcHBpbmcKKwkJYWRkCXIxLCByMSwgIzEwNDg1NzYKKwkJdGVxCXIwLCByMgorCQlibmUJMWIKKy8qCisgKiBJZiBldmVyIHdlIGFyZSBydW5uaW5nIGZyb20gRmxhc2gsIHRoZW4gd2Ugc3VyZWx5IHdhbnQgdGhlIGNhY2hlCisgKiB0byBiZSBlbmFibGVkIGFsc28gZm9yIG91ciBleGVjdXRpb24gaW5zdGFuY2UuLi4gIFdlIG1hcCAyTUIgb2YgaXQKKyAqIHNvIHRoZXJlIGlzIG5vIG1hcCBvdmVybGFwIHByb2JsZW0gZm9yIHVwIHRvIDEgTUIgY29tcHJlc3NlZCBrZXJuZWwuCisgKiBJZiB0aGUgZXhlY3V0aW9uIGlzIGluIFJBTSB0aGVuIHdlIHdvdWxkIG9ubHkgYmUgZHVwbGljYXRpbmcgdGhlIGFib3ZlLgorICovCisJCW1vdglyMSwgIzB4MWUKKwkJb3JyCXIxLCByMSwgIzMgPDwgMTAKKwkJbW92CXIyLCBwYywgbHNyICMyMAorCQlvcnIJcjEsIHIxLCByMiwgbHNsICMyMAorCQlhZGQJcjAsIHIzLCByMiwgbHNsICMyCisJCXN0cglyMSwgW3IwXSwgIzQKKwkJYWRkCXIxLCByMSwgIzEwNDg1NzYKKwkJc3RyCXIxLCBbcjBdCisJCW1vdglwYywgbHIKKworX19hcm12NF9jYWNoZV9vbjoKKwkJbW92CXIxMiwgbHIKKwkJYmwJX19zZXR1cF9tbXUKKwkJbW92CXIwLCAjMAorCQltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAlAIGRyYWluIHdyaXRlIGJ1ZmZlcgorCQltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCUAgZmx1c2ggSSxEIFRMQnMKKwkJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAlAIHJlYWQgY29udHJvbCByZWcKKwkJb3JyCXIwLCByMCwgIzB4NTAwMAkJQCBJLWNhY2hlIGVuYWJsZSwgUlIgY2FjaGUgcmVwbGFjZW1lbnQKKwkJb3JyCXIwLCByMCwgIzB4MDAzMAorCQlibAlfX2NvbW1vbl9jYWNoZV9vbgorCQltb3YJcjAsICMwCisJCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJQCBmbHVzaCBJLEQgVExCcworCQltb3YJcGMsIHIxMgorCitfX2FybTZfY2FjaGVfb246CisJCW1vdglyMTIsIGxyCisJCWJsCV9fc2V0dXBfbW11CisJCW1vdglyMCwgIzAKKwkJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgMAlAIGludmFsaWRhdGUgd2hvbGUgY2FjaGUgdjMKKwkJbWNyCXAxNSwgMCwgcjAsIGM1LCBjMCwgMAlAIGludmFsaWRhdGUgd2hvbGUgVExCIHYzCisJCW1vdglyMCwgIzB4MzAKKwkJYmwJX19jb21tb25fY2FjaGVfb24KKwkJbW92CXIwLCAjMAorCQltY3IJcDE1LCAwLCByMCwgYzUsIGMwLCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBUTEIgdjMKKwkJbW92CXBjLCByMTIKKworX19jb21tb25fY2FjaGVfb246CisjaWZuZGVmIERFQlVHCisJCW9ycglyMCwgcjAsICMweDAwMGQJCUAgV3JpdGUgYnVmZmVyLCBtbXUKKyNlbmRpZgorCQltb3YJcjEsICMtMQorCQltY3IJcDE1LCAwLCByMywgYzIsIGMwLCAwCUAgbG9hZCBwYWdlIHRhYmxlIHBvaW50ZXIKKwkJbWNyCXAxNSwgMCwgcjEsIGMzLCBjMCwgMAlAIGxvYWQgZG9tYWluIGFjY2VzcyBjb250cm9sCisJCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJQCBsb2FkIGNvbnRyb2wgcmVnaXN0ZXIKKwkJbW92CXBjLCBscgorCisvKgorICogQWxsIGNvZGUgZm9sbG93aW5nIHRoaXMgbGluZSBpcyByZWxvY2F0YWJsZS4gIEl0IGlzIHJlbG9jYXRlZCBieQorICogdGhlIGFib3ZlIGNvZGUgdG8gdGhlIGVuZCBvZiB0aGUgZGVjb21wcmVzc2VkIGtlcm5lbCBpbWFnZSBhbmQKKyAqIGV4ZWN1dGVkIHRoZXJlLiAgRHVyaW5nIHRoaXMgdGltZSwgd2UgaGF2ZSBubyBzdGFja3MuCisgKgorICogcjAgICAgID0gZGVjb21wcmVzc2VkIGtlcm5lbCBsZW5ndGgKKyAqIHIxLXIzICA9IHVudXNlZAorICogcjQgICAgID0ga2VybmVsIGV4ZWN1dGlvbiBhZGRyZXNzCisgKiByNSAgICAgPSBkZWNvbXByZXNzZWQga2VybmVsIHN0YXJ0CisgKiByNiAgICAgPSBwcm9jZXNzb3IgSUQKKyAqIHI3ICAgICA9IGFyY2hpdGVjdHVyZSBJRAorICogcjgtcjE0ID0gdW51c2VkCisgKi8KKwkJLmFsaWduCTUKK3JlbG9jX3N0YXJ0OglhZGQJcjgsIHI1LCByMAorCQlkZWJ1Z19yZWxvY19zdGFydAorCQltb3YJcjEsIHI0CisxOgorCQkucmVwdAk0CisJCWxkbWlhCXI1ISwge3IwLCByMiwgcjMsIHI5IC0gcjEzfQlAIHJlbG9jYXRlIGtlcm5lbAorCQlzdG1pYQlyMSEsIHtyMCwgcjIsIHIzLCByOSAtIHIxM30KKwkJLmVuZHIKKworCQljbXAJcjUsIHI4CisJCWJsbwkxYgorCQlkZWJ1Z19yZWxvY19lbmQKKworY2FsbF9rZXJuZWw6CWJsCWNhY2hlX2NsZWFuX2ZsdXNoCisJCWJsCWNhY2hlX29mZgorCQltb3YJcjAsICMwCisJCW1vdglyMSwgcjcJCQlAIHJlc3RvcmUgYXJjaGl0ZWN0dXJlIG51bWJlcgorCQltb3YJcGMsIHI0CQkJQCBjYWxsIGtlcm5lbAorCisvKgorICogSGVyZSBmb2xsb3cgdGhlIHJlbG9jYXRhYmxlIGNhY2hlIHN1cHBvcnQgZnVuY3Rpb25zIGZvciB0aGUKKyAqIHZhcmlvdXMgcHJvY2Vzc29ycy4gIFRoaXMgaXMgYSBnZW5lcmljIGhvb2sgZm9yIGxvY2F0aW5nIGFuCisgKiBlbnRyeSBhbmQganVtcGluZyB0byBhbiBpbnN0cnVjdGlvbiBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldAorICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLiAgUGxlYXNlIG5vdGUgdGhpcyBpcyBhbGwgcG9zaXRpb24KKyAqIGluZGVwZW5kZW50IGNvZGUuCisgKgorICogIHIxICA9IGNvcnJ1cHRlZAorICogIHIyICA9IGNvcnJ1cHRlZAorICogIHIzICA9IGJsb2NrIG9mZnNldAorICogIHI2ICA9IGNvcnJ1cHRlZAorICogIHIxMiA9IGNvcnJ1cHRlZAorICovCisKK2NhbGxfY2FjaGVfZm46CWFkcglyMTIsIHByb2NfdHlwZXMKKwkJbXJjCXAxNSwgMCwgcjYsIGMwLCBjMAlAIGdldCBwcm9jZXNzb3IgSUQKKzE6CQlsZHIJcjEsIFtyMTIsICMwXQkJQCBnZXQgdmFsdWUKKwkJbGRyCXIyLCBbcjEyLCAjNF0JCUAgZ2V0IG1hc2sKKwkJZW9yCXIxLCByMSwgcjYJCUAgKHJlYWwgXiBtYXRjaCkKKwkJdHN0CXIxLCByMgkJCUAgICAgICAgJiBtYXNrCisJCWFkZGVxCXBjLCByMTIsIHIzCQlAIGNhbGwgY2FjaGUgZnVuY3Rpb24KKwkJYWRkCXIxMiwgcjEyLCAjNCo1CisJCWIJMWIKKworLyoKKyAqIFRhYmxlIGZvciBjYWNoZSBvcGVyYXRpb25zLiAgVGhpcyBpcyBiYXNpY2FsbHk6CisgKiAgIC0gQ1BVIElEIG1hdGNoCisgKiAgIC0gQ1BVIElEIG1hc2sKKyAqICAgLSAnY2FjaGUgb24nIG1ldGhvZCBpbnN0cnVjdGlvbgorICogICAtICdjYWNoZSBvZmYnIG1ldGhvZCBpbnN0cnVjdGlvbgorICogICAtICdjYWNoZSBmbHVzaCcgbWV0aG9kIGluc3RydWN0aW9uCisgKgorICogV2UgbWF0Y2ggYW4gZW50cnkgdXNpbmc6ICgocmVhbF9pZCBeIG1hdGNoKSAmIG1hc2spID09IDAKKyAqCisgKiBXcml0ZXRocm91Z2ggY2FjaGVzIGdlbmVyYWxseSBvbmx5IG5lZWQgJ29uJyBhbmQgJ29mZicKKyAqIG1ldGhvZHMuICBXcml0ZWJhY2sgY2FjaGVzIF9tdXN0XyBoYXZlIHRoZSBmbHVzaCBtZXRob2QKKyAqIGRlZmluZWQuCisgKi8KKwkJLnR5cGUJcHJvY190eXBlcywjb2JqZWN0Citwcm9jX3R5cGVzOgorCQkud29yZAkweDQxNTYwNjAwCQlAIEFSTTYvNjEwCisJCS53b3JkCTB4ZmZmZmZmZTAKKwkJYglfX2FybTZfY2FjaGVfb2ZmCUAgd29ya3MsIGJ1dCBzbG93CisJCWIJX19hcm02X2NhY2hlX29mZgorCQltb3YJcGMsIGxyCitACQliCV9fYXJtNl9jYWNoZV9vbgkJQCB1bnRlc3RlZAorQAkJYglfX2FybTZfY2FjaGVfb2ZmCitACQliCV9fYXJtdjNfY2FjaGVfZmx1c2gKKworCQkud29yZAkweDAwMDAwMDAwCQlAIG9sZCBBUk0gSUQKKwkJLndvcmQJMHgwMDAwZjAwMAorCQltb3YJcGMsIGxyCisJCW1vdglwYywgbHIKKwkJbW92CXBjLCBscgorCisJCS53b3JkCTB4NDEwMDcwMDAJCUAgQVJNNy83MTAKKwkJLndvcmQJMHhmZmY4ZmUwMAorCQliCV9fYXJtN19jYWNoZV9vZmYKKwkJYglfX2FybTdfY2FjaGVfb2ZmCisJCW1vdglwYywgbHIKKworCQkud29yZAkweDQxODA3MjAwCQlAIEFSTTcyMFQgKHdyaXRldGhyb3VnaCkKKwkJLndvcmQJMHhmZmZmZmYwMAorCQliCV9fYXJtdjRfY2FjaGVfb24KKwkJYglfX2FybXY0X2NhY2hlX29mZgorCQltb3YJcGMsIGxyCisKKwkJLndvcmQJMHgwMDAwNzAwMAkJQCBBUk03IElEcworCQkud29yZAkweDAwMDBmMDAwCisJCW1vdglwYywgbHIKKwkJbW92CXBjLCBscgorCQltb3YJcGMsIGxyCisKKwkJQCBFdmVyeXRoaW5nIGZyb20gaGVyZSBvbiB3aWxsIGJlIHRoZSBuZXcgSUQgc3lzdGVtLgorCisJCS53b3JkCTB4NDQwMWExMDAJCUAgc2ExMTAgLyBzYTExMDAKKwkJLndvcmQJMHhmZmZmZmZlMAorCQliCV9fYXJtdjRfY2FjaGVfb24KKwkJYglfX2FybXY0X2NhY2hlX29mZgorCQliCV9fYXJtdjRfY2FjaGVfZmx1c2gKKworCQkud29yZAkweDY5MDFiMTEwCQlAIHNhMTExMAorCQkud29yZAkweGZmZmZmZmYwCisJCWIJX19hcm12NF9jYWNoZV9vbgorCQliCV9fYXJtdjRfY2FjaGVfb2ZmCisJCWIJX19hcm12NF9jYWNoZV9mbHVzaAorCisJCUAgVGhlc2UgbWF0Y2ggb24gdGhlIGFyY2hpdGVjdHVyZSBJRAorCisJCS53b3JkCTB4MDAwMjAwMDAJCUAgQVJNdjRUCisJCS53b3JkCTB4MDAwZjAwMDAKKwkJYglfX2FybXY0X2NhY2hlX29uCisJCWIJX19hcm12NF9jYWNoZV9vZmYKKwkJYglfX2FybXY0X2NhY2hlX2ZsdXNoCisKKwkJLndvcmQJMHgwMDA1MDAwMAkJQCBBUk12NVRFCisJCS53b3JkCTB4MDAwZjAwMDAKKwkJYglfX2FybXY0X2NhY2hlX29uCisJCWIJX19hcm12NF9jYWNoZV9vZmYKKwkJYglfX2FybXY0X2NhY2hlX2ZsdXNoCisKKwkJLndvcmQJMHgwMDA2MDAwMAkJQCBBUk12NVRFSgorCQkud29yZAkweDAwMGYwMDAwCisJCWIJX19hcm12NF9jYWNoZV9vbgorCQliCV9fYXJtdjRfY2FjaGVfb2ZmCisJCWIJX19hcm12NF9jYWNoZV9mbHVzaAorCisJCS53b3JkCTB4MDAwNzAwMDAJCUAgQVJNdjYKKwkJLndvcmQJMHgwMDBmMDAwMAorCQliCV9fYXJtdjRfY2FjaGVfb24KKwkJYglfX2FybXY0X2NhY2hlX29mZgorCQliCV9fYXJtdjZfY2FjaGVfZmx1c2gKKworCQkud29yZAkwCQkJQCB1bnJlY29nbmlzZWQgdHlwZQorCQkud29yZAkwCisJCW1vdglwYywgbHIKKwkJbW92CXBjLCBscgorCQltb3YJcGMsIGxyCisKKwkJLnNpemUJcHJvY190eXBlcywgLiAtIHByb2NfdHlwZXMKKworLyoKKyAqIFR1cm4gb2ZmIHRoZSBDYWNoZSBhbmQgTU1VLiAgQVJNdjMgZG9lcyBub3Qgc3VwcG9ydAorICogcmVhZGluZyB0aGUgY29udHJvbCByZWdpc3RlciwgYnV0IEFSTXY0IGRvZXMuCisgKgorICogT24gZW50cnksICByNiA9IHByb2Nlc3NvciBJRAorICogT24gZXhpdCwgICByMCwgcjEsIHIyLCByMywgcjEyIGNvcnJ1cHRlZAorICogVGhpcyByb3V0aW5lIG11c3QgcHJlc2VydmU6IHI0LCByNiwgcjcKKyAqLworCQkuYWxpZ24JNQorY2FjaGVfb2ZmOgltb3YJcjMsICMxMgkJCUAgY2FjaGVfb2ZmIGZ1bmN0aW9uCisJCWIJY2FsbF9jYWNoZV9mbgorCitfX2FybXY0X2NhY2hlX29mZjoKKwkJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMAorCQliaWMJcjAsIHIwLCAjMHgwMDBkCisJCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAJQCB0dXJuIE1NVSBhbmQgY2FjaGUgb2ZmCisJCW1vdglyMCwgIzAKKwkJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNwlAIGludmFsaWRhdGUgd2hvbGUgY2FjaGUgdjQKKwkJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNwlAIGludmFsaWRhdGUgd2hvbGUgVExCIHY0CisJCW1vdglwYywgbHIKKworX19hcm02X2NhY2hlX29mZjoKKwkJbW92CXIwLCAjMHgwMDAwMDAzMAkJQCBBUk02IGNvbnRyb2wgcmVnLgorCQliCV9fYXJtdjNfY2FjaGVfb2ZmCisKK19fYXJtN19jYWNoZV9vZmY6CisJCW1vdglyMCwgIzB4MDAwMDAwNzAJCUAgQVJNNyBjb250cm9sIHJlZy4KKwkJYglfX2FybXYzX2NhY2hlX29mZgorCitfX2FybXYzX2NhY2hlX29mZjoKKwkJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAlAIHR1cm4gTU1VIGFuZCBjYWNoZSBvZmYKKwkJbW92CXIwLCAjMAorCQltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBjYWNoZSB2MworCQltY3IJcDE1LCAwLCByMCwgYzUsIGMwLCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBUTEIgdjMKKwkJbW92CXBjLCBscgorCisvKgorICogQ2xlYW4gYW5kIGZsdXNoIHRoZSBjYWNoZSB0byBtYWludGFpbiBjb25zaXN0ZW5jeS4KKyAqCisgKiBPbiBlbnRyeSwKKyAqICByNiA9IHByb2Nlc3NvciBJRAorICogT24gZXhpdCwKKyAqICByMSwgcjIsIHIzLCByMTEsIHIxMiBjb3JydXB0ZWQKKyAqIFRoaXMgcm91dGluZSBtdXN0IHByZXNlcnZlOgorICogIHIwLCByNCwgcjUsIHI2LCByNworICovCisJCS5hbGlnbgk1CitjYWNoZV9jbGVhbl9mbHVzaDoKKwkJbW92CXIzLCAjMTYKKwkJYgljYWxsX2NhY2hlX2ZuCisKK19fYXJtdjZfY2FjaGVfZmx1c2g6CisJCW1vdglyMSwgIzAKKwkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTQsIDAJQCBjbGVhbitpbnZhbGlkYXRlIEQKKwkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNSwgMAlAIGludmFsaWRhdGUgSStCVEIKKwkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTUsIDAJQCBjbGVhbitpbnZhbGlkYXRlIHVuaWZpZWQKKwkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDQJQCBkcmFpbiBXQgorCQltb3YJcGMsIGxyCisKK19fYXJtdjRfY2FjaGVfZmx1c2g6CisJCW1vdglyMiwgIzY0KjEwMjQJCUAgZGVmYXVsdDogMzJLIGRjYWNoZSBzaXplICgqMikKKwkJbW92CXIxMSwgIzMyCQlAIGRlZmF1bHQ6IDMyIGJ5dGUgbGluZSBzaXplCisJCW1yYwlwMTUsIDAsIHIzLCBjMCwgYzAsIDEJQCByZWFkIGNhY2hlIHR5cGUKKwkJdGVxCXIzLCByNgkJCUAgY2FjaGUgSUQgcmVnaXN0ZXIgcHJlc2VudD8KKwkJYmVxCW5vX2NhY2hlX2lkCisJCW1vdglyMSwgcjMsIGxzciAjMTgKKwkJYW5kCXIxLCByMSwgIzcKKwkJbW92CXIyLCAjMTAyNAorCQltb3YJcjIsIHIyLCBsc2wgcjEJCUAgYmFzZSBkY2FjaGUgc2l6ZSAqMgorCQl0c3QJcjMsICMxIDw8IDE0CQlAIHRlc3QgTSBiaXQKKwkJYWRkbmUJcjIsIHIyLCByMiwgbHNyICMxCUAgKzEvMiBzaXplIGlmIE0gPT0gMQorCQltb3YJcjMsIHIzLCBsc3IgIzEyCisJCWFuZAlyMywgcjMsICMzCisJCW1vdglyMTEsICM4CisJCW1vdglyMTEsIHIxMSwgbHNsIHIzCUAgY2FjaGUgbGluZSBzaXplIGluIGJ5dGVzCitub19jYWNoZV9pZDoKKwkJYmljCXIxLCBwYywgIzYzCQlAIGFsaWduIHRvIGxvbmdlc3QgY2FjaGUgbGluZQorCQlhZGQJcjIsIHIxLCByMgorMToJCWxkcglyMywgW3IxXSwgcjExCQlAIHMvdyBmbHVzaCBEIGNhY2hlCisJCXRlcQlyMSwgcjIKKwkJYm5lCTFiCisKKwkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNSwgMAlAIGZsdXNoIEkgY2FjaGUKKwkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNiwgMAlAIGZsdXNoIEQgY2FjaGUKKwkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDQJQCBkcmFpbiBXQgorCQltb3YJcGMsIGxyCisKK19fYXJtdjNfY2FjaGVfZmx1c2g6CisJCW1vdglyMSwgIzAKKwkJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgMAlAIGludmFsaWRhdGUgd2hvbGUgY2FjaGUgdjMKKwkJbW92CXBjLCBscgorCisvKgorICogVmFyaW91cyBkZWJ1Z2dpbmcgcm91dGluZXMgZm9yIHByaW50aW5nIGhleCBjaGFyYWN0ZXJzIGFuZAorICogbWVtb3J5LCB3aGljaCBhZ2FpbiBtdXN0IGJlIHJlbG9jYXRhYmxlLgorICovCisjaWZkZWYgREVCVUcKKwkJLnR5cGUJcGhleGJ1Ziwjb2JqZWN0CitwaGV4YnVmOgkuc3BhY2UJMTIKKwkJLnNpemUJcGhleGJ1ZiwgLiAtIHBoZXhidWYKKworcGhleDoJCWFkcglyMywgcGhleGJ1ZgorCQltb3YJcjIsICMwCisJCXN0cmIJcjIsIFtyMywgcjFdCisxOgkJc3VicwlyMSwgcjEsICMxCisJCW1vdm1pCXIwLCByMworCQlibWkJcHV0cworCQlhbmQJcjIsIHIwLCAjMTUKKwkJbW92CXIwLCByMCwgbHNyICM0CisJCWNtcAlyMiwgIzEwCisJCWFkZGdlCXIyLCByMiwgIzcKKwkJYWRkCXIyLCByMiwgIycwJworCQlzdHJiCXIyLCBbcjMsIHIxXQorCQliCTFiCisKK3B1dHM6CQlsb2Fkc3AJcjMKKzE6CQlsZHJiCXIyLCBbcjBdLCAjMQorCQl0ZXEJcjIsICMwCisJCW1vdmVxCXBjLCBscgorMjoJCXdyaXRlYglyMgorCQltb3YJcjEsICMweDAwMDIwMDAwCiszOgkJc3VicwlyMSwgcjEsICMxCisJCWJuZQkzYgorCQl0ZXEJcjIsICMnXG4nCisJCW1vdmVxCXIyLCAjJ1xyJworCQliZXEJMmIKKwkJdGVxCXIwLCAjMAorCQlibmUJMWIKKwkJbW92CXBjLCBscgorcHV0YzoKKwkJbW92CXIyLCByMAorCQltb3YJcjAsICMwCisJCWxvYWRzcAlyMworCQliCTJiCisKK21lbWR1bXA6CW1vdglyMTIsIHIwCisJCW1vdglyMTAsIGxyCisJCW1vdglyMTEsICMwCisyOgkJbW92CXIwLCByMTEsIGxzbCAjMgorCQlhZGQJcjAsIHIwLCByMTIKKwkJbW92CXIxLCAjOAorCQlibAlwaGV4CisJCW1vdglyMCwgIyc6JworCQlibAlwdXRjCisxOgkJbW92CXIwLCAjJyAnCisJCWJsCXB1dGMKKwkJbGRyCXIwLCBbcjEyLCByMTEsIGxzbCAjMl0KKwkJbW92CXIxLCAjOAorCQlibAlwaGV4CisJCWFuZAlyMCwgcjExLCAjNworCQl0ZXEJcjAsICMzCisJCW1vdmVxCXIwLCAjJyAnCisJCWJsZXEJcHV0YworCQlhbmQJcjAsIHIxMSwgIzcKKwkJYWRkCXIxMSwgcjExLCAjMQorCQl0ZXEJcjAsICM3CisJCWJuZQkxYgorCQltb3YJcjAsICMnXG4nCisJCWJsCXB1dGMKKwkJY21wCXIxMSwgIzY0CisJCWJsdAkyYgorCQltb3YJcGMsIHIxMAorI2VuZGlmCisKK3JlbG9jX2VuZDoKKworCQkuYWxpZ24KKwkJLnNlY3Rpb24gIi5zdGFjayIsICJ3IgordXNlcl9zdGFjazoJLnNwYWNlCTQwOTYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9pY2UtZGNjLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaWNlLWRjYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDM3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaWNlLWRjYy5TCkBAIC0wLDAgKzEsMTcgQEAKKworCisJLnRleHQKKworCS5nbG9iYWwJaWNlZGNjX3B1dGMKKworaWNlZGNjX3B1dGM6CisJbW92CXIyLCAjMHg0MDAwMDAwCisxOgorCXN1YnMJcjIsIHIyLCAjMQorCW1vdmx0CXBjLCByMTQKKwltcmMJcDE0LCAwLCByMSwgYzAsIGMwLCAwCisJdHN0CXIxLCAjMgorCWJuZQkxYgorCisJbWNyCXAxNCwgMCwgcjAsIGMxLCBjMCwgMAorCW1vdglwYywgcjE0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbGxfY2hhcl93ci5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2xsX2NoYXJfd3IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2JiZDlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2xsX2NoYXJfd3IuUwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvbGxfY2hhcl93ci5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgU3BlZWR1cHMgJiAxYnBwIGNvZGUgKEMpIDE5OTYgUGhpbGlwIEJsdW5kZWxsICYgUnVzc2VsbCBLaW5nLgorICoKKyAqICAxMC0wNC05NglSTUsJVmFyaW91cyBjbGVhbnVwcyAmIHJlZHVjZWQgcmVnaXN0ZXIgdXNhZ2UuCisgKiAgMDgtMDQtOTgJUk1LCVNoaWZ0cyByZS1vcmRlcmVkCisgKi8KKworQCBSZWdzOiBbXSA9IGNvcnJ1cHRpYmxlCitAICAgICAgIHt9ID0gdXNlZAorQCAgICAgICAoKSA9IGRvIG5vdCB1c2UKKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisJLnRleHQKKworTEMwOgkud29yZAlMQzAKKwkud29yZAlieXRlc19wZXJfY2hhcl9oCisJLndvcmQJdmlkZW9fc2l6ZV9yb3cKKwkud29yZAlhY29ybmRhdGFfOHg4CisJLndvcmQJY29uX2NoYXJjb252dGFibGUKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IGNoYXIKKyAqIHIyID0gd2hpdGUKKyAqLworRU5UUlkobGxfd3JpdGVfY2hhcikKKwlzdG1mZAlzcCEsIHtyNCAtIHI3LCBscn0KK0AKK0AgU21hc2hhYmxlIHJlZ3M6IHtyMCAtIHIzfSwgW3I0IC0gcjddLCAocjggLSBmcCksIFtpcF0sIChzcCksIFtscl0sIChwYykKK0AKKwkvKgorCSAqIGNhbGN1bGF0ZSBvZmZzZXQgaW50byBjaGFyYWN0ZXIgdGFibGUKKwkgKi8KKwltb3YJcjEsIHIxLCBsc2wgIzMKKwkvKgorCSAqIGNhbGN1bGF0ZSBvZmZzZXQgcmVxdWlyZWQgZm9yIGVhY2ggcm93LgorCSAqLworCWFkcglpcCwgTEMwCisJbGRtaWEJaXAsIHtyMywgcjQsIHI1LCByNiwgbHJ9CisJc3ViCWlwLCBpcCwgcjMKKwlhZGQJcjYsIHI2LCBpcAorCWFkZAlsciwgbHIsIGlwCisJbGRyCXI0LCBbcjQsIGlwXQorCWxkcglyNSwgW3I1LCBpcF0KKwkvKgorCSAqIEdvIHRvIHJlc29sdXRpb24tZGVwZW5kZW50IHJvdXRpbmUuLi4KKwkgKi8KKwljbXAJcjQsICM0CisJYmx0CUxyb3cxYnBwCisJYWRkCXIwLCByMCwgcjUsIGxzbCAjMwkJQCBNb3ZlIHRvIGJvdHRvbSBvZiBjaGFyYWN0ZXIKKwlvcnIJcjEsIHIxLCAjNworCWxkcmIJcjcsIFtyNiwgcjFdCisJdGVxCXI0LCAjOAorCWJlcQlMcm93OGJwcGxwCitACitAIFNtYXNoYWJsZSByZWdzOiB7cjAgLSByM30sIFtyNF0sIHtyNSAtIHI3fSwgKHI4IC0gZnApLCBbaXBdLCAoc3ApLCB7bHJ9LCAocGMpCitACitMcm93NGJwcGxwOgorCWxkcglyNywgW2xyLCByNywgbHNsICMyXQorCW11bAlyNywgcjIsIHI3CisJc3ViCXIxLCByMSwgIzEJCQlAIGF2b2lkIHVzaW5nIHI3IGRpcmVjdGx5IGFmdGVyCisJc3RyCXI3LCBbcjAsIC1yNV0hCisJbGRyYglyNywgW3I2LCByMV0KKwlsZHIJcjcsIFtsciwgcjcsIGxzbCAjMl0KKwltdWwJcjcsIHIyLCByNworCXRzdAlyMSwgIzcJCQkJQCBhdm9pZCB1c2luZyByNyBkaXJlY3RseSBhZnRlcgorCXN0cglyNywgW3IwLCAtcjVdIQorCXN1Ym5lCXIxLCByMSwgIzEKKwlsZHJuZWIJcjcsIFtyNiwgcjFdCisJYm5lCUxyb3c0YnBwbHAKKwlMT0FEUkVHUyhmZCwgc3AhLCB7cjQgLSByNywgcGN9KQorCitACitAIFNtYXNoYWJsZSByZWdzOiB7cjAgLSByM30sIFtyNF0sIHtyNSAtIHI3fSwgKHI4IC0gZnApLCBbaXBdLCAoc3ApLCB7bHJ9LCAocGMpCitACitMcm93OGJwcGxwOgorCW1vdglpcCwgcjcsIGxzciAjNAorCWxkcglpcCwgW2xyLCBpcCwgbHNsICMyXQorCW11bAlyNCwgcjIsIGlwCisJYW5kCWlwLCByNywgIzE1CQkJQCBhdm9pZCByNAorCWxkcglpcCwgW2xyLCBpcCwgbHNsICMyXQkJQCBhdm9pZCByNAorCW11bAlpcCwgcjIsIGlwCQkJQCBhdm9pZCByNAorCXN1YglyMSwgcjEsICMxCQkJQCBhdm9pZCBpcAorCXN1YglyMCwgcjAsIHI1CQkJQCBhdm9pZCBpcAorCXN0bWlhCXIwLCB7cjQsIGlwfQorCWxkcmIJcjcsIFtyNiwgcjFdCisJbW92CWlwLCByNywgbHNyICM0CisJbGRyCWlwLCBbbHIsIGlwLCBsc2wgIzJdCisJbXVsCXI0LCByMiwgaXAKKwlhbmQJaXAsIHI3LCAjMTUJCQlAIGF2b2lkIHI0CisJbGRyCWlwLCBbbHIsIGlwLCBsc2wgIzJdCQlAIGF2b2lkIHI0CisJbXVsCWlwLCByMiwgaXAJCQlAIGF2b2lkIHI0CisJdHN0CXIxLCAjNwkJCQlAIGF2b2lkIGlwCisJc3ViCXIwLCByMCwgcjUJCQlAIGF2b2lkIGlwCisJc3RtaWEJcjAsIHtyNCwgaXB9CisJc3VibmUJcjEsIHIxLCAjMQorCWxkcm5lYglyNywgW3I2LCByMV0KKwlibmUJTHJvdzhicHBscAorCUxPQURSRUdTKGZkLCBzcCEsIHtyNCAtIHI3LCBwY30pCisKK0AKK0AgU21hc2hhYmxlIHJlZ3M6IHtyMCAtIHIzfSwgW3I0XSwge3I1LCByNn0sIFtyN10sIChyOCAtIGZwKSwgW2lwXSwgKHNwKSwgW2xyXSwgKHBjKQorQAorTHJvdzFicHA6CisJYWRkCXI2LCByNiwgcjEKKwlsZG1pYQlyNiwge3I0LCByN30KKwlzdHJiCXI0LCBbcjBdLCByNQorCW1vdglyNCwgcjQsIGxzciAjOAorCXN0cmIJcjQsIFtyMF0sIHI1CisJbW92CXI0LCByNCwgbHNyICM4CisJc3RyYglyNCwgW3IwXSwgcjUKKwltb3YJcjQsIHI0LCBsc3IgIzgKKwlzdHJiCXI0LCBbcjBdLCByNQorCXN0cmIJcjcsIFtyMF0sIHI1CisJbW92CXI3LCByNywgbHNyICM4CisJc3RyYglyNywgW3IwXSwgcjUKKwltb3YJcjcsIHI3LCBsc3IgIzgKKwlzdHJiCXI3LCBbcjBdLCByNQorCW1vdglyNywgcjcsIGxzciAjOAorCXN0cmIJcjcsIFtyMF0sIHI1CisJTE9BRFJFR1MoZmQsIHNwISwge3I0IC0gcjcsIHBjfSkKKworCS5ic3MKK0VOVFJZKGNvbl9jaGFyY29udnRhYmxlKQorCS5zcGFjZQkxMDI0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQzNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqIG1pc2MuYworICogCisgKiBUaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBzZXZlcmFsIHJvdXRpbmVzIGZyb20gZ3ppcC0xLjAuMyAKKyAqIGFkYXB0ZWQgZm9yIExpbnV4LgorICoKKyAqIG1hbGxvYyBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMgYW5kIE1hdHRoaWFzIFVybGljaHMgMTk5NAorICoKKyAqIE1vZGlmaWVkIGZvciBBUk0gTGludXggYnkgUnVzc2VsbCBLaW5nCisgKgorICogTmljb2xhcyBQaXRyZSA8bmljb0B2aXN1YWlkZS5jb20+ICAxOTk5LzA0LzE0IDoKKyAqICBGb3IgdGhpcyBjb2RlIHRvIHJ1biBkaXJlY3RseSBmcm9tIEZsYXNoLCBhbGwgY29uc3RhbnQgdmFyaWFibGVzIG11c3QKKyAqICBiZSBtYXJrZWQgd2l0aCAnY29uc3QnIGFuZCBhbGwgb3RoZXIgdmFyaWFibGVzIGluaXRpYWxpemVkIGF0IHJ1bi10aW1lIAorICogIG9ubHkuICBUaGlzIHdheSBhbGwgbm9uIGNvbnN0YW50IHZhcmlhYmxlcyB3aWxsIGVuZCB1cCBpbiB0aGUgYnNzIHNlZ21lbnQsCisgKiAgd2hpY2ggc2hvdWxkIHBvaW50IHRvIGFkZHJlc3NlcyBpbiBSQU0gYW5kIGNsZWFyZWQgdG8gMCBvbiBzdGFydC4KKyAqICBUaGlzIGFsbG93cyBmb3IgYSBtdWNoIHF1aWNrZXIgYm9vdCB0aW1lLgorICovCisKK3Vuc2lnbmVkIGludCBfX21hY2hpbmVfYXJjaF90eXBlOworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC91bmNvbXByZXNzLmg+CisKKyNpZmRlZiBTVEFOREFMT05FX0RFQlVHCisjZGVmaW5lIHB1dHN0ciBwcmludGYKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RFQlVHX0lDRURDQworI2RlZmluZSBwdXRzdHIgaWNlZGNjX3B1dHN0cgorI2RlZmluZSBwdXRjIGljZWRjY19wdXRjCisKK2V4dGVybiB2b2lkIGlkZWRjY19wdXRjKGludCBjaCk7CisKK3N0YXRpYyB2b2lkCitpY2VkY2NfcHV0c3RyKGNvbnN0IGNoYXIgKnB0cikKK3sKKwlmb3IgKDsgKnB0ciAhPSAnXDAnOyBwdHIrKykgeworCQlpY2VkY2NfcHV0YygqcHRyKTsKKwl9Cit9CisKKyNlbmRpZgorCisjZGVmaW5lIF9fcHRyX3Qgdm9pZCAqCisKKy8qCisgKiBPcHRpbWlzZWQgQyB2ZXJzaW9uIG9mIG1lbXplcm8gZm9yIHRoZSBBUk0uCisgKi8KK3ZvaWQgX19tZW16ZXJvIChfX3B0cl90IHMsIHNpemVfdCBuKQoreworCXVuaW9uIHsgdm9pZCAqdnA7IHVuc2lnbmVkIGxvbmcgKnVscDsgdW5zaWduZWQgY2hhciAqdWNwOyB9IHU7CisJaW50IGk7CisKKwl1LnZwID0gczsKKworCWZvciAoaSA9IG4gPj4gNTsgaSA+IDA7IGktLSkgeworCQkqdS51bHArKyA9IDA7CisJCSp1LnVscCsrID0gMDsKKwkJKnUudWxwKysgPSAwOworCQkqdS51bHArKyA9IDA7CisJCSp1LnVscCsrID0gMDsKKwkJKnUudWxwKysgPSAwOworCQkqdS51bHArKyA9IDA7CisJCSp1LnVscCsrID0gMDsKKwl9CisKKwlpZiAobiAmIDEgPDwgNCkgeworCQkqdS51bHArKyA9IDA7CisJCSp1LnVscCsrID0gMDsKKwkJKnUudWxwKysgPSAwOworCQkqdS51bHArKyA9IDA7CisJfQorCisJaWYgKG4gJiAxIDw8IDMpIHsKKwkJKnUudWxwKysgPSAwOworCQkqdS51bHArKyA9IDA7CisJfQorCisJaWYgKG4gJiAxIDw8IDIpCisJCSp1LnVscCsrID0gMDsKKworCWlmIChuICYgMSA8PCAxKSB7CisJCSp1LnVjcCsrID0gMDsKKwkJKnUudWNwKysgPSAwOworCX0KKworCWlmIChuICYgMSkKKwkJKnUudWNwKysgPSAwOworfQorCitzdGF0aWMgaW5saW5lIF9fcHRyX3QgbWVtY3B5KF9fcHRyX3QgX19kZXN0LCBfX2NvbnN0IF9fcHRyX3QgX19zcmMsCisJCQkgICAgc2l6ZV90IF9fbikKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgY2hhciAqZCA9ICh1bnNpZ25lZCBjaGFyICopX19kZXN0LCAqcyA9ICh1bnNpZ25lZCBjaGFyICopX19zcmM7CisKKwlmb3IgKGkgPSBfX24gPj4gMzsgaSA+IDA7IGktLSkgeworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJfQorCisJaWYgKF9fbiAmIDEgPDwgMikgeworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwl9CisKKwlpZiAoX19uICYgMSA8PCAxKSB7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwl9CisKKwlpZiAoX19uICYgMSkKKwkJKmQrKyA9ICpzKys7CisKKwlyZXR1cm4gX19kZXN0OworfQorCisvKgorICogZ3ppcCBkZWxhcmF0aW9ucworICovCisjZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjZGVmaW5lIFNUQVRJQyBzdGF0aWMKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCisjZGVmaW5lIFdTSVpFIDB4ODAwMAkJLyogV2luZG93IHNpemUgbXVzdCBiZSBhdCBsZWFzdCAzMmssICovCisJCQkJLyogYW5kIGEgcG93ZXIgb2YgdHdvICovCisKK3N0YXRpYyB1Y2ggKmluYnVmOwkJLyogaW5wdXQgYnVmZmVyICovCitzdGF0aWMgdWNoIHdpbmRvd1tXU0laRV07CS8qIFNsaWRpbmcgd2luZG93IGJ1ZmZlciAqLworCitzdGF0aWMgdW5zaWduZWQgaW5zaXplOwkJLyogdmFsaWQgYnl0ZXMgaW4gaW5idWYgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnB0cjsJCS8qIGluZGV4IG9mIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQgaW4gaW5idWYgKi8KK3N0YXRpYyB1bnNpZ25lZCBvdXRjbnQ7CQkvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCisKKy8qIGd6aXAgZmxhZyBieXRlICovCisjZGVmaW5lIEFTQ0lJX0ZMQUcgICAweDAxIC8qIGJpdCAwIHNldDogZmlsZSBwcm9iYWJseSBhc2NpaSB0ZXh0ICovCisjZGVmaW5lIENPTlRJTlVBVElPTiAweDAyIC8qIGJpdCAxIHNldDogY29udGludWF0aW9uIG9mIG11bHRpLXBhcnQgZ3ppcCBmaWxlICovCisjZGVmaW5lIEVYVFJBX0ZJRUxEICAweDA0IC8qIGJpdCAyIHNldDogZXh0cmEgZmllbGQgcHJlc2VudCAqLworI2RlZmluZSBPUklHX05BTUUgICAgMHgwOCAvKiBiaXQgMyBzZXQ6IG9yaWdpbmFsIGZpbGUgbmFtZSBwcmVzZW50ICovCisjZGVmaW5lIENPTU1FTlQgICAgICAweDEwIC8qIGJpdCA0IHNldDogZmlsZSBjb21tZW50IHByZXNlbnQgKi8KKyNkZWZpbmUgRU5DUllQVEVEICAgIDB4MjAgLyogYml0IDUgc2V0OiBmaWxlIGlzIGVuY3J5cHRlZCAqLworI2RlZmluZSBSRVNFUlZFRCAgICAgMHhDMCAvKiBiaXQgNiw3OiAgIHJlc2VydmVkICovCisKKyNkZWZpbmUgZ2V0X2J5dGUoKSAgKGlucHRyIDwgaW5zaXplID8gaW5idWZbaW5wdHIrK10gOiBmaWxsX2luYnVmKCkpCisKKy8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCisjaWZkZWYgREVCVUcKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSBlcnJvcihtc2cpO30KKyMgIGRlZmluZSBUcmFjZSh4KSBmcHJpbnRmIHgKKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh2ZXJib3NlKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXZ2KHgpIHtpZiAodmVyYm9zZT4xKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHZlcmJvc2UgJiYgKGMpKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWN2KGMseCkge2lmICh2ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KKyNlbHNlCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQorIyAgZGVmaW5lIFRyYWNlKHgpCisjICBkZWZpbmUgVHJhY2V2KHgpCisjICBkZWZpbmUgVHJhY2V2dih4KQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpCisjICBkZWZpbmUgVHJhY2VjdihjLHgpCisjZW5kaWYKKworc3RhdGljIGludCAgZmlsbF9pbmJ1Zih2b2lkKTsKK3N0YXRpYyB2b2lkIGZsdXNoX3dpbmRvdyh2b2lkKTsKK3N0YXRpYyB2b2lkIGVycm9yKGNoYXIgKm0pOworc3RhdGljIHZvaWQgZ3ppcF9tYXJrKHZvaWQgKiopOworc3RhdGljIHZvaWQgZ3ppcF9yZWxlYXNlKHZvaWQgKiopOworCitleHRlcm4gY2hhciBpbnB1dF9kYXRhW107CitleHRlcm4gY2hhciBpbnB1dF9kYXRhX2VuZFtdOworCitzdGF0aWMgdWNoICpvdXRwdXRfZGF0YTsKK3N0YXRpYyB1bGcgb3V0cHV0X3B0cjsKK3N0YXRpYyB1bGcgYnl0ZXNfb3V0OworCitzdGF0aWMgdm9pZCAqbWFsbG9jKGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGZyZWUodm9pZCAqd2hlcmUpOworc3RhdGljIHZvaWQgZXJyb3IoY2hhciAqbSk7CitzdGF0aWMgdm9pZCBnemlwX21hcmsodm9pZCAqKik7CitzdGF0aWMgdm9pZCBnemlwX3JlbGVhc2Uodm9pZCAqKik7CisKK3N0YXRpYyB2b2lkIHB1dHN0cihjb25zdCBjaGFyICopOworCitleHRlcm4gaW50IGVuZDsKK3N0YXRpYyB1bGcgZnJlZV9tZW1fcHRyOworc3RhdGljIHVsZyBmcmVlX21lbV9wdHJfZW5kOworCisjZGVmaW5lIEhFQVBfU0laRSAweDIwMDAKKworI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2xpYi9pbmZsYXRlLmMiCisKKyNpZm5kZWYgU1RBTkRBTE9ORV9ERUJVRworc3RhdGljIHZvaWQgKm1hbGxvYyhpbnQgc2l6ZSkKK3sKKwl2b2lkICpwOworCisJaWYgKHNpemUgPDApIGVycm9yKCJNYWxsb2MgZXJyb3IiKTsKKwlpZiAoZnJlZV9tZW1fcHRyIDw9IDApIGVycm9yKCJNZW1vcnkgZXJyb3IiKTsKKworCWZyZWVfbWVtX3B0ciA9IChmcmVlX21lbV9wdHIgKyAzKSAmIH4zOwkvKiBBbGlnbiAqLworCisJcCA9ICh2b2lkICopZnJlZV9tZW1fcHRyOworCWZyZWVfbWVtX3B0ciArPSBzaXplOworCisJaWYgKGZyZWVfbWVtX3B0ciA+PSBmcmVlX21lbV9wdHJfZW5kKQorCQllcnJvcigiT3V0IG9mIG1lbW9yeSIpOworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBmcmVlKHZvaWQgKndoZXJlKQoreyAvKiBnemlwX21hcmsgJiBnemlwX3JlbGVhc2UgZG8gdGhlIGZyZWUgKi8KK30KKworc3RhdGljIHZvaWQgZ3ppcF9tYXJrKHZvaWQgKipwdHIpCit7CisJYXJjaF9kZWNvbXBfd2RvZygpOworCSpwdHIgPSAodm9pZCAqKSBmcmVlX21lbV9wdHI7Cit9CisKK3N0YXRpYyB2b2lkIGd6aXBfcmVsZWFzZSh2b2lkICoqcHRyKQoreworCWFyY2hfZGVjb21wX3dkb2coKTsKKwlmcmVlX21lbV9wdHIgPSAobG9uZykgKnB0cjsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBnemlwX21hcmsodm9pZCAqKnB0cikKK3sKK30KKworc3RhdGljIHZvaWQgZ3ppcF9yZWxlYXNlKHZvaWQgKipwdHIpCit7Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5CisgKiBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgcmVhbGx5IG5lZWRlZC4KKyAqLworaW50IGZpbGxfaW5idWYodm9pZCkKK3sKKwlpZiAoaW5zaXplICE9IDApCisJCWVycm9yKCJyYW4gb3V0IG9mIGlucHV0IGRhdGEiKTsKKworCWluYnVmID0gaW5wdXRfZGF0YTsKKwlpbnNpemUgPSAmaW5wdXRfZGF0YV9lbmRbMF0gLSAmaW5wdXRfZGF0YVswXTsKKworCWlucHRyID0gMTsKKwlyZXR1cm4gaW5idWZbMF07Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdGUgdGhlIG91dHB1dCB3aW5kb3cgd2luZG93WzAuLm91dGNudC0xXSBhbmQgdXBkYXRlIGNyYyBhbmQgYnl0ZXNfb3V0LgorICogKFVzZWQgZm9yIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBvbmx5LikKKyAqLwordm9pZCBmbHVzaF93aW5kb3codm9pZCkKK3sKKwl1bGcgYyA9IGNyYzsKKwl1bnNpZ25lZCBuOworCXVjaCAqaW4sICpvdXQsIGNoOworCisJaW4gPSB3aW5kb3c7CisJb3V0ID0gJm91dHB1dF9kYXRhW291dHB1dF9wdHJdOworCWZvciAobiA9IDA7IG4gPCBvdXRjbnQ7IG4rKykgeworCQljaCA9ICpvdXQrKyA9ICppbisrOworCQljID0gY3JjXzMyX3RhYlsoKGludCljIF4gY2gpICYgMHhmZl0gXiAoYyA+PiA4KTsKKwl9CisJY3JjID0gYzsKKwlieXRlc19vdXQgKz0gKHVsZylvdXRjbnQ7CisJb3V0cHV0X3B0ciArPSAodWxnKW91dGNudDsKKwlvdXRjbnQgPSAwOworCXB1dHN0cigiLiIpOworfQorCitzdGF0aWMgdm9pZCBlcnJvcihjaGFyICp4KQoreworCXB1dHN0cigiXG5cbiIpOworCXB1dHN0cih4KTsKKwlwdXRzdHIoIlxuXG4gLS0gU3lzdGVtIGhhbHRlZCIpOworCisJd2hpbGUoMSk7CS8qIEhhbHQgKi8KK30KKworI2lmbmRlZiBTVEFOREFMT05FX0RFQlVHCisKK3VsZworZGVjb21wcmVzc19rZXJuZWwodWxnIG91dHB1dF9zdGFydCwgdWxnIGZyZWVfbWVtX3B0cl9wLCB1bGcgZnJlZV9tZW1fcHRyX2VuZF9wLAorCQkgIGludCBhcmNoX2lkKQoreworCW91dHB1dF9kYXRhCQk9ICh1Y2ggKilvdXRwdXRfc3RhcnQ7CS8qIFBvaW50cyB0byBrZXJuZWwgc3RhcnQgKi8KKwlmcmVlX21lbV9wdHIJCT0gZnJlZV9tZW1fcHRyX3A7CisJZnJlZV9tZW1fcHRyX2VuZAk9IGZyZWVfbWVtX3B0cl9lbmRfcDsKKwlfX21hY2hpbmVfYXJjaF90eXBlCT0gYXJjaF9pZDsKKworCWFyY2hfZGVjb21wX3NldHVwKCk7CisKKwltYWtlY3JjKCk7CisJcHV0c3RyKCJVbmNvbXByZXNzaW5nIExpbnV4Li4uIik7CisJZ3VuemlwKCk7CisJcHV0c3RyKCIgZG9uZSwgYm9vdGluZyB0aGUga2VybmVsLlxuIik7CisJcmV0dXJuIG91dHB1dF9wdHI7Cit9CisjZWxzZQorCitjaGFyIG91dHB1dF9idWZmZXJbMTUwMCoxMDI0XTsKKworaW50IG1haW4oKQoreworCW91dHB1dF9kYXRhID0gb3V0cHV0X2J1ZmZlcjsKKworCW1ha2VjcmMoKTsKKwlwdXRzdHIoIlVuY29tcHJlc3NpbmcgTGludXguLi4iKTsKKwlndW56aXAoKTsKKwlwdXRzdHIoImRvbmUuXG4iKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL29mdy1zaGFyay5jIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL29mdy1zaGFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNmY1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvb2Z3LXNoYXJrLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvb2Z3LXNoYXJrLmMKKyAqCisgKiBieSBBbGV4YW5kZXIgU2NodWx6CisgKgorICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZ2V0IHNvbWUgYmFzaWMgaW5mb3JtYXRpb24KKyAqIGFib3V0IHRoZSBtZW1vcnkgbGF5b3V0IG9mIHRoZSBzaGFyayB3ZSBhcmUgcnVubmluZworICogb24uIE1lbW9yeSBpcyB1c3VhbGx5IGRpdmlkZWQgaW4gYmxvY2tzIGEgOCBNQi4KKyAqIEFuZCBib290YXJncyBhcmUgY29waWVkIGZyb20gT3BlbkZpcm13YXJlLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworCithc21saW5rYWdlIHZvaWQKK2NyZWF0ZV9wYXJhbXMgKHVuc2lnbmVkIGxvbmcgKmJ1ZmZlcikKK3sKKwkvKiBJcyB0aGVyZSBhIGJldHRlciBhZGRyZXNzPyBBbHNvIGNoYW5nZSBpbiBtYWNoLXNoYXJrL2NvcmUuYyAqLworCXN0cnVjdCB0YWcgKnRhZyA9IChzdHJ1Y3QgdGFnICopIDB4MDgwMDMwMDA7CisJaW50IGosaSxtLGssbnJfYmFua3Msc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpjOworCisJayA9IDA7CisKKwkvKiBIZWFkIG9mIHRoZSB0YWdsaXN0ICovCisJdGFnLT5oZHIudGFnICA9IEFUQUdfQ09SRTsKKwl0YWctPmhkci5zaXplID0gdGFnX3NpemUodGFnX2NvcmUpOworCXRhZy0+dS5jb3JlLmZsYWdzID0gMTsKKwl0YWctPnUuY29yZS5wYWdlc2l6ZSA9IFBBR0VfU0laRTsKKwl0YWctPnUuY29yZS5yb290ZGV2ID0gMDsKKworCS8qIEJ1aWxkIHVwIG9uZSB0YWdnZWQgYmxvY2sgZm9yIGVhY2ggbWVtb3J5IHJlZ2lvbiAqLworCXNpemU9MDsKKwlucl9iYW5rcz0odW5zaWduZWQgaW50KSBidWZmZXJbMF07CisJZm9yIChqPTA7ajxucl9iYW5rcztqKyspeworCQkvKiBzZWFyY2ggdGhlIGxvd2VzdCBhZGRyZXNzIGFuZCBwdXQgaXQgaW50byB0aGUgbmV4dCBlbnRyeSAgICovCisJCS8qIG5vdCBhIGZhc3Qgc29ydCBhbGdvcml0aG0sIGJ1dCB0aGVyZSBhcmUgYXQgbW9zdCA4IGVudHJpZXMgKi8KKwkJLyogYW5kIHRoaXMgaXMgdXNlZCBvbmx5IG9uY2UgYW55d2F5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQltPTB4ZmZmZmZmZmY7CisJCWZvciAoaT0wO2k8KHVuc2lnbmVkIGludCkgYnVmZmVyWzBdO2krKyl7CisJCQlpZiAoYnVmZmVyWzIqaSsxXTxtKSB7CisJCQkJbT1idWZmZXJbMippKzFdOworCQkJCWs9aTsKKwkJCX0KKwkJfQorCSAgCisJCXRhZyA9IHRhZ19uZXh0KHRhZyk7CisJCXRhZy0+aGRyLnRhZyA9IEFUQUdfTUVNOworCQl0YWctPmhkci5zaXplID0gdGFnX3NpemUodGFnX21lbTMyKTsKKwkJdGFnLT51Lm1lbS5zaXplID0gYnVmZmVyWzIqaysyXTsKKwkJdGFnLT51Lm1lbS5zdGFydCA9IGJ1ZmZlclsyKmsrMV07CisKKwkJc2l6ZSArPSBidWZmZXJbMiprKzJdOworCisJCWJ1ZmZlclsyKmsrMV09MHhmZmZmZmZmZjsgICAgICAgICAgICAgICAgICAgIC8qIG1hcmsgYXMgY29waWVkICovCisJfQorCQorCS8qIFRoZSBjb21tYW5kIGxpbmUgKi8KKwl0YWcgPSB0YWdfbmV4dCh0YWcpOworCXRhZy0+aGRyLnRhZyA9IEFUQUdfQ01ETElORTsKKwkKKwljPSh1bnNpZ25lZCBjaGFyICopKCZidWZmZXJbMzRdKTsKKwlqPTA7CisJd2hpbGUgKCpjKSB0YWctPnUuY21kbGluZS5jbWRsaW5lW2orK109KmMrKzsKKworCXRhZy0+dS5jbWRsaW5lLmNtZGxpbmVbal09MDsKKwl0YWctPmhkci5zaXplID0gKGogKyA3ICsgc2l6ZW9mKHN0cnVjdCB0YWdfaGVhZGVyKSkgPj4gMjsKKworCS8qIEhhcmR3YXJlIHJldmlzaW9uICovCisJdGFnID0gdGFnX25leHQodGFnKTsKKwl0YWctPmhkci50YWcgPSBBVEFHX1JFVklTSU9OOworCXRhZy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfcmV2aXNpb24pOworCXRhZy0+dS5yZXZpc2lvbi5yZXYgPSAoKHVuc2lnbmVkIGNoYXIpIGJ1ZmZlclszM10pLScwJzsKKworCS8qIEVuZCBvZiB0aGUgdGFnbGlzdCAqLworCXRhZyA9IHRhZ19uZXh0KHRhZyk7CisJdGFnLT5oZHIudGFnID0gMDsKKwl0YWctPmhkci5zaXplID0gMDsKK30KKworCit0eXBlZGVmIGludCAoKm9md19oYW5kbGVfdCkodm9pZCAqKTsKKworLyogRXZlcnl0aGluZyBiZWxvdyBpcyBjYWxsZWQgd2l0aCBhIHdyb25nIE1NVSBzZXR0aW5nLgorICogVGhpcyBtZWFuczogbm8gc3RyaW5nIGNvbnN0YW50cywgbm8gaW5pdGlhbGl6YXRpb24gb2YKKyAqIGFycmF5cywgbm8gZ2xvYmFsIHZhcmlhYmxlcyEgVGhpcyBpcyB1Z2x5IGJ1dCBJIGRpZG4ndAorICogd2FudCB0byB3cml0ZSB0aGlzIGluIGFzc2VtYmxlciA6LSkKKyAqLworCitpbnQKK29mX2RlY29kZV9pbnQoY29uc3QgdW5zaWduZWQgY2hhciAqcCkKK3sKKwl1bnNpZ25lZCBpbnQgaSA9ICpwKysgPDwgODsKKwlpID0gKGkgKyAqcCsrKSA8PCA4OworCWkgPSAoaSArICpwKyspIDw8IDg7CisJcmV0dXJuIChpICsgKnApOworfQorICAKK2ludAorT0ZfZmluZGRldmljZShvZndfaGFuZGxlX3Qgb3BlbmZpcm13YXJlLCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGludCBhcmdzWzhdOworCWNoYXIgc2VydmljZVsxMl07CisKKwlzZXJ2aWNlWzBdPSdmJzsKKwlzZXJ2aWNlWzFdPSdpJzsKKwlzZXJ2aWNlWzJdPSduJzsKKwlzZXJ2aWNlWzNdPSdkJzsKKwlzZXJ2aWNlWzRdPSdkJzsKKwlzZXJ2aWNlWzVdPSdlJzsKKwlzZXJ2aWNlWzZdPSd2JzsKKwlzZXJ2aWNlWzddPSdpJzsKKwlzZXJ2aWNlWzhdPSdjJzsKKwlzZXJ2aWNlWzldPSdlJzsKKwlzZXJ2aWNlWzEwXT0nXDAnOworCisJYXJnc1swXT0odW5zaWduZWQgaW50KXNlcnZpY2U7CisJYXJnc1sxXT0xOworCWFyZ3NbMl09MTsKKwlhcmdzWzNdPSh1bnNpZ25lZCBpbnQpbmFtZTsKKworCWlmIChvcGVuZmlybXdhcmUoYXJncykgPT0gLTEpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gYXJnc1s0XTsKK30KKworaW50CitPRl9nZXRwcm9wbGVuKG9md19oYW5kbGVfdCBvcGVuZmlybXdhcmUsIGludCBoYW5kbGUsIGNoYXIgKnByb3ApCit7CisJdW5zaWduZWQgaW50IGFyZ3NbOF07CisJY2hhciBzZXJ2aWNlWzEyXTsKKworCXNlcnZpY2VbMF09J2cnOworCXNlcnZpY2VbMV09J2UnOworCXNlcnZpY2VbMl09J3QnOworCXNlcnZpY2VbM109J3AnOworCXNlcnZpY2VbNF09J3InOworCXNlcnZpY2VbNV09J28nOworCXNlcnZpY2VbNl09J3AnOworCXNlcnZpY2VbN109J2wnOworCXNlcnZpY2VbOF09J2UnOworCXNlcnZpY2VbOV09J24nOworCXNlcnZpY2VbMTBdPSdcMCc7CisKKwlhcmdzWzBdID0gKHVuc2lnbmVkIGludClzZXJ2aWNlOworCWFyZ3NbMV0gPSAyOworCWFyZ3NbMl0gPSAxOworCWFyZ3NbM10gPSAodW5zaWduZWQgaW50KWhhbmRsZTsKKwlhcmdzWzRdID0gKHVuc2lnbmVkIGludClwcm9wOworCisJaWYgKG9wZW5maXJtd2FyZShhcmdzKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBhcmdzWzVdOworfQorICAKK2ludAorT0ZfZ2V0cHJvcChvZndfaGFuZGxlX3Qgb3BlbmZpcm13YXJlLCBpbnQgaGFuZGxlLCBjaGFyICpwcm9wLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJdW5zaWduZWQgaW50IGFyZ3NbOF07CisJY2hhciBzZXJ2aWNlWzhdOworCisJc2VydmljZVswXT0nZyc7CisJc2VydmljZVsxXT0nZSc7CisJc2VydmljZVsyXT0ndCc7CisJc2VydmljZVszXT0ncCc7CisJc2VydmljZVs0XT0ncic7CisJc2VydmljZVs1XT0nbyc7CisJc2VydmljZVs2XT0ncCc7CisJc2VydmljZVs3XT0nXDAnOworCisJYXJnc1swXSA9ICh1bnNpZ25lZCBpbnQpc2VydmljZTsKKwlhcmdzWzFdID0gNDsKKwlhcmdzWzJdID0gMTsKKwlhcmdzWzNdID0gKHVuc2lnbmVkIGludCloYW5kbGU7CisJYXJnc1s0XSA9ICh1bnNpZ25lZCBpbnQpcHJvcDsKKwlhcmdzWzVdID0gKHVuc2lnbmVkIGludClidWY7CisJYXJnc1s2XSA9IGJ1ZmxlbjsKKworCWlmIChvcGVuZmlybXdhcmUoYXJncykgPT0gLTEpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gYXJnc1s3XTsKK30KKyAgCithc21saW5rYWdlIHZvaWQgb2Z3X2luaXQob2Z3X2hhbmRsZV90IG8sIGludCAqbm9tciwgaW50ICpwb2ludGVyKQoreworCWludCBwaGFuZGxlLGksbWVtX2xlbixidWZmZXJbMzJdOworCWNoYXIgdGVtcFsxNV07CisgIAorCXRlbXBbMF09Jy8nOworCXRlbXBbMV09J20nOworCXRlbXBbMl09J2UnOworCXRlbXBbM109J20nOworCXRlbXBbNF09J28nOworCXRlbXBbNV09J3InOworCXRlbXBbNl09J3knOworCXRlbXBbN109J1wwJzsKKworCXBoYW5kbGU9T0ZfZmluZGRldmljZShvLHRlbXApOworCisJdGVtcFswXT0ncic7CisJdGVtcFsxXT0nZSc7CisJdGVtcFsyXT0nZyc7CisJdGVtcFszXT0nXDAnOworCisJbWVtX2xlbiA9IE9GX2dldHByb3BsZW4obyxwaGFuZGxlLCB0ZW1wKTsKKwlPRl9nZXRwcm9wKG8scGhhbmRsZSwgdGVtcCwgYnVmZmVyLCBtZW1fbGVuKTsKKwkqbm9tcj1tZW1fbGVuID4+IDM7CisKKwlmb3IgKGk9MDsgaTw9bWVtX2xlbi80OyBpKyspIHBvaW50ZXJbaV09b2ZfZGVjb2RlX2ludCgoY29uc3QgdW5zaWduZWQgY2hhciAqKSZidWZmZXJbaV0pOworCisJdGVtcFswXT0nLyc7CisJdGVtcFsxXT0nYyc7CisJdGVtcFsyXT0naCc7CisJdGVtcFszXT0nbyc7CisJdGVtcFs0XT0ncyc7CisJdGVtcFs1XT0nZSc7CisJdGVtcFs2XT0nbic7CisJdGVtcFs3XT0nXDAnOworCisJcGhhbmRsZT1PRl9maW5kZGV2aWNlKG8sdGVtcCk7CisKKwl0ZW1wWzBdPSdiJzsKKwl0ZW1wWzFdPSdvJzsKKwl0ZW1wWzJdPSdvJzsKKwl0ZW1wWzNdPSd0JzsKKwl0ZW1wWzRdPSdhJzsKKwl0ZW1wWzVdPSdyJzsKKwl0ZW1wWzZdPSdnJzsKKwl0ZW1wWzddPSdzJzsKKwl0ZW1wWzhdPSdcMCc7CisKKwltZW1fbGVuID0gT0ZfZ2V0cHJvcGxlbihvLHBoYW5kbGUsIHRlbXApOworCU9GX2dldHByb3AobyxwaGFuZGxlLCB0ZW1wLCBidWZmZXIsIG1lbV9sZW4pOworCWlmIChtZW1fbGVuID4gMTI4KSBtZW1fbGVuPTEyODsKKwlmb3IgKGk9MDsgaTw9bWVtX2xlbi80OyBpKyspIHBvaW50ZXJbaSszM109YnVmZmVyW2ldOworCXBvaW50ZXJbaSszM109MDsKKworCXRlbXBbMF09Jy8nOworCXRlbXBbMV09J1wwJzsKKwlwaGFuZGxlPU9GX2ZpbmRkZXZpY2Uobyx0ZW1wKTsKKwl0ZW1wWzBdPSdiJzsKKwl0ZW1wWzFdPSdhJzsKKwl0ZW1wWzJdPSduJzsKKwl0ZW1wWzNdPSduJzsKKwl0ZW1wWzRdPSdlJzsKKwl0ZW1wWzVdPSdyJzsKKwl0ZW1wWzZdPSctJzsKKwl0ZW1wWzddPSduJzsKKwl0ZW1wWzhdPSdhJzsKKwl0ZW1wWzldPSdtJzsKKwl0ZW1wWzEwXT0nZSc7CisJdGVtcFsxMV09J1wwJzsKKwltZW1fbGVuID0gT0ZfZ2V0cHJvcGxlbihvLHBoYW5kbGUsIHRlbXApOworCU9GX2dldHByb3AobyxwaGFuZGxlLCB0ZW1wLCBidWZmZXIsIG1lbV9sZW4pOworCSh1bnNpZ25lZCBjaGFyKSBwb2ludGVyWzMyXSA9ICgodW5zaWduZWQgY2hhciAqKSBidWZmZXIpW21lbV9sZW4tMl07Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvcGlnZ3kuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9waWdneS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Yzk1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvcGlnZ3kuUwpAQCAtMCwwICsxLDYgQEAKKwkuc2VjdGlvbiAucGlnZ3lkYXRhLCNhbGxvYworCS5nbG9ibAlpbnB1dF9kYXRhCitpbnB1dF9kYXRhOgorCS5pbmNiaW4JImFyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9waWdneS5neiIKKwkuZ2xvYmwJaW5wdXRfZGF0YV9lbmQKK2lucHV0X2RhdGFfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLmluIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDYxNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuaW4KQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuaW4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC4gPSBURVhUX1NUQVJUOworICBfdGV4dCA9IC47CisKKyAgLnRleHQgOiB7CisgICAgX3N0YXJ0ID0gLjsKKyAgICAqKC5zdGFydCkKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdudS53YXJuaW5nKQorICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGEuKikKKyAgICAqKC5nbHVlXzcpCisgICAgKiguZ2x1ZV83dCkKKyAgICAqKC5waWdneWRhdGEpCisgICAgLiA9IEFMSUdOKDQpOworICB9CisKKyAgX2V0ZXh0ID0gLjsKKworICBfZ290X3N0YXJ0ID0gLjsKKyAgLmdvdAkJCTogeyAqKC5nb3QpIH0KKyAgX2dvdF9lbmQgPSAuOworICAuZ290LnBsdAkJOiB7ICooLmdvdC5wbHQpIH0KKyAgLmRhdGEJCQk6IHsgKiguZGF0YSkgfQorICBfZWRhdGEgPSAuOworCisgIC4gPSBCU1NfU1RBUlQ7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcwkJCTogeyAqKC5ic3MpIH0KKyAgX2VuZCA9IC47CisKKyAgLnN0YWNrIChOT0xPQUQpCTogeyAqKC5zdGFjaykgfQorCisgIC5zdGFiIDAJCTogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyIDAJCTogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMAkJOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyIDAJOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAwCQk6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwCTogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50IDAJCTogeyAqKC5jb21tZW50KSB9Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvYXJtL2Jvb3QvaW5zdGFsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzViYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9pbnN0YWxsLnNoCkBAIC0wLDAgKzEsNTIgQEAKKyMhL2Jpbi9zaAorIworIyBhcmNoL2FybS9ib290L2luc3RhbGwuc2gKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTUgYnkgTGludXMgVG9ydmFsZHMKKyMKKyMgQWRhcHRlZCBmcm9tIGNvZGUgaW4gYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYnkgSC4gUGV0ZXIgQW52aW4KKyMgQWRhcHRlZCBmcm9tIGNvZGUgaW4gYXJjaC9pMzg2L2Jvb3QvaW5zdGFsbC5zaCBieSBSdXNzZWxsIEtpbmcKKyMKKyMgIm1ha2UgaW5zdGFsbCIgc2NyaXB0IGZvciBhcm0gYXJjaGl0ZWN0dXJlCisjCisjIEFyZ3VtZW50czoKKyMgICAkMSAtIGtlcm5lbCB2ZXJzaW9uCisjICAgJDIgLSBrZXJuZWwgaW1hZ2UgZmlsZQorIyAgICQzIC0ga2VybmVsIG1hcCBmaWxlCisjICAgJDQgLSBkZWZhdWx0IGluc3RhbGwgcGF0aCAoYmxhbmsgaWYgcm9vdCBkaXJlY3RvcnkpCisjCisKKyMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdAoraWYgWyAteCB+L2Jpbi9pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyB+L2Jpbi9pbnN0YWxsa2VybmVsICIkQCI7IGZpCitpZiBbIC14IC9zYmluL2luc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIC9zYmluL2luc3RhbGxrZXJuZWwgIiRAIjsgZmkKKworaWYgWyAiJChiYXNlbmFtZSAkMikiID0gInpJbWFnZSIgXTsgdGhlbgorIyBDb21wcmVzc2VkIGluc3RhbGwKKyAgZWNobyAiSW5zdGFsbGluZyBjb21wcmVzc2VkIGtlcm5lbCIKKyAgYmFzZT12bWxpbnV6CitlbHNlCisjIE5vcm1hbCBpbnN0YWxsCisgIGVjaG8gIkluc3RhbGxpbmcgbm9ybWFsIGtlcm5lbCIKKyAgYmFzZT12bWxpbnV4CitmaQorCitpZiBbIC1mICQ0LyRiYXNlLSQxIF07IHRoZW4KKyAgbXYgJDQvJGJhc2UtJDEgJDQvJGJhc2UtJDEub2xkCitmaQorY2F0ICQyID4gJDQvJGJhc2UtJDEKKworIyBJbnN0YWxsIHN5c3RlbSBtYXAgZmlsZQoraWYgWyAtZiAkNC9TeXN0ZW0ubWFwLSQxIF07IHRoZW4KKyAgbXYgJDQvU3lzdGVtLm1hcC0kMSAkNC9TeXN0ZW0ubWFwLSQxLm9sZAorZmkKK2NwICQzICQ0L1N5c3RlbS5tYXAtJDEKKworaWYgWyAteCAvc2Jpbi9sb2FkbWFwIF07IHRoZW4KKyAgL3NiaW4vbG9hZG1hcAorZWxzZQorICBlY2hvICJZb3UgaGF2ZSB0byBpbnN0YWxsIGl0IHlvdXJzZWxmIgorZmkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9LY29uZmlnIGIvYXJjaC9hcm0vY29tbW9uL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyYWY2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9LY29uZmlnCkBAIC0wLDAgKzEsMjQgQEAKK2NvbmZpZyBJQ1NUNTI1CisJYm9vbAorCitjb25maWcgSUNTVDMwNworCWJvb2wKKworY29uZmlnIFNBMTExMQorCWJvb2wKKwlzZWxlY3QgRE1BQk9VTkNFCisKK2NvbmZpZyBETUFCT1VOQ0UKKwlib29sCisKK2NvbmZpZyBUSU1FUl9BQ09STgorCWJvb2wKKworY29uZmlnIFNIQVJQX0xPQ09NTworCWJvb2wKKworY29uZmlnIFNIQVJQX1BBUkFNCisJYm9vbAorCitjb25maWcgU0hBUlBfU0NPT1AKKwlib29sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vTWFrZWZpbGUgYi9hcmNoL2FybS9jb21tb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmMjBhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCitvYmoteQkJCQkrPSBydGN0aW1lLm8KK29iai0kKENPTkZJR19BUk1fQU1CQSkJCSs9IGFtYmEubworb2JqLSQoQ09ORklHX0lDU1Q1MjUpCQkrPSBpY3N0NTI1Lm8KK29iai0kKENPTkZJR19JQ1NUMzA3KQkJKz0gaWNzdDMwNy5vCitvYmotJChDT05GSUdfU0ExMTExKQkJKz0gc2ExMTExLm8KK29iai0kKENPTkZJR19QQ0lfSE9TVF9WSUE4MkM1MDUpICs9IHZpYTgyYzUwNS5vCitvYmotJChDT05GSUdfRE1BQk9VTkNFKQkJKz0gZG1hYm91bmNlLm8KK29iai0kKENPTkZJR19USU1FUl9BQ09STikJKz0gdGltZS1hY29ybi5vCitvYmotJChDT05GSUdfU0hBUlBfTE9DT01PKQkrPSBsb2NvbW8ubworb2JqLSQoQ09ORklHX1NIQVJQX1BBUkFNKQkrPSBzaGFycHNsX3BhcmFtLm8KK29iai0kKENPTkZJR19TSEFSUF9TQ09PUCkJKz0gc2Nvb3AubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2FtYmEuYyBiL2FyY2gvYXJtL2NvbW1vbi9hbWJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MDdmOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9hbWJhLmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vY29tbW9uL2FtYmEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjZGVmaW5lIHRvX2FtYmFfZGV2aWNlKGQpCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgYW1iYV9kZXZpY2UsIGRldikKKyNkZWZpbmUgdG9fYW1iYV9kcml2ZXIoZCkJY29udGFpbmVyX29mKGQsIHN0cnVjdCBhbWJhX2RyaXZlciwgZHJ2KQorCitzdGF0aWMgc3RydWN0IGFtYmFfaWQgKgorYW1iYV9sb29rdXAoc3RydWN0IGFtYmFfaWQgKnRhYmxlLCBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXdoaWxlICh0YWJsZS0+bWFzaykgeworCQlyZXQgPSAoZGV2LT5wZXJpcGhpZCAmIHRhYmxlLT5tYXNrKSA9PSB0YWJsZS0+aWQ7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJdGFibGUrKzsKKwl9CisKKwlyZXR1cm4gcmV0ID8gdGFibGUgOiBOVUxMOworfQorCitzdGF0aWMgaW50IGFtYmFfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBhbWJhX2RldmljZSAqcGNkZXYgPSB0b19hbWJhX2RldmljZShkZXYpOworCXN0cnVjdCBhbWJhX2RyaXZlciAqcGNkcnYgPSB0b19hbWJhX2RyaXZlcihkcnYpOworCisJcmV0dXJuIGFtYmFfbG9va3VwKHBjZHJ2LT5pZF90YWJsZSwgcGNkZXYpICE9IE5VTEw7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVRworc3RhdGljIGludCBhbWJhX2hvdHBsdWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG5yX2VudiwgY2hhciAqYnVmLCBpbnQgYnVmc3opCit7CisJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisKKwlpZiAobnJfZW52IDwgMikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbnByaW50ZihidWYsIGJ1ZnN6LCAiQU1CQV9JRD0lMDh4IiwgcGNkZXYtPnBlcmlwaGlkKTsKKwkqZW52cCsrID0gYnVmOworCSplbnZwKysgPSBOVUxMOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYW1iYV9ob3RwbHVnIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGFtYmFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYW1iYV9kcml2ZXIgKmRydiA9IHRvX2FtYmFfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnN1c3BlbmQpCisJCXJldCA9IGRydi0+c3VzcGVuZCh0b19hbWJhX2RldmljZShkZXYpLCBzdGF0ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWJhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtYmFfZHJpdmVyICpkcnYgPSB0b19hbWJhX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5yZXN1bWUpCisJCXJldCA9IGRydi0+cmVzdW1lKHRvX2FtYmFfZGV2aWNlKGRldikpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQcmltZWNlbGxzIGFyZSBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBNaWNyb2NvbnRyb2xsZXIgQnVzIEFyY2hpdGVjdHVyZSwKKyAqIHNvIHdlIGNhbGwgdGhlIGJ1cyAiYW1iYSIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgYW1iYV9idXN0eXBlID0geworCS5uYW1lCQk9ICJhbWJhIiwKKwkubWF0Y2gJCT0gYW1iYV9tYXRjaCwKKwkuaG90cGx1Zwk9IGFtYmFfaG90cGx1ZywKKwkuc3VzcGVuZAk9IGFtYmFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFtYmFfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYW1iYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGJ1c19yZWdpc3RlcigmYW1iYV9idXN0eXBlKTsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwoYW1iYV9pbml0KTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGV2aWNlIG1vZGVsIGNvbnZlcnNpb24gdmVuZWVyczsgdGhleSBjb252ZXJ0IHRoZQorICogZGV2aWNlIG1vZGVsIHN0cnVjdHVyZXMgdG8gb3VyIG1vcmUgc3BlY2lmaWMgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIGludCBhbWJhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKnBjZGV2ID0gdG9fYW1iYV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYW1iYV9kcml2ZXIgKnBjZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBhbWJhX2lkICppZDsKKworCWlkID0gYW1iYV9sb29rdXAocGNkcnYtPmlkX3RhYmxlLCBwY2Rldik7CisKKwlyZXR1cm4gcGNkcnYtPnByb2JlKHBjZGV2LCBpZCk7Cit9CisKK3N0YXRpYyBpbnQgYW1iYV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWJhX2RyaXZlciAqZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXJldHVybiBkcnYtPnJlbW92ZSh0b19hbWJhX2RldmljZShkZXYpKTsKK30KKworc3RhdGljIHZvaWQgYW1iYV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtYmFfZHJpdmVyICpkcnYgPSB0b19hbWJhX2RyaXZlcihkZXYtPmRyaXZlcik7CisJZHJ2LT5zaHV0ZG93bih0b19hbWJhX2RldmljZShkZXYpKTsKK30KKworLyoqCisgKglhbWJhX2RyaXZlcl9yZWdpc3RlciAtIHJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlIGRyaXZlcgorICoJQGRydjogYW1iYSBkZXZpY2UgZHJpdmVyIHN0cnVjdHVyZQorICoKKyAqCVJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlIGRyaXZlciB3aXRoIHRoZSBMaW51eCBkZXZpY2UgbW9kZWwKKyAqCWNvcmUuICBJZiBkZXZpY2VzIHByZS1leGlzdCwgdGhlIGRyaXZlcnMgcHJvYmUgZnVuY3Rpb24gd2lsbAorICoJYmUgY2FsbGVkLgorICovCitpbnQgYW1iYV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGFtYmFfZHJpdmVyICpkcnYpCit7CisJZHJ2LT5kcnYuYnVzID0gJmFtYmFfYnVzdHlwZTsKKworI2RlZmluZSBTRVRGTihmbikJaWYgKGRydi0+Zm4pIGRydi0+ZHJ2LmZuID0gYW1iYV8jI2ZuCisJU0VURk4ocHJvYmUpOworCVNFVEZOKHJlbW92ZSk7CisJU0VURk4oc2h1dGRvd24pOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOworfQorCisvKioKKyAqCWFtYmFfZHJpdmVyX3VucmVnaXN0ZXIgLSByZW1vdmUgYW4gQU1CQSBkZXZpY2UgZHJpdmVyCisgKglAZHJ2OiBBTUJBIGRldmljZSBkcml2ZXIgc3RydWN0dXJlIHRvIHJlbW92ZQorICoKKyAqCVVucmVnaXN0ZXIgYW4gQU1CQSBkZXZpY2UgZHJpdmVyIGZyb20gdGhlIExpbnV4IGRldmljZQorICoJbW9kZWwuICBUaGUgZGV2aWNlIG1vZGVsIHdpbGwgY2FsbCB0aGUgZHJpdmVycyByZW1vdmUgZnVuY3Rpb24KKyAqCWZvciBlYWNoIGRldmljZSB0aGUgZGV2aWNlIGRyaXZlciBpcyBjdXJyZW50bHkgaGFuZGxpbmcuCisgKi8KK3ZvaWQgYW1iYV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgYW1iYV9kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcnYpOworfQorCisKK3N0YXRpYyB2b2lkIGFtYmFfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisKKwlpZiAoZC0+cmVzLnBhcmVudCkKKwkJcmVsZWFzZV9yZXNvdXJjZSgmZC0+cmVzKTsKKwlrZnJlZShkKTsKK30KKworI2RlZmluZSBhbWJhX2F0dHIobmFtZSxmbXQsYXJnLi4uKQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiA9IHRvX2FtYmFfZGV2aWNlKF9kZXYpOwkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm10LCBhcmcpOwkJCQlcCit9CQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCisKK2FtYmFfYXR0cihpZCwgIiUwOHhcbiIsIGRldi0+cGVyaXBoaWQpOworYW1iYV9hdHRyKGlycTAsICIldVxuIiwgZGV2LT5pcnFbMF0pOworYW1iYV9hdHRyKGlycTEsICIldVxuIiwgZGV2LT5pcnFbMV0pOworYW1iYV9hdHRyKHJlc291cmNlLCAiXHQlMDhseFx0JTA4bHhcdCUwOGx4XG4iLAorCSAgZGV2LT5yZXMuc3RhcnQsIGRldi0+cmVzLmVuZCwgZGV2LT5yZXMuZmxhZ3MpOworCisvKioKKyAqCWFtYmFfZGV2aWNlX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gQU1CQSBkZXZpY2UKKyAqCUBkZXY6IEFNQkEgZGV2aWNlIHRvIHJlZ2lzdGVyCisgKglAcGFyZW50OiBwYXJlbnQgbWVtb3J5IHJlc291cmNlCisgKgorICoJU2V0dXAgdGhlIEFNQkEgZGV2aWNlLCByZWFkaW5nIHRoZSBjZWxsIElEIGlmIHByZXNlbnQuCisgKglDbGFpbSB0aGUgcmVzb3VyY2UsIGFuZCByZWdpc3RlciB0aGUgQU1CQSBkZXZpY2Ugd2l0aAorICoJdGhlIExpbnV4IGRldmljZSBtYW5hZ2VyLgorICovCitpbnQgYW1iYV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcGFyZW50KQoreworCXUzMiBwaWQsIGNpZDsKKwl2b2lkIF9faW9tZW0gKnRtcDsKKwlpbnQgaSwgcmV0OworCisJZGV2LT5kZXYucmVsZWFzZSA9IGFtYmFfZGV2aWNlX3JlbGVhc2U7CisJZGV2LT5kZXYuYnVzID0gJmFtYmFfYnVzdHlwZTsKKwlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmRtYV9tYXNrOworCWRldi0+cmVzLm5hbWUgPSBkZXYtPmRldi5idXNfaWQ7CisKKwlpZiAoIWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrICYmIGRldi0+ZG1hX21hc2spCisJCWRldl93YXJuKCZkZXYtPmRldiwgImNvaGVyZW50IGRtYSBtYXNrIGlzIHVuc2V0XG4iKTsKKworCXJldCA9IHJlcXVlc3RfcmVzb3VyY2UocGFyZW50LCAmZGV2LT5yZXMpOworCWlmIChyZXQgPT0gMCkgeworCQl0bXAgPSBpb3JlbWFwKGRldi0+cmVzLnN0YXJ0LCBTWl80Syk7CisJCWlmICghdG1wKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKHBpZCA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcGlkIHw9IChyZWFkbCh0bXAgKyAweGZlMCArIDQgKiBpKSAmIDI1NSkgPDwgKGkgKiA4KTsKKwkJZm9yIChjaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWNpZCB8PSAocmVhZGwodG1wICsgMHhmZjAgKyA0ICogaSkgJiAyNTUpIDw8IChpICogOCk7CisKKwkJaW91bm1hcCh0bXApOworCisJCWlmIChjaWQgPT0gMHhiMTA1ZjAwZCkKKwkJCWRldi0+cGVyaXBoaWQgPSBwaWQ7CisKKwkJaWYgKGRldi0+cGVyaXBoaWQpCisJCQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwkJZWxzZQorCQkJcmV0ID0gLUVOT0RFVjsKKworCQlpZiAocmV0ID09IDApIHsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9pZCk7CisJCQlpZiAoZGV2LT5pcnFbMF0gIT0gTk9fSVJRKQorCQkJCWRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9pcnEwKTsKKwkJCWlmIChkZXYtPmlycVsxXSAhPSBOT19JUlEpCisJCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2lycTEpOworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3Jlc291cmNlKTsKKwkJfSBlbHNlIHsKKyBvdXQ6CisJCQlyZWxlYXNlX3Jlc291cmNlKCZkZXYtPnJlcyk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglhbWJhX2RldmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhbiBBTUJBIGRldmljZQorICoJQGRldjogQU1CQSBkZXZpY2UgdG8gcmVtb3ZlCisgKgorICoJUmVtb3ZlIHRoZSBzcGVjaWZpZWQgQU1CQSBkZXZpY2UgZnJvbSB0aGUgTGludXggZGV2aWNlCisgKgltYW5hZ2VyLiAgQWxsIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCB3aWxsIGJlCisgKglkZXN0cm95ZWQsIGFuZCBkZXZpY2UgZHJpdmVycyBub3RpZmllZCB0aGF0IHRoZSBkZXZpY2UgaGFzCisgKgliZWVuIHJlbW92ZWQuICBUaGUgQU1CQSBkZXZpY2UncyByZXNvdXJjZXMgaW5jbHVkaW5nCisgKgl0aGUgYW1iYV9kZXZpY2Ugc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQgb25jZSBhbGwKKyAqCXJlZmVyZW5jZXMgdG8gaXQgaGF2ZSBiZWVuIGRyb3BwZWQuCisgKi8KK3ZvaWQgYW1iYV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKK3sKKwlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOworfQorCisKK3N0cnVjdCBmaW5kX2RhdGEgeworCXN0cnVjdCBhbWJhX2RldmljZSAqZGV2OworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKwljb25zdCBjaGFyICpidXNpZDsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgaW50IG1hc2s7Cit9OworCitzdGF0aWMgaW50IGFtYmFfZmluZF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZpbmRfZGF0YSAqZCA9IGRhdGE7CisJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisJaW50IHI7CisKKwlyID0gKHBjZGV2LT5wZXJpcGhpZCAmIGQtPm1hc2spID09IGQtPmlkOworCWlmIChkLT5wYXJlbnQpCisJCXIgJj0gZC0+cGFyZW50ID09IGRldi0+cGFyZW50OworCWlmIChkLT5idXNpZCkKKwkJciAmPSBzdHJjbXAoZGV2LT5idXNfaWQsIGQtPmJ1c2lkKSA9PSAwOworCisJaWYgKHIpIHsKKwkJZ2V0X2RldmljZShkZXYpOworCQlkLT5kZXYgPSBwY2RldjsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoqCisgKglhbWJhX2ZpbmRfZGV2aWNlIC0gbG9jYXRlIGFuIEFNQkEgZGV2aWNlIGdpdmVuIGEgYnVzIGlkCisgKglAYnVzaWQ6IGJ1cyBpZCBmb3IgZGV2aWNlIChvciBOVUxMKQorICoJQHBhcmVudDogcGFyZW50IGRldmljZSAob3IgTlVMTCkKKyAqCUBpZDogcGVyaXBoZXJhbCBJRCAob3IgMCkKKyAqCUBtYXNrOiBwZXJpcGhlcmFsIElEIG1hc2sgKG9yIDApCisgKgorICoJUmV0dXJuIHRoZSBBTUJBIGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLgorICoJSWYgbm8gZGV2aWNlIG1hdGNoZXMsIHJldHVybnMgTlVMTC4KKyAqCisgKglOT1RFOiBXaGVuIGEgdmFsaWQgZGV2aWNlIGlzIGZvdW5kLCBpdHMgcmVmY291bnQgaXMKKyAqCWluY3JlbWVudGVkLCBhbmQgbXVzdCBiZSBkZWNyZW1lbnRlZCBiZWZvcmUgdGhlIHJldHVybmVkCisgKglyZWZlcmVuY2UuCisgKi8KK3N0cnVjdCBhbWJhX2RldmljZSAqCithbWJhX2ZpbmRfZGV2aWNlKGNvbnN0IGNoYXIgKmJ1c2lkLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHVuc2lnbmVkIGludCBpZCwKKwkJIHVuc2lnbmVkIGludCBtYXNrKQoreworCXN0cnVjdCBmaW5kX2RhdGEgZGF0YTsKKworCWRhdGEuZGV2ID0gTlVMTDsKKwlkYXRhLnBhcmVudCA9IHBhcmVudDsKKwlkYXRhLmJ1c2lkID0gYnVzaWQ7CisJZGF0YS5pZCA9IGlkOworCWRhdGEubWFzayA9IG1hc2s7CisKKwlidXNfZm9yX2VhY2hfZGV2KCZhbWJhX2J1c3R5cGUsIE5VTEwsICZkYXRhLCBhbWJhX2ZpbmRfbWF0Y2gpOworCisJcmV0dXJuIGRhdGEuZGV2OworfQorCisvKioKKyAqCWFtYmFfcmVxdWVzdF9yZWdpb25zIC0gcmVxdWVzdCBhbGwgbWVtIHJlZ2lvbnMgYXNzb2NpYXRlZCB3aXRoIGRldmljZQorICoJQGRldjogYW1iYV9kZXZpY2Ugc3RydWN0dXJlIGZvciBkZXZpY2UKKyAqCUBuYW1lOiBuYW1lLCBvciBOVUxMIHRvIHVzZSBkcml2ZXIgbmFtZQorICovCitpbnQgYW1iYV9yZXF1ZXN0X3JlZ2lvbnMoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIW5hbWUpCisJCW5hbWUgPSBkZXYtPmRldi5kcml2ZXItPm5hbWU7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlcy5zdGFydCwgU1pfNEssIG5hbWUpKQorCQlyZXQgPSAtRUJVU1k7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCWFtYmFfcmVsZWFzZV9yZWdpb25zIC0gcmVsZWFzZSBtZW0gcmVnaW9ucyBhc3NvaWNhdGVkIHdpdGggZGV2aWNlCisgKglAZGV2OiBhbWJhX2RldmljZSBzdHJ1Y3R1cmUgZm9yIGRldmljZQorICoKKyAqCVJlbGVhc2UgcmVnaW9ucyBjbGFpbWVkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGFtYmFfcmVxdWVzdF9yZWdpb25zLgorICovCit2b2lkIGFtYmFfcmVsZWFzZV9yZWdpb25zKHN0cnVjdCBhbWJhX2RldmljZSAqZGV2KQoreworCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPnJlcy5zdGFydCwgU1pfNEspOworfQorCitFWFBPUlRfU1lNQk9MKGFtYmFfZHJpdmVyX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYW1iYV9kcml2ZXJfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGFtYmFfZGV2aWNlX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYW1iYV9kZXZpY2VfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGFtYmFfZmluZF9kZXZpY2UpOworRVhQT1JUX1NZTUJPTChhbWJhX3JlcXVlc3RfcmVnaW9ucyk7CitFWFBPUlRfU1lNQk9MKGFtYmFfcmVsZWFzZV9yZWdpb25zKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYyBiL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzk3YjFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCkBAIC0wLDAgKzEsNjgyIEBACisvKgorICogIGFyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYworICoKKyAqICBTcGVjaWFsIGRtYV97bWFwL3VubWFwL2RtYV9zeW5jfV8qIHJvdXRpbmVzIGZvciBzeXN0ZW1zIHRoYXQgaGF2ZQorICogIGxpbWl0ZWQgRE1BIHdpbmRvd3MuIFRoZXNlIGZ1bmN0aW9ucyB1dGlsaXplIGJvdW5jZSBidWZmZXJzIHRvCisgKiAgY29weSBkYXRhIHRvL2Zyb20gYnVmZmVycyBsb2NhdGVkIG91dHNpZGUgdGhlIERNQSByZWdpb24uIFRoaXMKKyAqICBvbmx5IHdvcmtzIGZvciBzeXN0ZW1zIGluIHdoaWNoIERNQSBtZW1vcnkgaXMgYXQgdGhlIGJvdHRvbSBvZgorICogIFJBTSBhbmQgdGhlIHJlbWFpbmRlciBvZiBtZW1vcnkgaXMgYXQgdGhlIHRvcCBhbiB0aGUgRE1BIG1lbW9yeQorICogIGNhbiBiZSBtYXJrZWQgYXMgWk9ORV9ETUEuIEFueXRoaW5nIGJleW9uZCB0aGF0IHN1Y2ggYXMgZGlzY29udGlnb3VzCisgKiAgRE1BIHdpbmRvd3Mgd2lsbCByZXF1aXJlIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgdGhhdCByZXNlcnZlIG1lbW9yeQorICogIGFyZWFzIGF0IGVhcmx5IGJvb3R1cC4KKyAqCisgKiAgT3JpZ2luYWwgdmVyc2lvbiBieSBCcmFkIFBhcmtlciAoYnJhZEBoZWVsdG9lLmNvbSkKKyAqICBSZS13cml0dGVuIGJ5IENocmlzdG9waGVyIEhvb3ZlciA8Y2hAbXVyZ2F0cm9pZC5jb20+CisgKiAgTWFkZSBnZW5lcmljIGJ5IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBIZXdsZXR0IFBhY2thcmQgQ29tcGFueS4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjdW5kZWYgREVCVUcKKworI3VuZGVmIFNUQVRTCisjaWZkZWYgU1RBVFMKKyNkZWZpbmUgRE9fU1RBVFMoWCkgZG8geyBYIDsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERPX1NUQVRTKFgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdHJ1Y3Qgc2FmZV9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKworCS8qIG9yaWdpbmFsIHJlcXVlc3QgKi8KKwl2b2lkCQkqcHRyOworCXNpemVfdAkJc2l6ZTsKKwlpbnQJCWRpcmVjdGlvbjsKKworCS8qIHNhZmUgYnVmZmVyIGluZm8gKi8KKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2w7CisJdm9pZAkJKnNhZmU7CisJZG1hX2FkZHJfdAlzYWZlX2RtYV9hZGRyOworfTsKKworc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBkbWFfcG9vbCAqc21hbGxfYnVmZmVyX3Bvb2w7CisJc3RydWN0IGRtYV9wb29sICpsYXJnZV9idWZmZXJfcG9vbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNhZmVfYnVmZmVyczsKKwl1bnNpZ25lZCBsb25nIHNtYWxsX2J1ZmZlcl9zaXplLCBsYXJnZV9idWZmZXJfc2l6ZTsKKyNpZmRlZiBTVEFUUworCXVuc2lnbmVkIGxvbmcgc2JwX2FsbG9jczsKKwl1bnNpZ25lZCBsb25nIGxicF9hbGxvY3M7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9hbGxvY3M7CisJdW5zaWduZWQgbG9uZyBtYXBfb3BfY291bnQ7CisJdW5zaWduZWQgbG9uZyBib3VuY2VfY291bnQ7CisjZW5kaWYKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZG1hYm91bmNlX2RldnMpOworCisjaWZkZWYgU1RBVFMKK3N0YXRpYyB2b2lkIHByaW50X2FsbG9jX3N0YXRzKHN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvKQoreworCXByaW50ayhLRVJOX0lORk8KKwkJIiVzOiBkbWFib3VuY2U6IHNicDogJWx1LCBsYnA6ICVsdSwgb3RoZXI6ICVsdSwgdG90YWw6ICVsdVxuIiwKKwkJZGV2aWNlX2luZm8tPmRldi0+YnVzX2lkLAorCQlkZXZpY2VfaW5mby0+c2JwX2FsbG9jcywgZGV2aWNlX2luZm8tPmxicF9hbGxvY3MsCisJCWRldmljZV9pbmZvLT50b3RhbF9hbGxvY3MgLSBkZXZpY2VfaW5mby0+c2JwX2FsbG9jcyAtCisJCQlkZXZpY2VfaW5mby0+bGJwX2FsbG9jcywKKwkJZGV2aWNlX2luZm8tPnRvdGFsX2FsbG9jcyk7Cit9CisjZW5kaWYKKworLyogZmluZCB0aGUgZ2l2ZW4gZGV2aWNlIGluIHRoZSBkbWFib3VuY2UgZGV2aWNlIGxpc3QgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbyAqCitmaW5kX2RtYWJvdW5jZV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmRtYWJvdW5jZV9kZXZzKSB7CisJCXN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmQgPQorCQkJbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbywgbm9kZSk7CisKKwkJaWYgKGQtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogYWxsb2NhdGUgYSAnc2FmZScgYnVmZmVyIGFuZCBrZWVwIHRyYWNrIG9mIGl0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzYWZlX2J1ZmZlciAqCithbGxvY19zYWZlX2J1ZmZlcihzdHJ1Y3QgZG1hYm91bmNlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbywgdm9pZCAqcHRyLAorCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3Qgc2FmZV9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2w7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGV2aWNlX2luZm8tPmRldjsKKwl2b2lkICpzYWZlOworCWRtYV9hZGRyX3Qgc2FmZV9kbWFfYWRkcjsKKworCWRldl9kYmcoZGV2LCAiJXMocHRyPSVwLCBzaXplPSVkLCBkaXI9JWQpXG4iLAorCQlfX2Z1bmNfXywgcHRyLCBzaXplLCBkaXIpOworCisJRE9fU1RBVFMgKCBkZXZpY2VfaW5mby0+dG90YWxfYWxsb2NzKysgKTsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWZlX2J1ZmZlciksIEdGUF9BVE9NSUMpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlkZXZfd2FybihkZXYsICIlczoga21hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHNpemUgPD0gZGV2aWNlX2luZm8tPnNtYWxsX2J1ZmZlcl9zaXplKSB7CisJCXBvb2wgPSBkZXZpY2VfaW5mby0+c21hbGxfYnVmZmVyX3Bvb2w7CisJCXNhZmUgPSBkbWFfcG9vbF9hbGxvYyhwb29sLCBHRlBfQVRPTUlDLCAmc2FmZV9kbWFfYWRkcik7CisKKwkJRE9fU1RBVFMgKCBkZXZpY2VfaW5mby0+c2JwX2FsbG9jcysrICk7CisJfSBlbHNlIGlmIChzaXplIDw9IGRldmljZV9pbmZvLT5sYXJnZV9idWZmZXJfc2l6ZSkgeworCQlwb29sID0gZGV2aWNlX2luZm8tPmxhcmdlX2J1ZmZlcl9wb29sOworCQlzYWZlID0gZG1hX3Bvb2xfYWxsb2MocG9vbCwgR0ZQX0FUT01JQywgJnNhZmVfZG1hX2FkZHIpOworCisJCURPX1NUQVRTICggZGV2aWNlX2luZm8tPmxicF9hbGxvY3MrKyApOworCX0gZWxzZSB7CisJCXBvb2wgPSBOVUxMOworCQlzYWZlID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgJnNhZmVfZG1hX2FkZHIsIEdGUF9BVE9NSUMpOworCX0KKworCWlmIChzYWZlID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oZGV2aWNlX2luZm8tPmRldiwKKwkJCSIlczogY291bGQgbm90IGFsbG9jIGRtYSBtZW1vcnkgKHNpemU9JWQpXG4iLAorCQkgICAgICAgX19mdW5jX18sIHNpemUpOworCQlrZnJlZShidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKyNpZmRlZiBTVEFUUworCWlmIChkZXZpY2VfaW5mby0+dG90YWxfYWxsb2NzICUgMTAwMCA9PSAwKQorCQlwcmludF9hbGxvY19zdGF0cyhkZXZpY2VfaW5mbyk7CisjZW5kaWYKKworCWJ1Zi0+cHRyID0gcHRyOworCWJ1Zi0+c2l6ZSA9IHNpemU7CisJYnVmLT5kaXJlY3Rpb24gPSBkaXI7CisJYnVmLT5wb29sID0gcG9vbDsKKwlidWYtPnNhZmUgPSBzYWZlOworCWJ1Zi0+c2FmZV9kbWFfYWRkciA9IHNhZmVfZG1hX2FkZHI7CisKKwlsaXN0X2FkZCgmYnVmLT5ub2RlLCAmZGV2aWNlX2luZm8tPnNhZmVfYnVmZmVycyk7CisKKwlyZXR1cm4gYnVmOworfQorCisvKiBkZXRlcm1pbmUgaWYgYSBidWZmZXIgaXMgZnJvbSBvdXIgInNhZmUiIHBvb2wgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNhZmVfYnVmZmVyICoKK2ZpbmRfc2FmZV9idWZmZXIoc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm8sIGRtYV9hZGRyX3Qgc2FmZV9kbWFfYWRkcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZkZXZpY2VfaW5mby0+c2FmZV9idWZmZXJzKSB7CisJCXN0cnVjdCBzYWZlX2J1ZmZlciAqYiA9CisJCQlsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgc2FmZV9idWZmZXIsIG5vZGUpOworCisJCWlmIChiLT5zYWZlX2RtYV9hZGRyID09IHNhZmVfZG1hX2FkZHIpCisJCQlyZXR1cm4gYjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitmcmVlX3NhZmVfYnVmZmVyKHN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvLCBzdHJ1Y3Qgc2FmZV9idWZmZXIgKmJ1ZikKK3sKKwlkZXZfZGJnKGRldmljZV9pbmZvLT5kZXYsICIlcyhidWY9JXApXG4iLCBfX2Z1bmNfXywgYnVmKTsKKworCWxpc3RfZGVsKCZidWYtPm5vZGUpOworCisJaWYgKGJ1Zi0+cG9vbCkKKwkJZG1hX3Bvb2xfZnJlZShidWYtPnBvb2wsIGJ1Zi0+c2FmZSwgYnVmLT5zYWZlX2RtYV9hZGRyKTsKKwllbHNlCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldmljZV9pbmZvLT5kZXYsIGJ1Zi0+c2l6ZSwgYnVmLT5zYWZlLAorCQkJCSAgICBidWYtPnNhZmVfZG1hX2FkZHIpOworCisJa2ZyZWUoYnVmKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmZGVmIFNUQVRTCisKK3N0YXRpYyB2b2lkIHByaW50X21hcF9zdGF0cyhzdHJ1Y3QgZG1hYm91bmNlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbykKK3sKKwlwcmludGsoS0VSTl9JTkZPCisJCSIlczogZG1hYm91bmNlOiBtYXBfb3BfY291bnQ9JWx1LCBib3VuY2VfY291bnQ9JWx1XG4iLAorCQlkZXZpY2VfaW5mby0+ZGV2LT5idXNfaWQsCisJCWRldmljZV9pbmZvLT5tYXBfb3BfY291bnQsIGRldmljZV9pbmZvLT5ib3VuY2VfY291bnQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAorbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3QgZG1hYm91bmNlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbyA9IGZpbmRfZG1hYm91bmNlX2RldihkZXYpOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJaW50IG5lZWRzX2JvdW5jZSA9IDA7CisKKwlpZiAoZGV2aWNlX2luZm8pCisJCURPX1NUQVRTICggZGV2aWNlX2luZm8tPm1hcF9vcF9jb3VudCsrICk7CisKKwlkbWFfYWRkciA9IHZpcnRfdG9fZG1hKGRldiwgcHRyKTsKKworCWlmIChkZXYtPmRtYV9tYXNrKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFzayA9ICpkZXYtPmRtYV9tYXNrOworCQl1bnNpZ25lZCBsb25nIGxpbWl0OworCisJCWxpbWl0ID0gKG1hc2sgKyAxKSAmIH5tYXNrOworCQlpZiAobGltaXQgJiYgc2l6ZSA+IGxpbWl0KSB7CisJCQlkZXZfZXJyKGRldiwgIkRNQSBtYXBwaW5nIHRvbyBiaWcgKHJlcXVlc3RlZCAlI3ggIgorCQkJCSJtYXNrICUjTHgpXG4iLCBzaXplLCAqZGV2LT5kbWFfbWFzayk7CisJCQlyZXR1cm4gfjA7CisJCX0KKworCQkvKgorCQkgKiBGaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gYm91bmNlIGZyb20gdGhlIERNQSBtYXNrLgorCQkgKi8KKwkJbmVlZHNfYm91bmNlID0gKGRtYV9hZGRyIHwgKGRtYV9hZGRyICsgc2l6ZSAtIDEpKSAmIH5tYXNrOworCX0KKworCWlmIChkZXZpY2VfaW5mbyAmJiAobmVlZHNfYm91bmNlIHx8IGRtYV9uZWVkc19ib3VuY2UoZGV2LCBkbWFfYWRkciwgc2l6ZSkpKSB7CisJCXN0cnVjdCBzYWZlX2J1ZmZlciAqYnVmOworCisJCWJ1ZiA9IGFsbG9jX3NhZmVfYnVmZmVyKGRldmljZV9pbmZvLCBwdHIsIHNpemUsIGRpcik7CisJCWlmIChidWYgPT0gMCkgeworCQkJZGV2X2VycihkZXYsICIlczogdW5hYmxlIHRvIG1hcCB1bnNhZmUgYnVmZmVyICVwIVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcHRyKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZGV2X2RiZyhkZXYsCisJCQkiJXM6IHVuc2FmZSBidWZmZXIgJXAgKHBoeT0lcCkgbWFwcGVkIHRvICVwIChwaHk9JXApXG4iLAorCQkJX19mdW5jX18sIGJ1Zi0+cHRyLCAodm9pZCAqKSB2aXJ0X3RvX2RtYShkZXYsIGJ1Zi0+cHRyKSwKKwkJCWJ1Zi0+c2FmZSwgKHZvaWQgKikgYnVmLT5zYWZlX2RtYV9hZGRyKTsKKworCQlpZiAoKGRpciA9PSBETUFfVE9fREVWSUNFKSB8fAorCQkgICAgKGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkpIHsKKwkJCWRldl9kYmcoZGV2LCAiJXM6IGNvcHkgdW5zYWZlICVwIHRvIHNhZmUgJXAsIHNpemUgJWRcbiIsCisJCQkJX19mdW5jX18sIHB0ciwgYnVmLT5zYWZlLCBzaXplKTsKKwkJCW1lbWNweShidWYtPnNhZmUsIHB0ciwgc2l6ZSk7CisJCX0KKwkJY29uc2lzdGVudF9zeW5jKGJ1Zi0+c2FmZSwgc2l6ZSwgZGlyKTsKKworCQlkbWFfYWRkciA9IGJ1Zi0+c2FmZV9kbWFfYWRkcjsKKwl9IGVsc2UgeworCQljb25zaXN0ZW50X3N5bmMocHRyLCBzaXplLCBkaXIpOworCX0KKworCXJldHVybiBkbWFfYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit1bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gZmluZF9kbWFib3VuY2VfZGV2KGRldik7CisJc3RydWN0IHNhZmVfYnVmZmVyICpidWYgPSBOVUxMOworCisJLyoKKwkgKiBUcnlpbmcgdG8gdW5tYXAgYW4gaW52YWxpZCBtYXBwaW5nCisJICovCisJaWYgKGRtYV9hZGRyID09IH4wKSB7CisJCWRldl9lcnIoZGV2LCAiVHJ5aW5nIHRvIHVubWFwIGludmFsaWQgbWFwcGluZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGV2aWNlX2luZm8pCisJCWJ1ZiA9IGZpbmRfc2FmZV9idWZmZXIoZGV2aWNlX2luZm8sIGRtYV9hZGRyKTsKKworCWlmIChidWYpIHsKKwkJQlVHX09OKGJ1Zi0+c2l6ZSAhPSBzaXplKTsKKworCQlkZXZfZGJnKGRldiwKKwkJCSIlczogdW5zYWZlIGJ1ZmZlciAlcCAocGh5PSVwKSBtYXBwZWQgdG8gJXAgKHBoeT0lcClcbiIsCisJCQlfX2Z1bmNfXywgYnVmLT5wdHIsICh2b2lkICopIHZpcnRfdG9fZG1hKGRldiwgYnVmLT5wdHIpLAorCQkJYnVmLT5zYWZlLCAodm9pZCAqKSBidWYtPnNhZmVfZG1hX2FkZHIpOworCisKKwkJRE9fU1RBVFMgKCBkZXZpY2VfaW5mby0+Ym91bmNlX2NvdW50KysgKTsKKworCQlpZiAoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHx8CisJCSAgICAoZGlyID09IERNQV9CSURJUkVDVElPTkFMKSkgeworCQkJZGV2X2RiZyhkZXYsCisJCQkJIiVzOiBjb3B5IGJhY2sgc2FmZSAlcCB0byB1bnNhZmUgJXAgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYnVmLT5zYWZlLCBidWYtPnB0ciwgc2l6ZSk7CisJCQltZW1jcHkoYnVmLT5wdHIsIGJ1Zi0+c2FmZSwgc2l6ZSk7CisJCX0KKwkJZnJlZV9zYWZlX2J1ZmZlcihkZXZpY2VfaW5mbywgYnVmKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gZmluZF9kbWFib3VuY2VfZGV2KGRldik7CisJc3RydWN0IHNhZmVfYnVmZmVyICpidWYgPSBOVUxMOworCisJaWYgKGRldmljZV9pbmZvKQorCQlidWYgPSBmaW5kX3NhZmVfYnVmZmVyKGRldmljZV9pbmZvLCBkbWFfYWRkcik7CisKKwlpZiAoYnVmKSB7CisJCS8qCisJCSAqIEJvdGggb2YgdGhlc2UgY2hlY2tzIGZyb20gb3JpZ2luYWwgY29kZSBuZWVkIHRvIGJlCisJCSAqIGNvbW1lbnRlZCBvdXQgYi9jIHNvbWUgZHJpdmVycyByZWx5IG9uIHRoZSBmb2xsb3dpbmc6CisJCSAqCisJCSAqIDEpIERyaXZlcnMgbWF5IG1hcCBhIGxhcmdlIGNodW5rIG9mIG1lbW9yeSBpbnRvIERNQSBzcGFjZQorCQkgKiAgICBidXQgb25seSBzeW5jIGEgc21hbGwgcG9ydGlvbiBvZiBpdC4gR29vZCBleGFtcGxlIGlzCisJCSAqICAgIGFsbG9jYXRpbmcgYSBsYXJnZSBidWZmZXIsIG1hcHBpbmcgaXQsIGFuZCB0aGVuCisJCSAqICAgIGJyZWFraW5nIGl0IHVwIGludG8gc21hbGwgZGVzY3JpcHRvcnMuIE5vIHBvaW50CisJCSAqICAgIGluIHN5bmNpbmcgdGhlIHdob2xlIGJ1ZmZlciBpZiB5b3Ugb25seSBoYXZlIHRvCisJCSAqICAgIHRvdWNoIG9uZSBkZXNjcmlwdG9yLgorCQkgKgorCQkgKiAyKSBCdWZmZXJzIHRoYXQgYXJlIG1hcHBlZCBhcyBETUFfQklESVJFQ1RJT05BTCBhcmUKKwkJICogICAgdXN1YWxseSBvbmx5IHN5bmNlZCBpbiBvbmUgZGlyIGF0IGEgdGltZS4KKwkJICoKKwkJICogU2VlIGRyaXZlcnMvbmV0L2VlcHJvMTAwLmMgZm9yIGV4YW1wbGVzIG9mIGJvdGggY2FzZXMuCisJCSAqCisJCSAqIC1kcworCQkgKgorCQkgKiBCVUdfT04oYnVmLT5zaXplICE9IHNpemUpOworCQkgKiBCVUdfT04oYnVmLT5kaXJlY3Rpb24gIT0gZGlyKTsKKwkJICovCisKKwkJZGV2X2RiZyhkZXYsCisJCQkiJXM6IHVuc2FmZSBidWZmZXIgJXAgKHBoeT0lcCkgbWFwcGVkIHRvICVwIChwaHk9JXApXG4iLAorCQkJX19mdW5jX18sIGJ1Zi0+cHRyLCAodm9pZCAqKSB2aXJ0X3RvX2RtYShkZXYsIGJ1Zi0+cHRyKSwKKwkJCWJ1Zi0+c2FmZSwgKHZvaWQgKikgYnVmLT5zYWZlX2RtYV9hZGRyKTsKKworCQlET19TVEFUUyAoIGRldmljZV9pbmZvLT5ib3VuY2VfY291bnQrKyApOworCisJCXN3aXRjaCAoZGlyKSB7CisJCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQkJZGV2X2RiZyhkZXYsCisJCQkJIiVzOiBjb3B5IGJhY2sgc2FmZSAlcCB0byB1bnNhZmUgJXAgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYnVmLT5zYWZlLCBidWYtPnB0ciwgc2l6ZSk7CisJCQltZW1jcHkoYnVmLT5wdHIsIGJ1Zi0+c2FmZSwgc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBETUFfVE9fREVWSUNFOgorCQkJZGV2X2RiZyhkZXYsCisJCQkJIiVzOiBjb3B5IG91dCB1bnNhZmUgJXAgdG8gc2FmZSAlcCwgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXyxidWYtPnB0ciwgYnVmLT5zYWZlLCBzaXplKTsKKwkJCW1lbWNweShidWYtPnNhZmUsIGJ1Zi0+cHRyLCBzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCQkJQlVHKCk7CS8qIGlzIHRoaXMgYWxsb3dlZD8gIHdoYXQgZG9lcyBpdCBtZWFuPyAqLworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwkJY29uc2lzdGVudF9zeW5jKGJ1Zi0+c2FmZSwgc2l6ZSwgZGlyKTsKKwl9IGVsc2UgeworCQljb25zaXN0ZW50X3N5bmMoZG1hX3RvX3ZpcnQoZGV2LCBkbWFfYWRkciksIHNpemUsIGRpcik7CisJfQorfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKgorICogc2VlIGlmIGEgYnVmZmVyIGFkZHJlc3MgaXMgaW4gYW4gJ3Vuc2FmZScgcmFuZ2UuICBpZiBpdCBpcworICogYWxsb2NhdGUgYSAnc2FmZScgYnVmZmVyIGFuZCBjb3B5IHRoZSB1bnNhZmUgYnVmZmVyIGludG8gaXQuCisgKiBzdWJzdGl0dXRlIHRoZSBzYWZlIGJ1ZmZlciBmb3IgdGhlIHVuc2FmZSBvbmUuCisgKiAoYmFzaWNhbGx5IG1vdmUgdGhlIGJ1ZmZlciBmcm9tIGFuIHVuc2FmZSBhcmVhIHRvIGEgc2FmZSBvbmUpCisgKi8KK2RtYV9hZGRyX3QKK2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCWRldl9kYmcoZGV2LCAiJXMocHRyPSVwLHNpemU9JWQsZGlyPSV4KVxuIiwKKwkJX19mdW5jX18sIHB0ciwgc2l6ZSwgZGlyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZG1hX2FkZHIgPSBtYXBfc2luZ2xlKGRldiwgcHRyLCBzaXplLCBkaXIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIGRtYV9hZGRyOworfQorCisvKgorICogc2VlIGlmIGEgbWFwcGVkIGFkZHJlc3Mgd2FzIHJlYWxseSBhICJzYWZlIiBidWZmZXIgYW5kIGlmIHNvLCBjb3B5CisgKiB0aGUgZGF0YSBmcm9tIHRoZSBzYWZlIGJ1ZmZlciBiYWNrIHRvIHRoZSB1bnNhZmUgYnVmZmVyIGFuZCBmcmVlIHVwCisgKiB0aGUgc2FmZSBidWZmZXIuICAoYmFzaWNhbGx5IHJldHVybiB0aGluZ3MgYmFjayB0byB0aGUgd2F5IHRoZXkKKyAqIHNob3VsZCBiZSkKKyAqLworCit2b2lkCitkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoZGV2LCAiJXMocHRyPSVwLHNpemU9JWQsZGlyPSV4KVxuIiwKKwkJX19mdW5jX18sICh2b2lkICopIGRtYV9hZGRyLCBzaXplLCBkaXIpOworCisJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl1bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworaW50CitkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWRldl9kYmcoZGV2LCAiJXMoc2c9JXAsbmVudHM9JWQsZGlyPSV4KVxuIiwKKwkJX19mdW5jX18sIHNnLCBuZW50cywgZGlyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZy0+cGFnZTsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHNnLT5vZmZzZXQ7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZy0+bGVuZ3RoOworCQl2b2lkICpwdHIgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQ7CisKKwkJc2ctPmRtYV9hZGRyZXNzID0KKwkJCW1hcF9zaW5nbGUoZGV2LCBwdHIsIGxlbmd0aCwgZGlyKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gbmVudHM7Cit9CisKK3ZvaWQKK2RtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlkZXZfZGJnKGRldiwgIiVzKHNnPSVwLG5lbnRzPSVkLGRpcj0leClcbiIsCisJCV9fZnVuY19fLCBzZywgbmVudHMsIGRpcik7CisKKwlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBzZy0+ZG1hX2FkZHJlc3M7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZy0+bGVuZ3RoOworCisJCXVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBsZW5ndGgsIGRpcik7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkCitkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZyhkZXYsICIlcyhwdHI9JXAsc2l6ZT0lZCxkaXI9JXgpXG4iLAorCQlfX2Z1bmNfXywgKHZvaWQgKikgZG1hX2FkZHIsIHNpemUsIGRpcik7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzeW5jX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkCitkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZyhkZXYsICIlcyhwdHI9JXAsc2l6ZT0lZCxkaXI9JXgpXG4iLAorCQlfX2Z1bmNfXywgKHZvaWQgKikgZG1hX2FkZHIsIHNpemUsIGRpcik7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzeW5jX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkCitkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlkZXZfZGJnKGRldiwgIiVzKHNnPSVwLG5lbnRzPSVkLGRpcj0leClcbiIsCisJCV9fZnVuY19fLCBzZywgbmVudHMsIGRpcik7CisKKwlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBzZy0+ZG1hX2FkZHJlc3M7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZy0+bGVuZ3RoOworCisJCXN5bmNfc2luZ2xlKGRldiwgZG1hX2FkZHIsIGxlbmd0aCwgZGlyKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3ZvaWQKK2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWRldl9kYmcoZGV2LCAiJXMoc2c9JXAsbmVudHM9JWQsZGlyPSV4KVxuIiwKKwkJX19mdW5jX18sIHNnLCBuZW50cywgZGlyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKKwkJZG1hX2FkZHJfdCBkbWFfYWRkciA9IHNnLT5kbWFfYWRkcmVzczsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNnLT5sZW5ndGg7CisKKwkJc3luY19zaW5nbGUoZGV2LCBkbWFfYWRkciwgbGVuZ3RoLCBkaXIpOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworaW50CitkbWFib3VuY2VfcmVnaXN0ZXJfZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzbWFsbF9idWZmZXJfc2l6ZSwKKwkJCXVuc2lnbmVkIGxvbmcgbGFyZ2VfYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CisKKwlkZXZpY2VfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8pLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRldmljZV9pbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZWQgZG1hYm91bmNlX2RldmljZV9pbmZvIGZvciAlcyIsCisJCQlkZXYtPmJ1c19pZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldmljZV9pbmZvLT5zbWFsbF9idWZmZXJfcG9vbCA9CisJCWRtYV9wb29sX2NyZWF0ZSgic21hbGxfZG1hYm91bmNlX3Bvb2wiLAorCQkJCWRldiwKKwkJCQlzbWFsbF9idWZmZXJfc2l6ZSwKKwkJCQkwIC8qIGJ5dGUgYWxpZ25tZW50ICovLAorCQkJCTAgLyogbm8gcGFnZS1jcm9zc2luZyBpc3N1ZXMgKi8pOworCWlmICghZGV2aWNlX2luZm8tPnNtYWxsX2J1ZmZlcl9wb29sKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImRtYWJvdW5jZTogY291bGQgbm90IGFsbG9jYXRlIHNtYWxsIERNQSBwb29sIGZvciAlc1xuIiwKKwkJCWRldi0+YnVzX2lkKTsKKwkJa2ZyZWUoZGV2aWNlX2luZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobGFyZ2VfYnVmZmVyX3NpemUpIHsKKwkJZGV2aWNlX2luZm8tPmxhcmdlX2J1ZmZlcl9wb29sID0KKwkJCWRtYV9wb29sX2NyZWF0ZSgibGFyZ2VfZG1hYm91bmNlX3Bvb2wiLAorCQkJCQlkZXYsCisJCQkJCWxhcmdlX2J1ZmZlcl9zaXplLAorCQkJCQkwIC8qIGJ5dGUgYWxpZ25tZW50ICovLAorCQkJCQkwIC8qIG5vIHBhZ2UtY3Jvc3NpbmcgaXNzdWVzICovKTsKKwkJaWYgKCFkZXZpY2VfaW5mby0+bGFyZ2VfYnVmZmVyX3Bvb2wpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiZG1hYm91bmNlOiBjb3VsZCBub3QgYWxsb2NhdGUgbGFyZ2UgRE1BIHBvb2wgZm9yICVzXG4iLAorCQkJZGV2LT5idXNfaWQpOworCQkJZG1hX3Bvb2xfZGVzdHJveShkZXZpY2VfaW5mby0+c21hbGxfYnVmZmVyX3Bvb2wpOworCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWRldmljZV9pbmZvLT5kZXYgPSBkZXY7CisJZGV2aWNlX2luZm8tPnNtYWxsX2J1ZmZlcl9zaXplID0gc21hbGxfYnVmZmVyX3NpemU7CisJZGV2aWNlX2luZm8tPmxhcmdlX2J1ZmZlcl9zaXplID0gbGFyZ2VfYnVmZmVyX3NpemU7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZV9pbmZvLT5zYWZlX2J1ZmZlcnMpOworCisjaWZkZWYgU1RBVFMKKwlkZXZpY2VfaW5mby0+c2JwX2FsbG9jcyA9IDA7CisJZGV2aWNlX2luZm8tPmxicF9hbGxvY3MgPSAwOworCWRldmljZV9pbmZvLT50b3RhbF9hbGxvY3MgPSAwOworCWRldmljZV9pbmZvLT5tYXBfb3BfY291bnQgPSAwOworCWRldmljZV9pbmZvLT5ib3VuY2VfY291bnQgPSAwOworI2VuZGlmCisKKwlsaXN0X2FkZCgmZGV2aWNlX2luZm8tPm5vZGUsICZkbWFib3VuY2VfZGV2cyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJkbWFib3VuY2U6IHJlZ2lzdGVyZWQgZGV2aWNlICVzIG9uICVzIGJ1c1xuIiwKKwkJZGV2LT5idXNfaWQsIGRldi0+YnVzLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCit2b2lkCitkbWFib3VuY2VfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gZmluZF9kbWFib3VuY2VfZGV2KGRldik7CisKKwlpZiAoIWRldmljZV9pbmZvKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogTmV2ZXIgcmVnaXN0ZXJlZCB3aXRoIGRtYWJvdW5jZSBidXQgYXR0ZW1wdGluZyIgXAorCQkJInRvIHVucmVnaXN0ZXIhXG4iLCBkZXYtPmJ1c19pZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRldmljZV9pbmZvLT5zYWZlX2J1ZmZlcnMpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBSZW1vdmluZyBmcm9tIGRtYWJvdW5jZSB3aXRoIHBlbmRpbmcgYnVmZmVycyFcbiIsCisJCQlkZXYtPmJ1c19pZCk7CisJCUJVRygpOworCX0KKworCWlmIChkZXZpY2VfaW5mby0+c21hbGxfYnVmZmVyX3Bvb2wpCisJCWRtYV9wb29sX2Rlc3Ryb3koZGV2aWNlX2luZm8tPnNtYWxsX2J1ZmZlcl9wb29sKTsKKwlpZiAoZGV2aWNlX2luZm8tPmxhcmdlX2J1ZmZlcl9wb29sKQorCQlkbWFfcG9vbF9kZXN0cm95KGRldmljZV9pbmZvLT5sYXJnZV9idWZmZXJfcG9vbCk7CisKKyNpZmRlZiBTVEFUUworCXByaW50X2FsbG9jX3N0YXRzKGRldmljZV9pbmZvKTsKKwlwcmludF9tYXBfc3RhdHMoZGV2aWNlX2luZm8pOworI2VuZGlmCisKKwlsaXN0X2RlbCgmZGV2aWNlX2luZm8tPm5vZGUpOworCisJa2ZyZWUoZGV2aWNlX2luZm8pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZG1hYm91bmNlOiBkZXZpY2UgJXMgb24gJXMgYnVzIHVucmVnaXN0ZXJlZFxuIiwKKwkJZGV2LT5idXNfaWQsIGRldi0+YnVzLT5uYW1lKTsKK30KKworCitFWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2luZ2xlKTsKK0VYUE9SVF9TWU1CT0woZG1hX3VubWFwX3NpbmdsZSk7CitFWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2cpOworRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2cpOworRVhQT1JUX1NZTUJPTChkbWFfc3luY19zaW5nbGUpOworRVhQT1JUX1NZTUJPTChkbWFfc3luY19zZyk7CitFWFBPUlRfU1lNQk9MKGRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYpOworRVhQT1JUX1NZTUJPTChkbWFib3VuY2VfdW5yZWdpc3Rlcl9kZXYpOworCitNT0RVTEVfQVVUSE9SKCJDaHJpc3RvcGhlciBIb292ZXIgPGNoQGhwbC5ocC5jb20+LCBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVjaWFsIGRtYV97bWFwL3VubWFwL2RtYV9zeW5jfV8qIHJvdXRpbmVzIGZvciBzeXN0ZW1zIHdpdGggbGltaXRlZCBETUEgd2luZG93cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2ljc3QzMDcuYyBiL2FyY2gvYXJtL2NvbW1vbi9pY3N0MzA3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmZThiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9pY3N0MzA3LmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vY29tbW9uL2ljc3QzMDcuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgRGVlcCBCbHVlIFNvbHV0aW9ucywgTHRkLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBjYWxjdWxhdGluZyBjbG9ja3MvZGl2aXNvcnMgZm9yIHRoZSBJQ1NUMzA3CisgKiAgY2xvY2sgZ2VuZXJhdG9ycy4gIFNlZSBodHRwOi8vd3d3Lmljc3QuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogIG9uIHRoZXNlIGRldmljZXMuCisgKgorICogIFRoaXMgaXMgYW4gYWxtb3N0IGlkZW50aWNhbCBpbXBsZW1lbnRhdGlvbiB0byB0aGUgSUNTVDUyNSBjbG9jayBnZW5lcmF0b3IuCisgKiAgVGhlIHMyZGl2IGFuZCBpZHgycyBmaWxlcyBhcmUgZGlmZmVyZW50CisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0MzA3Lmg+CisKKy8qCisgKiBEaXZpc29ycyBmb3IgZWFjaCBPRCBzZXR0aW5nLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzMmRpdls4XSA9IHsgMTAsIDIsIDgsIDQsIDUsIDcsIDMsIDYgfTsKKwordW5zaWduZWQgbG9uZyBpY3N0MzA3X2toeihjb25zdCBzdHJ1Y3QgaWNzdDMwN19wYXJhbXMgKnAsIHN0cnVjdCBpY3N0MzA3X3ZjbyB2Y28pCit7CisJcmV0dXJuIHAtPnJlZiAqIDIgKiAodmNvLnYgKyA4KSAvICgodmNvLnIgKyAyKSAqIHMyZGl2W3Zjby5zXSk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWNzdDMwN19raHopOworCisvKgorICogQXNjZW5kaW5nIGRpdmlzb3IgUyB2YWx1ZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlkeDJzWzhdID0geyAxLCA2LCAzLCA0LCA3LCA1LCAyLCAwIH07CisKK3N0cnVjdCBpY3N0MzA3X3ZjbworaWNzdDMwN19raHpfdG9fdmNvKGNvbnN0IHN0cnVjdCBpY3N0MzA3X3BhcmFtcyAqcCwgdW5zaWduZWQgbG9uZyBmcmVxKQoreworCXN0cnVjdCBpY3N0MzA3X3ZjbyB2Y28gPSB7IC5zID0gMSwgLnYgPSBwLT52ZF9tYXgsIC5yID0gcC0+cmRfbWF4IH07CisJdW5zaWduZWQgbG9uZyBmOworCXVuc2lnbmVkIGludCBpID0gMCwgcmQsIGJlc3QgPSAodW5zaWduZWQgaW50KS0xOworCisJLyoKKwkgKiBGaXJzdCwgZmluZCB0aGUgUExMIG91dHB1dCBkaXZpc29yIHN1Y2gKKwkgKiB0aGF0IHRoZSBQTEwgb3V0cHV0IGlzIHdpdGhpbiBzcGVjLgorCSAqLworCWRvIHsKKwkJZiA9IGZyZXEgKiBzMmRpdltpZHgyc1tpXV07CisKKwkJLyoKKwkJICogZiBtdXN0IGJlIGJldHdlZW4gNk1IeiBhbmQgMjAwTUh6ICgzLjMgb3IgNVYpCisJCSAqLworCQlpZiAoZiA+IDYwMDAgJiYgZiA8PSBwLT52Y29fbWF4KQorCQkJYnJlYWs7CisJfSB3aGlsZSAoaSA8IEFSUkFZX1NJWkUoaWR4MnMpKTsKKworCWlmIChpID4gQVJSQVlfU0laRShpZHgycykpCisJCXJldHVybiB2Y287CisKKwl2Y28ucyA9IGlkeDJzW2ldOworCisJLyoKKwkgKiBOb3cgZmluZCB0aGUgY2xvc2VzdCBkaXZpc29yIGNvbWJpbmF0aW9uCisJICogd2hpY2ggZ2l2ZXMgYSBQTEwgb3V0cHV0IG9mICdmJy4KKwkgKi8KKwlmb3IgKHJkID0gcC0+cmRfbWluOyByZCA8PSBwLT5yZF9tYXg7IHJkKyspIHsKKwkJdW5zaWduZWQgbG9uZyBmcmVmX2RpdiwgZl9wbGw7CisJCXVuc2lnbmVkIGludCB2ZDsKKwkJaW50IGZfZGlmZjsKKworCQlmcmVmX2RpdiA9ICgyICogcC0+cmVmKSAvIHJkOworCisJCXZkID0gKGYgKyBmcmVmX2RpdiAvIDIpIC8gZnJlZl9kaXY7CisJCWlmICh2ZCA8IHAtPnZkX21pbiB8fCB2ZCA+IHAtPnZkX21heCkKKwkJCWNvbnRpbnVlOworCisJCWZfcGxsID0gZnJlZl9kaXYgKiB2ZDsKKwkJZl9kaWZmID0gZl9wbGwgLSBmOworCQlpZiAoZl9kaWZmIDwgMCkKKwkJCWZfZGlmZiA9IC1mX2RpZmY7CisKKwkJaWYgKCh1bnNpZ25lZClmX2RpZmYgPCBiZXN0KSB7CisJCQl2Y28udiA9IHZkIC0gODsKKwkJCXZjby5yID0gcmQgLSAyOworCQkJaWYgKGZfZGlmZiA9PSAwKQorCQkJCWJyZWFrOworCQkJYmVzdCA9IGZfZGlmZjsKKwkJfQorCX0KKworCXJldHVybiB2Y287Cit9CisKK0VYUE9SVF9TWU1CT0woaWNzdDMwN19raHpfdG9fdmNvKTsKKworc3RydWN0IGljc3QzMDdfdmNvCitpY3N0MzA3X3BzX3RvX3Zjbyhjb25zdCBzdHJ1Y3QgaWNzdDMwN19wYXJhbXMgKnAsIHVuc2lnbmVkIGxvbmcgcGVyaW9kKQoreworCXN0cnVjdCBpY3N0MzA3X3ZjbyB2Y28gPSB7IC5zID0gMSwgLnYgPSBwLT52ZF9tYXgsIC5yID0gcC0+cmRfbWF4IH07CisJdW5zaWduZWQgbG9uZyBmLCBwczsKKwl1bnNpZ25lZCBpbnQgaSA9IDAsIHJkLCBiZXN0ID0gKHVuc2lnbmVkIGludCktMTsKKworCXBzID0gMTAwMDAwMDAwMFVMIC8gcC0+dmNvX21heDsKKworCS8qCisJICogRmlyc3QsIGZpbmQgdGhlIFBMTCBvdXRwdXQgZGl2aXNvciBzdWNoCisJICogdGhhdCB0aGUgUExMIG91dHB1dCBpcyB3aXRoaW4gc3BlYy4KKwkgKi8KKwlkbyB7CisJCWYgPSBwZXJpb2QgLyBzMmRpdltpZHgyc1tpXV07CisKKwkJLyoKKwkJICogZiBtdXN0IGJlIGJldHdlZW4gNk1IeiBhbmQgMjAwTUh6ICgzLjMgb3IgNVYpCisJCSAqLworCQlpZiAoZiA+PSBwcyAmJiBmIDwgMTAwMDAwMDAwMFVMIC8gNjAwMCArIDEpCisJCQlicmVhazsKKwl9IHdoaWxlIChpIDwgQVJSQVlfU0laRShpZHgycykpOworCisJaWYgKGkgPiBBUlJBWV9TSVpFKGlkeDJzKSkKKwkJcmV0dXJuIHZjbzsKKworCXZjby5zID0gaWR4MnNbaV07CisKKwlwcyA9IDUwMDAwMDAwMFVMIC8gcC0+cmVmOworCisJLyoKKwkgKiBOb3cgZmluZCB0aGUgY2xvc2VzdCBkaXZpc29yIGNvbWJpbmF0aW9uCisJICogd2hpY2ggZ2l2ZXMgYSBQTEwgb3V0cHV0IG9mICdmJy4KKwkgKi8KKwlmb3IgKHJkID0gcC0+cmRfbWluOyByZCA8PSBwLT5yZF9tYXg7IHJkKyspIHsKKwkJdW5zaWduZWQgbG9uZyBmX2luX2RpdiwgZl9wbGw7CisJCXVuc2lnbmVkIGludCB2ZDsKKwkJaW50IGZfZGlmZjsKKworCQlmX2luX2RpdiA9IHBzICogcmQ7CisKKwkJdmQgPSAoZl9pbl9kaXYgKyBmIC8gMikgLyBmOworCQlpZiAodmQgPCBwLT52ZF9taW4gfHwgdmQgPiBwLT52ZF9tYXgpCisJCQljb250aW51ZTsKKworCQlmX3BsbCA9IChmX2luX2RpdiArIHZkIC8gMikgLyB2ZDsKKwkJZl9kaWZmID0gZl9wbGwgLSBmOworCQlpZiAoZl9kaWZmIDwgMCkKKwkJCWZfZGlmZiA9IC1mX2RpZmY7CisKKwkJaWYgKCh1bnNpZ25lZClmX2RpZmYgPCBiZXN0KSB7CisJCQl2Y28udiA9IHZkIC0gODsKKwkJCXZjby5yID0gcmQgLSAyOworCQkJaWYgKGZfZGlmZiA9PSAwKQorCQkJCWJyZWFrOworCQkJYmVzdCA9IGZfZGlmZjsKKwkJfQorCX0KKworCXJldHVybiB2Y287Cit9CisKK0VYUE9SVF9TWU1CT0woaWNzdDMwN19wc190b192Y28pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2ljc3Q1MjUuYyBiL2FyY2gvYXJtL2NvbW1vbi9pY3N0NTI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzZWY4OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9pY3N0NTI1LmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vY29tbW9uL2ljc3Q1MjUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgRGVlcCBCbHVlIFNvbHV0aW9ucywgTHRkLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBjYWxjdWxhdGluZyBjbG9ja3MvZGl2aXNvcnMgZm9yIHRoZSBJQ1NUNTI1CisgKiAgY2xvY2sgZ2VuZXJhdG9ycy4gIFNlZSBodHRwOi8vd3d3Lmljc3QuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogIG9uIHRoZXNlIGRldmljZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+CisKKy8qCisgKiBEaXZpc29ycyBmb3IgZWFjaCBPRCBzZXR0aW5nLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzMmRpdls4XSA9IHsgMTAsIDIsIDgsIDQsIDUsIDcsIDksIDYgfTsKKwordW5zaWduZWQgbG9uZyBpY3N0NTI1X2toeihjb25zdCBzdHJ1Y3QgaWNzdDUyNV9wYXJhbXMgKnAsIHN0cnVjdCBpY3N0NTI1X3ZjbyB2Y28pCit7CisJcmV0dXJuIHAtPnJlZiAqIDIgKiAodmNvLnYgKyA4KSAvICgodmNvLnIgKyAyKSAqIHMyZGl2W3Zjby5zXSk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWNzdDUyNV9raHopOworCisvKgorICogQXNjZW5kaW5nIGRpdmlzb3IgUyB2YWx1ZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlkeDJzW10gPSB7IDEsIDMsIDQsIDcsIDUsIDIsIDYsIDAgfTsKKworc3RydWN0IGljc3Q1MjVfdmNvCitpY3N0NTI1X2toel90b192Y28oY29uc3Qgc3RydWN0IGljc3Q1MjVfcGFyYW1zICpwLCB1bnNpZ25lZCBsb25nIGZyZXEpCit7CisJc3RydWN0IGljc3Q1MjVfdmNvIHZjbyA9IHsgLnMgPSAxLCAudiA9IHAtPnZkX21heCwgLnIgPSBwLT5yZF9tYXggfTsKKwl1bnNpZ25lZCBsb25nIGY7CisJdW5zaWduZWQgaW50IGkgPSAwLCByZCwgYmVzdCA9ICh1bnNpZ25lZCBpbnQpLTE7CisKKwkvKgorCSAqIEZpcnN0LCBmaW5kIHRoZSBQTEwgb3V0cHV0IGRpdmlzb3Igc3VjaAorCSAqIHRoYXQgdGhlIFBMTCBvdXRwdXQgaXMgd2l0aGluIHNwZWMuCisJICovCisJZG8geworCQlmID0gZnJlcSAqIHMyZGl2W2lkeDJzW2ldXTsKKworCQkvKgorCQkgKiBmIG11c3QgYmUgYmV0d2VlbiAxME1IeiBhbmQKKwkJICogIDMyME1IeiAoNVYpIG9yIDIwME1IeiAoM1YpCisJCSAqLworCQlpZiAoZiA+IDEwMDAwICYmIGYgPD0gcC0+dmNvX21heCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkgPCBBUlJBWV9TSVpFKGlkeDJzKSk7CisKKwlpZiAoaSA+IEFSUkFZX1NJWkUoaWR4MnMpKQorCQlyZXR1cm4gdmNvOworCisJdmNvLnMgPSBpZHgyc1tpXTsKKworCS8qCisJICogTm93IGZpbmQgdGhlIGNsb3Nlc3QgZGl2aXNvciBjb21iaW5hdGlvbgorCSAqIHdoaWNoIGdpdmVzIGEgUExMIG91dHB1dCBvZiAnZicuCisJICovCisJZm9yIChyZCA9IHAtPnJkX21pbjsgcmQgPD0gcC0+cmRfbWF4OyByZCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZnJlZl9kaXYsIGZfcGxsOworCQl1bnNpZ25lZCBpbnQgdmQ7CisJCWludCBmX2RpZmY7CisKKwkJZnJlZl9kaXYgPSAoMiAqIHAtPnJlZikgLyByZDsKKworCQl2ZCA9IChmICsgZnJlZl9kaXYgLyAyKSAvIGZyZWZfZGl2OworCQlpZiAodmQgPCBwLT52ZF9taW4gfHwgdmQgPiBwLT52ZF9tYXgpCisJCQljb250aW51ZTsKKworCQlmX3BsbCA9IGZyZWZfZGl2ICogdmQ7CisJCWZfZGlmZiA9IGZfcGxsIC0gZjsKKwkJaWYgKGZfZGlmZiA8IDApCisJCQlmX2RpZmYgPSAtZl9kaWZmOworCisJCWlmICgodW5zaWduZWQpZl9kaWZmIDwgYmVzdCkgeworCQkJdmNvLnYgPSB2ZCAtIDg7CisJCQl2Y28uciA9IHJkIC0gMjsKKwkJCWlmIChmX2RpZmYgPT0gMCkKKwkJCQlicmVhazsKKwkJCWJlc3QgPSBmX2RpZmY7CisJCX0KKwl9CisKKwlyZXR1cm4gdmNvOworfQorCitFWFBPUlRfU1lNQk9MKGljc3Q1MjVfa2h6X3RvX3Zjbyk7CisKK3N0cnVjdCBpY3N0NTI1X3ZjbworaWNzdDUyNV9wc190b192Y28oY29uc3Qgc3RydWN0IGljc3Q1MjVfcGFyYW1zICpwLCB1bnNpZ25lZCBsb25nIHBlcmlvZCkKK3sKKwlzdHJ1Y3QgaWNzdDUyNV92Y28gdmNvID0geyAucyA9IDEsIC52ID0gcC0+dmRfbWF4LCAuciA9IHAtPnJkX21heCB9OworCXVuc2lnbmVkIGxvbmcgZiwgcHM7CisJdW5zaWduZWQgaW50IGkgPSAwLCByZCwgYmVzdCA9ICh1bnNpZ25lZCBpbnQpLTE7CisKKwlwcyA9IDEwMDAwMDAwMDBVTCAvIHAtPnZjb19tYXg7CisKKwkvKgorCSAqIEZpcnN0LCBmaW5kIHRoZSBQTEwgb3V0cHV0IGRpdmlzb3Igc3VjaAorCSAqIHRoYXQgdGhlIFBMTCBvdXRwdXQgaXMgd2l0aGluIHNwZWMuCisJICovCisJZG8geworCQlmID0gcGVyaW9kIC8gczJkaXZbaWR4MnNbaV1dOworCisJCS8qCisJCSAqIGYgbXVzdCBiZSBiZXR3ZWVuIDEwTUh6IGFuZAorCQkgKiAgMzIwTUh6ICg1Vikgb3IgMjAwTUh6ICgzVikKKwkJICovCisJCWlmIChmID49IHBzICYmIGYgPCAxMDAwMDApCisJCQlicmVhazsKKwl9IHdoaWxlIChpIDwgQVJSQVlfU0laRShpZHgycykpOworCisJaWYgKGkgPiBBUlJBWV9TSVpFKGlkeDJzKSkKKwkJcmV0dXJuIHZjbzsKKworCXZjby5zID0gaWR4MnNbaV07CisKKwlwcyA9IDUwMDAwMDAwMFVMIC8gcC0+cmVmOworCisJLyoKKwkgKiBOb3cgZmluZCB0aGUgY2xvc2VzdCBkaXZpc29yIGNvbWJpbmF0aW9uCisJICogd2hpY2ggZ2l2ZXMgYSBQTEwgb3V0cHV0IG9mICdmJy4KKwkgKi8KKwlmb3IgKHJkID0gcC0+cmRfbWluOyByZCA8PSBwLT5yZF9tYXg7IHJkKyspIHsKKwkJdW5zaWduZWQgbG9uZyBmX2luX2RpdiwgZl9wbGw7CisJCXVuc2lnbmVkIGludCB2ZDsKKwkJaW50IGZfZGlmZjsKKworCQlmX2luX2RpdiA9IHBzICogcmQ7CisKKwkJdmQgPSAoZl9pbl9kaXYgKyBmIC8gMikgLyBmOworCQlpZiAodmQgPCBwLT52ZF9taW4gfHwgdmQgPiBwLT52ZF9tYXgpCisJCQljb250aW51ZTsKKworCQlmX3BsbCA9IChmX2luX2RpdiArIHZkIC8gMikgLyB2ZDsKKwkJZl9kaWZmID0gZl9wbGwgLSBmOworCQlpZiAoZl9kaWZmIDwgMCkKKwkJCWZfZGlmZiA9IC1mX2RpZmY7CisKKwkJaWYgKCh1bnNpZ25lZClmX2RpZmYgPCBiZXN0KSB7CisJCQl2Y28udiA9IHZkIC0gODsKKwkJCXZjby5yID0gcmQgLSAyOworCQkJaWYgKGZfZGlmZiA9PSAwKQorCQkJCWJyZWFrOworCQkJYmVzdCA9IGZfZGlmZjsKKwkJfQorCX0KKworCXJldHVybiB2Y287Cit9CisKK0VYUE9SVF9TWU1CT0woaWNzdDUyNV9wc190b192Y28pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjEyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKQEAgLTAsMCArMSwxMDU4IEBACisvKgorICogbGludXgvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCisgKgorICogU2hhcnAgTG9Db01vIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZ2VuZXJpYyBMb0NvTW8gc3VwcG9ydC4KKyAqCisgKiBBbGwgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUgYXJlIGludGVuZGVkIHRvIGJlIGNhbGxlZAorICogZnJvbSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgd2l0aCBwcm9wZXIgYXJndW1lbnRzIHdoZW4gcmVxdWlyZWQuCisgKgorICogQmFzZWQgb24gc2ExMTExLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2xvY29tby5oPgorCisvKiBNNjIzMzIgb3V0cHV0IGNoYW5uZWwgc2VsZWN0aW9uICovCisjZGVmaW5lIE02MjMzMl9FVlJfQ0gJMQkvKiBNNjIzMzIgdm9sdW1lIGNoYW5uZWwgbnVtYmVyICAqLworCQkJCS8qICAgMCA6IENILjEgLCAxIDogQ0guIDIgICAgICAgICovCisvKiBEQUMgc2VuZCBkYXRhICovCisjZGVmaW5lCU02MjMzMl9TTEFWRV9BRERSCTB4NGUJLyogU2xhdmUgYWRkcmVzcyAgKi8KKyNkZWZpbmUJTTYyMzMyX1dfQklUCQkweDAwCS8qIFcgYml0ICgwIG9ubHkpICovCisjZGVmaW5lCU02MjMzMl9TVUJfQUREUgkJMHgwMAkvKiBTdWIgYWRkcmVzcyAgICAqLworI2RlZmluZQlNNjIzMzJfQV9CSVQJCTB4MDAJLyogQSBiaXQgKDAgb25seSkgKi8KKworLyogREFDIHNldHVwIGFuZCBob2xkIHRpbWVzIChleHByZXNzZWQgaW4gdXMpICovCisjZGVmaW5lIERBQ19CVVNfRlJFRV9USU1FCTUJLyogICA0LjcgdXMgKi8KKyNkZWZpbmUgREFDX1NUQVJUX1NFVFVQX1RJTUUJNQkvKiAgIDQuNyB1cyAqLworI2RlZmluZSBEQUNfU1RPUF9TRVRVUF9USU1FCTQJLyogICA0LjAgdXMgKi8KKyNkZWZpbmUgREFDX1NUQVJUX0hPTERfVElNRQk1CS8qICAgNC43IHVzICovCisjZGVmaW5lIERBQ19TQ0xfTE9XX0hPTERfVElNRQk1CS8qICAgNC43IHVzICovCisjZGVmaW5lIERBQ19TQ0xfSElHSF9IT0xEX1RJTUUJNAkvKiAgIDQuMCB1cyAqLworI2RlZmluZSBEQUNfREFUQV9TRVRVUF9USU1FCTEJLyogICAyNTAgbnMgKi8KKyNkZWZpbmUgREFDX0RBVEFfSE9MRF9USU1FCTEJLyogICAzMDAgbnMgKi8KKyNkZWZpbmUgREFDX0xPV19TRVRVUF9USU1FCTEJLyogICAzMDAgbnMgKi8KKyNkZWZpbmUgREFDX0hJR0hfU0VUVVBfVElNRQkxCS8qICAxMDAwIG5zICovCisKKy8qIHRoZSBmb2xsb3dpbmcgaXMgdGhlIG92ZXJhbGwgZGF0YSBmb3IgdGhlIGxvY29tbyBjaGlwICovCitzdHJ1Y3QgbG9jb21vIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBwaHlzOworCXVuc2lnbmVkIGludCBpcnE7CisJc3BpbmxvY2tfdCBsb2NrOworCXZvaWQgKmJhc2U7Cit9OworCitzdHJ1Y3QgbG9jb21vX2Rldl9pbmZvIHsKKwl1bnNpZ25lZCBsb25nCW9mZnNldDsKKwl1bnNpZ25lZCBsb25nCWxlbmd0aDsKKwl1bnNpZ25lZCBpbnQJZGV2aWQ7CisJdW5zaWduZWQgaW50CWlycVsxXTsKKwljb25zdCBjaGFyICoJbmFtZTsKK307CisKKy8qIEFsbCB0aGUgbG9jb21vIGRldmljZXMuICBJZiBvZmZzZXQgaXMgbm9uLXplcm8sIHRoZSBtYXBiYXNlIGZvciB0aGUKKyAqIGxvY29tb19kZXYgd2lsbCBiZSBzZXQgdG8gdGhlIGNoaXAgYmFzZSBwbHVzIG9mZnNldC4gIElmIG9mZnNldCBpcworICogemVybywgdGhlbiB0aGUgbWFwYmFzZSBmb3IgdGhlIGxvY29tb19kZXYgd2lsbCBiZSBzZXQgdG8gemVyby4gIEFuCisgKiBvZmZzZXQgb2YgemVybyBtZWFucyB0aGUgZGV2aWNlIG9ubHkgdXNlcyBHUElPcyBvciBvdGhlciBoZWxwZXIKKyAqIGZ1bmN0aW9ucyBpbnNpZGUgdGhpcyBmaWxlICovCitzdGF0aWMgc3RydWN0IGxvY29tb19kZXZfaW5mbyBsb2NvbW9fZGV2aWNlc1tdID0geworCXsKKwkJLmRldmlkIAkJPSBMT0NPTU9fREVWSURfS0VZQk9BUkQsCisJCS5pcnEgPSB7CisJCQlJUlFfTE9DT01PX0tFWSwKKwkJfSwKKwkJLm5hbWUJCT0gImxvY29tby1rZXlib2FyZCIsCisJCS5vZmZzZXQJCT0gTE9DT01PX0tFWUJPQVJELAorCQkubGVuZ3RoCQk9IDE2LAorCX0sCisJeworCQkuZGV2aWQJCT0gTE9DT01PX0RFVklEX0ZST05UTElHSFQsCisJCS5pcnEJCT0ge30sCisJCS5uYW1lCQk9ICJsb2NvbW8tZnJvbnRsaWdodCIsCisJCS5vZmZzZXQJCT0gTE9DT01PX0ZST05UTElHSFQsCisJCS5sZW5ndGgJCT0gOCwKKworCX0sCisJeworCQkuZGV2aWQJCT0gTE9DT01PX0RFVklEX0JBQ0tMSUdIVCwKKwkJLmlycQkJPSB7fSwKKwkJLm5hbWUJCT0gImxvY29tby1iYWNrbGlnaHQiLAorCQkub2Zmc2V0CQk9IExPQ09NT19CQUNLTElHSFQsCisJCS5sZW5ndGgJCT0gOCwKKwl9LAorCXsKKwkJLmRldmlkCQk9IExPQ09NT19ERVZJRF9BVURJTywKKwkJLmlycQkJPSB7fSwKKwkJLm5hbWUJCT0gImxvY29tby1hdWRpbyIsCisJCS5vZmZzZXQJCT0gTE9DT01PX0FVRElPLAorCQkubGVuZ3RoCQk9IDQsCisJfSwKKwl7CisJCS5kZXZpZAkJPSBMT0NPTU9fREVWSURfTEVELAorCQkuaXJxIAkJPSB7fSwKKwkJLm5hbWUJCT0gImxvY29tby1sZWQiLAorCQkub2Zmc2V0CQk9IExPQ09NT19MRUQsCisJCS5sZW5ndGgJCT0gOCwKKwl9LAorCXsKKwkJLmRldmlkCQk9IExPQ09NT19ERVZJRF9VQVJULAorCQkuaXJxCQk9IHt9LAorCQkubmFtZQkJPSAibG9jb21vLXVhcnQiLAorCQkub2Zmc2V0CQk9IDAsCisJCS5sZW5ndGgJCT0gMCwKKwl9LAorfTsKKworCisvKiogTG9Db01vIGludGVycnVwdCBoYW5kbGluZyBzdHVmZi4KKyAqIE5PVEU6IExvQ29NbyBoYXMgYSAxIHRvIG1hbnkgbWFwcGluZyBvbiBhbGwgb2YgaXRzIElSUXMuCisgKiB0aGF0IGlzLCB0aGVyZSBpcyBvbmx5IG9uZSByZWFsIGhhcmR3YXJlIGludGVycnVwdAorICogd2UgZGV0ZXJtaW5lIHdoaWNoIGludGVycnVwdCBpdCBpcyBieSByZWFkaW5nIHNvbWUgSU8gbWVtb3J5LgorICogV2UgaGF2ZSB0d28gbGV2ZWxzIG9mIGV4cGFuc2lvbiwgZmlyc3QgaW4gdGhlIGhhbmRsZXIgZm9yIHRoZQorICogaGFyZHdhcmUgaW50ZXJydXB0IHdlIGdlbmVyYXRlIGFuIGludGVycnVwdAorICogSVJRX0xPQ09NT18qX0JBU0UgYW5kIHRob3NlIGhhbmRsZXJzIGdlbmVyYXRlIG1vcmUgaW50ZXJydXB0cworICoKKyAqIGhhcmR3YXJlIGlycSByZWFkcyBMT0NPTU9fSUNSICYgMHgwZjAwCisgKiAgIElSUV9MT0NPTU9fS0VZX0JBU0UKKyAqICAgSVJRX0xPQ09NT19HUElPX0JBU0UKKyAqICAgSVJRX0xPQ09NT19MVF9CQVNFCisgKiAgIElSUV9MT0NPTU9fU1BJX0JBU0UKKyAqIElSUV9MT0NPTU9fS0VZX0JBU0UgcmVhZHMgTE9DT01PX0tJQyAmIDB4MDAwMQorICogICBJUlFfTE9DT01PX0tFWQorICogSVJRX0xPQ09NT19HUElPX0JBU0UgcmVhZHMgTE9DT01PX0dJUiAmIExPQ09NT19HUEQgJiAweGZmZmYKKyAqICAgSVJRX0xPQ09NT19HUElPWzAtMTVdCisgKiBJUlFfTE9DT01PX0xUX0JBU0UgcmVhZHMgTE9DT01PX0xUSU5UICYgMHgwMDAxCisgKiAgIElSUV9MT0NPTU9fTFQKKyAqIElSUV9MT0NPTU9fU1BJX0JBU0UgcmVhZHMgTE9DT01PX1NQSUlSICYgMHgwMDBGCisgKiAgIElSUV9MT0NPTU9fU1BJX1JGUgorICogICBJUlFfTE9DT01PX1NQSV9SRlcKKyAqICAgSVJRX0xPQ09NT19TUElfT1ZSTgorICogICBJUlFfTE9DT01PX1NQSV9URU5ECisgKi8KKworI2RlZmluZSBMT0NPTU9fSVJRX1NUQVJUCShJUlFfTE9DT01PX0tFWV9CQVNFKQorI2RlZmluZSBMT0NPTU9fSVJRX0tFWV9TVEFSVAkoSVJRX0xPQ09NT19LRVkpCisjZGVmaW5lCUxPQ09NT19JUlFfR1BJT19TVEFSVAkoSVJRX0xPQ09NT19HUElPMCkKKyNkZWZpbmUJTE9DT01PX0lSUV9MVF9TVEFSVAkoSVJRX0xPQ09NT19MVCkKKyNkZWZpbmUJTE9DT01PX0lSUV9TUElfU1RBUlQJKElSUV9MT0NPTU9fU1BJX1JGUikKKworc3RhdGljIHZvaWQgbG9jb21vX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcmVxLCBpOworCXN0cnVjdCBpcnFkZXNjICpkOworCXZvaWQgKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisKKwkvKiBBY2tub3dsZWRnZSB0aGUgcGFyZW50IElSUSAqLworCWRlc2MtPmNoaXAtPmFjayhpcnEpOworCisJLyogY2hlY2sgd2h5IHRoaXMgaW50ZXJydXB0IHdhcyBnZW5lcmF0ZWQgKi8KKwlyZXEgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19JQ1IpICYgMHgwZjAwOworCisJaWYgKHJlcSkgeworCQkvKiBnZW5lcmF0ZSB0aGUgbmV4dCBpbnRlcnJ1cHQocykgKi8KKwkJaXJxID0gTE9DT01PX0lSUV9TVEFSVDsKKwkJZCA9IGlycV9kZXNjICsgaXJxOworCQlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKywgZCsrLCBpcnErKykgeworCQkJaWYgKHJlcSAmICgweDAxMDAgPDwgaSkpIHsKKwkJCQlkLT5oYW5kbGUoaXJxLCBkLCByZWdzKTsKKwkJCX0KKworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBsb2NvbW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworfQorCitzdGF0aWMgdm9pZCBsb2NvbW9fbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19JQ1IpOworCXIgJj0gfigweDAwMTAgPDwgKGlycSAtIExPQ09NT19JUlFfU1RBUlQpKTsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fSUNSKTsKK30KKworc3RhdGljIHZvaWQgbG9jb21vX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19JQ1IpOworCXIgfD0gKDB4MDAxMCA8PCAoaXJxIC0gTE9DT01PX0lSUV9TVEFSVCkpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19JQ1IpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgbG9jb21vX2NoaXAgPSB7CisJLmFjawk9IGxvY29tb19hY2tfaXJxLAorCS5tYXNrCT0gbG9jb21vX21hc2tfaXJxLAorCS51bm1hc2sJPSBsb2NvbW9fdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyB2b2lkIGxvY29tb19rZXlfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXJxZGVzYyAqZDsKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCisJaWYgKGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQykgJiAweDAwMDEpIHsKKwkJZCA9IGlycV9kZXNjICsgTE9DT01PX0lSUV9LRVlfU1RBUlQ7CisJCWQtPmhhbmRsZShMT0NPTU9fSVJRX0tFWV9TVEFSVCwgZCwgcmVncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBsb2NvbW9fa2V5X2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpOworCXIgJj0gfigweDAxMDAgPDwgKGlycSAtIExPQ09NT19JUlFfS0VZX1NUQVJUKSk7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQyk7Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19rZXlfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpOworCXIgJj0gfigweDAwMTAgPDwgKGlycSAtIExPQ09NT19JUlFfS0VZX1NUQVJUKSk7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQyk7Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19rZXlfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXZvaWQgKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdW5zaWduZWQgaW50IHI7CisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQyk7CisJciB8PSAoMHgwMDEwIDw8IChpcnEgLSBMT0NPTU9fSVJRX0tFWV9TVEFSVCkpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgbG9jb21vX2tleV9jaGlwID0geworCS5hY2sJPSBsb2NvbW9fa2V5X2Fja19pcnEsCisJLm1hc2sJPSBsb2NvbW9fa2V5X21hc2tfaXJxLAorCS51bm1hc2sJPSBsb2NvbW9fa2V5X3VubWFza19pcnEsCit9OworCitzdGF0aWMgdm9pZCBsb2NvbW9fZ3Bpb19oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcmVxLCBpOworCXN0cnVjdCBpcnFkZXNjICpkOworCXZvaWQgKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisKKwlyZXEgPSAJbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fR0lSKSAmCisJCWxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0dQRCkgJgorCQkweGZmZmY7CisKKwlpZiAocmVxKSB7CisJCWlycSA9IExPQ09NT19JUlFfR1BJT19TVEFSVDsKKwkJZCA9IGlycV9kZXNjICsgTE9DT01PX0lSUV9HUElPX1NUQVJUOworCQlmb3IgKGkgPSAwOyBpIDw9IDE1OyBpKyssIGlycSsrLCBkKyspIHsKKwkJCWlmIChyZXEgJiAoMHgwMDAxIDw8IGkpKSB7CisJCQkJZC0+aGFuZGxlKGlycSwgZCwgcmVncyk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19ncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19HV0UpOworCXIgfD0gKDB4MDAwMSA8PCAoaXJxIC0gTE9DT01PX0lSUV9HUElPX1NUQVJUKSk7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0dXRSk7CisKKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fR0lTKTsKKwlyICY9IH4oMHgwMDAxIDw8IChpcnEgLSBMT0NPTU9fSVJRX0dQSU9fU1RBUlQpKTsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fR0lTKTsKKworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19HV0UpOworCXIgJj0gfigweDAwMDEgPDwgKGlycSAtIExPQ09NT19JUlFfR1BJT19TVEFSVCkpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19HV0UpOworfQorCitzdGF0aWMgdm9pZCBsb2NvbW9fZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXZvaWQgKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdW5zaWduZWQgaW50IHI7CisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0dJRSk7CisJciAmPSB+KDB4MDAwMSA8PCAoaXJxIC0gTE9DT01PX0lSUV9HUElPX1NUQVJUKSk7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0dJRSk7Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19ncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19HSUUpOworCXIgfD0gKDB4MDAwMSA8PCAoaXJxIC0gTE9DT01PX0lSUV9HUElPX1NUQVJUKSk7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0dJRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBsb2NvbW9fZ3Bpb19jaGlwID0geworCS5hY2sJPSBsb2NvbW9fZ3Bpb19hY2tfaXJxLAorCS5tYXNrCT0gbG9jb21vX2dwaW9fbWFza19pcnEsCisJLnVubWFzawk9IGxvY29tb19ncGlvX3VubWFza19pcnEsCit9OworCitzdGF0aWMgdm9pZCBsb2NvbW9fbHRfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpcnFkZXNjICpkOworCXZvaWQgKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisKKwlpZiAobG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fTFRJTlQpICYgMHgwMDAxKSB7CisJCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfTFRfU1RBUlQ7CisJCWQtPmhhbmRsZShMT0NPTU9fSVJRX0xUX1NUQVJULCBkLCByZWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19sdF9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdm9pZCAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl1bnNpZ25lZCBpbnQgcjsKKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fTFRJTlQpOworCXIgJj0gfigweDAxMDAgPDwgKGlycSAtIExPQ09NT19JUlFfTFRfU1RBUlQpKTsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fTFRJTlQpOworfQorCitzdGF0aWMgdm9pZCBsb2NvbW9fbHRfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19MVElOVCk7CisJciAmPSB+KDB4MDAxMCA8PCAoaXJxIC0gTE9DT01PX0lSUV9MVF9TVEFSVCkpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19MVElOVCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19sdF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdm9pZCAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl1bnNpZ25lZCBpbnQgcjsKKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fTFRJTlQpOworCXIgfD0gKDB4MDAxMCA8PCAoaXJxIC0gTE9DT01PX0lSUV9MVF9TVEFSVCkpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19MVElOVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBsb2NvbW9fbHRfY2hpcCA9IHsKKwkuYWNrCT0gbG9jb21vX2x0X2Fja19pcnEsCisJLm1hc2sJPSBsb2NvbW9fbHRfbWFza19pcnEsCisJLnVubWFzawk9IGxvY29tb19sdF91bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHZvaWQgbG9jb21vX3NwaV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByZXEsIGk7CisJc3RydWN0IGlycWRlc2MgKmQ7CisJdm9pZCAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKworCXJlcSA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX1NQSUlSKSAmIDB4MDAwRjsKKwlpZiAocmVxKSB7CisJCWlycSA9IExPQ09NT19JUlFfU1BJX1NUQVJUOworCQlkID0gaXJxX2Rlc2MgKyBpcnE7CisKKwkJZm9yIChpID0gMDsgaSA8PSAzOyBpKyssIGlycSsrLCBkKyspIHsKKwkJCWlmIChyZXEgJiAoMHgwMDAxIDw8IGkpKSB7CisJCQkJZC0+aGFuZGxlKGlycSwgZCwgcmVncyk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19zcGlfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXZvaWQgKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdW5zaWduZWQgaW50IHI7CisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX1NQSVdFKTsKKwlyIHw9ICgweDAwMDEgPDwgKGlycSAtIExPQ09NT19JUlFfU1BJX1NUQVJUKSk7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX1NQSVdFKTsKKworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19TUElJUyk7CisJciAmPSB+KDB4MDAwMSA8PCAoaXJxIC0gTE9DT01PX0lSUV9TUElfU1RBUlQpKTsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fU1BJSVMpOworCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX1NQSVdFKTsKKwlyICY9IH4oMHgwMDAxIDw8IChpcnEgLSBMT0NPTU9fSVJRX1NQSV9TVEFSVCkpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19TUElXRSk7Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19zcGlfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19TUElJRSk7CisJciAmPSB+KDB4MDAwMSA8PCAoaXJxIC0gTE9DT01PX0lSUV9TUElfU1RBUlQpKTsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fU1BJSUUpOworfQorCitzdGF0aWMgdm9pZCBsb2NvbW9fc3BpX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGludCByOworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19TUElJRSk7CisJciB8PSAoMHgwMDAxIDw8IChpcnEgLSBMT0NPTU9fSVJRX1NQSV9TVEFSVCkpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19TUElJRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBsb2NvbW9fc3BpX2NoaXAgPSB7CisJLmFjawk9IGxvY29tb19zcGlfYWNrX2lycSwKKwkubWFzawk9IGxvY29tb19zcGlfbWFza19pcnEsCisJLnVubWFzawk9IGxvY29tb19zcGlfdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyB2b2lkIGxvY29tb19zZXR1cF9pcnEoc3RydWN0IGxvY29tbyAqbGNoaXApCit7CisJaW50IGlycTsKKwl2b2lkICppcnFiYXNlID0gbGNoaXAtPmJhc2U7CisKKwkvKgorCSAqIEluc3RhbGwgaGFuZGxlciBmb3IgSVJRX0xPQ09NT19IVy4KKwkgKi8KKwlzZXRfaXJxX3R5cGUobGNoaXAtPmlycSwgSVJRVF9GQUxMSU5HKTsKKwlzZXRfaXJxX2NoaXBkYXRhKGxjaGlwLT5pcnEsIGlycWJhc2UpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGxjaGlwLT5pcnEsIGxvY29tb19oYW5kbGVyKTsKKworCS8qIEluc3RhbGwgaGFuZGxlcnMgZm9yIElSUV9MT0NPTU9fKl9CQVNFICovCisJc2V0X2lycV9jaGlwKElSUV9MT0NPTU9fS0VZX0JBU0UsICZsb2NvbW9fY2hpcCk7CisJc2V0X2lycV9jaGlwZGF0YShJUlFfTE9DT01PX0tFWV9CQVNFLCBpcnFiYXNlKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTE9DT01PX0tFWV9CQVNFLCBsb2NvbW9fa2V5X2hhbmRsZXIpOworCXNldF9pcnFfZmxhZ3MoSVJRX0xPQ09NT19LRVlfQkFTRSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCisJc2V0X2lycV9jaGlwKElSUV9MT0NPTU9fR1BJT19CQVNFLCAmbG9jb21vX2NoaXApOworCXNldF9pcnFfY2hpcGRhdGEoSVJRX0xPQ09NT19HUElPX0JBU0UsIGlycWJhc2UpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9MT0NPTU9fR1BJT19CQVNFLCBsb2NvbW9fZ3Bpb19oYW5kbGVyKTsKKwlzZXRfaXJxX2ZsYWdzKElSUV9MT0NPTU9fR1BJT19CQVNFLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisKKwlzZXRfaXJxX2NoaXAoSVJRX0xPQ09NT19MVF9CQVNFLCAmbG9jb21vX2NoaXApOworCXNldF9pcnFfY2hpcGRhdGEoSVJRX0xPQ09NT19MVF9CQVNFLCBpcnFiYXNlKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTE9DT01PX0xUX0JBU0UsIGxvY29tb19sdF9oYW5kbGVyKTsKKwlzZXRfaXJxX2ZsYWdzKElSUV9MT0NPTU9fTFRfQkFTRSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCisJc2V0X2lycV9jaGlwKElSUV9MT0NPTU9fU1BJX0JBU0UsICZsb2NvbW9fY2hpcCk7CisJc2V0X2lycV9jaGlwZGF0YShJUlFfTE9DT01PX1NQSV9CQVNFLCBpcnFiYXNlKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTE9DT01PX1NQSV9CQVNFLCBsb2NvbW9fc3BpX2hhbmRsZXIpOworCXNldF9pcnFfZmxhZ3MoSVJRX0xPQ09NT19TUElfQkFTRSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCisJLyogaW5zdGFsbCBoYW5kbGVycyBmb3IgSVJRX0xPQ09NT19LRVlfQkFTRSBnZW5lcmF0ZWQgaW50ZXJydXB0cyAqLworCXNldF9pcnFfY2hpcChMT0NPTU9fSVJRX0tFWV9TVEFSVCwgJmxvY29tb19rZXlfY2hpcCk7CisJc2V0X2lycV9jaGlwZGF0YShMT0NPTU9fSVJRX0tFWV9TVEFSVCwgaXJxYmFzZSk7CisJc2V0X2lycV9oYW5kbGVyKExPQ09NT19JUlFfS0VZX1NUQVJULCBkb19lZGdlX0lSUSk7CisJc2V0X2lycV9mbGFncyhMT0NPTU9fSVJRX0tFWV9TVEFSVCwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCisJLyogaW5zdGFsbCBoYW5kbGVycyBmb3IgSVJRX0xPQ09NT19HUElPX0JBU0UgZ2VuZXJhdGVkIGludGVycnVwdHMgKi8KKwlmb3IgKGlycSA9IExPQ09NT19JUlFfR1BJT19TVEFSVDsgaXJxIDwgTE9DT01PX0lSUV9HUElPX1NUQVJUICsgMTY7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZsb2NvbW9fZ3Bpb19jaGlwKTsKKwkJc2V0X2lycV9jaGlwZGF0YShpcnEsIGlycWJhc2UpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJLyogaW5zdGFsbCBoYW5kbGVycyBmb3IgSVJRX0xPQ09NT19MVF9CQVNFIGdlbmVyYXRlZCBpbnRlcnJ1cHRzICovCisJc2V0X2lycV9jaGlwKExPQ09NT19JUlFfTFRfU1RBUlQsICZsb2NvbW9fbHRfY2hpcCk7CisJc2V0X2lycV9jaGlwZGF0YShMT0NPTU9fSVJRX0xUX1NUQVJULCBpcnFiYXNlKTsKKwlzZXRfaXJxX2hhbmRsZXIoTE9DT01PX0lSUV9MVF9TVEFSVCwgZG9fZWRnZV9JUlEpOworCXNldF9pcnFfZmxhZ3MoTE9DT01PX0lSUV9MVF9TVEFSVCwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCisJLyogaW5zdGFsbCBoYW5kbGVycyBmb3IgSVJRX0xPQ09NT19TUElfQkFTRSBnZW5lcmF0ZWQgaW50ZXJydXB0cyAqLworCWZvciAoaXJxID0gTE9DT01PX0lSUV9TUElfU1RBUlQ7IGlycSA8IExPQ09NT19JUlFfU1BJX1NUQVJUICsgMzsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJmxvY29tb19zcGlfY2hpcCk7CisJCXNldF9pcnFfY2hpcGRhdGEoaXJxLCBpcnFiYXNlKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBsb2NvbW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgbG9jb21vX2RldiAqZGV2ID0gTE9DT01PX0RFVihfZGV2KTsKKworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQKK2xvY29tb19pbml0X29uZV9jaGlsZChzdHJ1Y3QgbG9jb21vICpsY2hpcCwgc3RydWN0IGxvY29tb19kZXZfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbG9jb21vX2RldiAqZGV2OworCWludCByZXQ7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9jb21vX2RldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IGxvY29tb19kZXYpKTsKKworCXN0cm5jcHkoZGV2LT5kZXYuYnVzX2lkLGluZm8tPm5hbWUsc2l6ZW9mKGRldi0+ZGV2LmJ1c19pZCkpOworCS8qCisJICogSWYgdGhlIHBhcmVudCBkZXZpY2UgaGFzIGEgRE1BIG1hc2sgYXNzb2NpYXRlZCB3aXRoIGl0LAorCSAqIHByb3BhZ2F0ZSBpdCBkb3duIHRvIHRoZSBjaGlsZHJlbi4KKwkgKi8KKwlpZiAobGNoaXAtPmRldi0+ZG1hX21hc2spIHsKKwkJZGV2LT5kbWFfbWFzayA9ICpsY2hpcC0+ZGV2LT5kbWFfbWFzazsKKwkJZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5kbWFfbWFzazsKKwl9CisKKwlkZXYtPmRldmlkCSA9IGluZm8tPmRldmlkOworCWRldi0+ZGV2LnBhcmVudCAgPSBsY2hpcC0+ZGV2OworCWRldi0+ZGV2LmJ1cyAgICAgPSAmbG9jb21vX2J1c190eXBlOworCWRldi0+ZGV2LnJlbGVhc2UgPSBsb2NvbW9fZGV2X3JlbGVhc2U7CisJZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBsY2hpcC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKKworCWlmIChpbmZvLT5vZmZzZXQpCisJCWRldi0+bWFwYmFzZSA9IGxjaGlwLT5iYXNlICsgaW5mby0+b2Zmc2V0OworCWVsc2UKKwkJZGV2LT5tYXBiYXNlID0gMDsKKwlkZXYtPmxlbmd0aCA9IGluZm8tPmxlbmd0aDsKKworCW1lbW1vdmUoZGV2LT5pcnEsIGluZm8tPmlycSwgc2l6ZW9mKGRldi0+aXJxKSk7CisKKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwlpZiAocmV0KSB7Cisgb3V0OgorCQlrZnJlZShkZXYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCWxvY29tb19wcm9iZSAtIHByb2JlIGZvciBhIHNpbmdsZSBMb0NvTW8gY2hpcC4KKyAqCUBwaHlzX2FkZHI6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGV2aWNlLgorICoKKyAqCVByb2JlIGZvciBhIExvQ29NbyBjaGlwLiAgVGhpcyBtdXN0IGJlIGNhbGxlZAorICoJYmVmb3JlIGFueSBvdGhlciBsb2NvbW8tc3BlY2lmaWMgY29kZS4KKyAqCisgKglSZXR1cm5zOgorICoJJS1FTk9ERVYJZGV2aWNlIG5vdCBmb3VuZC4KKyAqCSUtRUJVU1kJCXBoeXNpY2FsIGFkZHJlc3MgYWxyZWFkeSBtYXJrZWQgaW4tdXNlLgorICoJJTAJCXN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQKK19fbG9jb21vX3Byb2JlKHN0cnVjdCBkZXZpY2UgKm1lLCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbG9jb21vICpsY2hpcDsKKwl1bnNpZ25lZCBsb25nIHI7CisJaW50IGksIHJldCA9IC1FTk9ERVY7CisKKwlsY2hpcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NvbW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxjaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChsY2hpcCwgMCwgc2l6ZW9mKHN0cnVjdCBsb2NvbW8pKTsKKworCXNwaW5fbG9ja19pbml0KCZsY2hpcC0+bG9jayk7CisKKwlsY2hpcC0+ZGV2ID0gbWU7CisJZGV2X3NldF9kcnZkYXRhKGxjaGlwLT5kZXYsIGxjaGlwKTsKKworCWxjaGlwLT5waHlzID0gbWVtLT5zdGFydDsKKwlsY2hpcC0+aXJxID0gaXJxOworCisJLyoKKwkgKiBNYXAgdGhlIHdob2xlIHJlZ2lvbi4gIFRoaXMgYWxzbyBtYXBzIHRoZQorCSAqIHJlZ2lzdGVycyBmb3Igb3VyIGNoaWxkcmVuLgorCSAqLworCWxjaGlwLT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBQQUdFX1NJWkUpOworCWlmICghbGNoaXAtPmJhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogbG9jb21vIGluaXRpYWxpemUgKi8KKwlsb2NvbW9fd3JpdGVsKDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0lDUik7CisJLyogS0VZQk9BUkQgKi8KKwlsb2NvbW9fd3JpdGVsKDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQyk7CisKKwkvKiBHUElPICovCisJbG9jb21vX3dyaXRlbCgwLCBsY2hpcC0+YmFzZSArIExPQ09NT19HUE8pOworCWxvY29tb193cml0ZWwoIChMT0NPTU9fR1BJTygyKSB8IExPQ09NT19HUElPKDMpIHwgTE9DT01PX0dQSU8oMTMpIHwgTE9DT01PX0dQSU8oMTQpKQorCQkJLCBsY2hpcC0+YmFzZSArIExPQ09NT19HUEUpOworCWxvY29tb193cml0ZWwoIChMT0NPTU9fR1BJTygyKSB8IExPQ09NT19HUElPKDMpIHwgTE9DT01PX0dQSU8oMTMpIHwgTE9DT01PX0dQSU8oMTQpKQorCQkJLCBsY2hpcC0+YmFzZSArIExPQ09NT19HUEQpOworCWxvY29tb193cml0ZWwoMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fR0lFKTsKKworCS8qIEZyb250TGlnaHQgKi8KKwlsb2NvbW9fd3JpdGVsKDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0ZST05UTElHSFQgKyBMT0NPTU9fQUxTKTsKKwlsb2NvbW9fd3JpdGVsKDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0ZST05UTElHSFQgKyBMT0NPTU9fQUxEKTsKKwkvKiBMb25ndGltZSB0aW1lciAqLworCWxvY29tb193cml0ZWwoMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fTFRJTlQpOworCS8qIFNQSSAqLworCWxvY29tb193cml0ZWwoMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fU1BJSUUpOworCisJbG9jb21vX3dyaXRlbCg2ICsgOCArIDMyMCArIDMwIC0gMTAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0FTRCk7CisJciA9IGxvY29tb19yZWFkbChsY2hpcC0+YmFzZSArIExPQ09NT19BU0QpOworCXIgfD0gMHg4MDAwOworCWxvY29tb193cml0ZWwociwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fQVNEKTsKKworCWxvY29tb193cml0ZWwoNiArIDggKyAzMjAgKyAzMCAtIDEwIC0gMTI4ICsgNCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fSFNEKTsKKwlyID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0hTRCk7CisJciB8PSAweDgwMDA7CisJbG9jb21vX3dyaXRlbChyLCBsY2hpcC0+YmFzZSArIExPQ09NT19IU0QpOworCisJbG9jb21vX3dyaXRlbCgxMjggLyA4LCBsY2hpcC0+YmFzZSArIExPQ09NT19IU0MpOworCisJLyogWE9OICovCisJbG9jb21vX3dyaXRlbCgweDgwLCBsY2hpcC0+YmFzZSArIExPQ09NT19UQURDKTsKKwl1ZGVsYXkoMTAwMCk7CisJLyogQ0xLOU1FTiAqLworCXIgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fVEFEQyk7CisJciB8PSAweDEwOworCWxvY29tb193cml0ZWwociwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fVEFEQyk7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBpbml0IERBQyAqLworCXIgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fREFDKTsKKwlyIHw9IExPQ09NT19EQUNfU0NMT0VCIHwgTE9DT01PX0RBQ19TREFPRUI7CisJbG9jb21vX3dyaXRlbChyLCBsY2hpcC0+YmFzZSArIExPQ09NT19EQUMpOworCisJciA9IGxvY29tb19yZWFkbChsY2hpcC0+YmFzZSArIExPQ09NT19WRVIpOworCXByaW50ayhLRVJOX0lORk8gIkxvQ29NbyBDaGlwOiAlbHUlbHVcbiIsIChyID4+IDgpLCAociAmIDB4ZmYpKTsKKworCS8qCisJICogVGhlIGludGVycnVwdCBjb250cm9sbGVyIG11c3QgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGFueQorCSAqIG90aGVyIGRldmljZSB0byBlbnN1cmUgdGhhdCB0aGUgaW50ZXJydXB0cyBhcmUgYXZhaWxhYmxlLgorCSAqLworCWlmIChsY2hpcC0+aXJxICE9IE5PX0lSUSkKKwkJbG9jb21vX3NldHVwX2lycShsY2hpcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsb2NvbW9fZGV2aWNlcyk7IGkrKykKKwkJbG9jb21vX2luaXRfb25lX2NoaWxkKGxjaGlwLCAmbG9jb21vX2RldmljZXNbaV0pOworCisJcmV0dXJuIDA7CisKKyBvdXQ6CisJa2ZyZWUobGNoaXApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fbG9jb21vX3JlbW92ZShzdHJ1Y3QgbG9jb21vICpsY2hpcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmbGNoaXAtPmRldi0+Y2hpbGRyZW4pIHsKKwkJc3RydWN0IGRldmljZSAqZCA9IGxpc3RfdG9fZGV2KGwpOworCisJCWRldmljZV91bnJlZ2lzdGVyKGQpOworCX0KKworCWlmIChsY2hpcC0+aXJxICE9IE5PX0lSUSkgeworCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihsY2hpcC0+aXJxLCBOVUxMKTsKKwkJc2V0X2lycV9kYXRhKGxjaGlwLT5pcnEsIE5VTEwpOworCX0KKworCWlvdW5tYXAobGNoaXAtPmJhc2UpOworCWtmcmVlKGxjaGlwKTsKK30KKworc3RhdGljIGludCBsb2NvbW9fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlpbnQgaXJxOworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCXJldHVybiBfX2xvY29tb19wcm9iZShkZXYsIG1lbSwgaXJxKTsKK30KKworc3RhdGljIGludCBsb2NvbW9fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbG9jb21vICpsY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGxjaGlwKSB7CisJCV9fbG9jb21vX3JlbW92ZShsY2hpcCk7CisJCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgb24gdGhlIHN5c3RlbSBidXMgb3Igbm90IHlldC4KKyAqCVdlIHJlYWxseSB3YW50IHNvbWUgd2F5IHRvIHJlZ2lzdGVyIGEgc3lzdGVtIGRldmljZSBhdAorICoJdGhlIHBlci1tYWNoaW5lIGxldmVsLCBhbmQgdGhlbiBoYXZlIHRoaXMgZHJpdmVyIHBpY2sKKyAqCXVwIHRoZSByZWdpc3RlcmVkIGRldmljZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBsb2NvbW9fZGV2aWNlX2RyaXZlciA9IHsKKwkubmFtZQkJPSAibG9jb21vIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gbG9jb21vX3Byb2JlLAorCS5yZW1vdmUJCT0gbG9jb21vX3JlbW92ZSwKK307CisKKy8qCisgKglHZXQgdGhlIHBhcmVudCBkZXZpY2UgZHJpdmVyICh1cykgc3RydWN0dXJlCisgKglmcm9tIGEgY2hpbGQgZnVuY3Rpb24gZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxvY29tbyAqbG9jb21vX2NoaXBfZHJpdmVyKHN0cnVjdCBsb2NvbW9fZGV2ICpsZGV2KQoreworCXJldHVybiAoc3RydWN0IGxvY29tbyAqKWRldl9nZXRfZHJ2ZGF0YShsZGV2LT5kZXYucGFyZW50KTsKK30KKwordm9pZCBsb2NvbW9fZ3Bpb19zZXRfZGlyKHN0cnVjdCBsb2NvbW9fZGV2ICpsZGV2LCB1bnNpZ25lZCBpbnQgYml0cywgdW5zaWduZWQgaW50IGRpcikKK3sKKwlzdHJ1Y3QgbG9jb21vICpsY2hpcCA9IGxvY29tb19jaGlwX2RyaXZlcihsZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7CisKKwlyID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0dQRCk7CisJciAmPSB+Yml0czsKKwlsb2NvbW9fd3JpdGVsKHIsIGxjaGlwLT5iYXNlICsgTE9DT01PX0dQRCk7CisKKwlyID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0dQRSk7CisJaWYgKGRpcikKKwkJciB8PSBiaXRzOworCWVsc2UKKwkJciAmPSB+Yml0czsKKwlsb2NvbW9fd3JpdGVsKHIsIGxjaGlwLT5iYXNlICsgTE9DT01PX0dQRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCit1bnNpZ25lZCBpbnQgbG9jb21vX2dwaW9fcmVhZF9sZXZlbChzdHJ1Y3QgbG9jb21vX2RldiAqbGRldiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJc3RydWN0IGxvY29tbyAqbGNoaXAgPSBsb2NvbW9fY2hpcF9kcml2ZXIobGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0dQTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCXJldCAmPSBiaXRzOworCXJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGludCBsb2NvbW9fZ3Bpb19yZWFkX291dHB1dChzdHJ1Y3QgbG9jb21vX2RldiAqbGRldiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJc3RydWN0IGxvY29tbyAqbGNoaXAgPSBsb2NvbW9fY2hpcF9kcml2ZXIobGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0dQTyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCXJldCAmPSBiaXRzOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbG9jb21vX2dwaW9fd3JpdGUoc3RydWN0IGxvY29tb19kZXYgKmxkZXYsIHVuc2lnbmVkIGludCBiaXRzLCB1bnNpZ25lZCBpbnQgc2V0KQoreworCXN0cnVjdCBsb2NvbW8gKmxjaGlwID0gbG9jb21vX2NoaXBfZHJpdmVyKGxkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCXIgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fR1BPKTsKKwlpZiAoc2V0KQorCQlyIHw9IGJpdHM7CisJZWxzZQorCQlyICY9IH5iaXRzOworCWxvY29tb193cml0ZWwociwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fR1BPKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGxvY29tb19tNjIzMzJfc2VuZGJpdCh2b2lkICptYXBiYXNlLCBpbnQgYml0KQoreworCXVuc2lnbmVkIGludCByOworCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciAmPSAgfihMT0NPTU9fREFDX1NDTE9FQik7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19MT1dfU0VUVVBfVElNRSk7CS8qIDMwMCBuc2VjICovCisJdWRlbGF5KERBQ19EQVRBX0hPTERfVElNRSk7CS8qIDMwMCBuc2VjICovCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciAmPSAgfihMT0NPTU9fREFDX1NDTE9FQik7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19MT1dfU0VUVVBfVElNRSk7CS8qIDMwMCBuc2VjICovCisJdWRlbGF5KERBQ19TQ0xfTE9XX0hPTERfVElNRSk7CS8qIDQuNyB1c2VjICovCisKKwlpZiAoYml0ICYgMSkgeworCQlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwkJciB8PSAgTE9DT01PX0RBQ19TREFPRUI7CisJCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19EQUMpOworCQl1ZGVsYXkoREFDX0hJR0hfU0VUVVBfVElNRSk7CS8qIDEwMDAgbnNlYyAqLworCX0gZWxzZSB7CisJCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19EQUMpOworCQlyICY9ICB+KExPQ09NT19EQUNfU0RBT0VCKTsKKwkJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJCXVkZWxheShEQUNfTE9XX1NFVFVQX1RJTUUpOwkvKiAzMDAgbnNlYyAqLworCX0KKworCXVkZWxheShEQUNfREFUQV9TRVRVUF9USU1FKTsJLyogMjUwIG5zZWMgKi8KKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwlyIHw9ICBMT0NPTU9fREFDX1NDTE9FQjsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwl1ZGVsYXkoREFDX0hJR0hfU0VUVVBfVElNRSk7CS8qIDEwMDAgbnNlYyAqLworCXVkZWxheShEQUNfU0NMX0hJR0hfSE9MRF9USU1FKTsJLyogIDQuMCB1c2VjICovCit9CisKK3ZvaWQgbG9jb21vX202MjMzMl9zZW5kZGF0YShzdHJ1Y3QgbG9jb21vX2RldiAqbGRldiwgdW5zaWduZWQgaW50IGRhY19kYXRhLCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgbG9jb21vICpsY2hpcCA9IGxvY29tb19jaGlwX2RyaXZlcihsZGV2KTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJdW5zaWduZWQgaW50IHI7CisJdm9pZCAqbWFwYmFzZSA9IGxjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFN0YXJ0ICovCisJdWRlbGF5KERBQ19CVVNfRlJFRV9USU1FKTsJLyogNS4wIHVzZWMgKi8KKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwlyIHw9ICBMT0NPTU9fREFDX1NDTE9FQiB8IExPQ09NT19EQUNfU0RBT0VCOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19EQUMpOworCXVkZWxheShEQUNfSElHSF9TRVRVUF9USU1FKTsJLyogMTAwMCBuc2VjICovCisJdWRlbGF5KERBQ19TQ0xfSElHSF9IT0xEX1RJTUUpOwkvKiA0LjAgdXNlYyAqLworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19EQUMpOworCXIgJj0gIH4oTE9DT01PX0RBQ19TREFPRUIpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19EQUMpOworCXVkZWxheShEQUNfU1RBUlRfSE9MRF9USU1FKTsJLyogNS4wIHVzZWMgKi8KKwl1ZGVsYXkoREFDX0RBVEFfSE9MRF9USU1FKTsJLyogMzAwIG5zZWMgKi8KKworCS8qIFNlbmQgc2xhdmUgYWRkcmVzcyBhbmQgVyBiaXQgKExTQiBpcyBXIGJpdCkgKi8KKwlkYXRhID0gKE02MjMzMl9TTEFWRV9BRERSIDw8IDEpIHwgTTYyMzMyX1dfQklUOworCWZvciAoaSA9IDE7IGkgPD0gODsgaSsrKSB7CisJCWxvY29tb19tNjIzMzJfc2VuZGJpdChtYXBiYXNlLCBkYXRhID4+ICg4IC0gaSkpOworCX0KKworCS8qIENoZWNrIEEgYml0ICovCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciAmPSAgfihMT0NPTU9fREFDX1NDTE9FQik7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19MT1dfU0VUVVBfVElNRSk7CS8qIDMwMCBuc2VjICovCisJdWRlbGF5KERBQ19TQ0xfTE9XX0hPTERfVElNRSk7CS8qIDQuNyB1c2VjICovCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciAmPSAgfihMT0NPTU9fREFDX1NEQU9FQik7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19MT1dfU0VUVVBfVElNRSk7CS8qIDMwMCBuc2VjICovCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciB8PSAgTE9DT01PX0RBQ19TQ0xPRUI7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19ISUdIX1NFVFVQX1RJTUUpOwkvKiAxMDAwIG5zZWMgKi8KKwl1ZGVsYXkoREFDX1NDTF9ISUdIX0hPTERfVElNRSk7CS8qIDQuNyB1c2VjICovCisJaWYgKGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQykgJiBMT0NPTU9fREFDX1NEQU9FQikgewkvKiBIaWdoIGlzIGVycm9yICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY29tbzogbTYyMzMyX3NlbmRkYXRhIEVycm9yIDFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogU2VuZCBTdWIgYWRkcmVzcyAoTFNCIGlzIGNoYW5uZWwgc2VsZWN0KSAqLworCS8qICAgIGNoYW5uZWwgPSAwIDogY2gxIHNlbGVjdCAgICAgICAgICAgICAgKi8KKwkvKiAgICAgICAgICAgID0gMSA6IGNoMiBzZWxlY3QgICAgICAgICAgICAgICovCisJZGF0YSA9IE02MjMzMl9TVUJfQUREUiArIGNoYW5uZWw7CisJZm9yIChpID0gMTsgaSA8PSA4OyBpKyspIHsKKwkJbG9jb21vX202MjMzMl9zZW5kYml0KG1hcGJhc2UsIGRhdGEgPj4gKDggLSBpKSk7CisJfQorCisJLyogQ2hlY2sgQSBiaXQgKi8KKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwlyICY9ICB+KExPQ09NT19EQUNfU0NMT0VCKTsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwl1ZGVsYXkoREFDX0xPV19TRVRVUF9USU1FKTsJLyogMzAwIG5zZWMgKi8KKwl1ZGVsYXkoREFDX1NDTF9MT1dfSE9MRF9USU1FKTsJLyogNC43IHVzZWMgKi8KKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwlyICY9ICB+KExPQ09NT19EQUNfU0RBT0VCKTsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwl1ZGVsYXkoREFDX0xPV19TRVRVUF9USU1FKTsJLyogMzAwIG5zZWMgKi8KKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwlyIHw9ICBMT0NPTU9fREFDX1NDTE9FQjsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwl1ZGVsYXkoREFDX0hJR0hfU0VUVVBfVElNRSk7CS8qIDEwMDAgbnNlYyAqLworCXVkZWxheShEQUNfU0NMX0hJR0hfSE9MRF9USU1FKTsJLyogNC43IHVzZWMgKi8KKwlpZiAobG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKSAmIExPQ09NT19EQUNfU0RBT0VCKSB7CS8qIEhpZ2ggaXMgZXJyb3IgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9jb21vOiBtNjIzMzJfc2VuZGRhdGEgRXJyb3IgMlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBTZW5kIERBQyBkYXRhICovCisJZm9yIChpID0gMTsgaSA8PSA4OyBpKyspIHsKKwkJbG9jb21vX202MjMzMl9zZW5kYml0KG1hcGJhc2UsIGRhY19kYXRhID4+ICg4IC0gaSkpOworCX0KKworCS8qIENoZWNrIEEgYml0ICovCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciAmPSAgfihMT0NPTU9fREFDX1NDTE9FQik7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19MT1dfU0VUVVBfVElNRSk7CS8qIDMwMCBuc2VjICovCisJdWRlbGF5KERBQ19TQ0xfTE9XX0hPTERfVElNRSk7CS8qIDQuNyB1c2VjICovCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciAmPSAgfihMT0NPTU9fREFDX1NEQU9FQik7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19MT1dfU0VUVVBfVElNRSk7CS8qIDMwMCBuc2VjICovCisJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJciB8PSAgTE9DT01PX0RBQ19TQ0xPRUI7CisJbG9jb21vX3dyaXRlbChyLCBtYXBiYXNlICsgTE9DT01PX0RBQyk7CisJdWRlbGF5KERBQ19ISUdIX1NFVFVQX1RJTUUpOwkvKiAxMDAwIG5zZWMgKi8KKwl1ZGVsYXkoREFDX1NDTF9ISUdIX0hPTERfVElNRSk7CS8qIDQuNyB1c2VjICovCisJaWYgKGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0RBQykgJiBMT0NPTU9fREFDX1NEQU9FQikgewkvKiBIaWdoIGlzIGVycm9yICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY29tbzogbTYyMzMyX3NlbmRkYXRhIEVycm9yIDNcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc3RvcCAqLworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19EQUMpOworCXIgJj0gIH4oTE9DT01PX0RBQ19TQ0xPRUIpOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19EQUMpOworCXVkZWxheShEQUNfTE9XX1NFVFVQX1RJTUUpOwkvKiAzMDAgbnNlYyAqLworCXVkZWxheShEQUNfU0NMX0xPV19IT0xEX1RJTUUpOwkvKiA0LjcgdXNlYyAqLworCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19EQUMpOworCXIgfD0gIExPQ09NT19EQUNfU0NMT0VCOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19EQUMpOworCXVkZWxheShEQUNfSElHSF9TRVRVUF9USU1FKTsJLyogMTAwMCBuc2VjICovCisJdWRlbGF5KERBQ19TQ0xfSElHSF9IT0xEX1RJTUUpOwkvKiA0IHVzZWMgKi8KKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwlyIHw9ICBMT0NPTU9fREFDX1NEQU9FQjsKKwlsb2NvbW9fd3JpdGVsKHIsIG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwl1ZGVsYXkoREFDX0hJR0hfU0VUVVBfVElNRSk7CS8qIDEwMDAgbnNlYyAqLworCXVkZWxheShEQUNfU0NMX0hJR0hfSE9MRF9USU1FKTsJLyogNCB1c2VjICovCisKKwlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fREFDKTsKKwlyIHw9ICBMT0NPTU9fREFDX1NDTE9FQiB8IExPQ09NT19EQUNfU0RBT0VCOworCWxvY29tb193cml0ZWwociwgbWFwYmFzZSArIExPQ09NT19EQUMpOworCXVkZWxheShEQUNfTE9XX1NFVFVQX1RJTUUpOwkvKiAxMDAwIG5zZWMgKi8KKwl1ZGVsYXkoREFDX1NDTF9MT1dfSE9MRF9USU1FKTsJLyogNC43IHVzZWMgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKglMb0NvTW8gIlJlZ2lzdGVyIEFjY2VzcyBCdXMuIgorICoKKyAqCVdlIG1vZGVsIHRoaXMgYXMgYSByZWd1bGFyIGJ1cyB0eXBlLCBhbmQgaGFuZyBkZXZpY2VzIGRpcmVjdGx5CisgKglvZmYgdGhpcy4KKyAqLworc3RhdGljIGludCBsb2NvbW9fbWF0Y2goc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCit7CisJc3RydWN0IGxvY29tb19kZXYgKmRldiA9IExPQ09NT19ERVYoX2Rldik7CisJc3RydWN0IGxvY29tb19kcml2ZXIgKmRydiA9IExPQ09NT19EUlYoX2Rydik7CisKKwlyZXR1cm4gZGV2LT5kZXZpZCA9PSBkcnYtPmRldmlkOworfQorCitzdGF0aWMgaW50IGxvY29tb19idXNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbG9jb21vX2RldiAqbGRldiA9IExPQ09NT19ERVYoZGV2KTsKKwlzdHJ1Y3QgbG9jb21vX2RyaXZlciAqZHJ2ID0gTE9DT01PX0RSVihkZXYtPmRyaXZlcik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZHJ2ICYmIGRydi0+c3VzcGVuZCkKKwkJcmV0ID0gZHJ2LT5zdXNwZW5kKGxkZXYsIHN0YXRlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxvY29tb19idXNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbG9jb21vX2RldiAqbGRldiA9IExPQ09NT19ERVYoZGV2KTsKKwlzdHJ1Y3QgbG9jb21vX2RyaXZlciAqZHJ2ID0gTE9DT01PX0RSVihkZXYtPmRyaXZlcik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZHJ2ICYmIGRydi0+cmVzdW1lKQorCQlyZXQgPSBkcnYtPnJlc3VtZShsZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxvY29tb19idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBsb2NvbW9fZGV2ICpsZGV2ID0gTE9DT01PX0RFVihkZXYpOworCXN0cnVjdCBsb2NvbW9fZHJpdmVyICpkcnYgPSBMT0NPTU9fRFJWKGRldi0+ZHJpdmVyKTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmIChkcnYtPnByb2JlKQorCQlyZXQgPSBkcnYtPnByb2JlKGxkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbG9jb21vX2J1c19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBsb2NvbW9fZGV2ICpsZGV2ID0gTE9DT01PX0RFVihkZXYpOworCXN0cnVjdCBsb2NvbW9fZHJpdmVyICpkcnYgPSBMT0NPTU9fRFJWKGRldi0+ZHJpdmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkcnYtPnJlbW92ZSkKKwkJcmV0ID0gZHJ2LT5yZW1vdmUobGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGJ1c190eXBlIGxvY29tb19idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAibG9jb21vLWJ1cyIsCisJLm1hdGNoCQk9IGxvY29tb19tYXRjaCwKKwkuc3VzcGVuZAk9IGxvY29tb19idXNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGxvY29tb19idXNfcmVzdW1lLAorfTsKKworaW50IGxvY29tb19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGxvY29tb19kcml2ZXIgKmRyaXZlcikKK3sKKwlkcml2ZXItPmRydi5wcm9iZSA9IGxvY29tb19idXNfcHJvYmU7CisJZHJpdmVyLT5kcnYucmVtb3ZlID0gbG9jb21vX2J1c19yZW1vdmU7CisJZHJpdmVyLT5kcnYuYnVzID0gJmxvY29tb19idXNfdHlwZTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRydik7Cit9CisKK3ZvaWQgbG9jb21vX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBsb2NvbW9fZHJpdmVyICpkcml2ZXIpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgbG9jb21vX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gYnVzX3JlZ2lzdGVyKCZsb2NvbW9fYnVzX3R5cGUpOworCWlmIChyZXQgPT0gMCkKKwkJZHJpdmVyX3JlZ2lzdGVyKCZsb2NvbW9fZGV2aWNlX2RyaXZlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxvY29tb19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmxvY29tb19kZXZpY2VfZHJpdmVyKTsKKwlidXNfdW5yZWdpc3RlcigmbG9jb21vX2J1c190eXBlKTsKK30KKworbW9kdWxlX2luaXQobG9jb21vX2luaXQpOworbW9kdWxlX2V4aXQobG9jb21vX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNoYXJwIExvQ29NbyBjb3JlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSm9obiBMZW56IDxsZW56QGNzLndpc2MuZWR1PiIpOworCitFWFBPUlRfU1lNQk9MKGxvY29tb19kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChsb2NvbW9fZHJpdmVyX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChsb2NvbW9fZ3Bpb19zZXRfZGlyKTsKK0VYUE9SVF9TWU1CT0wobG9jb21vX2dwaW9fcmVhZF9sZXZlbCk7CitFWFBPUlRfU1lNQk9MKGxvY29tb19ncGlvX3JlYWRfb3V0cHV0KTsKK0VYUE9SVF9TWU1CT0wobG9jb21vX2dwaW9fd3JpdGUpOworRVhQT1JUX1NZTUJPTChsb2NvbW9fbTYyMzMyX3NlbmRkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMgYi9hcmNoL2FybS9jb21tb24vcnRjdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTdlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb21tb24vcnRjdGltZS5jCkBAIC0wLDAgKzEsNTA2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICogIEJhc2VkIG9uIHNhMTEwMC1ydGMuYywgTmlscyBGYWVyYmVyLCBDSUgsIE5pY29sYXMgUGl0cmUuCisgKiAgQmFzZWQgb24gcnRjLmMgYnkgUGF1bCBHb3J0bWFrZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vcnRjLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocnRjX3dhaXQpOworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpydGNfYXN5bmNfcXVldWU7CisKKy8qCisgKiBydGNfbG9jayBwcm90ZWN0cyBydGNfaXJxX2RhdGEKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfaXJxX2RhdGE7CisKKy8qCisgKiBydGNfc2VtIHByb3RlY3RzIHJ0Y19pbnVzZSBhbmQgcnRjX29wcworICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChydGNfc2VtKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19pbnVzZTsKK3N0YXRpYyBzdHJ1Y3QgcnRjX29wcyAqcnRjX29wczsKKworI2RlZmluZSBydGNfZXBvY2ggMTkwMFVMCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9udGhbXSA9IHsKKwkzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCit9OworCisjZGVmaW5lIExFQVBTX1RIUlVfRU5EX09GKHkpICgoeSkvNCAtICh5KS8xMDAgKyAoeSkvNDAwKQorI2RlZmluZSBMRUFQX1lFQVIoeWVhcikgKCghKHllYXIgJSA0KSAmJiAoeWVhciAlIDEwMCkpIHx8ICEoeWVhciAlIDQwMCkpCisKK3N0YXRpYyBpbnQgbW9udGhfZGF5cyh1bnNpZ25lZCBpbnQgbW9udGgsIHVuc2lnbmVkIGludCB5ZWFyKQoreworCXJldHVybiBkYXlzX2luX21vbnRoW21vbnRoXSArIChMRUFQX1lFQVIoeWVhcikgJiYgbW9udGggPT0gMSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IHNlY29uZHMgc2luY2UgMDEtMDEtMTk3MCAwMDowMDowMCB0byBHcmVnb3JpYW4gZGF0ZS4KKyAqLwordm9pZCBydGNfdGltZV90b190bSh1bnNpZ25lZCBsb25nIHRpbWUsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IGRheXMsIG1vbnRoLCB5ZWFyOworCisJZGF5cyA9IHRpbWUgLyA4NjQwMDsKKwl0aW1lIC09IGRheXMgKiA4NjQwMDsKKworCXRtLT50bV93ZGF5ID0gKGRheXMgKyA0KSAlIDc7CisKKwl5ZWFyID0gMTk3MCArIGRheXMgLyAzNjU7CisJZGF5cyAtPSAoeWVhciAtIDE5NzApICogMzY1CisJICAgICAgICArIExFQVBTX1RIUlVfRU5EX09GKHllYXIgLSAxKQorCSAgICAgICAgLSBMRUFQU19USFJVX0VORF9PRigxOTcwIC0gMSk7CisJaWYgKGRheXMgPCAwKSB7CisJCXllYXIgLT0gMTsKKwkJZGF5cyArPSAzNjUgKyBMRUFQX1lFQVIoeWVhcik7CisJfQorCXRtLT50bV95ZWFyID0geWVhciAtIDE5MDA7CisJdG0tPnRtX3lkYXkgPSBkYXlzICsgMTsKKworCWZvciAobW9udGggPSAwOyBtb250aCA8IDExOyBtb250aCsrKSB7CisJCWludCBuZXdkYXlzOworCisJCW5ld2RheXMgPSBkYXlzIC0gbW9udGhfZGF5cyhtb250aCwgeWVhcik7CisJCWlmIChuZXdkYXlzIDwgMCkKKwkJCWJyZWFrOworCQlkYXlzID0gbmV3ZGF5czsKKwl9CisJdG0tPnRtX21vbiA9IG1vbnRoOworCXRtLT50bV9tZGF5ID0gZGF5cyArIDE7CisKKwl0bS0+dG1faG91ciA9IHRpbWUgLyAzNjAwOworCXRpbWUgLT0gdG0tPnRtX2hvdXIgKiAzNjAwOworCXRtLT50bV9taW4gPSB0aW1lIC8gNjA7CisJdG0tPnRtX3NlYyA9IHRpbWUgLSB0bS0+dG1fbWluICogNjA7Cit9CitFWFBPUlRfU1lNQk9MKHJ0Y190aW1lX3RvX3RtKTsKKworLyoKKyAqIERvZXMgdGhlIHJ0Y190aW1lIHJlcHJlc2VudCBhIHZhbGlkIGRhdGUvdGltZT8KKyAqLworaW50IHJ0Y192YWxpZF90bShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWlmICh0bS0+dG1feWVhciA8IDcwIHx8CisJICAgIHRtLT50bV9tb24gPj0gMTIgfHwKKwkgICAgdG0tPnRtX21kYXkgPCAxIHx8CisJICAgIHRtLT50bV9tZGF5ID4gbW9udGhfZGF5cyh0bS0+dG1fbW9uLCB0bS0+dG1feWVhciArIDE5MDApIHx8CisJICAgIHRtLT50bV9ob3VyID49IDI0IHx8CisJICAgIHRtLT50bV9taW4gPj0gNjAgfHwKKwkgICAgdG0tPnRtX3NlYyA+PSA2MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocnRjX3ZhbGlkX3RtKTsKKworLyoKKyAqIENvbnZlcnQgR3JlZ29yaWFuIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSAwMS0wMS0xOTcwIDAwOjAwOjAwLgorICovCitpbnQgcnRjX3RtX3RvX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSwgdW5zaWduZWQgbG9uZyAqdGltZSkKK3sKKwkqdGltZSA9IG1rdGltZSh0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKKwkJICAgICAgIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChydGNfdG1fdG9fdGltZSk7CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG5leHQgYWxhcm0gdGltZSBnaXZlbiB0aGUgcmVxdWVzdGVkIGFsYXJtIHRpbWUgbWFzaworICogYW5kIHRoZSBjdXJyZW50IHRpbWUuCisgKgorICogRklYTUU6IGZvciBub3csIHdlIGp1c3QgY29weSB0aGUgYWxhcm0gdGltZSBiZWNhdXNlIHdlJ3JlIGxhenkgKGFuZAorICogaXMgdGhlcmVmb3JlIGJ1Z2d5IC0gc2V0dGluZyBhIDEwYW0gYWxhcm0gYXQgOHBtIHdpbGwgbm90IHJlc3VsdCBpbgorICogdGhlIGFsYXJtIHRyaWdnZXJpbmcuKQorICovCit2b2lkIHJ0Y19uZXh0X2FsYXJtX3RpbWUoc3RydWN0IHJ0Y190aW1lICpuZXh0LCBzdHJ1Y3QgcnRjX3RpbWUgKm5vdywgc3RydWN0IHJ0Y190aW1lICphbHJtKQoreworCW5leHQtPnRtX3llYXIgPSBub3ctPnRtX3llYXI7CisJbmV4dC0+dG1fbW9uID0gbm93LT50bV9tb247CisJbmV4dC0+dG1fbWRheSA9IG5vdy0+dG1fbWRheTsKKwluZXh0LT50bV9ob3VyID0gYWxybS0+dG1faG91cjsKKwluZXh0LT50bV9taW4gPSBhbHJtLT50bV9taW47CisJbmV4dC0+dG1fc2VjID0gYWxybS0+dG1fc2VjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRjX3JlYWRfdGltZShzdHJ1Y3QgcnRjX29wcyAqb3BzLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCW1lbXNldCh0bSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOworCW9wcy0+cmVhZF90aW1lKHRtKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnRjX3NldF90aW1lKHN0cnVjdCBydGNfb3BzICpvcHMsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IHJldDsKKworCXJldCA9IHJ0Y192YWxpZF90bSh0bSk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBvcHMtPnNldF90aW1lKHRtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0Y19yZWFkX2FsYXJtKHN0cnVjdCBydGNfb3BzICpvcHMsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCWludCByZXQgPSAtRUlOVkFMOworCWlmIChvcHMtPnJlYWRfYWxhcm0pIHsKKwkJbWVtc2V0KGFscm0sIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3drYWxybSkpOworCQlvcHMtPnJlYWRfYWxhcm0oYWxybSk7CisJCXJldCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0Y19zZXRfYWxhcm0oc3RydWN0IHJ0Y19vcHMgKm9wcywgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaWYgKG9wcy0+c2V0X2FsYXJtKQorCQlyZXQgPSBvcHMtPnNldF9hbGFybShhbHJtKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHJ0Y191cGRhdGUodW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGxvbmcgZXZlbnRzKQoreworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCXJ0Y19pcnFfZGF0YSA9IChydGNfaXJxX2RhdGEgKyAobnVtIDw8IDgpKSB8IGV2ZW50czsKKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CisJa2lsbF9mYXN5bmMoJnJ0Y19hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworfQorRVhQT1JUX1NZTUJPTChydGNfdXBkYXRlKTsKKworCitzdGF0aWMgc3NpemVfdAorcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlzc2l6ZV90IHJldDsKKworCWlmIChjb3VudCA8IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRfd2FpdF9xdWV1ZSgmcnRjX3dhaXQsICZ3YWl0KTsKKwlkbyB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJCWRhdGEgPSBydGNfaXJxX2RhdGE7CisJCXJ0Y19pcnFfZGF0YSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJCWlmIChkYXRhICE9IDApIHsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfSB3aGlsZSAoMSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcnRjX3dhaXQsICZ3YWl0KTsKKworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZydGNfd2FpdCwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJZGF0YSA9IHJ0Y19pcnFfZGF0YTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJldHVybiBkYXRhICE9IDAgPyBQT0xMSU4gfCBQT0xMUkROT1JNIDogMDsKK30KKworc3RhdGljIGludCBydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJ0Y19vcHMgKm9wcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJc3RydWN0IHJ0Y193a2Fscm0gYWxybTsKKwl2b2lkIF9fdXNlciAqdWFyZyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUxNX1JFQUQ6CisJCXJldCA9IHJ0Y19yZWFkX2FsYXJtKG9wcywgJmFscm0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXJldCA9IGNvcHlfdG9fdXNlcih1YXJnLCAmYWxybS50aW1lLCBzaXplb2YodG0pKTsKKwkJaWYgKHJldCkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBSVENfQUxNX1NFVDoKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmFscm0udGltZSwgdWFyZywgc2l6ZW9mKHRtKSk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlhbHJtLmVuYWJsZWQgPSAwOworCQlhbHJtLnBlbmRpbmcgPSAwOworCQlhbHJtLnRpbWUudG1fbWRheSA9IC0xOworCQlhbHJtLnRpbWUudG1fbW9uID0gLTE7CisJCWFscm0udGltZS50bV95ZWFyID0gLTE7CisJCWFscm0udGltZS50bV93ZGF5ID0gLTE7CisJCWFscm0udGltZS50bV95ZGF5ID0gLTE7CisJCWFscm0udGltZS50bV9pc2RzdCA9IC0xOworCQlyZXQgPSBydGNfc2V0X2FsYXJtKG9wcywgJmFscm0pOworCQlicmVhazsKKworCWNhc2UgUlRDX1JEX1RJTUU6CisJCXJ0Y19yZWFkX3RpbWUob3BzLCAmdG0pOworCQlyZXQgPSBjb3B5X3RvX3VzZXIodWFyZywgJnRtLCBzaXplb2YodG0pKTsKKwkJaWYgKHJldCkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBSVENfU0VUX1RJTUU6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKSB7CisJCQlyZXQgPSAtRUFDQ0VTOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnRtLCB1YXJnLCBzaXplb2YodG0pKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHJ0Y19zZXRfdGltZShvcHMsICZ0bSk7CisJCWJyZWFrOworCisJY2FzZSBSVENfRVBPQ0hfU0VUOgorI2lmbmRlZiBydGNfZXBvY2gKKwkJLyoKKwkJICogVGhlcmUgd2VyZSBubyBSVEMgY2xvY2tzIGJlZm9yZSAxOTAwLgorCQkgKi8KKwkJaWYgKGFyZyA8IDE5MDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkgeworCQkJcmV0ID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQl9CisJCXJ0Y19lcG9jaCA9IGFyZzsKKwkJcmV0ID0gMDsKKyNlbmRpZgorCQlicmVhazsKKworCWNhc2UgUlRDX0VQT0NIX1JFQUQ6CisJCXJldCA9IHB1dF91c2VyKHJ0Y19lcG9jaCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopdWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBSVENfV0tBTE1fU0VUOgorCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmYWxybSwgdWFyZywgc2l6ZW9mKGFscm0pKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHJ0Y19zZXRfYWxhcm0ob3BzLCAmYWxybSk7CisJCWJyZWFrOworCisJY2FzZSBSVENfV0tBTE1fUkQ6CisJCXJldCA9IHJ0Y19yZWFkX2FsYXJtKG9wcywgJmFscm0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXJldCA9IGNvcHlfdG9fdXNlcih1YXJnLCAmYWxybSwgc2l6ZW9mKGFscm0pKTsKKwkJaWYgKHJldCkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKG9wcy0+aW9jdGwpCisJCQlyZXQgPSBvcHMtPmlvY3RsKGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldDsKKworCWRvd24oJnJ0Y19zZW0pOworCisJaWYgKHJ0Y19pbnVzZSkgeworCQlyZXQgPSAtRUJVU1k7CisJfSBlbHNlIGlmICghcnRjX29wcyB8fCAhdHJ5X21vZHVsZV9nZXQocnRjX29wcy0+b3duZXIpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJfSBlbHNlIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcnRjX29wczsKKworCQlyZXQgPSBydGNfb3BzLT5vcGVuID8gcnRjX29wcy0+b3BlbigpIDogMDsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJCQlydGNfaXJxX2RhdGEgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwkJCXJ0Y19pbnVzZSA9IDE7CisJCX0KKwl9CisJdXAoJnJ0Y19zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcnRjX29wcyAqb3BzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKG9wcy0+cmVsZWFzZSkKKwkJb3BzLT5yZWxlYXNlKCk7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJcnRjX2lycV9kYXRhID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCW1vZHVsZV9wdXQocnRjX29wcy0+b3duZXIpOworCXJ0Y19pbnVzZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZydGNfYXN5bmNfcXVldWUpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcnRjX3JlYWQsCisJLnBvbGwJCT0gcnRjX3BvbGwsCisJLmlvY3RsCQk9IHJ0Y19pb2N0bCwKKwkub3BlbgkJPSBydGNfb3BlbiwKKwkucmVsZWFzZQk9IHJ0Y19yZWxlYXNlLAorCS5mYXN5bmMJCT0gcnRjX2Zhc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBydGNfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gUlRDX01JTk9SLAorCS5uYW1lCQk9ICJydGMiLAorCS5mb3BzCQk9ICZydGNfZm9wcywKK307CisKKworc3RhdGljIGludCBydGNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBydGNfb3BzICpvcHMgPSBkYXRhOworCXN0cnVjdCBydGNfd2thbHJtIGFscm07CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWNoYXIgKnAgPSBwYWdlOworCisJcnRjX3JlYWRfdGltZShvcHMsICZ0bSk7CisKKwlwICs9IHNwcmludGYocCwKKwkJInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkXG4iCisJCSJydGNfZGF0ZVx0OiAlMDRkLSUwMmQtJTAyZFxuIgorCQkicnRjX2Vwb2NoXHQ6ICUwNGx1XG4iLAorCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYywKKwkJdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksCisJCXJ0Y19lcG9jaCk7CisKKwlpZiAocnRjX3JlYWRfYWxhcm0ob3BzLCAmYWxybSkgPT0gMCkgeworCQlwICs9IHNwcmludGYocCwgImFscm1fdGltZVx0OiAiKTsKKwkJaWYgKCh1bnNpZ25lZCBpbnQpYWxybS50aW1lLnRtX2hvdXIgPD0gMjQpCisJCQlwICs9IHNwcmludGYocCwgIiUwMmQ6IiwgYWxybS50aW1lLnRtX2hvdXIpOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgIioqOiIpOworCQlpZiAoKHVuc2lnbmVkIGludClhbHJtLnRpbWUudG1fbWluIDw9IDU5KQorCQkJcCArPSBzcHJpbnRmKHAsICIlMDJkOiIsIGFscm0udGltZS50bV9taW4pOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgIioqOiIpOworCQlpZiAoKHVuc2lnbmVkIGludClhbHJtLnRpbWUudG1fc2VjIDw9IDU5KQorCQkJcCArPSBzcHJpbnRmKHAsICIlMDJkXG4iLCBhbHJtLnRpbWUudG1fc2VjKTsKKwkJZWxzZQorCQkJcCArPSBzcHJpbnRmKHAsICIqKlxuIik7CisKKwkJcCArPSBzcHJpbnRmKHAsICJhbHJtX2RhdGVcdDogIik7CisJCWlmICgodW5zaWduZWQgaW50KWFscm0udGltZS50bV95ZWFyIDw9IDIwMCkKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTA0ZC0iLCBhbHJtLnRpbWUudG1feWVhciArIDE5MDApOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgIioqKiotIik7CisJCWlmICgodW5zaWduZWQgaW50KWFscm0udGltZS50bV9tb24gPD0gMTEpCisJCQlwICs9IHNwcmludGYocCwgIiUwMmQtIiwgYWxybS50aW1lLnRtX21vbiArIDEpOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgIioqLSIpOworCQlpZiAoKHVuc2lnbmVkIGludClhbHJtLnRpbWUudG1fbWRheSA8PSAzMSkKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyZFxuIiwgYWxybS50aW1lLnRtX21kYXkpOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgIioqXG4iKTsKKwkJcCArPSBzcHJpbnRmKHAsICJhbHJtX3dha2V1cFx0OiAlc1xuIiwKKwkJCSAgICAgYWxybS5lbmFibGVkID8gInllcyIgOiAibm8iKTsKKwkJcCArPSBzcHJpbnRmKHAsICJhbHJtX3BlbmRpbmdcdDogJXNcbiIsCisJCQkgICAgIGFscm0ucGVuZGluZyA/ICJ5ZXMiIDogIm5vIik7CisJfQorCisJaWYgKG9wcy0+cHJvYykKKwkJcCArPSBvcHMtPnByb2MocCk7CisKKwlyZXR1cm4gcCAtIHBhZ2U7Cit9CisKK2ludCByZWdpc3Rlcl9ydGMoc3RydWN0IHJ0Y19vcHMgKm9wcykKK3sKKwlpbnQgcmV0ID0gLUVCVVNZOworCisJZG93bigmcnRjX3NlbSk7CisJaWYgKHJ0Y19vcHMgPT0gTlVMTCkgeworCQlydGNfb3BzID0gb3BzOworCisJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnJ0Y19taXNjZGV2KTsKKwkJaWYgKHJldCA9PSAwKQorCQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL3J0YyIsIDAsIE5VTEwsCisJCQkJCSAgICAgICBydGNfcmVhZF9wcm9jLCBvcHMpOworCX0KKwl1cCgmcnRjX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9ydGMpOworCit2b2lkIHVucmVnaXN0ZXJfcnRjKHN0cnVjdCBydGNfb3BzICpydGMpCit7CisJZG93bigmcnRjX3NlbSk7CisJaWYgKHJ0YyA9PSBydGNfb3BzKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcnRjIiwgTlVMTCk7CisJCW1pc2NfZGVyZWdpc3RlcigmcnRjX21pc2NkZXYpOworCQlydGNfb3BzID0gTlVMTDsKKwl9CisJdXAoJnJ0Y19zZW0pOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3J0Yyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmY2UzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwpAQCAtMCwwICsxLDEyOTIgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXNhMTEwMC9zYTExMTEuYworICoKKyAqIFNBMTExMSBzdXBwb3J0CisgKgorICogT3JpZ2luYWwgY29kZSBieSBKb2huIERvcnNleQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBnZW5lcmljIFNBMTExMSBzdXBwb3J0LgorICoKKyAqIEFsbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSBhcmUgaW50ZW5kZWQgdG8gYmUgY2FsbGVkCisgKiBmcm9tIG1hY2hpbmUgc3BlY2lmaWMgY29kZSB3aXRoIHByb3BlciBhcmd1bWVudHMgd2hlbiByZXF1aXJlZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NhMTExMS5oPgorCisjaWZkZWYgQ09ORklHX0FSQ0hfUFhBCisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2luaXQgc2ExMTEwX21iX2VuYWJsZSh2b2lkKTsKKworLyoKKyAqIFdlIGtlZXAgdGhlIGZvbGxvd2luZyBkYXRhIGZvciB0aGUgb3ZlcmFsbCBTQTExMTEuICBOb3RlIHRoYXQgdGhlCisgKiBzdHJ1Y3QgZGV2aWNlIGFuZCBzdHJ1Y3QgcmVzb3VyY2UgYXJlICJmYWtlIjsgdGhleSBzaG91bGQgYmUgc3VwcGxpZWQKKyAqIGJ5IHRoZSBidXMgYWJvdmUgdXMuICBIb3dldmVyLCBpbiB0aGUgaW50ZXJlc3RzIG9mIGdldHRpbmcgYWxsIFNBMTExMQorICogZHJpdmVycyBjb252ZXJ0ZWQgb3ZlciB0byB0aGUgZGV2aWNlIG1vZGVsLCB3ZSBwcm92aWRlIHRoaXMgYXMgYW4KKyAqIGFuY2hvciBwb2ludCBmb3IgYWxsIHRoZSBvdGhlciBkcml2ZXJzLgorICovCitzdHJ1Y3Qgc2ExMTExIHsKKwlzdHJ1Y3QgZGV2aWNlCSpkZXY7CisJdW5zaWduZWQgbG9uZwlwaHlzOworCWludAkJaXJxOworCXNwaW5sb2NrX3QJbG9jazsKKwl2b2lkIF9faW9tZW0JKmJhc2U7Cit9OworCisvKgorICogV2UgX3JlYWxseV8gbmVlZCB0byBlbGltaW5hdGUgdGhpcy4gIEl0cyBvbmx5IHVzZXJzCisgKiBhcmUgdGhlIFBXTSBhbmQgRE1BIGNoZWNraW5nIGNvZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2ExMTExICpnX3NhMTExMTsKKworc3RydWN0IHNhMTExMV9kZXZfaW5mbyB7CisJdW5zaWduZWQgbG9uZwlvZmZzZXQ7CisJdW5zaWduZWQgbG9uZwlza3Bjcl9tYXNrOworCXVuc2lnbmVkIGludAlkZXZpZDsKKwl1bnNpZ25lZCBpbnQJaXJxWzZdOworfTsKKworc3RhdGljIHN0cnVjdCBzYTExMTFfZGV2X2luZm8gc2ExMTExX2RldmljZXNbXSA9IHsKKwl7CisJCS5vZmZzZXQJCT0gU0ExMTExX1VTQiwKKwkJLnNrcGNyX21hc2sJPSBTS1BDUl9VQ0xLRU4sCisJCS5kZXZpZAkJPSBTQTExMTFfREVWSURfVVNCLAorCQkuaXJxID0geworCQkJSVJRX1VTQlBXUiwKKwkJCUlSUV9IQ0lNLAorCQkJSVJRX0hDSUJVRkZBQ0MsCisJCQlJUlFfSENJUk1UV0tQLAorCQkJSVJRX05IQ0lNRkNJUiwKKwkJCUlSUV9VU0JfUE9SVF9SRVNVTUUKKwkJfSwKKwl9LAorCXsKKwkJLm9mZnNldAkJPSAweDA2MDAsCisJCS5za3Bjcl9tYXNrCT0gU0tQQ1JfSTJTQ0xLRU4gfCBTS1BDUl9MM0NMS0VOLAorCQkuZGV2aWQJCT0gU0ExMTExX0RFVklEX1NBQywKKwkJLmlycSA9IHsKKwkJCUFVRFhNVERNQURPTkVBLAorCQkJQVVEWE1URE1BRE9ORUIsCisJCQlBVURSQ1ZETUFET05FQSwKKwkJCUFVRFJDVkRNQURPTkVCCisJCX0sCisJfSwKKwl7CisJCS5vZmZzZXQJCT0gMHgwODAwLAorCQkuc2twY3JfbWFzawk9IFNLUENSX1NDTEtFTiwKKwkJLmRldmlkCQk9IFNBMTExMV9ERVZJRF9TU1AsCisJfSwKKwl7CisJCS5vZmZzZXQJCT0gU0ExMTExX0tCRCwKKwkJLnNrcGNyX21hc2sJPSBTS1BDUl9QVENMS0VOLAorCQkuZGV2aWQJCT0gU0ExMTExX0RFVklEX1BTMiwKKwkJLmlycSA9IHsKKwkJCUlSUV9UUFJYSU5ULAorCQkJSVJRX1RQVFhJTlQKKwkJfSwKKwl9LAorCXsKKwkJLm9mZnNldAkJPSBTQTExMTFfTVNFLAorCQkuc2twY3JfbWFzawk9IFNLUENSX1BNQ0xLRU4sCisJCS5kZXZpZAkJPSBTQTExMTFfREVWSURfUFMyLAorCQkuaXJxID0geworCQkJSVJRX01TUlhJTlQsCisJCQlJUlFfTVNUWElOVAorCQl9LAorCX0sCisJeworCQkub2Zmc2V0CQk9IDB4MTgwMCwKKwkJLnNrcGNyX21hc2sJPSAwLAorCQkuZGV2aWQJCT0gU0ExMTExX0RFVklEX1BDTUNJQSwKKwkJLmlycSA9IHsKKwkJCUlSUV9TMF9SRUFEWV9OSU5ULAorCQkJSVJRX1MwX0NEX1ZBTElELAorCQkJSVJRX1MwX0JWRDFfU1RTQ0hHLAorCQkJSVJRX1MxX1JFQURZX05JTlQsCisJCQlJUlFfUzFfQ0RfVkFMSUQsCisJCQlJUlFfUzFfQlZEMV9TVFNDSEcsCisJCX0sCisJfSwKK307CisKKy8qCisgKiBTQTExMTEgaW50ZXJydXB0IHN1cHBvcnQuICBTaW5jZSBjbGVhcmluZyBhbiBJUlEgd2hpbGUgdGhlcmUgYXJlCisgKiBhY3RpdmUgSVJRcyBjYXVzZXMgdGhlIGludGVycnVwdCBvdXRwdXQgdG8gcHVsc2UsIHRoZSB1cHBlciBsZXZlbHMKKyAqIHdpbGwgY2FsbCB1cyBhZ2FpbiBpZiB0aGVyZSBhcmUgbW9yZSBpbnRlcnJ1cHRzIHRvIHByb2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkCitzYTExMTFfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBzdGF0MCwgc3RhdDEsIGk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gZGVzYy0+ZGF0YTsKKworCXN0YXQwID0gc2ExMTExX3JlYWRsKGJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjApOworCXN0YXQxID0gc2ExMTExX3JlYWRsKGJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjEpOworCisJc2ExMTExX3dyaXRlbChzdGF0MCwgYmFzZSArIFNBMTExMV9JTlRTVEFUQ0xSMCk7CisKKwlkZXNjLT5jaGlwLT5hY2soaXJxKTsKKworCXNhMTExMV93cml0ZWwoc3RhdDEsIGJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjEpOworCisJaWYgKHN0YXQwID09IDAgJiYgc3RhdDEgPT0gMCkgeworCQlkb19iYWRfSVJRKGlycSwgZGVzYywgcmVncyk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSBJUlFfU0ExMTExX1NUQVJUOyBzdGF0MDsgaSsrLCBzdGF0MCA+Pj0gMSkKKwkJaWYgKHN0YXQwICYgMSkKKwkJCWRvX2VkZ2VfSVJRKGksIGlycV9kZXNjICsgaSwgcmVncyk7CisKKwlmb3IgKGkgPSBJUlFfU0ExMTExX1NUQVJUICsgMzI7IHN0YXQxOyBpKyssIHN0YXQxID4+PSAxKQorCQlpZiAoc3RhdDEgJiAxKQorCQkJZG9fZWRnZV9JUlEoaSwgaXJxX2Rlc2MgKyBpLCByZWdzKTsKKworCS8qIEZvciBsZXZlbC1iYXNlZCBpbnRlcnJ1cHRzICovCisJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7Cit9CisKKyNkZWZpbmUgU0ExMTExX0lSUU1BU0tfTE8oeCkJKDEgPDwgKHggLSBJUlFfU0ExMTExX1NUQVJUKSkKKyNkZWZpbmUgU0ExMTExX0lSUU1BU0tfSEkoeCkJKDEgPDwgKHggLSBJUlFfU0ExMTExX1NUQVJUIC0gMzIpKQorCitzdGF0aWMgdm9pZCBzYTExMTFfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworfQorCitzdGF0aWMgdm9pZCBzYTExMTFfbWFza19sb3dpcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBpZTA7CisKKwlpZTAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRFTjApOworCWllMCAmPSB+U0ExMTExX0lSUU1BU0tfTE8oaXJxKTsKKwl3cml0ZWwoaWUwLCBtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhMTExMV91bm1hc2tfbG93aXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgaWUwOworCisJaWUwID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5URU4wKTsKKwlpZTAgfD0gU0ExMTExX0lSUU1BU0tfTE8oaXJxKTsKKwlzYTExMTFfd3JpdGVsKGllMCwgbWFwYmFzZSArIFNBMTExMV9JTlRFTjApOworfQorCisvKgorICogQXR0ZW1wdCB0byByZS10cmlnZ2VyIHRoZSBpbnRlcnJ1cHQuICBUaGUgU0ExMTExIGNvbnRhaW5zIGEgcmVnaXN0ZXIKKyAqIChJTlRTRVQpIHdoaWNoIGNsYWltcyB0byBkbyB0aGlzLiAgSG93ZXZlciwgaW4gcHJhY3RpY2Ugbm8gYW1vdW50IG9mCisgKiBtYW5pcHVsYXRpb24gb2YgSU5URU4gYW5kIElOVFNFVCBndWFyYW50ZWVzIHRoYXQgdGhlIGludGVycnVwdCB3aWxsCisgKiBiZSB0cmlnZ2VyZWQuICBJbiBmYWN0LCBpdHMgdmVyeSBkaWZmaWN1bHQsIGlmIG5vdCBpbXBvc3NpYmxlIHRvIGdldAorICogSU5UU0VUIHRvIHJlLXRyaWdnZXIgdGhlIGludGVycnVwdC4KKyAqLworc3RhdGljIGludCBzYTExMTFfcmV0cmlnZ2VyX2xvd2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gU0ExMTExX0lSUU1BU0tfTE8oaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBpcDA7CisJaW50IGk7CisKKwlpcDAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXNhMTExMV93cml0ZWwoaXAwIF4gbWFzaywgbWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKKwkJc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJCWlmIChzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRTVEFUQ0xSMSkgJiBtYXNrKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gOCkKKwkJcHJpbnRrKEtFUk5fRVJSICJEYW5nZXIgV2lsbCBSb2JpbnNvbjogZmFpbGVkIHRvICIKKwkJCSJyZS10cmlnZ2VyIElSUSVkXG4iLCBpcnEpOworCXJldHVybiBpID09IDggPyAtMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX3R5cGVfbG93aXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0xPKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgaXAwOworCisJaWYgKGZsYWdzID09IElSUVRfUFJPQkUpCisJCXJldHVybiAwOworCisJaWYgKCghKGZsYWdzICYgX19JUlFUX1JJU0VER0UpIF4gIShmbGFncyAmIF9fSVJRVF9GQUxFREdFKSkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpcDAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKKwlpZiAoZmxhZ3MgJiBfX0lSUVRfUklTRURHRSkKKwkJaXAwICY9IH5tYXNrOworCWVsc2UKKwkJaXAwIHw9IG1hc2s7CisJc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfV0FLRVBPTDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX3dha2VfbG93aXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBvbikKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0xPKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgd2UwOworCisJd2UwID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMCk7CisJaWYgKG9uKQorCQl3ZTAgfD0gbWFzazsKKwllbHNlCisJCXdlMCAmPSB+bWFzazsKKwlzYTExMTFfd3JpdGVsKHdlMCwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgc2ExMTExX2xvd19jaGlwID0geworCS5hY2sJCT0gc2ExMTExX2Fja19pcnEsCisJLm1hc2sJCT0gc2ExMTExX21hc2tfbG93aXJxLAorCS51bm1hc2sJCT0gc2ExMTExX3VubWFza19sb3dpcnEsCisJLnJldHJpZ2dlcgk9IHNhMTExMV9yZXRyaWdnZXJfbG93aXJxLAorCS50eXBlCQk9IHNhMTExMV90eXBlX2xvd2lycSwKKwkud2FrZQkJPSBzYTExMTFfd2FrZV9sb3dpcnEsCit9OworCitzdGF0aWMgdm9pZCBzYTExMTFfbWFza19oaWdoaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgaWUxOworCisJaWUxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKKwlpZTEgJj0gflNBMTExMV9JUlFNQVNLX0hJKGlycSk7CisJc2ExMTExX3dyaXRlbChpZTEsIG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKK30KKworc3RhdGljIHZvaWQgc2ExMTExX3VubWFza19oaWdoaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgaWUxOworCisJaWUxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKKwlpZTEgfD0gU0ExMTExX0lSUU1BU0tfSEkoaXJxKTsKKwlzYTExMTFfd3JpdGVsKGllMSwgbWFwYmFzZSArIFNBMTExMV9JTlRFTjEpOworfQorCisvKgorICogQXR0ZW1wdCB0byByZS10cmlnZ2VyIHRoZSBpbnRlcnJ1cHQuICBUaGUgU0ExMTExIGNvbnRhaW5zIGEgcmVnaXN0ZXIKKyAqIChJTlRTRVQpIHdoaWNoIGNsYWltcyB0byBkbyB0aGlzLiAgSG93ZXZlciwgaW4gcHJhY3RpY2Ugbm8gYW1vdW50IG9mCisgKiBtYW5pcHVsYXRpb24gb2YgSU5URU4gYW5kIElOVFNFVCBndWFyYW50ZWVzIHRoYXQgdGhlIGludGVycnVwdCB3aWxsCisgKiBiZSB0cmlnZ2VyZWQuICBJbiBmYWN0LCBpdHMgdmVyeSBkaWZmaWN1bHQsIGlmIG5vdCBpbXBvc3NpYmxlIHRvIGdldAorICogSU5UU0VUIHRvIHJlLXRyaWdnZXIgdGhlIGludGVycnVwdC4KKyAqLworc3RhdGljIGludCBzYTExMTFfcmV0cmlnZ2VyX2hpZ2hpcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0hJKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgaXAxOworCWludCBpOworCisJaXAxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlzYTExMTFfd3JpdGVsKGlwMSBeIG1hc2ssIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMSk7CisJCXNhMTExMV93cml0ZWwoaXAxLCBtYXBiYXNlICsgU0ExMTExX0lOVFBPTDEpOworCQlpZiAoc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjEpICYgbWFzaykKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDgpCisJCXByaW50ayhLRVJOX0VSUiAiRGFuZ2VyIFdpbGwgUm9iaW5zb246IGZhaWxlZCB0byAiCisJCQkicmUtdHJpZ2dlciBJUlElZFxuIiwgaXJxKTsKKwlyZXR1cm4gaSA9PSA4ID8gLTEgOiAwOworfQorCitzdGF0aWMgaW50IHNhMTExMV90eXBlX2hpZ2hpcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gU0ExMTExX0lSUU1BU0tfSEkoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBpcDE7CisKKwlpZiAoZmxhZ3MgPT0gSVJRVF9QUk9CRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKCEoZmxhZ3MgJiBfX0lSUVRfUklTRURHRSkgXiAhKGZsYWdzICYgX19JUlFUX0ZBTEVER0UpKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlwMSA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVFBPTDEpOworCWlmIChmbGFncyAmIF9fSVJRVF9SSVNFREdFKQorCQlpcDEgJj0gfm1hc2s7CisJZWxzZQorCQlpcDEgfD0gbWFzazsKKwlzYTExMTFfd3JpdGVsKGlwMSwgbWFwYmFzZSArIFNBMTExMV9JTlRQT0wxKTsKKwlzYTExMTFfd3JpdGVsKGlwMSwgbWFwYmFzZSArIFNBMTExMV9XQUtFUE9MMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYTExMTFfd2FrZV9oaWdoaXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBvbikKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0hJKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgd2UxOworCisJd2UxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMSk7CisJaWYgKG9uKQorCQl3ZTEgfD0gbWFzazsKKwllbHNlCisJCXdlMSAmPSB+bWFzazsKKwlzYTExMTFfd3JpdGVsKHdlMSwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4xKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgc2ExMTExX2hpZ2hfY2hpcCA9IHsKKwkuYWNrCQk9IHNhMTExMV9hY2tfaXJxLAorCS5tYXNrCQk9IHNhMTExMV9tYXNrX2hpZ2hpcnEsCisJLnVubWFzawkJPSBzYTExMTFfdW5tYXNrX2hpZ2hpcnEsCisJLnJldHJpZ2dlcgk9IHNhMTExMV9yZXRyaWdnZXJfaGlnaGlycSwKKwkudHlwZQkJPSBzYTExMTFfdHlwZV9oaWdoaXJxLAorCS53YWtlCQk9IHNhMTExMV93YWtlX2hpZ2hpcnEsCit9OworCitzdGF0aWMgdm9pZCBzYTExMTFfc2V0dXBfaXJxKHN0cnVjdCBzYTExMTEgKnNhY2hpcCkKK3sKKwl2b2lkIF9faW9tZW0gKmlycWJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJLyoKKwkgKiBXZSdyZSBndWFyYW50ZWVkIHRoYXQgdGhpcyByZWdpb24gaGFzbid0IGJlZW4gdGFrZW4uCisJICovCisJcmVxdWVzdF9tZW1fcmVnaW9uKHNhY2hpcC0+cGh5cyArIFNBMTExMV9JTlRDLCA1MTIsICJpcnEiKTsKKworCS8qIGRpc2FibGUgYWxsIElSUXMgKi8KKwlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfSU5URU4wKTsKKwlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfSU5URU4xKTsKKwlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfV0FLRUVOMCk7CisJc2ExMTExX3dyaXRlbCgwLCBpcnFiYXNlICsgU0ExMTExX1dBS0VFTjEpOworCisJLyoKKwkgKiBkZXRlY3Qgb24gcmlzaW5nIGVkZ2UuICBOb3RlOiBGZWIgMjAwMSBFcnJhdGEgZm9yIFNBMTExMQorCSAqIHNwZWNpZmllcyB0aGF0IFMwUmVhZHlJbnQgYW5kIFMxUmVhZHlJbnQgc2hvdWxkIGJlICcxJy4KKwkgKi8KKwlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJc2ExMTExX3dyaXRlbChTQTExMTFfSVJRTUFTS19ISShJUlFfUzBfUkVBRFlfTklOVCkgfAorCQkgICAgICBTQTExMTFfSVJRTUFTS19ISShJUlFfUzFfUkVBRFlfTklOVCksCisJCSAgICAgIGlycWJhc2UgKyBTQTExMTFfSU5UUE9MMSk7CisKKwkvKiBjbGVhciBhbGwgSVJRcyAqLworCXNhMTExMV93cml0ZWwofjAsIGlycWJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjApOworCXNhMTExMV93cml0ZWwofjAsIGlycWJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjEpOworCisJZm9yIChpcnEgPSBJUlFfR1BBSU4wOyBpcnEgPD0gU1NQUk9SOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmc2ExMTExX2xvd19jaGlwKTsKKwkJc2V0X2lycV9jaGlwZGF0YShpcnEsIGlycWJhc2UpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJZm9yIChpcnEgPSBBVURYTVRETUFET05FQTsgaXJxIDw9IElSUV9TMV9CVkQxX1NUU0NIRzsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJnNhMTExMV9oaWdoX2NoaXApOworCQlzZXRfaXJxX2NoaXBkYXRhKGlycSwgaXJxYmFzZSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwl9CisKKwkvKgorCSAqIFJlZ2lzdGVyIFNBMTExMSBpbnRlcnJ1cHQKKwkgKi8KKwlzZXRfaXJxX3R5cGUoc2FjaGlwLT5pcnEsIElSUVRfUklTSU5HKTsKKwlzZXRfaXJxX2RhdGEoc2FjaGlwLT5pcnEsIGlycWJhc2UpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKHNhY2hpcC0+aXJxLCBzYTExMTFfaXJxX2hhbmRsZXIpOworfQorCisvKgorICogQnJpbmcgdGhlIFNBMTExMSBvdXQgb2YgcmVzZXQuICBUaGlzIHJlcXVpcmVzIGEgc2V0IHByb2NlZHVyZToKKyAqICAxLiBuUkVTRVQgYXNzZXJ0ZWQgKGJ5IGhhcmR3YXJlKQorICogIDIuIENMSyB0dXJuZWQgb24gZnJvbSBTQTExMTAKKyAqICAzLiBuUkVTRVQgZGVhc3NlcnRlZAorICogIDQuIFZDTyB0dXJuZWQgb24sIFBMTF9CWVBBU1MgdHVybmVkIG9mZgorICogIDUuIFdhaXQgbG9jayB0aW1lLCB0aGVuIGFzc2VydCBSQ0xLRW4KKyAqICA3LiBQQ1Igc2V0IHRvIGFsbG93IGNsb2NraW5nIG9mIGluZGl2aWR1YWwgZnVuY3Rpb25zCisgKgorICogVW50aWwgd2UndmUgZG9uZSB0aGlzLCB0aGUgb25seSByZWdpc3RlcnMgd2UgY2FuIGFjY2VzcyBhcmU6CisgKiAgIFNCSV9TS0NSCisgKiAgIFNCSV9TTUNSCisgKiAgIFNCSV9TS0lECisgKi8KK3N0YXRpYyB2b2lkIHNhMTExMV93YWtlKHN0cnVjdCBzYTExMTEgKnNhY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCByOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfU0ExMTAwCisJLyoKKwkgKiBGaXJzdCwgc2V0IHVwIHRoZSAzLjY4NjRNSHogY2xvY2sgb24gR1BJTyAyNyBmb3IgdGhlIFNBLTExMTE6CisJICogKFNBLTExMTAgRGV2ZWxvcGVyJ3MgTWFudWFsLCBzZWN0aW9uIDkuMS4yLjEpCisJICovCisJR0FGUiB8PSBHUElPXzMyXzc2OGtIejsKKwlHUERSIHw9IEdQSU9fMzJfNzY4a0h6OworCVRVQ1IgPSBUVUNSXzNfNjg2NE1IejsKKyNlbGlmIENPTkZJR19BUkNIX1BYQQorCXB4YV9ncGlvX21vZGUoR1BJTzExXzNfNk1Iel9NRCk7CisjZWxzZQorI2Vycm9yIG1pc3NpbmcgY2xvY2sgc2V0dXAKKyNlbmRpZgorCisJLyoKKwkgKiBUdXJuIFZDTyBvbiwgYW5kIGRpc2FibGUgUExMIEJ5cGFzcy4KKwkgKi8KKwlyID0gc2ExMTExX3JlYWRsKHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0NSKTsKKwlyICY9IH5TS0NSX1ZDT19PRkY7CisJc2ExMTExX3dyaXRlbChyLCBzYWNoaXAtPmJhc2UgKyBTQTExMTFfU0tDUik7CisJciB8PSBTS0NSX1BMTF9CWVBBU1MgfCBTS0NSX09FX0VOOworCXNhMTExMV93cml0ZWwociwgc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLQ1IpOworCisJLyoKKwkgKiBXYWl0IGxvY2sgdGltZS4gIFNBMTExMSBtYW51YWwgX2RvZXNuJ3RfCisJICogc3BlY2lmeSBhIGZpZ3VyZSBmb3IgdGhpcyEgIFdlIGNob29zZSAxMDB1cy4KKwkgKi8KKwl1ZGVsYXkoMTAwKTsKKworCS8qCisJICogRW5hYmxlIFJDTEsuICBXZSBhbHNvIGVuc3VyZSB0aGF0IFJEWUVOIGlzIHNldC4KKwkgKi8KKwlyIHw9IFNLQ1JfUkNMS0VOIHwgU0tDUl9SRFlFTjsKKwlzYTExMTFfd3JpdGVsKHIsIHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0NSKTsKKworCS8qCisJICogV2FpdCAxNCBSQ0xLIGN5Y2xlcyBmb3IgdGhlIGNoaXAgdG8gZmluaXNoIGNvbWluZyBvdXQKKwkgKiBvZiByZXNldC4gKFJDTEs9MjRNSHopLiAgVGhpcyBpcyA1OTBucy4KKwkgKi8KKwl1ZGVsYXkoMSk7CisKKwkvKgorCSAqIEVuc3VyZSBhbGwgY2xvY2tzIGFyZSBpbml0aWFsbHkgb2ZmLgorCSAqLworCXNhMTExMV93cml0ZWwoMCwgc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLUENSKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0FSQ0hfU0ExMTAwCisKK3N0YXRpYyB1MzIgc2ExMTExX2RtYV9tYXNrW10gPSB7CisJfjAsCisJfigxIDw8IDIwKSwKKwl+KDEgPDwgMjMpLAorCX4oMSA8PCAyNCksCisJfigxIDw8IDI1KSwKKwl+KDEgPDwgMjApLAorCX4oMSA8PCAyMCksCisJMCwKK307CisKKy8qCisgKiBDb25maWd1cmUgdGhlIFNBMTExMSBzaGFyZWQgbWVtb3J5IGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQKK3NhMTExMV9jb25maWd1cmVfc21jKHN0cnVjdCBzYTExMTEgKnNhY2hpcCwgaW50IHNkcmFtLCB1bnNpZ25lZCBpbnQgZHJhYywKKwkJICAgICB1bnNpZ25lZCBpbnQgY2FzX2xhdGVuY3kpCit7CisJdW5zaWduZWQgaW50IHNtY3IgPSBTTUNSX0RUSU0gfCBTTUNSX01CR0UgfCBGSW5zcnQoZHJhYywgU01DUl9EUkFDKTsKKworCWlmIChjYXNfbGF0ZW5jeSA9PSAzKQorCQlzbWNyIHw9IFNNQ1JfQ0xBVDsKKworCXNhMTExMV93cml0ZWwoc21jciwgc2FjaGlwLT5iYXNlICsgU0ExMTExX1NNQ1IpOworCisJLyoKKwkgKiBOb3cgY2xlYXIgdGhlIGJpdHMgaW4gdGhlIERNQSBtYXNrIHRvIHdvcmsgYXJvdW5kIHRoZSBTQTExMTEKKwkgKiBETUEgZXJyYXR1bSAoSW50ZWwgU3Ryb25nQVJNIFNBLTExMTEgTWljcm9wcm9jZXNzb3IgQ29tcGFuaW9uCisJICogQ2hpcCBTcGVjaWZpY2F0aW9uIFVwZGF0ZSwgSnVuZSAyMDAwLCBFcnJhdHVtICM3KS4KKwkgKi8KKwlpZiAoc2FjaGlwLT5kZXYtPmRtYV9tYXNrKQorCQkqc2FjaGlwLT5kZXYtPmRtYV9tYXNrICY9IHNhMTExMV9kbWFfbWFza1tkcmFjID4+IDJdOworCisJc2FjaGlwLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrICY9IHNhMTExMV9kbWFfbWFza1tkcmFjID4+IDJdOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgc2ExMTExX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJc3RydWN0IHNhMTExMV9kZXYgKmRldiA9IFNBMTExMV9ERVYoX2Rldik7CisKKwlyZWxlYXNlX3Jlc291cmNlKCZkZXYtPnJlcyk7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIGludAorc2ExMTExX2luaXRfb25lX2NoaWxkKHN0cnVjdCBzYTExMTEgKnNhY2hpcCwgc3RydWN0IHJlc291cmNlICpwYXJlbnQsCisJCSAgICAgIHN0cnVjdCBzYTExMTFfZGV2X2luZm8gKmluZm8pCit7CisJc3RydWN0IHNhMTExMV9kZXYgKmRldjsKKwlpbnQgcmV0OworCisJZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhMTExMV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBzYTExMTFfZGV2KSk7CisKKwlzbnByaW50ZihkZXYtPmRldi5idXNfaWQsIHNpemVvZihkZXYtPmRldi5idXNfaWQpLAorCQkgIiU0LjRseCIsIGluZm8tPm9mZnNldCk7CisKKwlkZXYtPmRldmlkCSA9IGluZm8tPmRldmlkOworCWRldi0+ZGV2LnBhcmVudCAgPSBzYWNoaXAtPmRldjsKKwlkZXYtPmRldi5idXMgICAgID0gJnNhMTExMV9idXNfdHlwZTsKKwlkZXYtPmRldi5yZWxlYXNlID0gc2ExMTExX2Rldl9yZWxlYXNlOworCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gc2FjaGlwLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrOworCWRldi0+cmVzLnN0YXJ0ICAgPSBzYWNoaXAtPnBoeXMgKyBpbmZvLT5vZmZzZXQ7CisJZGV2LT5yZXMuZW5kICAgICA9IGRldi0+cmVzLnN0YXJ0ICsgNTExOworCWRldi0+cmVzLm5hbWUgICAgPSBkZXYtPmRldi5idXNfaWQ7CisJZGV2LT5yZXMuZmxhZ3MgICA9IElPUkVTT1VSQ0VfTUVNOworCWRldi0+bWFwYmFzZSAgICAgPSBzYWNoaXAtPmJhc2UgKyBpbmZvLT5vZmZzZXQ7CisJZGV2LT5za3Bjcl9tYXNrICA9IGluZm8tPnNrcGNyX21hc2s7CisJbWVtbW92ZShkZXYtPmlycSwgaW5mby0+aXJxLCBzaXplb2YoZGV2LT5pcnEpKTsKKworCXJldCA9IHJlcXVlc3RfcmVzb3VyY2UocGFyZW50LCAmZGV2LT5yZXMpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCJTQTExMTE6IGZhaWxlZCB0byBhbGxvY2F0ZSByZXNvdXJjZSBmb3IgJXNcbiIsCisJCQlkZXYtPnJlcy5uYW1lKTsKKwkJa2ZyZWUoZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisKKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoJmRldi0+cmVzKTsKKwkJa2ZyZWUoZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcGFyZW50IGRldmljZSBoYXMgYSBETUEgbWFzayBhc3NvY2lhdGVkIHdpdGggaXQsCisJICogcHJvcGFnYXRlIGl0IGRvd24gdG8gdGhlIGNoaWxkcmVuLgorCSAqLworCWlmIChzYWNoaXAtPmRldi0+ZG1hX21hc2spIHsKKwkJZGV2LT5kbWFfbWFzayA9ICpzYWNoaXAtPmRldi0+ZG1hX21hc2s7CisJCWRldi0+ZGV2LmRtYV9tYXNrID0gJmRldi0+ZG1hX21hc2s7CisKKwkJaWYgKGRldi0+ZG1hX21hc2sgIT0gMHhmZmZmZmZmZlVMKSB7CisJCQlyZXQgPSBkbWFib3VuY2VfcmVnaXN0ZXJfZGV2KCZkZXYtPmRldiwgMTAyNCwgNDA5Nik7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKCJTQTExMTE6IEZhaWxlZCB0byByZWdpc3RlciAlcyB3aXRoIGRtYWJvdW5jZSIsIGRldi0+ZGV2LmJ1c19pZCk7CisJCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwkJCX0KKwkJfQorCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJc2ExMTExX3Byb2JlIC0gcHJvYmUgZm9yIGEgc2luZ2xlIFNBMTExMSBjaGlwLgorICoJQHBoeXNfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiBkZXZpY2UuCisgKgorICoJUHJvYmUgZm9yIGEgU0ExMTExIGNoaXAuICBUaGlzIG11c3QgYmUgY2FsbGVkCisgKgliZWZvcmUgYW55IG90aGVyIFNBMTExMS1zcGVjaWZpYyBjb2RlLgorICoKKyAqCVJldHVybnM6CisgKgklLUVOT0RFVglkZXZpY2Ugbm90IGZvdW5kLgorICoJJS1FQlVTWQkJcGh5c2ljYWwgYWRkcmVzcyBhbHJlYWR5IG1hcmtlZCBpbi11c2UuCisgKgklMAkJc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGludAorX19zYTExMTFfcHJvYmUoc3RydWN0IGRldmljZSAqbWUsIHN0cnVjdCByZXNvdXJjZSAqbWVtLCBpbnQgaXJxKQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlkOworCXVuc2lnbmVkIGludCBoYXNfZGV2cywgdmFsOworCWludCBpLCByZXQgPSAtRU5PREVWOworCisJc2FjaGlwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhMTExMSksIEdGUF9LRVJORUwpOworCWlmICghc2FjaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChzYWNoaXAsIDAsIHNpemVvZihzdHJ1Y3Qgc2ExMTExKSk7CisKKwlzcGluX2xvY2tfaW5pdCgmc2FjaGlwLT5sb2NrKTsKKworCXNhY2hpcC0+ZGV2ID0gbWU7CisJZGV2X3NldF9kcnZkYXRhKHNhY2hpcC0+ZGV2LCBzYWNoaXApOworCisJc2FjaGlwLT5waHlzID0gbWVtLT5zdGFydDsKKwlzYWNoaXAtPmlycSA9IGlycTsKKworCS8qCisJICogTWFwIHRoZSB3aG9sZSByZWdpb24uICBUaGlzIGFsc28gbWFwcyB0aGUKKwkgKiByZWdpc3RlcnMgZm9yIG91ciBjaGlsZHJlbi4KKwkgKi8KKwlzYWNoaXAtPmJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIFBBR0VfU0laRSAqIDIpOworCWlmICghc2FjaGlwLT5iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUHJvYmUgZm9yIHRoZSBjaGlwLiAgT25seSB0b3VjaCB0aGUgU0JJIHJlZ2lzdGVycy4KKwkgKi8KKwlpZCA9IHNhMTExMV9yZWFkbChzYWNoaXAtPmJhc2UgKyBTQTExMTFfU0tJRCk7CisJaWYgKChpZCAmIFNLSURfSURfTUFTSykgIT0gU0tJRF9TQTExMTFfSUQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlNBMTExMSBub3QgZGV0ZWN0ZWQ6IElEID0gJTA4bHhcbiIsIGlkKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byB1bm1hcDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJTQTExMTEgTWljcm9wcm9jZXNzb3IgQ29tcGFuaW9uIENoaXA6ICIKKwkJInNpbGljb24gcmV2aXNpb24gJWx4LCBtZXRhbCByZXZpc2lvbiAlbHhcbiIsCisJCShpZCAmIFNLSURfU0lSRVZfTUFTSyk+PjQsIChpZCAmIFNLSURfTVRSRVZfTUFTSykpOworCisJLyoKKwkgKiBXZSBmb3VuZCBpdC4gIFdha2UgdGhlIGNoaXAgdXAsIGFuZCBpbml0aWFsaXNlLgorCSAqLworCXNhMTExMV93YWtlKHNhY2hpcCk7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9TQTExMDAKKwkvKgorCSAqIFRoZSBTRFJBTSBjb25maWd1cmF0aW9uIG9mIHRoZSBTQTExMTAgYW5kIHRoZSBTQTExMTEgbXVzdAorCSAqIG1hdGNoLiAgVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCB0byBlbnN1cmUgdGhhdCBTQTExMTEgYWNjZXNzZXMKKwkgKiBkb24ndCBjb3JydXB0IHRoZSBTRFJBTS4gIE5vdGUgdGhhdCB0aGlzIHVuZ2F0ZXMgdGhlIFNBMTExMSdzCisJICogTUJHTlQgc2lnbmFsLCBzbyB3ZSBtdXN0IGhhdmUgY2FsbGVkIHNhMTExMF9tYl9kaXNhYmxlKCkKKwkgKiBiZWZvcmVoYW5kLgorCSAqLworCXNhMTExMV9jb25maWd1cmVfc21jKHNhY2hpcCwgMSwKKwkJCSAgICAgRkV4dHIoTURDTkZHLCBNRENORkdfU0ExMTEwX0RSQUMwKSwKKwkJCSAgICAgRkV4dHIoTURDTkZHLCBNRENORkdfU0ExMTEwX1RETDApKTsKKworCS8qCisJICogV2Ugb25seSBuZWVkIHRvIHR1cm4gb24gRENMSyB3aGVuZXZlciB3ZSB3YW50IHRvIHVzZSB0aGUKKwkgKiBETUEuICBJdCBjYW4gb3RoZXJ3aXNlIGJlIGhlbGQgZmlybWx5IGluIHRoZSBvZmYgcG9zaXRpb24uCisJICogKGN1cnJlbnRseSwgd2UgYWx3YXlzIGVuYWJsZSBpdC4pCisJICovCisJdmFsID0gc2ExMTExX3JlYWRsKHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS1BDUik7CisJc2ExMTExX3dyaXRlbCh2YWwgfCBTS1BDUl9EQ0xLRU4sIHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS1BDUik7CisKKwkvKgorCSAqIEVuYWJsZSB0aGUgU0ExMTEwIG1lbW9yeSBidXMgcmVxdWVzdCBhbmQgZ3JhbnQgc2lnbmFscy4KKwkgKi8KKwlzYTExMTBfbWJfZW5hYmxlKCk7CisjZW5kaWYKKworCS8qCisJICogVGhlIGludGVycnVwdCBjb250cm9sbGVyIG11c3QgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGFueQorCSAqIG90aGVyIGRldmljZSB0byBlbnN1cmUgdGhhdCB0aGUgaW50ZXJydXB0cyBhcmUgYXZhaWxhYmxlLgorCSAqLworCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpCisJCXNhMTExMV9zZXR1cF9pcnEoc2FjaGlwKTsKKworCWdfc2ExMTExID0gc2FjaGlwOworCisJaGFzX2RldnMgPSB+MDsKKwlpZiAobWFjaGluZV9pc19hc3NhYmV0KCkgfHwgbWFjaGluZV9pc19qb3JuYWRhNzIwKCkgfHwKKwkgICAgbWFjaGluZV9pc19iYWRnZTQoKSkKKwkJaGFzX2RldnMgJj0gfigxIDw8IDQpOworCWVsc2UKKwkJaGFzX2RldnMgJj0gfigxIDw8IDEpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2ExMTExX2RldmljZXMpOyBpKyspCisJCWlmIChoYXNfZGV2cyAmICgxIDw8IGkpKQorCQkJc2ExMTExX2luaXRfb25lX2NoaWxkKHNhY2hpcCwgbWVtLCAmc2ExMTExX2RldmljZXNbaV0pOworCisJcmV0dXJuIDA7CisKKyB1bm1hcDoKKwlpb3VubWFwKHNhY2hpcC0+YmFzZSk7Cisgb3V0OgorCWtmcmVlKHNhY2hpcCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19zYTExMTFfcmVtb3ZlKHN0cnVjdCBzYTExMTEgKnNhY2hpcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKKwl2b2lkIF9faW9tZW0gKmlycWJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmc2FjaGlwLT5kZXYtPmNoaWxkcmVuKSB7CisJCXN0cnVjdCBkZXZpY2UgKmQgPSBsaXN0X3RvX2RldihsKTsKKworCQlkZXZpY2VfdW5yZWdpc3RlcihkKTsKKwl9CisKKwkvKiBkaXNhYmxlIGFsbCBJUlFzICovCisJc2ExMTExX3dyaXRlbCgwLCBpcnFiYXNlICsgU0ExMTExX0lOVEVOMCk7CisJc2ExMTExX3dyaXRlbCgwLCBpcnFiYXNlICsgU0ExMTExX0lOVEVOMSk7CisJc2ExMTExX3dyaXRlbCgwLCBpcnFiYXNlICsgU0ExMTExX1dBS0VFTjApOworCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9XQUtFRU4xKTsKKworCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpIHsKKwkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoc2FjaGlwLT5pcnEsIE5VTEwpOworCQlzZXRfaXJxX2RhdGEoc2FjaGlwLT5pcnEsIE5VTEwpOworCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihzYWNoaXAtPnBoeXMgKyBTQTExMTFfSU5UQywgNTEyKTsKKwl9CisKKwlpb3VubWFwKHNhY2hpcC0+YmFzZSk7CisJa2ZyZWUoc2FjaGlwKTsKK30KKworLyoKKyAqIEFjY29yZGluZyB0byB0aGUgIkludGVsIFN0cm9uZ0FSTSBTQS0xMTExIE1pY3JvcHJvY2Vzc29yIENvbXBhbmlvbgorICogQ2hpcCBTcGVjaWZpY2F0aW9uIFVwZGF0ZSIgKEp1bmUgMjAwMCksIGVycmF0dW0gIzcsIHRoZXJlIGlzIGEKKyAqIHNpZ25pZmljYW50IGJ1ZyBpbiB0aGUgU0ExMTExIFNEUkFNIHNoYXJlZCBtZW1vcnkgY29udHJvbGxlci4gIElmCisgKiBhbiBhY2Nlc3MgdG8gYSByZWdpb24gb2YgbWVtb3J5IGFib3ZlIDFNQiByZWxhdGl2ZSB0byB0aGUgYmFuayBiYXNlLAorICogaXQgaXMgaW1wb3J0YW50IHRoYXQgYWRkcmVzcyBiaXQgMTAgX05PVF8gYmUgYXNzZXJ0ZWQuIERlcGVuZGluZworICogb24gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFJBTSwgYml0IDEwIG1heSBjb3JyZXNwb25kIHRvIG9uZQorICogb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgKHByb2Nlc3Nvci1yZWxhdGl2ZSkgYWRkcmVzcyBiaXRzLgorICoKKyAqIFRoaXMgcm91dGluZSBvbmx5IGlkZW50aWZpZXMgd2hldGhlciBvciBub3QgYSBnaXZlbiBETUEgYWRkcmVzcworICogaXMgc3VzY2VwdGlibGUgdG8gdGhlIGJ1Zy4KKyAqCisgKiBUaGlzIHNob3VsZCBvbmx5IGdldCBjYWxsZWQgZm9yIHNhMTExMV9kZXZpY2UgdHlwZXMgZHVlIHRvIHRoZQorICogd2F5IHdlIGNvbmZpZ3VyZSBvdXIgZGV2aWNlIGRtYV9tYXNrcy4KKyAqLworaW50IGRtYV9uZWVkc19ib3VuY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplKQoreworCS8qCisJICogU2VjdGlvbiA0LjYgb2YgdGhlICJJbnRlbCBTdHJvbmdBUk0gU0EtMTExMSBEZXZlbG9wbWVudCBNb2R1bGUKKwkgKiBVc2VyJ3MgR3VpZGUiIG1lbnRpb25zIHRoYXQganVtcGVycyBSNTEgYW5kIFI1MiBjb250cm9sIHRoZQorCSAqIHRhcmdldCBvZiBTQS0xMTExIERNQSAoZWl0aGVyIFNEUkFNIGJhbmsgMCBvbiBBc3NhYmV0LCBvcgorCSAqIFNEUkFNIGJhbmsgMSBvbiBOZXBvbnNldCkuIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2VsZWN0cworCSAqIEFzc2FiZXQsIHNvIGFueSBhZGRyZXNzIGluIGJhbmsgMSBpcyBuZWNlc3NhcmlseSBpbnZhbGlkLgorCSAqLworCXJldHVybiAoKG1hY2hpbmVfaXNfYXNzYWJldCgpIHx8IG1hY2hpbmVfaXNfcGZzMTY4KCkpICYmCisJCShhZGRyID49IDB4YzgwMDAwMDAgfHwgKGFkZHIgKyBzaXplKSA+PSAweGM4MDAwMDAwKSk7Cit9CisKK3N0cnVjdCBzYTExMTFfc2F2ZV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQJc2tjcjsKKwl1bnNpZ25lZCBpbnQJc2twY3I7CisJdW5zaWduZWQgaW50CXNrY2RyOworCXVuc2lnbmVkIGNoYXIJc2thdWQ7CisJdW5zaWduZWQgY2hhcglza3B3bTA7CisJdW5zaWduZWQgY2hhcglza3B3bTE7CisKKwkvKgorCSAqIEludGVycnVwdCBjb250cm9sbGVyCisJICovCisJdW5zaWduZWQgaW50CWludHBvbDA7CisJdW5zaWduZWQgaW50CWludHBvbDE7CisJdW5zaWduZWQgaW50CWludGVuMDsKKwl1bnNpZ25lZCBpbnQJaW50ZW4xOworCXVuc2lnbmVkIGludAl3YWtlcG9sMDsKKwl1bnNpZ25lZCBpbnQJd2FrZXBvbDE7CisJdW5zaWduZWQgaW50CXdha2VlbjA7CisJdW5zaWduZWQgaW50CXdha2VlbjE7Cit9OworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgc2ExMTExX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX3NhdmVfZGF0YSAqc2F2ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2YWw7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJaWYgKGxldmVsICE9IFNVU1BFTkRfRElTQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlzYXZlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhMTExMV9zYXZlX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNhdmUpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+cG93ZXIuc2F2ZWRfc3RhdGUgPSBzYXZlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTYXZlIHN0YXRlLgorCSAqLworCWJhc2UgPSBzYWNoaXAtPmJhc2U7CisJc2F2ZS0+c2tjciAgICAgPSBzYTExMTFfcmVhZGwoYmFzZSArIFNBMTExMV9TS0NSKTsKKwlzYXZlLT5za3BjciAgICA9IHNhMTExMV9yZWFkbChiYXNlICsgU0ExMTExX1NLUENSKTsKKwlzYXZlLT5za2NkciAgICA9IHNhMTExMV9yZWFkbChiYXNlICsgU0ExMTExX1NLQ0RSKTsKKwlzYXZlLT5za2F1ZCAgICA9IHNhMTExMV9yZWFkbChiYXNlICsgU0ExMTExX1NLQVVEKTsKKwlzYXZlLT5za3B3bTAgICA9IHNhMTExMV9yZWFkbChiYXNlICsgU0ExMTExX1NLUFdNMCk7CisJc2F2ZS0+c2twd20xICAgPSBzYTExMTFfcmVhZGwoYmFzZSArIFNBMTExMV9TS1BXTTEpOworCisJYmFzZSA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDOworCXNhdmUtPmludHBvbDAgID0gc2ExMTExX3JlYWRsKGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJc2F2ZS0+aW50cG9sMSAgPSBzYTExMTFfcmVhZGwoYmFzZSArIFNBMTExMV9JTlRQT0wxKTsKKwlzYXZlLT5pbnRlbjAgICA9IHNhMTExMV9yZWFkbChiYXNlICsgU0ExMTExX0lOVEVOMCk7CisJc2F2ZS0+aW50ZW4xICAgPSBzYTExMTFfcmVhZGwoYmFzZSArIFNBMTExMV9JTlRFTjEpOworCXNhdmUtPndha2Vwb2wwID0gc2ExMTExX3JlYWRsKGJhc2UgKyBTQTExMTFfV0FLRVBPTDApOworCXNhdmUtPndha2Vwb2wxID0gc2ExMTExX3JlYWRsKGJhc2UgKyBTQTExMTFfV0FLRVBPTDEpOworCXNhdmUtPndha2VlbjAgID0gc2ExMTExX3JlYWRsKGJhc2UgKyBTQTExMTFfV0FLRUVOMCk7CisJc2F2ZS0+d2FrZWVuMSAgPSBzYTExMTFfcmVhZGwoYmFzZSArIFNBMTExMV9XQUtFRU4xKTsKKworCS8qCisJICogRGlzYWJsZS4KKwkgKi8KKwl2YWwgPSBzYTExMTFfcmVhZGwoc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLQ1IpOworCXNhMTExMV93cml0ZWwodmFsIHwgU0tDUl9TTEVFUCwgc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLQ1IpOworCXNhMTExMV93cml0ZWwoMCwgc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLUFdNMCk7CisJc2ExMTExX3dyaXRlbCgwLCBzYWNoaXAtPmJhc2UgKyBTQTExMTFfU0tQV00xKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglzYTExMTFfcmVzdW1lIC0gUmVzdG9yZSB0aGUgU0ExMTExIGRldmljZSBzdGF0ZS4KKyAqCUBkZXY6IGRldmljZSB0byByZXN0b3JlCisgKglAbGV2ZWw6IHJlc3VtZSBsZXZlbAorICoKKyAqCVJlc3RvcmUgdGhlIGdlbmVyYWwgc3RhdGUgb2YgdGhlIFNBMTExMTsgY2xvY2sgY29udHJvbCBhbmQKKyAqCWludGVycnVwdCBjb250cm9sbGVyLiAgT3RoZXIgcGFydHMgb2YgdGhlIFNBMTExMSBtdXN0IGJlCisgKglyZXN0b3JlZCBieSB0aGVpciByZXNwZWN0aXZlIGRyaXZlcnMsIGFuZCBtdXN0IGJlIGNhbGxlZAorICoJdmlhIExETSBhZnRlciB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IHNhMTExMV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNhMTExMV9zYXZlX2RhdGEgKnNhdmU7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaWQ7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJaWYgKGxldmVsICE9IFJFU1VNRV9FTkFCTEUpCisJCXJldHVybiAwOworCisJc2F2ZSA9IChzdHJ1Y3Qgc2ExMTExX3NhdmVfZGF0YSAqKWRldi0+cG93ZXIuc2F2ZWRfc3RhdGU7CisJaWYgKCFzYXZlKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIFNBMTExMSBpcyBzdGlsbCBoZXJlLgorCSAqIEZJWE1FOiBzaG91bGRuJ3QgZG8gdGhpcyBoZXJlLgorCSAqLworCWlkID0gc2ExMTExX3JlYWRsKHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0lEKTsKKwlpZiAoKGlkICYgU0tJRF9JRF9NQVNLKSAhPSBTS0lEX1NBMTExMV9JRCkgeworCQlfX3NhMTExMV9yZW1vdmUoc2FjaGlwKTsKKwkJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJCWtmcmVlKHNhdmUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEZpcnN0IG9mIGFsbCwgd2FrZSB1cCB0aGUgY2hpcC4KKwkgKi8KKwlzYTExMTFfd2FrZShzYWNoaXApOworCXNhMTExMV93cml0ZWwoMCwgc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEMgKyBTQTExMTFfSU5URU4wKTsKKwlzYTExMTFfd3JpdGVsKDAsIHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDICsgU0ExMTExX0lOVEVOMSk7CisKKwliYXNlID0gc2FjaGlwLT5iYXNlOworCXNhMTExMV93cml0ZWwoc2F2ZS0+c2tjciwgICAgIGJhc2UgKyBTQTExMTFfU0tDUik7CisJc2ExMTExX3dyaXRlbChzYXZlLT5za3BjciwgICAgYmFzZSArIFNBMTExMV9TS1BDUik7CisJc2ExMTExX3dyaXRlbChzYXZlLT5za2NkciwgICAgYmFzZSArIFNBMTExMV9TS0NEUik7CisJc2ExMTExX3dyaXRlbChzYXZlLT5za2F1ZCwgICAgYmFzZSArIFNBMTExMV9TS0FVRCk7CisJc2ExMTExX3dyaXRlbChzYXZlLT5za3B3bTAsICAgYmFzZSArIFNBMTExMV9TS1BXTTApOworCXNhMTExMV93cml0ZWwoc2F2ZS0+c2twd20xLCAgIGJhc2UgKyBTQTExMTFfU0tQV00xKTsKKworCWJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKKwlzYTExMTFfd3JpdGVsKHNhdmUtPmludHBvbDAsICBiYXNlICsgU0ExMTExX0lOVFBPTDApOworCXNhMTExMV93cml0ZWwoc2F2ZS0+aW50cG9sMSwgIGJhc2UgKyBTQTExMTFfSU5UUE9MMSk7CisJc2ExMTExX3dyaXRlbChzYXZlLT5pbnRlbjAsICAgYmFzZSArIFNBMTExMV9JTlRFTjApOworCXNhMTExMV93cml0ZWwoc2F2ZS0+aW50ZW4xLCAgIGJhc2UgKyBTQTExMTFfSU5URU4xKTsKKwlzYTExMTFfd3JpdGVsKHNhdmUtPndha2Vwb2wwLCBiYXNlICsgU0ExMTExX1dBS0VQT0wwKTsKKwlzYTExMTFfd3JpdGVsKHNhdmUtPndha2Vwb2wxLCBiYXNlICsgU0ExMTExX1dBS0VQT0wxKTsKKwlzYTExMTFfd3JpdGVsKHNhdmUtPndha2VlbjAsICBiYXNlICsgU0ExMTExX1dBS0VFTjApOworCXNhMTExMV93cml0ZWwoc2F2ZS0+d2FrZWVuMSwgIGJhc2UgKyBTQTExMTFfV0FLRUVOMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKworCWRldi0+cG93ZXIuc2F2ZWRfc3RhdGUgPSBOVUxMOworCWtmcmVlKHNhdmUpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHNhMTExMV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgc2ExMTExX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2ExMTExX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJlc291cmNlICptZW07CisJaW50IGlycTsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pCisJCXJldHVybiAtRUlOVkFMOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlyZXR1cm4gX19zYTExMTFfcHJvYmUoZGV2LCBtZW0sIGlycSk7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoc2FjaGlwKSB7CisJCV9fc2ExMTExX3JlbW92ZShzYWNoaXApOworCQlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworI2lmZGVmIENPTkZJR19QTQorCQlrZnJlZShkZXYtPnBvd2VyLnNhdmVkX3N0YXRlKTsKKwkJZGV2LT5wb3dlci5zYXZlZF9zdGF0ZSA9IE5VTEw7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU5vdCBzdXJlIGlmIHRoaXMgc2hvdWxkIGJlIG9uIHRoZSBzeXN0ZW0gYnVzIG9yIG5vdCB5ZXQuCisgKglXZSByZWFsbHkgd2FudCBzb21lIHdheSB0byByZWdpc3RlciBhIHN5c3RlbSBkZXZpY2UgYXQKKyAqCXRoZSBwZXItbWFjaGluZSBsZXZlbCwgYW5kIHRoZW4gaGF2ZSB0aGlzIGRyaXZlciBwaWNrCisgKgl1cCB0aGUgcmVnaXN0ZXJlZCBkZXZpY2VzLgorICoKKyAqCVdlIGFsc28gbmVlZCB0byBoYW5kbGUgdGhlIFNEUkFNIGNvbmZpZ3VyYXRpb24gZm9yCisgKglQWEEyNTAvU0ExMTEwIG1hY2hpbmUgY2xhc3Nlcy4KKyAqLworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHNhMTExMV9kZXZpY2VfZHJpdmVyID0geworCS5uYW1lCQk9ICJzYTExMTEiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzYTExMTFfcHJvYmUsCisJLnJlbW92ZQkJPSBzYTExMTFfcmVtb3ZlLAorCS5zdXNwZW5kCT0gc2ExMTExX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzYTExMTFfcmVzdW1lLAorfTsKKworLyoKKyAqCUdldCB0aGUgcGFyZW50IGRldmljZSBkcml2ZXIgKHVzKSBzdHJ1Y3R1cmUKKyAqCWZyb20gYSBjaGlsZCBmdW5jdGlvbiBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2ExMTExICpzYTExMTFfY2hpcF9kcml2ZXIoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2KQoreworCXJldHVybiAoc3RydWN0IHNhMTExMSAqKWRldl9nZXRfZHJ2ZGF0YShzYWRldi0+ZGV2LnBhcmVudCk7Cit9CisKKy8qCisgKiBUaGUgYml0cyBpbiB0aGUgb3BkaXYgZmllbGQgYXJlIG5vbi1saW5lYXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG9wZGl2X3RhYmxlW10gPSB7IDEsIDQsIDIsIDggfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBfX3NhMTExMV9wbGxfY2xvY2soc3RydWN0IHNhMTExMSAqc2FjaGlwKQoreworCXVuc2lnbmVkIGludCBza2NkciwgZmJkaXYsIGlwZGl2LCBvcGRpdjsKKworCXNrY2RyID0gc2ExMTExX3JlYWRsKHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0NEUik7CisKKwlmYmRpdiA9IChza2NkciAmIDB4MDA3ZikgKyAyOworCWlwZGl2ID0gKChza2NkciAmIDB4MGY4MCkgPj4gNykgKyAyOworCW9wZGl2ID0gb3BkaXZfdGFibGVbKHNrY2RyICYgMHgzMDAwKSA+PiAxMl07CisKKwlyZXR1cm4gMzY4NjQwMCAqIGZiZGl2IC8gKGlwZGl2ICogb3BkaXYpOworfQorCisvKioKKyAqCXNhMTExMV9wbGxfY2xvY2sgLSByZXR1cm4gdGhlIGN1cnJlbnQgUExMIGNsb2NrIGZyZXF1ZW5jeS4KKyAqCUBzYWRldjogU0ExMTExIGZ1bmN0aW9uIGJsb2NrCisgKgorICoJQlVHOiB3ZSBzaG91bGQgbG9vayBhdCBTS0NSLiAgV2UgYWxzbyBibGluZGx5IGJlbGlldmUgdGhhdAorICoJdGhlIGNoaXAgaXMgYmVpbmcgZmVkIHdpdGggdGhlIDMuNjg2NE1IeiBjbG9jay4KKyAqCisgKglSZXR1cm5zIHRoZSBQTEwgY2xvY2sgaW4gSHouCisgKi8KK3Vuc2lnbmVkIGludCBzYTExMTFfcGxsX2Nsb2NrKHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBzYTExMTFfY2hpcF9kcml2ZXIoc2FkZXYpOworCisJcmV0dXJuIF9fc2ExMTExX3BsbF9jbG9jayhzYWNoaXApOworfQorCisvKioKKyAqCXNhMTExMV9zZWxlY3RfYXVkaW9fbW9kZSAtIHNlbGVjdCBJMlMgb3IgQUMgbGluayBtb2RlCisgKglAc2FkZXY6IFNBMTExMSBmdW5jdGlvbiBibG9jaworICoJQG1vZGU6IE9uZSBvZiAlU0ExMTExX0FVRElPX0FDTElOSyBvciAlU0ExMTExX0FVRElPX0kyUworICoKKyAqCUZyb2IgdGhlIFNLQ1IgdG8gc2VsZWN0IEFDIExpbmsgbW9kZSBvciBJMlMgbW9kZSBmb3IKKyAqCXRoZSBhdWRpbyBibG9jay4KKyAqLwordm9pZCBzYTExMTFfc2VsZWN0X2F1ZGlvX21vZGUoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBzYTExMTFfY2hpcF9kcml2ZXIoc2FkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHNhMTExMV9yZWFkbChzYWNoaXAtPmJhc2UgKyBTQTExMTFfU0tDUik7CisJaWYgKG1vZGUgPT0gU0ExMTExX0FVRElPX0kyUykgeworCQl2YWwgJj0gflNLQ1JfU0VMQUM7CisJfSBlbHNlIHsKKwkJdmFsIHw9IFNLQ1JfU0VMQUM7CisJfQorCXNhMTExMV93cml0ZWwodmFsLCBzYWNoaXAtPmJhc2UgKyBTQTExMTFfU0tDUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKglzYTExMTFfc2V0X2F1ZGlvX3JhdGUgLSBzZXQgdGhlIGF1ZGlvIHNhbXBsZSByYXRlCisgKglAc2FkZXY6IFNBMTExMSBTQUMgZnVuY3Rpb24gYmxvY2sKKyAqCUByYXRlOiBzYW1wbGUgcmF0ZSB0byBzZWxlY3QKKyAqLworaW50IHNhMTExMV9zZXRfYXVkaW9fcmF0ZShzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYsIGludCByYXRlKQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHNhMTExMV9jaGlwX2RyaXZlcihzYWRldik7CisJdW5zaWduZWQgaW50IGRpdjsKKworCWlmIChzYWRldi0+ZGV2aWQgIT0gU0ExMTExX0RFVklEX1NBQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYgPSAoX19zYTExMTFfcGxsX2Nsb2NrKHNhY2hpcCkgLyAyNTYgKyByYXRlIC8gMikgLyByYXRlOworCWlmIChkaXYgPT0gMCkKKwkJZGl2ID0gMTsKKwlpZiAoZGl2ID4gMTI4KQorCQlkaXYgPSAxMjg7CisKKwlzYTExMTFfd3JpdGVsKGRpdiAtIDEsIHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0FVRCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzYTExMTFfZ2V0X2F1ZGlvX3JhdGUgLSBnZXQgdGhlIGF1ZGlvIHNhbXBsZSByYXRlCisgKglAc2FkZXY6IFNBMTExMSBTQUMgZnVuY3Rpb24gYmxvY2sgZGV2aWNlCisgKi8KK2ludCBzYTExMTFfZ2V0X2F1ZGlvX3JhdGUoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2KQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHNhMTExMV9jaGlwX2RyaXZlcihzYWRldik7CisJdW5zaWduZWQgbG9uZyBkaXY7CisKKwlpZiAoc2FkZXYtPmRldmlkICE9IFNBMTExMV9ERVZJRF9TQUMpCisJCXJldHVybiAtRUlOVkFMOworCisJZGl2ID0gc2ExMTExX3JlYWRsKHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0FVRCkgKyAxOworCisJcmV0dXJuIF9fc2ExMTExX3BsbF9jbG9jayhzYWNoaXApIC8gKDI1NiAqIGRpdik7Cit9CisKK3ZvaWQgc2ExMTExX3NldF9pb19kaXIoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2LAorCQkgICAgICAgdW5zaWduZWQgaW50IGJpdHMsIHVuc2lnbmVkIGludCBkaXIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2xlZXBfZGlyKQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHNhMTExMV9jaGlwX2RyaXZlcihzYWRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZvaWQgX19pb21lbSAqZ3BpbyA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9HUElPOworCisjZGVmaW5lIE1PRElGWV9CSVRTKHBvcnQsIG1hc2ssIGRpcikJCVwKKwlpZiAobWFzaykgewkJCQlcCisJCXZhbCA9IHNhMTExMV9yZWFkbChwb3J0KTsJXAorCQl2YWwgJj0gfihtYXNrKTsJCQlcCisJCXZhbCB8PSAoZGlyKSAmIChtYXNrKTsJCVwKKwkJc2ExMTExX3dyaXRlbCh2YWwsIHBvcnQpOwlcCisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQUREUiwgYml0cyAmIDE1LCBkaXIpOworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQkREUiwgKGJpdHMgPj4gOCkgJiAyNTUsIGRpciA+PiA4KTsKKwlNT0RJRllfQklUUyhncGlvICsgU0ExMTExX0dQSU9fUENERFIsIChiaXRzID4+IDE2KSAmIDI1NSwgZGlyID4+IDE2KTsKKworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQVNEUiwgYml0cyAmIDE1LCBzbGVlcF9kaXIpOworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQlNEUiwgKGJpdHMgPj4gOCkgJiAyNTUsIHNsZWVwX2RpciA+PiA4KTsKKwlNT0RJRllfQklUUyhncGlvICsgU0ExMTExX0dQSU9fUENTRFIsIChiaXRzID4+IDE2KSAmIDI1NSwgc2xlZXBfZGlyID4+IDE2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzYTExMTFfc2V0X2lvKHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiwgdW5zaWduZWQgaW50IGJpdHMsIHVuc2lnbmVkIGludCB2KQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHNhMTExMV9jaGlwX2RyaXZlcihzYWRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZvaWQgX19pb21lbSAqZ3BpbyA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9HUElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQURXUiwgYml0cyAmIDE1LCB2KTsKKwlNT0RJRllfQklUUyhncGlvICsgU0ExMTExX0dQSU9fUEJEV1IsIChiaXRzID4+IDgpICYgMjU1LCB2ID4+IDgpOworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQ0RXUiwgKGJpdHMgPj4gMTYpICYgMjU1LCB2ID4+IDE2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzYTExMTFfc2V0X3NsZWVwX2lvKHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiwgdW5zaWduZWQgaW50IGJpdHMsIHVuc2lnbmVkIGludCB2KQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHNhMTExMV9jaGlwX2RyaXZlcihzYWRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZvaWQgX19pb21lbSAqZ3BpbyA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9HUElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQVNTUiwgYml0cyAmIDE1LCB2KTsKKwlNT0RJRllfQklUUyhncGlvICsgU0ExMTExX0dQSU9fUEJTU1IsIChiaXRzID4+IDgpICYgMjU1LCB2ID4+IDgpOworCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQ1NTUiwgKGJpdHMgPj4gMTYpICYgMjU1LCB2ID4+IDE2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEluZGl2aWR1YWwgZGV2aWNlIG9wZXJhdGlvbnMuCisgKi8KKworLyoqCisgKglzYTExMTFfZW5hYmxlX2RldmljZSAtIGVuYWJsZSBhbiBvbi1jaGlwIFNBMTExMSBmdW5jdGlvbiBibG9jaworICoJQHNhZGV2OiBTQTExMTEgZnVuY3Rpb24gYmxvY2sgZGV2aWNlIHRvIGVuYWJsZQorICovCit2b2lkIHNhMTExMV9lbmFibGVfZGV2aWNlKHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBzYTExMTFfY2hpcF9kcml2ZXIoc2FkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKwl2YWwgPSBzYTExMTFfcmVhZGwoc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLUENSKTsKKwlzYTExMTFfd3JpdGVsKHZhbCB8IHNhZGV2LT5za3Bjcl9tYXNrLCBzYWNoaXAtPmJhc2UgKyBTQTExMTFfU0tQQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCXNhMTExMV9kaXNhYmxlX2RldmljZSAtIGRpc2FibGUgYW4gb24tY2hpcCBTQTExMTEgZnVuY3Rpb24gYmxvY2sKKyAqCUBzYWRldjogU0ExMTExIGZ1bmN0aW9uIGJsb2NrIGRldmljZSB0byBkaXNhYmxlCisgKi8KK3ZvaWQgc2ExMTExX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBzYTExMTFfY2hpcF9kcml2ZXIoc2FkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKwl2YWwgPSBzYTExMTFfcmVhZGwoc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLUENSKTsKKwlzYTExMTFfd3JpdGVsKHZhbCAmIH5zYWRldi0+c2twY3JfbWFzaywgc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLUENSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqCVNBMTExMSAiUmVnaXN0ZXIgQWNjZXNzIEJ1cy4iCisgKgorICoJV2UgbW9kZWwgdGhpcyBhcyBhIHJlZ3VsYXIgYnVzIHR5cGUsIGFuZCBoYW5nIGRldmljZXMgZGlyZWN0bHkKKyAqCW9mZiB0aGlzLgorICovCitzdGF0aWMgaW50IHNhMTExMV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKK3sKKwlzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2ID0gU0ExMTExX0RFVihfZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihfZHJ2KTsKKworCXJldHVybiBkZXYtPmRldmlkID09IGRydi0+ZGV2aWQ7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX2J1c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IFNBMTExMV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihkZXYtPmRyaXZlcik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZHJ2ICYmIGRydi0+c3VzcGVuZCkKKwkJcmV0ID0gZHJ2LT5zdXNwZW5kKHNhZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzYTExMTFfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gU0ExMTExX0RFVihkZXYpOworCXN0cnVjdCBzYTExMTFfZHJpdmVyICpkcnYgPSBTQTExMTFfRFJWKGRldi0+ZHJpdmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWUpCisJCXJldCA9IGRydi0+cmVzdW1lKHNhZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNhMTExMV9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IFNBMTExMV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihkZXYtPmRyaXZlcik7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAoZHJ2LT5wcm9iZSkKKwkJcmV0ID0gZHJ2LT5wcm9iZShzYWRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzYTExMTFfYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gU0ExMTExX0RFVihkZXYpOworCXN0cnVjdCBzYTExMTFfZHJpdmVyICpkcnYgPSBTQTExMTFfRFJWKGRldi0+ZHJpdmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkcnYtPnJlbW92ZSkKKwkJcmV0ID0gZHJ2LT5yZW1vdmUoc2FkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBidXNfdHlwZSBzYTExMTFfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gInNhMTExMS1yYWIiLAorCS5tYXRjaAkJPSBzYTExMTFfbWF0Y2gsCisJLnN1c3BlbmQJPSBzYTExMTFfYnVzX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzYTExMTFfYnVzX3Jlc3VtZSwKK307CisKK2ludCBzYTExMTFfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzYTExMTFfZHJpdmVyICpkcml2ZXIpCit7CisJZHJpdmVyLT5kcnYucHJvYmUgPSBzYTExMTFfYnVzX3Byb2JlOworCWRyaXZlci0+ZHJ2LnJlbW92ZSA9IHNhMTExMV9idXNfcmVtb3ZlOworCWRyaXZlci0+ZHJ2LmJ1cyA9ICZzYTExMTFfYnVzX3R5cGU7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcnYpOworfQorCit2b2lkIHNhMTExMV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJpdmVyKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRydik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNhMTExMV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IGJ1c19yZWdpc3Rlcigmc2ExMTExX2J1c190eXBlKTsKKwlpZiAocmV0ID09IDApCisJCWRyaXZlcl9yZWdpc3Rlcigmc2ExMTExX2RldmljZV9kcml2ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYTExMTFfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzYTExMTFfZGV2aWNlX2RyaXZlcik7CisJYnVzX3VucmVnaXN0ZXIoJnNhMTExMV9idXNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KHNhMTExMV9pbml0KTsKK21vZHVsZV9leGl0KHNhMTExMV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBDb3Jwb3JhdGlvbiBTQTExMTEgY29yZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChzYTExMTFfc2VsZWN0X2F1ZGlvX21vZGUpOworRVhQT1JUX1NZTUJPTChzYTExMTFfc2V0X2F1ZGlvX3JhdGUpOworRVhQT1JUX1NZTUJPTChzYTExMTFfZ2V0X2F1ZGlvX3JhdGUpOworRVhQT1JUX1NZTUJPTChzYTExMTFfc2V0X2lvX2Rpcik7CitFWFBPUlRfU1lNQk9MKHNhMTExMV9zZXRfaW8pOworRVhQT1JUX1NZTUJPTChzYTExMTFfc2V0X3NsZWVwX2lvKTsKK0VYUE9SVF9TWU1CT0woc2ExMTExX2VuYWJsZV9kZXZpY2UpOworRVhQT1JUX1NZTUJPTChzYTExMTFfZGlzYWJsZV9kZXZpY2UpOworRVhQT1JUX1NZTUJPTChzYTExMTFfcGxsX2Nsb2NrKTsKK0VYUE9SVF9TWU1CT0woc2ExMTExX2J1c190eXBlKTsKK0VYUE9SVF9TWU1CT0woc2ExMTExX2RyaXZlcl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHNhMTExMV9kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vc2Nvb3AuYyBiL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDBkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb21tb24vc2Nvb3AuYwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIFN1cHBvcnQgY29kZSBmb3IgdGhlIFNDT09QIGludGVyZmFjZSBmb3VuZCBvbiB2YXJpb3VzIFNoYXJwIFBEQXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUmljaGFyZCBQdXJkaWUKKyAqCisgKglCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgU2hhcnAvTGluZW8gZm9yIDIuNCBrZXJuZWxzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgorCisjZGVmaW5lIFNDT09QX1JFRyhkLGFkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKShkICsoYWRyKSkpCisKK3N0cnVjdCAgc2Nvb3BfZGV2IHsKKwl2b2lkICAqYmFzZTsKKwlzcGlubG9ja190IHNjb29wX2xvY2s7CisJdTMyIHNjb29wX2dwd3I7Cit9OworCit2b2lkIHJlc2V0X3Njb29wKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2Nvb3BfZGV2ICpzZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9NQ1IpID0gMHgwMTAwOyAgLy8gMDAKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9DRFIpID0gMHgwMDAwOyAgLy8gMDQKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9DUFIpID0gMHgwMDAwOyAgLy8gMEMKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9DQ1IpID0gMHgwMDAwOyAgLy8gMTAKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9JTVIpID0gMHgwMDAwOyAgLy8gMTgKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9JUk0pID0gMHgwMEZGOyAgLy8gMTQKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9JU1IpID0gMHgwMDAwOyAgLy8gMUMKKwlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9JUk0pID0gMHgwMDAwOworfQorCit1bnNpZ25lZCBzaG9ydCBzZXRfc2Nvb3BfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGJpdCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBncGlvX2JpdDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJc3RydWN0IHNjb29wX2RldiAqc2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZXYtPnNjb29wX2xvY2ssIGZsYWcpOworCWdwaW9fYml0ID0gU0NPT1BfUkVHKHNkZXYtPmJhc2UsIFNDT09QX0dQV1IpIHwgYml0OworCVNDT09QX1JFRyhzZGV2LT5iYXNlLCBTQ09PUF9HUFdSKSA9IGdwaW9fYml0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZXYtPnNjb29wX2xvY2ssIGZsYWcpOworCisJcmV0dXJuIGdwaW9fYml0OworfQorCit1bnNpZ25lZCBzaG9ydCByZXNldF9zY29vcF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgYml0KQoreworCXVuc2lnbmVkIHNob3J0IGdwaW9fYml0OworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwlzdHJ1Y3Qgc2Nvb3BfZGV2ICpzZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Rldi0+c2Nvb3BfbG9jaywgZmxhZyk7CisJZ3Bpb19iaXQgPSBTQ09PUF9SRUcoc2Rldi0+YmFzZSwgU0NPT1BfR1BXUikgJiB+Yml0OworCVNDT09QX1JFRyhzZGV2LT5iYXNlLFNDT09QX0dQV1IpID0gZ3Bpb19iaXQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Rldi0+c2Nvb3BfbG9jaywgZmxhZyk7CisKKwlyZXR1cm4gZ3Bpb19iaXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woc2V0X3Njb29wX2dwaW8pOworRVhQT1JUX1NZTUJPTChyZXNldF9zY29vcF9ncGlvKTsKKwordW5zaWduZWQgc2hvcnQgcmVhZF9zY29vcF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJc3RydWN0IHNjb29wX2RldiAqc2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBTQ09PUF9SRUcoc2Rldi0+YmFzZSxyZWcpOworfQorCit2b2lkIHdyaXRlX3Njb29wX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2Nvb3BfZGV2ICpzZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJU0NPT1BfUkVHKHNkZXYtPmJhc2UscmVnKT1kYXRhOworfQorCitFWFBPUlRfU1lNQk9MKHJlc2V0X3Njb29wKTsKK0VYUE9SVF9TWU1CT0wocmVhZF9zY29vcF9yZWcpOworRVhQT1JUX1NZTUJPTCh3cml0ZV9zY29vcF9yZWcpOworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHNjb29wX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1aW50MzJfdCBzdGF0ZSwgdWludDMyX3QgbGV2ZWwpCit7CisJaWYgKGxldmVsID09IFNVU1BFTkRfUE9XRVJfRE9XTikgeworCQlzdHJ1Y3Qgc2Nvb3BfZGV2ICpzZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkJc2Rldi0+c2Nvb3BfZ3B3ciA9IFNDT09QX1JFRyhzZGV2LT5iYXNlLFNDT09QX0dQV1IpOworCQlTQ09PUF9SRUcoc2Rldi0+YmFzZSxTQ09PUF9HUFdSKSA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjb29wX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQzMl90IGxldmVsKQoreworCWlmIChsZXZlbCA9PSBSRVNVTUVfUE9XRVJfT04pIHsKKwkJc3RydWN0IHNjb29wX2RldiAqc2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJCVNDT09QX1JFRyhzZGV2LT5iYXNlLFNDT09QX0dQV1IpID0gc2Rldi0+c2Nvb3BfZ3B3cjsKKwl9CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzY29vcF9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc2Nvb3BfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitpbnQgX19pbml0IHNjb29wX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2Nvb3BfZGV2ICpkZXZwdHI7CisJc3RydWN0IHNjb29wX2NvbmZpZyAqaW5mOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2Nvb3BfZGV2KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldnB0cikKKwkJcmV0dXJuICAtRU5PTUVNOworCisJbWVtc2V0KGRldnB0ciwgMCwgc2l6ZW9mKHN0cnVjdCBzY29vcF9kZXYpKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2cHRyLT5zY29vcF9sb2NrKTsKKworCWluZiA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlkZXZwdHItPmJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIG1lbS0+ZW5kIC0gbWVtLT5zdGFydCArIDEpOworCisJaWYgKCFkZXZwdHItPmJhc2UpIHsKKwkJa2ZyZWUoZGV2cHRyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgZGV2cHRyKTsKKworCXByaW50aygiU2hhcnAgU2Nvb3AgRGV2aWNlIGZvdW5kIGF0IDB4JTA4eCAtPiAweCUwOHhcbiIsKHVuc2lnbmVkIGludCltZW0tPnN0YXJ0LCh1bnNpZ25lZCBpbnQpZGV2cHRyLT5iYXNlKTsKKworCVNDT09QX1JFRyhkZXZwdHItPmJhc2UsIFNDT09QX01DUikgPSAweDAxNDA7CisJcmVzZXRfc2Nvb3AoZGV2KTsKKwlTQ09PUF9SRUcoZGV2cHRyLT5iYXNlLCBTQ09PUF9HUENSKSA9IGluZi0+aW9fZGlyICYgMHhmZmZmOworCVNDT09QX1JFRyhkZXZwdHItPmJhc2UsIFNDT09QX0dQV1IpID0gaW5mLT5pb19vdXQgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY29vcF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY29vcF9kZXYgKnNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoc2RldikgeworCQlpb3VubWFwKHNkZXYtPmJhc2UpOworCQlrZnJlZShzZGV2KTsKKwkJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc2Nvb3BfZHJpdmVyID0geworCS5uYW1lCQk9ICJzaGFycC1zY29vcCIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IHNjb29wX3Byb2JlLAorCS5yZW1vdmUgCT0gc2Nvb3BfcmVtb3ZlLAorCS5zdXNwZW5kCT0gc2Nvb3Bfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNjb29wX3Jlc3VtZSwKK307CisKK2ludCBfX2luaXQgc2Nvb3BfaW5pdCh2b2lkKQoreworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnNjb29wX2RyaXZlcik7Cit9CisKK3N1YnN5c19pbml0Y2FsbChzY29vcF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zaGFycHNsX3BhcmFtLmMgYi9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYzU1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wYXJhbS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBIYXJkd2FyZSBwYXJhbWV0ZXIgYXJlYSBzcGVjaWZpYyB0byBTaGFycCBTTCBzZXJpZXMgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBSaWNoYXJkIFB1cmRpZQorICoKKyAqIEJhc2VkIG9uIFNoYXJwJ3MgMi40IGtlcm5lbCBwYXRjaGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NoYXJwc2xfcGFyYW0uaD4KKworLyoKKyAqIENlcnRhaW4gaGFyZHdhcmUgcGFyYW1ldGVycyBkZXRlcm1pbmVkIGF0IHRoZSB0aW1lIG9mIGRldmljZSBtYW51ZmFjdHVyZSwKKyAqIHR5cGljYWxseSBpbmNsdWRpbmcgTENEIHBhcmFtZXRlcnMgYXJlIGxvYWRlZCBieSB0aGUgYm9vdGxvYWRlciBhdCB0aGUKKyAqIGFkZHJlc3MgUEFSQU1fQkFTRS4gQXMgdGhlIGtlcm5lbCB3aWxsIG92ZXJ3cml0ZSB0aGVtLCB3ZSBuZWVkIHRvIHN0b3JlCisgKiB0aGVtIGVhcmx5IGluIHRoZSBib290IHByb2Nlc3MsIHRoZW4gcGFzcyB0aGVtIHRvIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXJzLgorICogTm90IGFsbCBkZXZpY2VzIHVzZSBhbGwgcGFyYW1hdGVycyBidXQgdGhlIGZvcm1hdCBpcyBjb21tb24gdG8gYWxsLgorICovCisjaWZkZWYgQVJDSF9TQTExMDAKKyNkZWZpbmUgUEFSQU1fQkFTRQkweGU4ZmZjMDAwCisjZWxzZQorI2RlZmluZSBQQVJBTV9CQVNFCTB4YTAwMDBhMDAKKyNlbmRpZgorI2RlZmluZSBNQUdJQ19DSEcoYSxiLGMsZCkgKCAoIGQgPDwgMjQgKSB8ICggYyA8PCAxNiApICB8ICggYiA8PCA4ICkgfCBhICkKKworI2RlZmluZSBDT01BREpfTUFHSUMJTUFHSUNfQ0hHKCdDJywnTScsJ0EnLCdEJykKKyNkZWZpbmUgVVVJRF9NQUdJQwlNQUdJQ19DSEcoJ1UnLCdVJywnSScsJ0QnKQorI2RlZmluZSBUT1VDSF9NQUdJQwlNQUdJQ19DSEcoJ1QnLCdVJywnQycsJ0gnKQorI2RlZmluZSBBRF9NQUdJQwlNQUdJQ19DSEcoJ0InLCdWJywnQScsJ0QnKQorI2RlZmluZSBQSEFEX01BR0lDCU1BR0lDX0NIRygnUCcsJ0gnLCdBJywnRCcpCisKK3N0cnVjdCBzaGFycHNsX3BhcmFtX2luZm8gc2hhcnBzbF9wYXJhbTsKKwordm9pZCBzaGFycHNsX3NhdmVfcGFyYW0odm9pZCkKK3sKKwltZW1jcHkoJnNoYXJwc2xfcGFyYW0sICh2b2lkICopUEFSQU1fQkFTRSwgc2l6ZW9mKHN0cnVjdCBzaGFycHNsX3BhcmFtX2luZm8pKTsKKworCWlmIChzaGFycHNsX3BhcmFtLmNvbWFkal9rZXl3b3JkICE9IENPTUFESl9NQUdJQykKKwkJc2hhcnBzbF9wYXJhbS5jb21hZGo9LTE7CisKKwlpZiAoc2hhcnBzbF9wYXJhbS5waGFkX2tleXdvcmQgIT0gUEhBRF9NQUdJQykKKwkJc2hhcnBzbF9wYXJhbS5waGFkYWRqPS0xOworCisJaWYgKHNoYXJwc2xfcGFyYW0udXVpZF9rZXl3b3JkICE9IFVVSURfTUFHSUMpCisJCXNoYXJwc2xfcGFyYW0udXVpZFswXT0tMTsKKworCWlmIChzaGFycHNsX3BhcmFtLnRvdWNoX2tleXdvcmQgIT0gVE9VQ0hfTUFHSUMpCisJCXNoYXJwc2xfcGFyYW0udG91Y2hfeHA9LTE7CisKKwlpZiAoc2hhcnBzbF9wYXJhbS5hZGFkal9rZXl3b3JkICE9IEFEX01BR0lDKQorCQlzaGFycHNsX3BhcmFtLmFkYWRqPS0xOworfQorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi90aW1lLWFjb3JuLmMgYi9hcmNoL2FybS9jb21tb24vdGltZS1hY29ybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NmFkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb21tb24vdGltZS1hY29ybi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vY29tbW9uL3RpbWUtYWNvcm4uYworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMCBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ2hhbmdlbG9nOgorICogICAyNC1TZXAtMTk5NglSTUsJQ3JlYXRlZAorICogICAxMC1PY3QtMTk5NglSTUsJQnJvdWdodCB1cCB0byBkYXRlIHdpdGggYXJjaC1zYTExMGV2YWwKKyAqICAgMDQtRGVjLTE5OTcJUk1LCVVwZGF0ZWQgZm9yIG5ldyBhcmNoL2FybS90aW1lLmMKKyAqICAgMTM9SnVuLTIwMDQJRFMJTW92ZWQgdG8gYXJjaC9hcm0vY29tbW9uIGIvYyBzaGFyZWQgdy9DTFBTNzUwMAorICovCisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9jLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKK3Vuc2lnbmVkIGxvbmcgaW9jX3RpbWVyX2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQxLCBjb3VudDIsIHN0YXR1czsKKwlsb25nIG9mZnNldDsKKworCWlvY193cml0ZWIgKDAsIElPQ19UMExBVENIKTsKKwliYXJyaWVyICgpOworCWNvdW50MSA9IGlvY19yZWFkYihJT0NfVDBDTlRMKSB8IChpb2NfcmVhZGIoSU9DX1QwQ05USCkgPDwgOCk7CisJYmFycmllciAoKTsKKwlzdGF0dXMgPSBpb2NfcmVhZGIoSU9DX0lSUVJFUUEpOworCWJhcnJpZXIgKCk7CisJaW9jX3dyaXRlYiAoMCwgSU9DX1QwTEFUQ0gpOworCWJhcnJpZXIgKCk7CisJY291bnQyID0gaW9jX3JlYWRiKElPQ19UMENOVEwpIHwgKGlvY19yZWFkYihJT0NfVDBDTlRIKSA8PCA4KTsKKworCW9mZnNldCA9IGNvdW50MjsKKwlpZiAoY291bnQyIDwgY291bnQxKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgbm90IGhhZCBhbiBpbnRlcnJ1cHQgYmV0d2VlbiByZWFkaW5nIGNvdW50MQorCQkgKiBhbmQgY291bnQyLgorCQkgKi8KKwkJaWYgKHN0YXR1cyAmICgxIDw8IDUpKQorCQkJb2Zmc2V0IC09IExBVENIOworCX0gZWxzZSBpZiAoY291bnQyID4gY291bnQxKSB7CisJCS8qCisJCSAqIFdlIGhhdmUganVzdCBoYWQgYW5vdGhlciBpbnRlcnJ1cHQgYmV0d2VlbiByZWFkaW5nCisJCSAqIGNvdW50MSBhbmQgY291bnQyLgorCQkgKi8KKwkJb2Zmc2V0IC09IExBVENIOworCX0KKworCW9mZnNldCA9IChMQVRDSCAtIG9mZnNldCkgKiAodGlja19uc2VjIC8gMTAwMCk7CisJcmV0dXJuIChvZmZzZXQgKyBMQVRDSC8yKSAvIExBVENIOworfQorCit2b2lkIF9faW5pdCBpb2N0aW1lX2luaXQodm9pZCkKK3sKKwlpb2Nfd3JpdGViKExBVENIICYgMjU1LCBJT0NfVDBMVENITCk7CisJaW9jX3dyaXRlYihMQVRDSCA+PiA4LCBJT0NfVDBMVENISCk7CisJaW9jX3dyaXRlYigwLCBJT0NfVDBHTyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAoraW9jX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCXRpbWVyX3RpY2socmVncyk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlvY190aW1lcl9pcnEgPSB7CisJLm5hbWUJCT0gInRpbWVyIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gaW9jX3RpbWVyX2ludGVycnVwdAorfTsKKworLyoKKyAqIFNldCB1cCB0aW1lciBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpb2NfdGltZXJfaW5pdCh2b2lkKQoreworCWlvY3RpbWVfaW5pdCgpOworCXNldHVwX2lycShJUlFfVElNRVIsICZpb2NfdGltZXJfaXJxKTsKK30KKworc3RydWN0IHN5c190aW1lciBpb2NfdGltZXIgPSB7CisJLmluaXQJCT0gaW9jX3RpbWVyX2luaXQsCisJLm9mZnNldAkJPSBpb2NfdGltZXJfZ2V0dGltZW9mZnNldCwKK307CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi92aWE4MmM1MDUuYyBiL2FyY2gvYXJtL2NvbW1vbi92aWE4MmM1MDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjcxNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29tbW9uL3ZpYTgyYzUwNS5jCkBAIC0wLDAgKzEsOTQgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorCisjZGVmaW5lIE1BWF9TTE9UUwkJNworCisjZGVmaW5lIENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpICAgKDB4ODAwMDAwMDAgfCAoYnVzLT5udW1iZXIgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgKHdoZXJlICYgfjMpKQorCitzdGF0aWMgaW50Cit2aWE4MmM1MDVfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsCisJCSAgICAgIGludCBzaXplLCB1MzIgKnZhbHVlKQoreworCW91dGwoQ09ORklHX0NNRChidXMsZGV2Zm4sd2hlcmUpLDB4Q0Y4KTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCSp2YWx1ZT1pbmIoMHhDRkMgKyAod2hlcmUmMykpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWx1ZT1pbncoMHhDRkMgKyAod2hlcmUmMikpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSp2YWx1ZT1pbmwoMHhDRkMpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludAordmlhODJjNTA1X3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwKKwkJICAgICAgIGludCBzaXplLCB1MzIgdmFsdWUpCit7CisJb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZmbix3aGVyZSksMHhDRjgpOworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJb3V0Yih2YWx1ZSwgMHhDRkMgKyAod2hlcmUmMykpOworCQlicmVhazsKKwljYXNlIDI6CisJCW91dHcodmFsdWUsIDB4Q0ZDICsgKHdoZXJlJjIpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlvdXRsKHZhbHVlLCAweENGQyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgdmlhODJjNTA1X29wcyA9IHsKKwkucmVhZAk9IHZpYTgyYzUwNV9yZWFkX2NvbmZpZywKKwkud3JpdGUJPSB2aWE4MmM1MDVfd3JpdGVfY29uZmlnLAorfTsKKwordm9pZCBfX2luaXQgdmlhODJjNTA1X3ByZWluaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBWSUEgODJjNTA1XG4iKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4QTgsMiwidmlhIGNvbmZpZyIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkciVklBIDgyYzUwNTogVW5hYmxlIHRvIHJlcXVlc3QgcmVnaW9uIDB4QThcbiIpOworCQlyZXR1cm47CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oMHhDRjgsOCwicGNpIGNvbmZpZyIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkciVklBIDgyYzUwNTogVW5hYmxlIHRvIHJlcXVlc3QgcmVnaW9uIDB4Q0Y4XG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oMHhBOCwgMik7CisJCXJldHVybjsKKwl9CisKKwkvKiBFbmFibGUgY29tcGF0aWJsZSBNb2RlICovCisJb3V0YigweDk2LDB4QTgpOworCW91dGIoMHgxOCwweEE5KTsKKwlvdXRiKDB4OTMsMHhBOCk7CisJb3V0YigweGQwLDB4QTkpOworCit9CisKK2ludCBfX2luaXQgdmlhODJjNTA1X3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCXJldHVybiAobnIgPT0gMCk7Cit9CisKK3N0cnVjdCBwY2lfYnVzICogX19pbml0IHZpYTgyYzUwNV9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5c2RhdGEpCit7CisJaWYgKG5yID09IDApCisJCXJldHVybiBwY2lfc2Nhbl9idXMoMCwgJnZpYTgyYzUwNV9vcHMsIHN5c2RhdGEpOworCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2Fzc2FiZXRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9hc3NhYmV0X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JiNGMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9hc3NhYmV0X2RlZmNvbmZpZwpAQCAtMCwwICsxLDkwNiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjExCisjIFdlZCBNYXIgIDkgMTM6MTM6MzAgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NBMTEwMD15CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIFNBMTF4MCBJbXBsZW1lbnRhdGlvbnMKKyMKK0NPTkZJR19TQTExMDBfQVNTQUJFVD15CisjIENPTkZJR19BU1NBQkVUX05FUE9OU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DRVJGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DT0xMSUUgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzYwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0JBREdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSk9STkFEQTcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSEFDS0tJVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfTEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfUExFQiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0hBTk5PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0lNUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9TU1AgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfU0ExMTAwPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXQj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQj15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0E9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKK0NPTkZJR19QQ0NBUkQ9eQorIyBDT05GSUdfUENNQ0lBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUE9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworIyBDT05GSUdfSTgyMzY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDSUMgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9TQTExMDA9eQorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfRElTQ09OVElHTUVNPXkKK0NPTkZJR19MRURTPXkKK0NPTkZJR19MRURTX1RJTUVSPXkKK0NPTkZJR19MRURTX0NQVT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0ibWVtPTMyTSBjb25zb2xlPXR0eVNBMCwzODQwMG44IGluaXRyZD0weGMwODAwMDAwLDNNIHJvb3Q9L2Rldi9yYW0iCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU0ExMTEwPXkKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKK0NPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX1NBMTEwMD15CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD1tCisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CitDT05GSUdfSVJEQT1tCisKKyMKKyMgSXJEQSBwcm90b2NvbHMKKyMKK0NPTkZJR19JUkxBTj1tCisjIENPTkZJR19JUkNPTU0gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQV9VTFRSQSBpcyBub3Qgc2V0CisKKyMKKyMgSXJEQSBvcHRpb25zCisjCisjIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBX0ZBU1RfUlIgaXMgbm90IHNldAorIyBDT05GSUdfSVJEQV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycworIworCisjCisjIFNJUiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfSVJUVFlfU0lSIGlzIG5vdCBzZXQKKworIworIyBEb25nbGUgc3VwcG9ydAorIworCisjCisjIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAorCisjCisjIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKKyMKKworIworIyBGSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX05TQ19GSVIgaXMgbm90IHNldAorIyBDT05GSUdfV0lOQk9ORF9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfU01DX0lSQ0NfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FMSV9GSVIgaXMgbm90IHNldAorQ09ORklHX1NBMTEwMF9GSVI9bQorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SQUNBTCBpcyBub3Qgc2V0CisjIENPTkZJR19BVDE3MDAgaXMgbm90IHNldAorIyBDT05GSUdfREVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUX1BDTUNJQT15CisjIENPTkZJR19QQ01DSUFfM0M1ODkgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBXzNDNTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9GTVZKMThYIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfUENORVQ9eQorIyBDT05GSUdfUENNQ0lBX05NQ0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfU01DOTFDOTIgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1hJUkMyUFMgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0FYTkVUIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9UU0RFVj15CitDT05GSUdfSU5QVVRfVFNERVZfU0NSRUVOX1g9MjQwCitDT05GSUdfSU5QVVRfVFNERVZfU0NSRUVOX1k9MzIwCitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IEkvTyBkcml2ZXJzCisjCisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD1tCisjIENPTkZJR19TRVJJQUxfODI1MF9DUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfU0ExMTAwPXkKK0NPTkZJR19TRVJJQUxfU0ExMTAwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9TQTExMDA9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorQ09ORklHX01TRE9TX0ZTPXkKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkNfQ0NJVFQ9bQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9iYWRnZTRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9iYWRnZTRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDA1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2JhZGdlNF9kZWZjb25maWcKQEAgLTAsMCArMSwxMjQwIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTYXQgTWFyIDI2IDIxOjMyOjI2IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKKyMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NBMTEwMD15CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIFNBMTF4MCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX1NBMTEwMF9BU1NBQkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DRVJGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DT0xMSUUgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzYwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDM4MDAgaXMgbm90IHNldAorQ09ORklHX1NBMTEwMF9CQURHRTQ9eQorIyBDT05GSUdfU0ExMTAwX0pPUk5BREE3MjAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0hBQ0tLSVQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0xBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1BMRUIgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NIQU5OT04gaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NJTVBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU1NQIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX1NBMTExMT15CitDT05GSUdfRE1BQk9VTkNFPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0RJU0NPTlRJR01FTT15CisjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJpbml0PS9saW51eHJjIHJvb3Q9L2Rldi9tdGRibG9jazMiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfQU9VVD1tCitDT05GSUdfQklORk1UX01JU0M9bQorQ09ORklHX0FSVEhVUj1tCisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfREVCVUc9eQorQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTAKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKKyMgQ09ORklHX01URF9DRklfSTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKK0NPTkZJR19NVERfUkFNPXkKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX01URF9TQTExMDA9eQorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19QQVJQT1JUPW0KKyMgQ09ORklHX1BBUlBPUlRfUEMgaXMgbm90IHNldAorQ09ORklHX1BBUlBPUlRfTk9UX1BDPXkKKyMgQ09ORklHX1BBUlBPUlRfQVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfR1NDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfMTI4NCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD1tCisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT1tCitDT05GSUdfQkxLX0RFVl9JREU9bQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPW0KKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVDRD1tCisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRkxPUFBZPW0KK0NPTkZJR19CTEtfREVWX0lERVNDU0k9bQorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz1tCisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9DSElQU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9bQorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NSPW0KKyMgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPXkKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19TQ1NJXzcwMDBGQVNTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSEExNTQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTjIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EVEMzMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QUEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTU0gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OQ1I1M0M0MDZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUEFTMTYgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QU0kyNDBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9VMTRfMzRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKK0NPTkZJR19JUkRBPXkKKworIworIyBJckRBIHByb3RvY29scworIworQ09ORklHX0lSTEFOPXkKK0NPTkZJR19JUkNPTU09eQorQ09ORklHX0lSREFfVUxUUkE9eQorCisjCisjIElyREEgb3B0aW9ucworIworIyBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAgaXMgbm90IHNldAorIyBDT05GSUdfSVJEQV9GQVNUX1JSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREFfREVCVUcgaXMgbm90IHNldAorCisjCisjIEluZnJhcmVkLXBvcnQgZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lSVFRZX1NJUiBpcyBub3Qgc2V0CisKKyMKKyMgRG9uZ2xlIHN1cHBvcnQKKyMKKworIworIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19JUlBPUlRfU0lSIGlzIG5vdCBzZXQKKworIworIyBPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0CisjCisKKyMKKyMgRklSIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUdNQVRFTF9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfTlNDX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19XSU5CT05EX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTUNfSVJDQ19GSVIgaXMgbm90IHNldAorIyBDT05GSUdfQUxJX0ZJUiBpcyBub3Qgc2V0CitDT05GSUdfU0ExMTAwX0ZJUj15CitDT05GSUdfQlQ9bQorQ09ORklHX0JUX0wyQ0FQPW0KKyMgQ09ORklHX0JUX1NDTyBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9SRkNPTU0gaXMgbm90IHNldAorIyBDT05GSUdfQlRfQk5FUCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9ISURQIGlzIG5vdCBzZXQKKworIworIyBCbHVldG9vdGggZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19CVF9IQ0lVU0I9bQorIyBDT05GSUdfQlRfSENJVVNCX1NDTyBpcyBub3Qgc2V0CitDT05GSUdfQlRfSENJVUFSVD1tCisjIENPTkZJR19CVF9IQ0lVQVJUX0g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSVVBUlRfQkNTUCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCQ00yMDNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJQQTEwWCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCRlVTQiBpcyBub3Qgc2V0CitDT05GSUdfQlRfSENJVkhDST1tCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19NSUk9bQorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCitDT05GSUdfTkVUX1JBRElPPXkKKworIworIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQorIworIyBDT05GSUdfU1RSSVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJMQU4gaXMgbm90IHNldAorIyBDT05GSUdfV0FWRUxBTiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfV0lSRUxFU1M9eQorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUExJUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKyMgQ09ORklHX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfUFBERVYgaXMgbm90IHNldAorIyBDT05GSUdfVElQQVIgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19TT0ZUX1dBVENIRE9HPW0KK0NPTkZJR19TQTExMDBfV0FUQ0hET0c9bQorCisjCisjIElTQS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVhDT01XRCBpcyBub3Qgc2V0CisjIENPTkZJR19XRFQgaXMgbm90IHNldAorCisjCisjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfUlRDPW0KKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz1tCitDT05GSUdfSTJDX0NIQVJERVY9bQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9bQorQ09ORklHX0kyQ19BTEdPUENGPW0KKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfRUxFS1RPUj1tCisjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCitDT05GSUdfVklERU9fREVWPXkKKworIworIyBWaWRlbyBGb3IgTGludXgKKyMKKworIworIyBWaWRlbyBBZGFwdGVycworIworIyBDT05GSUdfVklERU9fUE1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0JXUUNBTSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19DUUNBTSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19DUElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1NBQTUyNDZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1NBQTUyNDkgaXMgbm90IHNldAorIyBDT05GSUdfVFVORVJfMzAzNiBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVkNBTUNISVAgaXMgbm90IHNldAorCisjCisjIFJhZGlvIEFkYXB0ZXJzCisjCisjIENPTkZJR19SQURJT19DQURFVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19SVFJBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fUlRSQUNLMiBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19BWlRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fR0VNVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX01BRVNUUk8gaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fU0YxNkZNSSBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19TRjE2Rk1SMiBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19URVJSQVRFQyBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19UUlVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19UWVBIT09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1pPTFRSSVggaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCitDT05GSUdfU09VTkQ9eQorCisjCisjIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorIworIyBDT05GSUdfU05EIGlzIG5vdCBzZXQKKworIworIyBPcGVuIFNvdW5kIFN5c3RlbQorIworQ09ORklHX1NPVU5EX1BSSU1FPXkKKyMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9DUzQyODEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01TTkRDTEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01TTkRQSU4gaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfT1NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1RWTUlYRVIgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfQUQxOTgwIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKK0NPTkZJR19VU0JfQVVESU89eQorCisjCisjIFVTQiBCbHVldG9vdGggVFRZIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBkaXNhYmxlZCBCbHVldG9vdGggc3Vic3lzdGVtCisjCisjIENPTkZJR19VU0JfTUlESSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0FDTT1tCitDT05GSUdfVVNCX1BSSU5URVI9bQorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19VU0JfU1RPUkFHRV9ERUJVRz15CisjIENPTkZJR19VU0JfU1RPUkFHRV9SV19ERVRFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKK0NPTkZJR19VU0JfTURDODAwPW0KK0NPTkZJR19VU0JfTUlDUk9URUs9bQorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKK0NPTkZJR19VU0JfREFCVVNCPW0KK0NPTkZJR19VU0JfVklDQU09bQorQ09ORklHX1VTQl9EU0JSPW0KK0NPTkZJR19VU0JfSUJNQ0FNPW0KK0NPTkZJR19VU0JfS09OSUNBV0M9bQorQ09ORklHX1VTQl9PVjUxMT1tCitDT05GSUdfVVNCX1NFNDAxPW0KKyMgQ09ORklHX1VTQl9TTjlDMTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVFY2ODAgaXMgbm90IHNldAorQ09ORklHX1VTQl9QV0M9bQorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCitDT05GSUdfVVNCX0NBVEM9bQorQ09ORklHX1VTQl9LQVdFVEg9bQorQ09ORklHX1VTQl9QRUdBU1VTPW0KKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfVVNCTkVUPW0KKworIworIyBVU0IgSG9zdC10by1Ib3N0IENhYmxlcworIworQ09ORklHX1VTQl9BTElfTTU2MzI9eQorQ09ORklHX1VTQl9BTjI3MjA9eQorQ09ORklHX1VTQl9CRUxLSU49eQorQ09ORklHX1VTQl9HRU5FU1lTPXkKK0NPTkZJR19VU0JfTkVUMTA4MD15CitDT05GSUdfVVNCX1BMMjMwMT15CitDT05GSUdfVVNCX0tDMjE5MD15CisKKyMKKyMgSW50ZWxsaWdlbnQgVVNCIERldmljZXMvR2FkZ2V0cworIworQ09ORklHX1VTQl9BUk1MSU5VWD15CitDT05GSUdfVVNCX0VQU09OMjg4OD15CitDT05GSUdfVVNCX1pBVVJVUz15CitDT05GSUdfVVNCX0NEQ0VUSEVSPXkKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX1pEMTIwMSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworQ09ORklHX1VTQl9VU1M3MjA9bQorCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfU0VSSUFMPW0KK0NPTkZJR19VU0JfU0VSSUFMX0dFTkVSSUM9eQorQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOPW0KK0NPTkZJR19VU0JfU0VSSUFMX1dISVRFSEVBVD1tCitDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQ9bQorIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX0VNUEVHPW0KK0NPTkZJR19VU0JfU0VSSUFMX0ZURElfU0lPPW0KK0NPTkZJR19VU0JfU0VSSUFMX1ZJU09SPW0KKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBBUSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9JUj1tCitDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVD1tCisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfR0FSTUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBXIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fUERBPW0KK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU49bQorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX01QUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE4WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOVFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOVFJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTQ5V0xDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0xTSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMj1tCitDT05GSUdfVVNCX1NFUklBTF9QTDIzMDM9bQorIyBDT05GSUdfVVNCX1NFUklBTF9TQUZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfVEkgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLPW0KK0NPTkZJR19VU0JfU0VSSUFMX1hJUkNPTT1tCitDT05GSUdfVVNCX1NFUklBTF9PTU5JTkVUPW0KK0NPTkZJR19VU0JfRVpVU0I9eQorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1JJTzUwMD1tCisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgQVRNL0RTTCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9bQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz1tCitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9bQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPW0KKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlOSVhfRlM9bQorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfREVWRlNfRlM9eQorQ09ORklHX0RFVkZTX01PVU5UPXkKKyMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9bQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9bQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPW0KK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPW0KKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9bQorIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRVJST1JTPXkKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkNfQ0NJVFQ9eQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9iYXN0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYmFzdF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5ODVlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYmFzdF9kZWZjb25maWcKQEAgLTAsMCArMSw5NTIgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMDI6MjQ6MTYgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CisjIENPTkZJR19DTEVBTl9DT01QSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19CUk9LRU49eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TM0MyNDEwPXkKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBTM0MyNFhYIEltcGxlbWVudGF0aW9ucworIworQ09ORklHX0FSQ0hfQkFTVD15CisjIENPTkZJR19BUkNIX0gxOTQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU01ESzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDQwIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX1ZSMTAwMD15CisjIENPTkZJR19NQUNIX1JYMzcxNSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX09UT00gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9ORVhDT0RFUl8yNDQwIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfUzNDMjQxMD15CisKKyMKKyMgUzNDMjQxMCBCb290CisjCisjIENPTkZJR19TM0MyNDEwX0JPT1RfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFMzQzI0MTAgU2V0dXAKKyMKK0NPTkZJR19TM0MyNDEwX0RNQT15CisjIENPTkZJR19TM0MyNDEwX0RNQV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TM0MyNDEwX1BNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MzQzI0MTBfUE1fQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX1MzQzI0MTBfTE9XTEVWRUxfVUFSVF9QT1JUPTAKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX0FSTTkyMFQ9eQorQ09ORklHX0NQVV8zMnY0PXkKK0NPTkZJR19DUFVfQUJSVF9FVjRUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXVD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9oZGExIHJvIGluaXQ9L2Jpbi9iYXNoIGNvbnNvbGU9dHR5U0FDMCIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorQ09ORklHX0FQTT15CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0pFREVDUFJPQkU9eQorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAorQ09ORklHX01URF9CQVNUPXkKK0NPTkZJR19NVERfQkFTVF9NQVhTSVpFPTQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCitDT05GSUdfTVREX05BTkQ9eQorIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9JRFM9eQorQ09ORklHX01URF9OQU5EX1MzQzI0MTA9eQorIyBDT05GSUdfTVREX05BTkRfUzNDMjQxMF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9TM0MyNDEwX0hXRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfUEFSUE9SVD15CisjIENPTkZJR19QQVJQT1JUX1BDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfQVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfR1NDIGlzIG5vdCBzZXQKK0NPTkZJR19QQVJQT1JUXzEyODQ9eQorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfUEFSSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9OQkQ9bQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorQ09ORklHX0JMS19ERVZfSURFVEFQRT1tCitDT05GSUdfQkxLX0RFVl9JREVGTE9QUFk9bQorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERV9CQVNUPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19NSUkgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMSVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUEFSS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKKyMgQ09ORklHX0NPTVBVVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19ST0NLRVRQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NZQ0xBREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RJR0lFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAorIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05fSERMQyBpcyBub3Qgc2V0CisjIENPTkZJR19SSVNDT004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TWCBpcyBub3Qgc2V0CisjIENPTkZJR19SSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9OAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1MzQzI0MTA9eQorQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9CQVNUX1NJTz15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKK0NPTkZJR19QUklOVEVSPXkKKyMgQ09ORklHX0xQX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX1BQREVWPXkKKyMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TM0MyNDEwX1dBVENIRE9HPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CitDT05GSUdfUzNDMjQxMF9SVEM9eQorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj1tCisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKK0NPTkZJR19JMkNfQUxHT0JJVD1tCisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfUzNDMjQxMD15CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfU0VOU09SPW0KKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfTE03NT1tCisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfTE03OD1tCisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKK0NPTkZJR19TRU5TT1JTX0xNODU9bQorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfU0VOU09SU19FRVBST009bQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZCX0NGQl9GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TT0ZUX0NVUlNPUiBpcyBub3Qgc2V0CitDT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEUgaXMgbm90IHNldAorCisjCisjIExvZ28gY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfRlM9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlNfRlM9eQorQ09ORklHX0pGRlNfRlNfVkVSQk9TRT0wCisjIENPTkZJR19KRkZTX1BST0NfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19CU0RfRElTS0xBQkVMPXkKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OPXkKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE2CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfUzNDMjQxMF9QT1JUPXkKK0NPTkZJR19ERUJVR19TM0MyNDEwX1VBUlQ9MAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY2VyZmN1YmVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZmUwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZwpAQCAtMCwwICsxLDkwNSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAxNDoxOTo0MCAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TQTExMDA9eQorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBTQTExeDAgSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19TQTExMDBfQVNTQUJFVCBpcyBub3Qgc2V0CitDT05GSUdfU0ExMTAwX0NFUkY9eQorIyBDT05GSUdfU0ExMTAwX0NFUkZfRkxBU0hfOE1CIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfQ0VSRl9GTEFTSF8xNk1CPXkKKyMgQ09ORklHX1NBMTEwMF9DRVJGX0ZMQVNIXzMyTUIgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0NPTExJRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzNjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQkFER0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9KT1JOQURBNzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IQUNLS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9MQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9QTEVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9TSEFOTk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9TSU1QQUQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NTUCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9TQTExMDA9eQorQ09ORklHX0NQVV8zMnY0PXkKK0NPTkZJR19DUFVfQUJSVF9FVjQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdCPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCPXkKK0NPTkZJR19DUFVfTUlOSUNBQ0hFPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworQ09ORklHX1BDQ0FSRD1tCisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT1tCisKKyMKKyMgUEMtY2FyZCBicmlkZ2VzCisjCisjIENPTkZJR19JODIzNjUgaXMgbm90IHNldAorIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1NBMTEwMD1tCisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19ESVNDT05USUdNRU09eQorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNBMCwzODQwMCByb290PS9kZXYvbXRkYmxvY2szIHJvb3Rmc3R5cGU9amZmczIgcncgbWVtPTMyTSBpbml0PS9saW51eHJjIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT1tCisjIENPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NBMTExMD15CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorQ09ORklHX0ZQRV9GQVNURlBFPXkKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj1tCitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX01URF9TQTExMDA9eQorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfWEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz1tCisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19NSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX0FDMzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFJJQ09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NTODl4MCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1BDTUNJQSBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NBMTEwMD15CitDT05GSUdfU0VSSUFMX1NBMTEwMF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NBMTEwMF9XQVRDSERPRz1tCisKKyMKKyMgSVNBLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JWENPTVdEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVCBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPW0KKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9bQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPW0KKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT1tCisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfRlM9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPW0KK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9bQorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD1tCitDT05GSUdfTkZTRF9WMz15CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX0xPQ0tEPW0KK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9bQorQ09ORklHX1NVTlJQQz1tCitDT05GSUdfU1VOUlBDX0dTUz1tCitDT05GSUdfUlBDU0VDX0dTU19LUkI1PW0KKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorQ09ORklHX1NNQl9GUz1tCisjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT1tCisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9bQorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jbHBzNzUwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NscHM3NTAwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg3NTgzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jbHBzNzUwMF9kZWZjb25maWcKQEAgLTAsMCArMSw4MDMgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMTc6MjA6NDggMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKK0NPTkZJR19BUkNIX0NMUFM3NTAwPXkKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX0FSTTcxMD15CitDT05GSUdfQ1BVXzMydjM9eQorQ09ORklHX0NQVV9DQUNIRV9WMz15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1YzPXkKK0NPTkZJR19DUFVfVExCX1YzPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19USU1FUl9BQ09STj15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0E9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJtZW09MTZNIHJvb3Q9bmZzIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEFSVElUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKKyMgQ09ORklHX01URF9DSEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0tfUk8gaXMgbm90IHNldAorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCisjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1BBUlBPUlQ9eQorQ09ORklHX1BBUlBPUlRfUEM9eQorQ09ORklHX1BBUlBPUlRfUENfRklGTz15CisjIENPTkZJR19QQVJQT1JUX1BDX1NVUEVSSU8gaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9BUkMgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9HU0MgaXMgbm90IHNldAorQ09ORklHX1BBUlBPUlRfMTI4ND15CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9OQkQ9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPXkKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfQUMzMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUklDT1QgaXMgbm90IHNldAorQ09ORklHX0NTODl4MD15CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMSVAgaXMgbm90IHNldAorQ09ORklHX1BQUD15CisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CitDT05GSUdfU0xJUD15CitDT05GSUdfU0xJUF9DT01QUkVTU0VEPXkKKyMgQ09ORklHX1NMSVBfU01BUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUF9NT0RFX1NMSVA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QQVJLQkQgaXMgbm90IHNldAorQ09ORklHX1NFUklPX1JQQ0tCRD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CitDT05GSUdfUFJJTlRFUj15CisjIENPTkZJR19MUF9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKKyMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKKworIworIyBJMkMgQWxnb3JpdGhtcworIworQ09ORklHX0kyQ19BTEdPQklUPXkKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19FTEVLVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKK0NPTkZJR19GQl9TT0ZUX0NVUlNPUj15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9BQ09STj15CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CisjIENPTkZJR19GT05UXzZ4MTEgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9QRUFSTF84eDggaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9BQ09STl84eDggaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCitDT05GSUdfTE9HTz15CitDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKK0NPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9lYnNhMTEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZWJzYTExMF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2MTkyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvZWJzYTExMF9kZWZjb25maWcKQEAgLTAsMCArMSw3NDkgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMTg6Mjk6NDggMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VCU0ExMTA9eQorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXQj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXQj15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0E9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKK0NPTkZJR19QQ0NBUkQ9bQorIyBDT05GSUdfUENNQ0lBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUE9bQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworQ09ORklHX0k4MjM2NT1tCisjIENPTkZJR19UQ0lDIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfUFJPQkU9eQorQ09ORklHX1BDQ0FSRF9OT05TVEFUSUM9bQorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfTEVEUz15CitDT05GSUdfTEVEU19USU1FUj15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJyb290PS9kZXYvbmZzIHJ3IG1lbT0xNk0gY29uc29sZT10dHlTMSwzODQwMG44IgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CitDT05GSUdfRlBFX0ZBU1RGUEU9eQorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1BBUlBPUlQ9eQorQ09ORklHX1BBUlBPUlRfUEM9eQorQ09ORklHX1BBUlBPUlRfUENfRklGTz15CisjIENPTkZJR19QQVJQT1JUX1BDX1NVUEVSSU8gaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9QQ19QQ01DSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9BUkMgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9HU0MgaXMgbm90IHNldAorQ09ORklHX1BBUlBPUlRfMTI4ND15CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX0ZXTUFSSz15CisjIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEggaXMgbm90IHNldAorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CitDT05GSUdfSVBfVENQRElBR19JUFY2PXkKKworIworIyBJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorQ09ORklHX0lQVjY9eQorIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19JUF9ORl9DT05OVFJBQ0s9eQorIyBDT05GSUdfSVBfTkZfQ1RfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DVF9QUk9UT19TQ1RQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9GVFA9eQorQ09ORklHX0lQX05GX0lSQz15CisjIENPTkZJR19JUF9ORl9URlRQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0FNQU5EQSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfSVBUQUJMRVM9eQorQ09ORklHX0lQX05GX01BVENIX0xJTUlUPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9eQorQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9eQorQ09ORklHX0lQX05GX01BVENIX01BUks9eQorQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9eQorQ09ORklHX0lQX05GX01BVENIX0VDTj15CitDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD15CitDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9eQorQ09ORklHX0lQX05GX01BVENIX1RUTD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9eQorQ09ORklHX0lQX05GX01BVENIX1NUQVRFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9eQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfT1dORVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE0gaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9DT01NRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfRklMVEVSPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPXkKKyMgQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9OQVQ9eQorQ09ORklHX0lQX05GX05BVF9ORUVERUQ9eQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVESVJFQ1Q9eQorQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9eQorQ09ORklHX0lQX05GX1RBUkdFVF9TQU1FPXkKKyMgQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9OQVRfSVJDPXkKK0NPTkZJR19JUF9ORl9OQVRfRlRQPXkKK0NPTkZJR19JUF9ORl9NQU5HTEU9eQorQ09ORklHX0lQX05GX1RBUkdFVF9UT1M9eQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049eQorQ09ORklHX0lQX05GX1RBUkdFVF9EU0NQPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFSSz15CitDT05GSUdfSVBfTkZfVEFSR0VUX0NMQVNTSUZZPXkKKyMgQ09ORklHX0lQX05GX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9BUlBUQUJMRVMgaXMgbm90IHNldAorCisjCisjIElQdjY6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUDZfTkZfUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0lQNl9ORl9JUFRBQkxFUz15CitDT05GSUdfSVA2X05GX01BVENIX0xJTUlUPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfTUFDPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfUlQ9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9PUFRTPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfRlJBRz15CitDT05GSUdfSVA2X05GX01BVENIX0hMPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfTVVMVElQT1JUPXkKKyMgQ09ORklHX0lQNl9ORl9NQVRDSF9PV05FUiBpcyBub3Qgc2V0CitDT05GSUdfSVA2X05GX01BVENIX01BUks9eQorIyBDT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVIgaXMgbm90IHNldAorQ09ORklHX0lQNl9ORl9NQVRDSF9BSEVTUD15CitDT05GSUdfSVA2X05GX01BVENIX0xFTkdUSD15CisjIENPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQgaXMgbm90IHNldAorQ09ORklHX0lQNl9ORl9GSUxURVI9eQorIyBDT05GSUdfSVA2X05GX1RBUkdFVF9MT0cgaXMgbm90IHNldAorQ09ORklHX0lQNl9ORl9NQU5HTEU9eQorQ09ORklHX0lQNl9ORl9UQVJHRVRfTUFSSz15CisjIENPTkZJR19JUDZfTkZfUkFXIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKK0NPTkZJR19BUk1fQU03OUM5NjFBPXkKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SQUNBTCBpcyBub3Qgc2V0CisjIENPTkZJR19BVDE3MDAgaXMgbm90IHNldAorIyBDT05GSUdfREVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUX1BDTUNJQT15CisjIENPTkZJR19QQ01DSUFfM0M1ODkgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBXzNDNTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9GTVZKMThYIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfUENORVQ9bQorIyBDT05GSUdfUENNQ0lBX05NQ0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfU01DOTFDOTIgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1hJUkMyUFMgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0FYTkVUIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMSVAgaXMgbm90IHNldAorQ09ORklHX1BQUD1tCisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1BQUF9BU1lOQz1tCisjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAorQ09ORklHX1BQUF9ERUZMQVRFPW0KK0NPTkZJR19QUFBfQlNEQ09NUD1tCisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfQ1M9bQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKK0NPTkZJR19QUklOVEVSPW0KKyMgQ09ORklHX0xQX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBERVYgaXMgbm90IHNldAorIyBDT05GSUdfVElQQVIgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19TT0ZUX1dBVENIRE9HPXkKKworIworIyBJU0EtYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTUlYQ09NV0QgaXMgbm90IHNldAorIyBDT05GSUdfV0RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorQ09ORklHX01JTklYX0ZTPXkKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz15CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9bQorQ09ORklHX1pMSUJfREVGTEFURT1tCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2VkYjcyMTFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9lZGI3MjExX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIwOGVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9lZGI3MjExX2RlZmNvbmZpZwpAQCAtMCwwICsxLDU3NSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMTo0ODoxMiAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQ0xQUzcxMVg9eQorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBDTFBTNzExWC9FUDcyMVggSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19BUkNIX0FVVENQVTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0RCODk3MTIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DRUlWQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMRVA3MzEyIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VEQjcyMTE9eQorIyBDT05GSUdfQVJDSF9QNzIwVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPUlRVTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VQNzIxMT15CisjIENPTkZJR19FUDcyWFhfUk9NX0JPT1QgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNNzIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0xWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WND15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V1Q9eQorQ09ORklHX0NQVV9UTEJfVjRXVD15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0RJU0NPTlRJR01FTT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfWEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NMUFM3MTFYPXkKK0NPTkZJR19TRVJJQUxfQ0xQUzcxMVhfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCisjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTVNET1NfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9lbnAyNjExX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZW5wMjYxMV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmOWZjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvZW5wMjYxMV9kZWZjb25maWcKQEAgLTAsMCArMSw4ODcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMjI6MDg6MjQgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lYUDIwMDA9eQorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfQklHX0VORElBTj15CisKKyMKKyMgSW50ZWwgSVhQMjQwMC8yODAwIEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKKworIworIyBJWFAyNDAwLzI4MDAgUGxhdGZvcm1zCisjCitDT05GSUdfQVJDSF9FTlAyNjExPXkKKyMgQ09ORklHX0FSQ0hfSVhEUDI0MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWERQMjgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYRFAyNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhEUDI4MDEgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDQUxFPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfQklHX0VORElBTj15CitDT05GSUdfWFNDQUxFX1BNVT15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CitDT05GSUdfUENJX05BTUVTPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCw1NzYwMCByb290PS9kZXYvbmZzIGlwPWJvb3RwIG1lbT02NE1AMHgwIHBjaT1maXJtd2FyZSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWT15CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX01URF9JWFAyMDAwPXkKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QQ0kgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19EVU1NWT15CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKK0NPTkZJR19FRVBSTzEwMD15CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKK0NPTkZJR19XQU49eQorIyBDT05GSUdfTEFOTUVESUEgaXMgbm90IHNldAorIyBDT05GSUdfU1lOQ0xJTktfU1lOQ1BQUCBpcyBub3Qgc2V0CitDT05GSUdfSERMQz15CitDT05GSUdfSERMQ19SQVc9eQorIyBDT05GSUdfSERMQ19SQVdfRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19IRExDX0NJU0NPPXkKK0NPTkZJR19IRExDX0ZSPXkKK0NPTkZJR19IRExDX1BQUD15CisKKyMKKyMgWC4yNS9MQVBCIHN1cHBvcnQgaXMgZGlzYWJsZWQKKyMKKyMgQ09ORklHX1BDSTIwMFNZTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5YTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19ETENJPXkKK0NPTkZJR19ETENJX0NPVU5UPTI0CitDT05GSUdfRExDSV9NQVg9OAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSVhQMjAwMF9XQVRDSERPRz15CisKKyMKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKK0NPTkZJR19JMkNfQUxHT0JJVD15CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAorIworQ09ORklHX0kyQ19TRU5TT1I9eQorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAorIworQ09ORklHX1NFTlNPUlNfRUVQUk9NPXkKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfRVhUMl9GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CitDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRVJST1JTPXkKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2VwODAyMTlfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9lcDgwMjE5X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjM0MmFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9lcDgwMjE5X2RlZmNvbmZpZwpAQCAtMCwwICsxLDk1MiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMjozNDoxMiAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JT1AzWFg9eQorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBJT1AzeHggSW1wbGVtZW50YXRpb24gT3B0aW9ucworIworCisjCisjIElPUDN4eCBQbGF0Zm9ybSBUeXBlcworIworIyBDT05GSUdfQVJDSF9JUTgwMzIxIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lRMzEyNDQ9eQorIyBDT05GSUdfQVJDSF9JUTgwMzMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfSVE4MDMzMiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9FUDgwMjE5PXkKK0NPTkZJR19BUkNIX0lPUDMyMT15CisjIENPTkZJR19BUkNIX0lPUDMzMSBpcyBub3Qgc2V0CisKKyMKKyMgSU9QM3h4IENoaXBzZXQgRmVhdHVyZXMKKyMKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1hTQ0FMRT15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfTUlOSUNBQ0hFPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CitDT05GSUdfWFNDQUxFX1BNVT15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0xFR0FDWV9QUk9DIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfTkFNRVM9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJpcD1ib290IHJvb3Q9bmZzIGNvbnNvbGU9dHR5UzAsMTE1MjAwIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKK0NPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRD15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFk9eQorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4ZjAwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgwMDgwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPXkKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9RTEEyWFhYPXkKKyMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworQ09ORklHX01EPXkKK0NPTkZJR19CTEtfREVWX01EPXkKKyMgQ09ORklHX01EX0xJTkVBUiBpcyBub3Qgc2V0CitDT05GSUdfTURfUkFJRDA9eQorQ09ORklHX01EX1JBSUQxPXkKKyMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0CitDT05GSUdfTURfUkFJRDU9eQorIyBDT05GSUdfTURfUkFJRDYgaXMgbm90IHNldAorIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9ETT15CisjIENPTkZJR19ETV9DUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9TTkFQU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9NSVJST1IgaXMgbm90IHNldAorIyBDT05GSUdfRE1fWkVSTyBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9NVUxUSVBBVEggaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CitDT05GSUdfRTEwMD15CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwMD15CitDT05GSUdfRTEwMDBfTkFQST15CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorQ09ORklHX0kyQ19JT1AzWFg9eQorIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworQ09ORklHX1hGU19GUz15CitDT05GSUdfWEZTX0VYUE9SVD15CisjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19YRlNfU0VDVVJJVFk9eQorQ09ORklHX1hGU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2VweGExMGRiX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZXB4YTEwZGJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYjhiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2VweGExMGRiX2RlZmNvbmZpZwpAQCAtMCwwICsxLDY0NCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMjo0Njo1MSAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0NBTUVMT1Q9eQorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIEVweGExMGRiCisjCisKKyMKKyMgUExEIGhvdHN3YXAgc3VwcG9ydAorIworQ09ORklHX1BMRD15CisjIENPTkZJR19QTERfSE9UU1dBUCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjJUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJtZW09MzJNIGNvbnNvbGU9dHR5VUEwLDExNTIwMCBpbml0cmQ9MHgwMDIwMDAwMCw4TSByb290PS9kZXYvcmFtMCBydyIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD15CitDT05GSUdfUFBQX01VTFRJTElOSz15CisjIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfQVNZTkM9eQorQ09ORklHX1BQUF9TWU5DX1RUWT15CitDT05GSUdfUFBQX0RFRkxBVEU9eQorIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfVUFSVDAwPXkKK0NPTkZJR19TRVJJQUxfVUFSVDAwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CitDT05GSUdfQVVUT0ZTX0ZTPXkKK0NPTkZJR19BVVRPRlM0X0ZTPXkKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKKyMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9eQorIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQ1JDX0NDSVRUPXkKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZm9vdGJyaWRnZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2Zvb3RicmlkZ2VfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzdjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2Zvb3RicmlkZ2VfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTI1NyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMzowMjoyNCAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0ZPT1RCUklER0U9eQorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgRm9vdGJyaWRnZSBJbXBsZW1lbnRhdGlvbnMKKyMKK0NPTkZJR19BUkNIX0NBVFM9eQorQ09ORklHX0FSQ0hfUEVSU09OQUxfU0VSVkVSPXkKKyMgQ09ORklHX0FSQ0hfRUJTQTI4NV9BRERJTiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9FQlNBMjg1X0hPU1Q9eQorQ09ORklHX0FSQ0hfTkVUV0lOREVSPXkKK0NPTkZJR19GT09UQlJJREdFPXkKK0NPTkZJR19GT09UQlJJREdFX0hPU1Q9eQorQ09ORklHX0FSQ0hfRUJTQTI4NT15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9TQTExMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKK0NPTkZJR19JU0FfRE1BPXkKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0xFR0FDWV9QUk9DIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfTkFNRVM9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTPXkKK0NPTkZJR19MRURTX1RJTUVSPXkKKyMgQ09ORklHX0xFRFNfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSIiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorQ09ORklHX0ZQRV9OV0ZQRV9YUD15CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19QQVJQT1JUPXkKK0NPTkZJR19QQVJQT1JUX1BDPXkKK0NPTkZJR19QQVJQT1JUX1BDX0ZJRk89eQorIyBDT05GSUdfUEFSUE9SVF9QQ19TVVBFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfQVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfR1NDIGlzIG5vdCBzZXQKK0NPTkZJR19QQVJQT1JUXzEyODQ9eQorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworQ09ORklHX1BOUD15CisjIENPTkZJR19QTlBfREVCVUcgaXMgbm90IHNldAorCisjCisjIFByb3RvY29scworIworQ09ORklHX0lTQVBOUD15CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKK0NPTkZJR19QQVJJREU9bQorQ09ORklHX1BBUklERV9QQVJQT1JUPXkKKworIworIyBQYXJhbGxlbCBJREUgaGlnaC1sZXZlbCBkcml2ZXJzCisjCitDT05GSUdfUEFSSURFX1BEPW0KK0NPTkZJR19QQVJJREVfUENEPW0KK0NPTkZJR19QQVJJREVfUEY9bQorQ09ORklHX1BBUklERV9QVD1tCitDT05GSUdfUEFSSURFX1BHPW0KKworIworIyBQYXJhbGxlbCBJREUgcHJvdG9jb2wgbW9kdWxlcworIworQ09ORklHX1BBUklERV9BVEVOPW0KK0NPTkZJR19QQVJJREVfQlBDSz1tCisjIENPTkZJR19QQVJJREVfQlBDSzYgaXMgbm90IHNldAorQ09ORklHX1BBUklERV9DT01NPW0KK0NPTkZJR19QQVJJREVfRFNUUj1tCitDT05GSUdfUEFSSURFX0ZJVDI9bQorQ09ORklHX1BBUklERV9GSVQzPW0KK0NPTkZJR19QQVJJREVfRVBBVD1tCisjIENPTkZJR19QQVJJREVfRVBBVEM4IGlzIG5vdCBzZXQKK0NPTkZJR19QQVJJREVfRVBJQT1tCitDT05GSUdfUEFSSURFX0ZSSVE9bQorQ09ORklHX1BBUklERV9GUlBXPW0KK0NPTkZJR19QQVJJREVfS0JJQz1tCitDT05GSUdfUEFSSURFX0tUVEk9bQorQ09ORklHX1BBUklERV9PTjIwPW0KK0NPTkZJR19QQVJJREVfT04yNj1tCisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD1tCisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorQ09ORklHX0lERURJU0tfTVVMVElfTU9ERT15CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKKyMgQ09ORklHX0JMS19ERVZfSURFUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKK0NPTkZJR19BVE09eQorIyBDT05GSUdfQVRNX0NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0xBTkUgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0JSMjY4NCBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CitDT05GSUdfSVJEQT1tCisKKyMKKyMgSXJEQSBwcm90b2NvbHMKKyMKK0NPTkZJR19JUkxBTj1tCitDT05GSUdfSVJORVQ9bQorQ09ORklHX0lSQ09NTT1tCitDT05GSUdfSVJEQV9VTFRSQT15CisKKyMKKyMgSXJEQSBvcHRpb25zCisjCitDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVA9eQorQ09ORklHX0lSREFfRkFTVF9SUj15CitDT05GSUdfSVJEQV9ERUJVRz15CisKKyMKKyMgSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycworIworCisjCisjIFNJUiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfSVJUVFlfU0lSIGlzIG5vdCBzZXQKKworIworIyBEb25nbGUgc3VwcG9ydAorIworCisjCisjIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAorCisjCisjIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKKyMKKworIworIyBGSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJR01BVEVMX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19OU0NfRklSIGlzIG5vdCBzZXQKK0NPTkZJR19XSU5CT05EX0ZJUj1tCisjIENPTkZJR19UT1NISUJBX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTUNfSVJDQ19GSVIgaXMgbm90IHNldAorIyBDT05GSUdfQUxJX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19WTFNJX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0IxMDAwIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfVkVORE9SXzNDT009eQorIyBDT05GSUdfRUwxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VMMiBpcyBub3Qgc2V0CisjIENPTkZJR19FTFBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfRUwxNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTDMgaXMgbm90IHNldAorIyBDT05GSUdfM0M1MTUgaXMgbm90IHNldAorQ09ORklHX1ZPUlRFWD15CisjIENPTkZJR19UWVBIT09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BQzMyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVBSSUNPVCBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NTODl4MCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorQ09ORklHX05FMktfUENJPXkKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKworIworIyBBVE0gZHJpdmVycworIworIyBDT05GSUdfQVRNX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTEFOQUkgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0VOSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fRklSRVNUUkVBTSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fWkFUTSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTklDU1RBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSURUNzcyNTIgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0FNQkFTU0FET1IgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0hPUklaT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0lBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9GT1JFMjAwRV9NQVlCRSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSEUgaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QTElQIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfQVNZTkM9bQorIyBDT05GSUdfUFBQX1NZTkNfVFRZIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorQ09ORklHX1BQUE9FPW0KKyMgQ09ORklHX1BQUE9BVE0gaXMgbm90IHNldAorQ09ORklHX1NMSVA9bQorQ09ORklHX1NMSVBfQ09NUFJFU1NFRD15CitDT05GSUdfU0xJUF9TTUFSVD15CitDT05GSUdfU0xJUF9NT0RFX1NMSVA2PXkKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX0k4MDQyPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1BBUktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQorIyBDT05GSUdfQ09NUFVUT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPQ0tFVFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1lDTEFERVMgaXMgbm90IHNldAorIyBDT05GSUdfRElHSUVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfRVNQU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAorIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05fSERMQyBpcyBub3Qgc2V0CisjIENPTkZJR19SSVNDT004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TWCBpcyBub3Qgc2V0CisjIENPTkZJR19SSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMXzIxMjg1PXkKK0NPTkZJR19TRVJJQUxfMjEyODVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKK0NPTkZJR19QUklOVEVSPW0KKyMgQ09ORklHX0xQX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBERVYgaXMgbm90IHNldAorIyBDT05GSUdfVElQQVIgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19TT0ZUX1dBVENIRE9HPXkKK0NPTkZJR18yMTI4NV9XQVRDSERPRz1tCitDT05GSUdfOTc3X1dBVENIRE9HPW0KKworIworIyBJU0EtYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTUlYQ09NV0QgaXMgbm90IHNldAorIyBDT05GSUdfV0RUIGlzIG5vdCBzZXQKKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0RTMTYyMD15CitDT05GSUdfTldCVVRUT049eQorQ09ORklHX05XQlVUVE9OX1JFQk9PVD15CitDT05GSUdfTldGTEFTSD1tCitDT05GSUdfTlZSQU09bQorQ09ORklHX1JUQz15CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9bQorIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19FTEVLVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKK0NPTkZJR19WSURFT19ERVY9bQorCisjCisjIFZpZGVvIEZvciBMaW51eAorIworCisjCisjIFZpZGVvIEFkYXB0ZXJzCisjCisjIENPTkZJR19WSURFT19CVDg0OCBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19QTVMgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fQldRQ0FNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0NRQ0FNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1c5OTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0NQSUEgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNTI0NkEgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNTI0OSBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5FUl8zMDM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1NUUkFESVMgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNzEzNCBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NWEIgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fRFBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0hFWElVTV9PUklPTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19IRVhJVU1fR0VNSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0NYODggaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1ZDQU1DSElQIGlzIG5vdCBzZXQKKworIworIyBSYWRpbyBBZGFwdGVycworIworIyBDT05GSUdfUkFESU9fQ0FERVQgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fUlRSQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1JUUkFDSzIgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fQVpURUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX0dFTVRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19HRU1URUtfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX01BWElSQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19NQUVTVFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1NGMTZGTUkgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fU0YxNkZNUjIgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fVEVSUkFURUMgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fVFJVU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fVFlQSE9PTiBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19aT0xUUklYIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CitDT05GSUdfRkJfQ1lCRVIyMDAwPXkKKyMgQ09ORklHX0ZCX0FTSUxJQU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0lNU1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX05WSURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BVFJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9SQURFT05fT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKK0NPTkZJR19WR0FfQ09OU09MRT15CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9bQorQ09ORklHX1VTQl9ERUJVRz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworQ09ORklHX1VTQl9BVURJTz1tCisjIENPTkZJR19VU0JfQkxVRVRPT1RIX1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfUFJJTlRFUj1tCisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCisjIENPTkZJR19VU0JfU1RPUkFHRSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKKyMgQ09ORklHX1VTQl9ISUQgaXMgbm90IHNldAorCisjCisjIFVTQiBISUQgQm9vdCBQcm90b2NvbCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FR0FMQVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZJQ0FNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EU0JSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JQk1DQU0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tPTklDQVdDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVjUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0U0MDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NOOUMxMDIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUVjY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFdDIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPW0KKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfVVNTNzIwIGlzIG5vdCBzZXQKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgQVRNL0RTTCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TUEVFRFRPVUNIIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9eQorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz1tCitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19BREZTX0ZTPW0KKyMgQ09ORklHX0FERlNfRlNfUlcgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPW0KKyMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAorQ09ORklHX05GU0RfVENQPXkKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0VYUE9SVEZTPW0KK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX0FDT1JOX1BBUlRJVElPTj15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9FRVNPWCBpcyBub3Qgc2V0CisjIENPTkZJR19BQ09STl9QQVJUSVRJT05fSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUz15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT05fUE9XRVJURUMgaXMgbm90IHNldAorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OX1JJU0NJWCBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzg1Mj1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMj1tCisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMTU9bQorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQ1JDX0NDSVRUPW0KK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT1tCitDT05GSUdfWkxJQl9ERUZMQVRFPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZm9ydHVuZXRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9mb3J0dW5ldF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmNjg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvZm9ydHVuZXRfZGVmY29uZmlnCkBAIC0wLDAgKzEsNTU4IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIzOjUxOjEwIDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9DTFBTNzExWD15CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIENMUFM3MTFYL0VQNzIxWCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfQVVUQ1BVMTIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DREI4OTcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NFSVZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xFUDczMTIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FREI3MjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUDcyMFQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRk9SVFVORVQ9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNNzIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0xWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WND15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V1Q9eQorQ09ORklHX0NQVV9UTEJfVjRXVD15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9IiIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworIyBDT05GSUdfRlBFX05XRlBFIGlzIG5vdCBzZXQKK0NPTkZJR19GUEVfRkFTVEZQRT15CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEFSVElUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NMUFM3MTFYPXkKK0NPTkZJR19TRVJJQUxfQ0xQUzcxMVhfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTX0ZTPXkKK0NPTkZJR19KRkZTX0ZTX1ZFUkJPU0U9MAorIyBDT05GSUdfSkZGU19QUk9DX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9oMzYwMF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlMjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTEzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBNb24gTWFyIDI4IDAwOjAyOjI2IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NBMTEwMD15CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIFNBMTF4MCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX1NBMTEwMF9BU1NBQkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DRVJGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DT0xMSUUgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfSDM2MDA9eQorIyBDT05GSUdfU0ExMTAwX0gzODAwIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfSDNYWFg9eQorIyBDT05GSUdfU0ExMTAwX0JBREdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSk9STkFEQTcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSEFDS0tJVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfTEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfUExFQiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0hBTk5PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0lNUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9TU1AgaXMgbm90IHNldAorIyBDT05GSUdfSDM2MDBfU0xFRVZFIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPXkKKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPXkKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKKyMgQ09ORklHX0k4MjM2NSBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0lDIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfU0ExMTAwPXkKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0RJU0NPTlRJR01FTT15CisjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSIiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKK0NPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX1NBMTEwMD15CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD1tCisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9bQorQ09ORklHX0JMS19ERVZfSURFPW0KKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz1tCisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVDRD1tCisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz1tCisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9DSElQU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorQ09ORklHX0lSREE9bQorCisjCisjIElyREEgcHJvdG9jb2xzCisjCitDT05GSUdfSVJMQU49bQorQ09ORklHX0lSTkVUPW0KK0NPTkZJR19JUkNPTU09bQorIyBDT05GSUdfSVJEQV9VTFRSQSBpcyBub3Qgc2V0CisKKyMKKyMgSXJEQSBvcHRpb25zCisjCisjIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBX0ZBU1RfUlIgaXMgbm90IHNldAorIyBDT05GSUdfSVJEQV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycworIworCisjCisjIFNJUiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfSVJUVFlfU0lSIGlzIG5vdCBzZXQKKworIworIyBEb25nbGUgc3VwcG9ydAorIworCisjCisjIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAorCisjCisjIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKKyMKKworIworIyBGSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX05TQ19GSVIgaXMgbm90IHNldAorIyBDT05GSUdfV0lOQk9ORF9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfU01DX0lSQ0NfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FMSV9GSVIgaXMgbm90IHNldAorQ09ORklHX1NBMTEwMF9GSVI9bQorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKKyMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRfUENNQ0lBPXkKKyMgQ09ORklHX1BDTUNJQV8zQzU4OSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfM0M1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZNVkoxOFggaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9QQ05FVD15CisjIENPTkZJR19QQ01DSUFfTk1DTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9TTUM5MUM5MiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfWElSQzJQUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfQVhORVQgaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD1tCisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1BQUF9BU1lOQz1tCisjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAorQ09ORklHX1BQUF9ERUZMQVRFPW0KK0NPTkZJR19QUFBfQlNEQ09NUD1tCisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD1tCisjIENPTkZJR19TRVJJQUxfODI1MF9DUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfU0ExMTAwPXkKK0NPTkZJR19TRVJJQUxfU0ExMTAwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKK0NPTkZJR19GQl9TT0ZUX0NVUlNPUj15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9TQTExMDA9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz1tCisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD1tCisjIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEX1RDUD15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0VYUE9SVEZTPW0KK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorQ09ORklHX1NNQl9GUz1tCisjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkNfQ0NJVFQ9bQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9oNzIwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2g3MjAxX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMxM2EzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9oNzIwMV9kZWZjb25maWcKQEAgLTAsMCArMSw1NjcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIE1vbiBNYXIgMjggMDA6MTE6MzMgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0g3MjBYPXkKKworIworIyBoNzIweCBJbXBsZW1lbnRhdGlvbnMKKyMKK0NPTkZJR19BUkNIX0g3MjAxPXkKKyMgQ09ORklHX0FSQ0hfSDcyMDIgaXMgbm90IHNldAorQ09ORklHX0NQVV9INzIwMT15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk03MjBUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfTFY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXVD15CitDT05GSUdfQ1BVX1RMQl9WNFdUPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9IiIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CitDT05GSUdfTVREX0RFQlVHPXkKK0NPTkZJR19NVERfREVCVUdfVkVSQk9TRT0wCisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9OT1NXQVA9eQorIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9HRU9NRVRSWSBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD1tCisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCisjIENPTkZJR19TTkQgaXMgbm90IHNldAorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2g3MjAyX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY1YzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcKQEAgLTAsMCArMSw3MzIgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIE1vbiBNYXIgMjggMDA6MTU6NDUgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSDcyMFg9eQorCisjCisjIGg3MjB4IEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfQVJDSF9INzIwMSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9INzIwMj15CitDT05GSUdfQ1BVX0g3MjAyPXkKKyMgQ09ORklHX0g3MjAyX1NFUklBTDIzIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX0FSTTcyMFQ9eQorQ09ORklHX0NQVV8zMnY0PXkKK0NPTkZJR19DUFVfQUJSVF9MVjRUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVjQ9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdUPXkKK0NPTkZJR19DUFVfVExCX1Y0V1Q9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDE5MjAwIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKK0NPTkZJR19GUEVfTldGUEVfWFA9eQorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0g3MjBYPXkKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19NSUkgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CisjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU09GVF9DVVJTT1IgaXMgbm90IHNldAorQ09ORklHX0ZCX01PREVfSEVMUEVSUz15CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworQ09ORklHX1VTQl9HQURHRVQ9bQorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX05FVDIyODAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyWFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9HT0tVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9aRVJPPW0KKyMgQ09ORklHX1VTQl9FVEggaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRGUz1tCitDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCitDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRV9URVNUPXkKK0NPTkZJR19VU0JfR19TRVJJQUw9bQorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX0RFVkZTX0ZTPXkKK0NPTkZJR19ERVZGU19NT1VOVD15CisjIENPTkZJR19ERVZGU19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorIyBDT05GSUdfUk9PVF9ORlMgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2hhY2traXRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9oYWNra2l0X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg3YzhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9oYWNra2l0X2RlZmNvbmZpZwpAQCAtMCwwICsxLDc2OCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgTW9uIE1hciAyOCAwMDoyMjozNCAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU0ExMTAwPXkKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgU0ExMXgwIEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfU0ExMTAwX0FTU0FCRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0NFUkYgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0NPTExJRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzNjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQkFER0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9KT1JOQURBNzIwIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfSEFDS0tJVD15CisjIENPTkZJR19TQTExMDBfTEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfUExFQiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0hBTk5PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0lNUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9TU1AgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfU0ExMTAwPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXQj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQj15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0E9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19ESVNDT05USUdNRU09eQorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNBMCwxMTUyMDAgcm9vdD0vZGV2L3JhbTAgaW5pdHJkPTB4YzA0MDAwMDAsOE0gaW5pdD0vcm9vdHNoZWxsIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorQ09ORklHX01URF9ERUJVRz15CitDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0U9MworIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEFSVElUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfWEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19EVU1NWT15CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworQ09ORklHX05FVF9SQURJTz15CisKKyMKKyMgT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkKKyMKKyMgQ09ORklHX1NUUklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVkVMQU4gaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0CisjCisjIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1dJUkVMRVNTPXkKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworIyBDT05GSUdfTkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NMQUI9eQorQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CitDT05GSUdfREVCVUdfV0FJVFE9eQorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pbnRlZ3JhdG9yX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW50ZWdyYXRvcl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlZTc2OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW50ZWdyYXRvcl9kZWZjb25maWcKQEAgLTAsMCArMSw4NjQgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMjE6MTQ6NTEgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lOVEVHUkFUT1I9eQorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBJbnRlZ3JhdG9yIE9wdGlvbnMKKyMKK0NPTkZJR19BUkNIX0lOVEVHUkFUT1JfQVA9eQorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SX0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOVEVHUkFUT1JfSU1QRDEgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNNzIwVD15CitDT05GSUdfQ1BVX0FSTTkyMFQ9eQorIyBDT05GSUdfQ1BVX0FSTTkyMlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0FSTTkyNlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0FSTTEwMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0FSTTEwMjIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0FSTTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1Y2IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0FCUlRfTFY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXVD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V1Q9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAorQ09ORklHX0lDU1Q1MjU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfQVJNX0FNQkE9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKK0NPTkZJR19QQ0lfTkFNRVM9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTPXkKK0NPTkZJR19MRURTX1RJTUVSPXkKK0NPTkZJR19MRURTX0NQVT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlBTTAsMzg0MDBuOCByb290PS9kZXYvbmZzIGlwPWJvb3RwIG1lbT0zMk0iCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKK0NPTkZJR19DUFVfRlJFUV9JTlRFR1JBVE9SPXkKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CitDT05GSUdfTVREX0FGU19QQVJUUz15CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfR0VPTUVUUlkgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorQ09ORklHX0UxMDA9eQorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0FNQkFLTUkgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BTUJBX1BMMDEwPXkKK0NPTkZJR19TRVJJQUxfQU1CQV9QTDAxMF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9BTUJBX1BMMDExIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CitDT05GSUdfRkJfU09GVF9DVVJTT1I9eQorQ09ORklHX0ZCX01PREVfSEVMUEVSUz15CitDT05GSUdfRkJfVElMRUJMSVRUSU5HPXkKKyMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJNQ0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAorQ09ORklHX0ZCX01BVFJPWD15CitDT05GSUdfRkJfTUFUUk9YX01JTExFTklVTT15CitDT05GSUdfRkJfTUFUUk9YX01ZU1RJUVVFPXkKKyMgQ09ORklHX0ZCX01BVFJPWF9HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9NQVRST1hfTVVMVElIRUFEPXkKKyMgQ09ORklHX0ZCX1JBREVPTl9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUkFERU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0FUWTEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9ORU9NQUdJQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9LWVJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAorIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX1ZHQV9DT05TT0xFPXkKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEUgaXMgbm90IHNldAorCisjCisjIExvZ28gY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRVJST1JTPXkKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pcTMxMjQ0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXEzMTI0NF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxNDQzYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXEzMTI0NF9kZWZjb25maWcKQEAgLTAsMCArMSw5MjIgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMDI6MTA6MzggMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lPUDNYWD15CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIElPUDN4eCBJbXBsZW1lbnRhdGlvbiBPcHRpb25zCisjCisKKyMKKyMgSU9QM3h4IFBsYXRmb3JtIFR5cGVzCisjCisjIENPTkZJR19BUkNIX0lRODAzMjEgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSVEzMTI0ND15CisjIENPTkZJR19BUkNIX0lRODAzMzEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9JUTgwMzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA4MDIxOSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JT1AzMjE9eQorIyBDT05GSUdfQVJDSF9JT1AzMzEgaXMgbm90IHNldAorCisjCisjIElPUDN4eCBDaGlwc2V0IEZlYXR1cmVzCisjCisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CitDT05GSUdfUENJX05BTUVTPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iaXA9Ym9vdCByb290PW5mcyBjb25zb2xlPXR0eVMwLDExNTIwMCIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZPXkKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weGYwMDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4MDA4MDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CitDT05GSUdfQ0hSX0RFVl9TRz15CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUUxBMlhYWD15CisjIENPTkZJR19TQ1NJX1FMQTIxWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEE2MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKK0NPTkZJR19NRD15CitDT05GSUdfQkxLX0RFVl9NRD15CisjIENPTkZJR19NRF9MSU5FQVIgaXMgbm90IHNldAorQ09ORklHX01EX1JBSUQwPXkKK0NPTkZJR19NRF9SQUlEMT15CisjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAorQ09ORklHX01EX1JBSUQ1PXkKKyMgQ09ORklHX01EX1JBSUQ2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfRE09eQorIyBDT05GSUdfRE1fQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfRE1fU05BUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfRE1fTUlSUk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX1pFUk8gaXMgbm90IHNldAorIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CitDT05GSUdfRTEwMDA9eQorQ09ORklHX0UxMDAwX05BUEk9eQorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorQ09ORklHX0kyQ19JT1AzWFg9eQorIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworQ09ORklHX1hGU19GUz15CitDT05GSUdfWEZTX0VYUE9SVD15CisjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19YRlNfU0VDVVJJVFk9eQorQ09ORklHX1hGU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2lxODAzMjFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9pcTgwMzIxX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjVhZDIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pcTgwMzIxX2RlZmNvbmZpZwpAQCAtMCwwICsxLDg0MyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAxMzoyNDoxMCAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JT1AzWFg9eQorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBJT1AzeHggSW1wbGVtZW50YXRpb24gT3B0aW9ucworIworCisjCisjIElPUDN4eCBQbGF0Zm9ybSBUeXBlcworIworQ09ORklHX0FSQ0hfSVE4MDMyMT15CisjIENPTkZJR19BUkNIX0lRMzEyNDQgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JUTgwMzMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfSVE4MDMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQODAyMTkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSU9QMzIxPXkKKyMgQ09ORklHX0FSQ0hfSU9QMzMxIGlzIG5vdCBzZXQKKworIworIyBJT1AzeHggQ2hpcHNldCBGZWF0dXJlcworIworCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDQUxFPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKK0NPTkZJR19YU0NBTEVfUE1VPXkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX1BDST15CisjIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAorQ09ORklHX1BDSV9OQU1FUz15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9ImlwPWJvb3Qgcm9vdD1uZnMgY29uc29sZT10dHlTMCwxMTUyMDAiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfQU9VVD15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWT15CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHhmMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAwODAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTEKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKKyMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwMD15CitDT05GSUdfRTEwMDBfTkFQST15CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSU9QM1hYPXkKKyMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKK0NPTkZJR19YRlNfRlM9eQorQ09ORklHX1hGU19FWFBPUlQ9eQorIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfWEZTX1NFQ1VSSVRZPXkKK0NPTkZJR19YRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPXkKK0NPTkZJR19ORlNEX1YzPXkKKyMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRF9UQ1AgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzMxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXE4MDMzMV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1MzYxMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXE4MDMzMV9kZWZjb25maWcKQEAgLTAsMCArMSw5MTYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMTU6MTM6MzcgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSU9QM1hYPXkKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgSU9QM3h4IEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKKworIworIyBJT1AzeHggUGxhdGZvcm0gVHlwZXMKKyMKKyMgQ09ORklHX0FSQ0hfSVE4MDMyMSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lRMzEyNDQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSVE4MDMzMT15CisjIENPTkZJR19NQUNIX0lRODAzMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDgwMjE5IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lPUDMzMT15CisKKyMKKyMgSU9QM3h4IENoaXBzZXQgRmVhdHVyZXMKKyMKK0NPTkZJR19JT1AzMzFfU1RFUEQ9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDQUxFPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKK0NPTkZJR19YU0NBTEVfUE1VPXkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX1BDST15CisjIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAorQ09ORklHX1BDSV9OQU1FUz15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9ImlwPWJvb3Qgcm9vdD1uZnMgY29uc29sZT10dHlTMCwxMTUyMDAiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfQU9VVD15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWT15CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9OT1NXQVA9eQorIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9HRU9NRVRSWSBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgwMDgwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0xCisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPXkKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9RTEEyWFhYPXkKKyMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworQ09ORklHX01EPXkKK0NPTkZJR19CTEtfREVWX01EPXkKK0NPTkZJR19NRF9MSU5FQVI9eQorQ09ORklHX01EX1JBSUQwPXkKK0NPTkZJR19NRF9SQUlEMT15CisjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAorQ09ORklHX01EX1JBSUQ1PXkKKyMgQ09ORklHX01EX1JBSUQ2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfRE09eQorIyBDT05GSUdfRE1fQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfRE1fU05BUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfRE1fTUlSUk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX1pFUk8gaXMgbm90IHNldAorIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CitDT05GSUdfRTEwMDA9eQorQ09ORklHX0UxMDAwX05BUEk9eQorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorQ09ORklHX0kyQ19JT1AzWFg9eQorIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworQ09ORklHX1hGU19GUz15CitDT05GSUdfWEZTX0VYUE9SVD15CisjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19YRlNfU0VDVVJJVFk9eQorQ09ORklHX1hGU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzMyX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXE4MDMzMl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1ZjAxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXE4MDMzMl9kZWZjb25maWcKQEAgLTAsMCArMSw5MTYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMTc6MzM6MzkgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSU9QM1hYPXkKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgSU9QM3h4IEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKKworIworIyBJT1AzeHggUGxhdGZvcm0gVHlwZXMKKyMKKyMgQ09ORklHX0FSQ0hfSVE4MDMyMSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lRMzEyNDQgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JUTgwMzMxIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0lRODAzMzI9eQorIyBDT05GSUdfQVJDSF9FUDgwMjE5IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lPUDMzMT15CisKKyMKKyMgSU9QM3h4IENoaXBzZXQgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0lPUDMzMV9TVEVQRCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CitDT05GSUdfUENJX05BTUVTPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iaXA9Ym9vdCByb290PW5mcyBjb25zb2xlPXR0eVMwLDExNTIwMCIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZPXkKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0dFT01FVFJZIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAwODAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTEKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9eQorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1FMQTJYWFg9eQorIyBDT05GSUdfU0NTSV9RTEEyMVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBNjMxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCitDT05GSUdfTUQ9eQorQ09ORklHX0JMS19ERVZfTUQ9eQorQ09ORklHX01EX0xJTkVBUj15CitDT05GSUdfTURfUkFJRDA9eQorQ09ORklHX01EX1JBSUQxPXkKKyMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0CitDT05GSUdfTURfUkFJRDU9eQorIyBDT05GSUdfTURfUkFJRDYgaXMgbm90IHNldAorIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9ETT15CisjIENPTkZJR19ETV9DUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9TTkFQU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9NSVJST1IgaXMgbm90IHNldAorIyBDT05GSUdfRE1fWkVSTyBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9NVUxUSVBBVEggaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKKyMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwMD15CitDT05GSUdfRTEwMDBfTkFQST15CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0lPUDNYWD15CisjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCitDT05GSUdfWEZTX0ZTPXkKK0NPTkZJR19YRlNfRVhQT1JUPXkKKyMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX1hGU19TRUNVUklUWT15CitDT05GSUdfWEZTX1BPU0lYX0FDTD15CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDY2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDg4OCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMToxMzozOCAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSVhQMjAwMD15CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOPXkKKworIworIyBJbnRlbCBJWFAyNDAwLzI4MDAgSW1wbGVtZW50YXRpb24gT3B0aW9ucworIworCisjCisjIElYUDI0MDAvMjgwMCBQbGF0Zm9ybXMKKyMKKyMgQ09ORklHX0FSQ0hfRU5QMjYxMSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JWERQMjQwMD15CisjIENPTkZJR19BUkNIX0lYRFAyODAwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lYRFAyWDAwPXkKKyMgQ09ORklHX0FSQ0hfSVhEUDI0MDEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWERQMjgwMSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKK0NPTkZJR19YU0NBTEVfUE1VPXkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX1BDST15CitDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKK0NPTkZJR19QQ0lfTkFNRVM9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDU3NjAwIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgbWVtPTY0TUAweDAgcGNpPWZpcm13YXJlIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZPXkKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0lYUDIwMDA9eQorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPXkKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorQ09ORklHX0VFUFJPMTAwPXkKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworQ09ORklHX1dBTj15CisjIENPTkZJR19MQU5NRURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS19TWU5DUFBQIGlzIG5vdCBzZXQKK0NPTkZJR19IRExDPXkKK0NPTkZJR19IRExDX1JBVz15CisjIENPTkZJR19IRExDX1JBV19FVEggaXMgbm90IHNldAorQ09ORklHX0hETENfQ0lTQ089eQorQ09ORklHX0hETENfRlI9eQorQ09ORklHX0hETENfUFBQPXkKKworIworIyBYLjI1L0xBUEIgc3VwcG9ydCBpcyBkaXNhYmxlZAorIworIyBDT05GSUdfUENJMjAwU1lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTlhMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBUlNZTkMgaXMgbm90IHNldAorQ09ORklHX0RMQ0k9eQorQ09ORklHX0RMQ0lfQ09VTlQ9MjQKK0NPTkZJR19ETENJX01BWD04CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTIKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19JWFAyMDAwX1dBVENIRE9HPXkKKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworQ09ORklHX0kyQ19BTEdPQklUPXkKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfSTJDX1NFTlNPUj15CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfU0VOU09SU19FRVBST009eQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1MWM5OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDFfZGVmY29uZmlnCkBAIC0wLDAgKzEsODg5IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIxOjUzOjU1IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JWFAyMDAwPXkKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0JJR19FTkRJQU49eQorCisjCisjIEludGVsIElYUDI0MDAvMjgwMCBJbXBsZW1lbnRhdGlvbiBPcHRpb25zCisjCisKKyMKKyMgSVhQMjQwMC8yODAwIFBsYXRmb3JtcworIworIyBDT05GSUdfQVJDSF9FTlAyNjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhEUDI0MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWERQMjgwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JWERQMjQwMT15CisjIENPTkZJR19BUkNIX0lYRFAyODAxIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lYRFAyWDAxPXkKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1hTQ0FMRT15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfTUlOSUNBQ0hFPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0JJR19FTkRJQU49eQorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQorQ09ORklHX1BDSV9OQU1FUz15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsNTc2MDAgcm9vdD0vZGV2L25mcyBpcD1ib290cCBtZW09NjRNQDB4MCBwY2k9ZmlybXdhcmUiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKK0NPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRD15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFk9eQorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfSVhQMjAwMD15CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUENJIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPXkKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKK0NPTkZJR19DUzg5eDA9eQorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CitDT05GSUdfRUVQUk8xMDA9eQorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCitDT05GSUdfV0FOPXkKKyMgQ09ORklHX0xBTk1FRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTkNMSU5LX1NZTkNQUFAgaXMgbm90IHNldAorQ09ORklHX0hETEM9eQorQ09ORklHX0hETENfUkFXPXkKKyMgQ09ORklHX0hETENfUkFXX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfSERMQ19DSVNDTz15CitDT05GSUdfSERMQ19GUj15CitDT05GSUdfSERMQ19QUFA9eQorCisjCisjIFguMjUvTEFQQiBzdXBwb3J0IGlzIGRpc2FibGVkCisjCisjIENPTkZJR19QQ0kyMDBTWU4gaXMgbm90IHNldAorIyBDT05GSUdfV0FOWEwgaXMgbm90IHNldAorIyBDT05GSUdfUEMzMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkFSU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfRExDST15CitDT05GSUdfRExDSV9DT1VOVD0yNAorQ09ORklHX0RMQ0lfTUFYPTgKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0lYUDIwMDBfV0FUQ0hET0c9eQorCisjCisjIFBDSS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENJUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19XRFRQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfU0VOU09SPXkKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19TRU5TT1JTX0VFUFJPTT15CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GU19QT1NJWF9BQ0w9eQorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZmOTkxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcKQEAgLTAsMCArMSw4ODggQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMjI6MTU6MjMgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lYUDIwMDA9eQorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfQklHX0VORElBTj15CisKKyMKKyMgSW50ZWwgSVhQMjQwMC8yODAwIEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKKworIworIyBJWFAyNDAwLzI4MDAgUGxhdGZvcm1zCisjCisjIENPTkZJR19BUkNIX0VOUDI2MTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWERQMjQwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JWERQMjgwMD15CitDT05GSUdfQVJDSF9JWERQMlgwMD15CisjIENPTkZJR19BUkNIX0lYRFAyNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhEUDI4MDEgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDQUxFPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfQklHX0VORElBTj15CitDT05GSUdfWFNDQUxFX1BNVT15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CitDT05GSUdfUENJX05BTUVTPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCw5NjAwIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgbWVtPTY0TUAweDAgcGNpPWZpcm13YXJlIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZPXkKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0lYUDIwMDA9eQorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPXkKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorQ09ORklHX0VFUFJPMTAwPXkKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworQ09ORklHX1dBTj15CisjIENPTkZJR19MQU5NRURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS19TWU5DUFBQIGlzIG5vdCBzZXQKK0NPTkZJR19IRExDPXkKK0NPTkZJR19IRExDX1JBVz15CisjIENPTkZJR19IRExDX1JBV19FVEggaXMgbm90IHNldAorQ09ORklHX0hETENfQ0lTQ089eQorQ09ORklHX0hETENfRlI9eQorQ09ORklHX0hETENfUFBQPXkKKworIworIyBYLjI1L0xBUEIgc3VwcG9ydCBpcyBkaXNhYmxlZAorIworIyBDT05GSUdfUENJMjAwU1lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTlhMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBUlNZTkMgaXMgbm90IHNldAorQ09ORklHX0RMQ0k9eQorQ09ORklHX0RMQ0lfQ09VTlQ9MjQKK0NPTkZJR19ETENJX01BWD04CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTIKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19JWFAyMDAwX1dBVENIRE9HPXkKKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworQ09ORklHX0kyQ19BTEdPQklUPXkKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfSTJDX1NFTlNPUj15CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfU0VOU09SU19FRVBST009eQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4NGEyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDFfZGVmY29uZmlnCkBAIC0wLDAgKzEsODg5IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIyOjM5OjE5IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JWFAyMDAwPXkKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0JJR19FTkRJQU49eQorCisjCisjIEludGVsIElYUDI0MDAvMjgwMCBJbXBsZW1lbnRhdGlvbiBPcHRpb25zCisjCisKKyMKKyMgSVhQMjQwMC8yODAwIFBsYXRmb3JtcworIworIyBDT05GSUdfQVJDSF9FTlAyNjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhEUDI0MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWERQMjgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYRFAyNDAxIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lYRFAyODAxPXkKK0NPTkZJR19BUkNIX0lYRFAyWDAxPXkKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1hTQ0FMRT15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfTUlOSUNBQ0hFPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0JJR19FTkRJQU49eQorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQorQ09ORklHX1BDSV9OQU1FUz15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgbWVtPTY0TUAweDAgcGNpPWZpcm13YXJlIGl4ZHAyeDAxX2Nsb2NrPTUwMDAwMDAwIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZPXkKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0lYUDIwMDA9eQorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPXkKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKK0NPTkZJR19DUzg5eDA9eQorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CitDT05GSUdfRUVQUk8xMDA9eQorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCitDT05GSUdfV0FOPXkKKyMgQ09ORklHX0xBTk1FRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTkNMSU5LX1NZTkNQUFAgaXMgbm90IHNldAorQ09ORklHX0hETEM9eQorQ09ORklHX0hETENfUkFXPXkKKyMgQ09ORklHX0hETENfUkFXX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfSERMQ19DSVNDTz15CitDT05GSUdfSERMQ19GUj15CitDT05GSUdfSERMQ19QUFA9eQorCisjCisjIFguMjUvTEFQQiBzdXBwb3J0IGlzIGRpc2FibGVkCisjCisjIENPTkZJR19QQ0kyMDBTWU4gaXMgbm90IHNldAorIyBDT05GSUdfV0FOWEwgaXMgbm90IHNldAorIyBDT05GSUdfUEMzMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkFSU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfRExDST15CitDT05GSUdfRExDSV9DT1VOVD0yNAorQ09ORklHX0RMQ0lfTUFYPTgKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0lYUDIwMDBfV0FUQ0hET0c9eQorCisjCisjIFBDSS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENJUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19XRFRQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfU0VOU09SPXkKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19TRU5TT1JTX0VFUFJPTT15CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GU19QT1NJWF9BQ0w9eQorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peHA0eHhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peHA0eHhfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YWFmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2l4cDR4eF9kZWZjb25maWcKQEAgLTAsMCArMSwxMTY0IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIyOjUzOjQwIDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lYUDRYWD15CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfQklHX0VORElBTj15CisKKyMKKyMgSW50ZWwgSVhQNHh4IEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKKworIworIyBJWFA0eHggUGxhdGZvcm1zCisjCisjIENPTkZJR19BUkNIX0FWSUxBIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FESV9DT1lPVEU9eQorQ09ORklHX0FSQ0hfSVhEUDQyNT15CisjIENPTkZJR19NQUNIX0lYRFBHNDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfSVhEUDQ2NSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9JWENEUDExMDA9eQorQ09ORklHX0FSQ0hfUFJQTUMxMTAwPXkKK0NPTkZJR19BUkNIX0lYRFA0WFg9eQorIyBDT05GSUdfTUFDSF9HVFdYNTcxNSBpcyBub3Qgc2V0CisKKyMKKyMgSVhQNHh4IE9wdGlvbnMKKyMKKyMgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDQUxFPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfQklHX0VORElBTj15CitDT05GSUdfWFNDQUxFX1BNVT15CitDT05GSUdfRE1BQk9VTkNFPXkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX1BDST15CitDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKK0NPTkZJR19QQ0lfTkFNRVM9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDExNTIwMCBpcD1ib290cCByb290PS9kZXYvbmZzIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorQ09ORklHX0FQTT15CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFkgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfSVhQNFhYPXkKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QQ0kgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX01URF9OQU5EPW0KKyMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfSURTPW0KKyMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorIyBDT05GSUdfSURFUENJX1NIQVJFX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TTDgyQzEwNSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19JREVETUFfUENJX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfQ01ENjRYPXkKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0hQVDM2Nj15CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVz15CisjIENPTkZJR19QREMyMDJYWF9GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD1tCitDT05GSUdfUEFDS0VUX01NQVA9eQorQ09ORklHX05FVExJTktfREVWPW0KK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX0ZXTUFSSz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgaXMgbm90IHNldAorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0lQR1JFPW0KK0NPTkZJR19ORVRfSVBHUkVfQlJPQURDQVNUPXkKK0NPTkZJR19JUF9NUk9VVEU9eQorQ09ORklHX0lQX1BJTVNNX1YxPXkKK0NPTkZJR19JUF9QSU1TTV9WMj15CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1RVTk5FTD1tCisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19JUF9WUz1tCitDT05GSUdfSVBfVlNfREVCVUc9eQorQ09ORklHX0lQX1ZTX1RBQl9CSVRTPTEyCisKKyMKKyMgSVBWUyB0cmFuc3BvcnQgcHJvdG9jb2wgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSVBfVlNfUFJPVE9fVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1ZTX1BST1RPX1VEUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9WU19QUk9UT19FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVlNfUFJPVE9fQUggaXMgbm90IHNldAorCisjCisjIElQVlMgc2NoZWR1bGVyCisjCitDT05GSUdfSVBfVlNfUlI9bQorQ09ORklHX0lQX1ZTX1dSUj1tCitDT05GSUdfSVBfVlNfTEM9bQorQ09ORklHX0lQX1ZTX1dMQz1tCitDT05GSUdfSVBfVlNfTEJMQz1tCitDT05GSUdfSVBfVlNfTEJMQ1I9bQorQ09ORklHX0lQX1ZTX0RIPW0KK0NPTkZJR19JUF9WU19TSD1tCisjIENPTkZJR19JUF9WU19TRUQgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVlNfTlEgaXMgbm90IHNldAorCisjCisjIElQVlMgYXBwbGljYXRpb24gaGVscGVyCisjCisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0VfTkVURklMVEVSPXkKKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19JUF9ORl9DT05OVFJBQ0s9bQorIyBDT05GSUdfSVBfTkZfQ1RfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DVF9QUk9UT19TQ1RQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9GVFA9bQorQ09ORklHX0lQX05GX0lSQz1tCisjIENPTkZJR19JUF9ORl9URlRQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0FNQU5EQSBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfUVVFVUU9bQorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9MSU1JVD1tCisjIENPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9bQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfUEtUVFlQRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfTUFUQ0hfTUFSSz1tCitDT05GSUdfSVBfTkZfTUFUQ0hfTVVMVElQT1JUPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UT1M9bQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfUkVDRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0VDTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9EU0NQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9NQVRDSF9BSF9FU1A9bQorQ09ORklHX0lQX05GX01BVENIX0xFTkdUSD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UQ1BNU1M9bQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfSEVMUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9NQVRDSF9TVEFURT1tCisjIENPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0sgaXMgbm90IHNldAorQ09ORklHX0lQX05GX01BVENIX09XTkVSPW0KKyMgQ09ORklHX0lQX05GX01BVENIX1BIWVNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE0gaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9DT01NRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfRklMVEVSPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUz1tCitDT05GSUdfSVBfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9OQVRfTkVFREVEPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KKyMgQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfVEFSR0VUX1NBTUUgaXMgbm90IHNldAorQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDPW0KK0NPTkZJR19JUF9ORl9OQVRfSVJDPW0KK0NPTkZJR19JUF9ORl9OQVRfRlRQPW0KK0NPTkZJR19JUF9ORl9NQU5HTEU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9UT1M9bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX0VDTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9UQVJHRVRfRFNDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfVEFSR0VUX01BUks9bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX0NMQVNTSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1JBVyBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9bQorIyBDT05GSUdfSVBfTkZfQVJQX01BTkdMRSBpcyBub3Qgc2V0CisKKyMKKyMgQnJpZGdlOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKK0NPTkZJR19BVE09eQorQ09ORklHX0FUTV9DTElQPXkKKyMgQ09ORklHX0FUTV9DTElQX05PX0lDTVAgaXMgbm90IHNldAorQ09ORklHX0FUTV9MQU5FPW0KK0NPTkZJR19BVE1fTVBPQT1tCitDT05GSUdfQVRNX0JSMjY4ND1tCisjIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9bQorQ09ORklHX1ZMQU5fODAyMVE9bQorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19MTEM9bQorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CitDT05GSUdfSVBYPW0KKyMgQ09ORklHX0lQWF9JTlRFUk4gaXMgbm90IHNldAorQ09ORklHX0FUQUxLPW0KK0NPTkZJR19ERVZfQVBQTEVUQUxLPXkKK0NPTkZJR19JUEREUD1tCitDT05GSUdfSVBERFBfRU5DQVA9eQorQ09ORklHX0lQRERQX0RFQ0FQPXkKK0NPTkZJR19YMjU9bQorQ09ORklHX0xBUEI9bQorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CitDT05GSUdfRUNPTkVUPW0KK0NPTkZJR19FQ09ORVRfQVVOVURQPXkKK0NPTkZJR19FQ09ORVRfTkFUSVZFPXkKK0NPTkZJR19XQU5fUk9VVEVSPW0KKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKK0NPTkZJR19ORVRfU0NIRUQ9eQorQ09ORklHX05FVF9TQ0hfQ0xLX0pJRkZJRVM9eQorIyBDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hfQ0xLX0NQVSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9DQlE9bQorQ09ORklHX05FVF9TQ0hfSFRCPW0KKyMgQ09ORklHX05FVF9TQ0hfSEZTQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIX0FUTSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9QUklPPW0KK0NPTkZJR19ORVRfU0NIX1JFRD1tCitDT05GSUdfTkVUX1NDSF9TRlE9bQorQ09ORklHX05FVF9TQ0hfVEVRTD1tCitDT05GSUdfTkVUX1NDSF9UQkY9bQorQ09ORklHX05FVF9TQ0hfR1JFRD1tCitDT05GSUdfTkVUX1NDSF9EU01BUks9bQorIyBDT05GSUdfTkVUX1NDSF9ORVRFTSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9JTkdSRVNTPW0KK0NPTkZJR19ORVRfUU9TPXkKK0NPTkZJR19ORVRfRVNUSU1BVE9SPXkKK0NPTkZJR19ORVRfQ0xTPXkKKyMgQ09ORklHX05FVF9DTFNfQkFTSUMgaXMgbm90IHNldAorQ09ORklHX05FVF9DTFNfVENJTkRFWD1tCitDT05GSUdfTkVUX0NMU19ST1VURTQ9bQorQ09ORklHX05FVF9DTFNfUk9VVEU9eQorQ09ORklHX05FVF9DTFNfRlc9bQorQ09ORklHX05FVF9DTFNfVTMyPW0KKyMgQ09ORklHX0NMU19VMzJfUEVSRiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX0lORCBpcyBub3Qgc2V0CisjIENPTkZJR19DTFNfVTMyX01BUksgaXMgbm90IHNldAorQ09ORklHX05FVF9DTFNfUlNWUD1tCitDT05GSUdfTkVUX0NMU19SU1ZQNj1tCisjIENPTkZJR19ORVRfRU1BVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfQUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfQ0xTX1BPTElDRT15CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCitDT05GSUdfTkVUX1BLVEdFTj1tCisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSVEFQIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CitDT05GSUdfRUVQUk8xMDA9eQorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCitDT05GSUdfTkVUX1JBRElPPXkKKworIworIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQorIworIyBDT05GSUdfU1RSSVAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0CisjCitDT05GSUdfSEVSTUVTPXkKKyMgQ09ORklHX1BMWF9IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfVE1EX0hFUk1FUyBpcyBub3Qgc2V0CitDT05GSUdfUENJX0hFUk1FUz15CisjIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJpc20gR1QvRHVldHRlIDgwMi4xMShhL2IvZykgUENJL0NhcmRidXMgc3VwcG9ydAorIworIyBDT05GSUdfUFJJU001NCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1dJUkVMRVNTPXkKKworIworIyBXYW4gaW50ZXJmYWNlcworIworQ09ORklHX1dBTj15CisjIENPTkZJR19EU0NDNCBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5NRURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS19TWU5DUFBQIGlzIG5vdCBzZXQKK0NPTkZJR19IRExDPW0KK0NPTkZJR19IRExDX1JBVz15CisjIENPTkZJR19IRExDX1JBV19FVEggaXMgbm90IHNldAorQ09ORklHX0hETENfQ0lTQ089eQorQ09ORklHX0hETENfRlI9eQorQ09ORklHX0hETENfUFBQPXkKK0NPTkZJR19IRExDX1gyNT15CisjIENPTkZJR19QQ0kyMDBTWU4gaXMgbm90IHNldAorIyBDT05GSUdfV0FOWEwgaXMgbm90IHNldAorIyBDT05GSUdfUEMzMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkFSU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfRExDST1tCitDT05GSUdfRExDSV9DT1VOVD0yNAorQ09ORklHX0RMQ0lfTUFYPTgKK0NPTkZJR19XQU5fUk9VVEVSX0RSSVZFUlM9eQorIyBDT05GSUdfQ1lDTEFERVNfU1lOQyBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCRVRIRVIgaXMgbm90IHNldAorIyBDT05GSUdfWDI1X0FTWSBpcyBub3Qgc2V0CisKKyMKKyMgQVRNIGRyaXZlcnMKKyMKK0NPTkZJR19BVE1fVENQPW0KKyMgQ09ORklHX0FUTV9MQU5BSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fRU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9GSVJFU1RSRUFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9aQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9OSUNTVEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9JRFQ3NzI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fQU1CQVNTQURPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSE9SSVpPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSUEgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0ZPUkUyMDBFX01BWUJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9IRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTIKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19JWFA0WFhfV0FUQ0hET0c9eQorCisjCisjIFBDSS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENJUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19XRFRQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAorQ09ORklHX0kyQ19JWFA0WFg9eQorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAorIworQ09ORklHX0kyQ19TRU5TT1I9eQorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAorIworQ09ORklHX1NFTlNPUlNfRUVQUk9NPXkKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfRVhUMl9GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CitDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2pvcm5hZGE3MjBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGFlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2pvcm5hZGE3MjBfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTE5IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIzOjEwOjM1IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU0ExMTAwPXkKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgU0ExMXgwIEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfU0ExMTAwX0FTU0FCRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0NFUkYgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0NPTExJRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzNjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQkFER0U0IGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfSk9STkFEQTcyMD15CisjIENPTkZJR19TQTExMDBfSEFDS0tJVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfTEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfUExFQiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0hBTk5PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0lNUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9TU1AgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfU0ExMTAwPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXQj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQj15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfU0ExMTExPXkKK0NPTkZJR19ETUFCT1VOQ0U9eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9OQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPXkKKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPXkKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKK0NPTkZJR19JODIzNjU9eQorIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1NBMTEwMD15CisjIENPTkZJR19QQ01DSUFfU0ExMTExIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0NBUkRfTk9OU1RBVElDPXkKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0RJU0NPTlRJR01FTT15CisjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJrZWVwaW5pdHJkIG1lbT0zMk0iCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKK0NPTkZJR19GUEVfRkFTVEZQRT15CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9bQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19QTT15CisjIENPTkZJR19BUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CitDT05GSUdfTVREX0RFQlVHPXkKK0NPTkZJR19NVERfREVCVUdfVkVSQk9TRT0xCisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPW0KK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9OT1NXQVA9eQorIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfU0ExMTAwPXkKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPW0KKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9OQkQ9bQorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPW0KK0NPTkZJR19CTEtfREVWX0lERT1tCisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9bQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFQ1MgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFQ0Q9bQorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9bQorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQ0hJUFNFVFMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CitDT05GSUdfSVJEQT1tCisKKyMKKyMgSXJEQSBwcm90b2NvbHMKKyMKK0NPTkZJR19JUkxBTj1tCisjIENPTkZJR19JUk5FVCBpcyBub3Qgc2V0CitDT05GSUdfSVJDT01NPW0KKyMgQ09ORklHX0lSREFfVUxUUkEgaXMgbm90IHNldAorCisjCisjIElyREEgb3B0aW9ucworIworIyBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAgaXMgbm90IHNldAorIyBDT05GSUdfSVJEQV9GQVNUX1JSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREFfREVCVUcgaXMgbm90IHNldAorCisjCisjIEluZnJhcmVkLXBvcnQgZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lSVFRZX1NJUiBpcyBub3Qgc2V0CisKKyMKKyMgRG9uZ2xlIHN1cHBvcnQKKyMKKworIworIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19JUlBPUlRfU0lSIGlzIG5vdCBzZXQKKworIworIyBPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0CisjCisKKyMKKyMgRklSIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19OU0NfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTkJPTkRfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQ19JUkNDX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19BTElfRklSIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfRklSPW0KKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorQ09ORklHX01JST1tCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKK0NPTkZJR19ORVRfUkFESU89eQorCisjCisjIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCisjCisjIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0CitDT05GSUdfQVJMQU49bQorQ09ORklHX1dBVkVMQU49bQorQ09ORklHX1BDTUNJQV9XQVZFTEFOPW0KKyMgQ09ORklHX1BDTUNJQV9ORVRXQVZFIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyA4MDIuMTEgRnJlcXVlbmN5IEhvcHBpbmcgY2FyZHMgc3VwcG9ydAorIworIyBDT05GSUdfUENNQ0lBX1JBWUNTIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydAorIworQ09ORklHX0hFUk1FUz1tCisjIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgODAyLjExYiBQY21jaWEvQ2FyZGJ1cyBjYXJkcyBzdXBwb3J0CisjCitDT05GSUdfUENNQ0lBX0hFUk1FUz1tCitDT05GSUdfQUlST19DUz1tCisjIENPTkZJR19QQ01DSUFfV0wzNTAxIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfV0lSRUxFU1M9eQorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUX1BDTUNJQT15CitDT05GSUdfUENNQ0lBXzNDNTg5PW0KK0NPTkZJR19QQ01DSUFfM0M1NzQ9bQorQ09ORklHX1BDTUNJQV9GTVZKMThYPW0KK0NPTkZJR19QQ01DSUFfUENORVQ9bQorQ09ORklHX1BDTUNJQV9OTUNMQU49bQorQ09ORklHX1BDTUNJQV9TTUM5MUM5Mj1tCitDT05GSUdfUENNQ0lBX1hJUkMyUFM9bQorQ09ORklHX1BDTUNJQV9BWE5FVD1tCisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CitDT05GSUdfUFBQPW0KKyMgQ09ORklHX1BQUF9NVUxUSUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX0ZJTFRFUiBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0FTWU5DPW0KKyMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0RFRkxBVEU9bQorQ09ORklHX1BQUF9CU0RDT01QPW0KKyMgQ09ORklHX1BQUE9FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD02NDAKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT0yNDAKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1NBMTExMSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfU0ExMTAwPXkKK0NPTkZJR19TRVJJQUxfU0ExMTAwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorIyBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NPRlRfQ1VSU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTURBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD1tCisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCisjIENPTkZJR19TTkQgaXMgbm90IHNldAorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz1tCisjIENPTkZJR19KT0xJRVQgaXMgbm90IHNldAorIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfREVWRlNfRlM9eQorQ09ORklHX0RFVkZTX01PVU5UPXkKK0NPTkZJR19ERVZGU19ERUJVRz15CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MgorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz1tCitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9bQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19TVU5SUEM9bQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRVJST1JTPXkKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkNfQ0NJVFQ9bQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9sYXJ0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbGFydF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzMzgyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbGFydF9kZWZjb25maWcKQEAgLTAsMCArMSw4NzcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMjM6NTM6MjQgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU0ExMTAwPXkKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgU0ExMXgwIEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfU0ExMTAwX0FTU0FCRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0NFUkYgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0NPTExJRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzNjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQkFER0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9KT1JOQURBNzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IQUNLS0lUIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfTEFSVD15CisjIENPTkZJR19TQTExMDBfUExFQiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0hBTk5PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0lNUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9TU1AgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfU0ExMTAwPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXQj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQj15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0E9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19ESVNDT05USUdNRU09eQorQ09ORklHX0xFRFM9eQorIyBDT05GSUdfTEVEU19USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfTEVEU19DUFU9eQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0EwLDk2MDAgcm9vdD0vZGV2L3JhbSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CisjIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFMgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9TQTExMDA9eQorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorQ09ORklHX0FQTT1tCisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorQ09ORklHX01URF9ERUJVRz15CitDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0U9MQorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0xBUlQ9eQorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9bQorQ09ORklHX0JMS19ERVZfSURFPW0KKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz1tCisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFQ0Q9bQorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9bQorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQ0hJUFNFVFMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPW0KKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKK0NPTkZJR19JUkRBPW0KKworIworIyBJckRBIHByb3RvY29scworIworQ09ORklHX0lSTEFOPW0KK0NPTkZJR19JUk5FVD1tCitDT05GSUdfSVJDT01NPW0KKyMgQ09ORklHX0lSREFfVUxUUkEgaXMgbm90IHNldAorCisjCisjIElyREEgb3B0aW9ucworIworQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQPXkKKyMgQ09ORklHX0lSREFfRkFTVF9SUiBpcyBub3Qgc2V0CitDT05GSUdfSVJEQV9ERUJVRz15CisKKyMKKyMgSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycworIworCisjCisjIFNJUiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfSVJUVFlfU0lSIGlzIG5vdCBzZXQKKworIworIyBEb25nbGUgc3VwcG9ydAorIworCisjCisjIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAorCisjCisjIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKKyMKKworIworIyBGSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX05TQ19GSVIgaXMgbm90IHNldAorIyBDT05GSUdfV0lOQk9ORF9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfU01DX0lSQ0NfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FMSV9GSVIgaXMgbm90IHNldAorQ09ORklHX1NBMTEwMF9GSVI9bQorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPW0KKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfQVNZTkM9bQorIyBDT05GSUdfUFBQX1NZTkNfVFRZIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAorQ09ORklHX1NMSVA9bQorQ09ORklHX1NMSVBfQ09NUFJFU1NFRD15CisjIENPTkZJR19TTElQX1NNQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVBfTU9ERV9TTElQNiBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPW0KK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD1tCisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorQ09ORklHX1JFSVNFUkZTX0ZTPW0KKyMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX1VERl9OTFM9eQorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPW0KK0NPTkZJR19KRkZTMl9GU19ERUJVRz0xCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz1tCisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz1tCitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9bQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9bQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz1tCitDT05GSUdfU1VOUlBDPW0KKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorQ09ORklHX05MU19VVEY4PW0KKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDMzI9bQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9bQorQ09ORklHX1pMSUJfREVGTEFURT1tCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHBkN2E0MDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDcwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDc4MSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgTW9uIE1hciAyOCAwMDowNjozMyAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKK0NPTkZJR19JS0NPTkZJRz15CisjIENPTkZJR19JS0NPTkZJR19QUk9DIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9MSDdBNDBYPXkKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBMSDdBNDBYIEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfTUFDSF9LRVY3QTQwMCBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9MUEQ3QTQwMD15CisjIENPTkZJR19NQUNIX0xQRDdBNDA0IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0xIN0E0MDA9eQorIyBDT05GSUdfTEg3QTQwWF9DT05USUdNRU0gaXMgbm90IHNldAorIyBDT05GSUdfTEg3QTQwWF9PTkVfQkFOS19QRVJfTk9ERSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjJUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0RJU0NPTlRJR01FTT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX1NNQzkxWD15CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9MSDdBNDBYPXkKK0NPTkZJR19TRVJJQUxfTEg3QTQwWF9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX1JUQz15CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfUFJFRU1QVD15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2xwZDdhNDA0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHBkN2E0MDRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2JlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDA0X2RlZmNvbmZpZwpAQCAtMCwwICsxLDkxOSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgTW9uIE1hciAyOCAwMDoxNDowOCAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKK0NPTkZJR19JS0NPTkZJRz15CisjIENPTkZJR19JS0NPTkZJR19QUk9DIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9MSDdBNDBYPXkKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBMSDdBNDBYIEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfTUFDSF9LRVY3QTQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xQRDdBNDAwIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0xQRDdBNDA0PXkKK0NPTkZJR19BUkNIX0xIN0E0MDQ9eQorIyBDT05GSUdfTEg3QTQwWF9DT05USUdNRU0gaXMgbm90IHNldAorIyBDT05GSUdfTEg3QTQwWF9PTkVfQkFOS19QRVJfTk9ERSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjJUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0RJU0NPTlRJR01FTT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19TQ1NJPXkKKyMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKKyMgQ09ORklHX0JMS19ERVZfU0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfU01DOTFYPXkKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0xIN0E0MFg9eQorQ09ORklHX1NFUklBTF9MSDdBNDBYX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfUlRDPXkKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0JMVUVUT09USF9UVFkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9eQorQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1JXX0RFVEVDVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQj15CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CitDT05GSUdfVVNCX0hJRElOUFVUPXkKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQlRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgQVRNL0RTTCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfUFJFRU1QVD15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2x1YmJvY2tfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9sdWJib2NrX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM4NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9sdWJib2NrX2RlZmNvbmZpZwpAQCAtMCwwICsxLDgwMyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgTW9uIE1hciAyOCAwMDoxODoxMyAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNT0QgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUFhBPXkKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZWwgUFhBMnh4IEltcGxlbWVudGF0aW9ucworIworQ09ORklHX0FSQ0hfTFVCQk9DSz15CisjIENPTkZJR19NQUNIX01BSU5TVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9JRFAgaXMgbm90IHNldAorIyBDT05GSUdfUFhBX1NIQVJQU0wgaXMgbm90IHNldAorQ09ORklHX1BYQTI1eD15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorQ09ORklHX1hTQ0FMRV9QTVU9eQorQ09ORklHX1NBMTExMT15CitDT05GSUdfRE1BQk9VTkNFPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTkKKworIworIyBCdXMgc3VwcG9ydAorIworCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKK0NPTkZJR19QQ0NBUkQ9eQorIyBDT05GSUdfUENNQ0lBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUE9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1BYQTJYWD15CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTPXkKK0NPTkZJR19MRURTX1RJTUVSPXkKK0NPTkZJR19MRURTX0NQVT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0icm9vdD0vZGV2L25mcyBpcD1ib290cCBjb25zb2xlPXR0eVMwLDExNTIwMCBtZW09NjRNIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKK0NPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTFVCQk9DSz15CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NIQVJQX1NMIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX1NNQzkxWD15CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRfUENNQ0lBPXkKKyMgQ09ORklHX1BDTUNJQV8zQzU4OSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfM0M1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZNVkoxOFggaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9QQ05FVD15CisjIENPTkZJR19QQ01DSUFfTk1DTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9TTUM5MUM5MiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfWElSQzJQUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfQVhORVQgaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorQ09ORklHX1NFUklPX1NBMTExMT15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfUFhBPXkKK0NPTkZJR19TRVJJQUxfUFhBX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCitDT05GSUdfVVNCX0dBREdFVD15CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9QWEEyWFg9eQorQ09ORklHX1VTQl9QWEEyWFg9eQorQ09ORklHX1VTQl9QWEEyWFhfU01BTEw9eQorIyBDT05GSUdfVVNCX0dBREdFVF9HT0tVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1pFUk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VURlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dfU0VSSUFMPXkKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9sdXNsNzIwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2x1c2w3MjAwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E2NGNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9sdXNsNzIwMF9kZWZjb25maWcKQEAgLTAsMCArMSw0NTUgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIE1vbiBNYXIgMjggMDA6MjQ6MzggMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorQ09ORklHX0ZJUT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9MNzIwMD15CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNNzIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0xWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WND15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V1Q9eQorQ09ORklHX0NQVV9UTEJfVjRXVD15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAwMDEwMDAwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weGYwM2UwMDAwCitDT05GSUdfWkJPT1RfUk9NPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eTAgY29uc29sZT10dHlMVTEsMTE1MjAwIHJvb3Q9L2Rldi9yYW0gaW5pdHJkPTB4ZjEwMDAwMDAsMHgwMDVkYWM3YiBtZW09MzJNIgorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworIyBDT05GSUdfRlBFX05XRlBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfQU9VVD15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fTElCUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKKyMgQ09ORklHX0NPTVBVVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19ST0NLRVRQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NZQ0xBREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RJR0lFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAorIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05fSERMQyBpcyBub3Qgc2V0CisjIENPTkZJR19SSVNDT004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TWCBpcyBub3Qgc2V0CisjIENPTkZJR19SSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tYWluc3RvbmVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9tYWluc3RvbmVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2Q2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL21haW5zdG9uZV9kZWZjb25maWcKQEAgLTAsMCArMSw3OTcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFNhdCBNYXIgMjYgMjA6MDA6NDUgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1BYQT15CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIEludGVsIFBYQTJ4eCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfTFVCQk9DSyBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9NQUlOU1RPTkU9eQorIyBDT05GSUdfQVJDSF9QWEFfSURQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BYQV9TSEFSUFNMIGlzIG5vdCBzZXQKK0NPTkZJR19QWEEyN3g9eQorQ09ORklHX0lXTU1YVD15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJyb290PS9kZXYvbmZzIGlwPWJvb3RwIGNvbnNvbGU9dHR5UzAsMTE1MjAwIG1lbT02NE0iCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFkgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0dFT01FVFJZPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JMSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TSEFSUF9TTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfU01DOTFYPXkKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj15CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9QWEE9eQorQ09ORklHX1NFUklBTF9QWEFfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorQ09ORklHX0ZCX1BYQT15CisjIENPTkZJR19GQl9QWEFfUEFSQU1FVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19MT0dPX0xJTlVYX01PTk89eQorQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQorQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgxYWRzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgxYWRzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTE3ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9teDFhZHNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzQ1IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDAyOjE1OjQ2IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVEwgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0lNWD15CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBJTVggSW1wbGVtZW50YXRpb25zCisjCitDT05GSUdfQVJDSF9NWDFBRFM9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0E9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCitDT05GSUdfUFJFRU1QVD15CisjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNNWDAsNTc2MDBuOCBpcD1ib290cCByb290PS9kZXYvbmZzIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKK0NPTkZJR19GUEVfTldGUEVfWFA9eQorQ09ORklHX0ZQRV9GQVNURlBFPXkKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCisjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorQ09ORklHX01URF9ST009eQorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfWEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9bQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9eQorIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0ZJTFRFUj15CitDT05GSUdfUFBQX0FTWU5DPXkKKyMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0RFRkxBVEU9eQorQ09ORklHX1BQUF9CU0RDT01QPXkKKyMgQ09ORklHX1BQUE9FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfSU1YPXkKK0NPTkZJR19TRVJJQUxfSU1YX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX1JUQz1tCisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfREVWRlNfRlM9eQorQ09ORklHX0RFVkZTX01PVU5UPXkKKyMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19QUkVFTVBUPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CisjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkNfQ0NJVFQ9eQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL25lcG9uc2V0X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmIxZjdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcKQEAgLTAsMCArMSwxMTQ1IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEKKyMgV2VkIE1hciAgOSAxNDoyODoyNiAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NBMTEwMD15CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIFNBMTF4MCBJbXBsZW1lbnRhdGlvbnMKKyMKK0NPTkZJR19TQTExMDBfQVNTQUJFVD15CitDT05GSUdfQVNTQUJFVF9ORVBPTlNFVD15CisjIENPTkZJR19TQTExMDBfQ0VSRiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQ09MTElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDM2MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9CQURHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0pPUk5BREE3MjAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0hBQ0tLSVQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0xBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1BMRUIgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NIQU5OT04gaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NJTVBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU1NQIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX1NBMTExMT15CitDT05GSUdfRE1BQk9VTkNFPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworQ09ORklHX1BDQ0FSRD15CisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT15CisKKyMKKyMgUEMtY2FyZCBicmlkZ2VzCisjCisjIENPTkZJR19JODIzNjUgaXMgbm90IHNldAorIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1NBMTEwMD15CitDT05GSUdfUENNQ0lBX1NBMTExMT15CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19ESVNDT05USUdNRU09eQorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHg4MDAwMAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHhjMTAwMDAwMAorQ09ORklHX1pCT09UX1JPTT15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQTAsMzg0MDBuOCBjcHVmcmVxPTIyMTIwMCBydyByb290PS9kZXYvbXRkYmxvY2syIG10ZHBhcnRzPXNhMTEwMDo1MTJLKGJvb3QpLDFNKGtlcm5lbCksMjU2MEsoaW5pdHJkKSw0TShyb290KSBsb2FkX3JhbWRpc2s9MSBwcm9tcHRfcmFtZGlzaz0wIG1lbT0zMk0gbm9pbml0cmQgaW5pdHJkPTB4YzA4MDAwMDAsM00iCitDT05GSUdfQ1BVX0ZSRVE9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NBMTExMD15CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19QTT15CitDT05GSUdfQVBNPXkKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFkgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCisjIENPTkZJR19NVERfQ0hBUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfR0VPTUVUUlkgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorQ09ORklHX01URF9SQU09eQorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX1NBMTEwMD15CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1NDU0k9bQorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPW0KKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfU0NTSV83MDAwRkFTU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSEExNTJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUhBMTU0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU4yMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFRDMzI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBX1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OQ1I1M0M0MDZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUEFTMTYgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QU0kyNDBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9VMTRfMzRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBTQ1NJIGFkYXB0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfUENNQ0lBX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX05JTkpBX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1FMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfU1lNNTNDNTAwIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTkNFIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfVkVORE9SX1NNQz15CisjIENPTkZJR19XRDgweDMgaXMgbm90IHNldAorIyBDT05GSUdfVUxUUkEgaXMgbm90IHNldAorQ09ORklHX1NNQzkxWD15CitDT05GSUdfU01DOTE5ND15CisjIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPQ0tFVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRfUENNQ0lBPXkKKyMgQ09ORklHX1BDTUNJQV8zQzU4OSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfM0M1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZNVkoxOFggaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9QQ05FVD15CisjIENPTkZJR19QQ01DSUFfTk1DTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9TTUM5MUM5MiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfWElSQzJQUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfQVhORVQgaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RTREVWPXkKK0NPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWD0yNDAKK0NPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWT0zMjAKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBJL08gZHJpdmVycworIworIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD1tCisjIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fU0ExMTExPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQorIyBDT05GSUdfQ09NUFVUT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPQ0tFVFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1lDTEFERVMgaXMgbm90IHNldAorIyBDT05GSUdfRElHSUVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfRElHSSBpcyBub3Qgc2V0CisjIENPTkZJR19FU1BTRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9YQV9JTlRFTExJTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT1hBX1NNQVJUSU8gaXMgbm90IHNldAorIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTkNMSU5LTVAgaXMgbm90IHNldAorIyBDT05GSUdfTl9IRExDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JJU0NPTTggaXMgbm90IHNldAorIyBDT05GSUdfU1BFQ0lBTElYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFMRFJWIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX0NTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD02NAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NBMTEwMF9XQVRDSERPRz1tCisKKyMKKyMgSVNBLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JWENPTVdEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0VMRUtUT1IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9TQTExMDA9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD15CisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCisjIENPTkZJR19TTkQgaXMgbm90IHNldAorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCitDT05GSUdfU09VTkRfUFJJTUU9eQorIyBDT05GSUdfU09VTkRfQlQ4NzggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORENMQVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9PU1MgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFZNSVhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRDE5ODAgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCPW0KK0NPTkZJR19VU0JfREVCVUc9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1VTQl9PSENJX0hDRD1tCisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CTFVFVE9PVEhfVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPW0KKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1JXX0RFVEVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT1VTRT1tCisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FR0FMQVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPW0KKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEFUTS9EU0wgZHJpdmVycworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz1tCitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTVNET1NfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9uZXR3aW5kZXJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9uZXR3aW5kZXJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODFhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL25ldHdpbmRlcl9kZWZjb25maWcKQEAgLTAsMCArMSwxMDQ2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDE1OjE4OjQyIDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9GT09UQlJJREdFPXkKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIEZvb3RicmlkZ2UgSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19BUkNIX0NBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QRVJTT05BTF9TRVJWRVIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMjg1X0FERElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTI4NV9IT1NUIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX05FVFdJTkRFUj15CitDT05GSUdfRk9PVEJSSURHRT15CitDT05GSUdfRk9PVEJSSURHRV9IT1NUPXkKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjRXQj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXQj15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0E9eQorQ09ORklHX0lTQV9ETUE9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKK0NPTkZJR19QQ0lfTkFNRVM9eQorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTPXkKKyMgQ09ORklHX0xFRFNfVElNRVIgaXMgbm90IHNldAorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJyb290PTB4MzAxIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfUEFSUE9SVD15CitDT05GSUdfUEFSUE9SVF9QQz15CisjIENPTkZJR19QQVJQT1JUX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUX1BDX0ZJRk8gaXMgbm90IHNldAorQ09ORklHX1BBUlBPUlRfUENfU1VQRVJJTz15CisjIENPTkZJR19QQVJQT1JUX0FSQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUX0dTQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUXzEyODQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfWEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFSSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorQ09ORklHX0lERURJU0tfTVVMVElfTU9ERT15CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKK0NPTkZJR19CTEtfREVWX0lERVBDST15CisjIENPTkZJR19JREVQQ0lfU0hBUkVfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9TTDgyQzEwNT15CitDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKKyMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQ0hJUFNFVFMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9BVVRPPXkKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX05FVExJTktfREVWPXkKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQX05GX0NPTk5UUkFDSz15CisjIENPTkZJR19JUF9ORl9DVF9BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NUX1BST1RPX1NDVFAgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0ZUUD15CisjIENPTkZJR19JUF9ORl9JUkMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfVEZUUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9BTUFOREEgaXMgbm90IHNldAorQ09ORklHX0lQX05GX1FVRVVFPXkKK0NPTkZJR19JUF9ORl9JUFRBQkxFUz15CisjIENPTkZJR19JUF9ORl9NQVRDSF9MSU1JVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX01BQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9QS1RUWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX01BUksgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfTVVMVElQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX1RPUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfRUNOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0RTQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0xFTkdUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9UVEwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0hFTFBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9TVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfT1dORVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE0gaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9DT01NRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9GSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfVEFSR0VUX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX05BVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQU5HTEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUX1RVTElQPXkKKyMgQ09ORklHX0RFMjEwNFggaXMgbm90IHNldAorQ09ORklHX1RVTElQPXkKKyMgQ09ORklHX1RVTElQX01XSSBpcyBub3Qgc2V0CitDT05GSUdfVFVMSVBfTU1JTz15CisjIENPTkZJR19UVUxJUF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFNFg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTkJPTkRfODQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTEwMiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDE3MDAgaXMgbm90IHNldAorIyBDT05GSUdfREVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lTQSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQUMzMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUklDT1QgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUzg5eDAgaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKK0NPTkZJR19ORTJLX1BDST15CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMSVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1NFUklBTD15CisjIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorQ09ORklHX0lOUFVUX1VJTlBVVD15CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX0k4MDQyPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1BBUktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF8yMTI4NSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKK0NPTkZJR19QUklOVEVSPXkKKyMgQ09ORklHX0xQX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBERVYgaXMgbm90IHNldAorIyBDT05GSUdfVElQQVIgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfMjEyODVfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHXzk3N19XQVRDSERPRz15CisKKyMKKyMgSVNBLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JWENPTVdEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVCBpcyBub3Qgc2V0CisKKyMKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CitDT05GSUdfRFMxNjIwPXkKK0NPTkZJR19OV0JVVFRPTj15CitDT05GSUdfTldCVVRUT05fUkVCT09UPXkKK0NPTkZJR19OV0ZMQVNIPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19SVEM9eQorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CitDT05GSUdfRkJfQ1lCRVIyMDAwPXkKKyMgQ09ORklHX0ZCX0FTSUxJQU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0lNU1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX05WSURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BVFJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9SQURFT05fT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKK0NPTkZJR19WR0FfQ09OU09MRT15CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfRk9OVFM9eQorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQorIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfUEVBUkxfOHg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfQUNPUk5fOHg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfTUlOSV80eDYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAorCisjCisjIExvZ28gY29uZmlndXJhdGlvbgorIworQ09ORklHX0xPR089eQorQ09ORklHX0xPR09fTElOVVhfTU9OTz15CitDT05GSUdfTE9HT19MSU5VWF9WR0ExNj15CitDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD15CisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCisjIENPTkZJR19TTkQgaXMgbm90IHNldAorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCitDT05GSUdfU09VTkRfUFJJTUU9eQorIyBDT05GSUdfU09VTkRfQlQ4NzggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfQ01QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfQ1M0MjgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0VTMTM3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9FUzEzNzEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRVNTU09MTzEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTUFFU1RSTyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NQUVTVFJPMyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9JQ0ggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfT1NTPXkKK0NPTkZJR19TT1VORF9UUkFDRUlOSVQ9eQorQ09ORklHX1NPVU5EX0RNQVA9eQorIyBDT05GSUdfU09VTkRfQUQxODE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FEMTg4OSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TR0FMQVhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FETElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FDSV9NSVhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9DUzQyMzIgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfU1NDQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0dVUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9WTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9UUklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NUFU0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTUFEMTYgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfUEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1BTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TQiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BV0UzMl9TWU5USCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NQVVJIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9ZTTM4MTI9eQorIyBDT05GSUdfU09VTkRfT1BMM1NBMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9PUEwzU0EyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1lNRlBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9VQVJUNjg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRURTUDE2IGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9XQVZFQVJUSVNUPXkKKyMgQ09ORklHX1NPVU5EX0FMSTU0NTUgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRk9SVEUgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfUk1FOTZYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRDE5ODAgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CitDT05GSUdfQVVUT0ZTX0ZTPXkKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPXkKK0NPTkZJR19KT0xJRVQ9eQorIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorQ09ORklHX1NNQl9GUz15CisjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorQ09ORklHX05MU19DT0RFUEFHRV84NTI9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX05MU19JU084ODU5XzI9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE1PXkKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9eQorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU4ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTcxIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDE3OjUyOjQxIDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfT01BUD15CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBUSSBPTUFQIEltcGxlbWVudGF0aW9ucworIworCisjCisjIE9NQVAgQ29yZSBUeXBlCisjCisjIENPTkZJR19BUkNIX09NQVA3MzAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQMTUxMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9PTUFQMTZYWD15CitDT05GSUdfQVJDSF9PTUFQX09URz15CisKKyMKKyMgT01BUCBCb2FyZCBUeXBlCisjCisjIENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX09NQVBfSDI9eQorIyBDT05GSUdfTUFDSF9PTUFQX0gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfT01BUF9INCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX09NQVBfT1NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfT01BUF9HRU5FUklDIGlzIG5vdCBzZXQKKworIworIyBPTUFQIEZlYXR1cmUgU2VsZWN0aW9ucworIworQ09ORklHX09NQVBfTVVYPXkKKyMgQ09ORklHX09NQVBfTVVYX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX01VWF9XQVJOSU5HUz15CitDT05GSUdfT01BUF9NUFVfVElNRVI9eQorIyBDT05GSUdfT01BUF8zMktfVElNRVIgaXMgbm90IHNldAorQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDE9eQorIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX0FSTV8xOTJNSFo9eQorIyBDT05GSUdfT01BUF9BUk1fMTY4TUhaIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfQVJNXzEyME1IWiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0FSTV82ME1IWiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0FSTV8zME1IWiBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjZUPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VEo9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfQ0FDSEVfUk9VTkRfUk9CSU4gaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKK0NPTkZJR19QUkVFTVBUPXkKKyMgQ09ORklHX0xFRFMgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT0zMk0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PTA4MDEgcm8gaW5pdD0vYmluL3NoIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisjIENPTkZJR19WRlAgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRFJJVkVSPXkKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfREVCVUc9eQorQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTMKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfQVRBX09WRVJfRVRIPW0KKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworIyBDT05GSUdfQkxLX0RFVl9TRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19TTUM5MVg9eQorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD15CisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CitDT05GSUdfU0xJUD15CitDT05GSUdfU0xJUF9DT01QUkVTU0VEPXkKKyMgQ09ORklHX1NMSVBfU01BUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUF9NT0RFX1NMSVA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj15CitDT05GSUdfSU5QVVRfRVZCVUc9eQorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfVUlOUFVUPXkKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKK0NPTkZJR19JU1AxMzAxX09NQVA9eQorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZCX0NGQl9GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TT0ZUX0NVUlNPUiBpcyBub3Qgc2V0CitDT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CisjIENPTkZJR19GT05UXzZ4MTEgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9QRUFSTF84eDggaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9BQ09STl84eDggaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCitDT05GSUdfTE9HTz15CisjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAorIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CitDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD15CisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCisjIENPTkZJR19TTkQgaXMgbm90IHNldAorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCitDT05GSUdfU09VTkRfUFJJTUU9eQorIyBDT05GSUdfU09VTkRfQlQ4NzggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORENMQVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9PU1MgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFZNSVhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRDE5ODAgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfT01BUD15CitDT05GSUdfVVNCX09NQVA9eQorIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1pFUk8gaXMgbm90IHNldAorQ09ORklHX1VTQl9FVEg9eQorQ09ORklHX1VTQl9FVEhfUk5ESVM9eQorIyBDT05GSUdfVVNCX0dBREdFVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorQ09ORklHX1JPTUZTX0ZTPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MgorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfUFJFRU1QVD15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21uaW1ldGVyX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21uaW1ldGVyX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZkYjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbW5pbWV0ZXJfZGVmY29uZmlnCkBAIC0wLDAgKzEsODAzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIxOjMxOjQ1IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TQTExMDA9eQorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBTQTExeDAgSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19TQTExMDBfQVNTQUJFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQ0VSRiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQ09MTElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDM2MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9CQURHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0pPUk5BREE3MjAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0hBQ0tLSVQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0xBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1BMRUIgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NIQU5OT04gaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NJTVBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU1NQIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPXkKKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPXkKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKK0NPTkZJR19JODIzNjU9eQorIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1NBMTEwMD15CitDT05GSUdfUENDQVJEX05PTlNUQVRJQz15CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19ESVNDT05USUdNRU09eQorIyBDT05GSUdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0ia2VlcGluaXRyZCBtZW09MTZNIHJvb3Q9L2Rldi9yYW0gcmFtZGlzaz04MTkyIGluaXRyZD0weGQwMDAwMDAwLDRNIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPW0KKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9OQkQ9bQorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFQ1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9DSElQU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29ya2luZyBzdXBwb3J0CisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworQ09ORklHX05FVF9SQURJTz15CisKKyMKKyMgT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkKKyMKKyMgQ09ORklHX1NUUklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVkVMQU4gaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9XQVZFTEFOPXkKKyMgQ09ORklHX1BDTUNJQV9ORVRXQVZFIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyA4MDIuMTEgRnJlcXVlbmN5IEhvcHBpbmcgY2FyZHMgc3VwcG9ydAorIworIyBDT05GSUdfUENNQ0lBX1JBWUNTIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydAorIworIyBDT05GSUdfSEVSTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyA4MDIuMTFiIFBjbWNpYS9DYXJkYnVzIGNhcmRzIHN1cHBvcnQKKyMKK0NPTkZJR19BSVJPX0NTPXkKK0NPTkZJR19QQ01DSUFfV0wzNTAxPXkKK0NPTkZJR19ORVRfV0lSRUxFU1M9eQorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUX1BDTUNJQT15CitDT05GSUdfUENNQ0lBXzNDNTg5PXkKKyMgQ09ORklHX1BDTUNJQV8zQzU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfRk1WSjE4WCBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1BDTkVUPXkKKyMgQ09ORklHX1BDTUNJQV9OTUNMQU4gaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1NNQzkxQzkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9YSVJDMlBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9BWE5FVCBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorQ09ORklHX0ZCX1NBMTEwMD15CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CitDT05GSUdfRk9OVF84eDg9eQorIyBDT05GSUdfRk9OVF84eDE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfNngxMSBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvcGxlYl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3BsZWJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmVjODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL3BsZWJfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzQ5IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIyOjAzOjAyIDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tPQkpFQ1RfVUVWRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CisjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NBMTEwMD15CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIFNBMTF4MCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX1NBMTEwMF9BU1NBQkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DRVJGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DT0xMSUUgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzYwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0JBREdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSk9STkFEQTcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSEFDS0tJVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfTEFSVCBpcyBub3Qgc2V0CitDT05GSUdfU0ExMTAwX1BMRUI9eQorIyBDT05GSUdfU0ExMTAwX1NIQU5OT04gaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NJTVBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU1NQIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfRElTQ09OVElHTUVNPXkKKyMgQ09ORklHX0xFRFMgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0EwLDk2MDAgbWVtPTE2TUAweGMwMDAwMDAwIG1lbT0xNk1AMHhjODAwMDAwMCByb290PS9kZXYvcmFtIGluaXRyZD0weGMwNDAwMDAwLDRNIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQ9eQorQ09ORklHX0NQVV9GUkVRX1NBMTEwMD15CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKK0NPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRD15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX01URF9TQTExMDA9eQorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfWEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorQ09ORklHX1NNQzkxWD15CisjIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPQ0tFVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz1tCitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX0RJUkVDVElPPXkKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPW0KK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfU1VOUlBDPW0KKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3B4YTI1NS1pZHBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9weGEyNTUtaWRwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMzMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9weGEyNTUtaWRwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDc5OSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMjoyMDoxNyAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNT0QgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUFhBPXkKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZWwgUFhBMnh4IEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfQVJDSF9MVUJCT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUFJTlNUT05FIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1BYQV9JRFA9eQorIyBDT05GSUdfUFhBX1NIQVJQU0wgaXMgbm90IHNldAorQ09ORklHX1BYQTI1eD15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX01JTklDQUNIRT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJyb290PS9kZXYvbmZzIGlwPWRoY3AgY29uc29sZT10dHlTMCwxMTUyMDAgbWVtPTY0TSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0kxIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NIQVJQX1NMIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCisjIENPTkZJR19JREVfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19TTUM5MVg9eQorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1BYQT15CitDT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CitDT05GSUdfRkJfU09GVF9DVVJTT1I9eQorIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CitDT05GSUdfRkJfUFhBPXkKKyMgQ09ORklHX0ZCX1BYQV9QQVJBTUVURVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorQ09ORklHX0ZPTlRTPXkKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKyMgQ09ORklHX0ZPTlRfNngxMSBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19MT0dPX0xJTlVYX01PTk89eQorQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQorQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9ycGNfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9ycGNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTg0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL3JwY19kZWZjb25maWcKQEAgLTAsMCArMSw5MzkgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMQorIyBXZWQgTWFyICA5IDE0OjQxOjQ4IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKK0NPTkZJR19GSVE9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9SUEM9eQorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FDT1JOPXkKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX0FSTTYxMD15CitDT05GSUdfQ1BVX0FSTTcxMD15CitDT05GSUdfQ1BVX1NBMTEwPXkKK0NPTkZJR19DUFVfMzJ2Mz15CitDT05GSUdfQ1BVX0FCUlRfRVY0PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjM9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdCPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjM9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjM9eQorQ09ORklHX0NQVV9UTEJfVjRXQj15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfVElNRVJfQUNPUk49eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9IiIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1BBUlBPUlQ9eQorQ09ORklHX1BBUlBPUlRfUEM9eQorQ09ORklHX1BBUlBPUlRfUENfQ01MMT15CitDT05GSUdfUEFSUE9SVF9QQ19GSUZPPXkKKyMgQ09ORklHX1BBUlBPUlRfUENfU1VQRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUX0FSQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUX09USEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfMTI4NCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworQ09ORklHX0JMS19ERVZfRkQ9eQorIyBDT05GSUdfUEFSSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPW0KKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQWNvcm4tc3BlY2lmaWMgYmxvY2sgZGV2aWNlcworIworCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CitDT05GSUdfSURFRElTS19NVUxUSV9NT0RFPXkKK0NPTkZJR19CTEtfREVWX0lERUNEPXkKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfSURFX0FSTT15CitDT05GSUdfQkxLX0RFVl9JREVfSUNTSURFPXkKK0NPTkZJR19CTEtfREVWX0lERURNQV9JQ1M9eQorQ09ORklHX0lERURNQV9JQ1NfQVVUTz15CitDT05GSUdfQkxLX0RFVl9JREVfUkFQSURFPXkKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfQVVUTz15CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9bQorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NSPXkKK0NPTkZJR19CTEtfREVWX1NSX1ZFTkRPUj15CitDT05GSUdfQ0hSX0RFVl9TRz15CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CisKKyMKKyMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFBBPW0KK0NPTkZJR19TQ1NJX0lNTT1tCisjIENPTkZJR19TQ1NJX0laSVBfRVBQMTYgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JWklQX1NMT1dfQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NDU0lfQUNPUk5TQ1NJXzM9bQorQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRT15CitDT05GSUdfU0NTSV9BQ09STlNDU0lfU1lOQz15CitDT05GSUdfU0NTSV9BUlhFU0NTST1tCitDT05GSUdfU0NTSV9DVU1BTkFfMj1tCitDT05GSUdfU0NTSV9FRVNPWFNDU0k9bQorQ09ORklHX1NDU0lfUE9XRVJURUNTQ1NJPXkKKworIworIyBUaGUgZm9sbG93aW5nIGRyaXZlcnMgYXJlIG5vdCBmdWxseSBzdXBwb3J0ZWQKKyMKK0NPTkZJR19TQ1NJX0NVTUFOQV8xPW0KK0NPTkZJR19TQ1NJX09BSzE9bQorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRMSU5LX0RFVj15CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj1tCisjIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSVEFQIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKK0NPTkZJR19BUk1fRVRIRVIxPXkKK0NPTkZJR19BUk1fRVRIRVIzPXkKK0NPTkZJR19BUk1fRVRIRVJIPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QTElQIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9BU1lOQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAorQ09ORklHX1BQUE9FPW0KKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBJL08gZHJpdmVycworIworIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BBUktCRCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fUlBDS0JEPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CisjIENPTkZJR19NT1VTRV9QUzIgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKK0NPTkZJR19NT1VTRV9SSVNDUEM9eQorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MTYKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMXzgyNTBfQUNPUk49eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9NjQKK0NPTkZJR19QUklOVEVSPW0KKyMgQ09ORklHX0xQX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBERVYgaXMgbm90IHNldAorIyBDT05GSUdfVElQQVIgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9BQ09STj15CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CisjIENPTkZJR19GT05UXzh4OCBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDE2PXkKKyMgQ09ORklHX0ZPTlRfNngxMSBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF9BQ09STl84eDg9eQorIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCitDT05GSUdfTE9HTz15CitDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKK0NPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT1tCisjIENPTkZJR19TT1VORF9CVDg3OCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfQ1M0MjgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1NPTklDVklCRVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9PU1M9bQorIyBDT05GSUdfU09VTkRfVFJBQ0VJTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0RNQVAgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfQUQxODE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FEMTg4OSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TR0FMQVhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FETElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FDSV9NSVhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9DUzQyMzIgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfU1NDQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0dVUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9WTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9UUklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NUFU0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTUFEMTYgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfUEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1BTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TQiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BV0UzMl9TWU5USCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9XQVZFRlJPTlQgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTUFVSSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9ZTTM4MTIgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfT1BMM1NBMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9PUEwzU0EyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1VBUlQ2ODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FFRFNQMTYgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX1ZJREM9bQorIyBDT05GSUdfU09VTkRfVFZNSVhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRDE5ODAgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0IgaXMgbm90IHNldAorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPW0KKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz15CitDT05GSUdfSk9MSUVUPXkKKyMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfQURGU19GUz15CisjIENPTkZJR19BREZTX0ZTX1JXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKK0NPTkZJR19BQ09STl9QQVJUSVRJT049eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQSBpcyBub3Qgc2V0CisjIENPTkZJR19BQ09STl9QQVJUSVRJT05fRUVTT1ggaXMgbm90IHNldAorQ09ORklHX0FDT1JOX1BBUlRJVElPTl9JQ1M9eQorQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTPXkKK0NPTkZJR19BQ09STl9QQVJUSVRJT05fUE9XRVJURUM9eQorQ09ORklHX0FDT1JOX1BBUlRJVElPTl9SSVNDSVg9eQorQ09ORklHX09TRl9QQVJUSVRJT049eQorQ09ORklHX0FNSUdBX1BBUlRJVElPTj15CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01BQ19QQVJUSVRJT049eQorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfQlNEX0RJU0tMQUJFTD15CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTj15CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0dJX1BBUlRJVElPTj15CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19TVU5fUEFSVElUSU9OPXkKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQorQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTI9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTc9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjA9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjE9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjI9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjM9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjQ9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjY9bQorQ09ORklHX05MU19DT0RFUEFHRV84Njk9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzg3ND1tCitDT05GSUdfTkxTX0lTTzg4NTlfOD1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0FTQ0lJPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KK0NPTkZJR19OTFNfSVNPODg1OV8yPW0KK0NPTkZJR19OTFNfSVNPODg1OV8zPW0KK0NPTkZJR19OTFNfSVNPODg1OV80PW0KK0NPTkZJR19OTFNfSVNPODg1OV81PW0KK0NPTkZJR19OTFNfSVNPODg1OV82PW0KK0NPTkZJR19OTFNfSVNPODg1OV83PW0KK0NPTkZJR19OTFNfSVNPODg1OV85PW0KKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfS09JOF9SPW0KKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2M2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKQEAgLTAsMCArMSw5NTQgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIFN1biBNYXIgMjcgMTc6NDc6NDUgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CisjIENPTkZJR19DTEVBTl9DT01QSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19CUk9LRU49eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TM0MyNDEwPXkKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBTM0MyNFhYIEltcGxlbWVudGF0aW9ucworIworQ09ORklHX0FSQ0hfQkFTVD15CitDT05GSUdfQVJDSF9IMTk0MD15CitDT05GSUdfTUFDSF9OMzA9eQorQ09ORklHX0FSQ0hfU01ESzI0MTA9eQorQ09ORklHX0FSQ0hfUzNDMjQ0MD15CitDT05GSUdfTUFDSF9WUjEwMDA9eQorQ09ORklHX01BQ0hfUlgzNzE1PXkKK0NPTkZJR19NQUNIX09UT009eQorQ09ORklHX01BQ0hfTkVYQ09ERVJfMjQ0MD15CitDT05GSUdfQ1BVX1MzQzI0MTA9eQorQ09ORklHX0NQVV9TM0MyNDQwPXkKKworIworIyBTM0MyNDEwIEJvb3QKKyMKKyMgQ09ORklHX1MzQzI0MTBfQk9PVF9XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgUzNDMjQxMCBTZXR1cAorIworQ09ORklHX1MzQzI0MTBfRE1BPXkKKyMgQ09ORklHX1MzQzI0MTBfRE1BX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MzQzI0MTBfUE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUzNDMjQxMF9QTV9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfUzNDMjQxMF9MT1dMRVZFTF9VQVJUX1BPUlQ9MAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0icm9vdD0vZGV2L2hkYTEgcm8gaW5pdD0vYmluL2Jhc2ggY29uc29sZT10dHlTQUMwIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19QTT15CitDT05GSUdfQVBNPXkKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFkgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfSkVERUNQUk9CRT15CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTY9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9DRklfQU1EU1REX1JFVFJZPTAKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorQ09ORklHX01URF9ST009eQorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9JTVBBNyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0JBU1Q9eQorQ09ORklHX01URF9CQVNUX01BWFNJWkU9NAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19NVERfTkFORD15CisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0lEUz15CitDT05GSUdfTVREX05BTkRfUzNDMjQxMD15CisjIENPTkZJR19NVERfTkFORF9TM0MyNDEwX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX1MzQzI0MTBfSFdFQ0MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19QQVJQT1JUPXkKKyMgQ09ORklHX1BBUlBPUlRfUEMgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9BUkMgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9HU0MgaXMgbm90IHNldAorQ09ORklHX1BBUlBPUlRfMTI4ND15CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD1tCitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19BVEFfT1ZFUl9FVEg9bQorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorQ09ORklHX0JMS19ERVZfSURFVEFQRT1tCitDT05GSUdfQkxLX0RFVl9JREVGTE9QUFk9bQorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERV9CQVNUPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfVENQRElBRz15CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19NSUkgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMSVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUEFSS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKKyMgQ09ORklHX0NPTVBVVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19ST0NLRVRQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NZQ0xBREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RJR0lFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAorIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05fSERMQyBpcyBub3Qgc2V0CisjIENPTkZJR19SSVNDT004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TWCBpcyBub3Qgc2V0CisjIENPTkZJR19SSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9OAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1MzQzI0MTA9eQorQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9CQVNUX1NJTz15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKK0NPTkZJR19QUklOVEVSPXkKKyMgQ09ORklHX0xQX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX1BQREVWPXkKKyMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TM0MyNDEwX1dBVENIRE9HPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CitDT05GSUdfUzNDMjQxMF9SVEM9eQorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj1tCisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKK0NPTkZJR19JMkNfQUxHT0JJVD1tCisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfUzNDMjQxMD15CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfU0VOU09SPW0KKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfTE03NT1tCisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfTE03OD1tCisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKK0NPTkZJR19TRU5TT1JTX0xNODU9bQorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfU0VOU09SU19FRVBST009bQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZCX0NGQl9GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TT0ZUX0NVUlNPUiBpcyBub3Qgc2V0CitDT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEUgaXMgbm90IHNldAorCisjCisjIExvZ28gY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfRlM9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlNfRlM9eQorQ09ORklHX0pGRlNfRlNfVkVSQk9TRT0wCisjIENPTkZJR19KRkZTX1BST0NfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCisjIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19CU0RfRElTS0xBQkVMPXkKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OPXkKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE2CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfUzNDMjQxMF9QT1JUPXkKK0NPTkZJR19ERUJVR19TM0MyNDEwX1VBUlQ9MAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3NoYW5ub25fZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zaGFubm9uX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ZhY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zaGFubm9uX2RlZmNvbmZpZwpAQCAtMCwwICsxLDg3MiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMzoyNjo0NiAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TQTExMDA9eQorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBTQTExeDAgSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19TQTExMDBfQVNTQUJFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQ0VSRiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfQ09MTElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDM2MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9CQURHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0pPUk5BREE3MjAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0hBQ0tLSVQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0xBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1BMRUIgaXMgbm90IHNldAorQ09ORklHX1NBMTEwMF9TSEFOTk9OPXkKKyMgQ09ORklHX1NBMTEwMF9TSU1QQUQgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX1NTUCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9TQTExMDA9eQorQ09ORklHX0NQVV8zMnY0PXkKK0NPTkZJR19DUFVfQUJSVF9FVjQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdCPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCPXkKK0NPTkZJR19DUFVfTUlOSUNBQ0hFPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworQ09ORklHX1BDQ0FSRD15CisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT15CisKKyMKKyMgUEMtY2FyZCBicmlkZ2VzCisjCisjIENPTkZJR19JODIzNjUgaXMgbm90IHNldAorIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1NBMTEwMD15CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19ESVNDT05USUdNRU09eQorIyBDT05GSUdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQTAsOTYwMCBjb25zb2xlPXR0eTEgcm9vdD0vZGV2L210ZGJsb2NrMiBpbml0PS9saW51eHJjIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURF9SRVRSWT0wCisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfU0ExMTAwPXkKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9bQorQ09ORklHX0JMS19ERVZfSURFPW0KKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9bQorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQ0hJUFNFVFMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SQUNBTCBpcyBub3Qgc2V0CisjIENPTkZJR19BVDE3MDAgaXMgbm90IHNldAorIyBDT05GSUdfREVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUX1BDTUNJQT15CisjIENPTkZJR19QQ01DSUFfM0M1ODkgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBXzNDNTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9GTVZKMThYIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfUENORVQ9eQorIyBDT05GSUdfUENNQ0lBX05NQ0xBTiBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1NNQzkxQzkyPXkKKyMgQ09ORklHX1BDTUNJQV9YSVJDMlBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9BWE5FVCBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfV0FUQ0hET0c9eQorCisjCisjIElTQS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVhDT01XRCBpcyBub3Qgc2V0CisjIENPTkZJR19XRFQgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKK0NPTkZJR19GQl9TT0ZUX0NVUlNPUj15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9TQTExMDA9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlOSVhfRlM9eQorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc2hhcmtfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5YmNiYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc2hhcmtfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTc0IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBTdW4gTWFyIDI3IDIzOjU5OjE0IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorIyBDT05GSUdfQ0xFQU5fQ09NUElMRSBpcyBub3Qgc2V0CitDT05GSUdfQlJPS0VOPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NIQVJLPXkKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9TQTExMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKK0NPTkZJR19JU0FfRE1BPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9IT1NUX1ZJQTgyQzUwNT15CitDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKKyMgQ09ORklHX1BDSV9OQU1FUyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorIyBDT05GSUdfTEVEU19DUFUgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9IiIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworIyBDT05GSUdfRlBFX05XRlBFIGlzIG5vdCBzZXQKK0NPTkZJR19GUEVfRkFTVEZQRT15CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfUEFSUE9SVD15CitDT05GSUdfUEFSUE9SVF9QQz15CisjIENPTkZJR19QQVJQT1JUX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUX1BDX0ZJRk8gaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9QQ19TVVBFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfQVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfR1NDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfMTI4NCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERUNEPXkKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVGTE9QUFk9eQorIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9JREVQQ0kgaXMgbm90IHNldAorQ09ORklHX0lERV9BUk09eQorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19TQ1NJPW0KK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD1tCitDT05GSUdfQ0hSX0RFVl9TVD1tCisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU1I9bQorIyBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9bQorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzcwMDBGQVNTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUhBMTUyWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FIQTE1NDIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ1BRRkNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFRDMzI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBX1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU1NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkNSNTNDNDA2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUEFTMTYgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QQ0kyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUENJMjIyMEkgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QU0kyNDBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19JU1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9RTEEyWFhYPW0KKyMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M0MTYgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9UMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfVTE0XzM0RiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SQUNBTCBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVDE3MDAgaXMgbm90IHNldAorIyBDT05GSUdfREVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lTQSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQUMzMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUklDT1QgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CitDT05GSUdfQ1M4OXgwPXkKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMSVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX0k4MDQyPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUEFSS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CitDT05GSUdfUFJJTlRFUj1tCisjIENPTkZJR19MUF9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfUlRDPXkKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKK0NPTkZJR19GQl9TT0ZUX0NVUlNPUj15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAorQ09ORklHX0ZCX0NZQkVSMjAwMD15CisjIENPTkZJR19GQl9BU0lMSUFOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9JTVNUVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9OVklESUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUklWQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQVRST1ggaXMgbm90IHNldAorIyBDT05GSUdfRkJfUkFERU9OX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0FUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAorIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTURBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQorCisjCisjIExvZ28gY29uZmlndXJhdGlvbgorIworQ09ORklHX0xPR089eQorIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAorQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCitDT05GSUdfU09VTkQ9bQorCisjCisjIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorIworIyBDT05GSUdfU05EIGlzIG5vdCBzZXQKKworIworIyBPcGVuIFNvdW5kIFN5c3RlbQorIworQ09ORklHX1NPVU5EX1BSSU1FPW0KKyMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0NNUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0VNVTEwSzEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9FUzEzNzAgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRVMxMzcxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0VTU1NPTE8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01BRVNUUk8gaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTUFFU1RSTzMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfSUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1NPTklDVklCRVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfT1NTPW0KKyMgQ09ORklHX1NPVU5EX1RSQUNFSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9ETUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FEMTgxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRDE4ODkgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfU0dBTEFYWSBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfQURMSUI9bQorIyBDT05GSUdfU09VTkRfQUNJX01JWEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0NTNDIzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TU0NBUEUgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfR1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1ZNSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1RSSVggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01QVTQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9OTTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NQUQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9QQVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfUFNTIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9TQj1tCisjIENPTkZJR19TT1VORF9BV0UzMl9TWU5USCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9XQVZFRlJPTlQgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTUFVSSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9ZTTM4MTIgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfT1BMM1NBMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9PUEwzU0EyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1lNRlBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9VQVJUNjg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRURTUDE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0tBSExVQSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BTEk1NDU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0ZPUlRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1JNRTk2WFggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfQUQxOTgwIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworQ09ORklHX0lTTzk2NjBfRlM9eQorQ09ORklHX0pPTElFVD15CisjIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfREVWRlNfRlM9eQorQ09ORklHX0RFVkZTX01PVU5UPXkKKyMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc2ltcGFkX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc2ltcGFkX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzczZWViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zaW1wYWRfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTY0IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgorIyBNb24gTWFyIDI4IDAwOjEwOjM2IDIwMDUKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSJvZTEiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX0tBTExTWU1TPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NBMTEwMD15CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorCisjCisjIFNBMTF4MCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX1NBMTEwMF9BU1NBQkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DRVJGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9DT0xMSUUgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0gzMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBMTEwMF9IMzYwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSDM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0ExMTAwX0JBREdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSk9STkFEQTcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfSEFDS0tJVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfTEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfUExFQiBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfU0hBTk5PTiBpcyBub3Qgc2V0CitDT05GSUdfU0ExMTAwX1NJTVBBRD15CisjIENPTkZJR19TQTExMDBfU1NQIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1NBMTEwMD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0I9eQorQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPXkKKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPXkKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKKyMgQ09ORklHX0k4MjM2NSBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0lDIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfU0ExMTAwPXkKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19ESVNDT05USUdNRU09eQorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorIyBDT05GSUdfTEVEU19DUFUgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im10ZHBhcnRzPXNhMTEwMDo1MTJrKGJvb3QpLDFtKGtlcm5lbCksLShyb290KSBjb25zb2xlPXR0eVNBMCByb290PTFmMDIgbm9pbml0cmQgbWVtPTY0TSBqZmZzMl9vcnBoYW5lZF9pbm9kZXM9ZGVsZXRlIHJvb3Rmc3R5cGU9amZmczIiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfTUlTQz1tCisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1BNPXkKK0NPTkZJR19BUE09eQorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKKyMgQ09ORklHX01URF9DRklfSTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKK0NPTkZJR19NVERfUkFNPXkKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX01URF9TQTExMDA9eQorIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0lNUEE3IGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPW0KKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09bQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CitDT05GSUdfSVJEQT1tCisKKyMKKyMgSXJEQSBwcm90b2NvbHMKKyMKK0NPTkZJR19JUkxBTj1tCitDT05GSUdfSVJORVQ9bQorQ09ORklHX0lSQ09NTT1tCisjIENPTkZJR19JUkRBX1VMVFJBIGlzIG5vdCBzZXQKKworIworIyBJckRBIG9wdGlvbnMKKyMKKyMgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREFfRkFTVF9SUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBJbmZyYXJlZC1wb3J0IGRldmljZSBkcml2ZXJzCisjCisKKyMKKyMgU0lSIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfSVJUVFlfU0lSPW0KKworIworIyBEb25nbGUgc3VwcG9ydAorIworIyBDT05GSUdfRE9OR0xFIGlzIG5vdCBzZXQKKworIworIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfSVJQT1JUX1NJUj1tCisKKyMKKyMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAorIworIyBDT05GSUdfRE9OR0xFX09MRCBpcyBub3Qgc2V0CisKKyMKKyMgRklSIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19OU0NfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTkJPTkRfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQ19JUkNDX0ZJUiBpcyBub3Qgc2V0CisjIENPTkZJR19BTElfRklSIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfRklSPW0KK0NPTkZJR19CVD1tCitDT05GSUdfQlRfTDJDQVA9bQorQ09ORklHX0JUX1NDTz1tCitDT05GSUdfQlRfUkZDT01NPW0KK0NPTkZJR19CVF9SRkNPTU1fVFRZPXkKK0NPTkZJR19CVF9CTkVQPW0KK0NPTkZJR19CVF9CTkVQX01DX0ZJTFRFUj15CitDT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVI9eQorIyBDT05GSUdfQlRfSElEUCBpcyBub3Qgc2V0CisKKyMKKyMgQmx1ZXRvb3RoIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19CVF9IQ0lVQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSURUTDEgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQlQzQyBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCTFVFQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCVFVBUlQgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJVkhDSSBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST1tCisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfQUMzMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUklDT1QgaXMgbm90IHNldAorIyBDT05GSUdfQ1M4OXgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCitDT05GSUdfTkVUX1JBRElPPXkKKworIworIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQorIworIyBDT05GSUdfU1RSSVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJMQU4gaXMgbm90IHNldAorIyBDT05GSUdfV0FWRUxBTiBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1dBVkVMQU49bQorIyBDT05GSUdfUENNQ0lBX05FVFdBVkUgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIDgwMi4xMSBGcmVxdWVuY3kgSG9wcGluZyBjYXJkcyBzdXBwb3J0CisjCisjIENPTkZJR19QQ01DSUFfUkFZQ1MgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0CisjCisjIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIDgwMi4xMWIgUGNtY2lhL0NhcmRidXMgY2FyZHMgc3VwcG9ydAorIworIyBDT05GSUdfQUlST19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfV0wzNTAxIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfV0lSRUxFU1M9eQorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUX1BDTUNJQT15CitDT05GSUdfUENNQ0lBXzNDNTg5PW0KK0NPTkZJR19QQ01DSUFfM0M1NzQ9bQorIyBDT05GSUdfUENNQ0lBX0ZNVkoxOFggaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9QQ05FVD1tCisjIENPTkZJR19QQ01DSUFfTk1DTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfU01DOTFDOTI9bQorQ09ORklHX1BDTUNJQV9YSVJDMlBTPW0KKyMgQ09ORklHX1BDTUNJQV9BWE5FVCBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CitDT05GSUdfUFBQPW0KK0NPTkZJR19QUFBfTVVMVElMSU5LPXkKK0NPTkZJR19QUFBfRklMVEVSPXkKK0NPTkZJR19QUFBfQVNZTkM9bQorQ09ORklHX1BQUF9TWU5DX1RUWT1tCitDT05GSUdfUFBQX0RFRkxBVEU9bQorQ09ORklHX1BQUF9CU0RDT01QPW0KK0NPTkZJR19QUFBPRT1tCisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9ODAwCitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NjAwCisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RTREVWPXkKK0NPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWD04MDAKK0NPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWT02MDAKK0NPTkZJR19JTlBVVF9FVkRFVj1tCitDT05GSUdfSU5QVVRfRVZCVUc9eQorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz1tCitDT05GSUdfU0VSSU9fU0VSUE9SVD1tCisjIENPTkZJR19TRVJJT19MSUJQUzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQTExMDA9eQorQ09ORklHX1NFUklBTF9TQTExMDBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CisjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU09GVF9DVVJTT1IgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCitDT05GSUdfTE9HTz15CitDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKK0NPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz1tCisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPW0KK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD1tCisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9bQorQ09ORklHX1JFSVNFUkZTX0ZTPW0KKyMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19SRUlTRVJGU19QUk9DX0lORk89eQorIyBDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz1tCitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX0RFVkZTX0ZTPXkKK0NPTkZJR19ERVZGU19NT1VOVD15CisjIENPTkZJR19ERVZGU19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGU19GUz1tCitDT05GSUdfSkZGU19GU19WRVJCT1NFPTAKKyMgQ09ORklHX0pGRlNfUFJPQ19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPW0KKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPT1RfTkZTIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CitDT05GSUdfU01CX0ZTPW0KKyMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xNT15CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3NtZGsyNDEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc21kazI0MTBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjA4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL3NtZGsyNDEwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDczNiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKKyMgU3VuIE1hciAyNyAyMjo0Mjo0MCAyMDA1CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TM0MyNDEwPXkKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBTM0MyNFhYIEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfQVJDSF9CQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDE5NDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9OMzAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU01ESzI0MTA9eQorIyBDT05GSUdfQVJDSF9TM0MyNDQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfVlIxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfUlgzNzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfT1RPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX05FWENPREVSXzI0NDAgaXMgbm90IHNldAorQ09ORklHX0NQVV9TM0MyNDEwPXkKKworIworIyBTM0MyNDEwIEJvb3QKKyMKKworIworIyBTM0MyNDEwIFNldHVwCisjCisjIENPTkZJR19TM0MyNDEwX0RNQSBpcyBub3Qgc2V0CitDT05GSUdfUzNDMjQxMF9MT1dMRVZFTF9VQVJUX1BPUlQ9MAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9InJvb3Q9MWYwNCBtZW09MzJNIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QQVJUSVRJT05TIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfUzNDMjQxMD15CitDT05GSUdfU0VSSUFMX1MzQzI0MTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfUzNDMjQxMF9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorQ09ORklHX0ZCX1ZJUlRVQUw9eQorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQorCisjCisjIExvZ28gY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorQ09ORklHX1JPTUZTX0ZTPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTVNET1NfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1MzQzI0MTBfUE9SVD15CitDT05GSUdfREVCVUdfUzNDMjQxMF9VQVJUPTAKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKK0NPTkZJR19MSUJDUkMzMkM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy92ZXJzYXRpbGVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy92ZXJzYXRpbGVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MmYyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL3ZlcnNhdGlsZV9kZWZjb25maWcKQEAgLTAsMCArMSw5MDIgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCisjIE1vbiBNYXIgMjggMDA6MjA6NTAgMjAwNQorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1ZFUlNBVElMRT15CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKworIworIyBWZXJzYXRpbGUgcGxhdGZvcm0gdHlwZQorIworQ09ORklHX0FSQ0hfVkVSU0FUSUxFX1BCPXkKKyMgQ09ORklHX01BQ0hfVkVSU0FUSUxFX0FCIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX0FSTTkyNlQ9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUSj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTiBpcyBub3Qgc2V0CitDT05GSUdfSUNTVDMwNz15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19BUk1fQU1CQT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJyb290PTFmMDMgbWVtPTMyTSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorIyBDT05GSUdfVkZQIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9OT1NXQVA9eQorIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9HRU9NRVRSWSBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SPXkKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19TTUM5MVg9eQorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fQU1CQUtNST15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPW0KK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CisjIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQ9eQorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX0FNQkFfUEwwMTAgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9BTUJBX1BMMDExPXkKK0NPTkZJR19TRVJJQUxfQU1CQV9QTDAxMV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTE2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9bQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfU0VOU09SPW0KKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfU0VOU09SU19FRVBST009bQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CitDT05GSUdfRkJfU09GVF9DVVJTT1I9eQorIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CitDT05GSUdfRkJfQVJNQ0xDRD15CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CisjIENPTkZJR19GT05UXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfUEVBUkxfOHg4IGlzIG5vdCBzZXQKK0NPTkZJR19GT05UX0FDT1JOXzh4OD15CisjIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKK0NPTkZJR19TTkQ9bQorQ09ORklHX1NORF9USU1FUj1tCitDT05GSUdfU05EX1BDTT1tCisjIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz1tCitDT05GSUdfU05EX1BDTV9PU1M9bQorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBkZXZpY2VzCisjCisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorCisjCisjIEFMU0EgQVJNIGRldmljZXMKKyMKKworIworIyBPcGVuIFNvdW5kIFN5c3RlbQorIworIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01NQ19CTE9DSz15CitDT05GSUdfTU1DX0FSTU1NQ0k9bQorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorQ09ORklHX01JTklYX0ZTPXkKK0NPTkZJR19ST01GU19GUz15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKKyMgQ09ORklHX0pGRlMyX0ZTX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz1tCitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9bQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRVJST1JTPXkKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhNTZmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQpAQCAtMCwwICsxLDM4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCitBRkxBR1NfaGVhZC5vIDo9IC1EVEVYVEFERFI9JChURVhUQUREUikgLUREQVRBQUREUj0kKERBVEFBRERSKQorCisjIE9iamVjdCBmaWxlIGxpc3RzLgorCitvYmoteQkJOj0gYXJjaC5vIGNvbXBhdC5vIGRtYS5vIGVudHJ5LWFybXYubyBlbnRyeS1jb21tb24ubyBpcnEubyAgIFwKKwkJICAgcHJvY2Vzcy5vIHB0cmFjZS5vIHNlbWFwaG9yZS5vIHNldHVwLm8gc2lnbmFsLm8gc3lzX2FybS5vIFwKKwkJICAgdGltZS5vIHRyYXBzLm8KKworb2JqLSQoQ09ORklHX0FQTSkJCSs9IGFwbS5vCitvYmotJChDT05GSUdfQVJDSF9BQ09STikJKz0gZWNhcmQubyAKK29iai0kKENPTkZJR19GT09UQlJJREdFKQkrPSBpc2Eubworb2JqLSQoQ09ORklHX0ZJUSkJCSs9IGZpcS5vCitvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IGFybWtzeW1zLm8gbW9kdWxlLm8KK29iai0kKENPTkZJR19BUlRIVVIpCQkrPSBhcnRodXIubworb2JqLSQoQ09ORklHX0lTQV9ETUEpCQkrPSBkbWEtaXNhLm8KK29iai0kKENPTkZJR19QQ0kpCQkrPSBiaW9zMzIubworb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCisKK29iai0kKENPTkZJR19JV01NWFQpCQkrPSBpd21teHQubworQUZMQUdTX2l3bW14dC5vCQkJOj0gLVdhLC1tY3B1PWl3bW14dAorCitpZm5lcSAoJChDT05GSUdfQVJDSF9FQlNBMTEwKSx5KQorICBvYmoteQkJKz0gaW8ubworZW5kaWYKKworaGVhZC15CQkJOj0gaGVhZC5vCitvYmotJChDT05GSUdfREVCVUdfTEwpCSs9IGRlYnVnLm8KKworZXh0cmEteSA6PSAkKGhlYWQteSkgaW5pdF90YXNrLm8gdm1saW51eC5sZHMKKworIyBTcGVsbCBvdXQgc29tZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmVuJ3QgYXV0b21hdGljYWxseSBmaWd1cmVkIG91dAorJChvYmopL2VudHJ5LWFybXYubzogCSQob2JqKS9lbnRyeS1oZWFkZXIuUyBpbmNsdWRlL2FzbS1hcm0vY29uc3RhbnRzLmgKKyQob2JqKS9lbnRyeS1jb21tb24ubzogCSQob2JqKS9lbnRyeS1oZWFkZXIuUyBpbmNsdWRlL2FzbS1hcm0vY29uc3RhbnRzLmggXAorCQkJJChvYmopL2NhbGxzLlMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9hcG0uYyBiL2FyY2gvYXJtL2tlcm5lbC9hcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGJiZDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2FwbS5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogYmlvcy1sZXNzIEFQTSBkcml2ZXIgZm9yIEFSTSBMaW51eCAKKyAqICBKYW1leSBIaWNrcyA8amFtZXlAY3JsLmRlYy5jb20+CisgKiAgYWRhcHRlZCBmcm9tIHRoZSBBUE0gQklPUyBkcml2ZXIgZm9yIExpbnV4IGJ5IFN0ZXBoZW4gUm90aHdlbGwgKHNmckBsaW51eGNhcmUuY29tKQorICoKKyAqIEFQTSAxLjIgUmVmZXJlbmNlOgorICogICBJbnRlbCBDb3Jwb3JhdGlvbiwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50CisgKiAgIChBUE0pIEJJT1MgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24sIFJldmlzaW9uIDEuMiwgRmVicnVhcnkgMTk5Ni4KKyAqCisgKiBbVGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgZnJvbSBNaWNyb3NvZnQgYXQ6CisgKiAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaHdkZXYvYnVzYmlvcy9hbXBfMTIuaHRtXQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisKKyNpbmNsdWRlIDxhc20vYXBtLmg+IC8qIGFwbV9wb3dlcl9pbmZvICovCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICogVGhlIGFwbV9iaW9zIGRldmljZSBpcyBvbmUgb2YgdGhlIG1pc2MgY2hhciBkZXZpY2VzLgorICogVGhpcyBpcyBpdHMgbWlub3IgbnVtYmVyLgorICovCisjZGVmaW5lIEFQTV9NSU5PUl9ERVYJMTM0CisKKy8qCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9Db25maWcuaGVscCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqCisgKiBWYXJpb3VzIG9wdGlvbnMgY2FuIGJlIGNoYW5nZWQgYXQgYm9vdCB0aW1lIGFzIGZvbGxvd3M6CisgKiAoV2UgYWxsb3cgdW5kZXJzY29yZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbW9kdWxlcyBjb2RlKQorICoJYXBtPW9uL29mZgkJCWVuYWJsZS9kaXNhYmxlIEFQTQorICovCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBldmVudHMgc3RvcmVkCisgKi8KKyNkZWZpbmUgQVBNX01BWF9FVkVOVFMJCTE2CisKK3N0cnVjdCBhcG1fcXVldWUgeworCXVuc2lnbmVkIGludAkJZXZlbnRfaGVhZDsKKwl1bnNpZ25lZCBpbnQJCWV2ZW50X3RhaWw7CisJYXBtX2V2ZW50X3QJCWV2ZW50c1tBUE1fTUFYX0VWRU5UU107Cit9OworCisvKgorICogVGhlIHBlci1maWxlIEFQTSBkYXRhCisgKi8KK3N0cnVjdCBhcG1fdXNlciB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCisJdW5zaWduZWQgaW50CQlzdXNlcjogMTsKKwl1bnNpZ25lZCBpbnQJCXdyaXRlcjogMTsKKwl1bnNpZ25lZCBpbnQJCXJlYWRlcjogMTsKKworCWludAkJCXN1c3BlbmRfcmVzdWx0OworCXVuc2lnbmVkIGludAkJc3VzcGVuZF9zdGF0ZTsKKyNkZWZpbmUgU1VTUEVORF9OT05FCTAJCS8qIG5vIHN1c3BlbmQgcGVuZGluZyAqLworI2RlZmluZSBTVVNQRU5EX1BFTkRJTkcJMQkJLyogc3VzcGVuZCBwZW5kaW5nIHJlYWQgKi8KKyNkZWZpbmUgU1VTUEVORF9SRUFECTIJCS8qIHN1c3BlbmQgcmVhZCwgcGVuZGluZyBhY2sgKi8KKyNkZWZpbmUgU1VTUEVORF9BQ0tFRAkzCQkvKiBzdXNwZW5kIGFja2VkICovCisjZGVmaW5lIFNVU1BFTkRfRE9ORQk0CQkvKiBzdXNwZW5kIGNvbXBsZXRlZCAqLworCisJc3RydWN0IGFwbV9xdWV1ZQlxdWV1ZTsKK307CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXMKKyAqLworc3RhdGljIGludCBzdXNwZW5kc19wZW5kaW5nOworc3RhdGljIGludCBhcG1fZGlzYWJsZWQ7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fd2FpdHF1ZXVlKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fc3VzcGVuZF93YWl0cXVldWUpOworCisvKgorICogVGhpcyBpcyBhIGxpc3Qgb2YgZXZlcnlvbmUgd2hvIGhhcyBvcGVuZWQgL2Rldi9hcG1fYmlvcworICovCitzdGF0aWMgREVDTEFSRV9SV1NFTSh1c2VyX2xpc3RfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGFwbV91c2VyX2xpc3QpOworCisvKgorICoga2FwbWQgaW5mby4gIGthcG1kIHByb3ZpZGVzIHVzIGEgcHJvY2VzcyBjb250ZXh0IHRvIGhhbmRsZQorICogIkFQTSIgZXZlbnRzIHdpdGhpbiAtIHNwZWNpZmljYWxseSBuZWNlc3NhcnkgaWYgd2UncmUgZ29pbmcKKyAqIHRvIGJlIHN1c3BlbmRpbmcgdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGthcG1kX3dhaXQpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYXBtZF9leGl0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2FwbWRfcXVldWVfbG9jayk7CitzdGF0aWMgc3RydWN0IGFwbV9xdWV1ZSBrYXBtZF9xdWV1ZTsKKworCitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfdmVyc2lvbltdID0gIjEuMTMiOwkvKiBubyBzcGFjZXMgKi8KKworCisKKy8qCisgKiBDb21wYXRpYmlsaXR5IGNydWZ0IHVudGlsIHRoZSBJUEFRIHBlb3BsZSBtb3ZlIG92ZXIgdG8gdGhlIG5ldworICogaW50ZXJmYWNlLgorICovCitzdGF0aWMgdm9pZCBfX2FwbV9nZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBhcG1fcG93ZXJfaW5mbyAqaW5mbykKK3sKK30KKworLyoKKyAqIFRoaXMgYWxsb3dzIG1hY2hpbmVzIHRvIHByb3ZpZGUgdGhlaXIgb3duICJhcG0gZ2V0IHBvd2VyIHN0YXR1cyIgZnVuY3Rpb24uCisgKi8KK3ZvaWQgKCphcG1fZ2V0X3Bvd2VyX3N0YXR1cykoc3RydWN0IGFwbV9wb3dlcl9pbmZvICopID0gX19hcG1fZ2V0X3Bvd2VyX3N0YXR1czsKK0VYUE9SVF9TWU1CT0woYXBtX2dldF9wb3dlcl9zdGF0dXMpOworCisKKy8qCisgKiBBUE0gZXZlbnQgcXVldWUgbWFuYWdlbWVudC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcXVldWVfZW1wdHkoc3RydWN0IGFwbV9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+ZXZlbnRfaGVhZCA9PSBxLT5ldmVudF90YWlsOworfQorCitzdGF0aWMgaW5saW5lIGFwbV9ldmVudF90IHF1ZXVlX2dldF9ldmVudChzdHJ1Y3QgYXBtX3F1ZXVlICpxKQoreworCXEtPmV2ZW50X3RhaWwgPSAocS0+ZXZlbnRfdGFpbCArIDEpICUgQVBNX01BWF9FVkVOVFM7CisJcmV0dXJuIHEtPmV2ZW50c1txLT5ldmVudF90YWlsXTsKK30KKworc3RhdGljIHZvaWQgcXVldWVfYWRkX2V2ZW50KHN0cnVjdCBhcG1fcXVldWUgKnEsIGFwbV9ldmVudF90IGV2ZW50KQoreworCXEtPmV2ZW50X2hlYWQgPSAocS0+ZXZlbnRfaGVhZCArIDEpICUgQVBNX01BWF9FVkVOVFM7CisJaWYgKHEtPmV2ZW50X2hlYWQgPT0gcS0+ZXZlbnRfdGFpbCkgeworCQlzdGF0aWMgaW50IG5vdGlmaWVkOworCisJCWlmIChub3RpZmllZCsrID09IDApCisJCSAgICBwcmludGsoS0VSTl9FUlIgImFwbTogYW4gZXZlbnQgcXVldWUgb3ZlcmZsb3dlZFxuIik7CisJCXEtPmV2ZW50X3RhaWwgPSAocS0+ZXZlbnRfdGFpbCArIDEpICUgQVBNX01BWF9FVkVOVFM7CisJfQorCXEtPmV2ZW50c1txLT5ldmVudF9oZWFkXSA9IGV2ZW50OworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9ldmVudF9vbmVfdXNlcihzdHJ1Y3QgYXBtX3VzZXIgKmFzLCBhcG1fZXZlbnRfdCBldmVudCkKK3sKKwlpZiAoYXMtPnN1c2VyICYmIGFzLT53cml0ZXIpIHsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEFQTV9TWVNfU1VTUEVORDoKKwkJY2FzZSBBUE1fVVNFUl9TVVNQRU5EOgorCQkJLyoKKwkJCSAqIElmIHRoaXMgdXNlciBhbHJlYWR5IGhhcyBhIHN1c3BlbmQgcGVuZGluZywKKwkJCSAqIGRvbid0IHF1ZXVlIGFub3RoZXIgb25lLgorCQkJICovCisJCQlpZiAoYXMtPnN1c3BlbmRfc3RhdGUgIT0gU1VTUEVORF9OT05FKQorCQkJCXJldHVybjsKKworCQkJYXMtPnN1c3BlbmRfc3RhdGUgPSBTVVNQRU5EX1BFTkRJTkc7CisJCQlzdXNwZW5kc19wZW5kaW5nKys7CisJCQlicmVhazsKKwkJfQorCX0KKwlxdWV1ZV9hZGRfZXZlbnQoJmFzLT5xdWV1ZSwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9ldmVudChhcG1fZXZlbnRfdCBldmVudCwgc3RydWN0IGFwbV91c2VyICpzZW5kZXIpCit7CisJc3RydWN0IGFwbV91c2VyICphczsKKworCWRvd25fcmVhZCgmdXNlcl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYXMsICZhcG1fdXNlcl9saXN0LCBsaXN0KSB7CisJCWlmIChhcyAhPSBzZW5kZXIgJiYgYXMtPnJlYWRlcikKKwkJCXF1ZXVlX2V2ZW50X29uZV91c2VyKGFzLCBldmVudCk7CisJfQorCXVwX3JlYWQoJnVzZXJfbGlzdF9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFwbV93YWl0cXVldWUpOworfQorCitzdGF0aWMgdm9pZCBhcG1fc3VzcGVuZCh2b2lkKQoreworCXN0cnVjdCBhcG1fdXNlciAqYXM7CisJaW50IGVyciA9IHBtX3N1c3BlbmQoUE1fU1VTUEVORF9NRU0pOworCisJLyoKKwkgKiBBbnlvbmUgb24gdGhlIEFQTSBxdWV1ZXMgd2lsbCB0aGluayB3ZSdyZSBzdGlsbCBzdXNwZW5kZWQuCisJICogU2VuZCBhIG1lc3NhZ2Ugc28gZXZlcnlvbmUga25vd3Mgd2UncmUgbm93IGF3YWtlIGFnYWluLgorCSAqLworCXF1ZXVlX2V2ZW50KEFQTV9OT1JNQUxfUkVTVU1FLCBOVUxMKTsKKworCS8qCisJICogRmluYWxseSwgd2FrZSB1cCBhbnlvbmUgd2hvIGlzIHNsZWVwaW5nIG9uIHRoZSBzdXNwZW5kLgorCSAqLworCWRvd25fcmVhZCgmdXNlcl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYXMsICZhcG1fdXNlcl9saXN0LCBsaXN0KSB7CisJCWFzLT5zdXNwZW5kX3Jlc3VsdCA9IGVycjsKKwkJYXMtPnN1c3BlbmRfc3RhdGUgPSBTVVNQRU5EX0RPTkU7CisJfQorCXVwX3JlYWQoJnVzZXJfbGlzdF9sb2NrKTsKKworCXdha2VfdXAoJmFwbV9zdXNwZW5kX3dhaXRxdWV1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFwbV9yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGFwbV91c2VyICphcyA9IGZwLT5wcml2YXRlX2RhdGE7CisJYXBtX2V2ZW50X3QgZXZlbnQ7CisJaW50IGkgPSBjb3VudCwgcmV0ID0gMDsKKworCWlmIChjb3VudCA8IHNpemVvZihhcG1fZXZlbnRfdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHF1ZXVlX2VtcHR5KCZhcy0+cXVldWUpICYmIGZwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJcmV0dXJuIC1FQUdBSU47CisKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3dhaXRxdWV1ZSwgIXF1ZXVlX2VtcHR5KCZhcy0+cXVldWUpKTsKKworCXdoaWxlICgoaSA+PSBzaXplb2YoZXZlbnQpKSAmJiAhcXVldWVfZW1wdHkoJmFzLT5xdWV1ZSkpIHsKKwkJZXZlbnQgPSBxdWV1ZV9nZXRfZXZlbnQoJmFzLT5xdWV1ZSk7CisKKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZldmVudCwgc2l6ZW9mKGV2ZW50KSkpCisJCQlicmVhazsKKworCQlpZiAoZXZlbnQgPT0gQVBNX1NZU19TVVNQRU5EIHx8IGV2ZW50ID09IEFQTV9VU0VSX1NVU1BFTkQpCisJCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfUkVBRDsKKworCQlidWYgKz0gc2l6ZW9mKGV2ZW50KTsKKwkJaSAtPSBzaXplb2YoZXZlbnQpOworCX0KKworCWlmIChpIDwgY291bnQpCisJCXJldCA9IGNvdW50IC0gaTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXBtX3BvbGwoc3RydWN0IGZpbGUgKmZwLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKmFzID0gZnAtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmcCwgJmFwbV93YWl0cXVldWUsIHdhaXQpOworCXJldHVybiBxdWV1ZV9lbXB0eSgmYXMtPnF1ZXVlKSA/IDAgOiBQT0xMSU4gfCBQT0xMUkROT1JNOworfQorCisvKgorICogYXBtX2lvY3RsIC0gaGFuZGxlIEFQTSBpb2N0bAorICoKKyAqIEFQTV9JT0NfU1VTUEVORAorICogICBUaGlzIElPQ1RMIGlzIG92ZXJsb2FkZWQsIGFuZCBwZXJmb3JtcyB0d28gZnVuY3Rpb25zLiAgSXQgaXMgdXNlZCB0bzoKKyAqICAgICAtIGluaXRpYXRlIGEgc3VzcGVuZAorICogICAgIC0gYWNrbm93bGVkZ2UgYSBzdXNwZW5kIHJlYWQgZnJvbSAvZGV2L2FwbV9iaW9zLgorICogICBPbmx5IHdoZW4gZXZlcnlvbmUgd2hvIGhhcyBvcGVuZWQgL2Rldi9hcG1fYmlvcyB3aXRoIHdyaXRlIHBlcm1pc3Npb24KKyAqICAgaGFzIGFja25vd2xlZGdlIGRvZXMgdGhlIGFjdHVhbCBzdXNwZW5kIGhhcHBlbi4KKyAqLworc3RhdGljIGludAorYXBtX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCXN0cnVjdCBhcG1fdXNlciAqYXMgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmICghYXMtPnN1c2VyIHx8ICFhcy0+d3JpdGVyKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFQTV9JT0NfU1VTUEVORDoKKwkJYXMtPnN1c3BlbmRfcmVzdWx0ID0gLUVJTlRSOworCisJCWlmIChhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX1JFQUQpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSByZWFkIGEgc3VzcGVuZCBjb21tYW5kIGZyb20gL2Rldi9hcG1fYmlvcywKKwkJCSAqIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgQVBNX0lPQ19TVVNQRU5EIGlvY3RsIGlzCisJCQkgKiBpbnRlcnByZXRlZCBhcyBhbiBhY2tub3dsZWRnZS4KKwkJCSAqLworCQkJYXMtPnN1c3BlbmRfc3RhdGUgPSBTVVNQRU5EX0FDS0VEOworCQkJc3VzcGVuZHNfcGVuZGluZy0tOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE90aGVyd2lzZSBpdCBpcyBhIHJlcXVlc3QgdG8gc3VzcGVuZCB0aGUgc3lzdGVtLgorCQkJICogUXVldWUgYW4gZXZlbnQgZm9yIGFsbCByZWFkZXJzLCBhbmQgZXhwZWN0IGFuCisJCQkgKiBhY2tub3dsZWRnZSBmcm9tIGFsbCB3cml0ZXJzIHdobyBoYXZlbid0IGFscmVhZHkKKwkJCSAqIGFja25vd2xlZGdlZC4KKwkJCSAqLworCQkJcXVldWVfZXZlbnQoQVBNX1VTRVJfU1VTUEVORCwgYXMpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgYWNrbm93bGVkZ2VzIHJlcXVpcmVkLCBzdXNwZW5kCisJCSAqIHRoZSBzeXN0ZW0uCisJCSAqLworCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA9PSAwKQorCQkJYXBtX3N1c3BlbmQoKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgc3VzcGVuZC9yZXN1bWUgdG8gY29tcGxldGUuICBJZiB0aGVyZSBhcmUKKwkJICogcGVuZGluZyBhY2tub3dsZWRnZXMsIHdlIHdhaXQgaGVyZSBmb3IgdGhlbS4KKwkJICoKKwkJICogTm90ZSB0aGF0IHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIFBNIHN1YnN5c3RlbSBkb2VzCisJCSAqIG5vdCBraWNrIHVzIG91dCBvZiB0aGUgd2FpdCB3aGVuIGl0IHN1c3BlbmRzIHRoZSB0aHJlYWRzLgorCQkgKi8KKwkJZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKKwkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwkJLyoKKwkJICogTm90ZTogZG8gbm90IGFsbG93IGEgdGhyZWFkIHdoaWNoIGlzIGFja2luZyB0aGUgc3VzcGVuZAorCQkgKiB0byBlc2NhcGUgdW50aWwgdGhlIHJlc3VtZSBpcyBjb21wbGV0ZS4KKwkJICovCisJCWlmIChhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0FDS0VEKQorCQkJd2FpdF9ldmVudChhcG1fc3VzcGVuZF93YWl0cXVldWUsCisJCQkJCSBhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0RPTkUpOworCQllbHNlCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAorCQkJCQkgYXMtPnN1c3BlbmRfc3RhdGUgPT0gU1VTUEVORF9ET05FKTsKKworCQljdXJyZW50LT5mbGFncyA9IGZsYWdzOworCQllcnIgPSBhcy0+c3VzcGVuZF9yZXN1bHQ7CisJCWFzLT5zdXNwZW5kX3N0YXRlID0gU1VTUEVORF9OT05FOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFwbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGFwbV91c2VyICphcyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJZG93bl93cml0ZSgmdXNlcl9saXN0X2xvY2spOworCWxpc3RfZGVsKCZhcy0+bGlzdCk7CisJdXBfd3JpdGUoJnVzZXJfbGlzdF9sb2NrKTsKKworCS8qCisJICogV2UgYXJlIG5vdyB1bmhvb2tlZCBmcm9tIHRoZSBjaGFpbi4gIEFzIGZhciBhcyBuZXcKKwkgKiBldmVudHMgYXJlIGNvbmNlcm5lZCwgd2Ugbm8gbG9uZ2VyIGV4aXN0LiAgSG93ZXZlciwgd2UKKwkgKiBuZWVkIHRvIGJhbGFuY2Ugc3VzcGVuZHNfcGVuZGluZywgd2hpY2ggbWVhbnMgdGhlCisJICogcG9zc2liaWxpdHkgb2Ygc2xlZXBpbmcuCisJICovCisJaWYgKGFzLT5zdXNwZW5kX3N0YXRlICE9IFNVU1BFTkRfTk9ORSkgeworCQlzdXNwZW5kc19wZW5kaW5nIC09IDE7CisJCWlmIChzdXNwZW5kc19wZW5kaW5nID09IDApCisJCQlhcG1fc3VzcGVuZCgpOworCX0KKworCWtmcmVlKGFzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcG1fb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBhcG1fdXNlciAqYXM7CisKKwlhcyA9IChzdHJ1Y3QgYXBtX3VzZXIgKilrbWFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYXMpIHsKKwkJbWVtc2V0KGFzLCAwLCBzaXplb2YoKmFzKSk7CisKKwkJLyoKKwkJICogWFhYIC0gdGhpcyBpcyBhIHRpbnkgYml0IGJyb2tlbiwgd2hlbiB3ZSBjb25zaWRlciBCU0QKKwkJICogcHJvY2VzcyBhY2NvdW50aW5nLiBJZiB0aGUgZGV2aWNlIGlzIG9wZW5lZCBieSByb290LCB3ZQorCQkgKiBpbnN0YW50bHkgZmxhZyB0aGF0IHdlIHVzZWQgc3VwZXJ1c2VyIHByaXZzLiBXaG8ga25vd3MsCisJCSAqIHdlIG1pZ2h0IGNsb3NlIHRoZSBkZXZpY2UgaW1tZWRpYXRlbHkgd2l0aG91dCBkb2luZyBhCisJCSAqIHByaXZpbGVnZWQgb3BlcmF0aW9uIC0tIGNldmFucworCQkgKi8KKwkJYXMtPnN1c2VyID0gY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKKwkJYXMtPndyaXRlciA9IChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPT0gRk1PREVfV1JJVEU7CisJCWFzLT5yZWFkZXIgPSAoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPT0gRk1PREVfUkVBRDsKKworCQlkb3duX3dyaXRlKCZ1c2VyX2xpc3RfbG9jayk7CisJCWxpc3RfYWRkKCZhcy0+bGlzdCwgJmFwbV91c2VyX2xpc3QpOworCQl1cF93cml0ZSgmdXNlcl9saXN0X2xvY2spOworCisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IGFzOworCX0KKworCXJldHVybiBhcyA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhcG1fYmlvc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBhcG1fcmVhZCwKKwkucG9sbAkJPSBhcG1fcG9sbCwKKwkuaW9jdGwJCT0gYXBtX2lvY3RsLAorCS5vcGVuCQk9IGFwbV9vcGVuLAorCS5yZWxlYXNlCT0gYXBtX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXBtX2RldmljZSA9IHsKKwkubWlub3IJCT0gQVBNX01JTk9SX0RFViwKKwkubmFtZQkJPSAiYXBtX2Jpb3MiLAorCS5mb3BzCQk9ICZhcG1fYmlvc19mb3BzCit9OworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyoKKyAqIEFyZ3VtZW50cywgd2l0aCBzeW1ib2xzIGZyb20gbGludXgvYXBtX2Jpb3MuaC4KKyAqCisgKiAgIDApIExpbnV4IGRyaXZlciB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQorICogICAxKSBBUE0gQklPUyBWZXJzaW9uLiAgVXN1YWxseSAxLjAsIDEuMSBvciAxLjIuCisgKiAgIDIpIEFQTSBmbGFncyBmcm9tIEFQTSBJbnN0YWxsYXRpb24gQ2hlY2sgKDB4MDApOgorICoJYml0IDA6IEFQTV8xNl9CSVRfU1VQUE9SVAorICoJYml0IDE6IEFQTV8zMl9CSVRfU1VQUE9SVAorICoJYml0IDI6IEFQTV9JRExFX1NMT1dTX0NMT0NLCisgKgliaXQgMzogQVBNX0JJT1NfRElTQUJMRUQKKyAqCWJpdCA0OiBBUE1fQklPU19ESVNFTkdBR0VECisgKiAgIDMpIEFDIGxpbmUgc3RhdHVzCisgKgkweDAwOiBPZmYtbGluZQorICoJMHgwMTogT24tbGluZQorICoJMHgwMjogT24gYmFja3VwIHBvd2VyIChCSU9TID49IDEuMSBvbmx5KQorICoJMHhmZjogVW5rbm93bgorICogICA0KSBCYXR0ZXJ5IHN0YXR1cworICoJMHgwMDogSGlnaAorICoJMHgwMTogTG93CisgKgkweDAyOiBDcml0aWNhbAorICoJMHgwMzogQ2hhcmdpbmcKKyAqCTB4MDQ6IFNlbGVjdGVkIGJhdHRlcnkgbm90IHByZXNlbnQgKEJJT1MgPj0gMS4yIG9ubHkpCisgKgkweGZmOiBVbmtub3duCisgKiAgIDUpIEJhdHRlcnkgZmxhZworICoJYml0IDA6IEhpZ2gKKyAqCWJpdCAxOiBMb3cKKyAqCWJpdCAyOiBDcml0aWNhbAorICoJYml0IDM6IENoYXJnaW5nCisgKgliaXQgNzogTm8gc3lzdGVtIGJhdHRlcnkKKyAqCTB4ZmY6IFVua25vd24KKyAqICAgNikgUmVtYWluaW5nIGJhdHRlcnkgbGlmZSAocGVyY2VudGFnZSBvZiBjaGFyZ2UpOgorICoJMC0xMDA6IHZhbGlkCisgKgktMTogVW5rbm93bgorICogICA3KSBSZW1haW5pbmcgYmF0dGVyeSBsaWZlICh0aW1lIHVuaXRzKToKKyAqCU51bWJlciBvZiByZW1haW5pbmcgbWludXRlcyBvciBzZWNvbmRzCisgKgktMTogVW5rbm93bgorICogICA4KSBtaW4gPSBtaW51dGVzOyBzZWMgPSBzZWNvbmRzCisgKi8KK3N0YXRpYyBpbnQgYXBtX2dldF9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBhcG1fcG93ZXJfaW5mbyBpbmZvOworCWNoYXIgKnVuaXRzOworCWludCByZXQ7CisKKwlpbmZvLmFjX2xpbmVfc3RhdHVzID0gMHhmZjsKKwlpbmZvLmJhdHRlcnlfc3RhdHVzID0gMHhmZjsKKwlpbmZvLmJhdHRlcnlfZmxhZyAgID0gMHhmZjsKKwlpbmZvLmJhdHRlcnlfbGlmZSAgID0gLTE7CisJaW5mby50aW1lCSAgICA9IC0xOworCWluZm8udW5pdHMJICAgID0gLTE7CisKKwlpZiAoYXBtX2dldF9wb3dlcl9zdGF0dXMpCisJCWFwbV9nZXRfcG93ZXJfc3RhdHVzKCZpbmZvKTsKKworCXN3aXRjaCAoaW5mby51bml0cykgeworCWRlZmF1bHQ6CXVuaXRzID0gIj8iOwlicmVhazsKKwljYXNlIDA6IAl1bml0cyA9ICJtaW4iOwlicmVhazsKKwljYXNlIDE6IAl1bml0cyA9ICJzZWMiOwlicmVhazsKKwl9CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzIDEuMiAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnggJWQlJSAlZCAlc1xuIiwKKwkJICAgICBkcml2ZXJfdmVyc2lvbiwgQVBNXzMyX0JJVF9TVVBQT1JULAorCQkgICAgIGluZm8uYWNfbGluZV9zdGF0dXMsIGluZm8uYmF0dGVyeV9zdGF0dXMsCisJCSAgICAgaW5mby5iYXR0ZXJ5X2ZsYWcsIGluZm8uYmF0dGVyeV9saWZlLAorCQkgICAgIGluZm8udGltZSwgdW5pdHMpOworCisgCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBrYXBtZCh2b2lkICphcmcpCit7CisJZGFlbW9uaXplKCJrYXBtZCIpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCisJZG8geworCQlhcG1fZXZlbnRfdCBldmVudDsKKworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoa2FwbWRfd2FpdCwKKwkJCQkhcXVldWVfZW1wdHkoJmthcG1kX3F1ZXVlKSB8fCAhcG1fYWN0aXZlKTsKKworCQlpZiAoIXBtX2FjdGl2ZSkKKwkJCWJyZWFrOworCisJCXNwaW5fbG9ja19pcnEoJmthcG1kX3F1ZXVlX2xvY2spOworCQlldmVudCA9IDA7CisJCWlmICghcXVldWVfZW1wdHkoJmthcG1kX3F1ZXVlKSkKKwkJCWV2ZW50ID0gcXVldWVfZ2V0X2V2ZW50KCZrYXBtZF9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycSgma2FwbWRfcXVldWVfbG9jayk7CisKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIDA6CisJCQlicmVhazsKKworCQljYXNlIEFQTV9MT1dfQkFUVEVSWToKKwkJY2FzZSBBUE1fUE9XRVJfU1RBVFVTX0NIQU5HRToKKwkJCXF1ZXVlX2V2ZW50KGV2ZW50LCBOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX1VTRVJfU1VTUEVORDoKKwkJY2FzZSBBUE1fU1lTX1NVU1BFTkQ6CisJCQlxdWV1ZV9ldmVudChldmVudCwgTlVMTCk7CisJCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA9PSAwKQorCQkJCWFwbV9zdXNwZW5kKCk7CisJCQlicmVhazsKKworCQljYXNlIEFQTV9DUklUSUNBTF9TVVNQRU5EOgorCQkJYXBtX3N1c3BlbmQoKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwljb21wbGV0ZV9hbmRfZXhpdCgma2FwbWRfZXhpdCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFwbV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmIChhcG1fZGlzYWJsZWQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IGRpc2FibGVkIG9uIHVzZXIgcmVxdWVzdC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoUE1fSVNfQUNUSVZFKCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IG92ZXJyaWRkZW4gYnkgQUNQSS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwbV9hY3RpdmUgPSAxOworCisJcmV0ID0ga2VybmVsX3RocmVhZChrYXBtZCwgTlVMTCwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlwbV9hY3RpdmUgPSAwOworCQlyZXR1cm4gcmV0OworCX0KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiYXBtIiwgMCwgTlVMTCwgYXBtX2dldF9pbmZvKTsKKyNlbmRpZgorCisJcmV0ID0gbWlzY19yZWdpc3RlcigmYXBtX2RldmljZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJhcG0iLCBOVUxMKTsKKworCQlwbV9hY3RpdmUgPSAwOworCQl3YWtlX3VwKCZrYXBtZF93YWl0KTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigma2FwbWRfZXhpdCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFwbV9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZhcG1fZGV2aWNlKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiYXBtIiwgTlVMTCk7CisKKwlwbV9hY3RpdmUgPSAwOworCXdha2VfdXAoJmthcG1kX3dhaXQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthcG1kX2V4aXQpOworfQorCittb2R1bGVfaW5pdChhcG1faW5pdCk7Cittb2R1bGVfZXhpdChhcG1fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gUm90aHdlbGwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgYXBtX3NldHVwKGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoKHN0ciAhPSBOVUxMKSAmJiAoKnN0ciAhPSAnXDAnKSkgeworCQlpZiAoc3RybmNtcChzdHIsICJvZmYiLCAzKSA9PSAwKQorCQkJYXBtX2Rpc2FibGVkID0gMTsKKwkJaWYgKHN0cm5jbXAoc3RyLCAib24iLCAyKSA9PSAwKQorCQkJYXBtX2Rpc2FibGVkID0gMDsKKwkJc3RyID0gc3RyY2hyKHN0ciwgJywnKTsKKwkJaWYgKHN0ciAhPSBOVUxMKQorCQkJc3RyICs9IHN0cnNwbihzdHIsICIsIFx0Iik7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJhcG09IiwgYXBtX3NldHVwKTsKKyNlbmRpZgorCisvKioKKyAqIGFwbV9xdWV1ZV9ldmVudCAtIHF1ZXVlIGFuIEFQTSBldmVudCBmb3Iga2FwbWQKKyAqIEBldmVudDogQVBNIGV2ZW50CisgKgorICogUXVldWUgYW4gQVBNIGV2ZW50IGZvciBrYXBtZCB0byBwcm9jZXNzIGFuZCB1bHRpbWF0ZWx5IHRha2UgdGhlCisgKiBhcHByb3ByaWF0ZSBhY3Rpb24uICBPbmx5IGEgc3Vic2V0IG9mIGV2ZW50cyBhcmUgaGFuZGxlZDoKKyAqICAgJUFQTV9MT1dfQkFUVEVSWQorICogICAlQVBNX1BPV0VSX1NUQVRVU19DSEFOR0UKKyAqICAgJUFQTV9VU0VSX1NVU1BFTkQKKyAqICAgJUFQTV9TWVNfU1VTUEVORAorICogICAlQVBNX0NSSVRJQ0FMX1NVU1BFTkQKKyAqLwordm9pZCBhcG1fcXVldWVfZXZlbnQoYXBtX2V2ZW50X3QgZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrYXBtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CisJcXVldWVfYWRkX2V2ZW50KCZrYXBtZF9xdWV1ZSwgZXZlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmthcG1kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgma2FwbWRfd2FpdCk7Cit9CitFWFBPUlRfU1lNQk9MKGFwbV9xdWV1ZV9ldmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXJjaC5jIGIvYXJjaC9hcm0va2VybmVsL2FyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTAyZmJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2FyY2guYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9hcmNoLmMKKyAqCisgKiAgQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZpeHVwcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCit1bnNpZ25lZCBpbnQgdnJhbV9zaXplOworCisjaWZkZWYgQ09ORklHX0FSQ0hfQUNPUk4KKwordW5zaWduZWQgaW50IG1lbWNfY3RybF9yZWc7Cit1bnNpZ25lZCBpbnQgbnVtYmVyX21mbV9kcml2ZXM7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19hY29ybihjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJbWVtY19jdHJsX3JlZyA9IHRhZy0+dS5hY29ybi5tZW1jX2NvbnRyb2xfcmVnOworCW51bWJlcl9tZm1fZHJpdmVzID0gdGFnLT51LmFjb3JuLmFkZnNkcml2ZXM7CisKKwlzd2l0Y2ggKHRhZy0+dS5hY29ybi52cmFtX3BhZ2VzKSB7CisJY2FzZSA1MTI6CisJCXZyYW1fc2l6ZSArPSBQQUdFX1NJWkUgKiAyNTY7CisJY2FzZSAyNTY6CisJCXZyYW1fc2l6ZSArPSBQQUdFX1NJWkUgKiAyNTY7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2lmIDAKKwlpZiAodnJhbV9zaXplKSB7CisJCWRlc2MtPnZpZGVvX3N0YXJ0ID0gMHgwMjAwMDAwMDsKKwkJZGVzYy0+dmlkZW9fZW5kICAgPSAweDAyMDAwMDAwICsgdnJhbV9zaXplOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfQUNPUk4sIHBhcnNlX3RhZ19hY29ybik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzM4YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisKKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyoKKyAqIGxpYmdjYyBmdW5jdGlvbnMgLSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZQorICogY29tcGlsZXIuLi4gIChwcm90b3R5cGVzIGFyZSBub3QgY29ycmVjdCB0aG91Z2gsIGJ1dCB0aGF0CisgKiBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgc2luY2UgdGhleSdyZSBub3QgdmVyc2lvbmVkKS4KKyAqLworZXh0ZXJuIHZvaWQgX19hc2hsZGkzKHZvaWQpOworZXh0ZXJuIHZvaWQgX19hc2hyZGkzKHZvaWQpOworZXh0ZXJuIHZvaWQgX19kaXZzaTModm9pZCk7CitleHRlcm4gdm9pZCBfX2xzaHJkaTModm9pZCk7CitleHRlcm4gdm9pZCBfX21vZHNpMyh2b2lkKTsKK2V4dGVybiB2b2lkIF9fbXVsZGkzKHZvaWQpOworZXh0ZXJuIHZvaWQgX191Y21wZGkyKHZvaWQpOworZXh0ZXJuIHZvaWQgX191ZGl2ZGkzKHZvaWQpOworZXh0ZXJuIHZvaWQgX191bW9kZGkzKHZvaWQpOworZXh0ZXJuIHZvaWQgX191ZGl2bW9kZGk0KHZvaWQpOworZXh0ZXJuIHZvaWQgX191ZGl2c2kzKHZvaWQpOworZXh0ZXJuIHZvaWQgX191bW9kc2kzKHZvaWQpOworZXh0ZXJuIHZvaWQgX19kb19kaXY2NCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgZnB1bmRlZmluc3RyKHZvaWQpOworZXh0ZXJuIHZvaWQgZnBfZW50ZXIodm9pZCk7CisKKy8qCisgKiBUaGlzIGhhcyBhIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9uOyBpdCBkb2Vzbid0CisgKiBtb2RpZnkgYW55IG9mIHRoZSB1c3VhbCByZWdpc3RlcnMsIGV4Y2VwdCBmb3IgTFIuCisgKi8KKyNkZWZpbmUgRVhQT1JUX1NZTUJPTF9BTElBUyhzeW0sb3JpZykJCVwKKyBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCBfX2tzeW10YWJfIyNzeW0JXAorICBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2tzeW10YWIiKSkpID0JXAorICAgIHsgKHVuc2lnbmVkIGxvbmcpJm9yaWcsICNzeW0gfTsKKworLyoKKyAqIGZsb2F0aW5nIHBvaW50IG1hdGggZW11bGF0b3Igc3VwcG9ydC4KKyAqIFRoZXNlIHN5bWJvbHMgd2lsbCBuZXZlciBjaGFuZ2UgdGhlaXIgY2FsbGluZyBjb252ZW50aW9uLi4uCisgKi8KK0VYUE9SVF9TWU1CT0xfQUxJQVMoa2Vybl9mcF9lbnRlcixmcF9lbnRlcik7CitFWFBPUlRfU1lNQk9MX0FMSUFTKGZwX3ByaW50ayxwcmludGspOworRVhQT1JUX1NZTUJPTF9BTElBUyhmcF9zZW5kX3NpZyxzZW5kX3NpZyk7CisKK0VYUE9SVF9TWU1CT0woX19iYWNrdHJhY2UpOworCisJLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KK0VYUE9SVF9TWU1CT0woX191ZGVsYXkpOworRVhQT1JUX1NZTUJPTChfX2NvbnN0X3VkZWxheSk7CisKKwkvKiBuZXR3b3JraW5nICovCitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOworRVhQT1JUX1NZTUJPTChfX2NzdW1faXB2Nl9tYWdpYyk7CisKKwkvKiBpbyAqLworI2lmbmRlZiBfX3Jhd19yZWFkc2IKK0VYUE9SVF9TWU1CT0woX19yYXdfcmVhZHNiKTsKKyNlbmRpZgorI2lmbmRlZiBfX3Jhd19yZWFkc3cKK0VYUE9SVF9TWU1CT0woX19yYXdfcmVhZHN3KTsKKyNlbmRpZgorI2lmbmRlZiBfX3Jhd19yZWFkc2wKK0VYUE9SVF9TWU1CT0woX19yYXdfcmVhZHNsKTsKKyNlbmRpZgorI2lmbmRlZiBfX3Jhd193cml0ZXNiCitFWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlc2IpOworI2VuZGlmCisjaWZuZGVmIF9fcmF3X3dyaXRlc3cKK0VYUE9SVF9TWU1CT0woX19yYXdfd3JpdGVzdyk7CisjZW5kaWYKKyNpZm5kZWYgX19yYXdfd3JpdGVzbAorRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZXNsKTsKKyNlbmRpZgorCisJLyogc3RyaW5nIC8gbWVtIGZ1bmN0aW9ucyAqLworRVhQT1JUX1NZTUJPTChzdHJjcHkpOworRVhQT1JUX1NZTUJPTChzdHJuY3B5KTsKK0VYUE9SVF9TWU1CT0woc3RyY2F0KTsKK0VYUE9SVF9TWU1CT0woc3RybmNhdCk7CitFWFBPUlRfU1lNQk9MKHN0cmNtcCk7CitFWFBPUlRfU1lNQk9MKHN0cm5jbXApOworRVhQT1JUX1NZTUJPTChzdHJjaHIpOworRVhQT1JUX1NZTUJPTChzdHJsZW4pOworRVhQT1JUX1NZTUJPTChzdHJubGVuKTsKK0VYUE9SVF9TWU1CT0woc3RycGJyayk7CitFWFBPUlRfU1lNQk9MKHN0cnJjaHIpOworRVhQT1JUX1NZTUJPTChzdHJzdHIpOworRVhQT1JUX1NZTUJPTChtZW1zZXQpOworRVhQT1JUX1NZTUJPTChtZW1jcHkpOworRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKK0VYUE9SVF9TWU1CT0wobWVtY21wKTsKK0VYUE9SVF9TWU1CT0wobWVtc2Nhbik7CitFWFBPUlRfU1lNQk9MKG1lbWNocik7CitFWFBPUlRfU1lNQk9MKF9fbWVtemVybyk7CisKKwkvKiB1c2VyIG1lbSAoc2VnbWVudCkgKi8KK0VYUE9SVF9TWU1CT0woX19hcmNoX2NvcHlfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0woX19hcmNoX2NvcHlfdG9fdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fYXJjaF9jbGVhcl91c2VyKTsKK0VYUE9SVF9TWU1CT0woX19hcmNoX3N0cm5sZW5fdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fYXJjaF9zdHJuY3B5X2Zyb21fdXNlcik7CisKK0VYUE9SVF9TWU1CT0woX19nZXRfdXNlcl8xKTsKK0VYUE9SVF9TWU1CT0woX19nZXRfdXNlcl8yKTsKK0VYUE9SVF9TWU1CT0woX19nZXRfdXNlcl80KTsKK0VYUE9SVF9TWU1CT0woX19nZXRfdXNlcl84KTsKKworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzEpOworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzIpOworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzQpOworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzgpOworCisJLyogZ2NjIGxpYiBmdW5jdGlvbnMgKi8KK0VYUE9SVF9TWU1CT0woX19hc2hsZGkzKTsKK0VYUE9SVF9TWU1CT0woX19hc2hyZGkzKTsKK0VYUE9SVF9TWU1CT0woX19kaXZzaTMpOworRVhQT1JUX1NZTUJPTChfX2xzaHJkaTMpOworRVhQT1JUX1NZTUJPTChfX21vZHNpMyk7CitFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKK0VYUE9SVF9TWU1CT0woX191Y21wZGkyKTsKK0VYUE9SVF9TWU1CT0woX191ZGl2ZGkzKTsKK0VYUE9SVF9TWU1CT0woX191bW9kZGkzKTsKK0VYUE9SVF9TWU1CT0woX191ZGl2bW9kZGk0KTsKK0VYUE9SVF9TWU1CT0woX191ZGl2c2kzKTsKK0VYUE9SVF9TWU1CT0woX191bW9kc2kzKTsKK0VYUE9SVF9TWU1CT0woX19kb19kaXY2NCk7CisKKwkvKiBiaXRvcHMgKi8KK0VYUE9SVF9TWU1CT0woX3NldF9iaXRfbGUpOworRVhQT1JUX1NZTUJPTChfdGVzdF9hbmRfc2V0X2JpdF9sZSk7CitFWFBPUlRfU1lNQk9MKF9jbGVhcl9iaXRfbGUpOworRVhQT1JUX1NZTUJPTChfdGVzdF9hbmRfY2xlYXJfYml0X2xlKTsKK0VYUE9SVF9TWU1CT0woX2NoYW5nZV9iaXRfbGUpOworRVhQT1JUX1NZTUJPTChfdGVzdF9hbmRfY2hhbmdlX2JpdF9sZSk7CitFWFBPUlRfU1lNQk9MKF9maW5kX2ZpcnN0X3plcm9fYml0X2xlKTsKK0VYUE9SVF9TWU1CT0woX2ZpbmRfbmV4dF96ZXJvX2JpdF9sZSk7CitFWFBPUlRfU1lNQk9MKF9maW5kX2ZpcnN0X2JpdF9sZSk7CitFWFBPUlRfU1lNQk9MKF9maW5kX25leHRfYml0X2xlKTsKKworI2lmZGVmIF9fQVJNRUJfXworRVhQT1JUX1NZTUJPTChfc2V0X2JpdF9iZSk7CitFWFBPUlRfU1lNQk9MKF90ZXN0X2FuZF9zZXRfYml0X2JlKTsKK0VYUE9SVF9TWU1CT0woX2NsZWFyX2JpdF9iZSk7CitFWFBPUlRfU1lNQk9MKF90ZXN0X2FuZF9jbGVhcl9iaXRfYmUpOworRVhQT1JUX1NZTUJPTChfY2hhbmdlX2JpdF9iZSk7CitFWFBPUlRfU1lNQk9MKF90ZXN0X2FuZF9jaGFuZ2VfYml0X2JlKTsKK0VYUE9SVF9TWU1CT0woX2ZpbmRfZmlyc3RfemVyb19iaXRfYmUpOworRVhQT1JUX1NZTUJPTChfZmluZF9uZXh0X3plcm9fYml0X2JlKTsKK0VYUE9SVF9TWU1CT0woX2ZpbmRfZmlyc3RfYml0X2JlKTsKK0VYUE9SVF9TWU1CT0woX2ZpbmRfbmV4dF9iaXRfYmUpOworI2VuZGlmCisKKwkvKiBzeXNjYWxscyAqLworRVhQT1JUX1NZTUJPTChzeXNfd3JpdGUpOworRVhQT1JUX1NZTUJPTChzeXNfcmVhZCk7CitFWFBPUlRfU1lNQk9MKHN5c19sc2Vlayk7CitFWFBPUlRfU1lNQk9MKHN5c19vcGVuKTsKK0VYUE9SVF9TWU1CT0woc3lzX2V4aXQpOworRVhQT1JUX1NZTUJPTChzeXNfd2FpdDQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FydGh1ci5jIGIvYXJjaC9hcm0va2VybmVsL2FydGh1ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MThkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvYXJ0aHVyLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvYXJ0aHVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxIFBoaWxpcCBCbHVuZGVsbAorICoKKyAqIEFydGh1ciBwZXJzb25hbGl0eQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworLyogQXJ0aHVyIGRvZXNuJ3QgaGF2ZSBtYW55IHNpZ25hbHMsIGFuZCBhIGxvdCBvZiB0aG9zZSB0aGF0IGl0IGRvZXMKKyAgIGhhdmUgZG9uJ3QgbWFwIGVhc2lseSB0byBhbnkgTGludXggZXF1aXZhbGVudC4gIE5ldmVyIG1pbmQuICAqLworCisjZGVmaW5lIEFSVEhVUl9TSUdBQlJUCQkxCisjZGVmaW5lIEFSVEhVUl9TSUdGUEUJCTIKKyNkZWZpbmUgQVJUSFVSX1NJR0lMTAkJMworI2RlZmluZSBBUlRIVVJfU0lHSU5UCQk0CisjZGVmaW5lIEFSVEhVUl9TSUdTRUdWCQk1CisjZGVmaW5lIEFSVEhVUl9TSUdURVJNCQk2CisjZGVmaW5lIEFSVEhVUl9TSUdTVEFLCQk3CisjZGVmaW5lIEFSVEhVUl9TSUdVU1IxCQk4CisjZGVmaW5lIEFSVEhVUl9TSUdVU1IyCQk5CisjZGVmaW5lIEFSVEhVUl9TSUdPU0VSUk9SCTEwCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFydGh1cl90b19saW51eF9zaWduYWxzWzMyXSA9IHsKKwkwLAkxLAkyLAkzLAk0LAk1LAk2LAk3LAorCTgsCTksCTEwLAkxMSwJMTIsCTEzLAkxNCwJMTUsCisJMTYsCTE3LAkxOCwJMTksCTIwLAkyMSwJMjIsCTIzLAorCTI0LAkyNSwJMjYsCTI3LAkyOCwJMjksCTMwLAkzMQorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGludXhfdG9fYXJ0aHVyX3NpZ25hbHNbMzJdID0geworCTAsCQktMSwJCUFSVEhVUl9TSUdJTlQsCS0xLAorICAgICAgIAlBUlRIVVJfU0lHSUxMLAk1LAkJQVJUSFVSX1NJR0FCUlQsCTcsCisJQVJUSFVSX1NJR0ZQRSwJOSwJCUFSVEhVUl9TSUdVU1IxLAlBUlRIVVJfU0lHU0VHViwJCisJQVJUSFVSX1NJR1VTUjIsCTEzLAkJMTQsCQlBUlRIVVJfU0lHVEVSTSwKKwkxNiwJCTE3LAkJMTgsCQkxOSwKKwkyMCwJCTIxLAkJMjIsCQkyMywKKwkyNCwJCTI1LAkJMjYsCQkyNywKKwkyOCwJCTI5LAkJMzAsCQkzMQorfTsKKworc3RhdGljIHZvaWQgYXJ0aHVyX2xjYWxsNyhpbnQgbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzaWdpbmZvIGluZm87CisJaW5mby5zaV9zaWdubyA9IFNJR1NXSTsKKwlpbmZvLnNpX2Vycm5vID0gbnI7CisJLyogQm91bmNlIGl0IHRvIHRoZSBlbXVsYXRvciAqLworCXNlbmRfc2lnX2luZm8oU0lHU1dJLCAmaW5mbywgY3VycmVudCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXhlY19kb21haW4gYXJ0aHVyX2V4ZWNfZG9tYWluID0geworCS5uYW1lCQk9ICJBcnRodXIiLAorCS5oYW5kbGVyCT0gYXJ0aHVyX2xjYWxsNywKKwkucGVyc19sb3cJPSBQRVJfUklTQ09TLAorCS5wZXJzX2hpZ2gJPSBQRVJfUklTQ09TLAorCS5zaWduYWxfbWFwCT0gYXJ0aHVyX3RvX2xpbnV4X3NpZ25hbHMsCisJLnNpZ25hbF9pbnZtYXAJPSBsaW51eF90b19hcnRodXJfc2lnbmFscywKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyoKKyAqIFdlIGNvdWxkIGRvIHdpdGggc29tZSBsb2NraW5nIHRvIHN0b3AgQXJ0aHVyIGJlaW5nIHJlbW92ZWQgd2hpbGUKKyAqIHByb2Nlc3NlcyBhcmUgdXNpbmcgaXQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgYXJ0aHVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfZXhlY19kb21haW4oJmFydGh1cl9leGVjX2RvbWFpbik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcnRodXJfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfZXhlY19kb21haW4oJmFydGh1cl9leGVjX2RvbWFpbik7Cit9CisKK21vZHVsZV9pbml0KGFydGh1cl9pbml0KTsKK21vZHVsZV9leGl0KGFydGh1cl9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9hcm0va2VybmVsL2FzbS1vZmZzZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkNDMyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBSdXNzZWxsIEtpbmcKKyAqICAgICAgICAgICAgICAgMjAwMS0yMDAyIEtlaXRoIE93ZW5zCisgKiAgICAgCisgKiBHZW5lcmF0ZSBkZWZpbml0aW9ucyBuZWVkZWQgYnkgYXNzZW1ibHkgbGFuZ3VhZ2UgbW9kdWxlcy4KKyAqIFRoaXMgY29kZSBnZW5lcmF0ZXMgcmF3IGFzbSBvdXRwdXQgd2hpY2ggaXMgcG9zdC1wcm9jZXNzZWQgdG8gZXh0cmFjdAorICogYW5kIGZvcm1hdCB0aGUgcmVxdWlyZWQgZGF0YS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgYW5kIHRhcmdldCBhcmUgY29tcGF0aWJsZS4KKyAqLworI2lmIGRlZmluZWQoX19BUENTXzI2X18pCisjZXJyb3IgU29ycnksIHlvdXIgY29tcGlsZXIgdGFyZ2V0cyBBUENTLTI2IGJ1dCB0aGlzIGtlcm5lbCByZXF1aXJlcyBBUENTLTMyCisjZW5kaWYKKy8qCisgKiBHQ0MgMi45NS4xLCAyLjk1LjI6IGlnbm9yZXMgcmVnaXN0ZXIgY2xvYmJlciBsaXN0IGluIGFzbSgpLgorICogR0NDIDMuMCwgMy4xOiBnZW5lcmFsIGJhZCBjb2RlIGdlbmVyYXRpb24uCisgKiBHQ0MgMy4yLjA6IGluY29ycmVjdCBmdW5jdGlvbiBhcmd1bWVudCBvZmZzZXQgY2FsY3VsYXRpb24uCisgKiBHQ0MgMy4yLng6IG1pc2NvbXBpbGVzIE5FV19BVVhfRU5UIGluIGZzL2JpbmZtdF9lbGYuYworICogICAgICAgICAgICAoaHR0cDovL2djYy5nbnUub3JnL1BSODg5NikgYW5kIGluY29ycmVjdCBzdHJ1Y3R1cmUKKyAqCSAgICAgIGluaXRpYWxpc2F0aW9uIGluIGZzL2pmZnMyL2VyYXNlLmMKKyAqLworI2lmIF9fR05VQ19fIDwgMiB8fCBcCisgICAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDk1KSB8fCBcCisgICAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA9PSA5NSAmJiBfX0dOVUNfUEFUQ0hMRVZFTF9fICE9IDAgJiYgXAorCQkJCQkgICAgIF9fR05VQ19QQVRDSExFVkVMX18gPCAzKSB8fCBcCisgICAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8IDMpCisjZXJyb3IgWW91ciBjb21waWxlciBpcyB0b28gYnVnZ3k7IGl0IGlzIGtub3duIHRvIG1pc2NvbXBpbGUga2VybmVscy4KKyNlcnJvciAgICBLbm93biBnb29kIGNvbXBpbGVyczogMi45NS4zLCAyLjk1LjQsIDIuOTYsIDMuMworI2VuZGlmCisKKy8qIFVzZSBtYXJrZXIgaWYgeW91IG5lZWQgdG8gc2VwYXJhdGUgdGhlIHZhbHVlcyBsYXRlciAqLworCisjZGVmaW5lIERFRklORShzeW0sIHZhbCkgXAorICAgICAgICBhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAlMCAiICN2YWwgOiA6ICJpIiAodmFsKSkKKworI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKKworaW50IG1haW4odm9pZCkKK3sKKyAgREVGSU5FKFRTS19BQ1RJVkVfTU0sCQlvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIGFjdGl2ZV9tbSkpOworICBCTEFOSygpOworICBERUZJTkUoVElfRkxBR1MsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGZsYWdzKSk7CisgIERFRklORShUSV9QUkVFTVBULAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBwcmVlbXB0X2NvdW50KSk7CisgIERFRklORShUSV9BRERSX0xJTUlULAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBhZGRyX2xpbWl0KSk7CisgIERFRklORShUSV9UQVNLLAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCB0YXNrKSk7CisgIERFRklORShUSV9FWEVDX0RPTUFJTiwJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBleGVjX2RvbWFpbikpOworICBERUZJTkUoVElfQ1BVLAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHUpKTsKKyAgREVGSU5FKFRJX0NQVV9ET01BSU4sCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdV9kb21haW4pKTsKKyAgREVGSU5FKFRJX0NQVV9TQVZFLAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHVfY29udGV4dCkpOworICBERUZJTkUoVElfVVNFRF9DUCwJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdXNlZF9jcCkpOworICBERUZJTkUoVElfVFBfVkFMVUUsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHRwX3ZhbHVlKSk7CisgIERFRklORShUSV9GUFNUQVRFLAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBmcHN0YXRlKSk7CisgIERFRklORShUSV9WRlBTVEFURSwJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdmZwc3RhdGUpKTsKKyAgREVGSU5FKFRJX0lXTU1YVF9TVEFURSwJKG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZnBzdGF0ZSkrNCkmfjcpOworICBCTEFOSygpOworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisgIERFRklORShNTV9DT05URVhUX0lELAkJb2Zmc2V0b2Yoc3RydWN0IG1tX3N0cnVjdCwgY29udGV4dC5pZCkpOworICBCTEFOSygpOworI2VuZGlmCisgIERFRklORShWTUFfVk1fTU0sCQlvZmZzZXRvZihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QsIHZtX21tKSk7CisgIERFRklORShWTUFfVk1fRkxBR1MsCQlvZmZzZXRvZihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QsIHZtX2ZsYWdzKSk7CisgIEJMQU5LKCk7CisgIERFRklORShWTV9FWEVDLAkgICAgICAgCVZNX0VYRUMpOworICBCTEFOSygpOworICBERUZJTkUoUEFHRV9TWiwJICAgICAgIAlQQUdFX1NJWkUpOworICBERUZJTkUoVklSVF9PRkZTRVQsCQlQQUdFX09GRlNFVCk7CisgIEJMQU5LKCk7CisgIERFRklORShTWVNfRVJST1IwLAkJMHg5ZjAwMDApOworICBCTEFOSygpOworICBERUZJTkUoU0laRU9GX01BQ0hJTkVfREVTQywJc2l6ZW9mKHN0cnVjdCBtYWNoaW5lX2Rlc2MpKTsKKyAgcmV0dXJuIDA7IAorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjZlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKQEAgLTAsMCArMSw2OTkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCisgKgorICogIFBDSSBiaW9zLXR5cGUgaW5pdGlhbGlzYXRpb24gZm9yIFBDSSBtYWNoaW5lcworICoKKyAqICBCaXRzIHRha2VuIGZyb20gdmFyaW91cyBwbGFjZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKworc3RhdGljIGludCBkZWJ1Z19wY2k7CitzdGF0aWMgaW50IHVzZV9maXJtd2FyZTsKKworLyoKKyAqIFdlIGNhbid0IHVzZSBwY2lfZmluZF9kZXZpY2UoKSBoZXJlIHNpbmNlIHdlIGFyZQorICogY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIHBjaWJpb3NfYnVzX3JlcG9ydF9zdGF0dXMoc3RydWN0IHBjaV9idXMgKmJ1cywgdV9pbnQgc3RhdHVzX21hc2ssIGludCB3YXJuKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJdTE2IHN0YXR1czsKKworCQkvKgorCQkgKiBpZ25vcmUgaG9zdCBicmlkZ2UgLSB3ZSBoYW5kbGUKKwkJICogdGhhdCBzZXBhcmF0ZWx5CisJCSAqLworCQlpZiAoZGV2LT5idXMtPm51bWJlciA9PSAwICYmIGRldi0+ZGV2Zm4gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX1NUQVRVUywgJnN0YXR1cyk7CisJCWlmIChzdGF0dXMgPT0gMHhmZmZmKQorCQkJY29udGludWU7CisKKwkJaWYgKChzdGF0dXMgJiBzdGF0dXNfbWFzaykgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNsZWFyIHRoZSBzdGF0dXMgZXJyb3JzICovCisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9TVEFUVVMsIHN0YXR1cyAmIHN0YXR1c19tYXNrKTsKKworCQlpZiAod2FybikKKwkJCXByaW50aygiKCVzOiAlMDRYKSAiLCBwY2lfbmFtZShkZXYpLCBzdGF0dXMpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKKwkJaWYgKGRldi0+c3Vib3JkaW5hdGUpCisJCQlwY2liaW9zX2J1c19yZXBvcnRfc3RhdHVzKGRldi0+c3Vib3JkaW5hdGUsIHN0YXR1c19tYXNrLCB3YXJuKTsKK30KKwordm9pZCBwY2liaW9zX3JlcG9ydF9zdGF0dXModV9pbnQgc3RhdHVzX21hc2ssIGludCB3YXJuKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisKKwlsaXN0X2Zvcl9lYWNoKGwsICZwY2lfcm9vdF9idXNlcykgeworCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gcGNpX2J1c19iKGwpOworCisJCXBjaWJpb3NfYnVzX3JlcG9ydF9zdGF0dXMoYnVzLCBzdGF0dXNfbWFzaywgd2Fybik7CisJfQorfQorCisvKgorICogV2UgZG9uJ3QgdXNlIHRoaXMgdG8gZml4IHRoZSBkZXZpY2UsIGJ1dCBpbml0aWFsaXNhdGlvbiBvZiBpdC4KKyAqIEl0J3Mgbm90IHRoZSBjb3JyZWN0IHVzZSBmb3IgdGhpcywgYnV0IGl0IHdvcmtzLgorICogTm90ZSB0aGF0IHRoZSBhcmJpdGVyL0lTQSBicmlkZ2UgYXBwZWFycyB0byBiZSBidWdneSwgc3BlY2lmaWNhbGx5IGluCisgKiB0aGUgZm9sbG93aW5nIGFyZWE6CisgKiAxLiBwYXJrIG9uIENQVQorICogMi4gSVNBIGJyaWRnZSBwaW5nLXBvbmcKKyAqIDMuIElTQSBicmlkZ2UgbWFzdGVyIGhhbmRsaW5nIG9mIHRhcmdldCBSRVRSWQorICoKKyAqIEJ1ZyAzIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc291bmQgRE1BIGdyaW5kaW5nIHRvIGEgaGFsdC4gIFdlIG5vdworICogbGl2ZSB3aXRoIGJ1ZyAyLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwXzgzYzU1MyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qCisJICogU2V0IG1lbW9yeSByZWdpb24gdG8gc3RhcnQgYXQgYWRkcmVzcyAwLCBhbmQgZW5hYmxlIElPCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkpOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9JTyk7CisKKwlkZXYtPnJlc291cmNlWzBdLmVuZCAtPSBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCWRldi0+cmVzb3VyY2VbMF0uc3RhcnQgPSAwOworCisJLyoKKwkgKiBBbGwgbWVtb3J5IHJlcXVlc3RzIGZyb20gSVNBIHRvIGJlIGNoYW5uZWxsZWQgdG8gUENJCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgMHhmZik7CisKKwkvKgorCSAqIEVuYWJsZSBwaW5nLXBvbmcgb24gYnVzIG1hc3RlciB0byBJU0EgYnJpZGdlIHRyYW5zYWN0aW9ucy4KKwkgKiBUaGlzIGltcHJvdmVzIHRoZSBzb3VuZCBETUEgc3Vic3RhbnRpYWxseS4gIFRoZSBmaXhlZAorCSAqIHByaW9yaXR5IGFyYml0ZXIgYWxzbyBoZWxwcyAoc2VlIGJlbG93KS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQyLCAweDAxKTsKKworCS8qCisJICogRW5hYmxlIFBDSSByZXRyeQorCSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDAsIDB4MjIpOworCisJLyoKKwkgKiBXZSB1c2VkIHRvIHNldCB0aGUgYXJiaXRlciB0byAicGFyayBvbiBsYXN0IG1hc3RlciIgKGJpdAorCSAqIDEgc2V0KSwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlIEN5YmVyUHJvIGRvZXMgbm90IHBhcmsgdGhlCisJICogYnVzLiAgV2UgbXVzdCB0aGVyZWZvcmUgcGFyayBvbiBDUFUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzCisJICogbWF5IHRyaWdnZXIgeWV0IGFub3RoZXIgYnVnIGluIHRoZSA1NTMuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4MywgMHgwMik7CisKKwkvKgorCSAqIE1ha2UgdGhlIElTQSBETUEgcmVxdWVzdCBsb3dlc3QgcHJpb3JpdHksIGFuZCBkaXNhYmxlCisJICogcm90YXRpbmcgcHJpb3JpdGllcyBjb21wbGV0ZWx5LgorCSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODAsIDB4MTEpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODEsIDB4MDApOworCisJLyoKKwkgKiBSb3V0ZSBJTlRBIGlucHV0IHRvIElSUSAxMSwgYW5kIHNldCBJUlExMSB0byBiZSBsZXZlbAorCSAqIHNlbnNpdGl2ZS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDQ0LCAweGIwMDApOworCW91dGIoMHgwOCwgMHg0ZDEpOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfV0lOQk9ORCwgUENJX0RFVklDRV9JRF9XSU5CT05EXzgzQzU1MywgcGNpX2ZpeHVwXzgzYzU1Myk7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfdW5hc3NpZ24oc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlkZXYtPnJlc291cmNlWzBdLmVuZCAtPSBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCWRldi0+cmVzb3VyY2VbMF0uc3RhcnQgPSAwOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfV0lOQk9ORDIsIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDOTQwRiwgcGNpX2ZpeHVwX3VuYXNzaWduKTsKKworLyoKKyAqIFByZXZlbnQgdGhlIFBDSSBsYXllciBmcm9tIHNlZWluZyB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCB0byB0aGlzIGRldmljZQorICogaWYgaXQgaXMgdGhlIGhvc3QgYnJpZGdlIGJ5IG1hcmtpbmcgaXQgYXMgc3VjaC4gIFRoZXNlIHJlc291cmNlcyBhcmUgb2YKKyAqIG5vIGNvbnNlcXVlbmNlIHRvIHRoZSBQQ0kgbGF5ZXIgKHRoZXkgYXJlIGhhbmRsZWQgZWxzZXdoZXJlKS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9kZWMyMTI4NShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBpOworCisJaWYgKGRldi0+ZGV2Zm4gPT0gMCkgeworCQlkZXYtPmNsYXNzICY9IDB4ZmY7CisJCWRldi0+Y2xhc3MgfD0gUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDg7CisJCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKKwkJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOworCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7CisJCX0KKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDXzIxMjg1LCBwY2lfZml4dXBfZGVjMjEyODUpOworCisvKgorICogU2FtZSBhcyBhYm92ZS4gVGhlIFByUE1DODAwIGNhcnJpZXIgYm9hcmQgZm9yIHRoZSBQclBNQzExMDAgCisgKiBjYXJkIG1hcHMgdGhlIGhvc3QtYnJpZGdlIEAgMDA6MDE6MDAgZm9yIHNvbWUgcmVhc29uIGFuZCBpdAorICogZW5kcyB1cCBnZXR0aW5nIHNjYW5uZWQuIE5vdGUgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcworICogZml4dXAgd2hlbiB3ZSBmaW5kIHRoZSBJWFA0eHggb24gYSBQclBNQyBzeXN0ZW0sIHdoaWNoIGlzIHdoeQorICogd2UgY2hlY2sgdGhlIG1hY2hpbmUgdHlwZS4gV2UgY291bGQgYmUgcnVubmluZyBvbiBhIGJvYXJkCisgKiB3aXRoIGFuIElYUDR4eCB0YXJnZXQgZGV2aWNlIGFuZCB3ZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlCisgKiByZXNvdXJjZXMgaW4gdGhhdCBjYXNlLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwX3BycG1jMTEwMChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBpOworCisJaWYgKG1hY2hpbmVfaXNfcHJwbWMxMTAwKCkpIHsKKwkJZGV2LT5jbGFzcyAmPSAweGZmOworCQlkZXYtPmNsYXNzIHw9IFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4OworCQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgeworCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7CisJCQlkZXYtPnJlc291cmNlW2ldLmVuZCAgID0gMDsKKwkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOworCQl9CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSVhQNFhYLCBwY2lfZml4dXBfcHJwbWMxMTAwKTsKKworLyoKKyAqIFBDSSBJREUgY29udHJvbGxlcnMgdXNlIG5vbi1zdGFuZGFyZCBJL08gcG9ydCBkZWNvZGluZywgcmVzcGVjdCBpdC4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9pZGVfYmFzZXMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IGk7CisKKwlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgeworCQlyID0gZGV2LT5yZXNvdXJjZSArIGk7CisJCWlmICgoci0+c3RhcnQgJiB+MHg4MCkgPT0gMHgzNzQpIHsKKwkJCXItPnN0YXJ0IHw9IDI7CisJCQlyLT5lbmQgPSByLT5zdGFydDsKKwkJfQorCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfaWRlX2Jhc2VzKTsKKworLyoKKyAqIFB1dCB0aGUgREVDMjExNDIgdG8gc2xlZXAKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9kZWMyMTE0MihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAweDgwMDAwMDAwKTsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfMjExNDIsIHBjaV9maXh1cF9kZWMyMTE0Mik7CisKKy8qCisgKiBUaGUgQ1k4MkM2OTMgbmVlZHMgc29tZSByYXRoZXIgbWFqb3IgZml4dXBzIHRvIGVuc3VyZSB0aGF0IGl0IGRvZXMKKyAqIHRoZSByaWdodCB0aGluZy4gIElkZWEgZnJvbSB0aGUgQWxwaGEgcGVvcGxlLCB3aXRoIGEgZmV3IGFkZGl0aW9ucy4KKyAqCisgKiBXZSBlbnN1cmUgdGhhdCB0aGUgSURFIGJhc2UgcmVnaXN0ZXJzIGFyZSBzZXQgdG8gMWYwLzNmNCBmb3IgdGhlCisgKiBwcmltYXJ5IGJ1cywgYW5kIDE3MC8zNzQgZm9yIHRoZSBzZWNvbmRhcnkgYnVzLiAgQWxzbywgaGlkZSB0aGVtCisgKiBmcm9tIHRoZSBQQ0kgc3Vic3lzdGVtIHZpZXcgYXMgd2VsbCBzbyB3ZSB3b24ndCB0cnkgdG8gcGVyZm9ybQorICogb3VyIG93biBhdXRvLWNvbmZpZ3VyYXRpb24gb24gdGhlbS4KKyAqCisgKiBJbiBhZGRpdGlvbiwgd2UgZW5zdXJlIHRoYXQgdGhlIFBDSSBJREUgaW50ZXJydXB0cyBhcmUgcm91dGVkIHRvCisgKiBJUlEgMTQgYW5kIElSUSAxNSByZXNwZWN0aXZlbHkuCisgKgorICogVGhlIGFib3ZlIGdldHMgdXMgdG8gYSBwb2ludCB3aGVyZSB0aGUgSURFIG9uIHRoaXMgZGV2aWNlIGlzCisgKiBmdW5jdGlvbmFsLiAgSG93ZXZlciwgVGhlIENZODJDNjkzVSBfZG9lcyBub3Qgd29ya18gaW4gYnVzCisgKiBtYXN0ZXIgbW9kZSB3aXRob3V0IGxvY2tpbmcgdGhlIFBDSSBidXMgc29saWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfY3k4MmM2OTMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKSB7CisJCXUzMiBiYXNlMCwgYmFzZTE7CisKKwkJaWYgKGRldi0+Y2xhc3MgJiAweDgwKSB7CS8qIHByaW1hcnkgKi8KKwkJCWJhc2UwID0gMHgxZjA7CisJCQliYXNlMSA9IDB4M2Y0OworCQl9IGVsc2UgewkJCS8qIHNlY29uZGFyeSAqLworCQkJYmFzZTAgPSAweDE3MDsKKwkJCWJhc2UxID0gMHgzNzQ7CisJCX0KKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0JBU0VfQUREUkVTU18wLAorCQkJCSAgICAgICBiYXNlMCB8IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0JBU0VfQUREUkVTU18xLAorCQkJCSAgICAgICBiYXNlMSB8IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pOworCisJCWRldi0+cmVzb3VyY2VbMF0uc3RhcnQgPSAwOworCQlkZXYtPnJlc291cmNlWzBdLmVuZCAgID0gMDsKKwkJZGV2LT5yZXNvdXJjZVswXS5mbGFncyA9IDA7CisKKwkJZGV2LT5yZXNvdXJjZVsxXS5zdGFydCA9IDA7CisJCWRldi0+cmVzb3VyY2VbMV0uZW5kICAgPSAwOworCQlkZXYtPnJlc291cmNlWzFdLmZsYWdzID0gMDsKKwl9IGVsc2UgaWYgKFBDSV9GVU5DKGRldi0+ZGV2Zm4pID09IDApIHsKKwkJLyoKKwkJICogU2V0dXAgSURFIElSUSByb3V0aW5nLgorCQkgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YiwgMTQpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDRjLCAxNSk7CisKKwkJLyoKKwkJICogRGlzYWJsZSBGUkVRQUNLIGhhbmRzaGFrZSwgZW5hYmxlIFVTQi4KKwkJICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGQsIDB4NDEpOworCisJCS8qCisJCSAqIEVuYWJsZSBQQ0kgcmV0cnksIGFuZCBQQ0kgcG9zdC13cml0ZSBidWZmZXIuCisJCSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCAweDE3KTsKKworCQkvKgorCQkgKiBFbmFibGUgSVNBIG1hc3RlciBhbmQgRE1BIHBvc3Qgd3JpdGUgYnVmZmVyaW5nLgorCQkgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0NSwgMHgwMyk7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQ09OVEFRLCBQQ0lfREVWSUNFX0lEX0NPTlRBUV84MkM2OTMsIHBjaV9maXh1cF9jeTgyYzY5Myk7CisKK3ZvaWQgX19kZXZpbml0IHBjaWJpb3NfdXBkYXRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaXJxKQoreworCWlmIChkZWJ1Z19wY2kpCisJCXByaW50aygiUENJOiBBc3NpZ25pbmcgSVJRICUwMmQgdG8gJXNcbiIsIGlycSwgcGNpX25hbWUoZGV2KSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworfQorCisvKgorICogSWYgdGhlIGJ1cyBjb250YWlucyBhbnkgb2YgdGhlc2UgZGV2aWNlcywgdGhlbiB3ZSBtdXN0IG5vdCB0dXJuIG9uCisgKiBwYXJpdHkgY2hlY2tpbmcgb2YgYW55IGtpbmQuICBDdXJyZW50bHkgdGhpcyBpcyBDeWJlclBybyAyMHgwIG9ubHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBkZXZfYmFkX2Zvcl9wYXJpdHkoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URVJHICYmCisJCShkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR18yMDAwIHx8CisJCSBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR18yMDEwKSk7Cit9CisKKy8qCisgKiBBZGp1c3QgdGhlIGRldmljZSByZXNvdXJjZXMgZnJvbSBidXMtY2VudHJpYyB0byBMaW51eC1jZW50cmljLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3BkZXZfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX3N5c19kYXRhICpyb290LCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwkJaWYgKGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQkJb2Zmc2V0ID0gcm9vdC0+bWVtX29mZnNldDsKKwkJZWxzZQorCQkJb2Zmc2V0ID0gcm9vdC0+aW9fb2Zmc2V0OworCisJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKz0gb2Zmc2V0OworCQlkZXYtPnJlc291cmNlW2ldLmVuZCAgICs9IG9mZnNldDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorcGJ1c19hc3NpZ25fYnVzX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpyb290KQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBidXMtPnNlbGY7CisJaW50IGk7CisKKwlpZiAoIWRldikgeworCQkvKgorCQkgKiBBc3NpZ24gcm9vdCBidXMgcmVzb3VyY2VzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWJ1cy0+cmVzb3VyY2VbaV0gPSByb290LT5yZXNvdXJjZVtpXTsKKwl9Cit9CisKKy8qCisgKiBwY2liaW9zX2ZpeHVwX2J1cyAtIENhbGxlZCBhZnRlciBlYWNoIGJ1cyBpcyBwcm9iZWQsCisgKiBidXQgYmVmb3JlIGl0cyBjaGlsZHJlbiBhcmUgZXhhbWluZWQuCisgKi8KK3ZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9zeXNfZGF0YSAqcm9vdCA9IGJ1cy0+c3lzZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXUxNiBmZWF0dXJlcyA9IFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9GQVNUX0JBQ0s7CisKKwlwYnVzX2Fzc2lnbl9idXNfcmVzb3VyY2VzKGJ1cywgcm9vdCk7CisKKwkvKgorCSAqIFdhbGsgdGhlIGRldmljZXMgb24gdGhpcyBidXMsIHdvcmtpbmcgb3V0IHdoYXQgd2UgY2FuCisJICogYW5kIGNhbid0IHN1cHBvcnQuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCXUxNiBzdGF0dXM7CisKKwkJcGRldl9maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHJvb3QsIGRldik7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1RBVFVTLCAmc3RhdHVzKTsKKworCQkvKgorCQkgKiBJZiBhbnkgZGV2aWNlIG9uIHRoaXMgYnVzIGRvZXMgbm90IHN1cHBvcnQgZmFzdCBiYWNrCisJCSAqIHRvIGJhY2sgdHJhbnNmZXJzLCB0aGVuIHRoZSBidXMgYXMgYSB3aG9sZSBpcyBub3QgYWJsZQorCQkgKiB0byBzdXBwb3J0IHRoZW0uICBIYXZpbmcgZmFzdCBiYWNrIHRvIGJhY2sgdHJhbnNmZXJzCisJCSAqIG9uIHNhdmVzIHVzIG9uZSBQQ0kgY3ljbGUgcGVyIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJaWYgKCEoc3RhdHVzICYgUENJX1NUQVRVU19GQVNUX0JBQ0spKQorCQkJZmVhdHVyZXMgJj0gflBDSV9DT01NQU5EX0ZBU1RfQkFDSzsKKworCQlpZiAocGRldl9iYWRfZm9yX3Bhcml0eShkZXYpKQorCQkJZmVhdHVyZXMgJj0gfihQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfUEFSSVRZKTsKKworCQlzd2l0Y2ggKGRldi0+Y2xhc3MgPj4gOCkgeworI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgZGVmaW5lZChDT05GSUdfRUlTQSkKKwkJY2FzZSBQQ0lfQ0xBU1NfQlJJREdFX0lTQToKKwkJY2FzZSBQQ0lfQ0xBU1NfQlJJREdFX0VJU0E6CisJCQkvKgorCQkJICogSWYgdGhpcyBkZXZpY2UgaXMgYW4gSVNBIGJyaWRnZSwgc2V0IGlzYV9icmlkZ2UKKwkJCSAqIHRvIHBvaW50IGF0IHRoaXMgZGV2aWNlLiAgV2Ugd2lsbCB0aGVuIGdvIGxvb2tpbmcKKwkJCSAqIGZvciB0aGluZ3MgbGlrZSBrZXlib2FyZCwgZXRjLgorCQkJICovCisJCQlpc2FfYnJpZGdlID0gZGV2OworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSToKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0JSSURHRV9DT05UUk9MLCAmc3RhdHVzKTsKKwkJCXN0YXR1cyB8PSBQQ0lfQlJJREdFX0NUTF9QQVJJVFl8UENJX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUOworCQkJc3RhdHVzICY9IH4oUENJX0JSSURHRV9DVExfQlVTX1JFU0VUfFBDSV9CUklER0VfQ1RMX0ZBU1RfQkFDSyk7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQlJJREdFX0NPTlRST0wsIHN0YXR1cyk7CisJCQlicmVhazsKKworCQljYXNlIFBDSV9DTEFTU19CUklER0VfQ0FSREJVUzoKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NCX0JSSURHRV9DT05UUk9MLCAmc3RhdHVzKTsKKwkJCXN0YXR1cyB8PSBQQ0lfQ0JfQlJJREdFX0NUTF9QQVJJVFl8UENJX0NCX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NCX0JSSURHRV9DT05UUk9MLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyB3YWxrIHRoZSBkZXZpY2VzIGFnYWluLCB0aGlzIHRpbWUgc2V0dGluZyB0aGVtIHVwLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQl1MTYgY21kOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCQljbWQgfD0gZmVhdHVyZXM7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQkJICAgICAgTDFfQ0FDSEVfQllURVMgPj4gMik7CisJfQorCisJLyoKKwkgKiBQcm9wYWdhdGUgdGhlIGZsYWdzIHRvIHRoZSBQQ0kgYnJpZGdlLgorCSAqLworCWlmIChidXMtPnNlbGYgJiYgYnVzLT5zZWxmLT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CisJCWlmIChmZWF0dXJlcyAmIFBDSV9DT01NQU5EX0ZBU1RfQkFDSykKKwkJCWJ1cy0+YnJpZGdlX2N0bCB8PSBQQ0lfQlJJREdFX0NUTF9GQVNUX0JBQ0s7CisJCWlmIChmZWF0dXJlcyAmIFBDSV9DT01NQU5EX1BBUklUWSkKKwkJCWJ1cy0+YnJpZGdlX2N0bCB8PSBQQ0lfQlJJREdFX0NUTF9QQVJJVFk7CisJfQorCisJLyoKKwkgKiBSZXBvcnQgd2hhdCB3ZSBkaWQgZm9yIHRoaXMgYnVzCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBidXMlZDogRmFzdCBiYWNrIHRvIGJhY2sgdHJhbnNmZXJzICVzYWJsZWRcbiIsCisJCWJ1cy0+bnVtYmVyLCAoZmVhdHVyZXMgJiBQQ0lfQ09NTUFORF9GQVNUX0JBQ0spID8gImVuIiA6ICJkaXMiKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSBMaW51eC1jZW50cmljIHRvIGJ1cy1jZW50cmljIGFkZHJlc3NlcyBmb3IgYnJpZGdlIGRldmljZXMuCisgKi8KK3ZvaWQgX19kZXZpbml0CitwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKKwkJCSBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3QgcGNpX3N5c19kYXRhICpyb290ID0gZGV2LT5zeXNkYXRhOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJb2Zmc2V0ID0gcm9vdC0+aW9fb2Zmc2V0OworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCW9mZnNldCA9IHJvb3QtPm1lbV9vZmZzZXQ7CisKKwlyZWdpb24tPnN0YXJ0ID0gcmVzLT5zdGFydCAtIG9mZnNldDsKKwlyZWdpb24tPmVuZCAgID0gcmVzLT5lbmQgLSBvZmZzZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVRworRVhQT1JUX1NZTUJPTChwY2liaW9zX2ZpeHVwX2J1cyk7CitFWFBPUlRfU1lNQk9MKHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKTsKKyNlbmRpZgorCisvKgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgUENJLVBDSSBicmlkZ2Ugc3dpenpsaW5nIGFsZ29yaXRobToKKyAqCisgKiAgIERldjogMCAgMSAgMiAgMworICogICAgQSAgIEEgIEIgIEMgIEQKKyAqICAgIEIgICBCICBDICBEICBBCisgKiAgICBDICAgQyAgRCAgQSAgQgorICogICAgRCAgIEQgIEEgIEIgIEMKKyAqICAgICAgICBeXl5eXl5eXl5eIGlycSBwaW4gb24gYnJpZGdlCisgKi8KK3U4IF9fZGV2aW5pdCBwY2lfc3RkX3N3aXp6bGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbnApCit7CisJaW50IHBpbiA9ICpwaW5wIC0gMTsKKworCXdoaWxlIChkZXYtPmJ1cy0+c2VsZikgeworCQlwaW4gPSAocGluICsgUENJX1NMT1QoZGV2LT5kZXZmbikpICYgMzsKKwkJLyoKKwkJICogbW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcywKKwkJICogc3dpenpsaW5nIGFzIHdlIGdvLgorCQkgKi8KKwkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CisJfQorCSpwaW5wID0gcGluICsgMTsKKworCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKK30KKworLyoKKyAqIFN3aXp6bGUgdGhlIGRldmljZSBwaW4gZWFjaCB0aW1lIHdlIGNyb3NzIGEgYnJpZGdlLgorICogVGhpcyBtaWdodCB1cGRhdGUgcGluIGFuZCByZXR1cm5zIHRoZSBzbG90IG51bWJlci4KKyAqLworc3RhdGljIHU4IF9fZGV2aW5pdCBwY2liaW9zX3N3aXp6bGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbikKK3sKKwlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBkZXYtPnN5c2RhdGE7CisJaW50IHNsb3QgPSAwLCBvbGRwaW4gPSAqcGluOworCisJaWYgKHN5cy0+c3dpenpsZSkKKwkJc2xvdCA9IHN5cy0+c3dpenpsZShkZXYsIHBpbik7CisKKwlpZiAoZGVidWdfcGNpKQorCQlwcmludGsoIlBDSTogJXMgc3dpenpsaW5nIHBpbiAlZCA9PiBwaW4gJWQgc2xvdCAlZFxuIiwKKwkJCXBjaV9uYW1lKGRldiksIG9sZHBpbiwgKnBpbiwgc2xvdCk7CisKKwlyZXR1cm4gc2xvdDsKK30KKworLyoKKyAqIE1hcCBhIHNsb3QvcGluIHRvIGFuIElSUS4KKyAqLworc3RhdGljIGludCBwY2liaW9zX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyA9IGRldi0+c3lzZGF0YTsKKwlpbnQgaXJxID0gLTE7CisKKwlpZiAoc3lzLT5tYXBfaXJxKQorCQlpcnEgPSBzeXMtPm1hcF9pcnEoZGV2LCBzbG90LCBwaW4pOworCisJaWYgKGRlYnVnX3BjaSkKKwkJcHJpbnRrKCJQQ0k6ICVzIG1hcHBpbmcgc2xvdCAlZCBwaW4gJWQgPT4gaXJxICVkXG4iLAorCQkJcGNpX25hbWUoZGV2KSwgc2xvdCwgcGluLCBpcnEpOworCisJcmV0dXJuIGlycTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfaW5pdF9odyhzdHJ1Y3QgaHdfcGNpICpodykKK3sKKwlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBOVUxMOworCWludCByZXQ7CisJaW50IG5yLCBidXNucjsKKworCWZvciAobnIgPSBidXNuciA9IDA7IG5yIDwgaHctPm5yX2NvbnRyb2xsZXJzOyBucisrKSB7CisJCXN5cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfc3lzX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzeXMpCisJCQlwYW5pYygiUENJOiB1bmFibGUgdG8gYWxsb2NhdGUgc3lzIGRhdGEhIik7CisKKwkJbWVtc2V0KHN5cywgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfc3lzX2RhdGEpKTsKKworCQlzeXMtPmh3ICAgICAgPSBodzsKKwkJc3lzLT5idXNuciAgID0gYnVzbnI7CisJCXN5cy0+c3dpenpsZSA9IGh3LT5zd2l6emxlOworCQlzeXMtPm1hcF9pcnEgPSBody0+bWFwX2lycTsKKwkJc3lzLT5yZXNvdXJjZVswXSA9ICZpb3BvcnRfcmVzb3VyY2U7CisJCXN5cy0+cmVzb3VyY2VbMV0gPSAmaW9tZW1fcmVzb3VyY2U7CisKKwkJcmV0ID0gaHctPnNldHVwKG5yLCBzeXMpOworCisJCWlmIChyZXQgPiAwKSB7CisJCQlzeXMtPmJ1cyA9IGh3LT5zY2FuKG5yLCBzeXMpOworCisJCQlpZiAoIXN5cy0+YnVzKQorCQkJCXBhbmljKCJQQ0k6IHVuYWJsZSB0byBzY2FuIGJ1cyEiKTsKKworCQkJYnVzbnIgPSBzeXMtPmJ1cy0+c3Vib3JkaW5hdGUgKyAxOworCisJCQlsaXN0X2FkZCgmc3lzLT5ub2RlLCAmaHctPmJ1c2VzKTsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlKHN5cyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBfX2luaXQgcGNpX2NvbW1vbl9pbml0KHN0cnVjdCBod19wY2kgKmh3KQoreworCXN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5czsKKworCUlOSVRfTElTVF9IRUFEKCZody0+YnVzZXMpOworCisJaWYgKGh3LT5wcmVpbml0KQorCQlody0+cHJlaW5pdCgpOworCXBjaWJpb3NfaW5pdF9odyhodyk7CisJaWYgKGh3LT5wb3N0aW5pdCkKKwkJaHctPnBvc3Rpbml0KCk7CisKKwlwY2lfZml4dXBfaXJxcyhwY2liaW9zX3N3aXp6bGUsIHBjaWJpb3NfbWFwX2lycSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5cywgJmh3LT5idXNlcywgbm9kZSkgeworCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gc3lzLT5idXM7CisKKwkJaWYgKCF1c2VfZmlybXdhcmUpIHsKKwkJCS8qCisJCQkgKiBTaXplIHRoZSBicmlkZ2Ugd2luZG93cy4KKwkJCSAqLworCQkJcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKKworCQkJLyoKKwkJCSAqIEFzc2lnbiByZXNvdXJjZXMuCisJCQkgKi8KKwkJCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOworCQl9CisKKwkJLyoKKwkJICogVGVsbCBkcml2ZXJzIGFib3V0IGRldmljZXMgZm91bmQuCisJCSAqLworCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CisJfQorfQorCitjaGFyICogX19pbml0IHBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQoreworCWlmICghc3RyY21wKHN0ciwgImRlYnVnIikpIHsKKwkJZGVidWdfcGNpID0gMTsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImZpcm13YXJlIikpIHsKKwkJdXNlX2Zpcm13YXJlID0gMTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBzdHI7Cit9CisKKy8qCisgKiBGcm9tIGFyY2gvaTM4Ni9rZXJuZWwvcGNpLWkzODYuYzoKKyAqCisgKiBXZSBuZWVkIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBgbWlycm9yZWQnIFZHQSBwb3J0cworICogYW5kIG90aGVyIHN0cmFuZ2UgSVNBIGhhcmR3YXJlLCBzbyB3ZSBhbHdheXMgd2FudCB0aGUKKyAqIGFkZHJlc3NlcyB0byBiZSBhbGxvY2F0ZWQgaW4gdGhlIDB4MDAwLTB4MGZmIHJlZ2lvbgorICogbW9kdWxvIDB4NDAwLgorICoKKyAqIFdoeT8gQmVjYXVzZSBzb21lIHNpbGx5IGV4dGVybmFsIElPIGNhcmRzIG9ubHkgZGVjb2RlCisgKiB0aGUgbG93IDEwIGJpdHMgb2YgdGhlIElPIGFkZHJlc3MuIFRoZSAweDAwLTB4ZmYgcmVnaW9uCisgKiBpcyByZXNlcnZlZCBmb3IgbW90aGVyYm9hcmQgZGV2aWNlcyB0aGF0IGRlY29kZSBhbGwgMTYKKyAqIGJpdHMsIHNvIGl0J3Mgb2sgdG8gYWxsb2NhdGUgYXQsIHNheSwgMHgyODAwLTB4MjhmZiwKKyAqIGJ1dCB3ZSB3YW50IHRvIHRyeSB0byBhdm9pZCBhbGxvY2F0aW5nIGF0IDB4MjkwMC0weDJiZmYKKyAqIHdoaWNoIG1pZ2h0IGJlIG1pcnJvcmVkIGF0IDB4MDEwMC0weDAzZmYuLgorICovCit2b2lkIHBjaWJpb3NfYWxpZ25fcmVzb3VyY2Uodm9pZCAqZGF0YSwgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSByZXMtPnN0YXJ0OworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPICYmIHN0YXJ0ICYgMHgzMDApCisJCXN0YXJ0ID0gKHN0YXJ0ICsgMHgzZmYpICYgfjB4M2ZmOworCisJcmVzLT5zdGFydCA9IChzdGFydCArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7Cit9CisKKy8qKgorICogcGNpYmlvc19lbmFibGVfZGV2aWNlIC0gRW5hYmxlIEkvTyBhbmQgbWVtb3J5LgorICogQGRldjogUENJIGRldmljZSB0byBiZSBlbmFibGVkCisgKi8KK2ludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCit7CisJdTE2IGNtZCwgb2xkX2NtZDsKKwlpbnQgaWR4OworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCW9sZF9jbWQgPSBjbWQ7CisJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgeworCQkvKiBPbmx5IHNldCB1cCB0aGUgcmVxdWVzdGVkIHN0dWZmICovCisJCWlmICghKG1hc2sgJiAoMSA8PCBpZHgpKSkKKwkJCWNvbnRpbnVlOworCisJCXIgPSBkZXYtPnJlc291cmNlICsgaWR4OworCQlpZiAoIXItPnN0YXJ0ICYmIHItPmVuZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIGJlY2F1c2UiCisJCQkgICAgICAgIiBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfSU87CisJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwl9CisKKwkvKgorCSAqIEJyaWRnZXMgKGVnLCBjYXJkYnVzIGJyaWRnZXMpIG5lZWQgdG8gYmUgZnVsbHkgZW5hYmxlZAorCSAqLworCWlmICgoZGV2LT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfQlJJREdFKQorCQljbWQgfD0gUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlk7CisKKwlpZiAoY21kICE9IG9sZF9jbWQpIHsKKwkJcHJpbnRrKCJQQ0k6IGVuYWJsaW5nIGRldmljZSAlcyAoJTA0eCAtPiAlMDR4KVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsIGludCB3cml0ZV9jb21iaW5lKQoreworCXN0cnVjdCBwY2lfc3lzX2RhdGEgKnJvb3QgPSBkZXYtPnN5c2RhdGE7CisJdW5zaWduZWQgbG9uZyBwaHlzOworCisJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcGh5cyA9IHZtYS0+dm1fcGdvZmYgKyAocm9vdC0+bWVtX29mZnNldCA+PiBQQUdFX1NISUZUKTsKKwl9CisKKwkvKgorCSAqIE1hcmsgdGhpcyBhcyBJTworCSAqLworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU87CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBwaHlzLAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TIGIvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkMzcwYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCB0d2ljZSBpbiBlbnRyeS1jb21tb24uUworICovCisjaWZuZGVmIE5SX3N5c2NhbGxzCisjZGVmaW5lIE5SX3N5c2NhbGxzIDMyMAorI2Vsc2UKKworX19zeXNjYWxsX3N0YXJ0OgorLyogMCAqLwkJLmxvbmcJc3lzX3Jlc3RhcnRfc3lzY2FsbAorCQkubG9uZwlzeXNfZXhpdAorCQkubG9uZwlzeXNfZm9ya193cmFwcGVyCisJCS5sb25nCXN5c19yZWFkCisJCS5sb25nCXN5c193cml0ZQorLyogNSAqLwkJLmxvbmcJc3lzX29wZW4KKwkJLmxvbmcJc3lzX2Nsb3NlCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX3dhaXRwaWQgKi8KKwkJLmxvbmcJc3lzX2NyZWF0CisJCS5sb25nCXN5c19saW5rCisvKiAxMCAqLwkubG9uZwlzeXNfdW5saW5rCisJCS5sb25nCXN5c19leGVjdmVfd3JhcHBlcgorCQkubG9uZwlzeXNfY2hkaXIKKwkJLmxvbmcJc3lzX3RpbWUJCS8qIHVzZWQgYnkgbGliYzQgKi8KKwkJLmxvbmcJc3lzX21rbm9kCisvKiAxNSAqLwkubG9uZwlzeXNfY2htb2QKKwkJLmxvbmcJc3lzX2xjaG93bjE2CisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX2JyZWFrICovCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX3N0YXQgKi8KKwkJLmxvbmcJc3lzX2xzZWVrCisvKiAyMCAqLwkubG9uZwlzeXNfZ2V0cGlkCisJCS5sb25nCXN5c19tb3VudAorCQkubG9uZwlzeXNfb2xkdW1vdW50CQkvKiB1c2VkIGJ5IGxpYmM0ICovCisJCS5sb25nCXN5c19zZXR1aWQxNgorCQkubG9uZwlzeXNfZ2V0dWlkMTYKKy8qIDI1ICovCS5sb25nCXN5c19zdGltZQorCQkubG9uZwlzeXNfcHRyYWNlCisJCS5sb25nCXN5c19hbGFybQkJLyogdXNlZCBieSBsaWJjNCAqLworCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19mc3RhdCAqLworCQkubG9uZwlzeXNfcGF1c2UKKy8qIDMwICovCS5sb25nCXN5c191dGltZQkJLyogdXNlZCBieSBsaWJjNCAqLworCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19zdHR5ICovCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX2dldHR5ICovCisJCS5sb25nCXN5c19hY2Nlc3MKKwkJLmxvbmcJc3lzX25pY2UKKy8qIDM1ICovCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX2Z0aW1lICovCisJCS5sb25nCXN5c19zeW5jCisJCS5sb25nCXN5c19raWxsCisJCS5sb25nCXN5c19yZW5hbWUKKwkJLmxvbmcJc3lzX21rZGlyCisvKiA0MCAqLwkubG9uZwlzeXNfcm1kaXIKKwkJLmxvbmcJc3lzX2R1cAorCQkubG9uZwlzeXNfcGlwZQorCQkubG9uZwlzeXNfdGltZXMKKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHdhcyBzeXNfcHJvZiAqLworLyogNDUgKi8JLmxvbmcJc3lzX2JyaworCQkubG9uZwlzeXNfc2V0Z2lkMTYKKwkJLmxvbmcJc3lzX2dldGdpZDE2CisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX3NpZ25hbCAqLworCQkubG9uZwlzeXNfZ2V0ZXVpZDE2CisvKiA1MCAqLwkubG9uZwlzeXNfZ2V0ZWdpZDE2CisJCS5sb25nCXN5c19hY2N0CisJCS5sb25nCXN5c191bW91bnQKKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHdhcyBzeXNfbG9jayAqLworCQkubG9uZwlzeXNfaW9jdGwKKy8qIDU1ICovCS5sb25nCXN5c19mY250bAorCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19tcHggKi8KKwkJLmxvbmcJc3lzX3NldHBnaWQKKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHdhcyBzeXNfdWxpbWl0ICovCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX29sZHVuYW1lICovCisvKiA2MCAqLwkubG9uZwlzeXNfdW1hc2sKKwkJLmxvbmcJc3lzX2Nocm9vdAorCQkubG9uZwlzeXNfdXN0YXQKKwkJLmxvbmcJc3lzX2R1cDIKKwkJLmxvbmcJc3lzX2dldHBwaWQKKy8qIDY1ICovCS5sb25nCXN5c19nZXRwZ3JwCisJCS5sb25nCXN5c19zZXRzaWQKKwkJLmxvbmcJc3lzX3NpZ2FjdGlvbgorCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19zZ2V0bWFzayAqLworCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19zc2V0bWFzayAqLworLyogNzAgKi8JLmxvbmcJc3lzX3NldHJldWlkMTYKKwkJLmxvbmcJc3lzX3NldHJlZ2lkMTYKKwkJLmxvbmcJc3lzX3NpZ3N1c3BlbmRfd3JhcHBlcgorCQkubG9uZwlzeXNfc2lncGVuZGluZworCQkubG9uZwlzeXNfc2V0aG9zdG5hbWUKKy8qIDc1ICovCS5sb25nCXN5c19zZXRybGltaXQKKwkJLmxvbmcJc3lzX29sZF9nZXRybGltaXQJLyogdXNlZCBieSBsaWJjNCAqLworCQkubG9uZwlzeXNfZ2V0cnVzYWdlCisJCS5sb25nCXN5c19nZXR0aW1lb2ZkYXkKKwkJLmxvbmcJc3lzX3NldHRpbWVvZmRheQorLyogODAgKi8JLmxvbmcJc3lzX2dldGdyb3VwczE2CisJCS5sb25nCXN5c19zZXRncm91cHMxNgorCQkubG9uZwlvbGRfc2VsZWN0CQkvKiB1c2VkIGJ5IGxpYmM0ICovCisJCS5sb25nCXN5c19zeW1saW5rCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX2xzdGF0ICovCisvKiA4NSAqLwkubG9uZwlzeXNfcmVhZGxpbmsKKwkJLmxvbmcJc3lzX3VzZWxpYgorCQkubG9uZwlzeXNfc3dhcG9uCisJCS5sb25nCXN5c19yZWJvb3QKKwkJLmxvbmcJb2xkX3JlYWRkaXIJCS8qIHVzZWQgYnkgbGliYzQgKi8KKy8qIDkwICovCS5sb25nCW9sZF9tbWFwCQkvKiB1c2VkIGJ5IGxpYmM0ICovCisJCS5sb25nCXN5c19tdW5tYXAKKwkJLmxvbmcJc3lzX3RydW5jYXRlCisJCS5sb25nCXN5c19mdHJ1bmNhdGUKKwkJLmxvbmcJc3lzX2ZjaG1vZAorLyogOTUgKi8JLmxvbmcJc3lzX2ZjaG93bjE2CisJCS5sb25nCXN5c19nZXRwcmlvcml0eQorCQkubG9uZwlzeXNfc2V0cHJpb3JpdHkKKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHdhcyBzeXNfcHJvZmlsICovCisJCS5sb25nCXN5c19zdGF0ZnMKKy8qIDEwMCAqLwkubG9uZwlzeXNfZnN0YXRmcworCQkubG9uZwlzeXNfbmlfc3lzY2FsbAorCQkubG9uZwlzeXNfc29ja2V0Y2FsbAorCQkubG9uZwlzeXNfc3lzbG9nCisJCS5sb25nCXN5c19zZXRpdGltZXIKKy8qIDEwNSAqLwkubG9uZwlzeXNfZ2V0aXRpbWVyCisJCS5sb25nCXN5c19uZXdzdGF0CisJCS5sb25nCXN5c19uZXdsc3RhdAorCQkubG9uZwlzeXNfbmV3ZnN0YXQKKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHdhcyBzeXNfdW5hbWUgKi8KKy8qIDExMCAqLwkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19pb3BsICovCisJCS5sb25nCXN5c192aGFuZ3VwCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCisJCS5sb25nCXN5c19zeXNjYWxsCQkvKiBjYWxsIGEgc3lzY2FsbCAqLworCQkubG9uZwlzeXNfd2FpdDQKKy8qIDExNSAqLwkubG9uZwlzeXNfc3dhcG9mZgorCQkubG9uZwlzeXNfc3lzaW5mbworCQkubG9uZwlzeXNfaXBjCisJCS5sb25nCXN5c19mc3luYworCQkubG9uZwlzeXNfc2lncmV0dXJuX3dyYXBwZXIKKy8qIDEyMCAqLwkubG9uZwlzeXNfY2xvbmVfd3JhcHBlcgorCQkubG9uZwlzeXNfc2V0ZG9tYWlubmFtZQorCQkubG9uZwlzeXNfbmV3dW5hbWUKKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwKKwkJLmxvbmcJc3lzX2FkanRpbWV4CisvKiAxMjUgKi8JLmxvbmcJc3lzX21wcm90ZWN0CisJCS5sb25nCXN5c19zaWdwcm9jbWFzaworCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19jcmVhdGVfbW9kdWxlICovCisJCS5sb25nCXN5c19pbml0X21vZHVsZQorCQkubG9uZwlzeXNfZGVsZXRlX21vZHVsZQorLyogMTMwICovCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX2dldF9rZXJuZWxfc3ltcyAqLworCQkubG9uZwlzeXNfcXVvdGFjdGwKKwkJLmxvbmcJc3lzX2dldHBnaWQKKwkJLmxvbmcJc3lzX2ZjaGRpcgorCQkubG9uZwlzeXNfYmRmbHVzaAorLyogMTM1ICovCS5sb25nCXN5c19zeXNmcworCQkubG9uZwlzeXNfcGVyc29uYWxpdHkKKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIC5sb25nCV9zeXNfYWZzX3N5c2NhbGwgKi8KKwkJLmxvbmcJc3lzX3NldGZzdWlkMTYKKwkJLmxvbmcJc3lzX3NldGZzZ2lkMTYKKy8qIDE0MCAqLwkubG9uZwlzeXNfbGxzZWVrCisJCS5sb25nCXN5c19nZXRkZW50cworCQkubG9uZwlzeXNfc2VsZWN0CisJCS5sb25nCXN5c19mbG9jaworCQkubG9uZwlzeXNfbXN5bmMKKy8qIDE0NSAqLwkubG9uZwlzeXNfcmVhZHYKKwkJLmxvbmcJc3lzX3dyaXRldgorCQkubG9uZwlzeXNfZ2V0c2lkCisJCS5sb25nCXN5c19mZGF0YXN5bmMKKwkJLmxvbmcJc3lzX3N5c2N0bAorLyogMTUwICovCS5sb25nCXN5c19tbG9jaworCQkubG9uZwlzeXNfbXVubG9jaworCQkubG9uZwlzeXNfbWxvY2thbGwKKwkJLmxvbmcJc3lzX211bmxvY2thbGwKKwkJLmxvbmcJc3lzX3NjaGVkX3NldHBhcmFtCisvKiAxNTUgKi8JLmxvbmcJc3lzX3NjaGVkX2dldHBhcmFtCisJCS5sb25nCXN5c19zY2hlZF9zZXRzY2hlZHVsZXIKKwkJLmxvbmcJc3lzX3NjaGVkX2dldHNjaGVkdWxlcgorCQkubG9uZwlzeXNfc2NoZWRfeWllbGQKKwkJLmxvbmcJc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgKKy8qIDE2MCAqLwkubG9uZwlzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgorCQkubG9uZwlzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsCisJCS5sb25nCXN5c19uYW5vc2xlZXAKKwkJLmxvbmcJc3lzX2FybV9tcmVtYXAKKwkJLmxvbmcJc3lzX3NldHJlc3VpZDE2CisvKiAxNjUgKi8JLmxvbmcJc3lzX2dldHJlc3VpZDE2CisJCS5sb25nCXN5c19uaV9zeXNjYWxsCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX3F1ZXJ5X21vZHVsZSAqLworCQkubG9uZwlzeXNfcG9sbAorCQkubG9uZwlzeXNfbmZzc2VydmN0bAorLyogMTcwICovCS5sb25nCXN5c19zZXRyZXNnaWQxNgorCQkubG9uZwlzeXNfZ2V0cmVzZ2lkMTYKKwkJLmxvbmcJc3lzX3ByY3RsCisJCS5sb25nCXN5c19ydF9zaWdyZXR1cm5fd3JhcHBlcgorCQkubG9uZwlzeXNfcnRfc2lnYWN0aW9uCisvKiAxNzUgKi8JLmxvbmcJc3lzX3J0X3NpZ3Byb2NtYXNrCisJCS5sb25nCXN5c19ydF9zaWdwZW5kaW5nCisJCS5sb25nCXN5c19ydF9zaWd0aW1lZHdhaXQKKwkJLmxvbmcJc3lzX3J0X3NpZ3F1ZXVlaW5mbworCQkubG9uZwlzeXNfcnRfc2lnc3VzcGVuZF93cmFwcGVyCisvKiAxODAgKi8JLmxvbmcJc3lzX3ByZWFkNjQKKwkJLmxvbmcJc3lzX3B3cml0ZTY0CisJCS5sb25nCXN5c19jaG93bjE2CisJCS5sb25nCXN5c19nZXRjd2QKKwkJLmxvbmcJc3lzX2NhcGdldAorLyogMTg1ICovCS5sb25nCXN5c19jYXBzZXQKKwkJLmxvbmcJc3lzX3NpZ2FsdHN0YWNrX3dyYXBwZXIKKwkJLmxvbmcJc3lzX3NlbmRmaWxlCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCisvKiAxOTAgKi8JLmxvbmcJc3lzX3Zmb3JrX3dyYXBwZXIKKwkJLmxvbmcJc3lzX2dldHJsaW1pdAorCQkubG9uZwlzeXNfbW1hcDIKKwkJLmxvbmcJc3lzX3RydW5jYXRlNjQKKwkJLmxvbmcJc3lzX2Z0cnVuY2F0ZTY0CisvKiAxOTUgKi8JLmxvbmcJc3lzX3N0YXQ2NAorCQkubG9uZwlzeXNfbHN0YXQ2NAorCQkubG9uZwlzeXNfZnN0YXQ2NAorCQkubG9uZwlzeXNfbGNob3duCisJCS5sb25nCXN5c19nZXR1aWQKKy8qIDIwMCAqLwkubG9uZwlzeXNfZ2V0Z2lkCisJCS5sb25nCXN5c19nZXRldWlkCisJCS5sb25nCXN5c19nZXRlZ2lkCisJCS5sb25nCXN5c19zZXRyZXVpZAorCQkubG9uZwlzeXNfc2V0cmVnaWQKKy8qIDIwNSAqLwkubG9uZwlzeXNfZ2V0Z3JvdXBzCisJCS5sb25nCXN5c19zZXRncm91cHMKKwkJLmxvbmcJc3lzX2ZjaG93bgorCQkubG9uZwlzeXNfc2V0cmVzdWlkCisJCS5sb25nCXN5c19nZXRyZXN1aWQKKy8qIDIxMCAqLwkubG9uZwlzeXNfc2V0cmVzZ2lkCisJCS5sb25nCXN5c19nZXRyZXNnaWQKKwkJLmxvbmcJc3lzX2Nob3duCisJCS5sb25nCXN5c19zZXR1aWQKKwkJLmxvbmcJc3lzX3NldGdpZAorLyogMjE1ICovCS5sb25nCXN5c19zZXRmc3VpZAorCQkubG9uZwlzeXNfc2V0ZnNnaWQKKwkJLmxvbmcJc3lzX2dldGRlbnRzNjQKKwkJLmxvbmcJc3lzX3Bpdm90X3Jvb3QKKwkJLmxvbmcJc3lzX21pbmNvcmUKKy8qIDIyMCAqLwkubG9uZwlzeXNfbWFkdmlzZQorCQkubG9uZwlzeXNfZmNudGw2NAorCQkubG9uZwlzeXNfbmlfc3lzY2FsbCAvKiBUVVggKi8KKwkJLmxvbmcJc3lzX25pX3N5c2NhbGwKKwkJLmxvbmcJc3lzX2dldHRpZAorLyogMjI1ICovCS5sb25nCXN5c19yZWFkYWhlYWQKKwkJLmxvbmcJc3lzX3NldHhhdHRyCisJCS5sb25nCXN5c19sc2V0eGF0dHIKKwkJLmxvbmcJc3lzX2ZzZXR4YXR0cgorCQkubG9uZwlzeXNfZ2V0eGF0dHIKKy8qIDIzMCAqLwkubG9uZwlzeXNfbGdldHhhdHRyCisJCS5sb25nCXN5c19mZ2V0eGF0dHIKKwkJLmxvbmcJc3lzX2xpc3R4YXR0cgorCQkubG9uZwlzeXNfbGxpc3R4YXR0cgorCQkubG9uZwlzeXNfZmxpc3R4YXR0cgorLyogMjM1ICovCS5sb25nCXN5c19yZW1vdmV4YXR0cgorCQkubG9uZwlzeXNfbHJlbW92ZXhhdHRyCisJCS5sb25nCXN5c19mcmVtb3ZleGF0dHIKKwkJLmxvbmcJc3lzX3RraWxsCisJCS5sb25nCXN5c19zZW5kZmlsZTY0CisvKiAyNDAgKi8JLmxvbmcJc3lzX2Z1dGV4X3dyYXBwZXIKKwkJLmxvbmcJc3lzX3NjaGVkX3NldGFmZmluaXR5CisJCS5sb25nCXN5c19zY2hlZF9nZXRhZmZpbml0eQorCQkubG9uZwlzeXNfaW9fc2V0dXAKKwkJLmxvbmcJc3lzX2lvX2Rlc3Ryb3kKKy8qIDI0NSAqLwkubG9uZwlzeXNfaW9fZ2V0ZXZlbnRzCisJCS5sb25nCXN5c19pb19zdWJtaXQKKwkJLmxvbmcJc3lzX2lvX2NhbmNlbAorCQkubG9uZwlzeXNfZXhpdF9ncm91cAorCQkubG9uZwlzeXNfbG9va3VwX2Rjb29raWUKKy8qIDI1MCAqLwkubG9uZwlzeXNfZXBvbGxfY3JlYXRlCisJCS5sb25nCXN5c19lcG9sbF9jdGwKKwkJLmxvbmcJc3lzX2Vwb2xsX3dhaXQKKwkgCS5sb25nCXN5c19yZW1hcF9maWxlX3BhZ2VzCisJCS5sb25nCXN5c19uaV9zeXNjYWxsCS8qIHN5c19zZXRfdGhyZWFkX2FyZWEgKi8KKy8qIDI1NSAqLwkubG9uZwlzeXNfbmlfc3lzY2FsbAkvKiBzeXNfZ2V0X3RocmVhZF9hcmVhICovCisgCQkubG9uZwlzeXNfc2V0X3RpZF9hZGRyZXNzCisJCS5sb25nCXN5c190aW1lcl9jcmVhdGUKKwkJLmxvbmcJc3lzX3RpbWVyX3NldHRpbWUKKwkJLmxvbmcJc3lzX3RpbWVyX2dldHRpbWUKKy8qIDI2MCAqLwkubG9uZwlzeXNfdGltZXJfZ2V0b3ZlcnJ1bgorCQkubG9uZwlzeXNfdGltZXJfZGVsZXRlCisJCS5sb25nCXN5c19jbG9ja19zZXR0aW1lCisJCS5sb25nCXN5c19jbG9ja19nZXR0aW1lCisJCS5sb25nCXN5c19jbG9ja19nZXRyZXMKKy8qIDI2NSAqLwkubG9uZwlzeXNfY2xvY2tfbmFub3NsZWVwCisJCS5sb25nCXN5c19zdGF0ZnM2NAorCQkubG9uZwlzeXNfZnN0YXRmczY0CisJCS5sb25nCXN5c190Z2tpbGwKKwkJLmxvbmcJc3lzX3V0aW1lcworLyogMjcwICovCS5sb25nCXN5c19mYWR2aXNlNjRfNjQKKwkJLmxvbmcJc3lzX3BjaWNvbmZpZ19pb2Jhc2UKKwkJLmxvbmcJc3lzX3BjaWNvbmZpZ19yZWFkCisJCS5sb25nCXN5c19wY2ljb25maWdfd3JpdGUKKwkJLmxvbmcJc3lzX21xX29wZW4KKy8qIDI3NSAqLwkubG9uZwlzeXNfbXFfdW5saW5rCisJCS5sb25nCXN5c19tcV90aW1lZHNlbmQKKwkJLmxvbmcJc3lzX21xX3RpbWVkcmVjZWl2ZQorCQkubG9uZwlzeXNfbXFfbm90aWZ5CisJCS5sb25nCXN5c19tcV9nZXRzZXRhdHRyCisvKiAyODAgKi8JLmxvbmcJc3lzX3dhaXRpZAorCQkubG9uZwlzeXNfc29ja2V0CisJCS5sb25nCXN5c19iaW5kCisJCS5sb25nCXN5c19jb25uZWN0CisJCS5sb25nCXN5c19saXN0ZW4KKy8qIDI4NSAqLwkubG9uZwlzeXNfYWNjZXB0CisJCS5sb25nCXN5c19nZXRzb2NrbmFtZQorCQkubG9uZwlzeXNfZ2V0cGVlcm5hbWUKKwkJLmxvbmcJc3lzX3NvY2tldHBhaXIKKwkJLmxvbmcJc3lzX3NlbmQKKy8qIDI5MCAqLwkubG9uZwlzeXNfc2VuZHRvCisJCS5sb25nCXN5c19yZWN2CisJCS5sb25nCXN5c19yZWN2ZnJvbQorCQkubG9uZwlzeXNfc2h1dGRvd24KKwkJLmxvbmcJc3lzX3NldHNvY2tvcHQKKy8qIDI5NSAqLwkubG9uZwlzeXNfZ2V0c29ja29wdAorCQkubG9uZwlzeXNfc2VuZG1zZworCQkubG9uZwlzeXNfcmVjdm1zZworCQkubG9uZwlzeXNfc2Vtb3AKKwkJLmxvbmcJc3lzX3NlbWdldAorLyogMzAwICovCS5sb25nCXN5c19zZW1jdGwKKwkJLmxvbmcJc3lzX21zZ3NuZAorCQkubG9uZwlzeXNfbXNncmN2CisJCS5sb25nCXN5c19tc2dnZXQKKwkJLmxvbmcJc3lzX21zZ2N0bAorLyogMzA1ICovCS5sb25nCXN5c19zaG1hdAorCQkubG9uZwlzeXNfc2htZHQKKwkJLmxvbmcJc3lzX3NobWdldAorCQkubG9uZwlzeXNfc2htY3RsCisJCS5sb25nCXN5c19hZGRfa2V5CisvKiAzMTAgKi8JLmxvbmcJc3lzX3JlcXVlc3Rfa2V5CisJCS5sb25nCXN5c19rZXljdGwKKwkJLmxvbmcJc3lzX3NlbXRpbWVkb3AKK19fc3lzY2FsbF9lbmQ6CisKKwkJLnJlcHQJTlJfc3lzY2FsbHMgLSAoX19zeXNjYWxsX2VuZCAtIF9fc3lzY2FsbF9zdGFydCkgLyA0CisJCQkubG9uZwlzeXNfbmlfc3lzY2FsbAorCQkuZW5kcgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY29tcGF0LmMgYi9hcmNoL2FybS9rZXJuZWwvY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5NWFkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jb21wYXQuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvY29tcGF0LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogV2Uga2VlcCB0aGUgb2xkIHBhcmFtcyBjb21wYXRpYmlsaXR5IGNydWZ0IGluIG9uZSBwbGFjZSAoaGVyZSkKKyAqIHNvIHdlIGRvbid0IGVuZCB1cCB3aXRoIGxvdHMgb2YgbWVzcyBhcm91bmQgb3RoZXIgcGxhY2VzLgorICoKKyAqIE5PVEU6CisgKiAgVGhlIG9sZCBzdHJ1Y3QgcGFyYW1fc3RydWN0IGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdCB3aWxsIGJlIGtlcHQgaW4KKyAqICB0aGUga2VybmVsIGZvciA1IHllYXJzIGZyb20gbm93ICgyMDAxKS4gVGhpcyB3aWxsIGFsbG93IGJvb3QgbG9hZGVycworICogIHRvIGNvbnZlcnQgdG8gdGhlIG5ldyBzdHJ1Y3QgdGFnIHdheS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisvKgorICogVXNhZ2U6CisgKiAgLSBkbyBub3QgZ28gYmxpbmRseSBhZGRpbmcgZmllbGRzLCBhZGQgdGhlbSBhdCB0aGUgZW5kCisgKiAgLSB3aGVuIGFkZGluZyBmaWVsZHMsIGRvbid0IHJlbHkgb24gdGhlIGFkZHJlc3MgdW50aWwKKyAqICAgIGEgcGF0Y2ggZnJvbSBtZSBoYXMgYmVlbiByZWxlYXNlZAorICogIC0gdW51c2VkIGZpZWxkcyBzaG91bGQgYmUgemVybyAoZm9yIGZ1dHVyZSBleHBhbnNpb24pCisgKiAgLSB0aGlzIHN0cnVjdHVyZSBpcyByZWxhdGl2ZWx5IHNob3J0LWxpdmVkIC0gb25seQorICogICAgZ3VhcmFudGVlZCB0byBjb250YWluIHVzZWZ1bCBkYXRhIGluIHNldHVwX2FyY2goKQorICoKKyAqIFRoaXMgaXMgdGhlIG9sZCBkZXByZWNhdGVkIHdheSB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIGtlcm5lbAorICovCitzdHJ1Y3QgcGFyYW1fc3RydWN0IHsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CQkvKiAgMCAqLworCSAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwkJLyogIDQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyByYW1kaXNrX3NpemU7CQkvKiAgOCAqLworCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogMTIgKi8KKyNkZWZpbmUgRkxBR19SRUFET05MWQkxCisjZGVmaW5lIEZMQUdfUkRMT0FECTQKKyNkZWZpbmUgRkxBR19SRFBST01QVAk4CisJICAgIHVuc2lnbmVkIGxvbmcgcm9vdGRldjsJCS8qIDE2ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbnVtX2NvbHM7CS8qIDIwICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbnVtX3Jvd3M7CS8qIDI0ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9feDsJCS8qIDI4ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9feTsJCS8qIDMyICovCisJICAgIHVuc2lnbmVkIGxvbmcgbWVtY19jb250cm9sX3JlZzsJLyogMzYgKi8KKwkgICAgdW5zaWduZWQgY2hhciBzb3VuZGRlZmF1bHQ7CQkvKiA0MCAqLworCSAgICB1bnNpZ25lZCBjaGFyIGFkZnNkcml2ZXM7CQkvKiA0MSAqLworCSAgICB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9jaGFyX2g7CS8qIDQyICovCisJICAgIHVuc2lnbmVkIGNoYXIgYnl0ZXNfcGVyX2NoYXJfdjsJLyogNDMgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBwYWdlc19pbl9iYW5rWzRdOwkvKiA0NCAqLworCSAgICB1bnNpZ25lZCBsb25nIHBhZ2VzX2luX3ZyYW07CS8qIDYwICovCisJICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0OwkJLyogNjQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBpbml0cmRfc2l6ZTsJCS8qIDY4ICovCisJICAgIHVuc2lnbmVkIGxvbmcgcmRfc3RhcnQ7CQkvKiA3MiAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9yZXY7CQkvKiA3NiAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9zZXJpYWxfbG93OwkvKiA4MCAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9zZXJpYWxfaGlnaDsJLyogODQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBtZW1fZmNsa18yMTI4NTsgICAgICAgLyogODggKi8KKwl9IHM7CisJY2hhciB1bnVzZWRbMjU2XTsKKyAgICB9IHUxOworICAgIHVuaW9uIHsKKwljaGFyIHBhdGhzWzhdWzEyOF07CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgbG9uZyBtYWdpYzsKKwkgICAgY2hhciBuWzEwMjQgLSBzaXplb2YodW5zaWduZWQgbG9uZyldOworCX0gczsKKyAgICB9IHUyOworICAgIGNoYXIgY29tbWFuZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworfTsKKworc3RhdGljIHN0cnVjdCB0YWcgKiBfX2luaXQgbWVtdGFnKHN0cnVjdCB0YWcgKnRhZywgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXRhZyA9IHRhZ19uZXh0KHRhZyk7CisJdGFnLT5oZHIudGFnID0gQVRBR19NRU07CisJdGFnLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ19tZW0zMik7CisJdGFnLT51Lm1lbS5zaXplID0gc2l6ZTsKKwl0YWctPnUubWVtLnN0YXJ0ID0gc3RhcnQ7CisKKwlyZXR1cm4gdGFnOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYnVpbGRfdGFnX2xpc3Qoc3RydWN0IHBhcmFtX3N0cnVjdCAqcGFyYW1zLCB2b2lkICp0YWdsaXN0KQoreworCXN0cnVjdCB0YWcgKnRhZyA9IHRhZ2xpc3Q7CisKKwlpZiAocGFyYW1zLT51MS5zLnBhZ2Vfc2l6ZSAhPSBQQUdFX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogYmFkIGNvbmZpZ3VyYXRpb24gcGFnZSwgIgorCQkgICAgICAgInRyeWluZyB0byBjb250aW51ZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiQ29udmVydGluZyBvbGQtc3R5bGUgcGFyYW0gc3RydWN0IHRvIHRhZ2xpc3RcbiIpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfTkVUV0lOREVSCisJaWYgKHBhcmFtcy0+dTEucy5ucl9wYWdlcyAhPSAweDAyMDAwICYmCisJICAgIHBhcmFtcy0+dTEucy5ucl9wYWdlcyAhPSAweDA0MDAwICYmCisJICAgIHBhcmFtcy0+dTEucy5ucl9wYWdlcyAhPSAweDA4MDAwICYmCisJICAgIHBhcmFtcy0+dTEucy5ucl9wYWdlcyAhPSAweDEwMDAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IGJhZCBOZVRUcm9tIHBhcmFtZXRlcnMgIgorCQkgICAgICAgImRldGVjdGVkLCB1c2luZyBkZWZhdWx0c1xuIik7CisKKwkJcGFyYW1zLT51MS5zLm5yX3BhZ2VzID0gMHgxMDAwOwkvKiAxNk1CICovCisJCXBhcmFtcy0+dTEucy5yYW1kaXNrX3NpemUgPSAwOworCQlwYXJhbXMtPnUxLnMuZmxhZ3MgPSBGTEFHX1JFQURPTkxZOworCQlwYXJhbXMtPnUxLnMuaW5pdHJkX3N0YXJ0ID0gMDsKKwkJcGFyYW1zLT51MS5zLmluaXRyZF9zaXplID0gMDsKKwkJcGFyYW1zLT51MS5zLnJkX3N0YXJ0ID0gMDsKKwl9CisjZW5kaWYKKworCXRhZy0+aGRyLnRhZyAgPSBBVEFHX0NPUkU7CisJdGFnLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ19jb3JlKTsKKwl0YWctPnUuY29yZS5mbGFncyA9IHBhcmFtcy0+dTEucy5mbGFncyAmIEZMQUdfUkVBRE9OTFk7CisJdGFnLT51LmNvcmUucGFnZXNpemUgPSBwYXJhbXMtPnUxLnMucGFnZV9zaXplOworCXRhZy0+dS5jb3JlLnJvb3RkZXYgPSBwYXJhbXMtPnUxLnMucm9vdGRldjsKKworCXRhZyA9IHRhZ19uZXh0KHRhZyk7CisJdGFnLT5oZHIudGFnID0gQVRBR19SQU1ESVNLOworCXRhZy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfcmFtZGlzayk7CisJdGFnLT51LnJhbWRpc2suZmxhZ3MgPSAocGFyYW1zLT51MS5zLmZsYWdzICYgRkxBR19SRExPQUQgPyAxIDogMCkgfAorCQkJICAgICAgIChwYXJhbXMtPnUxLnMuZmxhZ3MgJiBGTEFHX1JEUFJPTVBUID8gMiA6IDApOworCXRhZy0+dS5yYW1kaXNrLnNpemUgID0gcGFyYW1zLT51MS5zLnJhbWRpc2tfc2l6ZTsKKwl0YWctPnUucmFtZGlzay5zdGFydCA9IHBhcmFtcy0+dTEucy5yZF9zdGFydDsKKworCXRhZyA9IHRhZ19uZXh0KHRhZyk7CisJdGFnLT5oZHIudGFnID0gQVRBR19JTklUUkQ7CisJdGFnLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ19pbml0cmQpOworCXRhZy0+dS5pbml0cmQuc3RhcnQgPSBwYXJhbXMtPnUxLnMuaW5pdHJkX3N0YXJ0OworCXRhZy0+dS5pbml0cmQuc2l6ZSAgPSBwYXJhbXMtPnUxLnMuaW5pdHJkX3NpemU7CisKKwl0YWcgPSB0YWdfbmV4dCh0YWcpOworCXRhZy0+aGRyLnRhZyA9IEFUQUdfU0VSSUFMOworCXRhZy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfc2VyaWFsbnIpOworCXRhZy0+dS5zZXJpYWxuci5sb3cgPSBwYXJhbXMtPnUxLnMuc3lzdGVtX3NlcmlhbF9sb3c7CisJdGFnLT51LnNlcmlhbG5yLmhpZ2ggPSBwYXJhbXMtPnUxLnMuc3lzdGVtX3NlcmlhbF9oaWdoOworCisJdGFnID0gdGFnX25leHQodGFnKTsKKwl0YWctPmhkci50YWcgPSBBVEFHX1JFVklTSU9OOworCXRhZy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfcmV2aXNpb24pOworCXRhZy0+dS5yZXZpc2lvbi5yZXYgPSBwYXJhbXMtPnUxLnMuc3lzdGVtX3JldjsKKworI2lmZGVmIENPTkZJR19BUkNIX0FDT1JOCisJaWYgKG1hY2hpbmVfaXNfcmlzY3BjKCkpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQl0YWcgPSBtZW10YWcodGFnLCBQSFlTX09GRlNFVCArIChpIDw8IDI2KSwKKwkJCQkgcGFyYW1zLT51MS5zLnBhZ2VzX2luX2JhbmtbaV0gKiBQQUdFX1NJWkUpOworCX0gZWxzZQorI2VuZGlmCisJdGFnID0gbWVtdGFnKHRhZywgUEhZU19PRkZTRVQsIHBhcmFtcy0+dTEucy5ucl9wYWdlcyAqIFBBR0VfU0laRSk7CisKKyNpZmRlZiBDT05GSUdfRk9PVEJSSURHRQorCWlmIChwYXJhbXMtPnUxLnMubWVtX2ZjbGtfMjEyODUpIHsKKwkJdGFnID0gdGFnX25leHQodGFnKTsKKwkJdGFnLT5oZHIudGFnID0gQVRBR19NRU1DTEs7CisJCXRhZy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfbWVtY2xrKTsKKwkJdGFnLT51Lm1lbWNsay5mbWVtY2xrID0gcGFyYW1zLT51MS5zLm1lbV9mY2xrXzIxMjg1OworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfRUJTQTI4NQorCWlmIChtYWNoaW5lX2lzX2Vic2EyODUoKSkgeworCQl0YWcgPSB0YWdfbmV4dCh0YWcpOworCQl0YWctPmhkci50YWcgPSBBVEFHX1ZJREVPVEVYVDsKKwkJdGFnLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ192aWRlb3RleHQpOworCQl0YWctPnUudmlkZW90ZXh0LnggICAgICAgICAgICA9IHBhcmFtcy0+dTEucy52aWRlb194OworCQl0YWctPnUudmlkZW90ZXh0LnkgICAgICAgICAgICA9IHBhcmFtcy0+dTEucy52aWRlb195OworCQl0YWctPnUudmlkZW90ZXh0LnZpZGVvX3BhZ2UgICA9IDA7CisJCXRhZy0+dS52aWRlb3RleHQudmlkZW9fbW9kZSAgID0gMDsKKwkJdGFnLT51LnZpZGVvdGV4dC52aWRlb19jb2xzICAgPSBwYXJhbXMtPnUxLnMudmlkZW9fbnVtX2NvbHM7CisJCXRhZy0+dS52aWRlb3RleHQudmlkZW9fZWdhX2J4ID0gMDsKKwkJdGFnLT51LnZpZGVvdGV4dC52aWRlb19saW5lcyAgPSBwYXJhbXMtPnUxLnMudmlkZW9fbnVtX3Jvd3M7CisJCXRhZy0+dS52aWRlb3RleHQudmlkZW9faXN2Z2EgID0gMTsKKwkJdGFnLT51LnZpZGVvdGV4dC52aWRlb19wb2ludHMgPSA4OworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfQUNPUk4KKwl0YWcgPSB0YWdfbmV4dCh0YWcpOworCXRhZy0+aGRyLnRhZyA9IEFUQUdfQUNPUk47CisJdGFnLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ19hY29ybik7CisJdGFnLT51LmFjb3JuLm1lbWNfY29udHJvbF9yZWcgPSBwYXJhbXMtPnUxLnMubWVtY19jb250cm9sX3JlZzsKKwl0YWctPnUuYWNvcm4udnJhbV9wYWdlcyAgICAgICA9IHBhcmFtcy0+dTEucy5wYWdlc19pbl92cmFtOworCXRhZy0+dS5hY29ybi5zb3VuZGRlZmF1bHQgICAgID0gcGFyYW1zLT51MS5zLnNvdW5kZGVmYXVsdDsKKwl0YWctPnUuYWNvcm4uYWRmc2RyaXZlcyAgICAgICA9IHBhcmFtcy0+dTEucy5hZGZzZHJpdmVzOworI2VuZGlmCisKKwl0YWcgPSB0YWdfbmV4dCh0YWcpOworCXRhZy0+aGRyLnRhZyA9IEFUQUdfQ01ETElORTsKKwl0YWctPmhkci5zaXplID0gKHN0cmxlbihwYXJhbXMtPmNvbW1hbmRsaW5lKSArIDMgKworCQkJIHNpemVvZihzdHJ1Y3QgdGFnX2hlYWRlcikpID4+IDI7CisJc3RyY3B5KHRhZy0+dS5jbWRsaW5lLmNtZGxpbmUsIHBhcmFtcy0+Y29tbWFuZGxpbmUpOworCisJdGFnID0gdGFnX25leHQodGFnKTsKKwl0YWctPmhkci50YWcgPSBBVEFHX05PTkU7CisJdGFnLT5oZHIuc2l6ZSA9IDA7CisKKwltZW1tb3ZlKHBhcmFtcywgdGFnbGlzdCwgKChpbnQpdGFnKSAtICgoaW50KXRhZ2xpc3QpICsKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0YWdfaGVhZGVyKSk7Cit9CisKK3ZvaWQgX19pbml0IGNvbnZlcnRfdG9fdGFnX2xpc3Qoc3RydWN0IHRhZyAqdGFncykKK3sKKwlzdHJ1Y3QgcGFyYW1fc3RydWN0ICpwYXJhbXMgPSAoc3RydWN0IHBhcmFtX3N0cnVjdCAqKXRhZ3M7CisJYnVpbGRfdGFnX2xpc3QocGFyYW1zLCAmcGFyYW1zLT51Mik7Cit9CisKK3ZvaWQgX19pbml0IHNxdWFzaF9tZW1fdGFncyhzdHJ1Y3QgdGFnICp0YWcpCit7CisJZm9yICg7IHRhZy0+aGRyLnNpemU7IHRhZyA9IHRhZ19uZXh0KHRhZykpCisJCWlmICh0YWctPmhkci50YWcgPT0gQVRBR19NRU0pCisJCQl0YWctPmhkci50YWcgPSBBVEFHX05PTkU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZGVidWcuUyBiL2FyY2gvYXJtL2tlcm5lbC9kZWJ1Zy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYWE5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvZGVidWcuUwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvZGVidWcuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICAzMi1iaXQgZGVidWdnaW5nIGNvZGUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworCQkudGV4dAorCisvKgorICogU29tZSBkZWJ1Z2dpbmcgcm91dGluZXMgKHVzZWZ1bCBpZiB5b3UndmUgZ290IE1NIHByb2JsZW1zIGFuZAorICogcHJpbnRrIGlzbid0IHdvcmtpbmcpLiAgRm9yIERFQlVHR0lORyBPTkxZISEhICBEbyBub3QgbGVhdmUKKyAqIHJlZmVyZW5jZXMgdG8gdGhlc2UgaW4gYSBwcm9kdWN0aW9uIGtlcm5lbCEKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfSUNFRENDKQorCQlAQCBkZWJ1ZyB1c2luZyBBUk0gRW1iZWRkZWRJQ0UgRENDIGNoYW5uZWwKKwkJLm1hY3JvCWFkZHJ1YXJ0LCByeAorCQkuZW5kbQorCisJCS5tYWNybwlzZW5kdWFydCwgcmQsIHJ4CisJCW1jcglwMTQsIDAsIFxyZCwgYzEsIGMwLCAwCisJCS5lbmRtCisKKwkJLm1hY3JvCWJ1c3l1YXJ0LCByZCwgcngKKzEwMDE6CisJCW1yYwlwMTQsIDAsIFxyeCwgYzAsIGMwLCAwCisJCXRzdAlccngsICMyCisJCWJlcQkxMDAxYgorCisJCS5lbmRtCisKKwkJLm1hY3JvCXdhaXR1YXJ0LCByZCwgcngKKwkJbW92CVxyZCwgIzB4MjAwMDAwMAorMTAwMToKKwkJc3VicwlccmQsIFxyZCwgIzEKKwkJYm1pCTEwMDJmCisJCW1yYwlwMTQsIDAsIFxyeCwgYzAsIGMwLCAwCisJCXRzdAlccngsICMyCisJCWJuZQkxMDAxYgorMTAwMjoKKwkJLmVuZG0KKyNlbHNlCisjaW5jbHVkZSA8YXNtL2FyY2gvZGVidWctbWFjcm8uUz4KKyNlbmRpZgorCisvKgorICogVXNlZnVsIGRlYnVnZ2luZyByb3V0aW5lcworICovCitFTlRSWShwcmludGhleDgpCisJCW1vdglyMSwgIzgKKwkJYglwcmludGhleAorCitFTlRSWShwcmludGhleDQpCisJCW1vdglyMSwgIzQKKwkJYglwcmludGhleAorCitFTlRSWShwcmludGhleDIpCisJCW1vdglyMSwgIzIKK3ByaW50aGV4OglhZHIJcjIsIGhleGJ1ZgorCQlhZGQJcjMsIHIyLCByMQorCQltb3YJcjEsICMwCisJCXN0cmIJcjEsIFtyM10KKzE6CQlhbmQJcjEsIHIwLCAjMTUKKwkJbW92CXIwLCByMCwgbHNyICM0CisJCWNtcAlyMSwgIzEwCisJCWFkZGx0CXIxLCByMSwgIycwJworCQlhZGRnZQlyMSwgcjEsICMnYScgLSAxMAorCQlzdHJiCXIxLCBbcjMsICMtMV0hCisJCXRlcQlyMywgcjIKKwkJYm5lCTFiCisJCW1vdglyMCwgcjIKKwkJYglwcmludGFzY2lpCisKKwkJLmx0b3JnCisKK0VOVFJZKHByaW50YXNjaWkpCisJCWFkZHJ1YXJ0IHIzCisJCWIJMmYKKzE6CQl3YWl0dWFydCByMiwgcjMKKwkJc2VuZHVhcnQgcjEsIHIzCisJCWJ1c3l1YXJ0IHIyLCByMworCQl0ZXEJcjEsICMnXG4nCisJCW1vdmVxCXIxLCAjJ1xyJworCQliZXEJMWIKKzI6CQl0ZXEJcjAsICMwCisJCWxkcm5lYglyMSwgW3IwXSwgIzEKKwkJdGVxbmUJcjEsICMwCisJCWJuZQkxYgorCQltb3YJcGMsIGxyCisKK0VOVFJZKHByaW50Y2gpCisJCWFkZHJ1YXJ0IHIzCisJCW1vdglyMSwgcjAKKwkJbW92CXIwLCAjMAorCQliCTFiCisKK2hleGJ1ZjoJCS5zcGFjZSAxNgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RtYS1pc2EuYyBiL2FyY2gvYXJtL2tlcm5lbC9kbWEtaXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhMzYzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9kbWEtaXNhLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2RtYS1pc2EuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBJU0EgRE1BIHByaW1pdGl2ZXMKKyAqICBUYWtlbiBmcm9tIHZhcmlvdXMgc291cmNlcywgaW5jbHVkaW5nOgorICogICBsaW51eC9pbmNsdWRlL2FzbS9kbWEuaDogRGVmaW5lcyBmb3IgdXNpbmcgYW5kIGFsbG9jYXRpbmcgZG1hIGNoYW5uZWxzLgorICogICAgIFdyaXR0ZW4gYnkgSGVubnVzIEJlcmdtYW4sIDE5OTIuCisgKiAgICAgSGlnaCBETUEgY2hhbm5lbCBzdXBwb3J0ICYgaW5mbyBieSBIYW5udSBTYXZvbGFpbmVuIGFuZCBKb2huIEJveWQsCisgKiAgICAgTm92LiAxOTkyLgorICogICBhcmNoL2FybS9rZXJuZWwvZG1hLWVic2EyODUuYworICogICBDb3B5cmlnaHQgKEMpIDE5OTggUGhpbCBCbHVuZGVsbAorICovCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CisKKyNkZWZpbmUgSVNBX0RNQV9NT0RFX1JFQUQJMHg0NAorI2RlZmluZSBJU0FfRE1BX01PREVfV1JJVEUJMHg0OAorI2RlZmluZSBJU0FfRE1BX01PREVfQ0FTQ0FERQkweGMwCisjZGVmaW5lIElTQV9ETUFfQVVUT0lOSVQJMHgxMAorCisjZGVmaW5lIElTQV9ETUFfTUFTSwkJMAorI2RlZmluZSBJU0FfRE1BX01PREUJCTEKKyNkZWZpbmUgSVNBX0RNQV9DTFJGRgkJMgorI2RlZmluZSBJU0FfRE1BX1BHSEkJCTMKKyNkZWZpbmUgSVNBX0RNQV9QR0xPCQk0CisjZGVmaW5lIElTQV9ETUFfQUREUgkJNQorI2RlZmluZSBJU0FfRE1BX0NPVU5UCQk2CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXNhX2RtYV9wb3J0WzhdWzddID0geworCS8qIE1BU0sgICBNT0RFICAgQ0xSRkYgIFBBR0VfSEkgUEFHRV9MTyBBRERSIENPVU5UICovCisJeyAgMHgwYSwgIDB4MGIsICAweDBjLCAgMHg0ODcsICAweDA4NywgIDB4MDAsIDB4MDEgfSwKKwl7ICAweDBhLCAgMHgwYiwgIDB4MGMsICAweDQ4MywgIDB4MDgzLCAgMHgwMiwgMHgwMyB9LAorCXsgIDB4MGEsICAweDBiLCAgMHgwYywgIDB4NDgxLCAgMHgwODEsICAweDA0LCAweDA1IH0sCisJeyAgMHgwYSwgIDB4MGIsICAweDBjLCAgMHg0ODIsICAweDA4MiwgIDB4MDYsIDB4MDcgfSwKKwl7ICAweGQ0LCAgMHhkNiwgIDB4ZDgsICAweDAwMCwgIDB4MDAwLCAgMHhjMCwgMHhjMiB9LAorCXsgIDB4ZDQsICAweGQ2LCAgMHhkOCwgIDB4NDhiLCAgMHgwOGIsICAweGM0LCAweGM2IH0sCisJeyAgMHhkNCwgIDB4ZDYsICAweGQ4LCAgMHg0ODksICAweDA4OSwgIDB4YzgsIDB4Y2EgfSwKKwl7ICAweGQ0LCAgMHhkNiwgIDB4ZDgsICAweDQ4YSwgIDB4MDhhLCAgMHhjYywgMHhjZSB9Cit9OworCitzdGF0aWMgaW50IGlzYV9nZXRfZG1hX3Jlc2lkdWUoZG1hY2hfdCBjaGFubmVsLCBkbWFfdCAqZG1hKQoreworCXVuc2lnbmVkIGludCBpb19wb3J0ID0gaXNhX2RtYV9wb3J0W2NoYW5uZWxdW0lTQV9ETUFfQ09VTlRdOworCWludCBjb3VudDsKKworCWNvdW50ID0gMSArIGluYihpb19wb3J0KTsKKwljb3VudCB8PSBpbmIoaW9fcG9ydCkgPDwgODsKKworCXJldHVybiBjaGFubmVsIDwgNCA/IGNvdW50IDogKGNvdW50IDw8IDEpOworfQorCitzdGF0aWMgdm9pZCBpc2FfZW5hYmxlX2RtYShkbWFjaF90IGNoYW5uZWwsIGRtYV90ICpkbWEpCit7CisJaWYgKGRtYS0+aW52YWxpZCkgeworCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGxlbmd0aDsKKwkJdW5zaWduZWQgaW50IG1vZGUsIGRpcmVjdGlvbjsKKworCQltb2RlID0gY2hhbm5lbCAmIDM7CisJCXN3aXRjaCAoZG1hLT5kbWFfbW9kZSAmIERNQV9NT0RFX01BU0spIHsKKwkJY2FzZSBETUFfTU9ERV9SRUFEOgorCQkJbW9kZSB8PSBJU0FfRE1BX01PREVfUkVBRDsKKwkJCWRpcmVjdGlvbiA9IFBDSV9ETUFfRlJPTURFVklDRTsKKwkJCWJyZWFrOworCisJCWNhc2UgRE1BX01PREVfV1JJVEU6CisJCQltb2RlIHw9IElTQV9ETUFfTU9ERV9XUklURTsKKwkJCWRpcmVjdGlvbiA9IFBDSV9ETUFfVE9ERVZJQ0U7CisJCQlicmVhazsKKworCQljYXNlIERNQV9NT0RFX0NBU0NBREU6CisJCQltb2RlIHw9IElTQV9ETUFfTU9ERV9DQVNDQURFOworCQkJZGlyZWN0aW9uID0gUENJX0RNQV9CSURJUkVDVElPTkFMOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRpcmVjdGlvbiA9IFBDSV9ETUFfTk9ORTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFkbWEtPnVzaW5nX3NnKSB7CisJCQkvKgorCQkJICogQ29wZSB3aXRoIElTQS1zdHlsZSBkcml2ZXJzIHdoaWNoIGV4cGVjdCBjYWNoZQorCQkJICogY29oZXJlbmNlLgorCQkJICovCisJCQlkbWEtPmJ1Zi5kbWFfYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKE5VTEwsCisJCQkJZG1hLT5idWYuX19hZGRyZXNzLCBkbWEtPmJ1Zi5sZW5ndGgsCisJCQkJZGlyZWN0aW9uKTsKKwkJfQorCisJCWFkZHJlc3MgPSBkbWEtPmJ1Zi5kbWFfYWRkcmVzczsKKwkJbGVuZ3RoICA9IGRtYS0+YnVmLmxlbmd0aCAtIDE7CisKKwkJb3V0YihhZGRyZXNzID4+IDE2LCBpc2FfZG1hX3BvcnRbY2hhbm5lbF1bSVNBX0RNQV9QR0xPXSk7CisJCW91dGIoYWRkcmVzcyA+PiAyNCwgaXNhX2RtYV9wb3J0W2NoYW5uZWxdW0lTQV9ETUFfUEdISV0pOworCisJCWlmIChjaGFubmVsID49IDQpIHsKKwkJCWFkZHJlc3MgPj49IDE7CisJCQlsZW5ndGggPj49IDE7CisJCX0KKworCQlvdXRiKDAsIGlzYV9kbWFfcG9ydFtjaGFubmVsXVtJU0FfRE1BX0NMUkZGXSk7CisKKwkJb3V0YihhZGRyZXNzLCBpc2FfZG1hX3BvcnRbY2hhbm5lbF1bSVNBX0RNQV9BRERSXSk7CisJCW91dGIoYWRkcmVzcyA+PiA4LCBpc2FfZG1hX3BvcnRbY2hhbm5lbF1bSVNBX0RNQV9BRERSXSk7CisKKwkJb3V0YihsZW5ndGgsIGlzYV9kbWFfcG9ydFtjaGFubmVsXVtJU0FfRE1BX0NPVU5UXSk7CisJCW91dGIobGVuZ3RoID4+IDgsIGlzYV9kbWFfcG9ydFtjaGFubmVsXVtJU0FfRE1BX0NPVU5UXSk7CisKKwkJaWYgKGRtYS0+ZG1hX21vZGUgJiBETUFfQVVUT0lOSVQpCisJCQltb2RlIHw9IElTQV9ETUFfQVVUT0lOSVQ7CisKKwkJb3V0Yihtb2RlLCBpc2FfZG1hX3BvcnRbY2hhbm5lbF1bSVNBX0RNQV9NT0RFXSk7CisJCWRtYS0+aW52YWxpZCA9IDA7CisJfQorCW91dGIoY2hhbm5lbCAmIDMsIGlzYV9kbWFfcG9ydFtjaGFubmVsXVtJU0FfRE1BX01BU0tdKTsKK30KKworc3RhdGljIHZvaWQgaXNhX2Rpc2FibGVfZG1hKGRtYWNoX3QgY2hhbm5lbCwgZG1hX3QgKmRtYSkKK3sKKwlvdXRiKGNoYW5uZWwgfCA0LCBpc2FfZG1hX3BvcnRbY2hhbm5lbF1bSVNBX0RNQV9NQVNLXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX29wcyBpc2FfZG1hX29wcyA9IHsKKwkudHlwZQkJPSAiSVNBIiwKKwkuZW5hYmxlCQk9IGlzYV9lbmFibGVfZG1hLAorCS5kaXNhYmxlCT0gaXNhX2Rpc2FibGVfZG1hLAorCS5yZXNpZHVlCT0gaXNhX2dldF9kbWFfcmVzaWR1ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZG1hX3Jlc291cmNlc1tdID0geworCXsgImRtYTEiLAkJMHgwMDAwLCAweDAwMGYgfSwKKwl7ICJkbWEgbG93IHBhZ2UiLCAJMHgwMDgwLCAweDAwOGYgfSwKKwl7ICJkbWEyIiwJCTB4MDBjMCwgMHgwMGRmIH0sCisJeyAiZG1hIGhpZ2ggcGFnZSIsCTB4MDQ4MCwgMHgwNDhmIH0KK307CisKK3ZvaWQgX19pbml0IGlzYV9pbml0X2RtYShkbWFfdCAqZG1hKQoreworCS8qCisJICogVHJ5IHRvIGF1dG9kZXRlY3QgcHJlc2VuY2Ugb2YgYW4gSVNBIERNQSBjb250cm9sbGVyLgorCSAqIFdlIGRvIHNvbWUgbWluaW1hbCBpbml0aWFsaXNhdGlvbiwgYW5kIGNoZWNrIHRoYXQKKwkgKiBjaGFubmVsIDAncyBETUEgYWRkcmVzcyByZWdpc3RlcnMgYXJlIHdyaXRlYWJsZS4KKwkgKi8KKwlvdXRiKDB4ZmYsIDB4MGQpOworCW91dGIoMHhmZiwgMHhkYSk7CisKKwkvKgorCSAqIFdyaXRlIGhpZ2ggYW5kIGxvdyBhZGRyZXNzLCBhbmQgdGhlbiByZWFkIHRoZW0gYmFjaworCSAqIGluIHRoZSBzYW1lIG9yZGVyLgorCSAqLworCW91dGIoMHg1NSwgMHgwMCk7CisJb3V0YigweGFhLCAweDAwKTsKKworCWlmIChpbmIoMCkgPT0gMHg1NSAmJiBpbmIoMCkgPT0gMHhhYSkgeworCQlpbnQgY2hhbm5lbCwgaTsKKworCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgODsgY2hhbm5lbCsrKSB7CisJCQlkbWFbY2hhbm5lbF0uZF9vcHMgPSAmaXNhX2RtYV9vcHM7CisJCQlpc2FfZGlzYWJsZV9kbWEoY2hhbm5lbCwgTlVMTCk7CisJCX0KKworCQlvdXRiKDB4NDAsIDB4MGIpOworCQlvdXRiKDB4NDEsIDB4MGIpOworCQlvdXRiKDB4NDIsIDB4MGIpOworCQlvdXRiKDB4NDMsIDB4MGIpOworCisJCW91dGIoMHhjMCwgMHhkNik7CisJCW91dGIoMHg0MSwgMHhkNik7CisJCW91dGIoMHg0MiwgMHhkNik7CisJCW91dGIoMHg0MywgMHhkNik7CisKKwkJb3V0YigwLCAweGQ0KTsKKworCQlvdXRiKDB4MTAsIDB4MDgpOworCQlvdXRiKDB4MTAsIDB4ZDApOworCisJCS8qCisJCSAqIElzIHRoaXMgY29ycmVjdD8gIEFjY29yZGluZyB0byBteSBkb2N1bWVudGF0aW9uLCBpdAorCQkgKiBkb2Vzbid0IGFwcGVhciB0byBiZS4gIEl0IHNob3VsZCBiZToKKwkJICogIG91dGIoMHgzZiwgMHg0MGIpOyBvdXRiKDB4M2YsIDB4NGQ2KTsKKwkJICovCisJCW91dGIoMHgzMCwgMHg0MGIpOworCQlvdXRiKDB4MzEsIDB4NDBiKTsKKwkJb3V0YigweDMyLCAweDQwYik7CisJCW91dGIoMHgzMywgMHg0MGIpOworCQlvdXRiKDB4MzEsIDB4NGQ2KTsKKwkJb3V0YigweDMyLCAweDRkNik7CisJCW91dGIoMHgzMywgMHg0ZDYpOworCisJCXJlcXVlc3RfZG1hKERNQV9JU0FfQ0FTQ0FERSwgImNhc2NhZGUiKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRtYV9yZXNvdXJjZXMpIC8gc2l6ZW9mKGRtYV9yZXNvdXJjZXNbMF0pOyBpKyspCisJCQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsIGRtYV9yZXNvdXJjZXMgKyBpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZG1hLmMgYi9hcmNoL2FybS9rZXJuZWwvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3ODgzOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9kbWEuYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvZG1hLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgRnJvbnQtZW5kIHRvIHRoZSBETUEgaGFuZGxpbmcuICBUaGlzIGhhbmRsZXMgdGhlIGFsbG9jYXRpb24vZnJlZWluZworICogIG9mIERNQSBjaGFubmVscywgYW5kIHByb3ZpZGVzIGEgdW5pZmllZCBpbnRlcmZhY2UgdG8gdGhlIG1hY2hpbmVzCisgKiAgRE1BIGZhY2lsaXRpZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9kbWEuaD4KKworREVGSU5FX1NQSU5MT0NLKGRtYV9zcGluX2xvY2spOworCisjaWYgTUFYX0RNQV9DSEFOTkVMUyA+IDAKKworc3RhdGljIGRtYV90IGRtYV9jaGFuW01BWF9ETUFfQ0hBTk5FTFNdOworCisvKgorICogR2V0IGRtYSBsaXN0IGZvciAvcHJvYy9kbWEKKyAqLworaW50IGdldF9kbWFfbGlzdChjaGFyICpidWYpCit7CisJZG1hX3QgKmRtYTsKKwljaGFyICpwID0gYnVmOworCWludCBpOworCisJZm9yIChpID0gMCwgZG1hID0gZG1hX2NoYW47IGkgPCBNQVhfRE1BX0NIQU5ORUxTOyBpKyssIGRtYSsrKQorCQlpZiAoZG1hLT5sb2NrKQorCQkJcCArPSBzcHJpbnRmKHAsICIlMmQ6ICUxNHMgJXNcbiIsIGksCisJCQkJICAgICBkbWEtPmRfb3BzLT50eXBlLCBkbWEtPmRldmljZV9pZCk7CisKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KKworLyoKKyAqIFJlcXVlc3QgRE1BIGNoYW5uZWwKKyAqCisgKiBPbiBjZXJ0YWluIHBsYXRmb3Jtcywgd2UgaGF2ZSB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgYXMgd2VsbC4uLgorICovCitpbnQgcmVxdWVzdF9kbWEoZG1hY2hfdCBjaGFubmVsLCBjb25zdCBjaGFyICpkZXZpY2VfaWQpCit7CisJZG1hX3QgKmRtYSA9IGRtYV9jaGFuICsgY2hhbm5lbDsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwgPj0gTUFYX0RNQV9DSEFOTkVMUyB8fCAhZG1hLT5kX29wcykKKwkJZ290byBiYWRfZG1hOworCisJaWYgKHhjaGcoJmRtYS0+bG9jaywgMSkgIT0gMCkKKwkJZ290byBidXN5OworCisJZG1hLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisJZG1hLT5hY3RpdmUgICAgPSAwOworCWRtYS0+aW52YWxpZCAgID0gMTsKKworCXJldCA9IDA7CisJaWYgKGRtYS0+ZF9vcHMtPnJlcXVlc3QpCisJCXJldCA9IGRtYS0+ZF9vcHMtPnJlcXVlc3QoY2hhbm5lbCwgZG1hKTsKKworCWlmIChyZXQpCisJCXhjaGcoJmRtYS0+bG9jaywgMCk7CisKKwlyZXR1cm4gcmV0OworCitiYWRfZG1hOgorCXByaW50ayhLRVJOX0VSUiAiZG1hOiB0cnlpbmcgdG8gYWxsb2NhdGUgRE1BJWRcbiIsIGNoYW5uZWwpOworCXJldHVybiAtRUlOVkFMOworCitidXN5OgorCXJldHVybiAtRUJVU1k7Cit9CisKKy8qCisgKiBGcmVlIERNQSBjaGFubmVsCisgKgorICogT24gY2VydGFpbiBwbGF0Zm9ybXMsIHdlIGhhdmUgdG8gZnJlZSBpbnRlcnJ1cHQgYXMgd2VsbC4uLgorICovCit2b2lkIGZyZWVfZG1hKGRtYWNoX3QgY2hhbm5lbCkKK3sKKwlkbWFfdCAqZG1hID0gZG1hX2NoYW4gKyBjaGFubmVsOworCisJaWYgKGNoYW5uZWwgPj0gTUFYX0RNQV9DSEFOTkVMUyB8fCAhZG1hLT5kX29wcykKKwkJZ290byBiYWRfZG1hOworCisJaWYgKGRtYS0+YWN0aXZlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IGZyZWVpbmcgYWN0aXZlIERNQVxuIiwgY2hhbm5lbCk7CisJCWRtYS0+ZF9vcHMtPmRpc2FibGUoY2hhbm5lbCwgZG1hKTsKKwkJZG1hLT5hY3RpdmUgPSAwOworCX0KKworCWlmICh4Y2hnKCZkbWEtPmxvY2ssIDApICE9IDApIHsKKwkJaWYgKGRtYS0+ZF9vcHMtPmZyZWUpCisJCQlkbWEtPmRfb3BzLT5mcmVlKGNoYW5uZWwsIGRtYSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgImRtYSVkOiB0cnlpbmcgdG8gZnJlZSBmcmVlIERNQVxuIiwgY2hhbm5lbCk7CisJcmV0dXJuOworCitiYWRfZG1hOgorCXByaW50ayhLRVJOX0VSUiAiZG1hOiB0cnlpbmcgdG8gZnJlZSBETUElZFxuIiwgY2hhbm5lbCk7Cit9CisKKy8qIFNldCBETUEgU2NhdHRlci1HYXRoZXIgbGlzdAorICovCit2b2lkIHNldF9kbWFfc2cgKGRtYWNoX3QgY2hhbm5lbCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5yX3NnKQoreworCWRtYV90ICpkbWEgPSBkbWFfY2hhbiArIGNoYW5uZWw7CisKKwlpZiAoZG1hLT5hY3RpdmUpCisJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IGFsdGVyaW5nIERNQSBTRyB3aGlsZSAiCisJCSAgICAgICAiRE1BIGFjdGl2ZVxuIiwgY2hhbm5lbCk7CisKKwlkbWEtPnNnID0gc2c7CisJZG1hLT5zZ2NvdW50ID0gbnJfc2c7CisJZG1hLT51c2luZ19zZyA9IDE7CisJZG1hLT5pbnZhbGlkID0gMTsKK30KKworLyogU2V0IERNQSBhZGRyZXNzCisgKgorICogQ29weSBhZGRyZXNzIHRvIHRoZSBzdHJ1Y3R1cmUsIGFuZCBzZXQgdGhlIGludmFsaWQgYml0CisgKi8KK3ZvaWQgc2V0X2RtYV9hZGRyIChkbWFjaF90IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIpCit7CisJZG1hX3QgKmRtYSA9IGRtYV9jaGFuICsgY2hhbm5lbDsKKworCWlmIChkbWEtPmFjdGl2ZSkKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogYWx0ZXJpbmcgRE1BIGFkZHJlc3Mgd2hpbGUgIgorCQkgICAgICAgIkRNQSBhY3RpdmVcbiIsIGNoYW5uZWwpOworCisJZG1hLT5zZyA9ICZkbWEtPmJ1ZjsKKwlkbWEtPnNnY291bnQgPSAxOworCWRtYS0+YnVmLl9fYWRkcmVzcyA9IGJ1c190b192aXJ0KHBoeXNhZGRyKTsKKwlkbWEtPnVzaW5nX3NnID0gMDsKKwlkbWEtPmludmFsaWQgPSAxOworfQorCisvKiBTZXQgRE1BIGJ5dGUgY291bnQKKyAqCisgKiBDb3B5IGFkZHJlc3MgdG8gdGhlIHN0cnVjdHVyZSwgYW5kIHNldCB0aGUgaW52YWxpZCBiaXQKKyAqLwordm9pZCBzZXRfZG1hX2NvdW50IChkbWFjaF90IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJZG1hX3QgKmRtYSA9IGRtYV9jaGFuICsgY2hhbm5lbDsKKworCWlmIChkbWEtPmFjdGl2ZSkKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogYWx0ZXJpbmcgRE1BIGNvdW50IHdoaWxlICIKKwkJICAgICAgICJETUEgYWN0aXZlXG4iLCBjaGFubmVsKTsKKworCWRtYS0+c2cgPSAmZG1hLT5idWY7CisJZG1hLT5zZ2NvdW50ID0gMTsKKwlkbWEtPmJ1Zi5sZW5ndGggPSBjb3VudDsKKwlkbWEtPnVzaW5nX3NnID0gMDsKKwlkbWEtPmludmFsaWQgPSAxOworfQorCisvKiBTZXQgRE1BIGRpcmVjdGlvbiBtb2RlCisgKi8KK3ZvaWQgc2V0X2RtYV9tb2RlIChkbWFjaF90IGNoYW5uZWwsIGRtYW1vZGVfdCBtb2RlKQoreworCWRtYV90ICpkbWEgPSBkbWFfY2hhbiArIGNoYW5uZWw7CisKKwlpZiAoZG1hLT5hY3RpdmUpCisJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IGFsdGVyaW5nIERNQSBtb2RlIHdoaWxlICIKKwkJICAgICAgICJETUEgYWN0aXZlXG4iLCBjaGFubmVsKTsKKworCWRtYS0+ZG1hX21vZGUgPSBtb2RlOworCWRtYS0+aW52YWxpZCA9IDE7Cit9CisKKy8qIEVuYWJsZSBETUEgY2hhbm5lbAorICovCit2b2lkIGVuYWJsZV9kbWEgKGRtYWNoX3QgY2hhbm5lbCkKK3sKKwlkbWFfdCAqZG1hID0gZG1hX2NoYW4gKyBjaGFubmVsOworCisJaWYgKCFkbWEtPmxvY2spCisJCWdvdG8gZnJlZV9kbWE7CisKKwlpZiAoZG1hLT5hY3RpdmUgPT0gMCkgeworCQlkbWEtPmFjdGl2ZSA9IDE7CisJCWRtYS0+ZF9vcHMtPmVuYWJsZShjaGFubmVsLCBkbWEpOworCX0KKwlyZXR1cm47CisKK2ZyZWVfZG1hOgorCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IHRyeWluZyB0byBlbmFibGUgZnJlZSBETUFcbiIsIGNoYW5uZWwpOworCUJVRygpOworfQorCisvKiBEaXNhYmxlIERNQSBjaGFubmVsCisgKi8KK3ZvaWQgZGlzYWJsZV9kbWEgKGRtYWNoX3QgY2hhbm5lbCkKK3sKKwlkbWFfdCAqZG1hID0gZG1hX2NoYW4gKyBjaGFubmVsOworCisJaWYgKCFkbWEtPmxvY2spCisJCWdvdG8gZnJlZV9kbWE7CisKKwlpZiAoZG1hLT5hY3RpdmUgPT0gMSkgeworCQlkbWEtPmFjdGl2ZSA9IDA7CisJCWRtYS0+ZF9vcHMtPmRpc2FibGUoY2hhbm5lbCwgZG1hKTsKKwl9CisJcmV0dXJuOworCitmcmVlX2RtYToKKwlwcmludGsoS0VSTl9FUlIgImRtYSVkOiB0cnlpbmcgdG8gZGlzYWJsZSBmcmVlIERNQVxuIiwgY2hhbm5lbCk7CisJQlVHKCk7Cit9CisKKy8qCisgKiBJcyB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsIGFjdGl2ZT8KKyAqLworaW50IGRtYV9jaGFubmVsX2FjdGl2ZShkbWFjaF90IGNoYW5uZWwpCit7CisJcmV0dXJuIGRtYV9jaGFuW2NoYW5uZWxdLmFjdGl2ZTsKK30KKwordm9pZCBzZXRfZG1hX3BhZ2UoZG1hY2hfdCBjaGFubmVsLCBjaGFyIHBhZ2VucikKK3sKKwlwcmludGsoS0VSTl9FUlIgImRtYSVkOiB0cnlpbmcgdG8gc2V0X2RtYV9wYWdlXG4iLCBjaGFubmVsKTsKK30KKwordm9pZCBzZXRfZG1hX3NwZWVkKGRtYWNoX3QgY2hhbm5lbCwgaW50IGN5Y2xlX25zKQoreworCWRtYV90ICpkbWEgPSBkbWFfY2hhbiArIGNoYW5uZWw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZG1hLT5kX29wcy0+c2V0c3BlZWQpCisJCXJldCA9IGRtYS0+ZF9vcHMtPnNldHNwZWVkKGNoYW5uZWwsIGRtYSwgY3ljbGVfbnMpOworCWRtYS0+c3BlZWQgPSByZXQ7Cit9CisKK2ludCBnZXRfZG1hX3Jlc2lkdWUoZG1hY2hfdCBjaGFubmVsKQoreworCWRtYV90ICpkbWEgPSBkbWFfY2hhbiArIGNoYW5uZWw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZG1hLT5kX29wcy0+cmVzaWR1ZSkKKwkJcmV0ID0gZG1hLT5kX29wcy0+cmVzaWR1ZShjaGFubmVsLCBkbWEpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfX2luaXQgaW5pdF9kbWEodm9pZCkKK3sKKwlhcmNoX2RtYV9pbml0KGRtYV9jaGFuKTsKK30KKworI2Vsc2UKKworaW50IHJlcXVlc3RfZG1hKGRtYWNoX3QgY2hhbm5lbCwgY29uc3QgY2hhciAqZGV2aWNlX2lkKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgZ2V0X2RtYV9yZXNpZHVlKGRtYWNoX3QgY2hhbm5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBHTE9CQUxfQUxJQVMoX2EsX2IpIGFzbSAoIi5zZXQgIiAjX2EgIiwiICNfYiAiOyAuZ2xvYmwgIiAjX2EpCitHTE9CQUxfQUxJQVMoZGlzYWJsZV9kbWEsIGdldF9kbWFfcmVzaWR1ZSk7CitHTE9CQUxfQUxJQVMoZW5hYmxlX2RtYSwgZ2V0X2RtYV9yZXNpZHVlKTsKK0dMT0JBTF9BTElBUyhmcmVlX2RtYSwgZ2V0X2RtYV9yZXNpZHVlKTsKK0dMT0JBTF9BTElBUyhnZXRfZG1hX2xpc3QsIGdldF9kbWFfcmVzaWR1ZSk7CitHTE9CQUxfQUxJQVMoc2V0X2RtYV9tb2RlLCBnZXRfZG1hX3Jlc2lkdWUpOworR0xPQkFMX0FMSUFTKHNldF9kbWFfcGFnZSwgZ2V0X2RtYV9yZXNpZHVlKTsKK0dMT0JBTF9BTElBUyhzZXRfZG1hX2NvdW50LCBnZXRfZG1hX3Jlc2lkdWUpOworR0xPQkFMX0FMSUFTKHNldF9kbWFfYWRkciwgZ2V0X2RtYV9yZXNpZHVlKTsKK0dMT0JBTF9BTElBUyhzZXRfZG1hX3NnLCBnZXRfZG1hX3Jlc2lkdWUpOworR0xPQkFMX0FMSUFTKHNldF9kbWFfc3BlZWQsIGdldF9kbWFfcmVzaWR1ZSk7CitHTE9CQUxfQUxJQVMoaW5pdF9kbWEsIGdldF9kbWFfcmVzaWR1ZSk7CisKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKHJlcXVlc3RfZG1hKTsKK0VYUE9SVF9TWU1CT0woZnJlZV9kbWEpOworRVhQT1JUX1NZTUJPTChlbmFibGVfZG1hKTsKK0VYUE9SVF9TWU1CT0woZGlzYWJsZV9kbWEpOworRVhQT1JUX1NZTUJPTChzZXRfZG1hX2FkZHIpOworRVhQT1JUX1NZTUJPTChzZXRfZG1hX2NvdW50KTsKK0VYUE9SVF9TWU1CT0woc2V0X2RtYV9tb2RlKTsKK0VYUE9SVF9TWU1CT0woc2V0X2RtYV9wYWdlKTsKK0VYUE9SVF9TWU1CT0woZ2V0X2RtYV9yZXNpZHVlKTsKK0VYUE9SVF9TWU1CT0woc2V0X2RtYV9zZyk7CitFWFBPUlRfU1lNQk9MKHNldF9kbWFfc3BlZWQpOworCitFWFBPUlRfU1lNQk9MKGRtYV9zcGluX2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMgYi9hcmNoL2FybS9rZXJuZWwvZWNhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGMxNWIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTAsMCArMSwxMjEwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jCisgKgorICogIENvcHlyaWdodCAxOTk1LTIwMDEgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgRmluZCBhbGwgaW5zdGFsbGVkIGV4cGFuc2lvbiBjYXJkcywgYW5kIGhhbmRsZSBpbnRlcnJ1cHRzIGZyb20gdGhlbS4KKyAqCisgKiAgQ3JlYXRlZCBmcm9tIGluZm9ybWF0aW9uIGZyb20gQWNvcm5zIFJpc2NPUzMgUFJNcworICoKKyAqICAwOC1EZWMtMTk5NglSTUsJQWRkZWQgY29kZSBmb3IgdGhlIDkndGggZXhwYW5zaW9uIGNhcmQgLSB0aGUgZXRoZXIKKyAqCQkJcG9kdWxlIHNsb3QuCisgKiAgMDYtTWF5LTE5OTcJUk1LCUFkZGVkIGJsYWNrbGlzdCBmb3IgY2FyZHMgd2hvc2UgbG9hZGVyIGRvZXNuJ3Qgd29yay4KKyAqICAxMi1TZXAtMTk5NwlSTUsJQ3JlYXRlZCBuZXcgaGFuZGxpbmcgb2YgaW50ZXJydXB0IGVuYWJsZXMvZGlzYWJsZXMKKyAqCQkJLSBjYXJkcyBjYW4gbm93IHJlZ2lzdGVyIHRoZWlyIG93biByb3V0aW5lIHRvIGNvbnRyb2wKKyAqCQkJaW50ZXJydXB0cyAocmVjb21tZW5kZWQpLgorICogIDI5LVNlcC0xOTk3CVJNSwlFeHBhbnNpb24gY2FyZCBpbnRlcnJ1cHQgaGFyZHdhcmUgbm90IGJlaW5nIHJlLWVuYWJsZWQKKyAqCQkJb24gcmVzZXQgZnJvbSBMaW51eC4gKENhdXNlZCBjYXJkcyBub3QgdG8gcmVzcG9uZAorICoJCQl1bmRlciBSaXNjT1Mgd2l0aG91dCBoYXJkIHJlc2V0KS4KKyAqICAxNS1GZWItMTk5OAlSTUsJQWRkZWQgRE1BIHN1cHBvcnQKKyAqICAxMi1TZXAtMTk5OAlSTUsJQWRkZWQgRUFTSSBzdXBwb3J0CisgKiAgMTAtSmFuLTE5OTkJUk1LCVJ1biBsb2FkZXJzIGluIGEgc2ltdWxhdGVkIFJJU0MgT1MgZW52aXJvbm1lbnQuCisgKiAgMTctQXByLTE5OTkJUk1LCVN1cHBvcnQgZm9yIEVBU0kgVHlwZSBDIGN5Y2xlcy4KKyAqLworI2RlZmluZSBFQ0FSRF9DCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCisjaWZuZGVmIENPTkZJR19BUkNIX1JQQworI2RlZmluZSBIQVZFX0VYUE1BU0sKKyNlbmRpZgorCitzdHJ1Y3QgZWNhcmRfcmVxdWVzdCB7CisJdm9pZAkJKCpmbikoc3RydWN0IGVjYXJkX3JlcXVlc3QgKik7CisJZWNhcmRfdAkJKmVjOworCXVuc2lnbmVkIGludAlhZGRyZXNzOworCXVuc2lnbmVkIGludAlsZW5ndGg7CisJdW5zaWduZWQgaW50CXVzZV9sb2FkZXI7CisJdm9pZAkJKmJ1ZmZlcjsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGU7Cit9OworCitzdHJ1Y3QgZXhwY2FyZF9ibGFja2xpc3QgeworCXVuc2lnbmVkIHNob3J0CSBtYW51ZmFjdHVyZXI7CisJdW5zaWduZWQgc2hvcnQJIHByb2R1Y3Q7CisJY29uc3QgY2hhcgkqdHlwZTsKK307CisKK3N0YXRpYyBlY2FyZF90ICpjYXJkczsKK3N0YXRpYyBlY2FyZF90ICpzbG90X3RvX2V4cGNhcmRbTUFYX0VDQVJEU107CitzdGF0aWMgdW5zaWduZWQgaW50IGVjdGNyOworI2lmZGVmIEhBU19FWFBNQVNLCitzdGF0aWMgdW5zaWduZWQgaW50IGhhdmVfZXhwbWFzazsKKyNlbmRpZgorCisvKiBMaXN0IG9mIGRlc2NyaXB0aW9ucyBvZiBjYXJkcyB3aGljaCBkb24ndCBoYXZlIGFuIGV4dGVuZGVkCisgKiBpZGVudGlmaWNhdGlvbiwgb3IgY2h1bmsgZGlyZWN0b3JpZXMgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGV4cGNhcmRfYmxhY2tsaXN0IF9faW5pdGRhdGEgYmxhY2tsaXN0W10gPSB7CisJeyBNQU5VX0FDT1JOLCBQUk9EX0FDT1JOX0VUSEVSMSwgIkFjb3JuIEV0aGVyMSIgfQorfTsKKworYXNtbGlua2FnZSBleHRlcm4gaW50CitlY2FyZF9sb2FkZXJfcmVzZXQodW5zaWduZWQgbG9uZyBiYXNlLCBsb2FkZXJfdCBsb2FkZXIpOworYXNtbGlua2FnZSBleHRlcm4gaW50CitlY2FyZF9sb2FkZXJfcmVhZChpbnQgb2ZmLCB1bnNpZ25lZCBsb25nIGJhc2UsIGxvYWRlcl90IGxvYWRlcik7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZWNhcmRfZ2V0dTE2KHVuc2lnbmVkIGNoYXIgKnYpCit7CisJcmV0dXJuIHZbMF0gfCB2WzFdIDw8IDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2lnbmVkIGxvbmcgZWNhcmRfZ2V0czI0KHVuc2lnbmVkIGNoYXIgKnYpCit7CisJcmV0dXJuIHZbMF0gfCB2WzFdIDw8IDggfCB2WzJdIDw8IDE2IHwgKCh2WzJdICYgMHg4MCkgPyAweGZmMDAwMDAwIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZWNhcmRfdCAqc2xvdF90b19lY2FyZCh1bnNpZ25lZCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gc2xvdCA8IE1BWF9FQ0FSRFMgPyBzbG90X3RvX2V4cGNhcmRbc2xvdF0gOiBOVUxMOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT0gRXhwYW5zaW9uIGNhcmQgZGFlbW9uID09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoKKyAqIFNpbmNlIHRoZSBsb2FkZXIgcHJvZ3JhbXMgb24gdGhlIGV4cGFuc2lvbiBjYXJkcyBuZWVkIHRvIGJlIHJ1bgorICogaW4gYSBzcGVjaWZpYyBlbnZpcm9ubWVudCwgY3JlYXRlIGEgc2VwYXJhdGUgdGFzayB3aXRoIHRoaXMKKyAqIGVudmlyb25tZW50IHVwLCBhbmQgcGFzcyByZXF1ZXN0cyB0byB0aGlzIHRhc2sgYXMgYW5kIHdoZW4gd2UKKyAqIG5lZWQgdG8uCisgKgorICogVGhpcyBzaG91bGQgYWxsb3cgOTklIG9mIGxvYWRlcnMgdG8gYmUgY2FsbGVkIGZyb20gTGludXguCisgKgorICogRnJvbSBhIHNlY3VyaXR5IHN0YW5kcG9pbnQsIHdlIHRydXN0IHRoZSBjYXJkIHZlbmRvcnMuICBUaGlzCisgKiBtYXkgYmUgYSBtaXNwbGFjZWQgdHJ1c3QuCisgKi8KK3N0YXRpYyB2b2lkIGVjYXJkX3Rhc2tfcmVzZXQoc3RydWN0IGVjYXJkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gcmVxLT5lYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlcyA9IGVjLT5zbG90X25vID09IDgKKwkJPyAmZWMtPnJlc291cmNlW0VDQVJEX1JFU19NRU1DXQorCQk6IGVjLT50eXBlID09IEVDQVJEX0VBU0kKKwkJICA/ICZlYy0+cmVzb3VyY2VbRUNBUkRfUkVTX0VBU0ldCisJCSAgOiAmZWMtPnJlc291cmNlW0VDQVJEX1JFU19JT0NTWU5DXTsKKworCWVjYXJkX2xvYWRlcl9yZXNldChyZXMtPnN0YXJ0LCBlYy0+bG9hZGVyKTsKK30KKworc3RhdGljIHZvaWQgZWNhcmRfdGFza19yZWFkYnl0ZXMoc3RydWN0IGVjYXJkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gcmVxLT5lYzsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSByZXEtPmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgbGVuID0gcmVxLT5sZW5ndGg7CisJdW5zaWduZWQgaW50IG9mZiA9IHJlcS0+YWRkcmVzczsKKworCWlmIChlYy0+c2xvdF9ubyA9PSA4KSB7CisJCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKikKKwkJCQllYy0+cmVzb3VyY2VbRUNBUkRfUkVTX01FTUNdLnN0YXJ0OworCisJCS8qCisJCSAqIFRoZSBjYXJkIG1haW50YWlucyBhbiBpbmRleCB3aGljaCBpbmNyZW1lbnRzIHRoZSBhZGRyZXNzCisJCSAqIGludG8gYSA0MDk2LWJ5dGUgcGFnZSBvbiBlYWNoIGFjY2Vzcy4gIFdlIG5lZWQgdG8ga2VlcAorCQkgKiB0cmFjayBvZiB0aGUgY291bnRlci4KKwkJICovCisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgaW5kZXg7CisJCXVuc2lnbmVkIGludCBwYWdlOworCisJCXBhZ2UgPSAob2ZmID4+IDEyKSAqIDQ7CisJCWlmIChwYWdlID4gMjU2ICogNCkKKwkJCXJldHVybjsKKworCQlvZmYgJj0gNDA5NTsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmUgcmVhZGluZyBvZmZzZXQgMCwgb3Igb3VyIGN1cnJlbnQgaW5kZXggaXMKKwkJICogZ3JlYXRlciB0aGFuIHRoZSBvZmZzZXQsIHJlc2V0IHRoZSBoYXJkd2FyZSBpbmRleCBjb3VudGVyLgorCQkgKi8KKwkJaWYgKG9mZiA9PSAwIHx8IGluZGV4ID4gb2ZmKSB7CisJCQl3cml0ZWIoMCwgYmFzZSk7CisJCQlpbmRleCA9IDA7CisJCX0KKworCQkvKgorCQkgKiBJbmNyZW1lbnQgdGhlIGhhcmR3YXJlIGluZGV4IGNvdW50ZXIgdW50aWwgd2UgZ2V0IHRvIHRoZQorCQkgKiByZXF1aXJlZCBvZmZzZXQuICBUaGUgcmVhZCBieXRlcyBhcmUgZGlzY2FyZGVkLgorCQkgKi8KKwkJd2hpbGUgKGluZGV4IDwgb2ZmKSB7CisJCQlyZWFkYihiYXNlICsgcGFnZSk7CisJCQlpbmRleCArPSAxOworCQl9CisKKwkJd2hpbGUgKGxlbi0tKSB7CisJCQkqYnVmKysgPSByZWFkYihiYXNlICsgcGFnZSk7CisJCQlpbmRleCArPSAxOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBiYXNlID0gKGVjLT50eXBlID09IEVDQVJEX0VBU0kKKwkJCSA/ICZlYy0+cmVzb3VyY2VbRUNBUkRfUkVTX0VBU0ldCisJCQkgOiAmZWMtPnJlc291cmNlW0VDQVJEX1JFU19JT0NTWU5DXSktPnN0YXJ0OworCQl2b2lkIF9faW9tZW0gKnBiYXNlID0gKHZvaWQgX19pb21lbSAqKWJhc2U7CisKKwkJaWYgKCFyZXEtPnVzZV9sb2FkZXIgfHwgIWVjLT5sb2FkZXIpIHsKKwkJCW9mZiAqPSA0OworCQkJd2hpbGUgKGxlbi0tKSB7CisJCQkJKmJ1ZisrID0gcmVhZGIocGJhc2UgKyBvZmYpOworCQkJCW9mZiArPSA0OworCQkJfQorCQl9IGVsc2UgeworCQkJd2hpbGUobGVuLS0pIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBmb2xsb3dpbmcgaXMgcmVxdWlyZWQgYnkgc29tZQorCQkJCSAqIGV4cGFuc2lvbiBjYXJkIGxvYWRlciBwcm9ncmFtcy4KKwkJCQkgKi8KKwkJCQkqKHVuc2lnbmVkIGxvbmcgKikweDEwOCA9IDA7CisJCQkJKmJ1ZisrID0gZWNhcmRfbG9hZGVyX3JlYWQob2ZmKyssIGJhc2UsCisJCQkJCQkJICAgZWMtPmxvYWRlcik7CisJCQl9CisJCX0KKwl9CisKK30KKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGVjYXJkX3dhaXQpOworc3RhdGljIHN0cnVjdCBlY2FyZF9yZXF1ZXN0ICplY2FyZF9yZXE7CitzdGF0aWMgREVDTEFSRV9NVVRFWChlY2FyZF9zZW0pOworCisvKgorICogU2V0IHVwIHRoZSBleHBhbnNpb24gY2FyZCBkYWVtb24ncyBwYWdlIHRhYmxlcy4KKyAqLworc3RhdGljIHZvaWQgZWNhcmRfaW5pdF9wZ3RhYmxlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Qgdm1hOworCisJLyogV2Ugd2FudCB0byBzZXQgdXAgdGhlIHBhZ2UgdGFibGVzIGZvciB0aGUgZm9sbG93aW5nIG1hcHBpbmc6CisJICogIFZpcnR1YWwJUGh5c2ljYWwKKwkgKiAgMHgwMzAwMDAwMAkweDAzMDAwMDAwCisJICogIDB4MDMwMTAwMDAJdW5tYXBwZWQKKwkgKiAgMHgwMzIxMDAwMAkweDAzMjEwMDAwCisJICogIDB4MDM0MDAwMDAJdW5tYXBwZWQKKwkgKiAgMHgwODAwMDAwMAkweDA4MDAwMDAwCisJICogIDB4MTAwMDAwMDAJdW5tYXBwZWQKKwkgKgorCSAqIEZJWE1FOiB3ZSBkb24ndCBmb2xsb3cgdGhpcyAxMDAlIHlldC4KKwkgKi8KKwlwZ2RfdCAqc3JjX3BnZCwgKmRzdF9wZ2Q7CisKKwlzcmNfcGdkID0gcGdkX29mZnNldChtbSwgKHVuc2lnbmVkIGxvbmcpSU9fQkFTRSk7CisJZHN0X3BnZCA9IHBnZF9vZmZzZXQobW0sIElPX1NUQVJUKTsKKworCW1lbWNweShkc3RfcGdkLCBzcmNfcGdkLCBzaXplb2YocGdkX3QpICogKElPX1NJWkUgLyBQR0RJUl9TSVpFKSk7CisKKwlzcmNfcGdkID0gcGdkX29mZnNldChtbSwgRUFTSV9CQVNFKTsKKwlkc3RfcGdkID0gcGdkX29mZnNldChtbSwgRUFTSV9TVEFSVCk7CisKKwltZW1jcHkoZHN0X3BnZCwgc3JjX3BnZCwgc2l6ZW9mKHBnZF90KSAqIChFQVNJX1NJWkUgLyBQR0RJUl9TSVpFKSk7CisKKwl2bWEudm1fbW0gPSBtbTsKKworCWZsdXNoX3RsYl9yYW5nZSgmdm1hLCBJT19TVEFSVCwgSU9fU1RBUlQgKyBJT19TSVpFKTsKKwlmbHVzaF90bGJfcmFuZ2UoJnZtYSwgRUFTSV9TVEFSVCwgRUFTSV9TVEFSVCArIEVBU0lfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgZWNhcmRfaW5pdF9tbSh2b2lkKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IG1tX2FsbG9jKCk7CisJc3RydWN0IG1tX3N0cnVjdCAqYWN0aXZlX21tID0gY3VycmVudC0+YWN0aXZlX21tOworCisJaWYgKCFtbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdXJyZW50LT5tbSA9IG1tOworCWN1cnJlbnQtPmFjdGl2ZV9tbSA9IG1tOworCWFjdGl2YXRlX21tKGFjdGl2ZV9tbSwgbW0pOworCW1tZHJvcChhY3RpdmVfbW0pOworCWVjYXJkX2luaXRfcGd0YWJsZXMobW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlY2FyZF90YXNrKHZvaWQgKiB1bnVzZWQpCit7CisJZGFlbW9uaXplKCJrZWNhcmRkIik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgbW0uICBXZSdyZSBub3QgYSBsYXp5LVRMQiBrZXJuZWwgdGFzayBzaW5jZSB3ZSBuZWVkCisJICogdG8gc2V0IHBhZ2UgdGFibGUgZW50cmllcyB3aGVyZSB0aGUgdXNlciBzcGFjZSB3b3VsZCBiZS4gIE5vdGUKKwkgKiB0aGF0IHRoaXMgYWxzbyBjcmVhdGVzIHRoZSBwYWdlIHRhYmxlcy4gIEZhaWx1cmUgaXMgbm90IGFuCisJICogb3B0aW9uIGhlcmUuCisJICovCisJaWYgKGVjYXJkX2luaXRfbW0oKSkKKwkJcGFuaWMoImtlY2FyZGQ6IHVuYWJsZSB0byBhbGxvYyBtbVxuIik7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZWNhcmRfcmVxdWVzdCAqcmVxOworCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShlY2FyZF93YWl0LCBlY2FyZF9yZXEgIT0gTlVMTCk7CisKKwkJcmVxID0geGNoZygmZWNhcmRfcmVxLCBOVUxMKTsKKwkJaWYgKHJlcSAhPSBOVUxMKSB7CisJCQlyZXEtPmZuKHJlcSk7CisJCQljb21wbGV0ZShyZXEtPmNvbXBsZXRlKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFdha2UgdGhlIGV4cGFuc2lvbiBjYXJkIGRhZW1vbiB0byBhY3Rpb24gb3VyIHJlcXVlc3QuCisgKgorICogRklYTUU6IFRoZSB0ZXN0IGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgdG8gZGV0ZWN0IGlmIHRoZQorICoga2NhcmRkIGlzIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyB2b2lkIGVjYXJkX2NhbGwoc3RydWN0IGVjYXJkX3JlcXVlc3QgKnJlcSkKK3sKKwlERUNMQVJFX0NPTVBMRVRJT04oY29tcGxldGlvbik7CisKKwlyZXEtPmNvbXBsZXRlID0gJmNvbXBsZXRpb247CisKKwlkb3duKCZlY2FyZF9zZW0pOworCWVjYXJkX3JlcSA9IHJlcTsKKwl3YWtlX3VwKCZlY2FyZF93YWl0KTsKKworCS8qCisJICogTm93IHdhaXQgZm9yIGtlY2FyZGQgdG8gcnVuLgorCSAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRpb24pOworCXVwKCZlY2FyZF9zZW0pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PSBNaWQtbGV2ZWwgY2FyZCBjb250cm9sID09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgdm9pZAorZWNhcmRfcmVhZGJ5dGVzKHZvaWQgKmFkZHIsIGVjYXJkX3QgKmVjLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgdXNlbGQpCit7CisJc3RydWN0IGVjYXJkX3JlcXVlc3QgcmVxOworCisJcmVxLmZuCQk9IGVjYXJkX3Rhc2tfcmVhZGJ5dGVzOworCXJlcS5lYwkJPSBlYzsKKwlyZXEuYWRkcmVzcwk9IG9mZjsKKwlyZXEubGVuZ3RoCT0gbGVuOworCXJlcS51c2VfbG9hZGVyCT0gdXNlbGQ7CisJcmVxLmJ1ZmZlcgk9IGFkZHI7CisKKwllY2FyZF9jYWxsKCZyZXEpOworfQorCitpbnQgZWNhcmRfcmVhZGNodW5rKHN0cnVjdCBpbl9jaHVua19kaXIgKmNkLCBlY2FyZF90ICplYywgaW50IGlkLCBpbnQgbnVtKQoreworCXN0cnVjdCBleF9jaHVua19kaXIgZXhjZDsKKwlpbnQgaW5kZXggPSAxNjsKKwlpbnQgdXNlbGQgPSAwOworCisJaWYgKCFlYy0+Y2lkLmNkKQorCQlyZXR1cm4gMDsKKworCXdoaWxlKDEpIHsKKwkJZWNhcmRfcmVhZGJ5dGVzKCZleGNkLCBlYywgaW5kZXgsIDgsIHVzZWxkKTsKKwkJaW5kZXggKz0gODsKKwkJaWYgKGNfaWQoJmV4Y2QpID09IDApIHsKKwkJCWlmICghdXNlbGQgJiYgZWMtPmxvYWRlcikgeworCQkJCXVzZWxkID0gMTsKKwkJCQlpbmRleCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoY19pZCgmZXhjZCkgPT0gMHhmMCkgeyAvKiBsaW5rICovCisJCQlpbmRleCA9IGNfc3RhcnQoJmV4Y2QpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNfaWQoJmV4Y2QpID09IDB4ODApIHsgLyogbG9hZGVyICovCisJCQlpZiAoIWVjLT5sb2FkZXIpIHsKKwkJCQllYy0+bG9hZGVyID0gKGxvYWRlcl90KWttYWxsb2MoY19sZW4oJmV4Y2QpLAorCQkJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoZWMtPmxvYWRlcikKKwkJCQkJZWNhcmRfcmVhZGJ5dGVzKGVjLT5sb2FkZXIsIGVjLAorCQkJCQkJCShpbnQpY19zdGFydCgmZXhjZCksCisJCQkJCQkJY19sZW4oJmV4Y2QpLCB1c2VsZCk7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjX2lkKCZleGNkKSA9PSBpZCAmJiBudW0tLSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNfaWQoJmV4Y2QpICYgMHg4MCkgeworCQlzd2l0Y2ggKGNfaWQoJmV4Y2QpICYgMHg3MCkgeworCQljYXNlIDB4NzA6CisJCQllY2FyZF9yZWFkYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKilleGNkLmQuc3RyaW5nLCBlYywKKwkJCQkJKGludCljX3N0YXJ0KCZleGNkKSwgY19sZW4oJmV4Y2QpLAorCQkJCQl1c2VsZCk7CisJCQlicmVhazsKKwkJY2FzZSAweDAwOgorCQkJYnJlYWs7CisJCX0KKwl9CisJY2QtPnN0YXJ0X29mZnNldCA9IGNfc3RhcnQoJmV4Y2QpOworCW1lbWNweShjZC0+ZC5zdHJpbmcsIGV4Y2QuZC5zdHJpbmcsIDI1Nik7CisJcmV0dXJuIDE7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09IEludGVycnVwdCBjb250cm9sID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHZvaWQgZWNhcmRfZGVmX2lycV9lbmFibGUoZWNhcmRfdCAqZWMsIGludCBpcnFucikKK3sKKyNpZmRlZiBIQVNfRVhQTUFTSworCWlmIChpcnFuciA8IDQgJiYgaGF2ZV9leHBtYXNrKSB7CisJCWhhdmVfZXhwbWFzayB8PSAxIDw8IGlycW5yOworCQlfX3Jhd193cml0ZWIoaGF2ZV9leHBtYXNrLCBFWFBNQVNLX0VOQUJMRSk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGVjYXJkX2RlZl9pcnFfZGlzYWJsZShlY2FyZF90ICplYywgaW50IGlycW5yKQoreworI2lmZGVmIEhBU19FWFBNQVNLCisJaWYgKGlycW5yIDwgNCAmJiBoYXZlX2V4cG1hc2spIHsKKwkJaGF2ZV9leHBtYXNrICY9IH4oMSA8PCBpcnFucik7CisJCV9fcmF3X3dyaXRlYihoYXZlX2V4cG1hc2ssIEVYUE1BU0tfRU5BQkxFKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIGludCBlY2FyZF9kZWZfaXJxX3BlbmRpbmcoZWNhcmRfdCAqZWMpCit7CisJcmV0dXJuICFlYy0+aXJxbWFzayB8fCByZWFkYihlYy0+aXJxYWRkcikgJiBlYy0+aXJxbWFzazsKK30KKworc3RhdGljIHZvaWQgZWNhcmRfZGVmX2ZpcV9lbmFibGUoZWNhcmRfdCAqZWMsIGludCBmaXFucikKK3sKKwlwYW5pYygiZWNhcmRfZGVmX2ZpcV9lbmFibGUgY2FsbGVkIC0gaW1wb3NzaWJsZSIpOworfQorCitzdGF0aWMgdm9pZCBlY2FyZF9kZWZfZmlxX2Rpc2FibGUoZWNhcmRfdCAqZWMsIGludCBmaXFucikKK3sKKwlwYW5pYygiZWNhcmRfZGVmX2ZpcV9kaXNhYmxlIGNhbGxlZCAtIGltcG9zc2libGUiKTsKK30KKworc3RhdGljIGludCBlY2FyZF9kZWZfZmlxX3BlbmRpbmcoZWNhcmRfdCAqZWMpCit7CisJcmV0dXJuICFlYy0+ZmlxbWFzayB8fCByZWFkYihlYy0+ZmlxYWRkcikgJiBlYy0+ZmlxbWFzazsKK30KKworc3RhdGljIGV4cGFuc2lvbmNhcmRfb3BzX3QgZWNhcmRfZGVmYXVsdF9vcHMgPSB7CisJZWNhcmRfZGVmX2lycV9lbmFibGUsCisJZWNhcmRfZGVmX2lycV9kaXNhYmxlLAorCWVjYXJkX2RlZl9pcnFfcGVuZGluZywKKwllY2FyZF9kZWZfZmlxX2VuYWJsZSwKKwllY2FyZF9kZWZfZmlxX2Rpc2FibGUsCisJZWNhcmRfZGVmX2ZpcV9wZW5kaW5nCit9OworCisvKgorICogRW5hYmxlIGFuZCBkaXNhYmxlIGludGVycnVwdHMgZnJvbSBleHBhbnNpb24gY2FyZHMuCisgKiAoaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIHRoZXNlIGZ1bmN0aW9ucykuCisgKgorICogVGhleSBhcmUgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseSwgYnV0IHZpYSBlbmFibGUvZGlzYWJsZV9pcnEuCisgKi8KK3N0YXRpYyB2b2lkIGVjYXJkX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycW5yKQoreworCWVjYXJkX3QgKmVjID0gc2xvdF90b19lY2FyZChpcnFuciAtIDMyKTsKKworCWlmIChlYykgeworCQlpZiAoIWVjLT5vcHMpCisJCQllYy0+b3BzID0gJmVjYXJkX2RlZmF1bHRfb3BzOworCisJCWlmIChlYy0+Y2xhaW1lZCAmJiBlYy0+b3BzLT5pcnFlbmFibGUpCisJCQllYy0+b3BzLT5pcnFlbmFibGUoZWMsIGlycW5yKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJlY2FyZDogcmVqZWN0aW5nIHJlcXVlc3QgdG8gIgorCQkJCSJlbmFibGUgSVJRcyBmb3IgJWRcbiIsIGlycW5yKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVjYXJkX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnFucikKK3sKKwllY2FyZF90ICplYyA9IHNsb3RfdG9fZWNhcmQoaXJxbnIgLSAzMik7CisKKwlpZiAoZWMpIHsKKwkJaWYgKCFlYy0+b3BzKQorCQkJZWMtPm9wcyA9ICZlY2FyZF9kZWZhdWx0X29wczsKKworCQlpZiAoZWMtPm9wcyAmJiBlYy0+b3BzLT5pcnFkaXNhYmxlKQorCQkJZWMtPm9wcy0+aXJxZGlzYWJsZShlYywgaXJxbnIpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGVjYXJkX2NoaXAgPSB7CisJLmFjawk9IGVjYXJkX2lycV9tYXNrLAorCS5tYXNrCT0gZWNhcmRfaXJxX21hc2ssCisJLnVubWFzayA9IGVjYXJkX2lycV91bm1hc2ssCit9OworCit2b2lkIGVjYXJkX2VuYWJsZWZpcSh1bnNpZ25lZCBpbnQgZmlxbnIpCit7CisJZWNhcmRfdCAqZWMgPSBzbG90X3RvX2VjYXJkKGZpcW5yKTsKKworCWlmIChlYykgeworCQlpZiAoIWVjLT5vcHMpCisJCQllYy0+b3BzID0gJmVjYXJkX2RlZmF1bHRfb3BzOworCisJCWlmIChlYy0+Y2xhaW1lZCAmJiBlYy0+b3BzLT5maXFlbmFibGUpCisJCQllYy0+b3BzLT5maXFlbmFibGUoZWMsIGZpcW5yKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJlY2FyZDogcmVqZWN0aW5nIHJlcXVlc3QgdG8gIgorCQkJCSJlbmFibGUgRklRcyBmb3IgJWRcbiIsIGZpcW5yKTsKKwl9Cit9CisKK3ZvaWQgZWNhcmRfZGlzYWJsZWZpcSh1bnNpZ25lZCBpbnQgZmlxbnIpCit7CisJZWNhcmRfdCAqZWMgPSBzbG90X3RvX2VjYXJkKGZpcW5yKTsKKworCWlmIChlYykgeworCQlpZiAoIWVjLT5vcHMpCisJCQllYy0+b3BzID0gJmVjYXJkX2RlZmF1bHRfb3BzOworCisJCWlmIChlYy0+b3BzLT5maXFkaXNhYmxlKQorCQkJZWMtPm9wcy0+ZmlxZGlzYWJsZShlYywgZmlxbnIpOworCX0KK30KKworc3RhdGljIHZvaWQgZWNhcmRfZHVtcF9pcnFfc3RhdGUodm9pZCkKK3sKKwllY2FyZF90ICplYzsKKworCXByaW50aygiRXhwYW5zaW9uIGNhcmQgSVJRIHN0YXRlOlxuIik7CisKKwlmb3IgKGVjID0gY2FyZHM7IGVjOyBlYyA9IGVjLT5uZXh0KSB7CisJCWlmIChlYy0+c2xvdF9ubyA9PSA4KQorCQkJY29udGludWU7CisKKwkJcHJpbnRrKCIgICVkOiAlc2NsYWltZWQsICIsCisJCSAgICAgICBlYy0+c2xvdF9ubywgZWMtPmNsYWltZWQgPyAiIiA6ICJub3QgIik7CisKKwkJaWYgKGVjLT5vcHMgJiYgZWMtPm9wcy0+aXJxcGVuZGluZyAmJgorCQkgICAgZWMtPm9wcyAhPSAmZWNhcmRfZGVmYXVsdF9vcHMpCisJCQlwcmludGsoImlycSAlc3BlbmRpbmdcbiIsCisJCQkgICAgICAgZWMtPm9wcy0+aXJxcGVuZGluZyhlYykgPyAiIiA6ICJub3QgIik7CisJCWVsc2UKKwkJCXByaW50aygiaXJxYWRkciAlcCwgbWFzayA9ICUwMlgsIHN0YXR1cyA9ICUwMlhcbiIsCisJCQkgICAgICAgZWMtPmlycWFkZHIsIGVjLT5pcnFtYXNrLCByZWFkYihlYy0+aXJxYWRkcikpOworCX0KK30KKworc3RhdGljIHZvaWQgZWNhcmRfY2hlY2tfbG9ja3VwKHN0cnVjdCBpcnFkZXNjICpkZXNjKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Q7CisJc3RhdGljIGludCBsb2NrdXA7CisKKwkvKgorCSAqIElmIHRoZSB0aW1lciBpbnRlcnJ1cHQgaGFzIG5vdCBydW4gc2luY2UgdGhlIGxhc3QgbWlsbGlvbgorCSAqIHVucmVjb2duaXNlZCBleHBhbnNpb24gY2FyZCBpbnRlcnJ1cHRzLCB0aGVuIHRoZXJlIGlzCisJICogc29tZXRoaW5nIHNlcmlvdXNseSB3cm9uZy4gIERpc2FibGUgdGhlIGV4cGFuc2lvbiBjYXJkCisJICogaW50ZXJydXB0cyBzbyBhdCBsZWFzdCB3ZSBjYW4gY29udGludWUuCisJICoKKwkgKiBNYXliZSB3ZSBvdWdodCB0byBzdGFydCBhIHRpbWVyIHRvIHJlLWVuYWJsZSB0aGVtIHNvbWUgdGltZQorCSAqIGxhdGVyPworCSAqLworCWlmIChsYXN0ID09IGppZmZpZXMpIHsKKwkJbG9ja3VwICs9IDE7CisJCWlmIChsb2NrdXAgPiAxMDAwMDAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlxuSW50ZXJydXB0IGxvY2t1cCBkZXRlY3RlZCAtICIKKwkJCSAgICAgICAiZGlzYWJsaW5nIGFsbCBleHBhbnNpb24gY2FyZCBpbnRlcnJ1cHRzXG4iKTsKKworCQkJZGVzYy0+Y2hpcC0+bWFzayhJUlFfRVhQQU5TSU9OQ0FSRCk7CisJCQllY2FyZF9kdW1wX2lycV9zdGF0ZSgpOworCQl9CisJfSBlbHNlCisJCWxvY2t1cCA9IDA7CisKKwkvKgorCSAqIElmIHdlIGRpZCBub3QgcmVjb2duaXNlIHRoZSBzb3VyY2Ugb2YgdGhpcyBpbnRlcnJ1cHQsCisJICogd2FybiB0aGUgdXNlciwgYnV0IGRvbid0IGZsb29kIHRoZSB1c2VyIHdpdGggdGhlc2UgbWVzc2FnZXMuCisJICovCisJaWYgKCFsYXN0IHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdCArIDUqSFopKSB7CisJCWxhc3QgPSBqaWZmaWVzOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbnJlY29nbmlzZWQgaW50ZXJydXB0IGZyb20gYmFja3BsYW5lXG4iKTsKKwkJZWNhcmRfZHVtcF9pcnFfc3RhdGUoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitlY2FyZF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZWNhcmRfdCAqZWM7CisJaW50IGNhbGxlZCA9IDA7CisKKwlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CisJZm9yIChlYyA9IGNhcmRzOyBlYzsgZWMgPSBlYy0+bmV4dCkgeworCQlpbnQgcGVuZGluZzsKKworCQlpZiAoIWVjLT5jbGFpbWVkIHx8IGVjLT5pcnEgPT0gTk9fSVJRIHx8IGVjLT5zbG90X25vID09IDgpCisJCQljb250aW51ZTsKKworCQlpZiAoZWMtPm9wcyAmJiBlYy0+b3BzLT5pcnFwZW5kaW5nKQorCQkJcGVuZGluZyA9IGVjLT5vcHMtPmlycXBlbmRpbmcoZWMpOworCQllbHNlCisJCQlwZW5kaW5nID0gZWNhcmRfZGVmYXVsdF9vcHMuaXJxcGVuZGluZyhlYyk7CisKKwkJaWYgKHBlbmRpbmcpIHsKKwkJCXN0cnVjdCBpcnFkZXNjICpkID0gaXJxX2Rlc2MgKyBlYy0+aXJxOworCQkJZC0+aGFuZGxlKGVjLT5pcnEsIGQsIHJlZ3MpOworCQkJY2FsbGVkICsrOworCQl9CisJfQorCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOworCisJaWYgKGNhbGxlZCA9PSAwKQorCQllY2FyZF9jaGVja19sb2NrdXAoZGVzYyk7Cit9CisKKyNpZmRlZiBIQVNfRVhQTUFTSworc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJpb3JpdHlfbWFza3NbXSA9Cit7CisJMHhmMCwgMHhmMSwgMHhmMywgMHhmNywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlyc3Rfc2V0W10gPQoreworCTB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsCisJMHgwMywgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMAorfTsKKworc3RhdGljIHZvaWQKK2VjYXJkX2lycWV4cF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RhdHVzbWFzayA9IDE1OworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBfX3Jhd19yZWFkYihFWFBNQVNLX1NUQVRVUykgJiBzdGF0dXNtYXNrOworCWlmIChzdGF0dXMpIHsKKwkJdW5zaWduZWQgaW50IHNsb3QgPSBmaXJzdF9zZXRbc3RhdHVzXTsKKwkJZWNhcmRfdCAqZWMgPSBzbG90X3RvX2VjYXJkKHNsb3QpOworCisJCWlmIChlYy0+Y2xhaW1lZCkgeworCQkJc3RydWN0IGlycWRlc2MgKmQgPSBpcnFkZXNjICsgZWMtPmlycTsKKwkJCS8qCisJCQkgKiB0aGlzIHVnbHkgY29kZSBpcyBzbyB0aGF0IHdlIGNhbiBvcGVyYXRlIGEKKwkJCSAqIHByaW9yaXRvcmlzaW5nIHN5c3RlbToKKwkJCSAqCisJCQkgKiBDYXJkIDAgCWhpZ2hlc3QgcHJpb3JpdHkKKwkJCSAqIENhcmQgMQorCQkJICogQ2FyZCAyCisJCQkgKiBDYXJkIDMJbG93ZXN0IHByaW9yaXR5CisJCQkgKgorCQkJICogU2VyaWFsIGNhcmRzIHNob3VsZCBnbyBpbiAwLzEsIGV0aGVybmV0L3Njc2kgaW4gMi8zCisJCQkgKiBvdGhlcndpc2UgeW91IHdpbGwgbG9zZSBzZXJpYWwgZGF0YSBhdCBoaWdoIHNwZWVkcyEKKwkJCSAqLworCQkJZC0+aGFuZGxlKGVjLT5pcnEsIGQsIHJlZ3MpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FyZCVkOiBpbnRlcnJ1cHQgZnJvbSB1bmNsYWltZWQgIgorCQkJICAgICAgICJjYXJkPz8/XG4iLCBzbG90KTsKKwkJCWhhdmVfZXhwbWFzayAmPSB+KDEgPDwgc2xvdCk7CisJCQlfX3Jhd193cml0ZWIoaGF2ZV9leHBtYXNrLCBFWFBNQVNLX0VOQUJMRSk7CisJCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2lsZCBpbnRlcnJ1cHQgZnJvbSBiYWNrcGxhbmUgKG1hc2tzKVxuIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVjYXJkX3Byb2JlaXJxaHcodm9pZCkKK3sKKwllY2FyZF90ICplYzsKKwlpbnQgZm91bmQ7CisKKwlfX3Jhd193cml0ZWIoMHgwMCwgRVhQTUFTS19FTkFCTEUpOworCV9fcmF3X3dyaXRlYigweGZmLCBFWFBNQVNLX1NUQVRVUyk7CisJZm91bmQgPSAoX19yYXdfcmVhZGIoRVhQTUFTS19TVEFUVVMpICYgMTUpID09IDA7CisJX19yYXdfd3JpdGViKDB4ZmYsIEVYUE1BU0tfRU5BQkxFKTsKKworCWlmIChmb3VuZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5zaW9uIGNhcmQgaW50ZXJydXB0ICIKKwkJICAgICAgICJtYW5hZ2VtZW50IGhhcmR3YXJlIGZvdW5kXG4iKTsKKworCQkvKiBmb3IgZWFjaCBjYXJkIHByZXNlbnQsIHNldCBhIGJpdCB0byAnMScgKi8KKwkJaGF2ZV9leHBtYXNrID0gMHg4MDAwMDAwMDsKKworCQlmb3IgKGVjID0gY2FyZHM7IGVjOyBlYyA9IGVjLT5uZXh0KQorCQkJaGF2ZV9leHBtYXNrIHw9IDEgPDwgZWMtPnNsb3Rfbm87CisKKwkJX19yYXdfd3JpdGViKGhhdmVfZXhwbWFzaywgRVhQTUFTS19FTkFCTEUpOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKyNlbHNlCisjZGVmaW5lIGVjYXJkX2lycWV4cF9oYW5kbGVyIE5VTEwKKyNkZWZpbmUgZWNhcmRfcHJvYmVpcnFodygpICgwKQorI2VuZGlmCisKKyNpZm5kZWYgSU9fRUNfTUVNQzhfQkFTRQorI2RlZmluZSBJT19FQ19NRU1DOF9CQVNFIDAKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgX19lY2FyZF9hZGRyZXNzKGVjYXJkX3QgKmVjLCBjYXJkX3R5cGVfdCB0eXBlLCBjYXJkX3NwZWVkX3Qgc3BlZWQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKKwlpbnQgc2xvdCA9IGVjLT5zbG90X25vOworCisJaWYgKGVjLT5zbG90X25vID09IDgpCisJCXJldHVybiBJT19FQ19NRU1DOF9CQVNFOworCisJZWN0Y3IgJj0gfigxIDw8IHNsb3QpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFQ0FSRF9NRU1DOgorCQlpZiAoc2xvdCA8IDQpCisJCQlhZGRyZXNzID0gSU9fRUNfTUVNQ19CQVNFICsgKHNsb3QgPDwgMTIpOworCQlicmVhazsKKworCWNhc2UgRUNBUkRfSU9DOgorCQlpZiAoc2xvdCA8IDQpCisJCQlhZGRyZXNzID0gSU9fRUNfSU9DX0JBU0UgKyAoc2xvdCA8PCAxMik7CisjaWZkZWYgSU9fRUNfSU9DNF9CQVNFCisJCWVsc2UKKwkJCWFkZHJlc3MgPSBJT19FQ19JT0M0X0JBU0UgKyAoKHNsb3QgLSA0KSA8PCAxMik7CisjZW5kaWYKKwkJaWYgKGFkZHJlc3MpCisJCQlhZGRyZXNzICs9ICBzcGVlZCA8PCAxNzsKKwkJYnJlYWs7CisKKyNpZmRlZiBJT19FQ19FQVNJX0JBU0UKKwljYXNlIEVDQVJEX0VBU0k6CisJCWFkZHJlc3MgPSBJT19FQ19FQVNJX0JBU0UgKyAoc2xvdCA8PCAyMik7CisJCWlmIChzcGVlZCA9PSBFQ0FSRF9GQVNUKQorCQkJZWN0Y3IgfD0gMSA8PCBzbG90OworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworI2lmZGVmIElPTURfRUNUQ1IKKwlpb21kX3dyaXRlYihlY3RjciwgSU9NRF9FQ1RDUik7CisjZW5kaWYKKwlyZXR1cm4gYWRkcmVzczsKK30KKworc3RhdGljIGludCBlY2FyZF9wcmludHMoY2hhciAqYnVmZmVyLCBlY2FyZF90ICplYykKK3sKKwljaGFyICpzdGFydCA9IGJ1ZmZlcjsKKworCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiAgJWQ6ICVzICIsIGVjLT5zbG90X25vLAorCQkJICBlYy0+dHlwZSA9PSBFQ0FSRF9FQVNJID8gIkVBU0kiIDogIiAgICAiKTsKKworCWlmIChlYy0+Y2lkLmlkID09IDApIHsKKwkJc3RydWN0IGluX2NodW5rX2RpciBpbmNkOworCisJCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlslMDRYOiUwNFhdICIsCisJCQllYy0+Y2lkLm1hbnVmYWN0dXJlciwgZWMtPmNpZC5wcm9kdWN0KTsKKworCQlpZiAoIWVjLT5jYXJkX2Rlc2MgJiYgZWMtPmNpZC5jZCAmJgorCQkgICAgZWNhcmRfcmVhZGNodW5rKCZpbmNkLCBlYywgMHhmNSwgMCkpIHsKKwkJCWVjLT5jYXJkX2Rlc2MgPSBrbWFsbG9jKHN0cmxlbihpbmNkLmQuc3RyaW5nKSsxLCBHRlBfS0VSTkVMKTsKKworCQkJaWYgKGVjLT5jYXJkX2Rlc2MpCisJCQkJc3RyY3B5KChjaGFyICopZWMtPmNhcmRfZGVzYywgaW5jZC5kLnN0cmluZyk7CisJCX0KKworCQlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgZWMtPmNhcmRfZGVzYyA/IGVjLT5jYXJkX2Rlc2MgOiAiKnVua25vd24qIik7CisJfSBlbHNlCisJCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlNpbXBsZSBjYXJkICVkXG4iLCBlYy0+Y2lkLmlkKTsKKworCXJldHVybiBidWZmZXIgLSBzdGFydDsKK30KKworc3RhdGljIGludCBnZXRfZWNhcmRfZGV2X2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IHBvcywgaW50IGNvdW50KQoreworCWVjYXJkX3QgKmVjID0gY2FyZHM7CisJb2ZmX3QgYXQgPSAwOworCWludCBsZW4sIGNudDsKKworCWNudCA9IDA7CisJd2hpbGUgKGVjICYmIGNvdW50ID4gY250KSB7CisJCWxlbiA9IGVjYXJkX3ByaW50cyhidWYsIGVjKTsKKwkJYXQgKz0gbGVuOworCQlpZiAoYXQgPj0gcG9zKSB7CisJCQlpZiAoISpzdGFydCkgeworCQkJCSpzdGFydCA9IGJ1ZiArIChwb3MgLSAoYXQgLSBsZW4pKTsKKwkJCQljbnQgPSBhdCAtIHBvczsKKwkJCX0gZWxzZQorCQkJCWNudCArPSBsZW47CisJCQlidWYgKz0gbGVuOworCQl9CisJCWVjID0gZWMtPm5leHQ7CisJfQorCXJldHVybiAoY291bnQgPiBjbnQpID8gY250IDogY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYnVzX2VjYXJkX2RpciA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGVjYXJkX3Byb2NfaW5pdCh2b2lkKQoreworCXByb2NfYnVzX2VjYXJkX2RpciA9IHByb2NfbWtkaXIoImVjYXJkIiwgcHJvY19idXMpOworCWNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImRldmljZXMiLCAwLCBwcm9jX2J1c19lY2FyZF9kaXIsCisJCWdldF9lY2FyZF9kZXZfaW5mbyk7Cit9CisKKyNkZWZpbmUgZWNfc2V0X3Jlc291cmNlKGVjLG5yLHN0LHN6KQkJCQlcCisJZG8gewkJCQkJCQlcCisJCShlYyktPnJlc291cmNlW25yXS5uYW1lID0gZWMtPmRldi5idXNfaWQ7CVwKKwkJKGVjKS0+cmVzb3VyY2VbbnJdLnN0YXJ0ID0gc3Q7CQkJXAorCQkoZWMpLT5yZXNvdXJjZVtucl0uZW5kID0gKHN0KSArIChzeikgLSAxOwlcCisJCShlYyktPnJlc291cmNlW25yXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgX19pbml0IGVjYXJkX2ZyZWVfY2FyZChzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVDQVJEX05VTV9SRVNPVVJDRVM7IGkrKykKKwkJaWYgKGVjLT5yZXNvdXJjZVtpXS5mbGFncykKKwkJCXJlbGVhc2VfcmVzb3VyY2UoJmVjLT5yZXNvdXJjZVtpXSk7CisKKwlrZnJlZShlYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKl9faW5pdCBlY2FyZF9hbGxvY19jYXJkKGludCB0eXBlLCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwlpbnQgaTsKKworCWVjID0ga21hbGxvYyhzaXplb2YoZWNhcmRfdCksIEdGUF9LRVJORUwpOworCWlmICghZWMpIHsKKwkJZWMgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG5vbWVtOworCX0KKworCW1lbXNldChlYywgMCwgc2l6ZW9mKGVjYXJkX3QpKTsKKworCWVjLT5zbG90X25vID0gc2xvdDsKKwllYy0+dHlwZSA9IHR5cGU7CisJZWMtPmlycSA9IE5PX0lSUTsKKwllYy0+ZmlxID0gTk9fSVJROworCWVjLT5kbWEgPSBOT19ETUE7CisJZWMtPm9wcyA9ICZlY2FyZF9kZWZhdWx0X29wczsKKworCXNucHJpbnRmKGVjLT5kZXYuYnVzX2lkLCBzaXplb2YoZWMtPmRldi5idXNfaWQpLCAiZWNhcmQlZCIsIHNsb3QpOworCWVjLT5kZXYucGFyZW50ID0gTlVMTDsKKwllYy0+ZGV2LmJ1cyA9ICZlY2FyZF9idXNfdHlwZTsKKwllYy0+ZGV2LmRtYV9tYXNrID0gJmVjLT5kbWFfbWFzazsKKwllYy0+ZG1hX21hc2sgPSAodTY0KTB4ZmZmZmZmZmY7CisKKwlpZiAoc2xvdCA8IDQpIHsKKwkJZWNfc2V0X3Jlc291cmNlKGVjLCBFQ0FSRF9SRVNfTUVNQywKKwkJCQlQT0RTTE9UX01FTUNfQkFTRSArIChzbG90IDw8IDE0KSwKKwkJCQlQT0RTTE9UX01FTUNfU0laRSk7CisJCWJhc2UgPSBQT0RTTE9UX0lPQzBfQkFTRSArIChzbG90IDw8IDE0KTsKKwl9IGVsc2UKKwkJYmFzZSA9IFBPRFNMT1RfSU9DNF9CQVNFICsgKChzbG90IC0gNCkgPDwgMTQpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfUlBDCisJaWYgKHNsb3QgPCA4KSB7CisJCWVjX3NldF9yZXNvdXJjZShlYywgRUNBUkRfUkVTX0VBU0ksCisJCQkJUE9EU0xPVF9FQVNJX0JBU0UgKyAoc2xvdCA8PCAyNCksCisJCQkJUE9EU0xPVF9FQVNJX1NJWkUpOworCX0KKworCWlmIChzbG90ID09IDgpIHsKKwkJZWNfc2V0X3Jlc291cmNlKGVjLCBFQ0FSRF9SRVNfTUVNQywgTkVUU0xPVF9CQVNFLCBORVRTTE9UX1NJWkUpOworCX0gZWxzZQorI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDw9IEVDQVJEX1JFU19JT0NTWU5DIC0gRUNBUkRfUkVTX0lPQ1NMT1c7IGkrKykKKwkJZWNfc2V0X3Jlc291cmNlKGVjLCBpICsgRUNBUkRfUkVTX0lPQ1NMT1csCisJCQkJYmFzZSArIChpIDw8IDE5KSwgUE9EU0xPVF9JT0NfU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRUNBUkRfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCWlmIChlYy0+cmVzb3VyY2VbaV0uZmxhZ3MgJiYKKwkJICAgIHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmZWMtPnJlc291cmNlW2ldKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVzb3VyY2Uocykgbm90IGF2YWlsYWJsZVxuIiwKKwkJCQllYy0+ZGV2LmJ1c19pZCk7CisJCQllYy0+cmVzb3VyY2VbaV0uZW5kIC09IGVjLT5yZXNvdXJjZVtpXS5zdGFydDsKKwkJCWVjLT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7CisJCQllYy0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOworCQl9CisJfQorCisgbm9tZW06CisJcmV0dXJuIGVjOworfQorCitzdGF0aWMgc3NpemVfdCBlY2FyZF9zaG93X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGVjLT5pcnEpOworfQorCitzdGF0aWMgc3NpemVfdCBlY2FyZF9zaG93X2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGVjLT5kbWEpOworfQorCitzdGF0aWMgc3NpemVfdCBlY2FyZF9zaG93X3Jlc291cmNlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJY2hhciAqc3RyID0gYnVmOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVDQVJEX05VTV9SRVNPVVJDRVM7IGkrKykKKwkJc3RyICs9IHNwcmludGYoc3RyLCAiJTA4bHggJTA4bHggJTA4bHhcbiIsCisJCQkJZWMtPnJlc291cmNlW2ldLnN0YXJ0LAorCQkJCWVjLT5yZXNvdXJjZVtpXS5lbmQsCisJCQkJZWMtPnJlc291cmNlW2ldLmZsYWdzKTsKKworCXJldHVybiBzdHIgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVjYXJkX3Nob3dfdmVuZG9yKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZWMtPmNpZC5tYW51ZmFjdHVyZXIpOworfQorCitzdGF0aWMgc3NpemVfdCBlY2FyZF9zaG93X2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGVjLT5jaWQucHJvZHVjdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVjYXJkX3Nob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGVjLT50eXBlID09IEVDQVJEX0VBU0kgPyAiRUFTSSIgOiAiSU9DIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBlY2FyZF9kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFIoZGV2aWNlLCAgIFNfSVJVR08sIGVjYXJkX3Nob3dfZGV2aWNlLCAgICBOVUxMKSwKKwlfX0FUVFIoZG1hLCAgICAgIFNfSVJVR08sIGVjYXJkX3Nob3dfZG1hLCAgICAgICBOVUxMKSwKKwlfX0FUVFIoaXJxLCAgICAgIFNfSVJVR08sIGVjYXJkX3Nob3dfaXJxLCAgICAgICBOVUxMKSwKKwlfX0FUVFIocmVzb3VyY2UsIFNfSVJVR08sIGVjYXJkX3Nob3dfcmVzb3VyY2VzLCBOVUxMKSwKKwlfX0FUVFIodHlwZSwgICAgIFNfSVJVR08sIGVjYXJkX3Nob3dfdHlwZSwgICAgICBOVUxMKSwKKwlfX0FUVFIodmVuZG9yLCAgIFNfSVJVR08sIGVjYXJkX3Nob3dfdmVuZG9yLCAgICBOVUxMKSwKKwlfX0FUVFJfTlVMTCwKK307CisKKworaW50IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRUNBUkRfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCWlmIChlY2FyZF9yZXNvdXJjZV9lbmQoZWMsIGkpICYmCisJCSAgICAhcmVxdWVzdF9tZW1fcmVnaW9uKGVjYXJkX3Jlc291cmNlX3N0YXJ0KGVjLCBpKSwKKwkJCQkJZWNhcmRfcmVzb3VyY2VfbGVuKGVjLCBpKSwKKwkJCQkJZWMtPmRldi5kcml2ZXItPm5hbWUpKSB7CisJCQllcnIgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChlcnIpIHsKKwkJd2hpbGUgKGktLSkKKwkJCWlmIChlY2FyZF9yZXNvdXJjZV9lbmQoZWMsIGkpKQorCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgaSksCisJCQkJCQkgICBlY2FyZF9yZXNvdXJjZV9sZW4oZWMsIGkpKTsKKwl9CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woZWNhcmRfcmVxdWVzdF9yZXNvdXJjZXMpOworCit2b2lkIGVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRUNBUkRfTlVNX1JFU09VUkNFUzsgaSsrKQorCQlpZiAoZWNhcmRfcmVzb3VyY2VfZW5kKGVjLCBpKSkKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgaSksCisJCQkJCSAgIGVjYXJkX3Jlc291cmNlX2xlbihlYywgaSkpOworfQorRVhQT1JUX1NZTUJPTChlY2FyZF9yZWxlYXNlX3Jlc291cmNlcyk7CisKKy8qCisgKiBQcm9iZSBmb3IgYW4gZXhwYW5zaW9uIGNhcmQuCisgKgorICogSWYgYml0IDEgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGNhcmQgaXMgc2V0LCB0aGVuIHRoZQorICogY2FyZCBkb2VzIG5vdCBleGlzdC4KKyAqLworc3RhdGljIGludCBfX2luaXQKK2VjYXJkX3Byb2JlKGludCBzbG90LCBjYXJkX3R5cGVfdCB0eXBlKQoreworCWVjYXJkX3QgKiplY3A7CisJZWNhcmRfdCAqZWM7CisJc3RydWN0IGV4X2VjaWQgY2lkOworCWludCBpLCByYzsKKworCWVjID0gZWNhcmRfYWxsb2NfY2FyZCh0eXBlLCBzbG90KTsKKwlpZiAoSVNfRVJSKGVjKSkgeworCQlyYyA9IFBUUl9FUlIoZWMpOworCQlnb3RvIG5vbWVtOworCX0KKworCXJjID0gLUVOT0RFVjsKKwlpZiAoKGVjLT5wb2RhZGRyID0gZWNhcmRfYWRkcmVzcyhlYywgdHlwZSwgRUNBUkRfU1lOQykpID09IDApCisJCWdvdG8gbm9kZXY7CisKKwljaWQucl96ZXJvID0gMTsKKwllY2FyZF9yZWFkYnl0ZXMoJmNpZCwgZWMsIDAsIDE2LCAwKTsKKwlpZiAoY2lkLnJfemVybykKKwkJZ290byBub2RldjsKKworCWVjLT5jaWQuaWQJPSBjaWQucl9pZDsKKwllYy0+Y2lkLmNkCT0gY2lkLnJfY2Q7CisJZWMtPmNpZC5pcwk9IGNpZC5yX2lzOworCWVjLT5jaWQudwk9IGNpZC5yX3c7CisJZWMtPmNpZC5tYW51ZmFjdHVyZXIgPSBlY2FyZF9nZXR1MTYoY2lkLnJfbWFudSk7CisJZWMtPmNpZC5wcm9kdWN0ID0gZWNhcmRfZ2V0dTE2KGNpZC5yX3Byb2QpOworCWVjLT5jaWQuY291bnRyeSA9IGNpZC5yX2NvdW50cnk7CisJZWMtPmNpZC5pcnFtYXNrID0gY2lkLnJfaXJxbWFzazsKKwllYy0+Y2lkLmlycW9mZiAgPSBlY2FyZF9nZXRzMjQoY2lkLnJfaXJxb2ZmKTsKKwllYy0+Y2lkLmZpcW1hc2sgPSBjaWQucl9maXFtYXNrOworCWVjLT5jaWQuZmlxb2ZmICA9IGVjYXJkX2dldHMyNChjaWQucl9maXFvZmYpOworCWVjLT5maXFhZGRyCT0KKwllYy0+aXJxYWRkcgk9ICh2b2lkIF9faW9tZW0gKilpb2FkZHIoZWMtPnBvZGFkZHIpOworCisJaWYgKGVjLT5jaWQuaXMpIHsKKwkJZWMtPmlycW1hc2sgPSBlYy0+Y2lkLmlycW1hc2s7CisJCWVjLT5pcnFhZGRyICs9IGVjLT5jaWQuaXJxb2ZmOworCQllYy0+ZmlxbWFzayA9IGVjLT5jaWQuZmlxbWFzazsKKwkJZWMtPmZpcWFkZHIgKz0gZWMtPmNpZC5maXFvZmY7CisJfSBlbHNlIHsKKwkJZWMtPmlycW1hc2sgPSAxOworCQllYy0+ZmlxbWFzayA9IDQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihibGFja2xpc3QpIC8gc2l6ZW9mKCpibGFja2xpc3QpOyBpKyspCisJCWlmIChibGFja2xpc3RbaV0ubWFudWZhY3R1cmVyID09IGVjLT5jaWQubWFudWZhY3R1cmVyICYmCisJCSAgICBibGFja2xpc3RbaV0ucHJvZHVjdCA9PSBlYy0+Y2lkLnByb2R1Y3QpIHsKKwkJCWVjLT5jYXJkX2Rlc2MgPSBibGFja2xpc3RbaV0udHlwZTsKKwkJCWJyZWFrOworCQl9CisKKwkvKgorCSAqIGhvb2sgdGhlIGludGVycnVwdCBoYW5kbGVycworCSAqLworCWlmIChzbG90IDwgOCkgeworCQllYy0+aXJxID0gMzIgKyBzbG90OworCQlzZXRfaXJxX2NoaXAoZWMtPmlycSwgJmVjYXJkX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoZWMtPmlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhlYy0+aXJxLCBJUlFGX1ZBTElEKTsKKwl9CisKKyNpZmRlZiBJT19FQ19NRU1DOF9CQVNFCisJaWYgKHNsb3QgPT0gOCkKKwkJZWMtPmlycSA9IDExOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfUlBDCisJLyogT24gUmlzY1BDLCBvbmx5IGZpcnN0IHR3byBzbG90cyBoYXZlIERNQSBjYXBhYmlsaXR5ICovCisJaWYgKHNsb3QgPCAyKQorCQllYy0+ZG1hID0gMiArIHNsb3Q7CisjZW5kaWYKKworCWZvciAoZWNwID0gJmNhcmRzOyAqZWNwOyBlY3AgPSAmKCplY3ApLT5uZXh0KTsKKworCSplY3AgPSBlYzsKKwlzbG90X3RvX2V4cGNhcmRbc2xvdF0gPSBlYzsKKworCWRldmljZV9yZWdpc3RlcigmZWMtPmRldik7CisKKwlyZXR1cm4gMDsKKworIG5vZGV2OgorCWVjYXJkX2ZyZWVfY2FyZChlYyk7Cisgbm9tZW06CisJcmV0dXJuIHJjOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgZXhwYW5zaW9uIGNhcmQgc3lzdGVtLgorICogTG9jYXRlIGFsbCBoYXJkd2FyZSAtIGludGVycnVwdCBtYW5hZ2VtZW50IGFuZAorICogYWN0dWFsIGNhcmRzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBlY2FyZF9pbml0KHZvaWQpCit7CisJaW50IHNsb3QsIGlycWh3LCByZXQ7CisKKwlyZXQgPSBrZXJuZWxfdGhyZWFkKGVjYXJkX3Rhc2ssIE5VTEwsIENMT05FX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFY2FyZDogdW5hYmxlIHRvIGNyZWF0ZSBrZXJuZWwgdGhyZWFkOiAlZFxuIiwKKwkJICAgICAgIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKCJQcm9iaW5nIGV4cGFuc2lvbiBjYXJkc1xuIik7CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgODsgc2xvdCArKykgeworCQlpZiAoZWNhcmRfcHJvYmUoc2xvdCwgRUNBUkRfRUFTSSkgPT0gLUVOT0RFVikKKwkJCWVjYXJkX3Byb2JlKHNsb3QsIEVDQVJEX0lPQyk7CisJfQorCisjaWZkZWYgSU9fRUNfTUVNQzhfQkFTRQorCWVjYXJkX3Byb2JlKDgsIEVDQVJEX0lPQyk7CisjZW5kaWYKKworCWlycWh3ID0gZWNhcmRfcHJvYmVpcnFodygpOworCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0VYUEFOU0lPTkNBUkQsCisJCQkJaXJxaHcgPyBlY2FyZF9pcnFleHBfaGFuZGxlciA6IGVjYXJkX2lycV9oYW5kbGVyKTsKKworCWVjYXJkX3Byb2NfaW5pdCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChlY2FyZF9pbml0KTsKKworLyoKKyAqCUVDQVJEICJidXMiCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgKgorZWNhcmRfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWRzLCBzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaWRzW2ldLm1hbnVmYWN0dXJlciAhPSA2NTUzNTsgaSsrKQorCQlpZiAoZWMtPmNpZC5tYW51ZmFjdHVyZXIgPT0gaWRzW2ldLm1hbnVmYWN0dXJlciAmJgorCQkgICAgZWMtPmNpZC5wcm9kdWN0ID09IGlkc1tpXS5wcm9kdWN0KQorCQkJcmV0dXJuIGlkcyArIGk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBlY2FyZF9kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoZGV2KTsKKwlzdHJ1Y3QgZWNhcmRfZHJpdmVyICpkcnYgPSBFQ0FSRF9EUlYoZGV2LT5kcml2ZXIpOworCWNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQ7CisJaW50IHJldDsKKworCWlkID0gZWNhcmRfbWF0Y2hfZGV2aWNlKGRydi0+aWRfdGFibGUsIGVjKTsKKworCWVjYXJkX2NsYWltKGVjKTsKKwlyZXQgPSBkcnYtPnByb2JlKGVjLCBpZCk7CisJaWYgKHJldCkKKwkJZWNhcmRfcmVsZWFzZShlYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlY2FyZF9kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJc3RydWN0IGVjYXJkX2RyaXZlciAqZHJ2ID0gRUNBUkRfRFJWKGRldi0+ZHJpdmVyKTsKKworCWRydi0+cmVtb3ZlKGVjKTsKKwllY2FyZF9yZWxlYXNlKGVjKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQmVmb3JlIHJlYm9vdGluZywgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZXhwYW5zaW9uIGNhcmQgaXMgaW4gYQorICogc2Vuc2libGUgc3RhdGUsIHNvIGl0IGNhbiBiZSByZS1kZXRlY3RlZC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QKKyAqIHBhZ2Ugb2YgdGhlIFJPTSBtdXN0IGJlIHZpc2libGUuICBXZSBjYWxsIHRoZSBleHBhbnNpb24gY2FyZHMgcmVzZXQKKyAqIGhhbmRsZXIsIGlmIGFueS4KKyAqLworc3RhdGljIHZvaWQgZWNhcmRfZHJ2X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJc3RydWN0IGVjYXJkX2RyaXZlciAqZHJ2ID0gRUNBUkRfRFJWKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgZWNhcmRfcmVxdWVzdCByZXE7CisKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihlYyk7CisJZWNhcmRfcmVsZWFzZShlYyk7CisKKwkvKgorCSAqIElmIHRoaXMgY2FyZCBoYXMgYSBsb2FkZXIsIGNhbGwgdGhlIHJlc2V0IGhhbmRsZXIuCisJICovCisJaWYgKGVjLT5sb2FkZXIpIHsKKwkJcmVxLmZuID0gZWNhcmRfdGFza19yZXNldDsKKwkJcmVxLmVjID0gZWM7CisJCWVjYXJkX2NhbGwoJnJlcSk7CisJfQorfQorCitpbnQgZWNhcmRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBlY2FyZF9kcml2ZXIgKmRydikKK3sKKwlkcnYtPmRydi5idXMgPSAmZWNhcmRfYnVzX3R5cGU7CisJZHJ2LT5kcnYucHJvYmUgPSBlY2FyZF9kcnZfcHJvYmU7CisJZHJ2LT5kcnYucmVtb3ZlID0gZWNhcmRfZHJ2X3JlbW92ZTsKKwlkcnYtPmRydi5zaHV0ZG93biA9IGVjYXJkX2Rydl9zaHV0ZG93bjsKKworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJ2KTsKK30KKwordm9pZCBlY2FyZF9yZW1vdmVfZHJpdmVyKHN0cnVjdCBlY2FyZF9kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcnYpOworfQorCitzdGF0aWMgaW50IGVjYXJkX21hdGNoKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpfZHJ2KQoreworCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoX2Rldik7CisJc3RydWN0IGVjYXJkX2RyaXZlciAqZHJ2ID0gRUNBUkRfRFJWKF9kcnYpOworCWludCByZXQ7CisKKwlpZiAoZHJ2LT5pZF90YWJsZSkgeworCQlyZXQgPSBlY2FyZF9tYXRjaF9kZXZpY2UoZHJ2LT5pZF90YWJsZSwgZWMpICE9IE5VTEw7CisJfSBlbHNlIHsKKwkJcmV0ID0gZWMtPmNpZC5pZCA9PSBkcnYtPmlkOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBidXNfdHlwZSBlY2FyZF9idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAiZWNhcmQiLAorCS5kZXZfYXR0cnMJPSBlY2FyZF9kZXZfYXR0cnMsCisJLm1hdGNoCQk9IGVjYXJkX21hdGNoLAorfTsKKworc3RhdGljIGludCBlY2FyZF9idXNfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJmVjYXJkX2J1c190eXBlKTsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwoZWNhcmRfYnVzX2luaXQpOworCitFWFBPUlRfU1lNQk9MKGVjYXJkX3JlYWRjaHVuayk7CitFWFBPUlRfU1lNQk9MKF9fZWNhcmRfYWRkcmVzcyk7CitFWFBPUlRfU1lNQk9MKGVjYXJkX3JlZ2lzdGVyX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKGVjYXJkX3JlbW92ZV9kcml2ZXIpOworRVhQT1JUX1NZTUJPTChlY2FyZF9idXNfdHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI3YzMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwpAQCAtMCwwICsxLDc0NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NiwxOTk3LDE5OTggUnVzc2VsbCBLaW5nLgorICogIEFSTTcwMCBmaXggYnkgTWF0dGhldyBHb2Rib2x0IChsaW51eC11c2VyQHdpbGxvdGhld2lzcC5kZW1vbi5jby51aykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBMb3ctbGV2ZWwgdmVjdG9yIGludGVyZmFjZSByb3V0aW5lcworICoKKyAqICBOb3RlOiAgdGhlcmUgaXMgYSBTdHJvbmdBUk0gYnVnIGluIHRoZSBTVE1JQSBybiwge3JlZ3N9XiBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlcworICogIGl0IHRvIHNhdmUgd3JvbmcgdmFsdWVzLi4uICBCZSBhd2FyZSEKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9nbHVlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS92ZnBtYWNyb3MuaD4KKworI2luY2x1ZGUgImVudHJ5LWhlYWRlci5TIgorCisvKgorICogSW52YWxpZCBtb2RlIGhhbmRsZXJzCisgKi8KKwkubWFjcm8JaW52X2VudHJ5LCBzeW0sIHJlYXNvbgorCXN1YglzcCwgc3AsICNTX0ZSQU1FX1NJWkUJCUAgQWxsb2NhdGUgZnJhbWUgc2l6ZSBpbiBvbmUgZ28KKwlzdG1pYQlzcCwge3IwIC0gbHJ9CQkJQCBTYXZlIFhYWCByMCAtIGxyCisJbGRyCXI0LCAuTENcc3ltCisJbW92CXIxLCAjXHJlYXNvbgorCS5lbmRtCisKK19fcGFidF9pbnZhbGlkOgorCWludl9lbnRyeSBhYnQsIEJBRF9QUkVGRVRDSAorCWIJMWYKKworX19kYWJ0X2ludmFsaWQ6CisJaW52X2VudHJ5IGFidCwgQkFEX0RBVEEKKwliCTFmCisKK19faXJxX2ludmFsaWQ6CisJaW52X2VudHJ5IGlycSwgQkFEX0lSUQorCWIJMWYKKworX191bmRfaW52YWxpZDoKKwlpbnZfZW50cnkgdW5kLCBCQURfVU5ERUZJTlNUUgorCisxOgl6ZXJvX2ZwCisJbGRtaWEJcjQsIHtyNSAtIHI3fQkJCUAgR2V0IFhYWCBwYywgY3Bzciwgb2xkX3IwCisJYWRkCXI0LCBzcCwgI1NfUEMKKwlzdG1pYQlyNCwge3I1IC0gcjd9CQkJQCBTYXZlIFhYWCBwYywgY3Bzciwgb2xkX3IwCisJbW92CXIwLCBzcAorCWFuZAlyMiwgcjYsICMzMQkJCUAgaW50IG1vZGUKKwliCWJhZF9tb2RlCisKKy8qCisgKiBTVkMgbW9kZSBoYW5kbGVycworICovCisJLm1hY3JvCXN2Y19lbnRyeSwgc3ltCisJc3ViCXNwLCBzcCwgI1NfRlJBTUVfU0laRQorCXN0bWlhCXNwLCB7cjAgLSByMTJ9CQkJQCBzYXZlIHIwIC0gcjEyCisJbGRyCXIyLCAuTENcc3ltCisJYWRkCXIwLCBzcCwgI1NfRlJBTUVfU0laRQorCWxkbWlhCXIyLCB7cjIgLSByNH0JCQlAIGdldCBwYywgY3BzcgorCWFkZAlyNSwgc3AsICNTX1NQCisJbW92CXIxLCBscgorCisJQAorCUAgV2UgYXJlIG5vdyByZWFkeSB0byBmaWxsIGluIHRoZSByZW1haW5pbmcgYmxhbmtzIG9uIHRoZSBzdGFjazoKKwlACisJQCAgcjAgLSBzcF9zdmMKKwlAICByMSAtIGxyX3N2YworCUAgIHIyIC0gbHJfPGV4Y2VwdGlvbj4sIGFscmVhZHkgZml4ZWQgdXAgZm9yIGNvcnJlY3QgcmV0dXJuL3Jlc3RhcnQKKwlAICByMyAtIHNwc3JfPGV4Y2VwdGlvbj4KKwlAICByNCAtIG9yaWdfcjAgKHNlZSBwdF9yZWdzIGRlZmluaXRpb24gaW4gcHRyYWNlLmgpCisJQAorCXN0bWlhCXI1LCB7cjAgLSByNH0KKwkuZW5kbQorCisJLmFsaWduCTUKK19fZGFidF9zdmM6CisJc3ZjX2VudHJ5IGFidAorCisJQAorCUAgZ2V0IHJlYWR5IHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIGFwcHJvcHJpYXRlCisJQAorCW1ycwlyOSwgY3BzcgorCXRzdAlyMywgI1BTUl9JX0JJVAorCWJpY2VxCXI5LCByOSwgI1BTUl9JX0JJVAorCisJQAorCUAgQ2FsbCB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGFib3J0IGhhbmRsZXI6CisJQAorCUAgIHIyIC0gYWJvcnRlZCBjb250ZXh0IHBjCisJQCAgcjMgLSBhYm9ydGVkIGNvbnRleHQgY3BzcgorCUAKKwlAIFRoZSBhYm9ydCBoYW5kbGVyIG11c3QgcmV0dXJuIHRoZSBhYm9ydGVkIGFkZHJlc3MgaW4gcjAsIGFuZAorCUAgdGhlIGZhdWx0IHN0YXR1cyByZWdpc3RlciBpbiByMS4gIHI5IG11c3QgYmUgcHJlc2VydmVkLgorCUAKKyNpZmRlZiBNVUxUSV9BQk9SVAorCWxkcglyNCwgLkxDcHJvY2ZucworCW1vdglsciwgcGMKKwlsZHIJcGMsIFtyNF0KKyNlbHNlCisJYmwJQ1BVX0FCT1JUX0hBTkRMRVIKKyNlbmRpZgorCisJQAorCUAgc2V0IGRlc2lyZWQgSVJRIHN0YXRlLCB0aGVuIGNhbGwgbWFpbiBoYW5kbGVyCisJQAorCW1zcgljcHNyX2MsIHI5CisJbW92CXIyLCBzcAorCWJsCWRvX0RhdGFBYm9ydAorCisJQAorCUAgSVJRcyBvZmYgYWdhaW4gYmVmb3JlIHB1bGxpbmcgcHJlc2VydmVkIGRhdGEgb2ZmIHRoZSBzdGFjaworCUAKKwlkaXNhYmxlX2lycSByMAorCisJQAorCUAgcmVzdG9yZSBTUFNSIGFuZCByZXN0YXJ0IHRoZSBpbnN0cnVjdGlvbgorCUAKKwlsZHIJcjAsIFtzcCwgI1NfUFNSXQorCW1zcglzcHNyX2N4c2YsIHIwCisJbGRtaWEJc3AsIHtyMCAtIHBjfV4JCQlAIGxvYWQgcjAgLSBwYywgY3BzcgorCisJLmFsaWduCTUKK19faXJxX3N2YzoKKwlzdmNfZW50cnkgaXJxCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlnZXRfdGhyZWFkX2luZm8gcjgKKwlsZHIJcjksIFtyOCwgI1RJX1BSRUVNUFRdCQlAIGdldCBwcmVlbXB0IGNvdW50CisJYWRkCXI3LCByOSwgIzEJCQlAIGluY3JlbWVudCBpdAorCXN0cglyNywgW3I4LCAjVElfUFJFRU1QVF0KKyNlbmRpZgorMToJZ2V0X2lycW5yX2FuZF9iYXNlIHIwLCByNiwgcjUsIGxyCisJbW92bmUJcjEsIHNwCisJQAorCUAgcm91dGluZSBjYWxsZWQgd2l0aCByMCA9IGlycSBudW1iZXIsIHIxID0gc3RydWN0IHB0X3JlZ3MgKgorCUAKKwlhZHJuZQlsciwgMWIKKwlibmUJYXNtX2RvX0lSUQorI2lmZGVmIENPTkZJR19QUkVFTVBUCisJbGRyCXIwLCBbcjgsICNUSV9GTEFHU10JCUAgZ2V0IGZsYWdzCisJdHN0CXIwLCAjX1RJRl9ORUVEX1JFU0NIRUQKKwlibG5lCXN2Y19wcmVlbXB0CitwcmVlbXB0X3JldHVybjoKKwlsZHIJcjAsIFtyOCwgI1RJX1BSRUVNUFRdCQlAIHJlYWQgcHJlZW1wdCB2YWx1ZQorCXRlcQlyMCwgcjcKKwlzdHIJcjksIFtyOCwgI1RJX1BSRUVNUFRdCQlAIHJlc3RvcmUgcHJlZW1wdCBjb3VudAorCXN0cm5lCXIwLCBbcjAsIC1yMF0JCQlAIGJ1ZygpCisjZW5kaWYKKwlsZHIJcjAsIFtzcCwgI1NfUFNSXQkJQCBpcnFzIGFyZSBhbHJlYWR5IGRpc2FibGVkCisJbXNyCXNwc3JfY3hzZiwgcjAKKwlsZG1pYQlzcCwge3IwIC0gcGN9XgkJCUAgbG9hZCByMCAtIHBjLCBjcHNyCisKKwkubHRvcmcKKworI2lmZGVmIENPTkZJR19QUkVFTVBUCitzdmNfcHJlZW1wdDoKKwl0ZXEJcjksICMwCQkJCUAgd2FzIHByZWVtcHQgY291bnQgPSAwCisJbGRyZXEJcjYsIC5MQ2lycV9zdGF0CisJbW92bmUJcGMsIGxyCQkJCUAgbm8KKwlsZHIJcjAsIFtyNiwgIzRdCQkJQCBsb2NhbF9pcnFfY291bnQKKwlsZHIJcjEsIFtyNiwgIzhdCQkJQCBsb2NhbF9iaF9jb3VudAorCWFkZHMJcjAsIHIwLCByMQorCW1vdm5lCXBjLCBscgorCW1vdglyNywgIzAJCQkJQCBwcmVlbXB0X3NjaGVkdWxlX2lycQorCXN0cglyNywgW3I4LCAjVElfUFJFRU1QVF0JCUAgZXhwZWN0cyBwcmVlbXB0X2NvdW50ID09IDAKKzE6CWJsCXByZWVtcHRfc2NoZWR1bGVfaXJxCQlAIGlycSBlbi9kaXNhYmxlIGlzIGRvbmUgaW5zaWRlCisJbGRyCXIwLCBbcjgsICNUSV9GTEFHU10JCUAgZ2V0IG5ldyB0YXNrcyBUSV9GTEFHUworCXRzdAlyMCwgI19USUZfTkVFRF9SRVNDSEVECisJYmVxCXByZWVtcHRfcmV0dXJuCQkJQCBnbyBhZ2FpbgorCWIJMWIKKyNlbmRpZgorCisJLmFsaWduCTUKK19fdW5kX3N2YzoKKwlzdmNfZW50cnkgdW5kCisKKwlACisJQCBjYWxsIGVtdWxhdGlvbiBjb2RlLCB3aGljaCByZXR1cm5zIHVzaW5nIHI5IGlmIGl0IGhhcyBlbXVsYXRlZAorCUAgdGhlIGluc3RydWN0aW9uLCBvciB0aGUgbW9yZSBjb252ZW50aW9uYWwgbHIgaWYgd2UgYXJlIHRvIHRyZWF0CisJQCB0aGlzIGFzIGEgcmVhbCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24KKwlACisJQCAgcjAgLSBpbnN0cnVjdGlvbgorCUAKKwlsZHIJcjAsIFtyMiwgIy00XQorCWFkcglyOSwgMWYKKwlibAljYWxsX2ZwZQorCisJbW92CXIwLCBzcAkJCQlAIHN0cnVjdCBwdF9yZWdzICpyZWdzCisJYmwJZG9fdW5kZWZpbnN0cgorCisJQAorCUAgSVJRcyBvZmYgYWdhaW4gYmVmb3JlIHB1bGxpbmcgcHJlc2VydmVkIGRhdGEgb2ZmIHRoZSBzdGFjaworCUAKKzE6CWRpc2FibGVfaXJxIHIwCisKKwlACisJQCByZXN0b3JlIFNQU1IgYW5kIHJlc3RhcnQgdGhlIGluc3RydWN0aW9uCisJQAorCWxkcglsciwgW3NwLCAjU19QU1JdCQlAIEdldCBTVkMgY3BzcgorCW1zcglzcHNyX2N4c2YsIGxyCisJbGRtaWEJc3AsIHtyMCAtIHBjfV4JCQlAIFJlc3RvcmUgU1ZDIHJlZ2lzdGVycworCisJLmFsaWduCTUKK19fcGFidF9zdmM6CisJc3ZjX2VudHJ5IGFidAorCisJQAorCUAgcmUtZW5hYmxlIGludGVycnVwdHMgaWYgYXBwcm9wcmlhdGUKKwlACisJbXJzCXI5LCBjcHNyCisJdHN0CXIzLCAjUFNSX0lfQklUCisJYmljZXEJcjksIHI5LCAjUFNSX0lfQklUCisJbXNyCWNwc3JfYywgcjkKKworCUAKKwlAIHNldCBhcmdzLCB0aGVuIGNhbGwgbWFpbiBoYW5kbGVyCisJQAorCUAgIHIwIC0gYWRkcmVzcyBvZiBmYXVsdGluZyBpbnN0cnVjdGlvbgorCUAgIHIxIC0gcG9pbnRlciB0byByZWdpc3RlcnMgb24gc3RhY2sKKwlACisJbW92CXIwLCByMgkJCQlAIGFkZHJlc3MgKHBjKQorCW1vdglyMSwgc3AJCQkJQCByZWdzCisJYmwJZG9fUHJlZmV0Y2hBYm9ydAkJQCBjYWxsIGFib3J0IGhhbmRsZXIKKworCUAKKwlAIElSUXMgb2ZmIGFnYWluIGJlZm9yZSBwdWxsaW5nIHByZXNlcnZlZCBkYXRhIG9mZiB0aGUgc3RhY2sKKwlACisJZGlzYWJsZV9pcnEgcjAKKworCUAKKwlAIHJlc3RvcmUgU1BTUiBhbmQgcmVzdGFydCB0aGUgaW5zdHJ1Y3Rpb24KKwlACisJbGRyCXIwLCBbc3AsICNTX1BTUl0KKwltc3IJc3Bzcl9jeHNmLCByMAorCWxkbWlhCXNwLCB7cjAgLSBwY31eCQkJQCBsb2FkIHIwIC0gcGMsIGNwc3IKKworCS5hbGlnbgk1CisuTENpcnE6CisJLndvcmQJX190ZW1wX2lycQorLkxDdW5kOgorCS53b3JkCV9fdGVtcF91bmQKKy5MQ2FidDoKKwkud29yZAlfX3RlbXBfYWJ0CisjaWZkZWYgTVVMVElfQUJPUlQKKy5MQ3Byb2NmbnM6CisJLndvcmQJcHJvY2Vzc29yCisjZW5kaWYKKy5MQ2ZwOgorCS53b3JkCWZwX2VudGVyCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKy5MQ2lycV9zdGF0OgorCS53b3JkCWlycV9zdGF0CisjZW5kaWYKKworLyoKKyAqIFVzZXIgbW9kZSBoYW5kbGVycworICovCisJLm1hY3JvCXVzcl9lbnRyeSwgc3ltCisJc3ViCXNwLCBzcCwgI1NfRlJBTUVfU0laRQkJQCBBbGxvY2F0ZSBmcmFtZSBzaXplIGluIG9uZSBnbworCXN0bWlhCXNwLCB7cjAgLSByMTJ9CQkJQCBzYXZlIHIwIC0gcjEyCisJbGRyCXI3LCAuTENcc3ltCisJYWRkCXI1LCBzcCwgI1NfUEMKKwlsZG1pYQlyNywge3IyIC0gcjR9CQkJQCBHZXQgVVNSIHBjLCBjcHNyCisKKwlACisJQCBXZSBhcmUgbm93IHJlYWR5IHRvIGZpbGwgaW4gdGhlIHJlbWFpbmluZyBibGFua3Mgb24gdGhlIHN0YWNrOgorCUAKKwlAICByMiAtIGxyXzxleGNlcHRpb24+LCBhbHJlYWR5IGZpeGVkIHVwIGZvciBjb3JyZWN0IHJldHVybi9yZXN0YXJ0CisJQCAgcjMgLSBzcHNyXzxleGNlcHRpb24+CisJQCAgcjQgLSBvcmlnX3IwIChzZWUgcHRfcmVncyBkZWZpbml0aW9uIGluIHB0cmFjZS5oKQorCUAKKwlAIEFsc28sIHNlcGFyYXRlbHkgc2F2ZSBzcF91c3IgYW5kIGxyX3VzcgorCUAKKwlzdG1pYQlyNSwge3IyIC0gcjR9CisJc3RtZGIJcjUsIHtzcCwgbHJ9XgorCisJQAorCUAgRW5hYmxlIHRoZSBhbGlnbm1lbnQgdHJhcCB3aGlsZSBpbiBrZXJuZWwgbW9kZQorCUAKKwlhbGlnbm1lbnRfdHJhcCByNywgcjAsIF9fdGVtcF9cc3ltCisKKwlACisJQCBDbGVhciBGUCB0byBtYXJrIHRoZSBmaXJzdCBzdGFjayBmcmFtZQorCUAKKwl6ZXJvX2ZwCisJLmVuZG0KKworCS5hbGlnbgk1CitfX2RhYnRfdXNyOgorCXVzcl9lbnRyeSBhYnQKKworCUAKKwlAIENhbGwgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBhYm9ydCBoYW5kbGVyOgorCUAKKwlAICByMiAtIGFib3J0ZWQgY29udGV4dCBwYworCUAgIHIzIC0gYWJvcnRlZCBjb250ZXh0IGNwc3IKKwlACisJQCBUaGUgYWJvcnQgaGFuZGxlciBtdXN0IHJldHVybiB0aGUgYWJvcnRlZCBhZGRyZXNzIGluIHIwLCBhbmQKKwlAIHRoZSBmYXVsdCBzdGF0dXMgcmVnaXN0ZXIgaW4gcjEuCisJQAorI2lmZGVmIE1VTFRJX0FCT1JUCisJbGRyCXI0LCAuTENwcm9jZm5zCisJbW92CWxyLCBwYworCWxkcglwYywgW3I0XQorI2Vsc2UKKwlibAlDUFVfQUJPUlRfSEFORExFUgorI2VuZGlmCisKKwlACisJQCBJUlFzIG9uLCB0aGVuIGNhbGwgdGhlIG1haW4gaGFuZGxlcgorCUAKKwllbmFibGVfaXJxIHIyCisJbW92CXIyLCBzcAorCWFkcglsciwgcmV0X2Zyb21fZXhjZXB0aW9uCisJYglkb19EYXRhQWJvcnQKKworCS5hbGlnbgk1CitfX2lycV91c3I6CisJdXNyX2VudHJ5IGlycQorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlnZXRfdGhyZWFkX2luZm8gcjgKKwlsZHIJcjksIFtyOCwgI1RJX1BSRUVNUFRdCQlAIGdldCBwcmVlbXB0IGNvdW50CisJYWRkCXI3LCByOSwgIzEJCQlAIGluY3JlbWVudCBpdAorCXN0cglyNywgW3I4LCAjVElfUFJFRU1QVF0KKyNlbmRpZgorMToJZ2V0X2lycW5yX2FuZF9iYXNlIHIwLCByNiwgcjUsIGxyCisJbW92bmUJcjEsIHNwCisJYWRybmUJbHIsIDFiCisJQAorCUAgcm91dGluZSBjYWxsZWQgd2l0aCByMCA9IGlycSBudW1iZXIsIHIxID0gc3RydWN0IHB0X3JlZ3MgKgorCUAKKwlibmUJYXNtX2RvX0lSUQorI2lmZGVmIENPTkZJR19QUkVFTVBUCisJbGRyCXIwLCBbcjgsICNUSV9QUkVFTVBUXQorCXRlcQlyMCwgcjcKKwlzdHIJcjksIFtyOCwgI1RJX1BSRUVNUFRdCisJc3RybmUJcjAsIFtyMCwgLXIwXQorCW1vdgl0c2ssIHI4CisjZWxzZQorCWdldF90aHJlYWRfaW5mbyB0c2sKKyNlbmRpZgorCW1vdgl3aHksICMwCisJYglyZXRfdG9fdXNlcgorCisJLmx0b3JnCisKKwkuYWxpZ24JNQorX191bmRfdXNyOgorCXVzcl9lbnRyeSB1bmQKKworCXRzdAlyMywgI1BTUl9UX0JJVAkJCUAgVGh1bWIgbW9kZT8KKwlibmUJZnB1bmRlZmluc3RyCQkJQCBpZ25vcmUgRlAKKwlzdWIJcjQsIHIyLCAjNAorCisJQAorCUAgZmFsbCB0aHJvdWdoIHRvIHRoZSBlbXVsYXRpb24gY29kZSwgd2hpY2ggcmV0dXJucyB1c2luZyByOSBpZgorCUAgaXQgaGFzIGVtdWxhdGVkIHRoZSBpbnN0cnVjdGlvbiwgb3IgdGhlIG1vcmUgY29udmVudGlvbmFsIGxyCisJQCBpZiB3ZSBhcmUgdG8gdHJlYXQgdGhpcyBhcyBhIHJlYWwgdW5kZWZpbmVkIGluc3RydWN0aW9uCisJQAorCUAgIHIwIC0gaW5zdHJ1Y3Rpb24KKwlACisxOglsZHJ0CXIwLCBbcjRdCisJYWRyCXI5LCByZXRfZnJvbV9leGNlcHRpb24KKwlhZHIJbHIsIGZwdW5kZWZpbnN0cgorCUAKKwlAIGZhbGx0aHJvdWdoIHRvIGNhbGxfZnBlCisJQAorCisvKgorICogVGhlIG91dCBvZiBsaW5lIGZpeHVwIGZvciB0aGUgbGRydCBhYm92ZS4KKyAqLworCS5zZWN0aW9uIC5maXh1cCwgImF4IgorMjoJbW92CXBjLCByOQorCS5wcmV2aW91cworCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmxvbmcJMWIsIDJiCisJLnByZXZpb3VzCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGNvLXByb2Nlc3NvciBpbnN0cnVjdGlvbi4KKyAqIElmIHllcywgd2UgbmVlZCB0byBjYWxsIHRoZSByZWxldmFudCBjby1wcm9jZXNzb3IgaGFuZGxlci4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgZG8gYSBmdWxsIGNoZWNrIGhlcmUgZm9yIHRoZSBjby1wcm9jZXNzb3IKKyAqIGluc3RydWN0aW9uczsgYWxsIGluc3RydWN0aW9ucyB3aXRoIGJpdCAyNyBzZXQgYXJlIHdlbGwKKyAqIGRlZmluZWQuICBUaGUgb25seSBpbnN0cnVjdGlvbnMgdGhhdCBzaG91bGQgZmF1bHQgYXJlIHRoZQorICogY28tcHJvY2Vzc29yIGluc3RydWN0aW9ucy4gIEhvd2V2ZXIsIHdlIGhhdmUgdG8gd2F0Y2ggb3V0CisgKiBmb3IgdGhlIEFSTTYvQVJNNyBTV0kgYnVnLgorICoKKyAqIEVtdWxhdG9ycyBtYXkgd2lzaCB0byBtYWtlIHVzZSBvZiB0aGUgZm9sbG93aW5nIHJlZ2lzdGVyczoKKyAqICByMCAgPSBpbnN0cnVjdGlvbiBvcGNvZGUuCisgKiAgcjIgID0gUEMrNAorICogIHIxMCA9IHRoaXMgdGhyZWFkcyB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK2NhbGxfZnBlOgorCXRzdAlyMCwgIzB4MDgwMDAwMDAJCQlAIG9ubHkgQ0RQL0NQUlQvTERDL1NUQyBoYXZlIGJpdCAyNworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9BUk02MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9BUk03MTApCisJYW5kCXI4LCByMCwgIzB4MGYwMDAwMDAJCUAgbWFzayBvdXQgb3AtY29kZSBiaXRzCisJdGVxbmUJcjgsICMweDBmMDAwMDAwCQkJQCBTV0kgKEFSTTYvNyBidWcpPworI2VuZGlmCisJbW92ZXEJcGMsIGxyCisJZ2V0X3RocmVhZF9pbmZvIHIxMAkJCUAgZ2V0IGN1cnJlbnQgdGhyZWFkCisJYW5kCXI4LCByMCwgIzB4MDAwMDBmMDAJCUAgbWFzayBvdXQgQ1AgbnVtYmVyCisJbW92CXI3LCAjMQorCWFkZAlyNiwgcjEwLCAjVElfVVNFRF9DUAorCXN0cmIJcjcsIFtyNiwgcjgsIGxzciAjOF0JCUAgc2V0IGFwcHJvcHJpYXRlIHVzZWRfY3BbXQorI2lmZGVmIENPTkZJR19JV01NWFQKKwlAIFRlc3QgaWYgd2UgbmVlZCB0byBnaXZlIGFjY2VzcyB0byBpV01NWHQgY29wcm9jZXNzb3JzCisJbGRyCXI1LCBbcjEwLCAjVElfRkxBR1NdCisJcnNicwlyNywgcjgsICMoMSA8PCA4KQkJQCBDUCAwIG9yIDEgb25seQorCW1vdmNzcwlyNywgcjUsIGxzciAjKFRJRl9VU0lOR19JV01NWFQgKyAxKQorCWJjcwlpd21teHRfdGFza19lbmFibGUKKyNlbmRpZgorCWVuYWJsZV9pcnEgcjcKKwlhZGQJcGMsIHBjLCByOCwgbHNyICM2CisJbW92CXIwLCByMAorCisJbW92CXBjLCBscgkJCQlAIENQIzAKKwliCWRvX2ZwZQkJCQlAIENQIzEgKEZQRSkKKwliCWRvX2ZwZQkJCQlAIENQIzIgKEZQRSkKKwltb3YJcGMsIGxyCQkJCUAgQ1AjMworCW1vdglwYywgbHIJCQkJQCBDUCM0CisJbW92CXBjLCBscgkJCQlAIENQIzUKKwltb3YJcGMsIGxyCQkJCUAgQ1AjNgorCW1vdglwYywgbHIJCQkJQCBDUCM3CisJbW92CXBjLCBscgkJCQlAIENQIzgKKwltb3YJcGMsIGxyCQkJCUAgQ1AjOQorI2lmZGVmIENPTkZJR19WRlAKKwliCWRvX3ZmcAkJCQlAIENQIzEwIChWRlApCisJYglkb192ZnAJCQkJQCBDUCMxMSAoVkZQKQorI2Vsc2UKKwltb3YJcGMsIGxyCQkJCUAgQ1AjMTAgKFZGUCkKKwltb3YJcGMsIGxyCQkJCUAgQ1AjMTEgKFZGUCkKKyNlbmRpZgorCW1vdglwYywgbHIJCQkJQCBDUCMxMgorCW1vdglwYywgbHIJCQkJQCBDUCMxMworCW1vdglwYywgbHIJCQkJQCBDUCMxNCAoRGVidWcpCisJbW92CXBjLCBscgkJCQlAIENQIzE1IChDb250cm9sKQorCitkb19mcGU6CisJbGRyCXI0LCAuTENmcAorCWFkZAlyMTAsIHIxMCwgI1RJX0ZQU1RBVEUJCUAgcjEwID0gd29ya3NwYWNlCisJbGRyCXBjLCBbcjRdCQkJQCBDYWxsIEZQIG1vZHVsZSBVU1IgZW50cnkgcG9pbnQKKworLyoKKyAqIFRoZSBGUCBtb2R1bGUgaXMgY2FsbGVkIHdpdGggdGhlc2UgcmVnaXN0ZXJzIHNldDoKKyAqICByMCAgPSBpbnN0cnVjdGlvbgorICogIHIyICA9IFBDKzQKKyAqICByOSAgPSBub3JtYWwgInN1Y2Nlc3NmdWwiIHJldHVybiBhZGRyZXNzCisgKiAgcjEwID0gRlAgd29ya3NwYWNlCisgKiAgbHIgID0gdW5yZWNvZ25pc2VkIEZQIGluc3RydWN0aW9uIHJldHVybiBhZGRyZXNzCisgKi8KKworCS5kYXRhCitFTlRSWShmcF9lbnRlcikKKwkud29yZAlmcHVuZGVmaW5zdHIKKwkudGV4dAorCitmcHVuZGVmaW5zdHI6CisJbW92CXIwLCBzcAorCWFkcglsciwgcmV0X2Zyb21fZXhjZXB0aW9uCisJYglkb191bmRlZmluc3RyCisKKwkuYWxpZ24JNQorX19wYWJ0X3VzcjoKKwl1c3JfZW50cnkgYWJ0CisKKwllbmFibGVfaXJxIHIwCQkJCUAgRW5hYmxlIGludGVycnVwdHMKKwltb3YJcjAsIHIyCQkJCUAgYWRkcmVzcyAocGMpCisJbW92CXIxLCBzcAkJCQlAIHJlZ3MKKwlibAlkb19QcmVmZXRjaEFib3J0CQlAIGNhbGwgYWJvcnQgaGFuZGxlcgorCS8qIGZhbGwgdGhyb3VnaCAqLworLyoKKyAqIFRoaXMgaXMgdGhlIHJldHVybiBjb2RlIHRvIHVzZXIgbW9kZSBmb3IgYWJvcnQgaGFuZGxlcnMKKyAqLworRU5UUlkocmV0X2Zyb21fZXhjZXB0aW9uKQorCWdldF90aHJlYWRfaW5mbyB0c2sKKwltb3YJd2h5LCAjMAorCWIJcmV0X3RvX3VzZXIKKworLyoKKyAqIFJlZ2lzdGVyIHN3aXRjaCBmb3IgQVJNdjMgYW5kIEFSTXY0IHByb2Nlc3NvcnMKKyAqIHIwID0gcHJldmlvdXMgdGFza19zdHJ1Y3QsIHIxID0gcHJldmlvdXMgdGhyZWFkX2luZm8sIHIyID0gbmV4dCB0aHJlYWRfaW5mbworICogcHJldmlvdXMgYW5kIG5leHQgYXJlIGd1YXJhbnRlZWQgbm90IHRvIGJlIHRoZSBzYW1lLgorICovCitFTlRSWShfX3N3aXRjaF90bykKKwlhZGQJaXAsIHIxLCAjVElfQ1BVX1NBVkUKKwlsZHIJcjMsIFtyMiwgI1RJX1RQX1ZBTFVFXQorCXN0bWlhCWlwISwge3I0IC0gc2wsIGZwLCBzcCwgbHJ9CUAgU3RvcmUgbW9zdCByZWdzIG9uIHN0YWNrCisJbGRyCXI2LCBbcjIsICNUSV9DUFVfRE9NQUlOXSEKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfWFNDQUxFKSAmJiAhZGVmaW5lZChDT05GSUdfSVdNTVhUKQorCW1yYQlyNCwgcjUsIGFjYzAKKwlzdG1pYSAgIGlwLCB7cjQsIHI1fQorI2VuZGlmCisJbW92CXI0LCAjMHhmZmZmMGZmZgorCXN0cglyMywgW3I0LCAjLTNdCQkJQCBTZXQgVExTIHB0cgorCW1jcglwMTUsIDAsIHI2LCBjMywgYzAsIDAJCUAgU2V0IGRvbWFpbiByZWdpc3RlcgorI2lmZGVmIENPTkZJR19WRlAKKwlAIEFsd2F5cyBkaXNhYmxlIFZGUCBzbyB3ZSBjYW4gbGF6aWx5IHNhdmUvcmVzdG9yZSB0aGUgb2xkCisJQCBzdGF0ZS4gVGhpcyBvY2N1cnMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByZXZpb3VzIHRocmVhZC4KKwlWRlBGTVJYCXI0LCBGUEVYQworCWJpYwlyNCwgcjQsICNGUEVYQ19FTkFCTEUKKwlWRlBGTVhSCUZQRVhDLCByNAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSVdNTVhUKQorCWJsCWl3bW14dF90YXNrX3N3aXRjaAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1hTQ0FMRSkKKwlhZGQJcjQsIHIyLCAjNDAJCQlAIGNwdV9jb250ZXh0X3NhdmUtPmV4dHJhCisJbGRtaWIJcjQsIHtyNCwgcjV9CisJbWFyCWFjYzAsIHI0LCByNQorI2VuZGlmCisJbGRtaWIJcjIsIHtyNCAtIHNsLCBmcCwgc3AsIHBjfQlAIExvYWQgYWxsIHJlZ3Mgc2F2ZWQgcHJldmlvdXNseQorCisJX19JTklUCisvKgorICogVmVjdG9yIHN0dWJzLgorICoKKyAqIFRoaXMgY29kZSBpcyBjb3BpZWQgdG8gMHgyMDAgb3IgMHhmZmZmMDIwMCBzbyB3ZSBjYW4gdXNlIGJyYW5jaGVzIGluIHRoZQorICogdmVjdG9ycywgcmF0aGVyIHRoYW4gbGRyJ3MuCisgKgorICogQ29tbW9uIHN0dWIgZW50cnkgbWFjcm86CisgKiAgIEVudGVyIGluIElSUSBtb2RlLCBzcHNyID0gU1ZDL1VTUiBDUFNSLCBsciA9IFNWQy9VU1IgUEMKKyAqLworCS5tYWNybwl2ZWN0b3Jfc3R1YiwgbmFtZSwgc3ltLCBjb3JyZWN0aW9uPTAKKwkuYWxpZ24JNQorCit2ZWN0b3JfXG5hbWU6CisJbGRyCXIxMywgLkxDc1xzeW0KKwkuaWYgXGNvcnJlY3Rpb24KKwlzdWIJbHIsIGxyLCAjXGNvcnJlY3Rpb24KKwkuZW5kaWYKKwlzdHIJbHIsIFtyMTNdCQkJQCBzYXZlIGxyX0lSUQorCW1ycwlsciwgc3BzcgorCXN0cglsciwgW3IxMywgIzRdCQkJQCBzYXZlIHNwc3JfSVJRCisJQAorCUAgbm93IGJyYW5jaCB0byB0aGUgcmVsZXZhbnQgTU9ERSBoYW5kbGluZyByb3V0aW5lCisJQAorCW1ycwlyMTMsIGNwc3IKKwliaWMJcjEzLCByMTMsICNNT0RFX01BU0sKKwlvcnIJcjEzLCByMTMsICNNT0RFX1NWQworCW1zcglzcHNyX2N4c2YsIHIxMwkJCUAgc3dpdGNoIHRvIFNWQ18zMiBtb2RlCisKKwlhbmQJbHIsIGxyLCAjMTUKKwlsZHIJbHIsIFtwYywgbHIsIGxzbCAjMl0KKwltb3ZzCXBjLCBscgkJCQlAIENoYW5nZXMgbW9kZSBhbmQgYnJhbmNoZXMKKwkuZW5kbQorCitfX3N0dWJzX3N0YXJ0OgorLyoKKyAqIEludGVycnVwdCBkaXNwYXRjaGVyCisgKi8KKwl2ZWN0b3Jfc3R1YglpcnEsIGlycSwgNAorCisJLmxvbmcJX19pcnFfdXNyCQkJQCAgMCAgKFVTUl8yNiAvIFVTUl8zMikKKwkubG9uZwlfX2lycV9pbnZhbGlkCQkJQCAgMSAgKEZJUV8yNiAvIEZJUV8zMikKKwkubG9uZwlfX2lycV9pbnZhbGlkCQkJQCAgMiAgKElSUV8yNiAvIElSUV8zMikKKwkubG9uZwlfX2lycV9zdmMJCQlAICAzICAoU1ZDXzI2IC8gU1ZDXzMyKQorCS5sb25nCV9faXJxX2ludmFsaWQJCQlAICA0CisJLmxvbmcJX19pcnFfaW52YWxpZAkJCUAgIDUKKwkubG9uZwlfX2lycV9pbnZhbGlkCQkJQCAgNgorCS5sb25nCV9faXJxX2ludmFsaWQJCQlAICA3CisJLmxvbmcJX19pcnFfaW52YWxpZAkJCUAgIDgKKwkubG9uZwlfX2lycV9pbnZhbGlkCQkJQCAgOQorCS5sb25nCV9faXJxX2ludmFsaWQJCQlAICBhCisJLmxvbmcJX19pcnFfaW52YWxpZAkJCUAgIGIKKwkubG9uZwlfX2lycV9pbnZhbGlkCQkJQCAgYworCS5sb25nCV9faXJxX2ludmFsaWQJCQlAICBkCisJLmxvbmcJX19pcnFfaW52YWxpZAkJCUAgIGUKKwkubG9uZwlfX2lycV9pbnZhbGlkCQkJQCAgZgorCisvKgorICogRGF0YSBhYm9ydCBkaXNwYXRjaGVyCisgKiBFbnRlciBpbiBBQlQgbW9kZSwgc3BzciA9IFVTUiBDUFNSLCBsciA9IFVTUiBQQworICovCisJdmVjdG9yX3N0dWIJZGFidCwgYWJ0LCA4CisKKwkubG9uZwlfX2RhYnRfdXNyCQkJQCAgMCAgKFVTUl8yNiAvIFVTUl8zMikKKwkubG9uZwlfX2RhYnRfaW52YWxpZAkJCUAgIDEgIChGSVFfMjYgLyBGSVFfMzIpCisJLmxvbmcJX19kYWJ0X2ludmFsaWQJCQlAICAyICAoSVJRXzI2IC8gSVJRXzMyKQorCS5sb25nCV9fZGFidF9zdmMJCQlAICAzICAoU1ZDXzI2IC8gU1ZDXzMyKQorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgNAorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgNQorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgNgorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgNworCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgOAorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgOQorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgYQorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgYgorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgYworCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgZAorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgZQorCS5sb25nCV9fZGFidF9pbnZhbGlkCQkJQCAgZgorCisvKgorICogUHJlZmV0Y2ggYWJvcnQgZGlzcGF0Y2hlcgorICogRW50ZXIgaW4gQUJUIG1vZGUsIHNwc3IgPSBVU1IgQ1BTUiwgbHIgPSBVU1IgUEMKKyAqLworCXZlY3Rvcl9zdHViCXBhYnQsIGFidCwgNAorCisJLmxvbmcJX19wYWJ0X3VzcgkJCUAgIDAgKFVTUl8yNiAvIFVTUl8zMikKKwkubG9uZwlfX3BhYnRfaW52YWxpZAkJCUAgIDEgKEZJUV8yNiAvIEZJUV8zMikKKwkubG9uZwlfX3BhYnRfaW52YWxpZAkJCUAgIDIgKElSUV8yNiAvIElSUV8zMikKKwkubG9uZwlfX3BhYnRfc3ZjCQkJQCAgMyAoU1ZDXzI2IC8gU1ZDXzMyKQorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgNAorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgNQorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgNgorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgNworCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgOAorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgOQorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgYQorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgYgorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgYworCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgZAorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgZQorCS5sb25nCV9fcGFidF9pbnZhbGlkCQkJQCAgZgorCisvKgorICogVW5kZWYgaW5zdHIgZW50cnkgZGlzcGF0Y2hlcgorICogRW50ZXIgaW4gVU5EIG1vZGUsIHNwc3IgPSBTVkMvVVNSIENQU1IsIGxyID0gU1ZDL1VTUiBQQworICovCisJdmVjdG9yX3N0dWIJdW5kLCB1bmQKKworCS5sb25nCV9fdW5kX3VzcgkJCUAgIDAgKFVTUl8yNiAvIFVTUl8zMikKKwkubG9uZwlfX3VuZF9pbnZhbGlkCQkJQCAgMSAoRklRXzI2IC8gRklRXzMyKQorCS5sb25nCV9fdW5kX2ludmFsaWQJCQlAICAyIChJUlFfMjYgLyBJUlFfMzIpCisJLmxvbmcJX191bmRfc3ZjCQkJQCAgMyAoU1ZDXzI2IC8gU1ZDXzMyKQorCS5sb25nCV9fdW5kX2ludmFsaWQJCQlAICA0CisJLmxvbmcJX191bmRfaW52YWxpZAkJCUAgIDUKKwkubG9uZwlfX3VuZF9pbnZhbGlkCQkJQCAgNgorCS5sb25nCV9fdW5kX2ludmFsaWQJCQlAICA3CisJLmxvbmcJX191bmRfaW52YWxpZAkJCUAgIDgKKwkubG9uZwlfX3VuZF9pbnZhbGlkCQkJQCAgOQorCS5sb25nCV9fdW5kX2ludmFsaWQJCQlAICBhCisJLmxvbmcJX191bmRfaW52YWxpZAkJCUAgIGIKKwkubG9uZwlfX3VuZF9pbnZhbGlkCQkJQCAgYworCS5sb25nCV9fdW5kX2ludmFsaWQJCQlAICBkCisJLmxvbmcJX191bmRfaW52YWxpZAkJCUAgIGUKKwkubG9uZwlfX3VuZF9pbnZhbGlkCQkJQCAgZgorCisJLmFsaWduCTUKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW5kZWZpbmVkIEZJUXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVudGVyIGluIEZJUSBtb2RlLCBzcHNyID0gQU5ZIENQU1IsIGxyID0gQU5ZIFBDCisgKiBNVVNUIFBSRVNFUlZFIFNWQyBTUFNSLCBidXQgbmVlZCB0byBzd2l0Y2ggdG8gU1ZDIG1vZGUgdG8gc2hvdyBvdXIgbXNnLgorICogQmFzaWNhbGx5IHRvIHN3aXRjaCBtb2Rlcywgd2UgKkhBVkUqIHRvIGNsb2JiZXIgb25lIHJlZ2lzdGVyLi4uICBicmFpbgorICogZGFtYWdlIGFsZXJ0ISAgSSBkb24ndCB0aGluayB0aGF0IHdlIGNhbiBleGVjdXRlIGFueSBjb2RlIGluIGhlcmUgaW4gYW55CisgKiBvdGhlciBtb2RlIHRoYW4gRklRLi4uICBPayB5b3UgY2FuIHN3aXRjaCB0byBhbm90aGVyIG1vZGUsIGJ1dCB5b3UgY2FuJ3QKKyAqIGdldCBvdXQgb2YgdGhhdCBtb2RlIHdpdGhvdXQgY2xvYmJlcmluZyBvbmUgcmVnaXN0ZXIuCisgKi8KK3ZlY3Rvcl9maXE6CisJZGlzYWJsZV9maXEKKwlzdWJzCXBjLCBsciwgIzQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWRkcmVzcyBleGNlcHRpb24gaGFuZGxlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlc2UgYXJlbid0IHRvbyBjcml0aWNhbC4KKyAqICh0aGV5J3JlIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4sIGFuZCB3b24ndCBoYXBwZW4gaW4gMzItYml0IGRhdGEgbW9kZSkuCisgKi8KKwordmVjdG9yX2FkZHJleGNwdG46CisJYgl2ZWN0b3JfYWRkcmV4Y3B0bgorCisvKgorICogV2UgZ3JvdXAgYWxsIHRoZSBmb2xsb3dpbmcgZGF0YSB0b2dldGhlciB0byBvcHRpbWlzZQorICogZm9yIENQVXMgd2l0aCBzZXBhcmF0ZSBJICYgRCBjYWNoZXMuCisgKi8KKwkuYWxpZ24JNQorCisuTEN2c3dpOgorCS53b3JkCXZlY3Rvcl9zd2kKKworLkxDc2lycToKKwkud29yZAlfX3RlbXBfaXJxCisuTENzdW5kOgorCS53b3JkCV9fdGVtcF91bmQKKy5MQ3NhYnQ6CisJLndvcmQJX190ZW1wX2FidAorCitfX3N0dWJzX2VuZDoKKworCS5lcXUJX19yZWFsX3N0dWJzX3N0YXJ0LCAuTEN2ZWN0b3JzICsgMHgyMDAKKworLkxDdmVjdG9yczoKKwlzd2kJU1lTX0VSUk9SMAorCWIJX19yZWFsX3N0dWJzX3N0YXJ0ICsgKHZlY3Rvcl91bmQgLSBfX3N0dWJzX3N0YXJ0KQorCWxkcglwYywgX19yZWFsX3N0dWJzX3N0YXJ0ICsgKC5MQ3Zzd2kgLSBfX3N0dWJzX3N0YXJ0KQorCWIJX19yZWFsX3N0dWJzX3N0YXJ0ICsgKHZlY3Rvcl9wYWJ0IC0gX19zdHVic19zdGFydCkKKwliCV9fcmVhbF9zdHVic19zdGFydCArICh2ZWN0b3JfZGFidCAtIF9fc3R1YnNfc3RhcnQpCisJYglfX3JlYWxfc3R1YnNfc3RhcnQgKyAodmVjdG9yX2FkZHJleGNwdG4gLSBfX3N0dWJzX3N0YXJ0KQorCWIJX19yZWFsX3N0dWJzX3N0YXJ0ICsgKHZlY3Rvcl9pcnEgLSBfX3N0dWJzX3N0YXJ0KQorCWIJX19yZWFsX3N0dWJzX3N0YXJ0ICsgKHZlY3Rvcl9maXEgLSBfX3N0dWJzX3N0YXJ0KQorCitFTlRSWShfX3RyYXBfaW5pdCkKKwlzdG1mZAlzcCEsIHtyNCAtIHI2LCBscn0KKworCW1vdglyMCwgIzB4ZmYwMDAwMDAKKwlvcnIJcjAsIHIwLCAjMHgwMGZmMDAwMAkJQCBoaWdoIHZlY3RvcnMgcG9zaXRpb24KKwlhZHIJcjEsIC5MQ3ZlY3RvcnMJCQlAIHNldCB1cCB0aGUgdmVjdG9ycworCWxkbWlhCXIxLCB7cjEsIHIyLCByMywgcjQsIHI1LCByNiwgaXAsIGxyfQorCXN0bWlhCXIwLCB7cjEsIHIyLCByMywgcjQsIHI1LCByNiwgaXAsIGxyfQorCisJYWRkCXIyLCByMCwgIzB4MjAwCisJYWRyCXIwLCBfX3N0dWJzX3N0YXJ0CQlAIGNvcHkgc3R1YnMgdG8gMHgyMDAKKwlhZHIJcjEsIF9fc3R1YnNfZW5kCisxOglsZHIJcjMsIFtyMF0sICM0CisJc3RyCXIzLCBbcjJdLCAjNAorCWNtcAlyMCwgcjEKKwlibHQJMWIKKwlMT0FEUkVHUyhmZCwgc3AhLCB7cjQgLSByNiwgcGN9KQorCisJLmRhdGEKKworLyoKKyAqIERvIG5vdCByZW9yZGVyIHRoZXNlLCBhbmQgZG8gbm90IGluc2VydCBleHRyYSBkYXRhIGJldHdlZW4uLi4KKyAqLworCitfX3RlbXBfaXJxOgorCS53b3JkCTAJCQkJQCBzYXZlZCBscl9pcnEKKwkud29yZAkwCQkJCUAgc2F2ZWQgc3Bzcl9pcnEKKwkud29yZAktMQkJCQlAIG9sZF9yMAorX190ZW1wX3VuZDoKKwkud29yZAkwCQkJCUAgU2F2ZWQgbHJfdW5kCisJLndvcmQJMAkJCQlAIFNhdmVkIHNwc3JfdW5kCisJLndvcmQJLTEJCQkJQCBvbGRfcjAKK19fdGVtcF9hYnQ6CisJLndvcmQJMAkJCQlAIFNhdmVkIGxyX2FidAorCS53b3JkCTAJCQkJQCBTYXZlZCBzcHNyX2FidAorCS53b3JkCS0xCQkJCUAgb2xkX3IwCisKKwkuZ2xvYmwJY3JfYWxpZ25tZW50CisJLmdsb2JsCWNyX25vX2FsaWdubWVudAorY3JfYWxpZ25tZW50OgorCS5zcGFjZQk0Citjcl9ub19hbGlnbm1lbnQ6CisJLnNwYWNlCTQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2E3ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworI2luY2x1ZGUgImVudHJ5LWhlYWRlci5TIgorCisvKiAKKyAqIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBSMCBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAoZHVlIHRvCisgKiBzbG93L2Zhc3QgcmVzdG9yZSB1c2VyIHJlZ3MpLgorICovCisjaWYgU19SMCAhPSAwCisjZXJyb3IgIlBsZWFzZSBmaXgiCisjZW5kaWYKKworCS5hbGlnbgk1CisvKgorICogVGhpcyBpcyB0aGUgZmFzdCBzeXNjYWxsIHJldHVybiBwYXRoLiAgV2UgZG8gYXMgbGl0dGxlIGFzCisgKiBwb3NzaWJsZSBoZXJlLCBhbmQgdGhpcyBpbmNsdWRlcyBzYXZpbmcgcjAgYmFjayBpbnRvIHRoZSBTVkMKKyAqIHN0YWNrLgorICovCityZXRfZmFzdF9zeXNjYWxsOgorCWRpc2FibGVfaXJxIHIxCQkJCUAgZGlzYWJsZSBpbnRlcnJ1cHRzCisJbGRyCXIxLCBbdHNrLCAjVElfRkxBR1NdCisJdHN0CXIxLCAjX1RJRl9XT1JLX01BU0sKKwlibmUJZmFzdF93b3JrX3BlbmRpbmcKKwlmYXN0X3Jlc3RvcmVfdXNlcl9yZWdzCisKKy8qCisgKiBPaywgd2UgbmVlZCB0byBkbyBleHRyYSBwcm9jZXNzaW5nLCBlbnRlciB0aGUgc2xvdyBwYXRoLgorICovCitmYXN0X3dvcmtfcGVuZGluZzoKKwlzdHIJcjAsIFtzcCwgI1NfUjArU19PRkZdIQkJQCByZXR1cm5lZCByMAord29ya19wZW5kaW5nOgorCXRzdAlyMSwgI19USUZfTkVFRF9SRVNDSEVECisJYm5lCXdvcmtfcmVzY2hlZAorCXRzdAlyMSwgI19USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfU0lHUEVORElORworCWJlcQlub193b3JrX3BlbmRpbmcKKwltb3YJcjAsIHNwCQkJCUAgJ3JlZ3MnCisJbW92CXIyLCB3aHkJCQkJQCAnc3lzY2FsbCcKKwlibAlkb19ub3RpZnlfcmVzdW1lCisJZGlzYWJsZV9pcnEgcjEJCQkJQCBkaXNhYmxlIGludGVycnVwdHMKKwliCW5vX3dvcmtfcGVuZGluZworCit3b3JrX3Jlc2NoZWQ6CisJYmwJc2NoZWR1bGUKKy8qCisgKiAic2xvdyIgc3lzY2FsbCByZXR1cm4gcGF0aC4gICJ3aHkiIHRlbGxzIHVzIGlmIHRoaXMgd2FzIGEgcmVhbCBzeXNjYWxsLgorICovCitFTlRSWShyZXRfdG9fdXNlcikKK3JldF9zbG93X3N5c2NhbGw6CisJZGlzYWJsZV9pcnEgcjEJCQkJQCBkaXNhYmxlIGludGVycnVwdHMKKwlsZHIJcjEsIFt0c2ssICNUSV9GTEFHU10KKwl0c3QJcjEsICNfVElGX1dPUktfTUFTSworCWJuZQl3b3JrX3BlbmRpbmcKK25vX3dvcmtfcGVuZGluZzoKKwlzbG93X3Jlc3RvcmVfdXNlcl9yZWdzCisKKy8qCisgKiBUaGlzIGlzIGhvdyB3ZSByZXR1cm4gZnJvbSBhIGZvcmsuCisgKi8KK0VOVFJZKHJldF9mcm9tX2ZvcmspCisJYmwJc2NoZWR1bGVfdGFpbAorCWdldF90aHJlYWRfaW5mbyB0c2sKKwlsZHIJcjEsIFt0c2ssICNUSV9GTEFHU10JCUAgY2hlY2sgZm9yIHN5c2NhbGwgdHJhY2luZworCW1vdgl3aHksICMxCisJdHN0CXIxLCAjX1RJRl9TWVNDQUxMX1RSQUNFCQlAIGFyZSB3ZSB0cmFjaW5nIHN5c2NhbGxzPworCWJlcQlyZXRfc2xvd19zeXNjYWxsCisJbW92CXIxLCBzcAorCW1vdglyMCwgIzEJCQkJQCB0cmFjZSBleGl0IFtJUCA9IDFdCisJYmwJc3lzY2FsbF90cmFjZQorCWIJcmV0X3Nsb3dfc3lzY2FsbAorCQorCisjaW5jbHVkZSAiY2FsbHMuUyIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU1dJIGhhbmRsZXIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisJLyogSWYgd2UncmUgb3B0aW1pc2luZyBmb3IgU3Ryb25nQVJNIHRoZSByZXN1bHRpbmcgY29kZSB3b24ndCAKKwkgICBydW4gb24gYW4gQVJNNyBhbmQgd2UgY2FuIHNhdmUgYSBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLiAgCisJCQkJCQkJCS0tcGIgKi8KKyNpZmRlZiBDT05GSUdfQ1BVX0FSTTcxMAorCS5tYWNybwlhcm03MTBfYnVnX2NoZWNrLCBpbnN0ciwgdGVtcAorCWFuZAlcdGVtcCwgXGluc3RyLCAjMHgwZjAwMDAwMAlAIGNoZWNrIGZvciBTV0kKKwl0ZXEJXHRlbXAsICMweDBmMDAwMDAwCisJYm5lCS5MYXJtNzAwYnVnCisJLmVuZG0KKworLkxhcm03MDBidWc6CisJbGRyCXIwLCBbc3AsICNTX1BTUl0JCUAgR2V0IGNhbGxpbmcgY3BzcgorCXN1YglsciwgbHIsICM0CisJc3RyCWxyLCBbcjhdCisJbXNyCXNwc3JfY3hzZiwgcjAKKwlsZG1pYQlzcCwge3IwIC0gbHJ9XgkJCUAgR2V0IGNhbGxpbmcgcjAgLSBscgorCW1vdglyMCwgcjAKKwlsZHIJbHIsIFtzcCwgI1NfUENdCQkJQCBHZXQgUEMKKwlhZGQJc3AsIHNwLCAjU19GUkFNRV9TSVpFCisJbW92cwlwYywgbHIKKyNlbHNlCisJLm1hY3JvCWFybTcxMF9idWdfY2hlY2ssIGluc3RyLCB0ZW1wCisJLmVuZG0KKyNlbmRpZgorCisJLmFsaWduCTUKK0VOVFJZKHZlY3Rvcl9zd2kpCisJc2F2ZV91c2VyX3JlZ3MKKwl6ZXJvX2ZwCisJZ2V0X3Njbm8KKwlhcm03MTBfYnVnX2NoZWNrIHNjbm8sIGlwCisKKyNpZmRlZiBDT05GSUdfQUxJR05NRU5UX1RSQVAKKwlsZHIJaXAsIF9fY3JfYWxpZ25tZW50CisJbGRyCWlwLCBbaXBdCisJbWNyCXAxNSwgMCwgaXAsIGMxLCBjMAkJQCB1cGRhdGUgY29udHJvbCByZWdpc3RlcgorI2VuZGlmCisJZW5hYmxlX2lycSBpcAorCisJc3RyCXI0LCBbc3AsICMtU19PRkZdIQkJQCBwdXNoIGZpZnRoIGFyZworCisJZ2V0X3RocmVhZF9pbmZvIHRzaworCWxkcglpcCwgW3RzaywgI1RJX0ZMQUdTXQkJQCBjaGVjayBmb3Igc3lzY2FsbCB0cmFjaW5nCisJYmljCXNjbm8sIHNjbm8sICMweGZmMDAwMDAwCQlAIG1hc2sgb2ZmIFNXSSBvcC1jb2RlCisJZW9yCXNjbm8sIHNjbm8sICNPU19OVU1CRVIgPDwgMjAJQCBjaGVjayBPUyBudW1iZXIKKwlhZHIJdGJsLCBzeXNfY2FsbF90YWJsZQkJQCBsb2FkIHN5c2NhbGwgdGFibGUgcG9pbnRlcgorCXRzdAlpcCwgI19USUZfU1lTQ0FMTF9UUkFDRQkJQCBhcmUgd2UgdHJhY2luZyBzeXNjYWxscz8KKwlibmUJX19zeXNfdHJhY2UKKworCWFkcglsciwgcmV0X2Zhc3Rfc3lzY2FsbAkJQCByZXR1cm4gYWRkcmVzcworCWNtcAlzY25vLCAjTlJfc3lzY2FsbHMJCUAgY2hlY2sgdXBwZXIgc3lzY2FsbCBsaW1pdAorCWxkcmNjCXBjLCBbdGJsLCBzY25vLCBsc2wgIzJdCQlAIGNhbGwgc3lzXyogcm91dGluZQorCisJYWRkCXIxLCBzcCwgI1NfT0ZGCisyOgltb3YJd2h5LCAjMAkJCQlAIG5vIGxvbmdlciBhIHJlYWwgc3lzY2FsbAorCWNtcAlzY25vLCAjQVJNU1dJX09GRlNFVAorCWVvcglyMCwgc2NubywgI09TX05VTUJFUiA8PCAyMAlAIHB1dCBPUyBudW1iZXIgYmFjaworCWJjcwlhcm1fc3lzY2FsbAkKKwliCXN5c19uaV9zeXNjYWxsCQkJQCBub3QgcHJpdmF0ZSBmdW5jCisKKwkvKgorCSAqIFRoaXMgaXMgdGhlIHJlYWxseSBzbG93IHBhdGguICBXZSdyZSBnb2luZyB0byBiZSBkb2luZworCSAqIGNvbnRleHQgc3dpdGNoZXMsIGFuZCB3YWl0aW5nIGZvciBvdXIgcGFyZW50IHRvIHJlc3BvbmQuCisJICovCitfX3N5c190cmFjZToKKwlhZGQJcjEsIHNwLCAjU19PRkYKKwltb3YJcjAsICMwCQkJCUAgdHJhY2UgZW50cnkgW0lQID0gMF0KKwlibAlzeXNjYWxsX3RyYWNlCisKKwlhZHIJbHIsIF9fc3lzX3RyYWNlX3JldHVybgkJQCByZXR1cm4gYWRkcmVzcworCWFkZAlyMSwgc3AsICNTX1IwICsgU19PRkYJCUAgcG9pbnRlciB0byByZWdzCisJY21wCXNjbm8sICNOUl9zeXNjYWxscwkJQCBjaGVjayB1cHBlciBzeXNjYWxsIGxpbWl0CisJbGRtY2NpYQlyMSwge3IwIC0gcjN9CQkJQCBoYXZlIHRvIHJlbG9hZCByMCAtIHIzCisJbGRyY2MJcGMsIFt0YmwsIHNjbm8sIGxzbCAjMl0JCUAgY2FsbCBzeXNfKiByb3V0aW5lCisJYgkyYgorCitfX3N5c190cmFjZV9yZXR1cm46CisJc3RyCXIwLCBbc3AsICNTX1IwICsgU19PRkZdIQlAIHNhdmUgcmV0dXJuZWQgcjAKKwltb3YJcjEsIHNwCisJbW92CXIwLCAjMQkJCQlAIHRyYWNlIGV4aXQgW0lQID0gMV0KKwlibAlzeXNjYWxsX3RyYWNlCisJYglyZXRfc2xvd19zeXNjYWxsCisKKwkuYWxpZ24JNQorI2lmZGVmIENPTkZJR19BTElHTk1FTlRfVFJBUAorCS50eXBlCV9fY3JfYWxpZ25tZW50LCAjb2JqZWN0CitfX2NyX2FsaWdubWVudDoKKwkud29yZAljcl9hbGlnbm1lbnQKKyNlbmRpZgorCisJLnR5cGUJc3lzX2NhbGxfdGFibGUsICNvYmplY3QKK0VOVFJZKHN5c19jYWxsX3RhYmxlKQorI2luY2x1ZGUgImNhbGxzLlMiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3BlY2lhbCBzeXN0ZW0gY2FsbCB3cmFwcGVycworICovCitAIHIwID0gc3lzY2FsbCBudW1iZXIKK0AgcjUgPSBzeXNjYWxsIHRhYmxlCisJCS50eXBlCXN5c19zeXNjYWxsLCAjZnVuY3Rpb24KK3N5c19zeXNjYWxsOgorCQllb3IJc2NubywgcjAsICNPU19OVU1CRVIgPDwgMjAKKwkJY21wCXNjbm8sICNfX05SX3N5c2NhbGwgLSBfX05SX1NZU0NBTExfQkFTRQorCQljbXBuZQlzY25vLCAjTlJfc3lzY2FsbHMJQCBjaGVjayByYW5nZQorCQlzdG1sb2lhCXNwLCB7cjUsIHI2fQkJQCBzaHVmZmxlIGFyZ3MKKwkJbW92bG8JcjAsIHIxCisJCW1vdmxvCXIxLCByMgorCQltb3ZsbwlyMiwgcjMKKwkJbW92bG8JcjMsIHI0CisJCWxkcmxvCXBjLCBbdGJsLCBzY25vLCBsc2wgIzJdCisJCWIJc3lzX25pX3N5c2NhbGwKKworc3lzX2Zvcmtfd3JhcHBlcjoKKwkJYWRkCXIwLCBzcCwgI1NfT0ZGCisJCWIJc3lzX2ZvcmsKKworc3lzX3Zmb3JrX3dyYXBwZXI6CisJCWFkZAlyMCwgc3AsICNTX09GRgorCQliCXN5c192Zm9yaworCitzeXNfZXhlY3ZlX3dyYXBwZXI6CisJCWFkZAlyMywgc3AsICNTX09GRgorCQliCXN5c19leGVjdmUKKworc3lzX2Nsb25lX3dyYXBwZXI6CisJCWFkZAlpcCwgc3AsICNTX09GRgorCQlzdHIJaXAsIFtzcCwgIzRdCisJCWIJc3lzX2Nsb25lCisKK3N5c19zaWdzdXNwZW5kX3dyYXBwZXI6CisJCWFkZAlyMywgc3AsICNTX09GRgorCQliCXN5c19zaWdzdXNwZW5kCisKK3N5c19ydF9zaWdzdXNwZW5kX3dyYXBwZXI6CisJCWFkZAlyMiwgc3AsICNTX09GRgorCQliCXN5c19ydF9zaWdzdXNwZW5kCisKK3N5c19zaWdyZXR1cm5fd3JhcHBlcjoKKwkJYWRkCXIwLCBzcCwgI1NfT0ZGCisJCWIJc3lzX3NpZ3JldHVybgorCitzeXNfcnRfc2lncmV0dXJuX3dyYXBwZXI6CisJCWFkZAlyMCwgc3AsICNTX09GRgorCQliCXN5c19ydF9zaWdyZXR1cm4KKworc3lzX3NpZ2FsdHN0YWNrX3dyYXBwZXI6CisJCWxkcglyMiwgW3NwLCAjU19PRkYgKyBTX1NQXQorCQliCWRvX3NpZ2FsdHN0YWNrCisKK3N5c19mdXRleF93cmFwcGVyOgorCQlzdHIJcjUsIFtzcCwgIzRdCQlAIHB1c2ggc2l4dGggYXJnCisJCWIJc3lzX2Z1dGV4CisKKy8qCisgKiBOb3RlOiBvZmZfNGsgKHI1KSBpcyBhbHdheXMgdW5pdHMgb2YgNEsuICBJZiB3ZSBjYW4ndCBkbyB0aGUgcmVxdWVzdGVkCisgKiBvZmZzZXQsIHdlIHJldHVybiBFSU5WQUwuCisgKi8KK3N5c19tbWFwMjoKKyNpZiBQQUdFX1NISUZUID4gMTIKKwkJdHN0CXI1LCAjUEdPRkZfTUFTSworCQltb3ZlcQlyNSwgcjUsIGxzciAjUEFHRV9TSElGVCAtIDEyCisJCXN0cmVxCXI1LCBbc3AsICM0XQorCQliZXEJZG9fbW1hcDIKKwkJbW92CXIwLCAjLUVJTlZBTAorCQlSRVRJTlNUUihtb3YscGMsIGxyKQorI2Vsc2UKKwkJc3RyCXI1LCBbc3AsICM0XQorCQliCWRvX21tYXAyCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM5ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TCkBAIC0wLDAgKzEsMTgyIEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfQVJDSF94eHh4ICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW50cnktbWFjcm8uUz4KKworI2lmbmRlZiBNT0RFX1NWQworI2RlZmluZSBNT0RFX1NWQyAweDEzCisjZW5kaWYKKworCS5tYWNybwl6ZXJvX2ZwCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwltb3YJZnAsICMwCisjZW5kaWYKKwkuZW5kbQorCisJLnRleHQKKworQCBCYWQgQWJvcnQgbnVtYmVycworQCAtLS0tLS0tLS0tLS0tLS0tLQorQAorI2RlZmluZSBCQURfUFJFRkVUQ0gJMAorI2RlZmluZSBCQURfREFUQQkxCisjZGVmaW5lIEJBRF9BRERSRVhDUFROCTIKKyNkZWZpbmUgQkFEX0lSUQkJMworI2RlZmluZSBCQURfVU5ERUZJTlNUUgk0CisKKyNkZWZpbmUgUFRfVFJBQ0VTWVMJMHgwMDAwMDAwMgorCitAIE9TIHZlcnNpb24gbnVtYmVyIHVzZWQgaW4gU1dJcworQCAgUklTQyBPUyBpcyAwCitAICBSSVNDIGlYIGlzIDgKK0AKKyNkZWZpbmUgT1NfTlVNQkVSCTkKKyNkZWZpbmUgQVJNU1dJX09GRlNFVAkweDAwMGYwMDAwCisKK0AKK0AgU3RhY2sgZm9ybWF0IChlbnN1cmVkIGJ5IFVTRVJfKiBhbmQgU1ZDXyopCitACisjZGVmaW5lIFNfRlJBTUVfU0laRQk3MgorI2RlZmluZSBTX09MRF9SMAk2OAorI2RlZmluZSBTX1BTUgkJNjQKKworI2RlZmluZSBTX1BDCQk2MAorI2RlZmluZSBTX0xSCQk1NgorI2RlZmluZSBTX1NQCQk1MgorI2RlZmluZSBTX0lQCQk0OAorI2RlZmluZSBTX0ZQCQk0NAorI2RlZmluZSBTX1IxMAkJNDAKKyNkZWZpbmUgU19SOQkJMzYKKyNkZWZpbmUgU19SOAkJMzIKKyNkZWZpbmUgU19SNwkJMjgKKyNkZWZpbmUgU19SNgkJMjQKKyNkZWZpbmUgU19SNQkJMjAKKyNkZWZpbmUgU19SNAkJMTYKKyNkZWZpbmUgU19SMwkJMTIKKyNkZWZpbmUgU19SMgkJOAorI2RlZmluZSBTX1IxCQk0CisjZGVmaW5lIFNfUjAJCTAKKyNkZWZpbmUgU19PRkYJCTgKKworCS5tYWNybwlzZXRfY3Bzcl9jLCByZWcsIG1vZGUKKwltc3IJY3Bzcl9jLCBcbW9kZQorCS5lbmRtCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCS5tYWNybwlkaXNhYmxlX2lycSwgdGVtcAorCWNwc2lkCWkKKwkuZW5kbQorCisJLm1hY3JvCWVuYWJsZV9pcnEsIHRlbXAKKwljcHNpZQlpCisJLmVuZG0KKyNlbHNlCisJLm1hY3JvCWRpc2FibGVfaXJxLCB0ZW1wCisJc2V0X2Nwc3JfYyBcdGVtcCwgI1BTUl9JX0JJVCB8IE1PREVfU1ZDCisJLmVuZG0KKworCS5tYWNybwllbmFibGVfaXJxLCB0ZW1wCisJc2V0X2Nwc3JfYyBcdGVtcCwgI01PREVfU1ZDCisJLmVuZG0KKyNlbmRpZgorCisJLm1hY3JvCXNhdmVfdXNlcl9yZWdzCisJc3ViCXNwLCBzcCwgI1NfRlJBTUVfU0laRQorCXN0bWlhCXNwLCB7cjAgLSByMTJ9CQkJQCBDYWxsaW5nIHIwIC0gcjEyCisJYWRkCXI4LCBzcCwgI1NfUEMKKwlzdG1kYglyOCwge3NwLCBscn1eCQkJQCBDYWxsaW5nIHNwLCBscgorCW1ycwlyOCwgc3BzcgkJCUAgY2FsbGVkIGZyb20gbm9uLUZJUSBtb2RlLCBzbyBvay4KKwlzdHIJbHIsIFtzcCwgI1NfUENdCQkJQCBTYXZlIGNhbGxpbmcgUEMKKwlzdHIJcjgsIFtzcCwgI1NfUFNSXQkJQCBTYXZlIENQU1IKKwlzdHIJcjAsIFtzcCwgI1NfT0xEX1IwXQkJQCBTYXZlIE9MRF9SMAorCS5lbmRtCisKKwkubWFjcm8JcmVzdG9yZV91c2VyX3JlZ3MKKwlsZHIJcjEsIFtzcCwgI1NfUFNSXQkJQCBHZXQgY2FsbGluZyBjcHNyCisJZGlzYWJsZV9pcnEgaXAJCQkJQCBkaXNhYmxlIElSUXMKKwlsZHIJbHIsIFtzcCwgI1NfUENdIQkJQCBHZXQgUEMKKwltc3IJc3Bzcl9jeHNmLCByMQkJCUAgc2F2ZSBpbiBzcHNyX3N2YworCWxkbWRiCXNwLCB7cjAgLSBscn1eCQkJQCBHZXQgY2FsbGluZyByMCAtIGxyCisJbW92CXIwLCByMAorCWFkZAlzcCwgc3AsICNTX0ZSQU1FX1NJWkUgLSBTX1BDCisJbW92cwlwYywgbHIJCQkJQCByZXR1cm4gJiBtb3ZlIHNwc3Jfc3ZjIGludG8gY3BzcgorCS5lbmRtCisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIElSUXMgYWxyZWFkeSBkaXNhYmxlZC4KKyAqLworCS5tYWNybwlmYXN0X3Jlc3RvcmVfdXNlcl9yZWdzCisJbGRyCXIxLCBbc3AsICNTX09GRiArIFNfUFNSXQlAIGdldCBjYWxsaW5nIGNwc3IKKwlsZHIJbHIsIFtzcCwgI1NfT0ZGICsgU19QQ10hCUAgZ2V0IHBjCisJbXNyCXNwc3JfY3hzZiwgcjEJCQlAIHNhdmUgaW4gc3Bzcl9zdmMKKwlsZG1kYglzcCwge3IxIC0gbHJ9XgkJCUAgZ2V0IGNhbGxpbmcgcjEgLSBscgorCW1vdglyMCwgcjAKKwlhZGQJc3AsIHNwLCAjU19GUkFNRV9TSVpFIC0gU19QQworCW1vdnMJcGMsIGxyCQkJCUAgcmV0dXJuICYgbW92ZSBzcHNyX3N2YyBpbnRvIGNwc3IKKwkuZW5kbQorCisvKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBJUlFzIGFscmVhZHkgZGlzYWJsZWQuCisgKi8KKwkubWFjcm8Jc2xvd19yZXN0b3JlX3VzZXJfcmVncworCWxkcglyMSwgW3NwLCAjU19QU1JdCQlAIGdldCBjYWxsaW5nIGNwc3IKKwlsZHIJbHIsIFtzcCwgI1NfUENdIQkJQCBnZXQgcGMKKwltc3IJc3Bzcl9jeHNmLCByMQkJCUAgc2F2ZSBpbiBzcHNyX3N2YworCWxkbWRiCXNwLCB7cjAgLSBscn1eCQkJQCBnZXQgY2FsbGluZyByMSAtIGxyCisJbW92CXIwLCByMAorCWFkZAlzcCwgc3AsICNTX0ZSQU1FX1NJWkUgLSBTX1BDCisJbW92cwlwYywgbHIJCQkJQCByZXR1cm4gJiBtb3ZlIHNwc3Jfc3ZjIGludG8gY3BzcgorCS5lbmRtCisKKwkubWFjcm8JbWFza19wYywgcmQsIHJtCisJLmVuZG0KKworCS5tYWNybwlnZXRfdGhyZWFkX2luZm8sIHJkCisJbW92CVxyZCwgc3AsIGxzciAjMTMKKwltb3YJXHJkLCBccmQsIGxzbCAjMTMKKwkuZW5kbQorCisJLm1hY3JvCWFsaWdubWVudF90cmFwLCByYmFzZSwgcnRlbXAsIHN5bQorI2lmZGVmIENPTkZJR19BTElHTk1FTlRfVFJBUAorI2RlZmluZSBPRkZfQ1JfQUxJR05NRU5UKHgpCWNyX2FsaWdubWVudCAtIHgKKworCWxkcglccnRlbXAsIFtccmJhc2UsICNPRkZfQ1JfQUxJR05NRU5UKFxzeW0pXQorCW1jcglwMTUsIDAsIFxydGVtcCwgYzEsIGMwCisjZW5kaWYKKwkuZW5kbQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHJlZ2lzdGVycyB1c2VkIGluIHRoZSBzeXNjYWxsIGhhbmRsZXIsIGFuZCBhbGxvdyB1cyB0bworICogaGF2ZSBpbiB0aGVvcnkgdXAgdG8gNyBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbiAtIHIwIHRvIHI2LgorICoKKyAqIHI3IGlzIHJlc2VydmVkIGZvciB0aGUgc3lzdGVtIGNhbGwgbnVtYmVyIGZvciB0aHVtYiBtb2RlLgorICoKKyAqIE5vdGUgdGhhdCB0YmwgPT0gd2h5IGlzIGludGVudGlvbmFsLgorICoKKyAqIFdlIG11c3Qgc2V0IGF0IGxlYXN0ICJ0c2siIGFuZCAid2h5IiB3aGVuIGNhbGxpbmcgcmV0X3dpdGhfcmVzY2hlZHVsZS4KKyAqLworc2NubwkucmVxCXI3CQlAIHN5c2NhbGwgbnVtYmVyCit0YmwJLnJlcQlyOAkJQCBzeXNjYWxsIHRhYmxlIHBvaW50ZXIKK3doeQkucmVxCXI4CQlAIExpbnV4IHN5c2NhbGwgKCE9IDApCit0c2sJLnJlcQlyOQkJQCBjdXJyZW50IHRocmVhZF9pbmZvCisKKy8qCisgKiBHZXQgdGhlIHN5c3RlbSBjYWxsIG51bWJlci4KKyAqLworCS5tYWNybwlnZXRfc2NubworI2lmZGVmIENPTkZJR19BUk1fVEhVTUIKKwl0c3QJcjgsICNQU1JfVF9CSVQJCUAgdGhpcyBpcyBTUFNSIGZyb20gc2F2ZV91c2VyX3JlZ3MKKwlhZGRuZQlzY25vLCByNywgI09TX05VTUJFUiA8PCAyMCBAIHB1dCBPUyBudW1iZXIgaW4KKwlsZHJlcQlzY25vLCBbbHIsICMtNF0KKworI2Vsc2UKKwltYXNrX3BjCWxyLCBscgorCWxkcglzY25vLCBbbHIsICMtNF0JCUAgZ2V0IFNXSSBpbnN0cnVjdGlvbgorI2VuZGlmCisJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9maXEuYyBiL2FyY2gvYXJtL2tlcm5lbC9maXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjk5ZGZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2ZpcS5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9maXEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggUnVzc2VsbCBLaW5nCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IFBoaWwgQmx1bmRlbGwKKyAqCisgKiAgRklRIHN1cHBvcnQgd3JpdHRlbiBieSBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+LCAxOTk4LgorICoKKyAqICBGSVEgc3VwcG9ydCByZS13cml0dGVuIGJ5IFJ1c3NlbGwgS2luZyB0byBiZSBtb3JlIGdlbmVyaWMKKyAqCisgKiBXZSBub3cgcHJvcGVybHkgc3VwcG9ydCBhIG1ldGhvZCBieSB3aGljaCB0aGUgRklRIGhhbmRsZXJzIGNhbgorICogYmUgc3RhY2tlZCBvbnRvIHRoZSB2ZWN0b3IuICBXZSBzdGlsbCBkbyBub3Qgc3VwcG9ydCBzaGFyaW5nCisgKiB0aGUgRklRIHZlY3RvciBpdHNlbGYuCisgKgorICogT3BlcmF0aW9uIGlzIGFzIGZvbGxvd3M6CisgKiAgMS4gT3duZXIgQSBjbGFpbXMgRklROgorICogICAgIC0gZGVmYXVsdF9maXEgcmVsaW5xdWlzaGVzIGNvbnRyb2wuCisgKiAgMi4gT3duZXIgQToKKyAqICAgICAtIGluc2VydHMgY29kZS4KKyAqICAgICAtIHNldHMgYW55IHJlZ2lzdGVycywKKyAqICAgICAtIGVuYWJsZXMgRklRLgorICogIDMuIE93bmVyIEIgY2xhaW1zIEZJUToKKyAqICAgICAtIGlmIG93bmVyIEEgaGFzIGEgcmVsaW5xdWlzaCBmdW5jdGlvbi4KKyAqICAgICAgIC0gZGlzYWJsZSBGSVFzLgorICogICAgICAgLSBzYXZlcyBhbnkgcmVnaXN0ZXJzLgorICogICAgICAgLSByZXR1cm5zIHplcm8uCisgKiAgNC4gT3duZXIgQjoKKyAqICAgICAtIGluc2VydHMgY29kZS4KKyAqICAgICAtIHNldHMgYW55IHJlZ2lzdGVycywKKyAqICAgICAtIGVuYWJsZXMgRklRLgorICogIDUuIE93bmVyIEIgcmVsZWFzZXMgRklROgorICogICAgIC0gT3duZXIgQSBpcyBhc2tlZCB0byByZWFjcXVpcmUgRklROgorICoJIC0gaW5zZXJ0cyBjb2RlLgorICoJIC0gcmVzdG9yZXMgc2F2ZWQgcmVnaXN0ZXJzLgorICoJIC0gZW5hYmxlcyBGSVEuCisgKiAgNi4gR290byAzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2ZpcS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbm9fZmlxX2luc247CisKKy8qIERlZmF1bHQgcmVhY3F1aXJlIGZ1bmN0aW9uCisgKiAtIHdlIGFsd2F5cyByZWxpbnF1aXNoIEZJUSBjb250cm9sCisgKiAtIHdlIGFsd2F5cyByZWFjcXVpcmUgRklRIGNvbnRyb2wKKyAqLworc3RhdGljIGludCBmaXFfZGVmX29wKHZvaWQgKnJlZiwgaW50IHJlbGlucXVpc2gpCit7CisJaWYgKCFyZWxpbnF1aXNoKQorCQlzZXRfZmlxX2hhbmRsZXIoJm5vX2ZpcV9pbnNuLCBzaXplb2Yobm9fZmlxX2luc24pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpcV9oYW5kbGVyIGRlZmF1bHRfb3duZXIgPSB7CisJLm5hbWUJPSAiZGVmYXVsdCIsCisJLmZpcV9vcCA9IGZpcV9kZWZfb3AsCit9OworCitzdGF0aWMgc3RydWN0IGZpcV9oYW5kbGVyICpjdXJyZW50X2ZpcSA9ICZkZWZhdWx0X293bmVyOworCitpbnQgc2hvd19maXFfbGlzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJaWYgKGN1cnJlbnRfZmlxICE9ICZkZWZhdWx0X293bmVyKQorCQlzZXFfcHJpbnRmKHAsICJGSVE6ICAgICAgICAgICAgICAlc1xuIiwgY3VycmVudF9maXEtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X2ZpcV9oYW5kbGVyKHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCW1lbWNweSgodm9pZCAqKTB4ZmZmZjAwMWMsIHN0YXJ0LCBsZW5ndGgpOworCWZsdXNoX2ljYWNoZV9yYW5nZSgweGZmZmYwMDFjLCAweGZmZmYwMDFjICsgbGVuZ3RoKTsKKwlpZiAoIXZlY3RvcnNfaGlnaCgpKQorCQlmbHVzaF9pY2FjaGVfcmFuZ2UoMHgxYywgMHgxYyArIGxlbmd0aCk7Cit9CisKKy8qCisgKiBUYWtpbmcgYW4gaW50ZXJydXB0IGluIEZJUSBtb2RlIGlzIGRlYXRoLCBzbyBib3RoIHRoZXNlIGZ1bmN0aW9ucworICogZGlzYWJsZSBpcnFzIGZvciB0aGUgZHVyYXRpb24uICBOb3RlIC0gdGhlc2UgZnVuY3Rpb25zIGFyZSBhbG1vc3QKKyAqIGVudGlyZWx5IGNvZGVkIGluIGFzc2VtYmx5LgorICovCit2b2lkIF9fYXR0cmlidXRlX18oKG5ha2VkKSkgc2V0X2ZpcV9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdG1wOworCWFzbSB2b2xhdGlsZSAoCisJIm1vdglpcCwgc3BcblwKKwlzdG1mZAlzcCEsIHtmcCwgaXAsIGxyLCBwY31cblwKKwlzdWIJZnAsIGlwLCAjNFxuXAorCW1ycwklMCwgY3BzclxuXAorCW1zcgljcHNyX2MsICUyCUAgc2VsZWN0IEZJUSBtb2RlXG5cCisJbW92CXIwLCByMFxuXAorCWxkbWlhCSUxLCB7cjggLSByMTR9XG5cCisJbXNyCWNwc3JfYywgJTAJQCByZXR1cm4gdG8gU1ZDIG1vZGVcblwKKwltb3YJcjAsIHIwXG5cCisJbGRtZWEJZnAsIHtmcCwgc3AsIHBjfSIKKwk6ICI9JnIiICh0bXApCisJOiAiciIgKCZyZWdzLT5BUk1fcjgpLCAiSSIgKFBTUl9JX0JJVCB8IFBTUl9GX0JJVCB8IEZJUV9NT0RFKSk7Cit9CisKK3ZvaWQgX19hdHRyaWJ1dGVfXygobmFrZWQpKSBnZXRfZmlxX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB0bXA7CisJYXNtIHZvbGF0aWxlICgKKwkibW92CWlwLCBzcFxuXAorCXN0bWZkCXNwISwge2ZwLCBpcCwgbHIsIHBjfVxuXAorCXN1YglmcCwgaXAsICM0XG5cCisJbXJzCSUwLCBjcHNyXG5cCisJbXNyCWNwc3JfYywgJTIJQCBzZWxlY3QgRklRIG1vZGVcblwKKwltb3YJcjAsIHIwXG5cCisJc3RtaWEJJTEsIHtyOCAtIHIxNH1cblwKKwltc3IJY3Bzcl9jLCAlMAlAIHJldHVybiB0byBTVkMgbW9kZVxuXAorCW1vdglyMCwgcjBcblwKKwlsZG1lYQlmcCwge2ZwLCBzcCwgcGN9IgorCTogIj0mciIgKHRtcCkKKwk6ICJyIiAoJnJlZ3MtPkFSTV9yOCksICJJIiAoUFNSX0lfQklUIHwgUFNSX0ZfQklUIHwgRklRX01PREUpKTsKK30KKworaW50IGNsYWltX2ZpcShzdHJ1Y3QgZmlxX2hhbmRsZXIgKmYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3VycmVudF9maXEpIHsKKwkJcmV0ID0gLUVCVVNZOworCisJCWlmIChjdXJyZW50X2ZpcS0+ZmlxX29wICE9IE5VTEwpCisJCQlyZXQgPSBjdXJyZW50X2ZpcS0+ZmlxX29wKGN1cnJlbnRfZmlxLT5kZXZfaWQsIDEpOworCX0KKworCWlmICghcmV0KSB7CisJCWYtPm5leHQgPSBjdXJyZW50X2ZpcTsKKwkJY3VycmVudF9maXEgPSBmOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgcmVsZWFzZV9maXEoc3RydWN0IGZpcV9oYW5kbGVyICpmKQoreworCWlmIChjdXJyZW50X2ZpcSAhPSBmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgRklRIHRyeWluZyB0byByZWxlYXNlICVzIEZJUVxuIiwKKwkJICAgICAgIGYtPm5hbWUsIGN1cnJlbnRfZmlxLT5uYW1lKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm47CisJfQorCisJZG8KKwkJY3VycmVudF9maXEgPSBjdXJyZW50X2ZpcS0+bmV4dDsKKwl3aGlsZSAoY3VycmVudF9maXEtPmZpcV9vcChjdXJyZW50X2ZpcS0+ZGV2X2lkLCAwKSk7Cit9CisKK3ZvaWQgZW5hYmxlX2ZpcShpbnQgZmlxKQoreworCWVuYWJsZV9pcnEoZmlxICsgRklRX1NUQVJUKTsKK30KKwordm9pZCBkaXNhYmxlX2ZpcShpbnQgZmlxKQoreworCWRpc2FibGVfaXJxKGZpcSArIEZJUV9TVEFSVCk7Cit9CisKK0VYUE9SVF9TWU1CT0woc2V0X2ZpcV9oYW5kbGVyKTsKK0VYUE9SVF9TWU1CT0woc2V0X2ZpcV9yZWdzKTsKK0VYUE9SVF9TWU1CT0woZ2V0X2ZpcV9yZWdzKTsKK0VYUE9SVF9TWU1CT0woY2xhaW1fZmlxKTsKK0VYUE9SVF9TWU1CT0wocmVsZWFzZV9maXEpOworRVhQT1JUX1NZTUJPTChlbmFibGVfZmlxKTsKK0VYUE9SVF9TWU1CT0woZGlzYWJsZV9maXEpOworCit2b2lkIF9faW5pdCBpbml0X0ZJUSh2b2lkKQoreworCW5vX2ZpcV9pbnNuID0gKih1bnNpZ25lZCBsb25nICopMHhmZmZmMDAxYzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MWIzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCkBAIC0wLDAgKzEsNTE2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgS2VybmVsIHN0YXJ0dXAgY29kZSBmb3IgYWxsIDMyLWJpdCBDUFVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9kb21haW4uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFBST0NJTkZPX01NVUZMQUdTCTgKKyNkZWZpbmUgUFJPQ0lORk9fSU5JVEZVTkMJMTIKKworI2RlZmluZSBNQUNISU5GT19UWVBFCQkwCisjZGVmaW5lIE1BQ0hJTkZPX1BIWVNSQU0JNAorI2RlZmluZSBNQUNISU5GT19QSFlTSU8JCTgKKyNkZWZpbmUgTUFDSElORk9fUEdPRkZJTwkxMgorI2RlZmluZSBNQUNISU5GT19OQU1FCQkxNgorCisjaWZuZGVmIENPTkZJR19YSVBfS0VSTkVMCisvKgorICogV2UgcGxhY2UgdGhlIHBhZ2UgdGFibGVzIDE2SyBiZWxvdyBURVhUQUREUi4gIFRoZXJlZm9yZSwgd2UgbXVzdCBtYWtlIHN1cmUKKyAqIHRoYXQgVEVYVEFERFIgaXMgY29ycmVjdGx5IHNldC4gIEN1cnJlbnRseSwgd2UgZXhwZWN0IHRoZSBsZWFzdCBzaWduaWZpY2FudAorICogMTYgYml0cyB0byBiZSAweDgwMDAsIGJ1dCB3ZSBjb3VsZCBwcm9iYWJseSByZWxheCB0aGlzIHJlc3RyaWN0aW9uIHRvCisgKiBURVhUQUREUiA+PSBQQUdFX09GRlNFVCArIDB4NDAwMAorICoKKyAqIE5vdGUgdGhhdCBzd2FwcGVyX3BnX2RpciBpcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwYWdlIHRhYmxlcywgYW5kCisgKiBwZ3RibCBnaXZlcyB1cyBhIHBvc2l0aW9uLWluZGVwZW5kZW50IHJlZmVyZW5jZSB0byB0aGVzZSB0YWJsZXMuICBXZSBjYW4KKyAqIGRvIHRoaXMgYmVjYXVzZSBzdGV4dCA9PSBURVhUQUREUgorICovCisjaWYgKFRFWFRBRERSICYgMHhmZmZmKSAhPSAweDgwMDAKKyNlcnJvciBURVhUQUREUiBtdXN0IHN0YXJ0IGF0IDB4WFhYWDgwMDAKKyNlbmRpZgorCisJLmdsb2JsCXN3YXBwZXJfcGdfZGlyCisJLmVxdQlzd2FwcGVyX3BnX2RpciwgVEVYVEFERFIgLSAweDQwMDAKKworCS5tYWNybwlwZ3RibCwgcmQsIHBoeXMKKwlhZHIJXHJkLCBzdGV4dAorCXN1YglccmQsIFxyZCwgIzB4NDAwMAorCS5lbmRtCisjZWxzZQorLyoKKyAqIFhJUCBLZXJuZWw6CisgKgorICogV2UgcGxhY2UgdGhlIHBhZ2UgdGFibGVzIDE2SyBiZWxvdyBEQVRBQUREUi4gIFRoZXJlZm9yZSwgd2UgbXVzdCBtYWtlIHN1cmUKKyAqIHRoYXQgREFUQUFERFIgaXMgY29ycmVjdGx5IHNldC4gIEN1cnJlbnRseSwgd2UgZXhwZWN0IHRoZSBsZWFzdCBzaWduaWZpY2FudAorICogMTYgYml0cyB0byBiZSAweDgwMDAsIGJ1dCB3ZSBjb3VsZCBwcm9iYWJseSByZWxheCB0aGlzIHJlc3RyaWN0aW9uIHRvCisgKiBEQVRBQUREUiA+PSBQQUdFX09GRlNFVCArIDB4NDAwMAorICoKKyAqIE5vdGUgdGhhdCBwZ3RibCBpcyBtZWFudCB0byByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygc3dhcHBlcl9wZ19kaXIuCisgKiBXZSBjYW4ndCBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBrZXJuZWwgcG9zaXRpb24gaW4gdGhpcyBjYXNlIHNpbmNlCisgKiB0aGUga2VybmVsIGNhbiBwaHlzaWNhbGx5IGJlIGFueXdoZXJlLgorICovCisjaWYgKERBVEFBRERSICYgMHhmZmZmKSAhPSAweDgwMDAKKyNlcnJvciBEQVRBQUREUiBtdXN0IHN0YXJ0IGF0IDB4WFhYWDgwMDAKKyNlbmRpZgorCisJLmdsb2JsCXN3YXBwZXJfcGdfZGlyCisJLmVxdQlzd2FwcGVyX3BnX2RpciwgREFUQUFERFIgLSAweDQwMDAKKworCS5tYWNybwlwZ3RibCwgcmQsIHBoeXMKKwlsZHIJXHJkLCA9KChEQVRBQUREUiAtIDB4NDAwMCkgLSBWSVJUX09GRlNFVCkKKwlhZGQJXHJkLCBccmQsIFxwaHlzCisJLmVuZG0KKyNlbmRpZgorCisvKgorICogS2VybmVsIHN0YXJ0dXAgZW50cnkgcG9pbnQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBkZWNvbXByZXNzb3IgY29kZS4gIFRoZSByZXF1aXJlbWVudHMKKyAqIGFyZTogTU1VID0gb2ZmLCBELWNhY2hlID0gb2ZmLCBJLWNhY2hlID0gZG9udCBjYXJlLCByMCA9IDAsCisgKiByMSA9IG1hY2hpbmUgbnIuCisgKgorICogVGhpcyBjb2RlIGlzIG1vc3RseSBwb3NpdGlvbiBpbmRlcGVuZGVudCwgc28gaWYgeW91IGxpbmsgdGhlIGtlcm5lbCBhdAorICogMHhjMDAwODAwMCwgeW91IGNhbGwgdGhpcyBhdCBfX3BhKDB4YzAwMDgwMDApLgorICoKKyAqIFNlZSBsaW51eC9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzIGZvciB0aGUgY29tcGxldGUgbGlzdCBvZiBtYWNoaW5lCisgKiBudW1iZXJzIGZvciByMS4KKyAqCisgKiBXZSdyZSB0cnlpbmcgdG8ga2VlcCBjcmFwIHRvIGEgbWluaW11bTsgRE8gTk9UIGFkZCBhbnkgbWFjaGluZSBzcGVjaWZpYworICogY3JhcCBoZXJlIC0gdGhhdCdzIHdoYXQgdGhlIGJvb3QgbG9hZGVyIChvciBpbiBleHRyZW1lLCB3ZWxsIGp1c3RpZmllZAorICogY2lyY3Vtc3RhbmNlcywgekltYWdlKSBpcyBmb3IuCisgKi8KKwlfX0lOSVQKKwkudHlwZQlzdGV4dCwgJWZ1bmN0aW9uCitFTlRSWShzdGV4dCkKKwltc3IJY3Bzcl9jLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgTU9ERV9TVkMgQCBlbnN1cmUgc3ZjIG1vZGUKKwkJCQkJCUAgYW5kIGlycXMgZGlzYWJsZWQKKwlibAlfX2xvb2t1cF9wcm9jZXNzb3JfdHlwZQkJQCByNT1wcm9jaW5mbyByOT1jcHVpZAorCW1vdnMJcjEwLCByNQkJCQlAIGludmFsaWQgcHJvY2Vzc29yIChyNT0wKT8KKwliZXEJX19lcnJvcl9wCQkJCUAgeWVzLCBlcnJvciAncCcKKwlibAlfX2xvb2t1cF9tYWNoaW5lX3R5cGUJCUAgcjU9bWFjaGluZm8KKwltb3ZzCXI4LCByNQkJCQlAIGludmFsaWQgbWFjaGluZSAocjU9MCk/CisJYmVxCV9fZXJyb3JfYQkJCUAgeWVzLCBlcnJvciAnYScKKwlibAlfX2NyZWF0ZV9wYWdlX3RhYmxlcworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhbGxzIENQVSBzcGVjaWZpYyBjb2RlIGluIGEgcG9zaXRpb24gaW5kZXBlbmRlbnQKKwkgKiBtYW5uZXIuICBTZWUgYXJjaC9hcm0vbW0vcHJvYy0qLlMgZm9yIGRldGFpbHMuICByMTAgPSBiYXNlIG9mCisJICogeHh4X3Byb2NfaW5mbyBzdHJ1Y3R1cmUgc2VsZWN0ZWQgYnkgX19sb29rdXBfbWFjaGluZV90eXBlCisJICogYWJvdmUuICBPbiByZXR1cm4sIHRoZSBDUFUgd2lsbCBiZSByZWFkeSBmb3IgdGhlIE1NVSB0byBiZQorCSAqIHR1cm5lZCBvbiwgYW5kIHIwIHdpbGwgaG9sZCB0aGUgQ1BVIGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWUuCisJICovCisJbGRyCXIxMywgX19zd2l0Y2hfZGF0YQkJQCBhZGRyZXNzIHRvIGp1bXAgdG8gYWZ0ZXIKKwkJCQkJCUAgbW11IGhhcyBiZWVuIGVuYWJsZWQKKwlhZHIJbHIsIF9fZW5hYmxlX21tdQkJQCByZXR1cm4gKFBJQykgYWRkcmVzcworCWFkZAlwYywgcjEwLCAjUFJPQ0lORk9fSU5JVEZVTkMKKworCS50eXBlCV9fc3dpdGNoX2RhdGEsICVvYmplY3QKK19fc3dpdGNoX2RhdGE6CisJLmxvbmcJX19tbWFwX3N3aXRjaGVkCisJLmxvbmcJX19kYXRhX2xvYwkJCUAgcjQKKwkubG9uZwlfX2RhdGFfc3RhcnQJCQlAIHI1CisJLmxvbmcJX19ic3Nfc3RhcnQJCQlAIHI2CisJLmxvbmcJX2VuZAkJCQlAIHI3CisJLmxvbmcJcHJvY2Vzc29yX2lkCQkJQCByNAorCS5sb25nCV9fbWFjaGluZV9hcmNoX3R5cGUJCUAgcjUKKwkubG9uZwljcl9hbGlnbm1lbnQJCQlAIHI2CisJLmxvbmcJaW5pdF90aHJlYWRfdW5pb24rODE5MgkJQCBzcAorCisvKgorICogVGhlIGZvbGxvd2luZyBmcmFnbWVudCBvZiBjb2RlIGlzIGV4ZWN1dGVkIHdpdGggdGhlIE1NVSBvbiwgYW5kIHVzZXMKKyAqIGFic29sdXRlIGFkZHJlc3NlczsgdGhpcyBpcyBub3QgcG9zaXRpb24gaW5kZXBlbmRlbnQuCisgKgorICogIHIwICA9IGNwIzE1IGNvbnRyb2wgcmVnaXN0ZXIKKyAqICByMSAgPSBtYWNoaW5lIElECisgKiAgcjkgID0gcHJvY2Vzc29yIElECisgKi8KKwkudHlwZQlfX21tYXBfc3dpdGNoZWQsICVmdW5jdGlvbgorX19tbWFwX3N3aXRjaGVkOgorCWFkcglyMywgX19zd2l0Y2hfZGF0YSArIDQKKworCWxkbWlhCXIzISwge3I0LCByNSwgcjYsIHI3fQorCWNtcAlyNCwgcjUJCQkJQCBDb3B5IGRhdGEgc2VnbWVudCBpZiBuZWVkZWQKKzE6CWNtcG5lCXI1LCByNgorCWxkcm5lCWZwLCBbcjRdLCAjNAorCXN0cm5lCWZwLCBbcjVdLCAjNAorCWJuZQkxYgorCisJbW92CWZwLCAjMAkJCQlAIENsZWFyIEJTUyAoYW5kIHplcm8gZnApCisxOgljbXAJcjYsIHI3CisJc3RyY2MJZnAsIFtyNl0sIzQKKwliY2MJMWIKKworCWxkbWlhCXIzLCB7cjQsIHI1LCByNiwgc3B9CisJc3RyCXI5LCBbcjRdCQkJQCBTYXZlIHByb2Nlc3NvciBJRAorCXN0cglyMSwgW3I1XQkJCUAgU2F2ZSBtYWNoaW5lIHR5cGUKKwliaWMJcjQsIHIwLCAjQ1JfQQkJCUAgQ2xlYXIgJ0EnIGJpdAorCXN0bWlhCXI2LCB7cjAsIHI0fQkJCUAgU2F2ZSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlcworCWIJc3RhcnRfa2VybmVsCisKKworCisvKgorICogU2V0dXAgY29tbW9uIGJpdHMgYmVmb3JlIGZpbmFsbHkgZW5hYmxpbmcgdGhlIE1NVS4gIEVzc2VudGlhbGx5CisgKiB0aGlzIGlzIGp1c3QgbG9hZGluZyB0aGUgcGFnZSB0YWJsZSBwb2ludGVyIGFuZCBkb21haW4gYWNjZXNzCisgKiByZWdpc3RlcnMuCisgKi8KKwkudHlwZQlfX2VuYWJsZV9tbXUsICVmdW5jdGlvbgorX19lbmFibGVfbW11OgorI2lmZGVmIENPTkZJR19BTElHTk1FTlRfVFJBUAorCW9ycglyMCwgcjAsICNDUl9BCisjZWxzZQorCWJpYwlyMCwgcjAsICNDUl9BCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI0NSX0MKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRQorCWJpYwlyMCwgcjAsICNDUl9aCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI0NSX0kKKyNlbmRpZgorCW1vdglyNSwgIyhkb21haW5fdmFsKERPTUFJTl9VU0VSLCBET01BSU5fTUFOQUdFUikgfCBcCisJCSAgICAgIGRvbWFpbl92YWwoRE9NQUlOX0tFUk5FTCwgRE9NQUlOX01BTkFHRVIpIHwgXAorCQkgICAgICBkb21haW5fdmFsKERPTUFJTl9UQUJMRSwgRE9NQUlOX01BTkFHRVIpIHwgXAorCQkgICAgICBkb21haW5fdmFsKERPTUFJTl9JTywgRE9NQUlOX0NMSUVOVCkpCisJbWNyCXAxNSwgMCwgcjUsIGMzLCBjMCwgMAkJQCBsb2FkIGRvbWFpbiBhY2Nlc3MgcmVnaXN0ZXIKKwltY3IJcDE1LCAwLCByNCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJYglfX3R1cm5fbW11X29uCisKKy8qCisgKiBFbmFibGUgdGhlIE1NVS4gIFRoaXMgY29tcGxldGVseSBjaGFuZ2VzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHZpc2libGUKKyAqIG1lbW9yeSBzcGFjZS4gIFlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHRyYWNlIGV4ZWN1dGlvbiB0aHJvdWdoIHRoaXMuCisgKiBJZiB5b3UgaGF2ZSBhbiBlbnF1aXJ5IGFib3V0IHRoaXMsICpwbGVhc2UqIGNoZWNrIHRoZSBsaW51eC1hcm0ta2VybmVsCisgKiBtYWlsaW5nIGxpc3QgYXJjaGl2ZXMgQkVGT1JFIHNlbmRpbmcgYW5vdGhlciBwb3N0IHRvIHRoZSBsaXN0LgorICoKKyAqICByMCAgPSBjcCMxNSBjb250cm9sIHJlZ2lzdGVyCisgKiAgcjEzID0gKnZpcnR1YWwqIGFkZHJlc3MgdG8ganVtcCB0byB1cG9uIGNvbXBsZXRpb24KKyAqCisgKiBvdGhlciByZWdpc3RlcnMgZGVwZW5kIG9uIHRoZSBmdW5jdGlvbiBjYWxsZWQgdXBvbiBjb21wbGV0aW9uCisgKi8KKwkuYWxpZ24JNQorCS50eXBlCV9fdHVybl9tbXVfb24sICVmdW5jdGlvbgorX190dXJuX21tdV9vbjoKKwltb3YJcjAsIHIwCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCB3cml0ZSBjb250cm9sIHJlZworCW1yYwlwMTUsIDAsIHIzLCBjMCwgYzAsIDAJCUAgcmVhZCBpZCByZWcKKwltb3YJcjMsIHIzCisJbW92CXIzLCByMworCW1vdglwYywgcjEzCisKKworCisvKgorICogU2V0dXAgdGhlIGluaXRpYWwgcGFnZSB0YWJsZXMuICBXZSBvbmx5IHNldHVwIHRoZSBiYXJlc3QKKyAqIGFtb3VudCB3aGljaCBhcmUgcmVxdWlyZWQgdG8gZ2V0IHRoZSBrZXJuZWwgcnVubmluZywgd2hpY2gKKyAqIGdlbmVyYWxseSBtZWFucyBtYXBwaW5nIGluIHRoZSBrZXJuZWwgY29kZS4KKyAqCisgKiByOCAgPSBtYWNoaW5mbworICogcjkgID0gY3B1aWQKKyAqIHIxMCA9IHByb2NpbmZvCisgKgorICogUmV0dXJuczoKKyAqICByMCwgcjMsIHI1LCByNiwgcjcgY29ycnVwdGVkCisgKiAgcjQgPSBwaHlzaWNhbCBwYWdlIHRhYmxlIGFkZHJlc3MKKyAqLworCS50eXBlCV9fY3JlYXRlX3BhZ2VfdGFibGVzLCAlZnVuY3Rpb24KK19fY3JlYXRlX3BhZ2VfdGFibGVzOgorCWxkcglyNSwgW3I4LCAjTUFDSElORk9fUEhZU1JBTV0JQCBwaHlzcmFtCisJcGd0YmwJcjQsIHI1CQkJCUAgcGFnZSB0YWJsZSBhZGRyZXNzCisKKwkvKgorCSAqIENsZWFyIHRoZSAxNksgbGV2ZWwgMSBzd2FwcGVyIHBhZ2UgdGFibGUKKwkgKi8KKwltb3YJcjAsIHI0CisJbW92CXIzLCAjMAorCWFkZAlyNiwgcjAsICMweDQwMDAKKzE6CXN0cglyMywgW3IwXSwgIzQKKwlzdHIJcjMsIFtyMF0sICM0CisJc3RyCXIzLCBbcjBdLCAjNAorCXN0cglyMywgW3IwXSwgIzQKKwl0ZXEJcjAsIHI2CisJYm5lCTFiCisKKwlsZHIJcjcsIFtyMTAsICNQUk9DSU5GT19NTVVGTEFHU10JQCBtbXVmbGFncworCisJLyoKKwkgKiBDcmVhdGUgaWRlbnRpdHkgbWFwcGluZyBmb3IgZmlyc3QgTUIgb2Yga2VybmVsIHRvCisJICogY2F0ZXIgZm9yIHRoZSBNTVUgZW5hYmxlLiAgVGhpcyBpZGVudGl0eSBtYXBwaW5nCisJICogd2lsbCBiZSByZW1vdmVkIGJ5IHBhZ2luZ19pbml0KCkuICBXZSB1c2Ugb3VyIGN1cnJlbnQgcHJvZ3JhbQorCSAqIGNvdW50ZXIgdG8gZGV0ZXJtaW5lIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBiYXNlIGFkZHJlc3MuCisJICovCisJbW92CXI2LCBwYywgbHNyICMyMAkJCUAgc3RhcnQgb2Yga2VybmVsIHNlY3Rpb24KKwlvcnIJcjMsIHI3LCByNiwgbHNsICMyMAkJQCBmbGFncyArIGtlcm5lbCBiYXNlCisJc3RyCXIzLCBbcjQsIHI2LCBsc2wgIzJdCQlAIGlkZW50aXR5IG1hcHBpbmcKKworCS8qCisJICogTm93IHNldHVwIHRoZSBwYWdldGFibGVzIGZvciBvdXIga2VybmVsIGRpcmVjdAorCSAqIG1hcHBlZCByZWdpb24uICBXZSByb3VuZCBURVhUQUREUiBkb3duIHRvIHRoZQorCSAqIG5lYXJlc3QgbWVnYWJ5dGUgYm91bmRhcnkuICBJdCBpcyBhc3N1bWVkIHRoYXQKKwkgKiB0aGUga2VybmVsIGZpdHMgd2l0aGluIDQgY29udGlnb3VzIDFNQiBzZWN0aW9ucy4KKwkgKi8KKwlhZGQJcjAsIHI0LCAgIyhURVhUQUREUiAmIDB4ZmYwMDAwMDApID4+IDE4CUAgc3RhcnQgb2Yga2VybmVsCisJc3RyCXIzLCBbcjAsICMoVEVYVEFERFIgJiAweDAwZjAwMDAwKSA+PiAxOF0hCisJYWRkCXIzLCByMywgIzEgPDwgMjAKKwlzdHIJcjMsIFtyMCwgIzRdIQkJCUAgS0VSTkVMICsgMU1CCisJYWRkCXIzLCByMywgIzEgPDwgMjAKKwlzdHIJcjMsIFtyMCwgIzRdIQkJCUAgS0VSTkVMICsgMk1CCisJYWRkCXIzLCByMywgIzEgPDwgMjAKKwlzdHIJcjMsIFtyMCwgIzRdCQkJQCBLRVJORUwgKyAzTUIKKworCS8qCisJICogVGhlbiBtYXAgZmlyc3QgMU1CIG9mIHJhbSBpbiBjYXNlIGl0IGNvbnRhaW5zIG91ciBib290IHBhcmFtcy4KKwkgKi8KKwlhZGQJcjAsIHI0LCAjVklSVF9PRkZTRVQgPj4gMTgKKwlvcnIJcjYsIHI1LCByNworCXN0cglyNiwgW3IwXQorCisjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKKwkvKgorCSAqIE1hcCBzb21lIHJhbSB0byBjb3ZlciBvdXIgLmRhdGEgYW5kIC5ic3MgYXJlYXMuCisJICogTWFwcGluZyAzTUIgc2hvdWxkIGJlIHBsZW50eS4KKwkgKi8KKwlzdWIJcjMsIHI0LCByNQorCW1vdglyMywgcjMsIGxzciAjMjAKKwlhZGQJcjAsIHIwLCByMywgbHNsICMyCisJYWRkCXI2LCByNiwgcjMsIGxzbCAjMjAKKwlzdHIJcjYsIFtyMF0sICM0CisJYWRkCXI2LCByNiwgIygxIDw8IDIwKQorCXN0cglyNiwgW3IwXSwgIzQKKwlhZGQJcjYsIHI2LCAjKDEgPDwgMjApCisJc3RyCXI2LCBbcjBdCisjZW5kaWYKKworCWJpYwlyNywgcjcsICMweDBjCQkJQCB0dXJuIG9mZiBjYWNoZWFibGUKKwkJCQkJCUAgYW5kIGJ1ZmZlcmFibGUgYml0cworI2lmZGVmIENPTkZJR19ERUJVR19MTAorCS8qCisJICogTWFwIGluIElPIHNwYWNlIGZvciBzZXJpYWwgZGVidWdnaW5nLgorCSAqIFRoaXMgYWxsb3dzIGRlYnVnIG1lc3NhZ2VzIHRvIGJlIG91dHB1dAorCSAqIHZpYSBhIHNlcmlhbCBjb25zb2xlIGJlZm9yZSBwYWdpbmdfaW5pdC4KKwkgKi8KKwlsZHIJcjMsIFtyOCwgI01BQ0hJTkZPX1BHT0ZGSU9dCisJYWRkCXIwLCByNCwgcjMKKwlyc2IJcjMsIHIzLCAjMHg0MDAwCQkJQCBQVFJTX1BFUl9QR0Qqc2l6ZW9mKGxvbmcpCisJY21wCXIzLCAjMHgwODAwCQkJQCBsaW1pdCB0byA1MTJNQgorCW1vdmhpCXIzLCAjMHgwODAwCisJYWRkCXI2LCByMCwgcjMKKwlsZHIJcjMsIFtyOCwgI01BQ0hJTkZPX1BIWVNJT10KKwlvcnIJcjMsIHIzLCByNworMToJc3RyCXIzLCBbcjBdLCAjNAorCWFkZAlyMywgcjMsICMxIDw8IDIwCisJdGVxCXIwLCByNgorCWJuZQkxYgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTkVUV0lOREVSKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX0NBVFMpCisJLyoKKwkgKiBJZiB3ZSdyZSB1c2luZyB0aGUgTmV0V2luZGVyLCB3ZSBuZWVkIHRvIG1hcCBpbgorCSAqIHRoZSAxNjU1MC10eXBlIHNlcmlhbCBwb3J0IGZvciB0aGUgZGVidWcgbWVzc2FnZXMKKwkgKi8KKwl0ZXEJcjEsICNNQUNIX1RZUEVfTkVUV0lOREVSCisJdGVxbmUJcjEsICNNQUNIX1RZUEVfQ0FUUworCWJuZQkxZgorCWFkZAlyMCwgcjQsICMweDNmYzAJCQlAIGZmMDAwMDAwCisJbW92CXIzLCAjMHg3YzAwMDAwMAorCW9ycglyMywgcjMsIHI3CisJc3RyCXIzLCBbcjBdLCAjNAorCWFkZAlyMywgcjMsICMxIDw8IDIwCisJc3RyCXIzLCBbcjBdLCAjNAorMToKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfUlBDCisJLyoKKwkgKiBNYXAgaW4gc2NyZWVuIGF0IDB4MDIwMDAwMDAgJiBTQ1JFRU4yX0JBU0UKKwkgKiBTaW1pbGFyIHJlYXNvbnMgaGVyZSAtIGZvciBkZWJ1Zy4gIFRoaXMgaXMKKwkgKiBvbmx5IGZvciBBY29ybiBSaXNjUEMgYXJjaGl0ZWN0dXJlcy4KKwkgKi8KKwlhZGQJcjAsIHI0LCAjMHg4MAkJCUAgMDIwMDAwMDAKKwltb3YJcjMsICMweDAyMDAwMDAwCisJb3JyCXIzLCByMywgcjcKKwlzdHIJcjMsIFtyMF0KKwlhZGQJcjAsIHI0LCAjMHgzNjAwCQkJQCBkODAwMDAwMAorCXN0cglyMywgW3IwXQorI2VuZGlmCisJbW92CXBjLCBscgorCS5sdG9yZworCisKKworLyoKKyAqIEV4Y2VwdGlvbiBoYW5kbGluZy4gIFNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCB3ZSBjYW4ndCBwcm9jZWVkLiAgV2UKKyAqIG91Z2h0IHRvIHRlbGwgdGhlIHVzZXIsIGJ1dCBzaW5jZSB3ZSBkb24ndCBoYXZlIGFueSBndWFyYW50ZWUgdGhhdAorICogd2UncmUgZXZlbiBydW5uaW5nIG9uIHRoZSByaWdodCBhcmNoaXRlY3R1cmUsIHdlIGRvIHZpcnR1YWxseSBub3RoaW5nLgorICoKKyAqIElmIENPTkZJR19ERUJVR19MTCBpcyBzZXQgd2UgdHJ5IHRvIHByaW50IG91dCBzb21ldGhpbmcgYWJvdXQgdGhlIGVycm9yCisgKiBhbmQgaG9wZSBmb3IgdGhlIGJlc3QgKHVzZWZ1bCBpZiBib290bG9hZGVyIGZhaWxzIHRvIHBhc3MgYSBwcm9wZXIKKyAqIG1hY2hpbmUgSUQgZm9yIGV4YW1wbGUpLgorICovCisKKwkudHlwZQlfX2Vycm9yX3AsICVmdW5jdGlvbgorX19lcnJvcl9wOgorI2lmZGVmIENPTkZJR19ERUJVR19MTAorCWFkcglyMCwgc3RyX3AxCisJYmwJcHJpbnRhc2NpaQorCWIJX19lcnJvcgorc3RyX3AxOgkuYXNjaXoJIlxuRXJyb3I6IHVucmVjb2duaXplZC91bnN1cHBvcnRlZCBwcm9jZXNzb3IgdmFyaWFudC5cbiIKKwkuYWxpZ24KKyNlbmRpZgorCisJLnR5cGUJX19lcnJvcl9hLCAlZnVuY3Rpb24KK19fZXJyb3JfYToKKyNpZmRlZiBDT05GSUdfREVCVUdfTEwKKwltb3YJcjQsIHIxCQkJCUAgcHJlc2VydmUgbWFjaGluZSBJRAorCWFkcglyMCwgc3RyX2ExCisJYmwJcHJpbnRhc2NpaQorCW1vdglyMCwgcjQKKwlibAlwcmludGhleDgKKwlhZHIJcjAsIHN0cl9hMgorCWJsCXByaW50YXNjaWkKKwlhZHIJcjMsIDNmCisJbGRtaWEJcjMsIHtyNCwgcjUsIHI2fQkJQCBnZXQgbWFjaGluZSBkZXNjIGxpc3QKKwlzdWIJcjQsIHIzLCByNAkJCUAgZ2V0IG9mZnNldCBiZXR3ZWVuIHZpcnQmcGh5cworCWFkZAlyNSwgcjUsIHI0CQkJQCBjb252ZXJ0IHZpcnQgYWRkcmVzc2VzIHRvCisJYWRkCXI2LCByNiwgcjQJCQlAIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKKzE6CWxkcglyMCwgW3I1LCAjTUFDSElORk9fVFlQRV0JQCBnZXQgbWFjaGluZSB0eXBlCisJYmwJcHJpbnRoZXg4CisJbW92CXIwLCAjJ1x0JworCWJsCXByaW50Y2gKKwlsZHIgICAgIHIwLCBbcjUsICNNQUNISU5GT19OQU1FXQlAIGdldCBtYWNoaW5lIG5hbWUKKwlhZGQJcjAsIHIwLCByNAorCWJsCXByaW50YXNjaWkKKwltb3YJcjAsICMnXG4nCisJYmwJcHJpbnRjaAorCWFkZAlyNSwgcjUsICNTSVpFT0ZfTUFDSElORV9ERVNDCUAgbmV4dCBtYWNoaW5lX2Rlc2MKKwljbXAJcjUsIHI2CisJYmxvCTFiCisJYWRyCXIwLCBzdHJfYTMKKwlibAlwcmludGFzY2lpCisJYglfX2Vycm9yCitzdHJfYTE6CS5hc2NpegkiXG5FcnJvcjogdW5yZWNvZ25pemVkL3Vuc3VwcG9ydGVkIG1hY2hpbmUgSUQgKHIxID0gMHgiCitzdHJfYTI6CS5hc2NpegkiKS5cblxuQXZhaWxhYmxlIG1hY2hpbmUgc3VwcG9ydDpcblxuSUQgKGhleClcdE5BTUVcbiIKK3N0cl9hMzoJLmFzY2l6CSJcblBsZWFzZSBjaGVjayB5b3VyIGtlcm5lbCBjb25maWcgYW5kL29yIGJvb3Rsb2FkZXIuXG4iCisJLmFsaWduCisjZW5kaWYKKworCS50eXBlCV9fZXJyb3IsICVmdW5jdGlvbgorX19lcnJvcjoKKyNpZmRlZiBDT05GSUdfQVJDSF9SUEMKKy8qCisgKiBUdXJuIHRoZSBzY3JlZW4gcmVkIG9uIGEgZXJyb3IgLSBSaXNjUEMgb25seS4KKyAqLworCW1vdglyMCwgIzB4MDIwMDAwMDAKKwltb3YJcjMsICMweDExCisJb3JyCXIzLCByMywgcjMsIGxzbCAjOAorCW9ycglyMywgcjMsIHIzLCBsc2wgIzE2CisJc3RyCXIzLCBbcjBdLCAjNAorCXN0cglyMywgW3IwXSwgIzQKKwlzdHIJcjMsIFtyMF0sICM0CisJc3RyCXIzLCBbcjBdLCAjNAorI2VuZGlmCisxOgltb3YJcjAsIHIwCisJYgkxYgorCisKKy8qCisgKiBSZWFkIHByb2Nlc3NvciBJRCByZWdpc3RlciAoQ1AjMTUsIENSMCksIGFuZCBsb29rIHVwIGluIHRoZSBsaW5rZXItYnVpbHQKKyAqIHN1cHBvcnRlZCBwcm9jZXNzb3IgbGlzdC4gIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGFic29sdXRlIGFkZHJlc3NlcworICogZm9yIHRoZSBfX3Byb2NfaW5mbyBsaXN0cyBzaW5jZSB3ZSBhcmVuJ3QgcnVubmluZyB3aXRoIHRoZSBNTVUgb24KKyAqIChhbmQgdGhlcmVmb3JlLCB3ZSBhcmUgbm90IGluIHRoZSBjb3JyZWN0IGFkZHJlc3Mgc3BhY2UpLiAgV2UgaGF2ZSB0bworICogY2FsY3VsYXRlIHRoZSBvZmZzZXQuCisgKgorICogUmV0dXJuczoKKyAqCXIzLCByNCwgcjYgY29ycnVwdGVkCisgKglyNSA9IHByb2NfaW5mbyBwb2ludGVyIGluIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKKyAqCXI5ID0gY3B1aWQKKyAqLworCS50eXBlCV9fbG9va3VwX3Byb2Nlc3Nvcl90eXBlLCAlZnVuY3Rpb24KK19fbG9va3VwX3Byb2Nlc3Nvcl90eXBlOgorCWFkcglyMywgM2YKKwlsZG1kYQlyMywge3I1LCByNiwgcjl9CisJc3ViCXIzLCByMywgcjkJCQlAIGdldCBvZmZzZXQgYmV0d2VlbiB2aXJ0JnBoeXMKKwlhZGQJcjUsIHI1LCByMwkJCUAgY29udmVydCB2aXJ0IGFkZHJlc3NlcyB0bworCWFkZAlyNiwgcjYsIHIzCQkJQCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlCisJbXJjCXAxNSwgMCwgcjksIGMwLCBjMAkJQCBnZXQgcHJvY2Vzc29yIGlkCisxOglsZG1pYQlyNSwge3IzLCByNH0JCQlAIHZhbHVlLCBtYXNrCisJYW5kCXI0LCByNCwgcjkJCQlAIG1hc2sgd2FudGVkIGJpdHMKKwl0ZXEJcjMsIHI0CisJYmVxCTJmCisJYWRkCXI1LCByNSwgI1BST0NfSU5GT19TWgkJQCBzaXplb2YocHJvY19pbmZvX2xpc3QpCisJY21wCXI1LCByNgorCWJsbwkxYgorCW1vdglyNSwgIzAJCQkJQCB1bmtub3duIHByb2Nlc3NvcgorMjoJbW92CXBjLCBscgorCisvKgorICogVGhpcyBwcm92aWRlcyBhIEMtQVBJIHZlcnNpb24gb2YgdGhlIGFib3ZlIGZ1bmN0aW9uLgorICovCitFTlRSWShsb29rdXBfcHJvY2Vzc29yX3R5cGUpCisJc3RtZmQJc3AhLCB7cjQgLSByNiwgcjksIGxyfQorCWJsCV9fbG9va3VwX3Byb2Nlc3Nvcl90eXBlCisJbW92CXIwLCByNQorCWxkbWZkCXNwISwge3I0IC0gcjYsIHI5LCBwY30KKworLyoKKyAqIExvb2sgaW4gaW5jbHVkZS9hc20tYXJtL3Byb2NpbmZvLmggYW5kIGFyY2gvYXJtL2tlcm5lbC9hcmNoLltjaF0gZm9yCisgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBfX3Byb2NfaW5mbyBhbmQgX19hcmNoX2luZm8gc3RydWN0dXJlcy4KKyAqLworCS5sb25nCV9fcHJvY19pbmZvX2JlZ2luCisJLmxvbmcJX19wcm9jX2luZm9fZW5kCiszOgkubG9uZwkuCisJLmxvbmcJX19hcmNoX2luZm9fYmVnaW4KKwkubG9uZwlfX2FyY2hfaW5mb19lbmQKKworLyoKKyAqIExvb2t1cCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBpbiB0aGUgbGlua2VyLWJ1aWxkIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcy4KKyAqIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGFic29sdXRlIGFkZHJlc3NlcyBmb3IgdGhlIF9fYXJjaF9pbmZvCisgKiBsaXN0cyBzaW5jZSB3ZSBhcmVuJ3QgcnVubmluZyB3aXRoIHRoZSBNTVUgb24gKGFuZCB0aGVyZWZvcmUsIHdlIGFyZQorICogbm90IGluIHRoZSBjb3JyZWN0IGFkZHJlc3Mgc3BhY2UpLiAgV2UgaGF2ZSB0byBjYWxjdWxhdGUgdGhlIG9mZnNldC4KKyAqCisgKiAgcjEgPSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBudW1iZXIKKyAqIFJldHVybnM6CisgKiAgcjMsIHI0LCByNiBjb3JydXB0ZWQKKyAqICByNSA9IG1hY2hfaW5mbyBwb2ludGVyIGluIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKKyAqLworCS50eXBlCV9fbG9va3VwX21hY2hpbmVfdHlwZSwgJWZ1bmN0aW9uCitfX2xvb2t1cF9tYWNoaW5lX3R5cGU6CisJYWRyCXIzLCAzYgorCWxkbWlhCXIzLCB7cjQsIHI1LCByNn0KKwlzdWIJcjMsIHIzLCByNAkJCUAgZ2V0IG9mZnNldCBiZXR3ZWVuIHZpcnQmcGh5cworCWFkZAlyNSwgcjUsIHIzCQkJQCBjb252ZXJ0IHZpcnQgYWRkcmVzc2VzIHRvCisJYWRkCXI2LCByNiwgcjMJCQlAIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKKzE6CWxkcglyMywgW3I1LCAjTUFDSElORk9fVFlQRV0JQCBnZXQgbWFjaGluZSB0eXBlCisJdGVxCXIzLCByMQkJCQlAIG1hdGNoZXMgbG9hZGVyIG51bWJlcj8KKwliZXEJMmYJCQkJQCBmb3VuZAorCWFkZAlyNSwgcjUsICNTSVpFT0ZfTUFDSElORV9ERVNDCUAgbmV4dCBtYWNoaW5lX2Rlc2MKKwljbXAJcjUsIHI2CisJYmxvCTFiCisJbW92CXI1LCAjMAkJCQlAIHVua25vd24gbWFjaGluZQorMjoJbW92CXBjLCBscgorCisvKgorICogVGhpcyBwcm92aWRlcyBhIEMtQVBJIHZlcnNpb24gb2YgdGhlIGFib3ZlIGZ1bmN0aW9uLgorICovCitFTlRSWShsb29rdXBfbWFjaGluZV90eXBlKQorCXN0bWZkCXNwISwge3I0IC0gcjYsIGxyfQorCW1vdglyMSwgcjAKKwlibAlfX2xvb2t1cF9tYWNoaW5lX3R5cGUKKwltb3YJcjAsIHI1CisJbGRtZmQJc3AhLCB7cjQgLSByNiwgcGN9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL2FybS9rZXJuZWwvaW5pdF90YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwY2NhMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9pbml0X3Rhc2suYworICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21xdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCitzdGF0aWMgc3RydWN0IGZzX3N0cnVjdCBpbml0X2ZzID0gSU5JVF9GUzsKK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0IGluaXRfZmlsZXMgPSBJTklUX0ZJTEVTOworc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2lnbmFscyA9IElOSVRfU0lHTkFMUyhpbml0X3NpZ25hbHMpOworc3RhdGljIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCBpbml0X3NpZ2hhbmQgPSBJTklUX1NJR0hBTkQoaW5pdF9zaWdoYW5kKTsKK3N0cnVjdCBtbV9zdHJ1Y3QgaW5pdF9tbSA9IElOSVRfTU0oaW5pdF9tbSk7CisKK0VYUE9SVF9TWU1CT0woaW5pdF9tbSk7CisKKy8qCisgKiBJbml0aWFsIHRocmVhZCBzdHJ1Y3R1cmUuCisgKgorICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIDgxOTItYnl0ZSBhbGlnbmVkIGR1ZSB0byB0aGUKKyAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IG1ha2luZyBzdXJlCisgKiB0aGUgbGlua2VyIG1hcHMgdGhpcyBpbiB0aGUgLnRleHQgc2VnbWVudCByaWdodCBhZnRlciBoZWFkLlMsCisgKiBhbmQgbWFraW5nIGhlYWQuUyBlbnN1cmUgdGhlIHByb3BlciBhbGlnbm1lbnQuCisgKgorICogVGhlIHRoaW5ncyB3ZSBkbyBmb3IgcGVyZm9ybWFuY2UuLgorICovCit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmluaXQudGFzayIpKSkgPQorCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OworCisvKgorICogSW5pdGlhbCB0YXNrIHN0cnVjdHVyZS4KKyAqCisgKiBBbGwgb3RoZXIgdGFzayBzdHJ1Y3RzIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHNsYWJzIGluIGZvcmsuYworICovCitzdHJ1Y3QgdGFza19zdHJ1Y3QgaW5pdF90YXNrID0gSU5JVF9UQVNLKGluaXRfdGFzayk7CisKK0VYUE9SVF9TWU1CT0woaW5pdF90YXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pby5jIGIvYXJjaC9hcm0va2VybmVsL2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyMGMxMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pby5jCkBAIC0wLDAgKzEsNTEgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBDb3B5IGRhdGEgZnJvbSBJTyBtZW1vcnkgc3BhY2UgdG8gInJlYWwiIG1lbW9yeSBzcGFjZS4KKyAqIFRoaXMgbmVlZHMgdG8gYmUgb3B0aW1pemVkLgorICovCit2b2lkIF9tZW1jcHlfZnJvbWlvKHZvaWQgKnRvLCB2b2lkIF9faW9tZW0gKmZyb20sIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBjaGFyICp0ID0gdG87CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50LS07CisJCSp0ID0gcmVhZGIoZnJvbSk7CisJCXQrKzsKKwkJZnJvbSsrOworCX0KK30KKworLyoKKyAqIENvcHkgZGF0YSBmcm9tICJyZWFsIiBtZW1vcnkgc3BhY2UgdG8gSU8gbWVtb3J5IHNwYWNlLgorICogVGhpcyBuZWVkcyB0byBiZSBvcHRpbWl6ZWQuCisgKi8KK3ZvaWQgX21lbWNweV90b2lvKHZvaWQgX19pb21lbSAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmID0gZnJvbTsKKwl3aGlsZSAoY291bnQpIHsKKwkJY291bnQtLTsKKwkJd3JpdGViKCpmLCB0byk7CisJCWYrKzsKKwkJdG8rKzsKKwl9Cit9CisKKy8qCisgKiAibWVtc2V0IiBvbiBJTyBtZW1vcnkgc3BhY2UuCisgKiBUaGlzIG5lZWRzIHRvIGJlIG9wdGltaXplZC4KKyAqLwordm9pZCBfbWVtc2V0X2lvKHZvaWQgX19pb21lbSAqZHN0LCBpbnQgYywgc2l6ZV90IGNvdW50KQoreworCXdoaWxlIChjb3VudCkgeworCQljb3VudC0tOworCQl3cml0ZWIoYywgZHN0KTsKKwkJZHN0Kys7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKF9tZW1jcHlfZnJvbWlvKTsKK0VYUE9SVF9TWU1CT0woX21lbWNweV90b2lvKTsKK0VYUE9SVF9TWU1CT0woX21lbXNldF9pbyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxODdmNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwpAQCAtMCwwICsxLDEwMzggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2lycS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiBMaW51cyBUb3J2YWxkcworICogIE1vZGlmaWNhdGlvbnMgZm9yIEFSTSBwcm9jZXNzb3IgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB1c2VkIGJ5IHZhcmlvdXMgSVJRIGhhbmRsaW5nIHJvdXRpbmVzOgorICogIGFza2luZyBmb3IgZGlmZmVyZW50IElSUSdzIHNob3VsZCBiZSBkb25lIHRocm91Z2ggdGhlc2Ugcm91dGluZXMKKyAqICBpbnN0ZWFkIG9mIGp1c3QgZ3JhYmJpbmcgdGhlbS4gVGh1cyBzZXR1cHMgd2l0aCBkaWZmZXJlbnQgSVJRIG51bWJlcnMKKyAqICBzaG91bGRuJ3QgcmVzdWx0IGluIGFueSB3ZWlyZCBzdXJwcmlzZXMsIGFuZCBpbnN0YWxsaW5nIG5ldyBoYW5kbGVycworICogIHNob3VsZCBiZSBlYXNpZXIuCisgKgorICogIElSUSdzIGFyZSBpbiBmYWN0IGltcGxlbWVudGVkIGEgYml0IGxpa2Ugc2lnbmFsIGhhbmRsZXJzIGZvciB0aGUga2VybmVsLgorICogIE5hdHVyYWxseSBpdCdzIG5vdCBhIDE6MSByZWxhdGlvbiwgYnV0IHRoZXJlIGFyZSBzaW1pbGFyaXRpZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKy8qCisgKiBNYXhpbXVtIElSUSBjb3VudC4gIEN1cnJlbnRseSwgdGhpcyBpcyBhcmJpdGFyeS4gIEhvd2V2ZXIsIGl0IHNob3VsZAorICogbm90IGJlIHNldCB0b28gbG93IHRvIHByZXZlbnQgZmFsc2UgdHJpZ2dlcmluZy4gIENvbnZlcnNlbHksIGlmIGl0CisgKiBpcyBzZXQgdG9vIGhpZ2gsIHRoZW4geW91IGNvdWxkIG1pc3MgYSBzdHVjayBJUlEuCisgKgorICogTWF5YmUgd2Ugb3VnaHQgdG8gc2V0IGEgdGltZXIgYW5kIHJlLWVuYWJsZSB0aGUgSVJRIGF0IGEgbGF0ZXIgdGltZT8KKyAqLworI2RlZmluZSBNQVhfSVJRX0NOVAkxMDAwMDAKKworc3RhdGljIGludCBub2lycWRlYnVnOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaXJxX2Vycl9jb3VudDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXJxX2NvbnRyb2xsZXJfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGlycV9wZW5kaW5nKTsKKworc3RydWN0IGlycWRlc2MgaXJxX2Rlc2NbTlJfSVJRU107Cit2b2lkICgqaW5pdF9hcmNoX2lycSkodm9pZCkgX19pbml0ZGF0YSA9IE5VTEw7CisKKy8qCisgKiBObyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaXJxX2ZpbmlzaCBmdW5jdGlvbiBkZWZpbmVkIGluIGFybS9hcmNoL2lycXMuaC4KKyAqLworI2lmbmRlZiBpcnFfZmluaXNoCisjZGVmaW5lIGlycV9maW5pc2goaXJxKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIER1bW15IG1hc2svdW5tYXNrIGhhbmRsZXIKKyAqLwordm9pZCBkdW1teV9tYXNrX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKK30KKworaXJxcmV0dXJuX3Qgbm9fYWN0aW9uKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIElSUV9OT05FOworfQorCit2b2lkIGRvX2JhZF9JUlEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlycV9lcnJfY291bnQgKz0gMTsKKwlwcmludGsoS0VSTl9FUlIgIklSUTogc3B1cmlvdXMgaW50ZXJydXB0ICVkXG4iLCBpcnEpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgYmFkX2NoaXAgPSB7CisJLmFjawk9IGR1bW15X21hc2tfdW5tYXNrX2lycSwKKwkubWFzawk9IGR1bW15X21hc2tfdW5tYXNrX2lycSwKKwkudW5tYXNrID0gZHVtbXlfbWFza191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFkZXNjIGJhZF9pcnFfZGVzYyA9IHsKKwkuY2hpcAkJPSAmYmFkX2NoaXAsCisJLmhhbmRsZQkJPSBkb19iYWRfSVJRLAorCS5wZW5kCQk9IExJU1RfSEVBRF9JTklUKGJhZF9pcnFfZGVzYy5wZW5kKSwKKwkuZGlzYWJsZV9kZXB0aAk9IDEsCit9OworCisjaWZkZWYgQ09ORklHX1NNUAordm9pZCBzeW5jaHJvbml6ZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJd2hpbGUgKGRlc2MtPnJ1bm5pbmcpCisJCWJhcnJpZXIoKTsKK30KK0VYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaXJxKTsKKworI2RlZmluZSBzbXBfc2V0X3J1bm5pbmcoZGVzYykJZG8geyBkZXNjLT5ydW5uaW5nID0gMTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc21wX2NsZWFyX3J1bm5pbmcoZGVzYykJZG8geyBkZXNjLT5ydW5uaW5nID0gMDsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIHNtcF9zZXRfcnVubmluZyhkZXNjKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNtcF9jbGVhcl9ydW5uaW5nKGRlc2MpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKioKKyAqCWRpc2FibGVfaXJxX25vc3luYyAtIGRpc2FibGUgYW4gaXJxIHdpdGhvdXQgd2FpdGluZworICoJQGlycTogSW50ZXJydXB0IHRvIGRpc2FibGUKKyAqCisgKglEaXNhYmxlIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHQgbGluZS4gIEVuYWJsZXMgYW5kIGRpc2FibGVzCisgKglhcmUgbmVzdGVkLiAgV2UgZG8gdGhpcyBsYXppbHkuCisgKgorICoJVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gSVJRIGNvbnRleHQuCisgKi8KK3ZvaWQgZGlzYWJsZV9pcnFfbm9zeW5jKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycWRlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlkZXNjLT5kaXNhYmxlX2RlcHRoKys7CisJbGlzdF9kZWxfaW5pdCgmZGVzYy0+cGVuZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChkaXNhYmxlX2lycV9ub3N5bmMpOworCisvKioKKyAqCWRpc2FibGVfaXJxIC0gZGlzYWJsZSBhbiBpcnEgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24KKyAqCUBpcnE6IEludGVycnVwdCB0byBkaXNhYmxlCisgKgorICoJRGlzYWJsZSB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0IGxpbmUuICBFbmFibGVzIGFuZCBkaXNhYmxlcworICoJYXJlIG5lc3RlZC4gIFRoaXMgZnVuY3Rpb25zIHdhaXRzIGZvciBhbnkgcGVuZGluZyBJUlEKKyAqCWhhbmRsZXJzIGZvciB0aGlzIGludGVycnVwdCB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLgorICoJSWYgeW91IHVzZSB0aGlzIGZ1bmN0aW9uIHdoaWxlIGhvbGRpbmcgYSByZXNvdXJjZSB0aGUgSVJRCisgKgloYW5kbGVyIG1heSBuZWVkIHlvdSB3aWxsIGRlYWRsb2NrLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCAtIHdpdGggY2FyZSAtIGZyb20gSVJRIGNvbnRleHQuCisgKi8KK3ZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJaWYgKGRlc2MtPmFjdGlvbikKKwkJc3luY2hyb25pemVfaXJxKGlycSk7Cit9CitFWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKKworLyoqCisgKgllbmFibGVfaXJxIC0gZW5hYmxlIGludGVycnVwdCBoYW5kbGluZyBvbiBhbiBpcnEKKyAqCUBpcnE6IEludGVycnVwdCB0byBlbmFibGUKKyAqCisgKglSZS1lbmFibGVzIHRoZSBwcm9jZXNzaW5nIG9mIGludGVycnVwdHMgb24gdGhpcyBJUlEgbGluZS4KKyAqCU5vdGUgdGhhdCB0aGlzIG1heSBjYWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgc28geW91IG1heQorICoJZ2V0IHVuZXhwZWN0ZWQgcmVzdWx0cyBpZiB5b3UgaG9sZCBJUlFzIGRpc2FibGVkLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIElSUSBjb250ZXh0LgorICovCit2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseSghZGVzYy0+ZGlzYWJsZV9kZXB0aCkpIHsKKwkJcHJpbnRrKCJlbmFibGVfaXJxKCV1KSB1bmJhbGFuY2VkIGZyb20gJXBcbiIsIGlycSwKKwkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJfSBlbHNlIGlmICghLS1kZXNjLT5kaXNhYmxlX2RlcHRoKSB7CisJCWRlc2MtPnByb2JpbmcgPSAwOworCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKKworCQkvKgorCQkgKiBJZiB0aGUgaW50ZXJydXB0IGlzIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkLAorCQkgKiB0cnkgdG8gcmUtcnVuIGl0LiAgV2UgY2FuJ3QgZGlyZWN0bHkgcnVuIGl0CisJCSAqIGZyb20gaGVyZSBzaW5jZSB0aGUgY2FsbGVyIG1pZ2h0IGJlIGluIGFuCisJCSAqIGludGVycnVwdC1wcm90ZWN0ZWQgcmVnaW9uLgorCQkgKi8KKwkJaWYgKGRlc2MtPnBlbmRpbmcgJiYgbGlzdF9lbXB0eSgmZGVzYy0+cGVuZCkpIHsKKwkJCWRlc2MtPnBlbmRpbmcgPSAwOworCQkJaWYgKCFkZXNjLT5jaGlwLT5yZXRyaWdnZXIgfHwKKwkJCSAgICBkZXNjLT5jaGlwLT5yZXRyaWdnZXIoaXJxKSkKKwkJCQlsaXN0X2FkZCgmZGVzYy0+cGVuZCwgJmlycV9wZW5kaW5nKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGVuYWJsZV9pcnEpOworCisvKgorICogRW5hYmxlIHdha2Ugb24gc2VsZWN0ZWQgaXJxCisgKi8KK3ZvaWQgZW5hYmxlX2lycV93YWtlKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycWRlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGVzYy0+Y2hpcC0+d2FrZSkKKwkJZGVzYy0+Y2hpcC0+d2FrZShpcnEsIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woZW5hYmxlX2lycV93YWtlKTsKKwordm9pZCBkaXNhYmxlX2lycV93YWtlKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycWRlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGVzYy0+Y2hpcC0+d2FrZSkKKwkJZGVzYy0+Y2hpcC0+d2FrZShpcnEsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnFfd2FrZSk7CisKK2ludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCWludCBpID0gKihsb2ZmX3QgKikgdiwgY3B1OworCXN0cnVjdCBpcnFhY3Rpb24gKiBhY3Rpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpID09IDApIHsKKwkJY2hhciBjcHVuYW1lWzEyXTsKKworCQlzZXFfcHJpbnRmKHAsICIgICAgIik7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQkJc3ByaW50ZihjcHVuYW1lLCAiQ1BVJWQiLCBjcHUpOworCQkJc2VxX3ByaW50ZihwLCAiICUxMHMiLCBjcHVuYW1lKTsKKwkJfQorCQlzZXFfcHV0YyhwLCAnXG4nKTsKKwl9CisKKwlpZiAoaSA8IE5SX0lSUVMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwkgICAgCWFjdGlvbiA9IGlycV9kZXNjW2ldLmFjdGlvbjsKKwkJaWYgKCFhY3Rpb24pCisJCQlnb3RvIHVubG9jazsKKworCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsIGkpOworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpCisJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShjcHUpLmlycXNbaV0pOworCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKKwkJZm9yIChhY3Rpb24gPSBhY3Rpb24tPm5leHQ7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KQorCQkJc2VxX3ByaW50ZihwLCAiLCAlcyIsIGFjdGlvbi0+bmFtZSk7CisKKwkJc2VxX3B1dGMocCwgJ1xuJyk7Cit1bmxvY2s6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKGkgPT0gTlJfSVJRUykgeworI2lmZGVmIENPTkZJR19BUkNIX0FDT1JOCisJCXNob3dfZmlxX2xpc3QocCwgdik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU01QCisJCXNob3dfaXBpX2xpc3QocCk7CisjZW5kaWYKKwkJc2VxX3ByaW50ZihwLCAiRXJyOiAlMTBsdVxuIiwgaXJxX2Vycl9jb3VudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogSVJRIGxvY2sgZGV0ZWN0aW9uLgorICoKKyAqIEhvcGVmdWxseSwgdGhpcyBzaG91bGQgZ2V0IHVzIG91dCBvZiBhIGZldyBsb2NrZWQgc2l0dWF0aW9ucy4KKyAqIEhvd2V2ZXIsIGl0IG1heSB0YWtlIGEgd2hpbGUgZm9yIHRoaXMgdG8gaGFwcGVuLCBzaW5jZSB3ZSBuZWVkCisgKiBhIGxhcmdlIG51bWJlciBpZiBJUlFzIHRvIGFwcGVhciBpbiB0aGUgc2FtZSBqaWZmaWUgd2l0aCB0aGUKKyAqIHNhbWUgaW5zdHJ1Y3Rpb24gcG9pbnRlciAob3Igd2l0aGluIDIgaW5zdHJ1Y3Rpb25zKS4KKyAqLworc3RhdGljIGludCBjaGVja19pcnFfbG9jayhzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBpbnN0cl9wdHIgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOworCisJaWYgKGRlc2MtPmxja19qaWYgPT0gamlmZmllcyAmJgorCSAgICBkZXNjLT5sY2tfcGMgPj0gaW5zdHJfcHRyICYmIGRlc2MtPmxja19wYyA8IGluc3RyX3B0ciArIDgpIHsKKwkJZGVzYy0+bGNrX2NudCArPSAxOworCisJCWlmIChkZXNjLT5sY2tfY250ID4gTUFYX0lSUV9DTlQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSVJRIExPQ0s6IElSUSVkIGlzIGxvY2tpbmcgdGhlIHN5c3RlbSwgZGlzYWJsZWRcbiIsIGlycSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCWRlc2MtPmxja19jbnQgPSAwOworCQlkZXNjLT5sY2tfcGMgID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKwkJZGVzYy0+bGNrX2ppZiA9IGppZmZpZXM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcmVwb3J0X2JhZF9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBpbnQgcmV0KQoreworCXN0YXRpYyBpbnQgY291bnQgPSAxMDA7CisJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOworCisJaWYgKCFjb3VudCB8fCBub2lycWRlYnVnKQorCQlyZXR1cm47CisKKwljb3VudC0tOworCisJaWYgKHJldCAhPSBJUlFfSEFORExFRCAmJiByZXQgIT0gSVJRX05PTkUpIHsKKwkJcHJpbnRrKCJpcnEldTogYm9ndXMgcmV0dmFsIG1hc2sgJXhcbiIsIGlycSwgcmV0KTsKKwl9IGVsc2UgeworCQlwcmludGsoImlycSV1OiBub2JvZHkgY2FyZWRcbiIsIGlycSk7CisJfQorCXNob3dfcmVncyhyZWdzKTsKKwlkdW1wX3N0YWNrKCk7CisJcHJpbnRrKEtFUk5fRVJSICJoYW5kbGVyczoiKTsKKwlhY3Rpb24gPSBkZXNjLT5hY3Rpb247CisJZG8geworCQlwcmludGsoIlxuIiBLRVJOX0VSUiAiWzwlcD5dIiwgYWN0aW9uLT5oYW5kbGVyKTsKKwkJcHJpbnRfc3ltYm9sKCIgKCVzKSIsICh1bnNpZ25lZCBsb25nKWFjdGlvbi0+aGFuZGxlcik7CisJCWFjdGlvbiA9IGFjdGlvbi0+bmV4dDsKKwl9IHdoaWxlIChhY3Rpb24pOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGludAorX19kb19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCByZXQsIHJldHZhbCA9IDA7CisKKwlzcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisKKwlpZiAoIShhY3Rpb24tPmZsYWdzICYgU0FfSU5URVJSVVBUKSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJc3RhdHVzID0gMDsKKwlkbyB7CisJCXJldCA9IGFjdGlvbi0+aGFuZGxlcihpcnEsIGFjdGlvbi0+ZGV2X2lkLCByZWdzKTsKKwkJaWYgKHJldCA9PSBJUlFfSEFORExFRCkKKwkJCXN0YXR1cyB8PSBhY3Rpb24tPmZsYWdzOworCQlyZXR2YWwgfD0gcmV0OworCQlhY3Rpb24gPSBhY3Rpb24tPm5leHQ7CisJfSB3aGlsZSAoYWN0aW9uKTsKKworCWlmIChzdGF0dXMgJiBTQV9TQU1QTEVfUkFORE9NKQorCQlhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaXJxKTsKKworCXNwaW5fbG9ja19pcnEoJmlycV9jb250cm9sbGVyX2xvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgaXMgZm9yIHNvZnR3YXJlLWRlY29kZWQgSVJRcy4gIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8KKyAqIGhhbmRsZSB0aGUgYWNrLCBjbGVhciwgbWFzayBhbmQgdW5tYXNrIGlzc3Vlcy4KKyAqLwordm9pZAorZG9fc2ltcGxlX0lSUSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOworCWNvbnN0IHVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlkZXNjLT50cmlnZ2VyZWQgPSAxOworCisJa3N0YXRfY3B1KGNwdSkuaXJxc1tpcnFdKys7CisKKwlzbXBfc2V0X3J1bm5pbmcoZGVzYyk7CisKKwlhY3Rpb24gPSBkZXNjLT5hY3Rpb247CisJaWYgKGFjdGlvbikgeworCQlpbnQgcmV0ID0gX19kb19pcnEoaXJxLCBhY3Rpb24sIHJlZ3MpOworCQlpZiAocmV0ICE9IElSUV9IQU5ETEVEKQorCQkJcmVwb3J0X2JhZF9pcnEoaXJxLCByZWdzLCBkZXNjLCByZXQpOworCX0KKworCXNtcF9jbGVhcl9ydW5uaW5nKGRlc2MpOworfQorCisvKgorICogTW9zdCBlZGdlLXRyaWdnZXJlZCBJUlEgaW1wbGVtZW50YXRpb25zIHNlZW0gdG8gdGFrZSBhIGJyb2tlbgorICogYXBwcm9hY2ggdG8gdGhpcy4gIEhlbmNlIHRoZSBjb21wbGV4aXR5LgorICovCit2b2lkCitkb19lZGdlX0lSUSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWRlc2MtPnRyaWdnZXJlZCA9IDE7CisKKwkvKgorCSAqIElmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIHRoaXMgSVJRLCBvciBpdHMgZGlzYWJsZWQsCisJICogd2Ugc2hvdWxkbid0IHByb2Nlc3MgdGhlIElSUS4gIEluc3RlYWQsIHR1cm4gb24gdGhlCisJICogaGFyZHdhcmUgbWFza3MuCisJICovCisJaWYgKHVubGlrZWx5KGRlc2MtPnJ1bm5pbmcgfHwgZGVzYy0+ZGlzYWJsZV9kZXB0aCkpCisJCWdvdG8gcnVubmluZzsKKworCS8qCisJICogQWNrbm93bGVkZ2UgYW5kIGNsZWFyIHRoZSBJUlEsIGJ1dCBkb24ndCBtYXNrIGl0LgorCSAqLworCWRlc2MtPmNoaXAtPmFjayhpcnEpOworCisJLyoKKwkgKiBNYXJrIHRoZSBJUlEgY3VycmVudGx5IGluIHByb2dyZXNzLgorCSAqLworCWRlc2MtPnJ1bm5pbmcgPSAxOworCisJa3N0YXRfY3B1KGNwdSkuaXJxc1tpcnFdKys7CisKKwlkbyB7CisJCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKKworCQlhY3Rpb24gPSBkZXNjLT5hY3Rpb247CisJCWlmICghYWN0aW9uKQorCQkJYnJlYWs7CisKKwkJaWYgKGRlc2MtPnBlbmRpbmcgJiYgIWRlc2MtPmRpc2FibGVfZGVwdGgpIHsKKwkJCWRlc2MtPnBlbmRpbmcgPSAwOworCQkJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CisJCX0KKworCQlfX2RvX2lycShpcnEsIGFjdGlvbiwgcmVncyk7CisJfSB3aGlsZSAoZGVzYy0+cGVuZGluZyAmJiAhZGVzYy0+ZGlzYWJsZV9kZXB0aCk7CisKKwlkZXNjLT5ydW5uaW5nID0gMDsKKworCS8qCisJICogSWYgd2Ugd2VyZSBkaXNhYmxlZCBvciBmcmVlZCwgc2h1dCBkb3duIHRoZSBoYW5kbGVyLgorCSAqLworCWlmIChsaWtlbHkoZGVzYy0+YWN0aW9uICYmICFjaGVja19pcnFfbG9jayhkZXNjLCBpcnEsIHJlZ3MpKSkKKwkJcmV0dXJuOworCisgcnVubmluZzoKKwkvKgorCSAqIFdlIGdvdCBhbm90aGVyIElSUSB3aGlsZSB0aGlzIG9uZSB3YXMgbWFza2VkIG9yCisJICogY3VycmVudGx5IHJ1bm5pbmcuICBEZWxheSBpdC4KKwkgKi8KKwlkZXNjLT5wZW5kaW5nID0gMTsKKwlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CisJZGVzYy0+Y2hpcC0+YWNrKGlycSk7Cit9CisKKy8qCisgKiBMZXZlbC1iYXNlZCBJUlEgaGFuZGxlci4gIE5pY2UgYW5kIHNpbXBsZS4KKyAqLwordm9pZAorZG9fbGV2ZWxfSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247CisJY29uc3QgdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWRlc2MtPnRyaWdnZXJlZCA9IDE7CisKKwkvKgorCSAqIEFja25vd2xlZGdlLCBjbGVhciBfQU5EXyBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQuCisJICovCisJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CisKKwlpZiAobGlrZWx5KCFkZXNjLT5kaXNhYmxlX2RlcHRoKSkgeworCQlrc3RhdF9jcHUoY3B1KS5pcnFzW2lycV0rKzsKKworCQlzbXBfc2V0X3J1bm5pbmcoZGVzYyk7CisKKwkJLyoKKwkJICogUmV0dXJuIHdpdGggdGhpcyBpbnRlcnJ1cHQgbWFza2VkIGlmIG5vIGFjdGlvbgorCQkgKi8KKwkJYWN0aW9uID0gZGVzYy0+YWN0aW9uOworCQlpZiAoYWN0aW9uKSB7CisJCQlpbnQgcmV0ID0gX19kb19pcnEoaXJxLCBkZXNjLT5hY3Rpb24sIHJlZ3MpOworCisJCQlpZiAocmV0ICE9IElSUV9IQU5ETEVEKQorCQkJCXJlcG9ydF9iYWRfaXJxKGlycSwgcmVncywgZGVzYywgcmV0KTsKKworCQkJaWYgKGxpa2VseSghZGVzYy0+ZGlzYWJsZV9kZXB0aCAmJgorCQkJCSAgICFjaGVja19pcnFfbG9jayhkZXNjLCBpcnEsIHJlZ3MpKSkKKwkJCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKKwkJfQorCisJCXNtcF9jbGVhcl9ydW5uaW5nKGRlc2MpOworCX0KK30KKworc3RhdGljIHZvaWQgZG9fcGVuZGluZ19pcnFzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZCwgKmwsICpuOworCisJZG8geworCQlzdHJ1Y3QgaXJxZGVzYyAqZGVzYzsKKworCQkvKgorCQkgKiBGaXJzdCwgdGFrZSB0aGUgcGVuZGluZyBpbnRlcnJ1cHRzIG9mZiB0aGUgbGlzdC4KKwkJICogVGhlIGFjdCBvZiBjYWxsaW5nIHRoZSBoYW5kbGVycyBtYXkgYWRkIHNvbWUgSVJRcworCQkgKiBiYWNrIG9udG8gdGhlIGxpc3QuCisJCSAqLworCQloZWFkID0gaXJxX3BlbmRpbmc7CisJCUlOSVRfTElTVF9IRUFEKCZpcnFfcGVuZGluZyk7CisJCWhlYWQubmV4dC0+cHJldiA9ICZoZWFkOworCQloZWFkLnByZXYtPm5leHQgPSAmaGVhZDsKKworCQkvKgorCQkgKiBOb3cgcnVuIGVhY2ggZW50cnkuICBXZSBtdXN0IGRlbGV0ZSBpdCBmcm9tIG91cgorCQkgKiBsaXN0IGJlZm9yZSBjYWxsaW5nIHRoZSBoYW5kbGVyLgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIG4sICZoZWFkKSB7CisJCQlkZXNjID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgaXJxZGVzYywgcGVuZCk7CisJCQlsaXN0X2RlbF9pbml0KCZkZXNjLT5wZW5kKTsKKwkJCWRlc2MtPmhhbmRsZShkZXNjIC0gaXJxX2Rlc2MsIGRlc2MsIHJlZ3MpOworCQl9CisKKwkJLyoKKwkJICogVGhlIGxpc3QgbXVzdCBiZSBlbXB0eS4KKwkJICovCisJCUJVR19PTighbGlzdF9lbXB0eSgmaGVhZCkpOworCX0gd2hpbGUgKCFsaXN0X2VtcHR5KCZpcnFfcGVuZGluZykpOworfQorCisvKgorICogZG9fSVJRIGhhbmRsZXMgYWxsIGhhcmR3YXJlIElSUSdzLiAgRGVjb2RlZCBJUlFzIHNob3VsZCBub3QKKyAqIGNvbWUgdmlhIHRoaXMgZnVuY3Rpb24uICBJbnN0ZWFkLCB0aGV5IHNob3VsZCBwcm92aWRlIHRoZWlyCisgKiBvd24gJ2hhbmRsZXInCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBhc21fZG9fSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpcnFkZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisKKwkvKgorCSAqIFNvbWUgaGFyZHdhcmUgZ2l2ZXMgcmFuZG9tbHkgd3JvbmcgaW50ZXJydXB0cy4gIFJhdGhlcgorCSAqIHRoYW4gY3Jhc2hpbmcsIGRvIHNvbWV0aGluZyBzZW5zaWJsZS4KKwkgKi8KKwlpZiAoaXJxID49IE5SX0lSUVMpCisJCWRlc2MgPSAmYmFkX2lycV9kZXNjOworCisJaXJxX2VudGVyKCk7CisJc3Bpbl9sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKKwlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKworCS8qCisJICogTm93IHJlLXJ1biBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmaXJxX3BlbmRpbmcpKQorCQlkb19wZW5kaW5nX2lycXMocmVncyk7CisKKwlpcnFfZmluaXNoKGlycSk7CisKKwlzcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisJaXJxX2V4aXQoKTsKK30KKwordm9pZCBfX3NldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZSwgaW50IGlzX2NoYWluZWQpCit7CisJc3RydWN0IGlycWRlc2MgKmRlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpcnEgPj0gTlJfSVJRUykgeworCQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyB0byBpbnN0YWxsIGhhbmRsZXIgZm9yIElSUSVkXG4iLCBpcnEpOworCQlyZXR1cm47CisJfQorCisJaWYgKGhhbmRsZSA9PSBOVUxMKQorCQloYW5kbGUgPSBkb19iYWRfSVJROworCisJZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJaWYgKGlzX2NoYWluZWQgJiYgZGVzYy0+Y2hpcCA9PSAmYmFkX2NoaXApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRyeWluZyB0byBpbnN0YWxsIGNoYWluZWQgaGFuZGxlciBmb3IgSVJRJWRcbiIsIGlycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCWlmIChoYW5kbGUgPT0gZG9fYmFkX0lSUSkgeworCQlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CisJCWRlc2MtPmNoaXAtPmFjayhpcnEpOworCQlkZXNjLT5kaXNhYmxlX2RlcHRoID0gMTsKKwl9CisJZGVzYy0+aGFuZGxlID0gaGFuZGxlOworCWlmIChoYW5kbGUgIT0gZG9fYmFkX0lSUSAmJiBpc19jaGFpbmVkKSB7CisJCWRlc2MtPnZhbGlkID0gMDsKKwkJZGVzYy0+cHJvYmVfb2sgPSAwOworCQlkZXNjLT5kaXNhYmxlX2RlcHRoID0gMDsKKwkJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzZXRfaXJxX2NoaXAodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWNoaXAgKmNoaXApCit7CisJc3RydWN0IGlycWRlc2MgKmRlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpcnEgPj0gTlJfSVJRUykgeworCQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyB0byBpbnN0YWxsIGNoaXAgZm9yIElSUSVkXG4iLCBpcnEpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJY2hpcCA9ICZiYWRfY2hpcDsKKworCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCWRlc2MtPmNoaXAgPSBjaGlwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKK30KKworaW50IHNldF9pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgaXJxZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtRU5YSU87CisKKwlpZiAoaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gc2V0IGlycSB0eXBlIGZvciBJUlElZFxuIiwgaXJxKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGVzYyA9IGlycV9kZXNjICsgaXJxOworCWlmIChkZXNjLT5jaGlwLT50eXBlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJCXJldCA9IGRlc2MtPmNoaXAtPnR5cGUoaXJxLCB0eXBlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHNldF9pcnFfdHlwZSk7CisKK3ZvaWQgc2V0X2lycV9mbGFncyh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgaWZsYWdzKQoreworCXN0cnVjdCBpcnFkZXNjICpkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gc2V0IGlycSBmbGFncyBmb3IgSVJRJWRcbiIsIGlycSk7CisJCXJldHVybjsKKwl9CisKKwlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlkZXNjLT52YWxpZCA9IChpZmxhZ3MgJiBJUlFGX1ZBTElEKSAhPSAwOworCWRlc2MtPnByb2JlX29rID0gKGlmbGFncyAmIElSUUZfUFJPQkUpICE9IDA7CisJZGVzYy0+bm9hdXRvZW5hYmxlID0gKGlmbGFncyAmIElSUUZfTk9BVVRPRU4pICE9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworfQorCitpbnQgc2V0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKm5ldykKK3sKKwlpbnQgc2hhcmVkID0gMDsKKwlzdHJ1Y3QgaXJxYWN0aW9uICpvbGQsICoqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcnFkZXNjICpkZXNjOworCisJLyoKKwkgKiBTb21lIGRyaXZlcnMgbGlrZSBzZXJpYWwuYyB1c2UgcmVxdWVzdF9pcnEoKSBoZWF2aWx5LAorCSAqIHNvIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBub3QgdG8gaW50ZXJmZXJlIHdpdGggYQorCSAqIHJ1bm5pbmcgc3lzdGVtLgorCSAqLworCWlmIChuZXctPmZsYWdzICYgU0FfU0FNUExFX1JBTkRPTSkgeworCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIG1pZ2h0IHNsZWVwLCB3ZSB3YW50IHRvIGNhbGwgaXQgZmlyc3QsCisJCSAqIG91dHNpZGUgb2YgdGhlIGF0b21pYyBibG9jay4KKwkJICogWWVzLCB0aGlzIG1pZ2h0IGNsZWFyIHRoZSBlbnRyb3B5IHBvb2wgaWYgdGhlIHdyb25nCisJCSAqIGRyaXZlciBpcyBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkLCB3aXRob3V0IGFjdHVhbGx5CisJCSAqIGluc3RhbGxpbmcgYSBuZXcgaGFuZGxlciwgYnV0IGlzIHRoaXMgcmVhbGx5IGEgcHJvYmxlbSwKKwkJICogb25seSB0aGUgc3lzYWRtaW4gaXMgYWJsZSB0byBkbyB0aGlzLgorCQkgKi8KKwkgICAgICAgIHJhbmRfaW5pdGlhbGl6ZV9pcnEoaXJxKTsKKwl9CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgYmxvY2sgb2YgY29kZSBoYXMgdG8gYmUgZXhlY3V0ZWQgYXRvbWljYWxseQorCSAqLworCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCXAgPSAmZGVzYy0+YWN0aW9uOworCWlmICgob2xkID0gKnApICE9IE5VTEwpIHsKKwkJLyogQ2FuJ3Qgc2hhcmUgaW50ZXJydXB0cyB1bmxlc3MgYm90aCBhZ3JlZSB0byAqLworCQlpZiAoIShvbGQtPmZsYWdzICYgbmV3LT5mbGFncyAmIFNBX1NISVJRKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCS8qIGFkZCBuZXcgaW50ZXJydXB0IGF0IGVuZCBvZiBpcnEgcXVldWUgKi8KKwkJZG8geworCQkJcCA9ICZvbGQtPm5leHQ7CisJCQlvbGQgPSAqcDsKKwkJfSB3aGlsZSAob2xkKTsKKwkJc2hhcmVkID0gMTsKKwl9CisKKwkqcCA9IG5ldzsKKworCWlmICghc2hhcmVkKSB7CisgCQlkZXNjLT5wcm9iaW5nID0gMDsKKwkJZGVzYy0+cnVubmluZyA9IDA7CisJCWRlc2MtPnBlbmRpbmcgPSAwOworCQlkZXNjLT5kaXNhYmxlX2RlcHRoID0gMTsKKwkJaWYgKCFkZXNjLT5ub2F1dG9lbmFibGUpIHsKKwkJCWRlc2MtPmRpc2FibGVfZGVwdGggPSAwOworCQkJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJcmVxdWVzdF9pcnEgLSBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZQorICoJQGlycTogSW50ZXJydXB0IGxpbmUgdG8gYWxsb2NhdGUKKyAqCUBoYW5kbGVyOiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgSVJRIG9jY3VycworICoJQGlycWZsYWdzOiBJbnRlcnJ1cHQgdHlwZSBmbGFncworICoJQGRldm5hbWU6IEFuIGFzY2lpIG5hbWUgZm9yIHRoZSBjbGFpbWluZyBkZXZpY2UKKyAqCUBkZXZfaWQ6IEEgY29va2llIHBhc3NlZCBiYWNrIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uCisgKgorICoJVGhpcyBjYWxsIGFsbG9jYXRlcyBpbnRlcnJ1cHQgcmVzb3VyY2VzIGFuZCBlbmFibGVzIHRoZQorICoJaW50ZXJydXB0IGxpbmUgYW5kIElSUSBoYW5kbGluZy4gRnJvbSB0aGUgcG9pbnQgdGhpcworICoJY2FsbCBpcyBtYWRlIHlvdXIgaGFuZGxlciBmdW5jdGlvbiBtYXkgYmUgaW52b2tlZC4gU2luY2UKKyAqCXlvdXIgaGFuZGxlciBmdW5jdGlvbiBtdXN0IGNsZWFyIGFueSBpbnRlcnJ1cHQgdGhlIGJvYXJkCisgKglyYWlzZXMsIHlvdSBtdXN0IHRha2UgY2FyZSBib3RoIHRvIGluaXRpYWxpc2UgeW91ciBoYXJkd2FyZQorICoJYW5kIHRvIHNldCB1cCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICoKKyAqCURldl9pZCBtdXN0IGJlIGdsb2JhbGx5IHVuaXF1ZS4gTm9ybWFsbHkgdGhlIGFkZHJlc3Mgb2YgdGhlCisgKglkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgY29va2llLiBTaW5jZSB0aGUgaGFuZGxlcgorICoJcmVjZWl2ZXMgdGhpcyB2YWx1ZSBpdCBtYWtlcyBzZW5zZSB0byB1c2UgaXQuCisgKgorICoJSWYgeW91ciBpbnRlcnJ1cHQgaXMgc2hhcmVkIHlvdSBtdXN0IHBhc3MgYSBub24gTlVMTCBkZXZfaWQKKyAqCWFzIHRoaXMgaXMgcmVxdWlyZWQgd2hlbiBmcmVlaW5nIHRoZSBpbnRlcnJ1cHQuCisgKgorICoJRmxhZ3M6CisgKgorICoJU0FfU0hJUlEJCUludGVycnVwdCBpcyBzaGFyZWQKKyAqCisgKglTQV9JTlRFUlJVUFQJCURpc2FibGUgbG9jYWwgaW50ZXJydXB0cyB3aGlsZSBwcm9jZXNzaW5nCisgKgorICoJU0FfU0FNUExFX1JBTkRPTQlUaGUgaW50ZXJydXB0IGNhbiBiZSB1c2VkIGZvciBlbnRyb3B5CisgKgorICovCitpbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCisJCSB1bnNpZ25lZCBsb25nIGlycV9mbGFncywgY29uc3QgY2hhciAqIGRldm5hbWUsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbDsKKwlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247CisKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgIWlycV9kZXNjW2lycV0udmFsaWQgfHwgIWhhbmRsZXIgfHwKKwkgICAgKGlycV9mbGFncyAmIFNBX1NISVJRICYmICFkZXZfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjdGlvbiA9IChzdHJ1Y3QgaXJxYWN0aW9uICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGlycWFjdGlvbiksIEdGUF9LRVJORUwpOworCWlmICghYWN0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFjdGlvbi0+aGFuZGxlciA9IGhhbmRsZXI7CisJYWN0aW9uLT5mbGFncyA9IGlycV9mbGFnczsKKwljcHVzX2NsZWFyKGFjdGlvbi0+bWFzayk7CisJYWN0aW9uLT5uYW1lID0gZGV2bmFtZTsKKwlhY3Rpb24tPm5leHQgPSBOVUxMOworCWFjdGlvbi0+ZGV2X2lkID0gZGV2X2lkOworCisJcmV0dmFsID0gc2V0dXBfaXJxKGlycSwgYWN0aW9uKTsKKworCWlmIChyZXR2YWwpCisJCWtmcmVlKGFjdGlvbik7CisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTChyZXF1ZXN0X2lycSk7CisKKy8qKgorICoJZnJlZV9pcnEgLSBmcmVlIGFuIGludGVycnVwdAorICoJQGlycTogSW50ZXJydXB0IGxpbmUgdG8gZnJlZQorICoJQGRldl9pZDogRGV2aWNlIGlkZW50aXR5IHRvIGZyZWUKKyAqCisgKglSZW1vdmUgYW4gaW50ZXJydXB0IGhhbmRsZXIuIFRoZSBoYW5kbGVyIGlzIHJlbW92ZWQgYW5kIGlmIHRoZQorICoJaW50ZXJydXB0IGxpbmUgaXMgbm8gbG9uZ2VyIGluIHVzZSBieSBhbnkgZHJpdmVyIGl0IGlzIGRpc2FibGVkLgorICoJT24gYSBzaGFyZWQgSVJRIHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhlIGludGVycnVwdCBpcyBkaXNhYmxlZAorICoJb24gdGhlIGNhcmQgaXQgZHJpdmVzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICoJVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCBmcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGlycWFjdGlvbiAqIGFjdGlvbiwgKipwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgIWlycV9kZXNjW2lycV0udmFsaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gZnJlZSBJUlElZFxuIixpcnEpOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCWZvciAocCA9ICZpcnFfZGVzY1tpcnFdLmFjdGlvbjsgKGFjdGlvbiA9ICpwKSAhPSBOVUxMOyBwID0gJmFjdGlvbi0+bmV4dCkgeworCQlpZiAoYWN0aW9uLT5kZXZfaWQgIT0gZGV2X2lkKQorCQkJY29udGludWU7CisKKwkgICAgCS8qIEZvdW5kIGl0IC0gbm93IGZyZWUgaXQgKi8KKwkJKnAgPSBhY3Rpb24tPm5leHQ7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWFjdGlvbikgeworCQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyB0byBmcmVlIGZyZWUgSVJRJWRcbiIsaXJxKTsKKwkJZHVtcF9zdGFjaygpOworCX0gZWxzZSB7CisJCXN5bmNocm9uaXplX2lycShpcnEpOworCQlrZnJlZShhY3Rpb24pOworCX0KK30KKworRVhQT1JUX1NZTUJPTChmcmVlX2lycSk7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHByb2JlX3NlbSk7CisKKy8qIFN0YXJ0IHRoZSBpbnRlcnJ1cHQgcHJvYmluZy4gIFVubGlrZSBvdGhlciBhcmNoaXRlY3R1cmVzLAorICogd2UgZG9uJ3QgcmV0dXJuIGEgbWFzayBvZiBpbnRlcnJ1cHRzIGZyb20gcHJvYmVfaXJxX29uLAorICogYnV0IHJldHVybiB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgZW5hYmxlZCBmb3IgdGhlIHByb2JlLgorICogVGhlIGludGVycnVwdHMgd2hpY2ggaGF2ZSBiZWVuIGVuYWJsZWQgZm9yIHByb2JpbmcgaXMKKyAqIGluc3RlYWQgcmVjb3JkZWQgaW4gdGhlIGlycV9kZXNjIHN0cnVjdHVyZS4KKyAqLwordW5zaWduZWQgbG9uZyBwcm9iZV9pcnFfb24odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaXJxcyA9IDA7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCWRvd24oJnByb2JlX3NlbSk7CisKKwkvKgorCSAqIGZpcnN0IHNuYWZmbGUgdXAgYW55IHVuYXNzaWduZWQgYnV0CisJICogcHJvYmUtYWJsZSBpbnRlcnJ1cHRzCisJICovCisJc3Bpbl9sb2NrX2lycSgmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgeworCQlpZiAoIWlycV9kZXNjW2ldLnByb2JlX29rIHx8IGlycV9kZXNjW2ldLmFjdGlvbikKKwkJCWNvbnRpbnVlOworCisJCWlycV9kZXNjW2ldLnByb2JpbmcgPSAxOworCQlpcnFfZGVzY1tpXS50cmlnZ2VyZWQgPSAwOworCQlpZiAoaXJxX2Rlc2NbaV0uY2hpcC0+dHlwZSkKKwkJCWlycV9kZXNjW2ldLmNoaXAtPnR5cGUoaSwgSVJRVF9QUk9CRSk7CisJCWlycV9kZXNjW2ldLmNoaXAtPnVubWFzayhpKTsKKwkJaXJxcyArPSAxOworCX0KKwlzcGluX3VubG9ja19pcnEoJmlycV9jb250cm9sbGVyX2xvY2spOworCisJLyoKKwkgKiB3YWl0IGZvciBzcHVyaW91cyBpbnRlcnJ1cHRzIHRvIG1hc2sgdGhlbXNlbHZlcyBvdXQgYWdhaW4KKwkgKi8KKwlmb3IgKGRlbGF5ID0gamlmZmllcyArIEhaLzEwOyB0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWxheSk7ICkKKwkJLyogbWluIDEwMG1zIGRlbGF5ICovOworCisJLyoKKwkgKiBub3cgZmlsdGVyIG91dCBhbnkgb2J2aW91c2x5IHNwdXJpb3VzIGludGVycnVwdHMKKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7CisJCWlmIChpcnFfZGVzY1tpXS5wcm9iaW5nICYmIGlycV9kZXNjW2ldLnRyaWdnZXJlZCkgeworCQkJaXJxX2Rlc2NbaV0ucHJvYmluZyA9IDA7CisJCQlpcnFzIC09IDE7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKKworCXJldHVybiBpcnFzOworfQorCitFWFBPUlRfU1lNQk9MKHByb2JlX2lycV9vbik7CisKK3Vuc2lnbmVkIGludCBwcm9iZV9pcnFfbWFzayh1bnNpZ25lZCBsb25nIGlycXMpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwLCBpOworCisJc3Bpbl9sb2NrX2lycSgmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IDE2ICYmIGkgPCBOUl9JUlFTOyBpKyspCisJCWlmIChpcnFfZGVzY1tpXS5wcm9iaW5nICYmIGlycV9kZXNjW2ldLnRyaWdnZXJlZCkKKwkJCW1hc2sgfD0gMSA8PCBpOworCXNwaW5fdW5sb2NrX2lycSgmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisKKwl1cCgmcHJvYmVfc2VtKTsKKworCXJldHVybiBtYXNrOworfQorRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfbWFzayk7CisKKy8qCisgKiBQb3NzaWJsZSByZXR1cm4gdmFsdWVzOgorICogID49IDAgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKiAgICAtMSAtIG5vIGludGVycnVwdC9tYW55IGludGVycnVwdHMKKyAqLworaW50IHByb2JlX2lycV9vZmYodW5zaWduZWQgbG9uZyBpcnFzKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBpcnFfZm91bmQgPSBOT19JUlE7CisKKwkvKgorCSAqIGxvb2sgYXQgdGhlIGludGVycnVwdHMsIGFuZCBmaW5kIGV4YWN0bHkgb25lCisJICogdGhhdCB3ZSB3ZXJlIHByb2JpbmcgaGFzIGJlZW4gdHJpZ2dlcmVkCisJICovCisJc3Bpbl9sb2NrX2lycSgmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgeworCQlpZiAoaXJxX2Rlc2NbaV0ucHJvYmluZyAmJgorCQkgICAgaXJxX2Rlc2NbaV0udHJpZ2dlcmVkKSB7CisJCQlpZiAoaXJxX2ZvdW5kICE9IE5PX0lSUSkgeworCQkJCWlycV9mb3VuZCA9IE5PX0lSUTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlycV9mb3VuZCA9IGk7CisJCX0KKwl9CisKKwlpZiAoaXJxX2ZvdW5kID09IC0xKQorCQlpcnFfZm91bmQgPSBOT19JUlE7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKKworCXVwKCZwcm9iZV9zZW0pOworCisJcmV0dXJuIGlycV9mb3VuZDsKK30KKworRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb2ZmKTsKKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkIHJvdXRlX2lycShzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlwcl9kZWJ1ZygiSVJRJXU6IG1vdmluZyBmcm9tIGNwdSV1IHRvIGNwdSV1XG4iLCBpcnEsIGRlc2MtPmNwdSwgY3B1KTsKKworCXNwaW5fbG9ja19pcnEoJmlycV9jb250cm9sbGVyX2xvY2spOworCWRlc2MtPmNwdSA9IGNwdTsKKwlkZXNjLT5jaGlwLT5zZXRfY3B1KGRlc2MsIGlycSwgY3B1KTsKKwlzcGluX3VubG9ja19pcnEoJmlycV9jb250cm9sbGVyX2xvY2spOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQKK2lycV9hZmZpbml0eV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKKwkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcnFkZXNjICpkZXNjID0gaXJxX2Rlc2MgKyAoKGludClkYXRhKTsKKwlpbnQgbGVuID0gY3B1bWFza19zY25wcmludGYocGFnZSwgY291bnQsIGRlc2MtPmFmZmluaXR5KTsKKworCWlmIChjb3VudCAtIGxlbiA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCXBhZ2VbbGVuKytdID0gJ1xuJzsKKwlwYWdlW2xlbl0gPSAnXDAnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAoraXJxX2FmZmluaXR5X3dyaXRlX3Byb2Moc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGludCBpcnEgPSAodW5zaWduZWQgaW50KWRhdGE7CisJc3RydWN0IGlycWRlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwljcHVtYXNrX3QgYWZmaW5pdHksIHRtcDsKKwlpbnQgcmV0ID0gLUVJTzsKKworCWlmICghZGVzYy0+Y2hpcC0+c2V0X2NwdSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBjcHVtYXNrX3BhcnNlKGJ1ZmZlciwgY291bnQsIGFmZmluaXR5KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWNwdXNfYW5kKHRtcCwgYWZmaW5pdHksIGNwdV9vbmxpbmVfbWFwKTsKKwlpZiAoY3B1c19lbXB0eSh0bXApKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWRlc2MtPmFmZmluaXR5ID0gYWZmaW5pdHk7CisJcm91dGVfaXJxKGRlc2MsIGlycSwgZmlyc3RfY3B1KHRtcCkpOworCXJldCA9IGNvdW50OworCisgb3V0OgorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCit2b2lkIF9faW5pdCBpbml0X2lycV9wcm9jKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyOworCWludCBpcnE7CisKKwlkaXIgPSBwcm9jX21rZGlyKCJpcnEiLCAwKTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgeworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCQlzdHJ1Y3QgaXJxZGVzYyAqZGVzYzsKKwkJY2hhciBuYW1lWzE2XTsKKworCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSkgLSAxLCAiJXUiLCBpcnEpOworCisJCWRlc2MtPnByb2NkaXIgPSBwcm9jX21rZGlyKG5hbWUsIGRpcik7CisJCWlmICghZGVzYy0+cHJvY2RpcikKKwkJCWNvbnRpbnVlOworCisJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInNtcF9hZmZpbml0eSIsIDA2MDAsIGRlc2MtPnByb2NkaXIpOworCQlpZiAoZW50cnkpIHsKKwkJCWVudHJ5LT5ubGluayA9IDE7CisJCQllbnRyeS0+ZGF0YSA9ICh2b2lkICopaXJxOworCQkJZW50cnktPnJlYWRfcHJvYyA9IGlycV9hZmZpbml0eV9yZWFkX3Byb2M7CisJCQllbnRyeS0+d3JpdGVfcHJvYyA9IGlycV9hZmZpbml0eV93cml0ZV9wcm9jOworCQl9CisJfQorI2VuZGlmCit9CisKK3ZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCit7CisJc3RydWN0IGlycWRlc2MgKmRlc2M7CisJZXh0ZXJuIHZvaWQgaW5pdF9kbWEodm9pZCk7CisJaW50IGlycTsKKworI2lmZGVmIENPTkZJR19TTVAKKwliYWRfaXJxX2Rlc2MuYWZmaW5pdHkgPSBDUFVfTUFTS19BTEw7CisJYmFkX2lycV9kZXNjLmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKyNlbmRpZgorCisJZm9yIChpcnEgPSAwLCBkZXNjID0gaXJxX2Rlc2M7IGlycSA8IE5SX0lSUVM7IGlycSsrLCBkZXNjKyspIHsKKwkJKmRlc2MgPSBiYWRfaXJxX2Rlc2M7CisJCUlOSVRfTElTVF9IRUFEKCZkZXNjLT5wZW5kKTsKKwl9CisKKwlpbml0X2FyY2hfaXJxKCk7CisJaW5pdF9kbWEoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbm9pcnFkZWJ1Z19zZXR1cChjaGFyICpzdHIpCit7CisJbm9pcnFkZWJ1ZyA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5vaXJxZGVidWciLCBub2lycWRlYnVnX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pc2EuYyBiL2FyY2gvYXJtL2tlcm5lbC9pc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODVjM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2lzYS5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2lzYS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBQaGlsIEJsdW5kZWxsCisgKgorICogIElTQSBzaGFyZWQgbWVtb3J5IGFuZCBJL08gcG9ydCBzdXBwb3J0CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogCisgKiBOb3RoaW5nIGFib3V0IHRoaXMgaXMgYWN0dWFsbHkgQVJNIHNwZWNpZmljLiAgT25lIGRheSB3ZSBjb3VsZCBtb3ZlCisgKiBpdCBpbnRvIGtlcm5lbC9yZXNvdXJjZS5jIG9yIHNvbWUgcGxhY2UgbGlrZSB0aGF0LiAgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXNhX21lbWJhc2UsIGlzYV9wb3J0YmFzZSwgaXNhX3BvcnRzaGlmdDsKKworc3RhdGljIGN0bF90YWJsZSBjdGxfaXNhX3ZhcnNbNF0gPSB7CisJe0JVU19JU0FfTUVNX0JBU0UsICJtZW1iYXNlIiwgJmlzYV9tZW1iYXNlLCAKKwkgc2l6ZW9mKGlzYV9tZW1iYXNlKSwgMDQ0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWN9LAorCXtCVVNfSVNBX1BPUlRfQkFTRSwgInBvcnRiYXNlIiwgJmlzYV9wb3J0YmFzZSwgCisJIHNpemVvZihpc2FfcG9ydGJhc2UpLCAwNDQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY30sCisJe0JVU19JU0FfUE9SVF9TSElGVCwgInBvcnRzaGlmdCIsICZpc2FfcG9ydHNoaWZ0LCAKKwkgc2l6ZW9mKGlzYV9wb3J0c2hpZnQpLCAwNDQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY30sCisJezB9Cit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmlzYV9zeXNjdGxfaGVhZGVyOworCitzdGF0aWMgY3RsX3RhYmxlIGN0bF9pc2FbMl0gPSB7e0NUTF9CVVNfSVNBLCAiaXNhIiwgTlVMTCwgMCwgMDU1NSwgY3RsX2lzYV92YXJzfSwKKwkJCSAgICAgICB7MH19Oworc3RhdGljIGN0bF90YWJsZSBjdGxfYnVzWzJdID0ge3tDVExfQlVTLCAiYnVzIiwgTlVMTCwgMCwgMDU1NSwgY3RsX2lzYX0sCisJCQkgICAgICAgezB9fTsKKwordm9pZCBfX2luaXQKK3JlZ2lzdGVyX2lzYV9wb3J0cyh1bnNpZ25lZCBpbnQgbWVtYmFzZSwgdW5zaWduZWQgaW50IHBvcnRiYXNlLCB1bnNpZ25lZCBpbnQgcG9ydHNoaWZ0KQoreworCWlzYV9tZW1iYXNlID0gbWVtYmFzZTsKKwlpc2FfcG9ydGJhc2UgPSBwb3J0YmFzZTsKKwlpc2FfcG9ydHNoaWZ0ID0gcG9ydHNoaWZ0OworCWlzYV9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGN0bF9idXMsIDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TIGIvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzRlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvaXdtbXh0LlMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TCisgKgorICogIFhTY2FsZSBpV01NWHQgKENvbmNhbikgY29udGV4dCBzd2l0Y2hpbmcgYW5kIGhhbmRsaW5nCisgKgorICogIEluaXRpYWwgY29kZToKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogIEZ1bGwgbGF6eSBzd2l0Y2hpbmcgc3VwcG9ydCwgb3B0aW1pemF0aW9ucyBhbmQgbW9yZSwgYnkgTmljb2xhcyBQaXRyZQorKiAgIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisKKyNkZWZpbmUgTU1YX1dSMAkJIAkoMHgwMCkKKyNkZWZpbmUgTU1YX1dSMQkJIAkoMHgwOCkKKyNkZWZpbmUgTU1YX1dSMgkJIAkoMHgxMCkKKyNkZWZpbmUgTU1YX1dSMwkJCSgweDE4KQorI2RlZmluZSBNTVhfV1I0CQkgCSgweDIwKQorI2RlZmluZSBNTVhfV1I1CQkgCSgweDI4KQorI2RlZmluZSBNTVhfV1I2CQkgCSgweDMwKQorI2RlZmluZSBNTVhfV1I3CQkgCSgweDM4KQorI2RlZmluZSBNTVhfV1I4CQkgCSgweDQwKQorI2RlZmluZSBNTVhfV1I5CQkgCSgweDQ4KQorI2RlZmluZSBNTVhfV1IxMAkJKDB4NTApCisjZGVmaW5lIE1NWF9XUjExCQkoMHg1OCkKKyNkZWZpbmUgTU1YX1dSMTIJCSgweDYwKQorI2RlZmluZSBNTVhfV1IxMwkJKDB4NjgpCisjZGVmaW5lIE1NWF9XUjE0CQkoMHg3MCkKKyNkZWZpbmUgTU1YX1dSMTUJCSgweDc4KQorI2RlZmluZSBNTVhfV0NTU0YJCSgweDgwKQorI2RlZmluZSBNTVhfV0NBU0YJCSgweDg0KQorI2RlZmluZSBNTVhfV0NHUjAJCSgweDg4KQorI2RlZmluZSBNTVhfV0NHUjEJCSgweDhDKQorI2RlZmluZSBNTVhfV0NHUjIJCSgweDkwKQorI2RlZmluZSBNTVhfV0NHUjMJCSgweDk0KQorCisjZGVmaW5lIE1NWF9TSVpFCQkoMHg5OCkKKworCS50ZXh0CisKKy8qCisgKiBMYXp5IHN3aXRjaGluZyBvZiBDb25jYW4gY29wcm9jZXNzb3IgY29udGV4dAorICoKKyAqIHIxMCA9IHN0cnVjdCB0aHJlYWRfaW5mbyBwb2ludGVyCisgKiByOSAgPSByZXRfZnJvbV9leGNlcHRpb24KKyAqIGxyICA9IHVuZGVmaW5lZCBpbnN0ciBleGl0CisgKgorICogY2FsbGVkIGZyb20gcHJlZmV0Y2ggZXhjZXB0aW9uIGhhbmRsZXIgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCisgKi8KKworRU5UUlkoaXdtbXh0X3Rhc2tfZW5hYmxlKQorCisJbXJjCXAxNSwgMCwgcjIsIGMxNSwgYzEsIDAKKwl0c3QJcjIsICMweDMJCQlAIENQMCBhbmQgQ1AxIGFjY2Vzc2libGU/CisJbW92bmUJcGMsIGxyCQkJCUAgaWYgc28gbm8gYnVzaW5lc3MgaGVyZQorCW9ycglyMiwgcjIsICMweDMJCQlAIGVuYWJsZSBhY2Nlc3MgdG8gQ1AwIGFuZCBDUDEKKwltY3IJcDE1LCAwLCByMiwgYzE1LCBjMSwgMAorCisJbGRyCXIzLCA9Y29uY2FuX293bmVyCisJYWRkCXIwLCByMTAsICNUSV9JV01NWFRfU1RBVEUJQCBnZXQgdGFzayBDb25jYW4gc2F2ZSBhcmVhCisJbGRyCXIyLCBbc3AsICM2MF0JCQlAIGN1cnJlbnQgdGFzayBwYyB2YWx1ZQorCWxkcglyMSwgW3IzXQkJCUAgZ2V0IGN1cnJlbnQgQ29uY2FuIG93bmVyCisJc3RyCXIwLCBbcjNdCQkJQCB0aGlzIHRhc2sgbm93IG93bnMgQ29uY2FuIHJlZ3MKKwlzdWIJcjIsIHIyLCAjNAkJCUAgYWRqdXN0IHBjIGJhY2sKKwlzdHIJcjIsIFtzcCwgIzYwXQorCisJbXJjCXAxNSwgMCwgcjIsIGMyLCBjMCwgMAorCW1vdglyMiwgcjIJCQkJQCBjcHdhaXQKKworCXRlcQlyMSwgIzAJCQkJQCB0ZXN0IGZvciBsYXN0IG93bmVyc2hpcAorCW1vdglsciwgcjkJCQkJQCBub3JtYWwgZXhpdCBmcm9tIGV4Y2VwdGlvbgorCWJlcQljb25jYW5fbG9hZAkJCUAgbm8gb3duZXIsIHNraXAgc2F2ZQorCitjb25jYW5fc2F2ZToKKworCXRtcmMJcjIsIHdDb24KKworCUAgQ1VQPyB3Q3gKKwl0c3QJcjIsICMweDEKKwliZXEgCTFmCisKK2NvbmNhbl9kdW1wOgorCisJd3N0cncJd0NTU0YsIFtyMSwgI01NWF9XQ1NTRl0KKwl3c3Rydwl3Q0FTRiwgW3IxLCAjTU1YX1dDQVNGXQorCXdzdHJ3CXdDR1IwLCBbcjEsICNNTVhfV0NHUjBdCisJd3N0cncJd0NHUjEsIFtyMSwgI01NWF9XQ0dSMV0KKwl3c3Rydwl3Q0dSMiwgW3IxLCAjTU1YX1dDR1IyXQorCXdzdHJ3CXdDR1IzLCBbcjEsICNNTVhfV0NHUjNdCisKKzE6CUAgTVVQPyB3Um4KKwl0c3QJcjIsICMweDIKKwliZXEJMmYKKworCXdzdHJkCXdSMCwgIFtyMSwgI01NWF9XUjBdCisJd3N0cmQJd1IxLCAgW3IxLCAjTU1YX1dSMV0KKwl3c3RyZAl3UjIsICBbcjEsICNNTVhfV1IyXQorCXdzdHJkCXdSMywgIFtyMSwgI01NWF9XUjNdCisJd3N0cmQJd1I0LCAgW3IxLCAjTU1YX1dSNF0KKwl3c3RyZAl3UjUsICBbcjEsICNNTVhfV1I1XQorCXdzdHJkCXdSNiwgIFtyMSwgI01NWF9XUjZdCisJd3N0cmQJd1I3LCAgW3IxLCAjTU1YX1dSN10KKwl3c3RyZAl3UjgsICBbcjEsICNNTVhfV1I4XQorCXdzdHJkCXdSOSwgIFtyMSwgI01NWF9XUjldCisJd3N0cmQJd1IxMCwgW3IxLCAjTU1YX1dSMTBdCisJd3N0cmQJd1IxMSwgW3IxLCAjTU1YX1dSMTFdCisJd3N0cmQJd1IxMiwgW3IxLCAjTU1YX1dSMTJdCisJd3N0cmQJd1IxMywgW3IxLCAjTU1YX1dSMTNdCisJd3N0cmQJd1IxNCwgW3IxLCAjTU1YX1dSMTRdCisJd3N0cmQJd1IxNSwgW3IxLCAjTU1YX1dSMTVdCisKKzI6CXRlcQlyMCwgIzAJCQkJQCBhbnl0aGluZyB0byBsb2FkPworCW1vdmVxCXBjLCBscgorCitjb25jYW5fbG9hZDoKKworCUAgTG9hZCB3Um4KKwl3bGRyZAl3UjAsICBbcjAsICNNTVhfV1IwXQorCXdsZHJkCXdSMSwgIFtyMCwgI01NWF9XUjFdCisJd2xkcmQJd1IyLCAgW3IwLCAjTU1YX1dSMl0KKwl3bGRyZAl3UjMsICBbcjAsICNNTVhfV1IzXQorCXdsZHJkCXdSNCwgIFtyMCwgI01NWF9XUjRdCisJd2xkcmQJd1I1LCAgW3IwLCAjTU1YX1dSNV0KKwl3bGRyZAl3UjYsICBbcjAsICNNTVhfV1I2XQorCXdsZHJkCXdSNywgIFtyMCwgI01NWF9XUjddCisJd2xkcmQJd1I4LCAgW3IwLCAjTU1YX1dSOF0KKwl3bGRyZAl3UjksICBbcjAsICNNTVhfV1I5XQorCXdsZHJkCXdSMTAsIFtyMCwgI01NWF9XUjEwXQorCXdsZHJkCXdSMTEsIFtyMCwgI01NWF9XUjExXQorCXdsZHJkCXdSMTIsIFtyMCwgI01NWF9XUjEyXQorCXdsZHJkCXdSMTMsIFtyMCwgI01NWF9XUjEzXQorCXdsZHJkCXdSMTQsIFtyMCwgI01NWF9XUjE0XQorCXdsZHJkCXdSMTUsIFtyMCwgI01NWF9XUjE1XQorCisJQCBMb2FkIHdDeAorCXdsZHJ3CXdDU1NGLCBbcjAsICNNTVhfV0NTU0ZdCisJd2xkcncJd0NBU0YsIFtyMCwgI01NWF9XQ0FTRl0KKwl3bGRydwl3Q0dSMCwgW3IwLCAjTU1YX1dDR1IwXQorCXdsZHJ3CXdDR1IxLCBbcjAsICNNTVhfV0NHUjFdCisJd2xkcncJd0NHUjIsIFtyMCwgI01NWF9XQ0dSMl0KKwl3bGRydwl3Q0dSMywgW3IwLCAjTU1YX1dDR1IzXQorCisJQCBjbGVhciBDVVAvTVVQIChvbmx5IGlmIHIxICE9IDApCisJdGVxCXIxLCAjMAorCW1vdiAJcjIsICMwCisJbW92ZXEJcGMsIGxyCisJdG1jcgl3Q29uLCByMgorCW1vdglwYywgbHIKKworLyoKKyAqIEJhY2sgdXAgQ29uY2FuIHJlZ3MgdG8gc2F2ZSBhcmVhIGFuZCBkaXNhYmxlIGFjY2VzcyB0byB0aGVtCisgKiAobWFpbmx5IGZvciBnZGIgb3Igc2xlZXAgbW9kZSB1c2FnZSkKKyAqCisgKiByMCA9IHN0cnVjdCB0aHJlYWRfaW5mbyBwb2ludGVyIG9mIHRhcmdldCB0YXNrIG9yIE5VTEwgZm9yIGFueQorICovCisKK0VOVFJZKGl3bW14dF90YXNrX2Rpc2FibGUpCisKKwlzdG1mZAlzcCEsIHtyNCwgbHJ9CisKKwltcnMJaXAsIGNwc3IKKwlvcnIJcjIsIGlwLCAjUFNSX0lfQklUCQlAIGRpc2FibGUgaW50ZXJydXB0cworCW1zcgljcHNyX2MsIHIyCisKKwlsZHIJcjMsID1jb25jYW5fb3duZXIKKwlhZGQJcjIsIHIwLCAjVElfSVdNTVhUX1NUQVRFCUAgZ2V0IHRhc2sgQ29uY2FuIHNhdmUgYXJlYQorCWxkcglyMSwgW3IzXQkJCUAgZ2V0IGN1cnJlbnQgQ29uY2FuIG93bmVyCisJdGVxCXIxLCAjMAkJCQlAIGFueSBjdXJyZW50IG93bmVyPworCWJlcQkxZgkJCQlAIG5vOiBxdWl0CisJdGVxCXIwLCAjMAkJCQlAIGFueSBvd25lcj8KKwl0ZXFuZQlyMSwgcjIJCQkJQCBvciBzcGVjaWZpZWQgb25lPworCWJuZQkxZgkJCQlAIG5vOiBxdWl0CisKKwltcmMJcDE1LCAwLCByNCwgYzE1LCBjMSwgMAorCW9ycglyNCwgcjQsICMweDMJCQlAIGVuYWJsZSBhY2Nlc3MgdG8gQ1AwIGFuZCBDUDEKKwltY3IJcDE1LCAwLCByNCwgYzE1LCBjMSwgMAorCW1vdglyMCwgIzAJCQkJQCBub3RoaW5nIHRvIGxvYWQKKwlzdHIJcjAsIFtyM10JCQlAIG5vIG1vcmUgY3VycmVudCBvd25lcgorCW1yYwlwMTUsIDAsIHIyLCBjMiwgYzAsIDAKKwltb3YJcjIsIHIyCQkJCUAgY3B3YWl0CisJYmwJY29uY2FuX3NhdmUKKworCWJpYwlyNCwgcjQsICMweDMJCQlAIGRpc2FibGUgYWNjZXNzIHRvIENQMCBhbmQgQ1AxCisJbWNyCXAxNSwgMCwgcjQsIGMxNSwgYzEsIDAKKwltcmMJcDE1LCAwLCByMiwgYzIsIGMwLCAwCisJbW92CXIyLCByMgkJCQlAIGNwd2FpdAorCisxOgltc3IJY3Bzcl9jLCBpcAkJCUAgcmVzdG9yZSBpbnRlcnJ1cHQgbW9kZQorCWxkbWZkCXNwISwge3I0LCBwY30KKworLyoKKyAqIENvcHkgQ29uY2FuIHN0YXRlIHRvIGdpdmVuIG1lbW9yeSBhZGRyZXNzCisgKgorICogcjAgPSBzdHJ1Y3QgdGhyZWFkX2luZm8gcG9pbnRlciBvZiB0YXJnZXQgdGFzaworICogcjEgPSBtZW1vcnkgYWRkcmVzcyB3aGVyZSB0byBzdG9yZSBDb25jYW4gc3RhdGUKKyAqCisgKiB0aGlzIGlzIGNhbGxlZCBtYWlubHkgaW4gdGhlIGNyZWF0aW9uIG9mIHNpZ25hbCBzdGFjayBmcmFtZXMKKyAqLworCitFTlRSWShpd21teHRfdGFza19jb3B5KQorCisJbXJzCWlwLCBjcHNyCisJb3JyCXIyLCBpcCwgI1BTUl9JX0JJVAkJQCBkaXNhYmxlIGludGVycnVwdHMKKwltc3IJY3Bzcl9jLCByMgorCisJbGRyCXIzLCA9Y29uY2FuX293bmVyCisJYWRkCXIyLCByMCwgI1RJX0lXTU1YVF9TVEFURQlAIGdldCB0YXNrIENvbmNhbiBzYXZlIGFyZWEKKwlsZHIJcjMsIFtyM10JCQlAIGdldCBjdXJyZW50IENvbmNhbiBvd25lcgorCXRlcQlyMiwgcjMJCQkJQCBkb2VzIHRoaXMgdGFzayBvd24gaXQuLi4KKwliZXEJMWYKKworCUAgY3VycmVudCBDb25jYW4gdmFsdWVzIGFyZSBpbiB0aGUgdGFzayBzYXZlIGFyZWEKKwltc3IJY3Bzcl9jLCBpcAkJCUAgcmVzdG9yZSBpbnRlcnJ1cHQgbW9kZQorCW1vdglyMCwgcjEKKwltb3YJcjEsIHIyCisJbW92CXIyLCAjTU1YX1NJWkUKKwliCW1lbWNweQorCisxOglAIHRoaXMgdGFzayBvd25zIENvbmNhbiByZWdzIC0tIGdyYWIgYSBjb3B5IGZyb20gdGhlcmUKKwltb3YJcjAsICMwCQkJCUAgbm90aGluZyB0byBsb2FkCisJbW92CXIyLCAjMwkJCQlAIHNhdmUgYWxsIHJlZ3MKKwltb3YJcjMsIGxyCQkJCUAgcHJlc2VydmUgcmV0dXJuIGFkZHJlc3MKKwlibAljb25jYW5fZHVtcAorCW1zcgljcHNyX2MsIGlwCQkJQCByZXN0b3JlIGludGVycnVwdCBtb2RlCisJbW92CXBjLCByMworCisvKgorICogUmVzdG9yZSBDb25jYW4gc3RhdGUgZnJvbSBnaXZlbiBtZW1vcnkgYWRkcmVzcworICoKKyAqIHIwID0gc3RydWN0IHRocmVhZF9pbmZvIHBvaW50ZXIgb2YgdGFyZ2V0IHRhc2sKKyAqIHIxID0gbWVtb3J5IGFkZHJlc3Mgd2hlcmUgdG8gZ2V0IENvbmNhbiBzdGF0ZSBmcm9tCisgKgorICogdGhpcyBpcyB1c2VkIHRvIHJlc3RvcmUgQ29uY2FuIHN0YXRlIHdoZW4gdW53aW5kaW5nIGEgc2lnbmFsIHN0YWNrIGZyYW1lCisgKi8KKworRU5UUlkoaXdtbXh0X3Rhc2tfcmVzdG9yZSkKKworCW1ycwlpcCwgY3BzcgorCW9ycglyMiwgaXAsICNQU1JfSV9CSVQJCUAgZGlzYWJsZSBpbnRlcnJ1cHRzCisJbXNyCWNwc3JfYywgcjIKKworCWxkcglyMywgPWNvbmNhbl9vd25lcgorCWFkZAlyMiwgcjAsICNUSV9JV01NWFRfU1RBVEUJQCBnZXQgdGFzayBDb25jYW4gc2F2ZSBhcmVhCisJbGRyCXIzLCBbcjNdCQkJQCBnZXQgY3VycmVudCBDb25jYW4gb3duZXIKKwliaWMJcjIsIHIyLCAjMHg3CQkJQCA2NC1iaXQgYWxpZ25tZW50CisJdGVxCXIyLCByMwkJCQlAIGRvZXMgdGhpcyB0YXNrIG93biBpdC4uLgorCWJlcQkxZgorCisJQCB0aGlzIHRhc2sgZG9lc24ndCBvd24gQ29uY2FuIHJlZ3MgLS0gdXNlIGl0cyBzYXZlIGFyZWEKKwltc3IJY3Bzcl9jLCBpcAkJCUAgcmVzdG9yZSBpbnRlcnJ1cHQgbW9kZQorCW1vdglyMCwgcjIKKwltb3YJcjIsICNNTVhfU0laRQorCWIJbWVtY3B5CisKKzE6CUAgdGhpcyB0YXNrIG93bnMgQ29uY2FuIHJlZ3MgLS0gbG9hZCB0aGVtIGRpcmVjdGx5CisJbW92CXIwLCByMQorCW1vdglyMSwgIzAJCQkJQCBkb24ndCBjbGVhciBDVVAvTVVQCisJbW92CXIzLCBscgkJCQlAIHByZXNlcnZlIHJldHVybiBhZGRyZXNzCisJYmwJY29uY2FuX2xvYWQKKwltc3IJY3Bzcl9jLCBpcAkJCUAgcmVzdG9yZSBpbnRlcnJ1cHQgbW9kZQorCW1vdglwYywgcjMKKworLyoKKyAqIENvbmNhbiBoYW5kbGluZyBvbiB0YXNrIHN3aXRjaAorICoKKyAqIHIwID0gcHJldmlvdXMgdGFza19zdHJ1Y3QgcG9pbnRlciAobXVzdCBiZSBwcmVzZXJ2ZWQpCisgKiByMSA9IHByZXZpb3VzIHRocmVhZF9pbmZvIHBvaW50ZXIKKyAqIHIyID0gbmV4dCB0aHJlYWRfaW5mby5jcHVfZG9tYWluIHBvaW50ZXIgKG11c3QgYmUgcHJlc2VydmVkKQorICoKKyAqIENhbGxlZCBvbmx5IGZyb20gX19zd2l0Y2hfdG8gd2l0aCB0YXNrIHByZWVtcHRpb24gZGlzYWJsZWQuCisgKiBObyBuZWVkIHRvIGNhcmUgYWJvdXQgcHJlc2VydmluZyByNCBhbmQgYWJvdmUuCisgKi8KK0VOVFJZKGl3bW14dF90YXNrX3N3aXRjaCkKKworCW1yYwlwMTUsIDAsIHI0LCBjMTUsIGMxLCAwCisJdHN0CXI0LCAjMHgzCQkJQCBDUDAgYW5kIENQMSBhY2Nlc3NpYmxlPworCWJuZQkxZgkJCQlAIHllczogYmxvY2sgdGhlbSBmb3IgbmV4dCB0YXNrCisKKwlsZHIJcjUsID1jb25jYW5fb3duZXIKKwlhZGQJcjYsIHIyLCAjKFRJX0lXTU1YVF9TVEFURSAtIFRJX0NQVV9ET01BSU4pIEAgZ2V0IG5leHQgdGFzayBDb25jYW4gc2F2ZSBhcmVhCisJbGRyCXI1LCBbcjVdCQkJQCBnZXQgY3VycmVudCBDb25jYW4gb3duZXIKKwl0ZXEJcjUsIHI2CQkJCUAgbmV4dCB0YXNrIG93bnMgaXQ/CisJbW92bmUJcGMsIGxyCQkJCUAgbm86IGxlYXZlIENvbmNhbiBkaXNhYmxlZAorCisxOgllb3IJcjQsIHI0LCAjMwkJCUAgZmxpcCBDb25jYW4gYWNjZXNzCisJbWNyCXAxNSwgMCwgcjQsIGMxNSwgYzEsIDAKKworCW1yYwlwMTUsIDAsIHI0LCBjMiwgYzAsIDAKKwlzdWIJcGMsIGxyLCByNCwgbHNyICMzMgkJQCBjcHdhaXQgYW5kIHJldHVybgorCisvKgorICogUmVtb3ZlIENvbmNhbiBvd25lcnNoaXAgb2YgZ2l2ZW4gdGFzaworICoKKyAqIHIwID0gc3RydWN0IHRocmVhZF9pbmZvIHBvaW50ZXIKKyAqLworRU5UUlkoaXdtbXh0X3Rhc2tfcmVsZWFzZSkKKworCW1ycwlyMiwgY3BzcgorCW9ycglpcCwgcjIsICNQU1JfSV9CSVQJCUAgZGlzYWJsZSBpbnRlcnJ1cHRzCisJbXNyCWNwc3JfYywgaXAKKwlsZHIJcjMsID1jb25jYW5fb3duZXIKKwlhZGQJcjAsIHIwLCAjVElfSVdNTVhUX1NUQVRFCUAgZ2V0IHRhc2sgQ29uY2FuIHNhdmUgYXJlYQorCWxkcglyMSwgW3IzXQkJCUAgZ2V0IGN1cnJlbnQgQ29uY2FuIG93bmVyCisJZW9ycwlyMCwgcjAsIHIxCQkJQCBpZiBlcXVhbC4uLgorCXN0cmVxCXIwLCBbcjNdCQkJQCB0aGVuIGNsZWFyIG93bmVyc2hpcAorCW1zcgljcHNyX2MsIHIyCQkJQCByZXN0b3JlIGludGVycnVwdHMKKwltb3YJcGMsIGxyCisKKwkuZGF0YQorY29uY2FuX293bmVyOgorCS53b3JkCTAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhODVjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2R1bGUgYWxsb2NhdGlvbiBtZXRob2Qgc3VnZ2VzdGVkIGJ5IEFuZGkgS2xlZW4uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKKy8qCisgKiBUaGUgWElQIGtlcm5lbCB0ZXh0IGlzIG1hcHBlZCBpbiB0aGUgbW9kdWxlIGFyZWEgZm9yIG1vZHVsZXMgYW5kCisgKiBzb21lIG90aGVyIHN0dWZmIHRvIHdvcmsgd2l0aG91dCBhbnkgaW5kaXJlY3QgcmVsb2NhdGlvbnMuCisgKiBNT0RVTEVfU1RBUlQgaXMgcmVkZWZpbmVkIGhlcmUgYW5kIG5vdCBpbiBhc20vbWVtb3J5LmggdG8gYXZvaWQKKyAqIHJlY29tcGlsaW5nIHRoZSB3aG9sZSBrZXJuZWwgd2hlbiBDT05GSUdfWElQX0tFUk5FTCBpcyB0dXJuZWQgb24vb2ZmLgorICovCitleHRlcm4gdm9pZCBfZXRleHQ7CisjdW5kZWYgTU9EVUxFX1NUQVJUCisjZGVmaW5lIE1PRFVMRV9TVEFSVAkoKCh1bnNpZ25lZCBsb25nKSZfZXRleHQgKyB+UEdESVJfTUFTSykgJiBQR0RJUl9NQVNLKQorI2VuZGlmCisKK3ZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCWlmICghc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplLCBWTV9BTExPQywgTU9EVUxFX1NUQVJULCBNT0RVTEVfRU5EKTsKKwlpZiAoIWFyZWEpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIF9fdm1hbGxvY19hcmVhKGFyZWEsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMKTsKK30KKwordm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIHZvaWQgKnJlZ2lvbikKK3sKKwl2ZnJlZShyZWdpb24pOworfQorCitpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAorCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAorCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAwOworfQorCitpbnQKK2FwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsIGNvbnN0IGNoYXIgKnN0cnRhYiwgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsaW5kZXgsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK3sKKwlFbGYzMl9TaGRyICpzeW1zZWMgPSBzZWNoZHJzICsgc3ltaW5kZXg7CisJRWxmMzJfU2hkciAqcmVsc2VjID0gc2VjaGRycyArIHJlbGluZGV4OworCUVsZjMyX1NoZHIgKmRzdHNlYyA9IHNlY2hkcnMgKyByZWxzZWMtPnNoX2luZm87CisJRWxmMzJfUmVsICpyZWwgPSAodm9pZCAqKXJlbHNlYy0+c2hfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCByZWxzZWMtPnNoX3NpemUgLyBzaXplb2YoRWxmMzJfUmVsKTsgaSsrLCByZWwrKykgeworCQl1bnNpZ25lZCBsb25nIGxvYzsKKwkJRWxmMzJfU3ltICpzeW07CisJCXMzMiBvZmZzZXQ7CisKKwkJb2Zmc2V0ID0gRUxGMzJfUl9TWU0ocmVsLT5yX2luZm8pOworCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiAoc3ltc2VjLT5zaF9zaXplIC8gc2l6ZW9mKEVsZjMyX1N5bSkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgcmVsb2NhdGlvbiwgc2VjdGlvbiAlZCByZWxvYyAlZFxuIiwKKwkJCQltb2R1bGUtPm5hbWUsIHJlbGluZGV4LCBpKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorCisJCXN5bSA9ICgoRWxmMzJfU3ltICopc3ltc2VjLT5zaF9hZGRyKSArIG9mZnNldDsKKworCQlpZiAocmVsLT5yX29mZnNldCA8IDAgfHwgcmVsLT5yX29mZnNldCA+IGRzdHNlYy0+c2hfc2l6ZSAtIHNpemVvZih1MzIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgYm91bmRzIHJlbG9jYXRpb24sICIKKwkJCQkic2VjdGlvbiAlZCByZWxvYyAlZCBvZmZzZXQgJWQgc2l6ZSAlZFxuIiwKKwkJCQltb2R1bGUtPm5hbWUsIHJlbGluZGV4LCBpLCByZWwtPnJfb2Zmc2V0LAorCQkJCWRzdHNlYy0+c2hfc2l6ZSk7CisJCQlyZXR1cm4gLUVOT0VYRUM7CisJCX0KKworCQlsb2MgPSBkc3RzZWMtPnNoX2FkZHIgKyByZWwtPnJfb2Zmc2V0OworCisJCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSkgeworCQljYXNlIFJfQVJNX0FCUzMyOgorCQkJKih1MzIgKilsb2MgKz0gc3ltLT5zdF92YWx1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9BUk1fUEMyNDoKKwkJCW9mZnNldCA9ICgqKHUzMiAqKWxvYyAmIDB4MDBmZmZmZmYpIDw8IDI7CisJCQlpZiAob2Zmc2V0ICYgMHgwMjAwMDAwMCkKKwkJCQlvZmZzZXQgLT0gMHgwNDAwMDAwMDsKKworCQkJb2Zmc2V0ICs9IHN5bS0+c3RfdmFsdWUgLSBsb2M7CisJCQlpZiAob2Zmc2V0ICYgMyB8fAorCQkJICAgIG9mZnNldCA8PSAoczMyKTB4ZmMwMDAwMDAgfHwKKwkJCSAgICBvZmZzZXQgPj0gKHMzMikweDA0MDAwMDAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogcmVsb2NhdGlvbiBvdXQgb2YgcmFuZ2UsIHNlY3Rpb24gIgorCQkJCSAgICAgICAiJWQgcmVsb2MgJWQgc3ltICclcydcbiIsIG1vZHVsZS0+bmFtZSwKKwkJCQkgICAgICAgcmVsaW5kZXgsIGksIHN0cnRhYiArIHN5bS0+c3RfbmFtZSk7CisJCQkJcmV0dXJuIC1FTk9FWEVDOworCQkJfQorCisJCQlvZmZzZXQgPj49IDI7CisKKwkJCSoodTMyICopbG9jICY9IDB4ZmYwMDAwMDA7CisJCQkqKHUzMiAqKWxvYyB8PSBvZmZzZXQgJiAweDAwZmZmZmZmOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCisJCQkgICAgICAgbW9kdWxlLT5uYW1lLCBFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50CithcHBseV9yZWxvY2F0ZV9hZGQoRWxmMzJfU2hkciAqc2VjaGRycywgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsIHVuc2lnbmVkIGludCByZWxzZWMsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK3sKKwlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogQUREIFJFTE9DQVRJT04gdW5zdXBwb3J0ZWRcbiIsCisJICAgICAgIG1vZHVsZS0+bmFtZSk7CisJcmV0dXJuIC1FTk9FWEVDOworfQorCitpbnQKK21vZHVsZV9maW5hbGl6ZShjb25zdCBFbGYzMl9FaGRyICpoZHIsIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK21vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkOGNhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBSdXNzZWxsIEtpbmcgLSBDb252ZXJ0ZWQgdG8gQVJNLgorICogIE9yaWdpbmFsIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworZXh0ZXJuIGNvbnN0IGNoYXIgKnByb2Nlc3Nvcl9tb2Rlc1tdOworZXh0ZXJuIHZvaWQgc2V0dXBfbW1fZm9yX3JlYm9vdChjaGFyIG1vZGUpOworCitzdGF0aWMgdm9sYXRpbGUgaW50IGhsdF9jb3VudGVyOworCisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzdGVtLmg+CisKK3ZvaWQgZGlzYWJsZV9obHQodm9pZCkKK3sKKwlobHRfY291bnRlcisrOworfQorCitFWFBPUlRfU1lNQk9MKGRpc2FibGVfaGx0KTsKKwordm9pZCBlbmFibGVfaGx0KHZvaWQpCit7CisJaGx0X2NvdW50ZXItLTsKK30KKworRVhQT1JUX1NZTUJPTChlbmFibGVfaGx0KTsKKworc3RhdGljIGludCBfX2luaXQgbm9obHRfc2V0dXAoY2hhciAqX191bnVzZWQpCit7CisJaGx0X2NvdW50ZXIgPSAxOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBobHRfc2V0dXAoY2hhciAqX191bnVzZWQpCit7CisJaGx0X2NvdW50ZXIgPSAwOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub2hsdCIsIG5vaGx0X3NldHVwKTsKK19fc2V0dXAoImhsdCIsIGhsdF9zZXR1cCk7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFyZW4ndCBjdXJyZW50bHkgdXNlZC4KKyAqLwordm9pZCAoKnBtX2lkbGUpKHZvaWQpOworRVhQT1JUX1NZTUJPTChwbV9pZGxlKTsKKwordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CisKKy8qCisgKiBUaGlzIGlzIG91ciBkZWZhdWx0IGlkbGUgaGFuZGxlci4gIFdlIG5lZWQgdG8gZGlzYWJsZQorICogaW50ZXJydXB0cyBoZXJlIHRvIGVuc3VyZSB3ZSBkb24ndCBtaXNzIGEgd2FrZXVwIGNhbGwuCisgKi8KK3ZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlpZiAoIW5lZWRfcmVzY2hlZCgpICYmICFobHRfY291bnRlcikKKwkJYXJjaF9pZGxlKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCisvKgorICogVGhlIGlkbGUgdGhyZWFkLiAgV2UgdHJ5IHRvIGNvbnNlcnZlIHBvd2VyLCB3aGlsZSB0cnlpbmcgdG8ga2VlcAorICogb3ZlcmFsbCBsYXRlbmN5IGxvdy4gIFRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaWRsZSBpcyBwYXNzZWQKKyAqIGEgdmFsdWUgdG8gaW5kaWNhdGUgdGhlIGxldmVsIG9mICJpZGxlbmVzcyIgb2YgdGhlIHN5c3RlbS4KKyAqLwordm9pZCBjcHVfaWRsZSh2b2lkKQoreworCWxvY2FsX2ZpcV9lbmFibGUoKTsKKworCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCisJd2hpbGUgKDEpIHsKKwkJdm9pZCAoKmlkbGUpKHZvaWQpID0gcG1faWRsZTsKKwkJaWYgKCFpZGxlKQorCQkJaWRsZSA9IGRlZmF1bHRfaWRsZTsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCWxlZHNfZXZlbnQobGVkX2lkbGVfc3RhcnQpOworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQkJaWRsZSgpOworCQlsZWRzX2V2ZW50KGxlZF9pZGxlX2VuZCk7CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCXNjaGVkdWxlKCk7CisJfQorfQorCitzdGF0aWMgY2hhciByZWJvb3RfbW9kZSA9ICdoJzsKKworaW50IF9faW5pdCByZWJvb3Rfc2V0dXAoY2hhciAqc3RyKQoreworCXJlYm9vdF9tb2RlID0gc3RyWzBdOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJyZWJvb3Q9IiwgcmVib290X3NldHVwKTsKKwordm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3sKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2hhbHQpOworCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJaWYgKHBtX3Bvd2VyX29mZikKKwkJcG1fcG93ZXJfb2ZmKCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9wb3dlcl9vZmYpOworCit2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogX191bnVzZWQpCit7CisJLyoKKwkgKiBDbGVhbiBhbmQgZGlzYWJsZSBjYWNoZSwgYW5kIHR1cm4gb2ZmIGludGVycnVwdHMKKwkgKi8KKwljcHVfcHJvY19maW4oKTsKKworCS8qCisJICogVGVsbCB0aGUgbW0gc3lzdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHJlYm9vdCAtCisJICogd2UgbWF5IG5lZWQgaXQgdG8gaW5zZXJ0IHNvbWUgMToxIG1hcHBpbmdzIHNvIHRoYXQKKwkgKiBzb2Z0IGJvb3Qgd29ya3MuCisJICovCisJc2V0dXBfbW1fZm9yX3JlYm9vdChyZWJvb3RfbW9kZSk7CisKKwkvKgorCSAqIE5vdyBjYWxsIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgcmVib290IGNvZGUuCisJICovCisJYXJjaF9yZXNldChyZWJvb3RfbW9kZSk7CisKKwkvKgorCSAqIFdob29wcyAtIHRoZSBhcmNoaXRlY3R1cmUgd2FzIHVuYWJsZSB0byByZWJvb3QuCisJICogVGVsbCB0aGUgdXNlciEKKwkgKi8KKwltZGVsYXkoMTAwMCk7CisJcHJpbnRrKCJSZWJvb3QgZmFpbGVkIC0tIFN5c3RlbSBoYWx0ZWRcbiIpOworCXdoaWxlICgxKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX3Jlc3RhcnQpOworCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZsYWdzID0gY29uZGl0aW9uX2NvZGVzKHJlZ3MpOworCisJcHJpbnRfc3ltYm9sKCJQQyBpcyBhdCAlc1xuIiwgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSk7CisJcHJpbnRfc3ltYm9sKCJMUiBpcyBhdCAlc1xuIiwgcmVncy0+QVJNX2xyKTsKKwlwcmludGsoInBjIDogWzwlMDhseD5dICAgIGxyIDogWzwlMDhseD5dICAgICVzXG4iCisJICAgICAgICJzcCA6ICUwOGx4ICBpcCA6ICUwOGx4ICBmcCA6ICUwOGx4XG4iLAorCQlpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLAorCQlyZWdzLT5BUk1fbHIsIHByaW50X3RhaW50ZWQoKSwgcmVncy0+QVJNX3NwLAorCQlyZWdzLT5BUk1faXAsIHJlZ3MtPkFSTV9mcCk7CisJcHJpbnRrKCJyMTA6ICUwOGx4ICByOSA6ICUwOGx4ICByOCA6ICUwOGx4XG4iLAorCQlyZWdzLT5BUk1fcjEwLCByZWdzLT5BUk1fcjksCisJCXJlZ3MtPkFSTV9yOCk7CisJcHJpbnRrKCJyNyA6ICUwOGx4ICByNiA6ICUwOGx4ICByNSA6ICUwOGx4ICByNCA6ICUwOGx4XG4iLAorCQlyZWdzLT5BUk1fcjcsIHJlZ3MtPkFSTV9yNiwKKwkJcmVncy0+QVJNX3I1LCByZWdzLT5BUk1fcjQpOworCXByaW50aygicjMgOiAlMDhseCAgcjIgOiAlMDhseCAgcjEgOiAlMDhseCAgcjAgOiAlMDhseFxuIiwKKwkJcmVncy0+QVJNX3IzLCByZWdzLT5BUk1fcjIsCisJCXJlZ3MtPkFSTV9yMSwgcmVncy0+QVJNX3IwKTsKKwlwcmludGsoIkZsYWdzOiAlYyVjJWMlYyIsCisJCWZsYWdzICYgUFNSX05fQklUID8gJ04nIDogJ24nLAorCQlmbGFncyAmIFBTUl9aX0JJVCA/ICdaJyA6ICd6JywKKwkJZmxhZ3MgJiBQU1JfQ19CSVQgPyAnQycgOiAnYycsCisJCWZsYWdzICYgUFNSX1ZfQklUID8gJ1YnIDogJ3YnKTsKKwlwcmludGsoIiAgSVJRcyBvJXMgIEZJUXMgbyVzICBNb2RlICVzJXMgIFNlZ21lbnQgJXNcbiIsCisJCWludGVycnVwdHNfZW5hYmxlZChyZWdzKSA/ICJuIiA6ICJmZiIsCisJCWZhc3RfaW50ZXJydXB0c19lbmFibGVkKHJlZ3MpID8gIm4iIDogImZmIiwKKwkJcHJvY2Vzc29yX21vZGVzW3Byb2Nlc3Nvcl9tb2RlKHJlZ3MpXSwKKwkJdGh1bWJfbW9kZShyZWdzKSA/ICIgKFQpIiA6ICIiLAorCQlnZXRfZnMoKSA9PSBnZXRfZHMoKSA/ICJrZXJuZWwiIDogInVzZXIiKTsKKwl7CisJCXVuc2lnbmVkIGludCBjdHJsLCB0cmFuc2Jhc2UsIGRhYzsKKwkJICBfX2FzbV9fICgKKwkJIgltcmMgcDE1LCAwLCAlMCwgYzEsIGMwXG4iCisJCSIJbXJjIHAxNSwgMCwgJTEsIGMyLCBjMFxuIgorCQkiCW1yYyBwMTUsIDAsICUyLCBjMywgYzBcbiIKKwkJOiAiPXIiIChjdHJsKSwgIj1yIiAodHJhbnNiYXNlKSwgIj1yIiAoZGFjKSk7CisJCXByaW50aygiQ29udHJvbDogJTA0WCAgVGFibGU6ICUwOFggIERBQzogJTA4WFxuIiwKKwkJICAJY3RybCwgdHJhbnNiYXNlLCBkYWMpOworCX0KK30KKwordm9pZCBzaG93X2ZwcmVncyhzdHJ1Y3QgdXNlcl9mcCAqcmVncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyAqcDsKKwkJY2hhciB0eXBlOworCisJCXAgPSAodW5zaWduZWQgbG9uZyAqKShyZWdzLT5mcHJlZ3MgKyBpKTsKKworCQlzd2l0Y2ggKHJlZ3MtPmZ0eXBlW2ldKSB7CisJCQljYXNlIDE6IHR5cGUgPSAnZic7IGJyZWFrOworCQkJY2FzZSAyOiB0eXBlID0gJ2QnOyBicmVhazsKKwkJCWNhc2UgMzogdHlwZSA9ICdlJzsgYnJlYWs7CisJCQlkZWZhdWx0OiB0eXBlID0gJz8nOyBicmVhazsKKwkJfQorCQlpZiAocmVncy0+aW5pdF9mbGFnKQorCQkJdHlwZSA9ICc/JzsKKworCQlwcmludGsoIiAgZiVkKCVjKTogJTA4bHggJTA4bHggJTA4bHglYyIsCisJCQlpLCB0eXBlLCBwWzBdLCBwWzFdLCBwWzJdLCBpICYgMSA/ICdcbicgOiAnICcpOworCX0KKwkJCQorCisJcHJpbnRrKCJGUFNSOiAlMDhseCBGUENSOiAlMDhseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpcmVncy0+ZnBzciwKKwkJKHVuc2lnbmVkIGxvbmcpcmVncy0+ZnBjcik7Cit9CisKKy8qCisgKiBUYXNrIHN0cnVjdHVyZSBhbmQga2VybmVsIHN0YWNrIGFsbG9jYXRpb24uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nICp0aHJlYWRfaW5mb19oZWFkOworc3RhdGljIHVuc2lnbmVkIGludCBucl90aHJlYWRfaW5mbzsKKworI2RlZmluZSBFWFRSQV9UQVNLX1NUUlVDVAk0CisjZGVmaW5lIGxsX2FsbG9jX3Rhc2tfc3RydWN0KCkgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDEpKQorI2RlZmluZSBsbF9mcmVlX3Rhc2tfc3RydWN0KHApIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpKHApLDEpCisKK3N0cnVjdCB0aHJlYWRfaW5mbyAqYWxsb2NfdGhyZWFkX2luZm8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gTlVMTDsKKworCWlmIChFWFRSQV9UQVNLX1NUUlVDVCkgeworCQl1bnNpZ25lZCBsb25nICpwID0gdGhyZWFkX2luZm9faGVhZDsKKworCQlpZiAocCkgeworCQkJdGhyZWFkX2luZm9faGVhZCA9ICh1bnNpZ25lZCBsb25nICopcFswXTsKKwkJCW5yX3RocmVhZF9pbmZvIC09IDE7CisJCX0KKwkJdGhyZWFkID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKXA7CisJfQorCisJaWYgKCF0aHJlYWQpCisJCXRocmVhZCA9IGxsX2FsbG9jX3Rhc2tfc3RydWN0KCk7CisKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwkvKgorCSAqIFRoZSBzdGFjayBtdXN0IGJlIGNsZWFyZWQgaWYgeW91IHdhbnQgU1lTUlEtVCB0bworCSAqIGdpdmUgc2Vuc2libGUgc3RhY2sgdXNhZ2UgaW5mb3JtYXRpb24KKwkgKi8KKwlpZiAodGhyZWFkKSB7CisJCWNoYXIgKnAgPSAoY2hhciAqKXRocmVhZDsKKwkJbWVtemVybyhwK0tFUk5FTF9TVEFDS19TSVpFLCBLRVJORUxfU1RBQ0tfU0laRSk7CisJfQorI2VuZGlmCisJcmV0dXJuIHRocmVhZDsKK30KKwordm9pZCBmcmVlX3RocmVhZF9pbmZvKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQoreworCWlmIChFWFRSQV9UQVNLX1NUUlVDVCAmJiBucl90aHJlYWRfaW5mbyA8IEVYVFJBX1RBU0tfU1RSVUNUKSB7CisJCXVuc2lnbmVkIGxvbmcgKnAgPSAodW5zaWduZWQgbG9uZyAqKXRocmVhZDsKKwkJcFswXSA9ICh1bnNpZ25lZCBsb25nKXRocmVhZF9pbmZvX2hlYWQ7CisJCXRocmVhZF9pbmZvX2hlYWQgPSBwOworCQlucl90aHJlYWRfaW5mbyArPSAxOworCX0gZWxzZQorCQlsbF9mcmVlX3Rhc2tfc3RydWN0KHRocmVhZCk7Cit9CisKKy8qCisgKiBGcmVlIGN1cnJlbnQgdGhyZWFkIGRhdGEgc3RydWN0dXJlcyBldGMuLgorICovCit2b2lkIGV4aXRfdGhyZWFkKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfZnBfaW5pdCh1bmlvbiBmcF9zdGF0ZSAqZnApCit7CisJbWVtc2V0KGZwLCAwLCBzaXplb2YodW5pb24gZnBfc3RhdGUpKTsKK30KKwordm9pZCAoKmZwX2luaXQpKHVuaW9uIGZwX3N0YXRlICopID0gZGVmYXVsdF9mcF9pbml0OworRVhQT1JUX1NZTUJPTChmcF9pbml0KTsKKwordm9pZCBmbHVzaF90aHJlYWQodm9pZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwltZW1zZXQodGhyZWFkLT51c2VkX2NwLCAwLCBzaXplb2YodGhyZWFkLT51c2VkX2NwKSk7CisJbWVtc2V0KCZ0c2stPnRocmVhZC5kZWJ1ZywgMCwgc2l6ZW9mKHN0cnVjdCBkZWJ1Z19pbmZvKSk7CisjaWYgZGVmaW5lZChDT05GSUdfSVdNTVhUKQorCWl3bW14dF90YXNrX3JlbGVhc2UodGhyZWFkKTsKKyNlbmRpZgorCWZwX2luaXQoJnRocmVhZC0+ZnBzdGF0ZSk7CisjaWYgZGVmaW5lZChDT05GSUdfVkZQKQorCXZmcF9mbHVzaF90aHJlYWQoJnRocmVhZC0+dmZwc3RhdGUpOworI2VuZGlmCit9CisKK3ZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpkZWFkX3Rhc2spCit7CisjaWYgZGVmaW5lZChDT05GSUdfVkZQKQorCXZmcF9yZWxlYXNlX3RocmVhZCgmZGVhZF90YXNrLT50aHJlYWRfaW5mby0+dmZwc3RhdGUpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSVdNTVhUKQorCWl3bW14dF90YXNrX3JlbGVhc2UoZGVhZF90YXNrLT50aHJlYWRfaW5mbyk7CisjZW5kaWYKK30KKworYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCkgX19hc21fXygicmV0X2Zyb21fZm9yayIpOworCitpbnQKK2NvcHlfdGhyZWFkKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBzdGFja19zdGFydCwKKwkgICAgdW5zaWduZWQgbG9uZyBzdGtfc3osIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBwLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzOworCisJY2hpbGRyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKSgodW5zaWduZWQgbG9uZyl0aHJlYWQgKyBUSFJFQURfU0laRSAtIDgpKSAtIDE7CisJKmNoaWxkcmVncyA9ICpyZWdzOworCWNoaWxkcmVncy0+QVJNX3IwID0gMDsKKwljaGlsZHJlZ3MtPkFSTV9zcCA9IHN0YWNrX3N0YXJ0OworCisJbWVtc2V0KCZ0aHJlYWQtPmNwdV9jb250ZXh0LCAwLCBzaXplb2Yoc3RydWN0IGNwdV9jb250ZXh0X3NhdmUpKTsKKwl0aHJlYWQtPmNwdV9jb250ZXh0LnNwID0gKHVuc2lnbmVkIGxvbmcpY2hpbGRyZWdzOworCXRocmVhZC0+Y3B1X2NvbnRleHQucGMgPSAodW5zaWduZWQgbG9uZylyZXRfZnJvbV9mb3JrOworCisJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQorCQl0aHJlYWQtPnRwX3ZhbHVlID0gcmVncy0+QVJNX3IzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmaWxsIGluIHRoZSBmcGUgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uLgorICovCitpbnQgZHVtcF9mcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlcl9mcCAqZnApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisJaW50IHVzZWRfbWF0aCA9IHRocmVhZC0+dXNlZF9jcFsxXSB8IHRocmVhZC0+dXNlZF9jcFsyXTsKKworCWlmICh1c2VkX21hdGgpCisJCW1lbWNweShmcCwgJnRocmVhZC0+ZnBzdGF0ZS5zb2Z0LCBzaXplb2YgKCpmcCkpOworCisJcmV0dXJuIHVzZWRfbWF0aCAhPSAwOworfQorRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CisKKy8qCisgKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuLgorICovCit2b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IHVzZXIgKiBkdW1wKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCWR1bXAtPm1hZ2ljID0gQ01BR0lDOworCWR1bXAtPnN0YXJ0X2NvZGUgPSB0c2stPm1tLT5zdGFydF9jb2RlOworCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmVncy0+QVJNX3NwICYgfihQQUdFX1NJWkUgLSAxKTsKKworCWR1bXAtPnVfdHNpemUgPSAodHNrLT5tbS0+ZW5kX2NvZGUgLSB0c2stPm1tLT5zdGFydF9jb2RlKSA+PiBQQUdFX1NISUZUOworCWR1bXAtPnVfZHNpemUgPSAodHNrLT5tbS0+YnJrIC0gdHNrLT5tbS0+c3RhcnRfZGF0YSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJZHVtcC0+dV9zc2l6ZSA9IDA7CisKKwlkdW1wLT51X2RlYnVncmVnWzBdID0gdHNrLT50aHJlYWQuZGVidWcuYnBbMF0uYWRkcmVzczsKKwlkdW1wLT51X2RlYnVncmVnWzFdID0gdHNrLT50aHJlYWQuZGVidWcuYnBbMV0uYWRkcmVzczsKKwlkdW1wLT51X2RlYnVncmVnWzJdID0gdHNrLT50aHJlYWQuZGVidWcuYnBbMF0uaW5zbi5hcm07CisJZHVtcC0+dV9kZWJ1Z3JlZ1szXSA9IHRzay0+dGhyZWFkLmRlYnVnLmJwWzFdLmluc24uYXJtOworCWR1bXAtPnVfZGVidWdyZWdbNF0gPSB0c2stPnRocmVhZC5kZWJ1Zy5uc2F2ZWQ7CisKKwlpZiAoZHVtcC0+c3RhcnRfc3RhY2sgPCAweDA0MDAwMDAwKQorCQlkdW1wLT51X3NzaXplID0gKDB4MDQwMDAwMDAgLSBkdW1wLT5zdGFydF9zdGFjaykgPj4gUEFHRV9TSElGVDsKKworCWR1bXAtPnJlZ3MgPSAqcmVnczsKKwlkdW1wLT51X2ZwdmFsaWQgPSBkdW1wX2ZwdSAocmVncywgJmR1bXAtPnVfZnApOworfQorRVhQT1JUX1NZTUJPTChkdW1wX3RocmVhZCk7CisKKy8qCisgKiBTaHVmZmxlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb3JyZWN0IHJlZ2lzdGVyIGJlZm9yZSBjYWxsaW5nIHRoZQorICogdGhyZWFkIGZ1bmN0aW9uLiAgcjEgaXMgdGhlIHRocmVhZCBhcmd1bWVudCwgcjIgaXMgdGhlIHBvaW50ZXIgdG8KKyAqIHRoZSB0aHJlYWQgZnVuY3Rpb24sIGFuZCByMyBwb2ludHMgdG8gdGhlIGV4aXQgZnVuY3Rpb24uCisgKi8KK2V4dGVybiB2b2lkIGtlcm5lbF90aHJlYWRfaGVscGVyKHZvaWQpOworYXNtKAkiLnNlY3Rpb24gLnRleHRcbiIKKyIJLmFsaWduXG4iCisiCS50eXBlCWtlcm5lbF90aHJlYWRfaGVscGVyLCAjZnVuY3Rpb25cbiIKKyJrZXJuZWxfdGhyZWFkX2hlbHBlcjpcbiIKKyIJbW92CXIwLCByMVxuIgorIgltb3YJbHIsIHIzXG4iCisiCW1vdglwYywgcjJcbiIKKyIJLnNpemUJa2VybmVsX3RocmVhZF9oZWxwZXIsIC4gLSBrZXJuZWxfdGhyZWFkX2hlbHBlclxuIgorIgkucHJldmlvdXMiKTsKKworLyoKKyAqIENyZWF0ZSBhIGtlcm5lbCB0aHJlYWQuCisgKi8KK3BpZF90IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworCisJcmVncy5BUk1fcjEgPSAodW5zaWduZWQgbG9uZylhcmc7CisJcmVncy5BUk1fcjIgPSAodW5zaWduZWQgbG9uZylmbjsKKwlyZWdzLkFSTV9yMyA9ICh1bnNpZ25lZCBsb25nKWRvX2V4aXQ7CisJcmVncy5BUk1fcGMgPSAodW5zaWduZWQgbG9uZylrZXJuZWxfdGhyZWFkX2hlbHBlcjsKKwlyZWdzLkFSTV9jcHNyID0gU1ZDX01PREU7CisKKwlyZXR1cm4gZG9fZm9yayhmbGFnc3xDTE9ORV9WTXxDTE9ORV9VTlRSQUNFRCwgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKKwordW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgZnAsIGxyOworCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZTsKKwlpbnQgY291bnQgPSAwOworCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKQorCQlyZXR1cm4gMDsKKworCXN0YWNrX3BhZ2UgPSA0MDk2ICsgKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm87CisJZnAgPSB0aHJlYWRfc2F2ZWRfZnAocCk7CisJZG8geworCQlpZiAoZnAgPCBzdGFja19wYWdlIHx8IGZwID4gNDA5MitzdGFja19wYWdlKQorCQkJcmV0dXJuIDA7CisJCWxyID0gcGNfcG9pbnRlciAoKCh1bnNpZ25lZCBsb25nICopZnApWy0xXSk7CisJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKGxyKSkKKwkJCXJldHVybiBscjsKKwkJZnAgPSAqKHVuc2lnbmVkIGxvbmcgKikgKGZwIC0gMTIpOworCX0gd2hpbGUgKGNvdW50ICsrIDwgMTYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChnZXRfd2NoYW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDdhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKQEAgLTAsMCArMSw4NjEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCisgKgorICogIEJ5IFJvc3MgQmlybyAxLzIzLzkyCisgKiBlZGl0ZWQgYnkgTGludXMgVG9ydmFsZHMKKyAqIEFSTSBtb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKworI2luY2x1ZGUgInB0cmFjZS5oIgorCisjZGVmaW5lIFJFR19QQwkxNQorI2RlZmluZSBSRUdfUFNSCTE2CisvKgorICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgorICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICovCisKKyNpZiAwCisvKgorICogQnJlYWtwb2ludCBTV0kgaW5zdHJ1Y3Rpb246IFNXSSAmOUYwMDAxCisgKi8KKyNkZWZpbmUgQlJFQUtJTlNUX0FSTQkweGVmOWYwMDAxCisjZGVmaW5lIEJSRUFLSU5TVF9USFVNQgkweGRmMDAJCS8qIGZpbGwgdGhpcyBpbiBsYXRlciAqLworI2Vsc2UKKy8qCisgKiBOZXcgYnJlYWtwb2ludHMgLSB1c2UgYW4gdW5kZWZpbmVkIGluc3RydWN0aW9uLiAgVGhlIEFSTSBhcmNoaXRlY3R1cmUKKyAqIHJlZmVyZW5jZSBtYW51YWwgZ3VhcmFudGVlcyB0aGF0IHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gc3BhY2UKKyAqIHdpbGwgcHJvZHVjZSBhbiB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gZXhjZXB0aW9uIG9uIGFsbCBDUFVzOgorICoKKyAqICBBUk06ICAgeHh4eCAwMTExIDExMTEgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4CisgKiAgVGh1bWI6IDExMDEgMTExMCB4eHh4IHh4eHgKKyAqLworI2RlZmluZSBCUkVBS0lOU1RfQVJNCTB4ZTdmMDAxZjAKKyNkZWZpbmUgQlJFQUtJTlNUX1RIVU1CCTB4ZGUwMQorI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpdmUgcHRfcmVncyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrLgorICogVGhlc2UgYXJlIHNhdmVkIG9udG8gdGhlIHRvcCBrZXJuZWwgc3RhY2sgd2hlbiB0aGUgcHJvY2VzcworICogaXMgbm90IHJ1bm5pbmcuCisgKgorICogTm90ZTogaWYgYSB1c2VyIHRocmVhZCBpcyBleGVjdmUnZCBmcm9tIGtlcm5lbCBzcGFjZSwgdGhlCisgKiBrZXJuZWwgc3RhY2sgd2lsbCBub3QgYmUgZW1wdHkgb24gZW50cnkgdG8gdGhlIGtlcm5lbCwgc28KKyAqIHB0cmFjaW5nIHRoZXNlIHRhc2tzIHdpbGwgZmFpbC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqCitnZXRfdXNlcl9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gKHN0cnVjdCBwdF9yZWdzICopCisJCSgodW5zaWduZWQgbG9uZyl0YXNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFIC0KKwkJCQkgOCAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIHdpbGwgZ2V0IGEgd29yZCBvZmYgb2YgdGhlIHByb2Nlc3NlcyBwcml2aWxlZ2VkIHN0YWNrLgorICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRIUkVBRC4KKyAqIHRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYWxsIHRoZSBwcml2aWxlZ2VkIHN0YWNrcyBhcmUgaW4gb3VyCisgKiBkYXRhIHNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIGxvbmcgZ2V0X3VzZXJfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gZ2V0X3VzZXJfcmVncyh0YXNrKS0+dXJlZ3Nbb2Zmc2V0XTsKK30KKworLyoKKyAqIHRoaXMgcm91dGluZSB3aWxsIHB1dCBhIHdvcmQgb24gdGhlIHByb2Nlc3NlcyBwcml2aWxlZ2VkIHN0YWNrLgorICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRIUkVBRC4KKyAqIHRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYWxsIHRoZSBwcml2aWxlZ2VkIHN0YWNrcyBhcmUgaW4gb3VyCisgKiBkYXRhIHNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIGludAorcHV0X3VzZXJfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9mZnNldCwgbG9uZyBkYXRhKQoreworCXN0cnVjdCBwdF9yZWdzIG5ld3JlZ3MsICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0YXNrKTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCW5ld3JlZ3MgPSAqcmVnczsKKwluZXdyZWdzLnVyZWdzW29mZnNldF0gPSBkYXRhOworCisJaWYgKHZhbGlkX3VzZXJfcmVncygmbmV3cmVncykpIHsKKwkJcmVncy0+dXJlZ3Nbb2Zmc2V0XSA9IGRhdGE7CisJCXJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JlYWRfdTMyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBhZGRyLCB1MzIgKnJlcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0odGFzaywgYWRkciwgcmVzLCBzaXplb2YoKnJlcyksIDApOworCisJcmV0dXJuIHJldCA9PSBzaXplb2YoKnJlcykgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JlYWRfaW5zdHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIGFkZHIsIHUzMiAqcmVzKQoreworCWludCByZXQ7CisKKwlpZiAoYWRkciAmIDEpIHsKKwkJdTE2IHZhbDsKKwkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0odGFzaywgYWRkciAmIH4xLCAmdmFsLCBzaXplb2YodmFsKSwgMCk7CisJCXJldCA9IHJldCA9PSBzaXplb2YodmFsKSA/IDAgOiAtRUlPOworCQkqcmVzID0gdmFsOworCX0gZWxzZSB7CisJCXUzMiB2YWw7CisJCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIGFkZHIgJiB+MywgJnZhbCwgc2l6ZW9mKHZhbCksIDApOworCQlyZXQgPSByZXQgPT0gc2l6ZW9mKHZhbCkgPyAwIDogLUVJTzsKKwkJKnJlcyA9IHZhbDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdldCB2YWx1ZSBvZiByZWdpc3RlciBgcm4nIChpbiB0aGUgaW5zdHJ1Y3Rpb24pCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitwdHJhY2VfZ2V0cm4oc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgdW5zaWduZWQgbG9uZyBpbnNuKQoreworCXVuc2lnbmVkIGludCByZWcgPSAoaW5zbiA+PiAxNikgJiAxNTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXZhbCA9IGdldF91c2VyX3JlZyhjaGlsZCwgcmVnKTsKKwlpZiAocmVnID09IDE1KQorCQl2YWwgPSBwY19wb2ludGVyKHZhbCArIDgpOworCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIEdldCB2YWx1ZSBvZiBvcGVyYW5kIDIgKGluIGFuIEFMVSBpbnN0cnVjdGlvbikKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3B0cmFjZV9nZXRhbHVvcDIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgdW5zaWduZWQgbG9uZyBpbnNuKQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBzaGlmdDsKKwlpbnQgdHlwZTsKKworCWlmIChpbnNuICYgMSA8PCAyNSkgeworCQl2YWwgPSBpbnNuICYgMjU1OworCQlzaGlmdCA9IChpbnNuID4+IDgpICYgMTU7CisJCXR5cGUgPSAzOworCX0gZWxzZSB7CisJCXZhbCA9IGdldF91c2VyX3JlZyAoY2hpbGQsIGluc24gJiAxNSk7CisKKwkJaWYgKGluc24gJiAoMSA8PCA0KSkKKwkJCXNoaWZ0ID0gKGludClnZXRfdXNlcl9yZWcgKGNoaWxkLCAoaW5zbiA+PiA4KSAmIDE1KTsKKwkJZWxzZQorCQkJc2hpZnQgPSAoaW5zbiA+PiA3KSAmIDMxOworCisJCXR5cGUgPSAoaW5zbiA+PiA1KSAmIDM7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAwOgl2YWwgPDw9IHNoaWZ0OwlicmVhazsKKwljYXNlIDE6CXZhbCA+Pj0gc2hpZnQ7CWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gKCgoc2lnbmVkIGxvbmcpdmFsKSA+PiBzaGlmdCk7CisJCWJyZWFrOworCWNhc2UgMzoKKyAJCXZhbCA9ICh2YWwgPj4gc2hpZnQpIHwgKHZhbCA8PCAoMzIgLSBzaGlmdCkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIEdldCB2YWx1ZSBvZiBvcGVyYW5kIDIgKGluIGEgTERSIGluc3RydWN0aW9uKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworcHRyYWNlX2dldGxkcm9wMihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCB1bnNpZ25lZCBsb25nIGluc24pCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHNoaWZ0OworCWludCB0eXBlOworCisJdmFsID0gZ2V0X3VzZXJfcmVnKGNoaWxkLCBpbnNuICYgMTUpOworCXNoaWZ0ID0gKGluc24gPj4gNykgJiAzMTsKKwl0eXBlID0gKGluc24gPj4gNSkgJiAzOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAwOgl2YWwgPDw9IHNoaWZ0OwlicmVhazsKKwljYXNlIDE6CXZhbCA+Pj0gc2hpZnQ7CWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gKCgoc2lnbmVkIGxvbmcpdmFsKSA+PiBzaGlmdCk7CisJCWJyZWFrOworCWNhc2UgMzoKKyAJCXZhbCA9ICh2YWwgPj4gc2hpZnQpIHwgKHZhbCA8PCAoMzIgLSBzaGlmdCkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBPUF9NQVNLCTB4MDFlMDAwMDAKKyNkZWZpbmUgT1BfQU5ECTB4MDAwMDAwMDAKKyNkZWZpbmUgT1BfRU9SCTB4MDAyMDAwMDAKKyNkZWZpbmUgT1BfU1VCCTB4MDA0MDAwMDAKKyNkZWZpbmUgT1BfUlNCCTB4MDA2MDAwMDAKKyNkZWZpbmUgT1BfQURECTB4MDA4MDAwMDAKKyNkZWZpbmUgT1BfQURDCTB4MDBhMDAwMDAKKyNkZWZpbmUgT1BfU0JDCTB4MDBjMDAwMDAKKyNkZWZpbmUgT1BfUlNDCTB4MDBlMDAwMDAKKyNkZWZpbmUgT1BfT1JSCTB4MDE4MDAwMDAKKyNkZWZpbmUgT1BfTU9WCTB4MDFhMDAwMDAKKyNkZWZpbmUgT1BfQklDCTB4MDFjMDAwMDAKKyNkZWZpbmUgT1BfTVZOCTB4MDFlMDAwMDAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dldF9icmFuY2hfYWRkcmVzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIGluc24pCit7CisJdTMyIGFsdCA9IDA7CisKKwlzd2l0Y2ggKGluc24gJiAweDBlMDAwMDAwKSB7CisJY2FzZSAweDAwMDAwMDAwOgorCWNhc2UgMHgwMjAwMDAwMDogeworCQkvKgorCQkgKiBkYXRhIHByb2Nlc3NpbmcKKwkJICovCisJCWxvbmcgYWx1b3AxLCBhbHVvcDIsIGNjYml0OworCisJCWlmICgoaW5zbiAmIDB4ZjAwMCkgIT0gMHhmMDAwKQorCQkJYnJlYWs7CisKKwkJYWx1b3AxID0gcHRyYWNlX2dldHJuKGNoaWxkLCBpbnNuKTsKKwkJYWx1b3AyID0gcHRyYWNlX2dldGFsdW9wMihjaGlsZCwgaW5zbik7CisJCWNjYml0ICA9IGdldF91c2VyX3JlZyhjaGlsZCwgUkVHX1BTUikgJiBQU1JfQ19CSVQgPyAxIDogMDsKKworCQlzd2l0Y2ggKGluc24gJiBPUF9NQVNLKSB7CisJCWNhc2UgT1BfQU5EOiBhbHQgPSBhbHVvcDEgJiBhbHVvcDI7CQlicmVhazsKKwkJY2FzZSBPUF9FT1I6IGFsdCA9IGFsdW9wMSBeIGFsdW9wMjsJCWJyZWFrOworCQljYXNlIE9QX1NVQjogYWx0ID0gYWx1b3AxIC0gYWx1b3AyOwkJYnJlYWs7CisJCWNhc2UgT1BfUlNCOiBhbHQgPSBhbHVvcDIgLSBhbHVvcDE7CQlicmVhazsKKwkJY2FzZSBPUF9BREQ6IGFsdCA9IGFsdW9wMSArIGFsdW9wMjsJCWJyZWFrOworCQljYXNlIE9QX0FEQzogYWx0ID0gYWx1b3AxICsgYWx1b3AyICsgY2NiaXQ7CWJyZWFrOworCQljYXNlIE9QX1NCQzogYWx0ID0gYWx1b3AxIC0gYWx1b3AyICsgY2NiaXQ7CWJyZWFrOworCQljYXNlIE9QX1JTQzogYWx0ID0gYWx1b3AyIC0gYWx1b3AxICsgY2NiaXQ7CWJyZWFrOworCQljYXNlIE9QX09SUjogYWx0ID0gYWx1b3AxIHwgYWx1b3AyOwkJYnJlYWs7CisJCWNhc2UgT1BfTU9WOiBhbHQgPSBhbHVvcDI7CQkJYnJlYWs7CisJCWNhc2UgT1BfQklDOiBhbHQgPSBhbHVvcDEgJiB+YWx1b3AyOwkJYnJlYWs7CisJCWNhc2UgT1BfTVZOOiBhbHQgPSB+YWx1b3AyOwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgMHgwNDAwMDAwMDoKKwljYXNlIDB4MDYwMDAwMDA6CisJCS8qCisJCSAqIGxkcgorCQkgKi8KKwkJaWYgKChpbnNuICYgMHgwMDEwZjAwMCkgPT0gMHgwMDEwZjAwMCkgeworCQkJdW5zaWduZWQgbG9uZyBiYXNlOworCisJCQliYXNlID0gcHRyYWNlX2dldHJuKGNoaWxkLCBpbnNuKTsKKwkJCWlmIChpbnNuICYgMSA8PCAyNCkgeworCQkJCWxvbmcgYWx1b3AyOworCisJCQkJaWYgKGluc24gJiAweDAyMDAwMDAwKQorCQkJCQlhbHVvcDIgPSBwdHJhY2VfZ2V0bGRyb3AyKGNoaWxkLCBpbnNuKTsKKwkJCQllbHNlCisJCQkJCWFsdW9wMiA9IGluc24gJiAweGZmZjsKKworCQkJCWlmIChpbnNuICYgMSA8PCAyMykKKwkJCQkJYmFzZSArPSBhbHVvcDI7CisJCQkJZWxzZQorCQkJCQliYXNlIC09IGFsdW9wMjsKKwkJCX0KKwkJCWlmIChyZWFkX3UzMihjaGlsZCwgYmFzZSwgJmFsdCkgPT0gMCkKKwkJCQlhbHQgPSBwY19wb2ludGVyKGFsdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MDgwMDAwMDA6CisJCS8qCisJCSAqIGxkbQorCQkgKi8KKwkJaWYgKChpbnNuICYgMHgwMDEwODAwMCkgPT0gMHgwMDEwODAwMCkgeworCQkJdW5zaWduZWQgbG9uZyBiYXNlOworCQkJdW5zaWduZWQgaW50IG5yX3JlZ3M7CisKKwkJCWlmIChpbnNuICYgKDEgPDwgMjMpKSB7CisJCQkJbnJfcmVncyA9IGh3ZWlnaHQxNihpbnNuICYgNjU1MzUpIDw8IDI7CisKKwkJCQlpZiAoIShpbnNuICYgKDEgPDwgMjQpKSkKKwkJCQkJbnJfcmVncyAtPSA0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaW5zbiAmICgxIDw8IDI0KSkKKwkJCQkJbnJfcmVncyA9IC00OworCQkJCWVsc2UKKwkJCQkJbnJfcmVncyA9IDA7CisJCQl9CisKKwkJCWJhc2UgPSBwdHJhY2VfZ2V0cm4oY2hpbGQsIGluc24pOworCisJCQlpZiAocmVhZF91MzIoY2hpbGQsIGJhc2UgKyBucl9yZWdzLCAmYWx0KSA9PSAwKQorCQkJCWFsdCA9IHBjX3BvaW50ZXIoYWx0KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweDBhMDAwMDAwOiB7CisJCS8qCisJCSAqIGJsIG9yIGIKKwkJICovCisJCXNpZ25lZCBsb25nIGRpc3BsOworCQkvKiBJdCdzIGEgYnJhbmNoL2JyYW5jaCBsaW5rOiBpbnN0ZWFkIG9mIHRyeWluZyB0bworCQkgKiBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIGJyYW5jaCB3aWxsIGJlIHRha2VuIG9yIG5vdCwKKwkJICogd2UnbGwgcHV0IGEgYnJlYWtwb2ludCBhdCBib3RoIGxvY2F0aW9ucy4gIFRoaXMgaXMKKwkJICogc2ltcGxlciwgbW9yZSByZWxpYWJsZSwgYW5kIHByb2JhYmx5IG5vdCBhIHdob2xlIGxvdAorCQkgKiBzbG93ZXIgdGhhbiB0aGUgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggb2YgZW11bGF0aW5nIHRoZQorCQkgKiBicmFuY2guCisJCSAqLworCQlkaXNwbCA9IChpbnNuICYgMHgwMGZmZmZmZikgPDwgODsKKwkJZGlzcGwgPSAoZGlzcGwgPj4gNikgKyA4OworCQlpZiAoZGlzcGwgIT0gMCAmJiBkaXNwbCAhPSA0KQorCQkJYWx0ID0gcGMgKyBkaXNwbDsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisKKwlyZXR1cm4gYWx0OworfQorCitzdGF0aWMgaW50Citzd2FwX2luc24oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJICB2b2lkICpvbGRfaW5zbiwgdm9pZCAqbmV3X2luc24sIGludCBzaXplKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bSh0YXNrLCBhZGRyLCBvbGRfaW5zbiwgc2l6ZSwgMCk7CisJaWYgKHJldCA9PSBzaXplKQorCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bSh0YXNrLCBhZGRyLCBuZXdfaW5zbiwgc2l6ZSwgMSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2FkZF9icmVha3BvaW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IGRlYnVnX2luZm8gKmRiZywgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWludCBuciA9IGRiZy0+bnNhdmVkOworCisJaWYgKG5yIDwgMikgeworCQl1MzIgbmV3X2luc24gPSBCUkVBS0lOU1RfQVJNOworCQlpbnQgcmVzOworCisJCXJlcyA9IHN3YXBfaW5zbih0YXNrLCBhZGRyLCAmZGJnLT5icFtucl0uaW5zbiwgJm5ld19pbnNuLCA0KTsKKworCQlpZiAocmVzID09IDQpIHsKKwkJCWRiZy0+YnBbbnJdLmFkZHJlc3MgPSBhZGRyOworCQkJZGJnLT5uc2F2ZWQgKz0gMTsKKwkJfQorCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgInB0cmFjZTogdG9vIG1hbnkgYnJlYWtwb2ludHNcbiIpOworfQorCisvKgorICogQ2xlYXIgb25lIGJyZWFrcG9pbnQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFdlIGNvcHkgd2hhdCB0aGUgaGFyZHdhcmUKKyAqIGRvZXMgYW5kIHVzZSBiaXQgMCBvZiB0aGUgYWRkcmVzcyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSBUaHVtYgorICogYnJlYWtwb2ludCBvciBhbiBBUk0gYnJlYWtwb2ludC4KKyAqLworc3RhdGljIHZvaWQgY2xlYXJfYnJlYWtwb2ludChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBkZWJ1Z19lbnRyeSAqYnApCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gYnAtPmFkZHJlc3M7CisJdW5pb24gZGVidWdfaW5zbiBvbGRfaW5zbjsKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgJiAxKSB7CisJCXJldCA9IHN3YXBfaW5zbih0YXNrLCBhZGRyICYgfjEsICZvbGRfaW5zbi50aHVtYiwKKwkJCQkmYnAtPmluc24udGh1bWIsIDIpOworCisJCWlmIChyZXQgIT0gMiB8fCBvbGRfaW5zbi50aHVtYiAhPSBCUkVBS0lOU1RfVEhVTUIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBjb3JydXB0ZWQgVGh1bWIgYnJlYWtwb2ludCBhdCAiCisJCQkJIjB4JTA4bHggKDB4JTA0eClcbiIsIHRhc2stPmNvbW0sIHRhc2stPnBpZCwKKwkJCQlhZGRyLCBvbGRfaW5zbi50aHVtYik7CisJfSBlbHNlIHsKKwkJcmV0ID0gc3dhcF9pbnNuKHRhc2ssIGFkZHIgJiB+MywgJm9sZF9pbnNuLmFybSwKKwkJCQkmYnAtPmluc24uYXJtLCA0KTsKKworCQlpZiAocmV0ICE9IDQgfHwgb2xkX2luc24uYXJtICE9IEJSRUFLSU5TVF9BUk0pCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBjb3JydXB0ZWQgQVJNIGJyZWFrcG9pbnQgYXQgIgorCQkJCSIweCUwOGx4ICgweCUwOHgpXG4iLCB0YXNrLT5jb21tLCB0YXNrLT5waWQsCisJCQkJYWRkciwgb2xkX2luc24uYXJtKTsKKwl9Cit9CisKK3ZvaWQgcHRyYWNlX3NldF9icHQoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKwl1bnNpZ25lZCBsb25nIHBjOworCXUzMiBpbnNuOworCWludCByZXM7CisKKwlyZWdzID0gZ2V0X3VzZXJfcmVncyhjaGlsZCk7CisJcGMgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOworCisJaWYgKHRodW1iX21vZGUocmVncykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicHRyYWNlOiBjYW4ndCBoYW5kbGUgdGh1bWIgbW9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlyZXMgPSByZWFkX2luc3RyKGNoaWxkLCBwYywgJmluc24pOworCWlmICghcmVzKSB7CisJCXN0cnVjdCBkZWJ1Z19pbmZvICpkYmcgPSAmY2hpbGQtPnRocmVhZC5kZWJ1ZzsKKwkJdW5zaWduZWQgbG9uZyBhbHQ7CisKKwkJZGJnLT5uc2F2ZWQgPSAwOworCisJCWFsdCA9IGdldF9icmFuY2hfYWRkcmVzcyhjaGlsZCwgcGMsIGluc24pOworCQlpZiAoYWx0KQorCQkJYWRkX2JyZWFrcG9pbnQoY2hpbGQsIGRiZywgYWx0KTsKKworCQkvKgorCQkgKiBOb3RlIHRoYXQgd2UgaWdub3JlIHRoZSByZXN1bHQgb2Ygc2V0dGluZyB0aGUgYWJvdmUKKwkJICogYnJlYWtwb2ludCBzaW5jZSBpdCBtYXkgZmFpbC4gIFdoZW4gaXQgZG9lcywgdGhpcyBpcworCQkgKiBub3Qgc28gbXVjaCBhbiBlcnJvciwgYnV0IGEgZm9yZXdhcm5pbmcgdGhhdCB3ZSBtYXkKKwkJICogYmUgcmVjZWl2aW5nIGEgcHJlZmV0Y2ggYWJvcnQgc2hvcnRseS4KKwkJICoKKwkJICogSWYgd2UgZG9uJ3Qgc2V0IHRoaXMgYnJlYWtwb2ludCBoZXJlLCB0aGVuIHdlIGNhbgorCQkgKiBsb3NlIGNvbnRyb2wgb2YgdGhlIHRocmVhZCBkdXJpbmcgc2luZ2xlIHN0ZXBwaW5nLgorCQkgKi8KKwkJaWYgKCFhbHQgfHwgcHJlZGljYXRlKGluc24pICE9IFBSRURJQ0FURV9BTFdBWVMpCisJCQlhZGRfYnJlYWtwb2ludChjaGlsZCwgZGJnLCBwYyArIDQpOworCX0KK30KKworLyoKKyAqIEVuc3VyZSBubyBzaW5nbGUtc3RlcCBicmVha3BvaW50IGlzIHBlbmRpbmcuICBSZXR1cm5zIG5vbi16ZXJvCisgKiB2YWx1ZSBpZiBjaGlsZCB3YXMgYmVpbmcgc2luZ2xlLXN0ZXBwZWQuCisgKi8KK3ZvaWQgcHRyYWNlX2NhbmNlbF9icHQoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlpbnQgaSwgbnNhdmVkID0gY2hpbGQtPnRocmVhZC5kZWJ1Zy5uc2F2ZWQ7CisKKwljaGlsZC0+dGhyZWFkLmRlYnVnLm5zYXZlZCA9IDA7CisKKwlpZiAobnNhdmVkID4gMikgeworCQlwcmludGsoInB0cmFjZV9jYW5jZWxfYnB0OiBib2d1cyBuc2F2ZWQ6ICVkIVxuIiwgbnNhdmVkKTsKKwkJbnNhdmVkID0gMjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnNhdmVkOyBpKyspCisJCWNsZWFyX2JyZWFrcG9pbnQoY2hpbGQsICZjaGlsZC0+dGhyZWFkLmRlYnVnLmJwW2ldKTsKK30KKworLyoKKyAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgorICoKKyAqIE1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuCisgKi8KK3ZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwljaGlsZC0+cHRyYWNlICY9IH5QVF9TSU5HTEVTVEVQOworCXB0cmFjZV9jYW5jZWxfYnB0KGNoaWxkKTsKK30KKworLyoKKyAqIEhhbmRsZSBoaXR0aW5nIGEgYnJlYWtwb2ludC4KKyAqLwordm9pZCBwdHJhY2VfYnJlYWsoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNpZ2luZm9fdCBpbmZvOworCisJcHRyYWNlX2NhbmNlbF9icHQodHNrKTsKKworCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSAgPSBUUkFQX0JSS1BUOworCWluZm8uc2lfYWRkciAgPSAodm9pZCBfX3VzZXIgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOworCisJZm9yY2Vfc2lnX2luZm8oU0lHVFJBUCwgJmluZm8sIHRzayk7Cit9CisKK3N0YXRpYyBpbnQgYnJlYWtfdHJhcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQoreworCXB0cmFjZV9icmVhayhjdXJyZW50LCByZWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1bmRlZl9ob29rIGFybV9icmVha19ob29rID0geworCS5pbnN0cl9tYXNrCT0gMHgwZmZmZmZmZiwKKwkuaW5zdHJfdmFsCT0gMHgwN2YwMDFmMCwKKwkuY3Bzcl9tYXNrCT0gUFNSX1RfQklULAorCS5jcHNyX3ZhbAk9IDAsCisJLmZuCQk9IGJyZWFrX3RyYXAsCit9OworCitzdGF0aWMgc3RydWN0IHVuZGVmX2hvb2sgdGh1bWJfYnJlYWtfaG9vayA9IHsKKwkuaW5zdHJfbWFzawk9IDB4ZmZmZiwKKwkuaW5zdHJfdmFsCT0gMHhkZTAxLAorCS5jcHNyX21hc2sJPSBQU1JfVF9CSVQsCisJLmNwc3JfdmFsCT0gUFNSX1RfQklULAorCS5mbgkJPSBicmVha190cmFwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHRyYWNlX2JyZWFrX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl91bmRlZl9ob29rKCZhcm1fYnJlYWtfaG9vayk7CisJcmVnaXN0ZXJfdW5kZWZfaG9vaygmdGh1bWJfYnJlYWtfaG9vayk7CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwocHRyYWNlX2JyZWFrX2luaXQpOworCisvKgorICogUmVhZCB0aGUgd29yZCBhdCBvZmZzZXQgIm9mZiIgaW50byB0aGUgInN0cnVjdCB1c2VyIi4gIFdlCisgKiBhY3R1YWxseSBhY2Nlc3MgdGhlIHB0X3JlZ3Mgc3RvcmVkIG9uIHRoZSBrZXJuZWwgc3RhY2suCisgKi8KK3N0YXRpYyBpbnQgcHRyYWNlX3JlYWRfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBvZmYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnJldCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChvZmYgJiAzIHx8IG9mZiA+PSBzaXplb2Yoc3RydWN0IHVzZXIpKQorCQlyZXR1cm4gLUVJTzsKKworCXRtcCA9IDA7CisJaWYgKG9mZiA8IHNpemVvZihzdHJ1Y3QgcHRfcmVncykpCisJCXRtcCA9IGdldF91c2VyX3JlZyh0c2ssIG9mZiA+PiAyKTsKKworCXJldHVybiBwdXRfdXNlcih0bXAsIHJldCk7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgd29yZCBhdCBvZmZzZXQgIm9mZiIgaW50byAic3RydWN0IHVzZXIiLiAgV2UKKyAqIGFjdHVhbGx5IGFjY2VzcyB0aGUgcHRfcmVncyBzdG9yZWQgb24gdGhlIGtlcm5lbCBzdGFjay4KKyAqLworc3RhdGljIGludCBwdHJhY2Vfd3JpdGVfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBvZmYsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWlmIChvZmYgJiAzIHx8IG9mZiA+PSBzaXplb2Yoc3RydWN0IHVzZXIpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcHV0X3VzZXJfcmVnKHRzaywgb2ZmID4+IDIsIHZhbCk7Cit9CisKKy8qCisgKiBHZXQgYWxsIHVzZXIgaW50ZWdlciByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgcHRyYWNlX2dldHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1cmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF91c2VyX3JlZ3ModHNrKTsKKworCXJldHVybiBjb3B5X3RvX3VzZXIodXJlZ3MsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qCisgKiBTZXQgYWxsIHVzZXIgaW50ZWdlciByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgcHRyYWNlX3NldHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1cmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyBuZXdyZWdzOworCWludCByZXQ7CisKKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3cmVncywgdXJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID09IDApIHsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfdXNlcl9yZWdzKHRzayk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKHZhbGlkX3VzZXJfcmVncygmbmV3cmVncykpIHsKKwkJCSpyZWdzID0gbmV3cmVnczsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgcHRyYWNlX2dldGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdm9pZCBfX3VzZXIgKnVmcCkKK3sKKwlyZXR1cm4gY29weV90b191c2VyKHVmcCwgJnRzay0+dGhyZWFkX2luZm8tPmZwc3RhdGUsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2ZwKSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoKKyAqIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLgorICovCitzdGF0aWMgaW50IHB0cmFjZV9zZXRmcHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1ZnApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0c2stPnRocmVhZF9pbmZvOworCXRocmVhZC0+dXNlZF9jcFsxXSA9IHRocmVhZC0+dXNlZF9jcFsyXSA9IDE7CisJcmV0dXJuIGNvcHlfZnJvbV91c2VyKCZ0aHJlYWQtPmZwc3RhdGUsIHVmcCwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9mcCkpID8gLUVGQVVMVCA6IDA7Cit9CisKKyNpZmRlZiBDT05GSUdfSVdNTVhUCisKKy8qCisgKiBHZXQgdGhlIGNoaWxkIGlXTU1YdCBzdGF0ZS4KKyAqLworc3RhdGljIGludCBwdHJhY2VfZ2V0d21teHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1ZnApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0c2stPnRocmVhZF9pbmZvOworCXZvaWQgKnB0ciA9ICZ0aHJlYWQtPmZwc3RhdGU7CisKKwlpZiAoIXRlc3RfdGlfdGhyZWFkX2ZsYWcodGhyZWFkLCBUSUZfVVNJTkdfSVdNTVhUKSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWl3bW14dF90YXNrX2Rpc2FibGUodGhyZWFkKTsgIC8qIGZvcmNlIGl0IHRvIHJhbSAqLworCS8qIFRoZSBpV01NWHQgc3RhdGUgaXMgc3RvcmVkIGRvdWJsZXdvcmQtYWxpZ25lZC4gICovCisJaWYgKCgobG9uZykgcHRyKSAmIDQpCisJCXB0ciArPSA0OworCXJldHVybiBjb3B5X3RvX3VzZXIodWZwLCBwdHIsIDB4OTgpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qCisgKiBTZXQgdGhlIGNoaWxkIGlXTU1YdCBzdGF0ZS4KKyAqLworc3RhdGljIGludCBwdHJhY2Vfc2V0d21teHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1ZnApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0c2stPnRocmVhZF9pbmZvOworCXZvaWQgKnB0ciA9ICZ0aHJlYWQtPmZwc3RhdGU7CisKKwlpZiAoIXRlc3RfdGlfdGhyZWFkX2ZsYWcodGhyZWFkLCBUSUZfVVNJTkdfSVdNTVhUKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJaXdtbXh0X3Rhc2tfcmVsZWFzZSh0aHJlYWQpOyAgLyogZm9yY2UgYSByZWxvYWQgKi8KKwkvKiBUaGUgaVdNTVh0IHN0YXRlIGlzIHN0b3JlZCBkb3VibGV3b3JkLWFsaWduZWQuICAqLworCWlmICgoKGxvbmcpIHB0cikgJiA0KQorCQlwdHIgKz0gNDsKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIocHRyLCB1ZnAsIDB4OTgpID8gLUVGQVVMVCA6IDA7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IGRvX3B0cmFjZShpbnQgcmVxdWVzdCwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVxdWVzdCkgeworCQkvKgorCQkgKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gImFkZHIiIGluIHRoZSBjaGlsZCBwcm9jZXNzLgorCQkgKi8KKwkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CisJCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsCisJCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDApOworCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJCQllbHNlCisJCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCisJCWNhc2UgUFRSQUNFX1BFRUtVU1I6CisJCQlyZXQgPSBwdHJhY2VfcmVhZF91c2VyKGNoaWxkLCBhZGRyLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhKTsKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuCisJCSAqLworCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKKwkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6CisJCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCisJCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDEpOworCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCQkJcmV0ID0gMDsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKKwkJCXJldCA9IHB0cmFjZV93cml0ZV91c2VyKGNoaWxkLCBhZGRyLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIGNvbnRpbnVlL3Jlc3RhcnQgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwKKwkJICovCisJCWNhc2UgUFRSQUNFX1NZU0NBTEw6CisJCWNhc2UgUFRSQUNFX0NPTlQ6CisJCQlyZXQgPSAtRUlPOworCQkJaWYgKCh1bnNpZ25lZCBsb25nKSBkYXRhID4gX05TSUcpCisJCQkJYnJlYWs7CisJCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkKKwkJCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCQllbHNlCisJCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKKwkJCS8qIG1ha2Ugc3VyZSBzaW5nbGUtc3RlcCBicmVha3BvaW50IGlzIGdvbmUuICovCisJCQljaGlsZC0+cHRyYWNlICY9IH5QVF9TSU5HTEVTVEVQOworCQkJcHRyYWNlX2NhbmNlbF9icHQoY2hpbGQpOworCQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKworCQkvKgorCQkgKiBtYWtlIHRoZSBjaGlsZCBleGl0LiAgQmVzdCBJIGNhbiBkbyBpcyBzZW5kIGl0IGEgc2lna2lsbC4KKwkJICogcGVyaGFwcyBpdCBzaG91bGQgYmUgcHV0IGluIHRoZSBzdGF0dXMgdGhhdCBpdCB3YW50cyB0bworCQkgKiBleGl0LgorCQkgKi8KKwkJY2FzZSBQVFJBQ0VfS0lMTDoKKwkJCS8qIG1ha2Ugc3VyZSBzaW5nbGUtc3RlcCBicmVha3BvaW50IGlzIGdvbmUuICovCisJCQljaGlsZC0+cHRyYWNlICY9IH5QVF9TSU5HTEVTVEVQOworCQkJcHRyYWNlX2NhbmNlbF9icHQoY2hpbGQpOworCQkJaWYgKGNoaWxkLT5leGl0X3N0YXRlICE9IEVYSVRfWk9NQklFKSB7CisJCQkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7CisJCQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJCX0KKwkJCXJldCA9IDA7CisJCQlicmVhazsKKworCQkvKgorCQkgKiBleGVjdXRlIHNpbmdsZSBpbnN0cnVjdGlvbi4KKwkJICovCisJCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6CisJCQlyZXQgPSAtRUlPOworCQkJaWYgKCh1bnNpZ25lZCBsb25nKSBkYXRhID4gX05TSUcpCisJCQkJYnJlYWs7CisJCQljaGlsZC0+cHRyYWNlIHw9IFBUX1NJTkdMRVNURVA7CisJCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKKwkJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOworCQkJLyogZ2l2ZSBpdCBhIGNoYW5jZSB0byBydW4uICovCisJCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUFRSQUNFX0RFVEFDSDoKKwkJCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVFJBQ0VfR0VUUkVHUzoKKwkJCXJldCA9IHB0cmFjZV9nZXRyZWdzKGNoaWxkLCAodm9pZCBfX3VzZXIgKilkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFRSQUNFX1NFVFJFR1M6CisJCQlyZXQgPSBwdHJhY2Vfc2V0cmVncyhjaGlsZCwgKHZvaWQgX191c2VyICopZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIFBUUkFDRV9HRVRGUFJFR1M6CisJCQlyZXQgPSBwdHJhY2VfZ2V0ZnByZWdzKGNoaWxkLCAodm9pZCBfX3VzZXIgKilkYXRhKTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBQVFJBQ0VfU0VURlBSRUdTOgorCQkJcmV0ID0gcHRyYWNlX3NldGZwcmVncyhjaGlsZCwgKHZvaWQgX191c2VyICopZGF0YSk7CisJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19JV01NWFQKKwkJY2FzZSBQVFJBQ0VfR0VUV01NWFJFR1M6CisJCQlyZXQgPSBwdHJhY2VfZ2V0d21teHJlZ3MoY2hpbGQsICh2b2lkIF9fdXNlciAqKWRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVFJBQ0VfU0VUV01NWFJFR1M6CisJCQlyZXQgPSBwdHJhY2Vfc2V0d21teHJlZ3MoY2hpbGQsICh2b2lkIF9fdXNlciAqKWRhdGEpOworCQkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUE6CisJCQlyZXQgPSBwdXRfdXNlcihjaGlsZC0+dGhyZWFkX2luZm8tPnRwX3ZhbHVlLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX3B0cmFjZShsb25nIHJlcXVlc3QsIGxvbmcgcGlkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOworCWludCByZXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCXJldCA9IC1FUEVSTTsKKwlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkgeworCQkvKiBhcmUgd2UgYWxyZWFkeSBiZWluZyB0cmFjZWQ/ICovCisJCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQorCQkJZ290byBvdXQ7CisJCXJldCA9IHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LT5wYXJlbnQsIGN1cnJlbnQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCS8qIHNldCB0aGUgcHRyYWNlIGJpdCBpbiB0aGUgcHJvY2VzcyBmbGFncy4gKi8KKwkJY3VycmVudC0+cHRyYWNlIHw9IFBUX1BUUkFDRUQ7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSAtRVNSQ0g7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwljaGlsZCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwlpZiAoY2hpbGQpCisJCWdldF90YXNrX3N0cnVjdChjaGlsZCk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICghY2hpbGQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gLUVQRVJNOworCWlmIChwaWQgPT0gMSkJCS8qIHlvdSBtYXkgbm90IG1lc3Mgd2l0aCBpbml0ICovCisJCWdvdG8gb3V0X3RzazsKKworCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9BVFRBQ0gpIHsKKwkJcmV0ID0gcHRyYWNlX2F0dGFjaChjaGlsZCk7CisJCWdvdG8gb3V0X3RzazsKKwl9CisJcmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBkb19wdHJhY2UocmVxdWVzdCwgY2hpbGQsIGFkZHIsIGRhdGEpOworCitvdXRfdHNrOgorCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlKGludCB3aHksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgaXA7CisKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQlyZXR1cm47CisJaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCisJCXJldHVybjsKKworCS8qCisJICogU2F2ZSBJUC4gIElQIGlzIHVzZWQgdG8gZGVub3RlIHN5c2NhbGwgZW50cnkvZXhpdDoKKwkgKiAgSVAgPSAwIC0+IGVudHJ5LCA9IDEgLT4gZXhpdAorCSAqLworCWlwID0gcmVncy0+QVJNX2lwOworCXJlZ3MtPkFSTV9pcCA9IHdoeTsKKworCS8qIHRoZSAweDgwIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgdHJhY2luZyBwYXJlbnQgdG8gZGlzdGluZ3Vpc2gKKwkgICBiZXR3ZWVuIGEgc3lzY2FsbCBzdG9wIGFuZCBTSUdUUkFQIGRlbGl2ZXJ5ICovCisJcHRyYWNlX25vdGlmeShTSUdUUkFQIHwgKChjdXJyZW50LT5wdHJhY2UgJiBQVF9UUkFDRVNZU0dPT0QpCisJCQkJID8gMHg4MCA6IDApKTsKKwkvKgorCSAqIHRoaXMgaXNuJ3QgdGhlIHNhbWUgYXMgY29udGludWluZyB3aXRoIGEgc2lnbmFsLCBidXQgaXQgd2lsbCBkbworCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCisJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAorCSAqLworCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKKwkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKKwkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKKwl9CisJcmVncy0+QVJNX2lwID0gaXA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmggYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjYWQxMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuaApAQCAtMCwwICsxLDEyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCitleHRlcm4gdm9pZCBwdHJhY2VfY2FuY2VsX2JwdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBwdHJhY2Vfc2V0X2JwdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBwdHJhY2VfYnJlYWsoc3RydWN0IHRhc2tfc3RydWN0ICosIHN0cnVjdCBwdF9yZWdzICopOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NlbWFwaG9yZS5jIGIvYXJjaC9hcm0va2VybmVsL3NlbWFwaG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDIzZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvc2VtYXBob3JlLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiAgQVJNIHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbiwgdGFrZW4gZnJvbQorICoKKyAqICBpMzg2IHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiAgKEMpIENvcHlyaWdodCAxOTk5IExpbnVzIFRvcnZhbGRzCisgKgorICogIE1vZGlmaWVkIGZvciBBUk0gYnkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKy8qCisgKiBTZW1hcGhvcmVzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIHR3by13YXkgY291bnRlcjoKKyAqIFRoZSAiY291bnQiIHZhcmlhYmxlIGlzIGRlY3JlbWVudGVkIGZvciBlYWNoIHByb2Nlc3MKKyAqIHRoYXQgdHJpZXMgdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlLCB3aGlsZSB0aGUgInNsZWVwaW5nIgorICogdmFyaWFibGUgaXMgYSBjb3VudCBvZiBzdWNoIGFjcXVpcmVzLgorICoKKyAqIE5vdGFibHksIHRoZSBpbmxpbmUgInVwKCkiIGFuZCAiZG93bigpIiBmdW5jdGlvbnMgY2FuCisgKiBlZmZpY2llbnRseSB0ZXN0IGlmIHRoZXkgbmVlZCB0byBkbyBhbnkgZXh0cmEgd29yayAodXAKKyAqIG5lZWRzIHRvIGRvIHNvbWV0aGluZyBvbmx5IGlmIGNvdW50IHdhcyBuZWdhdGl2ZSBiZWZvcmUKKyAqIHRoZSBpbmNyZW1lbnQgb3BlcmF0aW9uLgorICoKKyAqICJzbGVlcGluZyIgYW5kIHRoZSBjb250ZW50aW9uIHJvdXRpbmUgb3JkZXJpbmcgaXMKKyAqIHByb3RlY3RlZCBieSB0aGUgc2VtYXBob3JlIHNwaW5sb2NrLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlcmUgaXMKKyAqIGNvbnRlbnRpb24gb24gdGhlIGxvY2ssIGFuZCBhcyBzdWNoIGFsbCB0aGlzIGlzIHRoZQorICogIm5vbi1jcml0aWNhbCIgcGFydCBvZiB0aGUgd2hvbGUgc2VtYXBob3JlIGJ1c2luZXNzLiBUaGUKKyAqIGNyaXRpY2FsIHBhcnQgaXMgdGhlIGlubGluZSBzdHVmZiBpbiA8YXNtL3NlbWFwaG9yZS5oPgorICogd2hlcmUgd2Ugd2FudCB0byBhdm9pZCBhbnkgZXh0cmEganVtcHMgYW5kIGNhbGxzLgorICovCisKKy8qCisgKiBMb2dpYzoKKyAqICAtIG9ubHkgb24gYSBib3VuZGFyeSBjb25kaXRpb24gZG8gd2UgbmVlZCB0byBjYXJlLiBXaGVuIHdlIGdvCisgKiAgICBmcm9tIGEgbmVnYXRpdmUgY291bnQgdG8gYSBub24tbmVnYXRpdmUsIHdlIHdha2UgcGVvcGxlIHVwLgorICogIC0gd2hlbiB3ZSBnbyBmcm9tIGEgbm9uLW5lZ2F0aXZlIGNvdW50IHRvIGEgbmVnYXRpdmUgZG8gd2UKKyAqICAgIChhKSBzeW5jaHJvbml6ZSB3aXRoIHRoZSAic2xlZXBlciIgY291bnQgYW5kIChiKSBtYWtlIHN1cmUKKyAqICAgIHRoYXQgd2UncmUgb24gdGhlIHdha2V1cCBsaXN0IGJlZm9yZSB3ZSBzeW5jaHJvbml6ZSBzbyB0aGF0CisgKiAgICB3ZSBjYW5ub3QgbG9zZSB3YWtldXAgZXZlbnRzLgorICovCisKK3ZvaWQgX191cChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJd2FrZV91cCgmc2VtLT53YWl0KTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhzZW1hcGhvcmVfbG9jayk7CisKK3ZvaWQgX19zY2hlZCBfX2Rvd24oc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKKwl0c2stPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZzZW0tPndhaXQsICZ3YWl0KTsKKworCXNwaW5fbG9ja19pcnEoJnNlbWFwaG9yZV9sb2NrKTsKKwlzZW0tPnNsZWVwZXJzKys7CisJZm9yICg7OykgeworCQlpbnQgc2xlZXBlcnMgPSBzZW0tPnNsZWVwZXJzOworCisJCS8qCisJCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGludG8gaXQuIFRoZXkgYXJlbid0CisJCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jay4KKwkJICovCisJCWlmICghYXRvbWljX2FkZF9uZWdhdGl2ZShzbGVlcGVycyAtIDEsICZzZW0tPmNvdW50KSkgeworCQkJc2VtLT5zbGVlcGVycyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlzZW0tPnNsZWVwZXJzID0gMTsJLyogdXMgLSBzZWUgLTEgYWJvdmUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxKCZzZW1hcGhvcmVfbG9jayk7CisKKwkJc2NoZWR1bGUoKTsKKwkJdHNrLT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCQlzcGluX2xvY2tfaXJxKCZzZW1hcGhvcmVfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmc2VtYXBob3JlX2xvY2spOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzZW0tPndhaXQsICZ3YWl0KTsKKwl0c2stPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXdha2VfdXAoJnNlbS0+d2FpdCk7Cit9CisKK2ludCBfX3NjaGVkIF9fZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisJdHNrLT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJnNlbS0+d2FpdCwgJndhaXQpOworCisJc3Bpbl9sb2NrX2lycSgmc2VtYXBob3JlX2xvY2spOworCXNlbS0+c2xlZXBlcnMgKys7CisJZm9yICg7OykgeworCQlpbnQgc2xlZXBlcnMgPSBzZW0tPnNsZWVwZXJzOworCisJCS8qCisJCSAqIFdpdGggc2lnbmFscyBwZW5kaW5nLCB0aGlzIHR1cm5zIGludG8KKwkJICogdGhlIHRyeWxvY2sgZmFpbHVyZSBjYXNlIC0gd2Ugd29uJ3QgYmUKKwkJICogc2xlZXBpbmcsIGFuZCB3ZSogY2FuJ3QgZ2V0IHRoZSBsb2NrIGFzCisJCSAqIGl0IGhhcyBjb250ZW50aW9uLiBKdXN0IGNvcnJlY3QgdGhlIGNvdW50CisJCSAqIGFuZCBleGl0LgorCQkgKi8KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRUlOVFI7CisJCQlzZW0tPnNsZWVwZXJzID0gMDsKKwkJCWF0b21pY19hZGQoc2xlZXBlcnMsICZzZW0tPmNvdW50KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQWRkICJldmVyeWJvZHkgZWxzZSIgaW50byBpdC4gVGhleSBhcmVuJ3QKKwkJICogcGxheWluZywgYmVjYXVzZSB3ZSBvd24gdGhlIHNwaW5sb2NrLiBUaGUKKwkJICogIi0xIiBpcyBiZWNhdXNlIHdlJ3JlIHN0aWxsIGhvcGluZyB0byBnZXQKKwkJICogdGhlIGxvY2suCisJCSAqLworCQlpZiAoIWF0b21pY19hZGRfbmVnYXRpdmUoc2xlZXBlcnMgLSAxLCAmc2VtLT5jb3VudCkpIHsKKwkJCXNlbS0+c2xlZXBlcnMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJc2VtLT5zbGVlcGVycyA9IDE7CS8qIHVzIC0gc2VlIC0xIGFib3ZlICovCisJCXNwaW5fdW5sb2NrX2lycSgmc2VtYXBob3JlX2xvY2spOworCisJCXNjaGVkdWxlKCk7CisJCXRzay0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNwaW5fbG9ja19pcnEoJnNlbWFwaG9yZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZzZW1hcGhvcmVfbG9jayk7CisJdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc2VtLT53YWl0LCAmd2FpdCk7CisJd2FrZV91cCgmc2VtLT53YWl0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVHJ5bG9jayBmYWlsZWQgLSBtYWtlIHN1cmUgd2UgY29ycmVjdCBmb3IKKyAqIGhhdmluZyBkZWNyZW1lbnRlZCB0aGUgY291bnQuCisgKgorICogV2UgY291bGQgaGF2ZSBkb25lIHRoZSB0cnlsb2NrIHdpdGggYQorICogc2luZ2xlICJjbXB4Y2hnIiB3aXRob3V0IGZhaWx1cmUgY2FzZXMsCisgKiBidXQgdGhlbiBpdCB3b3VsZG4ndCB3b3JrIG9uIGEgMzg2LgorICovCitpbnQgX19kb3duX3RyeWxvY2soc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3sKKwlpbnQgc2xlZXBlcnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW1hcGhvcmVfbG9jaywgZmxhZ3MpOworCXNsZWVwZXJzID0gc2VtLT5zbGVlcGVycyArIDE7CisJc2VtLT5zbGVlcGVycyA9IDA7CisKKwkvKgorCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGFuZCB1cyBpbnRvIGl0LiBUaGV5IGFyZW4ndAorCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jay4KKwkgKi8KKwlpZiAoIWF0b21pY19hZGRfbmVnYXRpdmUoc2xlZXBlcnMsICZzZW0tPmNvdW50KSkKKwkJd2FrZV91cCgmc2VtLT53YWl0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbWFwaG9yZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgc2VtYXBob3JlIG9wZXJhdGlvbnMgaGF2ZSBhIHNwZWNpYWwgY2FsbGluZyBzZXF1ZW5jZSB0aGF0CisgKiBhbGxvdyB1cyB0byBkbyBhIHNpbXBsZXIgaW4tbGluZSB2ZXJzaW9uIG9mIHRoZW0uIFRoZXNlIHJvdXRpbmVzCisgKiBuZWVkIHRvIGNvbnZlcnQgdGhhdCBzZXF1ZW5jZSBiYWNrIGludG8gdGhlIEMgc2VxdWVuY2Ugd2hlbgorICogdGhlcmUgaXMgY29udGVudGlvbiBvbiB0aGUgc2VtYXBob3JlLgorICoKKyAqIGlwIGNvbnRhaW5zIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBvbiBlbnRyeS4gU2F2ZSB0aGUgQy1jbG9iYmVyZWQKKyAqIHJlZ2lzdGVycyAocjAgdG8gcjMgYW5kIGxyKSwgYnV0IG5vdCBpcCwgYXMgd2UgdXNlIGl0IGFzIGEgcmV0dXJuCisgKiB2YWx1ZSBpbiBzb21lIGNhc2VzLi4KKyAqLworYXNtKCIJLnNlY3Rpb24gLnNjaGVkLnRleHQsXCJheFwiCQlcblwKKwkuYWxpZ24JNQkJCQlcblwKKwkuZ2xvYmwJX19kb3duX2ZhaWxlZAkJCVxuXAorX19kb3duX2ZhaWxlZDoJCQkJCVxuXAorCXN0bWZkCXNwISwge3IwIC0gcjMsIGxyfQkJXG5cCisJbW92CXIwLCBpcAkJCQlcblwKKwlibAlfX2Rvd24JCQkJXG5cCisJbGRtZmQJc3AhLCB7cjAgLSByMywgcGN9CQlcblwKKwkJCQkJCVxuXAorCS5hbGlnbgk1CQkJCVxuXAorCS5nbG9ibAlfX2Rvd25faW50ZXJydXB0aWJsZV9mYWlsZWQJXG5cCitfX2Rvd25faW50ZXJydXB0aWJsZV9mYWlsZWQ6CQkJXG5cCisJc3RtZmQJc3AhLCB7cjAgLSByMywgbHJ9CQlcblwKKwltb3YJcjAsIGlwCQkJCVxuXAorCWJsCV9fZG93bl9pbnRlcnJ1cHRpYmxlCQlcblwKKwltb3YJaXAsIHIwCQkJCVxuXAorCWxkbWZkCXNwISwge3IwIC0gcjMsIHBjfQkJXG5cCisJCQkJCQlcblwKKwkuYWxpZ24JNQkJCQlcblwKKwkuZ2xvYmwJX19kb3duX3RyeWxvY2tfZmFpbGVkCQlcblwKK19fZG93bl90cnlsb2NrX2ZhaWxlZDoJCQkJXG5cCisJc3RtZmQJc3AhLCB7cjAgLSByMywgbHJ9CQlcblwKKwltb3YJcjAsIGlwCQkJCVxuXAorCWJsCV9fZG93bl90cnlsb2NrCQkJXG5cCisJbW92CWlwLCByMAkJCQlcblwKKwlsZG1mZAlzcCEsIHtyMCAtIHIzLCBwY30JCVxuXAorCQkJCQkJXG5cCisJLmFsaWduCTUJCQkJXG5cCisJLmdsb2JsCV9fdXBfd2FrZXVwCQkJXG5cCitfX3VwX3dha2V1cDoJCQkJCVxuXAorCXN0bWZkCXNwISwge3IwIC0gcjMsIGxyfQkJXG5cCisJbW92CXIwLCBpcAkJCQlcblwKKwlibAlfX3VwCQkJCVxuXAorCWxkbWZkCXNwISwge3IwIC0gcjMsIHBjfQkJXG5cCisJIik7CisKK0VYUE9SVF9TWU1CT0woX19kb3duX2ZhaWxlZCk7CitFWFBPUlRfU1lNQk9MKF9fZG93bl9pbnRlcnJ1cHRpYmxlX2ZhaWxlZCk7CitFWFBPUlRfU1lNQk9MKF9fZG93bl90cnlsb2NrX2ZhaWxlZCk7CitFWFBPUlRfU1lNQk9MKF9fdXBfd2FrZXVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhN2RhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC0wLDAgKzEsODc1IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpZm5kZWYgTUVNX1NJWkUKKyNkZWZpbmUgTUVNX1NJWkUJKDE2KjEwMjQqMTAyNCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRlBFX05XRlBFKSB8fCBkZWZpbmVkKENPTkZJR19GUEVfRkFTVEZQRSkKK2NoYXIgZnBlX3R5cGVbOF07CisKK3N0YXRpYyBpbnQgX19pbml0IGZwZV9zZXR1cChjaGFyICpsaW5lKQoreworCW1lbWNweShmcGVfdHlwZSwgbGluZSwgOCk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImZwZT0iLCBmcGVfc2V0dXApOworI2VuZGlmCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgbWVtX2ZjbGtfMjEyODU7CitleHRlcm4gdm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgbWVtaW5mbyAqLCBzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjKTsKK2V4dGVybiB2b2lkIGNvbnZlcnRfdG9fdGFnX2xpc3Qoc3RydWN0IHRhZyAqdGFncyk7CitleHRlcm4gdm9pZCBzcXVhc2hfbWVtX3RhZ3Moc3RydWN0IHRhZyAqdGFnKTsKK2V4dGVybiB2b2lkIHJlYm9vdF9zZXR1cChjaGFyICpzdHIpOworZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7CitleHRlcm4gdm9pZCBfc3RleHQsIF90ZXh0LCBfZXRleHQsIF9fZGF0YV9zdGFydCwgX2VkYXRhLCBfZW5kOworCit1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOwordW5zaWduZWQgaW50IF9fbWFjaGluZV9hcmNoX3R5cGU7CitFWFBPUlRfU1lNQk9MKF9fbWFjaGluZV9hcmNoX3R5cGUpOworCit1bnNpZ25lZCBpbnQgc3lzdGVtX3JldjsKK0VYUE9SVF9TWU1CT0woc3lzdGVtX3Jldik7CisKK3Vuc2lnbmVkIGludCBzeXN0ZW1fc2VyaWFsX2xvdzsKK0VYUE9SVF9TWU1CT0woc3lzdGVtX3NlcmlhbF9sb3cpOworCit1bnNpZ25lZCBpbnQgc3lzdGVtX3NlcmlhbF9oaWdoOworRVhQT1JUX1NZTUJPTChzeXN0ZW1fc2VyaWFsX2hpZ2gpOworCit1bnNpZ25lZCBpbnQgZWxmX2h3Y2FwOworRVhQT1JUX1NZTUJPTChlbGZfaHdjYXApOworCisKKyNpZmRlZiBNVUxUSV9DUFUKK3N0cnVjdCBwcm9jZXNzb3IgcHJvY2Vzc29yOworI2VuZGlmCisjaWZkZWYgTVVMVElfVExCCitzdHJ1Y3QgY3B1X3RsYl9mbnMgY3B1X3RsYjsKKyNlbmRpZgorI2lmZGVmIE1VTFRJX1VTRVIKK3N0cnVjdCBjcHVfdXNlcl9mbnMgY3B1X3VzZXI7CisjZW5kaWYKKyNpZmRlZiBNVUxUSV9DQUNIRQorc3RydWN0IGNwdV9jYWNoZV9mbnMgY3B1X2NhY2hlOworI2VuZGlmCisKK2NoYXIgZWxmX3BsYXRmb3JtW0VMRl9QTEFURk9STV9TSVpFXTsKK0VYUE9SVF9TWU1CT0woZWxmX3BsYXRmb3JtKTsKKwordW5zaWduZWQgbG9uZyBwaHlzX2luaXRyZF9zdGFydCBfX2luaXRkYXRhID0gMDsKK3Vuc2lnbmVkIGxvbmcgcGh5c19pbml0cmRfc2l6ZSBfX2luaXRkYXRhID0gMDsKKworc3RhdGljIHN0cnVjdCBtZW1pbmZvIG1lbWluZm8gX19pbml0ZGF0YSA9IHsgMCwgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpjcHVfbmFtZTsKK3N0YXRpYyBjb25zdCBjaGFyICptYWNoaW5lX25hbWU7CitzdGF0aWMgY2hhciBjb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworCitzdGF0aWMgY2hhciBkZWZhdWx0X2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV0gX19pbml0ZGF0YSA9IENPTkZJR19DTURMSU5FOworc3RhdGljIHVuaW9uIHsgY2hhciBjWzRdOyB1bnNpZ25lZCBsb25nIGw7IH0gZW5kaWFuX3Rlc3QgX19pbml0ZGF0YSA9IHsgeyAnbCcsICc/JywgJz8nLCAnYicgfSB9OworI2RlZmluZSBFTkRJQU5ORVNTICgoY2hhcillbmRpYW5fdGVzdC5sKQorCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1aW5mb19hcm0sIGNwdV9kYXRhKTsKKworLyoKKyAqIFN0YW5kYXJkIG1lbW9yeSByZXNvdXJjZXMKKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtZW1fcmVzW10gPSB7CisJeyAiVmlkZW8gUkFNIiwgICAwLCAgICAgMCwgICAgIElPUkVTT1VSQ0VfTUVNCQkJfSwKKwl7ICJLZXJuZWwgdGV4dCIsIDAsICAgICAwLCAgICAgSU9SRVNPVVJDRV9NRU0JCQl9LAorCXsgIktlcm5lbCBkYXRhIiwgMCwgICAgIDAsICAgICBJT1JFU09VUkNFX01FTQkJCX0KK307CisKKyNkZWZpbmUgdmlkZW9fcmFtICAgbWVtX3Jlc1swXQorI2RlZmluZSBrZXJuZWxfY29kZSBtZW1fcmVzWzFdCisjZGVmaW5lIGtlcm5lbF9kYXRhIG1lbV9yZXNbMl0KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpb19yZXNbXSA9IHsKKwl7ICJyZXNlcnZlZCIsICAgIDB4M2JjLCAweDNiZSwgSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfQlVTWSB9LAorCXsgInJlc2VydmVkIiwgICAgMHgzNzgsIDB4MzdmLCBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9CVVNZIH0sCisJeyAicmVzZXJ2ZWQiLCAgICAweDI3OCwgMHgyN2YsIElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX0JVU1kgfQorfTsKKworI2RlZmluZSBscDAgaW9fcmVzWzBdCisjZGVmaW5lIGxwMSBpb19yZXNbMV0KKyNkZWZpbmUgbHAyIGlvX3Jlc1syXQorCitzdGF0aWMgY29uc3QgY2hhciAqY2FjaGVfdHlwZXNbMTZdID0geworCSJ3cml0ZS10aHJvdWdoIiwKKwkid3JpdGUtYmFjayIsCisJIndyaXRlLWJhY2siLAorCSJ1bmRlZmluZWQgMyIsCisJInVuZGVmaW5lZCA0IiwKKwkidW5kZWZpbmVkIDUiLAorCSJ3cml0ZS1iYWNrIiwKKwkid3JpdGUtYmFjayIsCisJInVuZGVmaW5lZCA4IiwKKwkidW5kZWZpbmVkIDkiLAorCSJ1bmRlZmluZWQgMTAiLAorCSJ1bmRlZmluZWQgMTEiLAorCSJ1bmRlZmluZWQgMTIiLAorCSJ1bmRlZmluZWQgMTMiLAorCSJ3cml0ZS1iYWNrIiwKKwkidW5kZWZpbmVkIDE1IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjYWNoZV9jbGVhblsxNl0gPSB7CisJIm5vdCByZXF1aXJlZCIsCisJInJlYWQtYmxvY2siLAorCSJjcDE1IGM3IG9wcyIsCisJInVuZGVmaW5lZCAzIiwKKwkidW5kZWZpbmVkIDQiLAorCSJ1bmRlZmluZWQgNSIsCisJImNwMTUgYzcgb3BzIiwKKwkiY3AxNSBjNyBvcHMiLAorCSJ1bmRlZmluZWQgOCIsCisJInVuZGVmaW5lZCA5IiwKKwkidW5kZWZpbmVkIDEwIiwKKwkidW5kZWZpbmVkIDExIiwKKwkidW5kZWZpbmVkIDEyIiwKKwkidW5kZWZpbmVkIDEzIiwKKwkiY3AxNSBjNyBvcHMiLAorCSJ1bmRlZmluZWQgMTUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlX2xvY2tkb3duWzE2XSA9IHsKKwkibm90IHN1cHBvcnRlZCIsCisJIm5vdCBzdXBwb3J0ZWQiLAorCSJub3Qgc3VwcG9ydGVkIiwKKwkidW5kZWZpbmVkIDMiLAorCSJ1bmRlZmluZWQgNCIsCisJInVuZGVmaW5lZCA1IiwKKwkiZm9ybWF0IEEiLAorCSJmb3JtYXQgQiIsCisJInVuZGVmaW5lZCA4IiwKKwkidW5kZWZpbmVkIDkiLAorCSJ1bmRlZmluZWQgMTAiLAorCSJ1bmRlZmluZWQgMTEiLAorCSJ1bmRlZmluZWQgMTIiLAorCSJ1bmRlZmluZWQgMTMiLAorCSJmb3JtYXQgQyIsCisJInVuZGVmaW5lZCAxNSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcHJvY19hcmNoW10gPSB7CisJInVuZGVmaW5lZC91bmtub3duIiwKKwkiMyIsCisJIjQiLAorCSI0VCIsCisJIjUiLAorCSI1VCIsCisJIjVURSIsCisJIjVURUoiLAorCSI2VEVKIiwKKwkiPygxMCkiLAorCSI/KDExKSIsCisJIj8oMTIpIiwKKwkiPygxMykiLAorCSI/KDE0KSIsCisJIj8oMTUpIiwKKwkiPygxNikiLAorCSI/KDE3KSIsCit9OworCisjZGVmaW5lIENBQ0hFX1RZUEUoeCkJKCgoeCkgPj4gMjUpICYgMTUpCisjZGVmaW5lIENBQ0hFX1MoeCkJKCh4KSAmICgxIDw8IDI0KSkKKyNkZWZpbmUgQ0FDSEVfRFNJWkUoeCkJKCgoeCkgPj4gMTIpICYgNDA5NSkJLyogb25seSBpZiBTPTEgKi8KKyNkZWZpbmUgQ0FDSEVfSVNJWkUoeCkJKCh4KSAmIDQwOTUpCisKKyNkZWZpbmUgQ0FDSEVfU0laRSh5KQkoKCh5KSA+PiA2KSAmIDcpCisjZGVmaW5lIENBQ0hFX0FTU09DKHkpCSgoKHkpID4+IDMpICYgNykKKyNkZWZpbmUgQ0FDSEVfTSh5KQkoKHkpICYgKDEgPDwgMikpCisjZGVmaW5lIENBQ0hFX0xJTkUoeSkJKCh5KSAmIDMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2NhY2hlKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGNwdSwgdW5zaWduZWQgaW50IGNhY2hlKQoreworCXVuc2lnbmVkIGludCBtdWx0ID0gMiArIChDQUNIRV9NKGNhY2hlKSA/IDEgOiAwKTsKKworCXByaW50aygiQ1BVJXU6ICVzOiAlZCBieXRlcywgYXNzb2NpYXRpdml0eSAlZCwgJWQgYnl0ZSBsaW5lcywgJWQgc2V0c1xuIiwKKwkJY3B1LCBwcmVmaXgsCisJCW11bHQgPDwgKDggKyBDQUNIRV9TSVpFKGNhY2hlKSksCisJCShtdWx0IDw8IENBQ0hFX0FTU09DKGNhY2hlKSkgPj4gMSwKKwkJOCA8PCBDQUNIRV9MSU5FKGNhY2hlKSwKKwkJMSA8PCAoNiArIENBQ0hFX1NJWkUoY2FjaGUpIC0gQ0FDSEVfQVNTT0MoY2FjaGUpIC0KKwkJCUNBQ0hFX0xJTkUoY2FjaGUpKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkdW1wX2NwdV9pbmZvKGludCBjcHUpCit7CisJdW5zaWduZWQgaW50IGluZm8gPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7CisKKwlpZiAoaW5mbyAhPSBwcm9jZXNzb3JfaWQpIHsKKwkJcHJpbnRrKCJDUFUldTogRCAlcyAlcyBjYWNoZVxuIiwgY3B1LCBjYWNoZV9pc192aXZ0KCkgPyAiVklWVCIgOiAiVklQVCIsCisJCSAgICAgICBjYWNoZV90eXBlc1tDQUNIRV9UWVBFKGluZm8pXSk7CisJCWlmIChDQUNIRV9TKGluZm8pKSB7CisJCQlkdW1wX2NhY2hlKCJJIGNhY2hlIiwgY3B1LCBDQUNIRV9JU0laRShpbmZvKSk7CisJCQlkdW1wX2NhY2hlKCJEIGNhY2hlIiwgY3B1LCBDQUNIRV9EU0laRShpbmZvKSk7CisJCX0gZWxzZSB7CisJCQlkdW1wX2NhY2hlKCJjYWNoZSIsIGNwdSwgQ0FDSEVfSVNJWkUoaW5mbykpOworCQl9CisJfQorfQorCitpbnQgY3B1X2FyY2hpdGVjdHVyZSh2b2lkKQoreworCWludCBjcHVfYXJjaDsKKworCWlmICgocHJvY2Vzc29yX2lkICYgMHgwMDAwZjAwMCkgPT0gMCkgeworCQljcHVfYXJjaCA9IENQVV9BUkNIX1VOS05PV047CisJfSBlbHNlIGlmICgocHJvY2Vzc29yX2lkICYgMHgwMDAwZjAwMCkgPT0gMHgwMDAwNzAwMCkgeworCQljcHVfYXJjaCA9IChwcm9jZXNzb3JfaWQgJiAoMSA8PCAyMykpID8gQ1BVX0FSQ0hfQVJNdjRUIDogQ1BVX0FSQ0hfQVJNdjM7CisJfSBlbHNlIHsKKwkJY3B1X2FyY2ggPSAocHJvY2Vzc29yX2lkID4+IDE2KSAmIDc7CisJCWlmIChjcHVfYXJjaCkKKwkJCWNwdV9hcmNoICs9IENQVV9BUkNIX0FSTXYzOworCX0KKworCXJldHVybiBjcHVfYXJjaDsKK30KKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyByZS11c2UgdGhlIGFzc2VtYmx5IGNvZGUgaW4gaGVhZC5TLCB3aGljaAorICogYWxyZWFkeSBwcm92aWRlIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5LgorICovCitleHRlcm4gc3RydWN0IHByb2NfaW5mb19saXN0ICpsb29rdXBfcHJvY2Vzc29yX3R5cGUodm9pZCk7CitleHRlcm4gc3RydWN0IG1hY2hpbmVfZGVzYyAqbG9va3VwX21hY2hpbmVfdHlwZSh1bnNpZ25lZCBpbnQpOworCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfcHJvY2Vzc29yKHZvaWQpCit7CisJc3RydWN0IHByb2NfaW5mb19saXN0ICpsaXN0OworCisJLyoKKwkgKiBsb2NhdGUgcHJvY2Vzc29yIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm9jZXNzb3IKKwkgKiB0eXBlcy4gIFRoZSBsaW5rZXIgYnVpbGRzIHRoaXMgdGFibGUgZm9yIHVzIGZyb20gdGhlCisJICogZW50cmllcyBpbiBhcmNoL2FybS9tbS9wcm9jLSouUworCSAqLworCWxpc3QgPSBsb29rdXBfcHJvY2Vzc29yX3R5cGUoKTsKKwlpZiAoIWxpc3QpIHsKKwkJcHJpbnRrKCJDUFUgY29uZmlndXJhdGlvbiBib3RjaGVkIChJRCAlMDh4KSwgdW5hYmxlICIKKwkJICAgICAgICJ0byBjb250aW51ZS5cbiIsIHByb2Nlc3Nvcl9pZCk7CisJCXdoaWxlICgxKTsKKwl9CisKKwljcHVfbmFtZSA9IGxpc3QtPmNwdV9uYW1lOworCisjaWZkZWYgTVVMVElfQ1BVCisJcHJvY2Vzc29yID0gKmxpc3QtPnByb2M7CisjZW5kaWYKKyNpZmRlZiBNVUxUSV9UTEIKKwljcHVfdGxiID0gKmxpc3QtPnRsYjsKKyNlbmRpZgorI2lmZGVmIE1VTFRJX1VTRVIKKwljcHVfdXNlciA9ICpsaXN0LT51c2VyOworI2VuZGlmCisjaWZkZWYgTVVMVElfQ0FDSEUKKwljcHVfY2FjaGUgPSAqbGlzdC0+Y2FjaGU7CisjZW5kaWYKKworCXByaW50aygiQ1BVOiAlcyBbJTA4eF0gcmV2aXNpb24gJWQgKEFSTXYlcylcbiIsCisJICAgICAgIGNwdV9uYW1lLCBwcm9jZXNzb3JfaWQsIChpbnQpcHJvY2Vzc29yX2lkICYgMTUsCisJICAgICAgIHByb2NfYXJjaFtjcHVfYXJjaGl0ZWN0dXJlKCldKTsKKworCWR1bXBfY3B1X2luZm8oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCXNwcmludGYoc3lzdGVtX3V0c25hbWUubWFjaGluZSwgIiVzJWMiLCBsaXN0LT5hcmNoX25hbWUsIEVORElBTk5FU1MpOworCXNwcmludGYoZWxmX3BsYXRmb3JtLCAiJXMlYyIsIGxpc3QtPmVsZl9uYW1lLCBFTkRJQU5ORVNTKTsKKwllbGZfaHdjYXAgPSBsaXN0LT5lbGZfaHdjYXA7CisKKwljcHVfcHJvY19pbml0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaGluZV9kZXNjICogX19pbml0IHNldHVwX21hY2hpbmUodW5zaWduZWQgaW50IG5yKQoreworCXN0cnVjdCBtYWNoaW5lX2Rlc2MgKmxpc3Q7CisKKwkvKgorCSAqIGxvY2F0ZSBtYWNoaW5lIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBtYWNoaW5lcy4KKwkgKi8KKwlsaXN0ID0gbG9va3VwX21hY2hpbmVfdHlwZShucik7CisJaWYgKCFsaXN0KSB7CisJCXByaW50aygiTWFjaGluZSBjb25maWd1cmF0aW9uIGJvdGNoZWQgKG5yICVkKSwgdW5hYmxlICIKKwkJICAgICAgICJ0byBjb250aW51ZS5cbiIsIG5yKTsKKwkJd2hpbGUgKDEpOworCX0KKworCXByaW50aygiTWFjaGluZTogJXNcbiIsIGxpc3QtPm5hbWUpOworCisJcmV0dXJuIGxpc3Q7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9pbml0cmQoY2hhciAqKnApCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZTsKKworCXN0YXJ0ID0gbWVtcGFyc2UoKnAsIHApOworCWlmICgqKnAgPT0gJywnKSB7CisJCXNpemUgPSBtZW1wYXJzZSgoKnApICsgMSwgcCk7CisKKwkJcGh5c19pbml0cmRfc3RhcnQgPSBzdGFydDsKKwkJcGh5c19pbml0cmRfc2l6ZSA9IHNpemU7CisJfQorfQorX19lYXJseV9wYXJhbSgiaW5pdHJkPSIsIGVhcmx5X2luaXRyZCk7CisKKy8qCisgKiBQaWNrIG91dCB0aGUgbWVtb3J5IHNpemUuICBXZSBsb29rIGZvciBtZW09c2l6ZUBzdGFydCwKKyAqIHdoZXJlIHN0YXJ0IGFuZCBzaXplIGFyZSAic2l6ZVtLa01tXSIKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X21lbShjaGFyICoqcCkKK3sKKwlzdGF0aWMgaW50IHVzZXJtZW0gX19pbml0ZGF0YSA9IDA7CisJdW5zaWduZWQgbG9uZyBzaXplLCBzdGFydDsKKworCS8qCisJICogSWYgdGhlIHVzZXIgc3BlY2lmaWVzIG1lbW9yeSBzaXplLCB3ZQorCSAqIGJsb3cgYXdheSBhbnkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKwkgKiBzaXplLgorCSAqLworCWlmICh1c2VybWVtID09IDApIHsKKwkJdXNlcm1lbSA9IDE7CisJCW1lbWluZm8ubnJfYmFua3MgPSAwOworCX0KKworCXN0YXJ0ID0gUEhZU19PRkZTRVQ7CisJc2l6ZSAgPSBtZW1wYXJzZSgqcCwgcCk7CisJaWYgKCoqcCA9PSAnQCcpCisJCXN0YXJ0ID0gbWVtcGFyc2UoKnAgKyAxLCBwKTsKKworCW1lbWluZm8uYmFua1ttZW1pbmZvLm5yX2JhbmtzXS5zdGFydCA9IHN0YXJ0OworCW1lbWluZm8uYmFua1ttZW1pbmZvLm5yX2JhbmtzXS5zaXplICA9IHNpemU7CisJbWVtaW5mby5iYW5rW21lbWluZm8ubnJfYmFua3NdLm5vZGUgID0gUEhZU19UT19OSUQoc3RhcnQpOworCW1lbWluZm8ubnJfYmFua3MgKz0gMTsKK30KK19fZWFybHlfcGFyYW0oIm1lbT0iLCBlYXJseV9tZW0pOworCisvKgorICogSW5pdGlhbCBwYXJzaW5nIG9mIHRoZSBjb21tYW5kIGxpbmUuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9jbWRsaW5lKGNoYXIgKipjbWRsaW5lX3AsIGNoYXIgKmZyb20pCit7CisJY2hhciBjID0gJyAnLCAqdG8gPSBjb21tYW5kX2xpbmU7CisJaW50IGxlbiA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWlmIChjID09ICcgJykgeworCQkJZXh0ZXJuIHN0cnVjdCBlYXJseV9wYXJhbXMgX19lYXJseV9iZWdpbiwgX19lYXJseV9lbmQ7CisJCQlzdHJ1Y3QgZWFybHlfcGFyYW1zICpwOworCisJCQlmb3IgKHAgPSAmX19lYXJseV9iZWdpbjsgcCA8ICZfX2Vhcmx5X2VuZDsgcCsrKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihwLT5hcmcpOworCisJCQkJaWYgKG1lbWNtcChmcm9tLCBwLT5hcmcsIGxlbikgPT0gMCkgeworCQkJCQlpZiAodG8gIT0gY29tbWFuZF9saW5lKQorCQkJCQkJdG8gLT0gMTsKKwkJCQkJZnJvbSArPSBsZW47CisJCQkJCXAtPmZuKCZmcm9tKTsKKworCQkJCQl3aGlsZSAoKmZyb20gIT0gJyAnICYmICpmcm9tICE9ICdcMCcpCisJCQkJCQlmcm9tKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQljID0gKmZyb20rKzsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisJCWlmIChDT01NQU5EX0xJTkVfU0laRSA8PSArK2xlbikKKwkJCWJyZWFrOworCQkqdG8rKyA9IGM7CisJfQorCSp0byA9ICdcMCc7CisJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKK30KKworc3RhdGljIHZvaWQgX19pbml0CitzZXR1cF9yYW1kaXNrKGludCBkb2xvYWQsIGludCBwcm9tcHQsIGludCBpbWFnZV9zdGFydCwgdW5zaWduZWQgaW50IHJkX3N6KQoreworI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQorCWV4dGVybiBpbnQgcmRfc2l6ZSwgcmRfaW1hZ2Vfc3RhcnQsIHJkX3Byb21wdCwgcmRfZG9sb2FkOworCisJcmRfaW1hZ2Vfc3RhcnQgPSBpbWFnZV9zdGFydDsKKwlyZF9wcm9tcHQgPSBwcm9tcHQ7CisJcmRfZG9sb2FkID0gZG9sb2FkOworCisJaWYgKHJkX3N6KQorCQlyZF9zaXplID0gcmRfc3o7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbml0CityZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcyhzdHJ1Y3QgbWVtaW5mbyAqbWksIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKm1kZXNjKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpOworCisJa2VybmVsX2NvZGUuc3RhcnQgICA9IHZpcnRfdG9fcGh5cygmX3RleHQpOworCWtlcm5lbF9jb2RlLmVuZCAgICAgPSB2aXJ0X3RvX3BoeXMoJl9ldGV4dCAtIDEpOworCWtlcm5lbF9kYXRhLnN0YXJ0ICAgPSB2aXJ0X3RvX3BoeXMoJl9fZGF0YV9zdGFydCk7CisJa2VybmVsX2RhdGEuZW5kICAgICA9IHZpcnRfdG9fcGh5cygmX2VuZCAtIDEpOworCisJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9iYW5rczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgdmlydF9zdGFydCwgdmlydF9lbmQ7CisKKwkJaWYgKG1pLT5iYW5rW2ldLnNpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXZpcnRfc3RhcnQgPSBfX3BoeXNfdG9fdmlydChtaS0+YmFua1tpXS5zdGFydCk7CisJCXZpcnRfZW5kICAgPSB2aXJ0X3N0YXJ0ICsgbWktPmJhbmtbaV0uc2l6ZSAtIDE7CisKKwkJcmVzID0gYWxsb2NfYm9vdG1lbV9sb3coc2l6ZW9mKCpyZXMpKTsKKwkJcmVzLT5uYW1lICA9ICJTeXN0ZW0gUkFNIjsKKwkJcmVzLT5zdGFydCA9IF9fdmlydF90b19waHlzKHZpcnRfc3RhcnQpOworCQlyZXMtPmVuZCAgID0gX192aXJ0X3RvX3BoeXModmlydF9lbmQpOworCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0JVU1k7CisKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CisKKwkJaWYgKGtlcm5lbF9jb2RlLnN0YXJ0ID49IHJlcy0+c3RhcnQgJiYKKwkJICAgIGtlcm5lbF9jb2RlLmVuZCA8PSByZXMtPmVuZCkKKwkJCXJlcXVlc3RfcmVzb3VyY2UocmVzLCAma2VybmVsX2NvZGUpOworCQlpZiAoa2VybmVsX2RhdGEuc3RhcnQgPj0gcmVzLT5zdGFydCAmJgorCQkgICAga2VybmVsX2RhdGEuZW5kIDw9IHJlcy0+ZW5kKQorCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsICZrZXJuZWxfZGF0YSk7CisJfQorCisJaWYgKG1kZXNjLT52aWRlb19zdGFydCkgeworCQl2aWRlb19yYW0uc3RhcnQgPSBtZGVzYy0+dmlkZW9fc3RhcnQ7CisJCXZpZGVvX3JhbS5lbmQgICA9IG1kZXNjLT52aWRlb19lbmQ7CisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmdmlkZW9fcmFtKTsKKwl9CisKKwkvKgorCSAqIFNvbWUgbWFjaGluZXMgZG9uJ3QgaGF2ZSB0aGUgcG9zc2liaWxpdHkgb2YgZXZlcgorCSAqIHBvc3Nlc3NpbmcgbHAwLCBscDEgb3IgbHAyCisJICovCisJaWYgKG1kZXNjLT5yZXNlcnZlX2xwMCkKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmbHAwKTsKKwlpZiAobWRlc2MtPnJlc2VydmVfbHAxKQorCQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZscDEpOworCWlmIChtZGVzYy0+cmVzZXJ2ZV9scDIpCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJmxwMik7Cit9CisKKy8qCisgKiAgVGFnIHBhcnNpbmcuCisgKgorICogVGhpcyBpcyB0aGUgbmV3IHdheSBvZiBwYXNzaW5nIGRhdGEgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuICBSYXRoZXIKKyAqIHRoYW4gcGFzc2luZyBhIGZpeGVkIGluZmxleGlibGUgc3RydWN0dXJlIHRvIHRoZSBrZXJuZWwsIHdlIHBhc3MgYSBsaXN0CisgKiBvZiB2YXJpYWJsZS1zaXplZCB0YWdzIHRvIHRoZSBrZXJuZWwuICBUaGUgZmlyc3QgdGFnIG11c3QgYmUgYSBBVEFHX0NPUkUKKyAqIHRhZyBmb3IgdGhlIGxpc3QgdG8gYmUgcmVjb2duaXNlZCAodG8gZGlzdGluZ3Vpc2ggdGhlIHRhZ2dlZCBsaXN0IGZyb20KKyAqIGEgcGFyYW1fc3RydWN0KS4gIFRoZSBsaXN0IGlzIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8tbGVuZ3RoIHRhZyAodGhpcyB0YWcKKyAqIGlzIG5vdCBwYXJzZWQgaW4gYW55IHdheSkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19jb3JlKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKK3sKKwlpZiAodGFnLT5oZHIuc2l6ZSA+IDIpIHsKKwkJaWYgKCh0YWctPnUuY29yZS5mbGFncyAmIDEpID09IDApCisJCQlyb290X21vdW50ZmxhZ3MgJj0gfk1TX1JET05MWTsKKwkJUk9PVF9ERVYgPSBvbGRfZGVjb2RlX2Rldih0YWctPnUuY29yZS5yb290ZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK19fdGFndGFibGUoQVRBR19DT1JFLCBwYXJzZV90YWdfY29yZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW0zMihjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJaWYgKG1lbWluZm8ubnJfYmFua3MgPj0gTlJfQkFOS1MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIklnbm9yaW5nIG1lbW9yeSBiYW5rIDB4JTA4eCBzaXplICVkS0JcbiIsCisJCQl0YWctPnUubWVtLnN0YXJ0LCB0YWctPnUubWVtLnNpemUgLyAxMDI0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbWluZm8uYmFua1ttZW1pbmZvLm5yX2JhbmtzXS5zdGFydCA9IHRhZy0+dS5tZW0uc3RhcnQ7CisJbWVtaW5mby5iYW5rW21lbWluZm8ubnJfYmFua3NdLnNpemUgID0gdGFnLT51Lm1lbS5zaXplOworCW1lbWluZm8uYmFua1ttZW1pbmZvLm5yX2JhbmtzXS5ub2RlICA9IFBIWVNfVE9fTklEKHRhZy0+dS5tZW0uc3RhcnQpOworCW1lbWluZm8ubnJfYmFua3MgKz0gMTsKKworCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfTUVNLCBwYXJzZV90YWdfbWVtMzIpOworCisjaWYgZGVmaW5lZChDT05GSUdfVkdBX0NPTlNPTEUpIHx8IGRlZmluZWQoQ09ORklHX0RVTU1ZX0NPTlNPTEUpCitzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm8gPSB7CisgLm9yaWdfdmlkZW9fbGluZXMJPSAzMCwKKyAub3JpZ192aWRlb19jb2xzCT0gODAsCisgLm9yaWdfdmlkZW9fbW9kZQk9IDAsCisgLm9yaWdfdmlkZW9fZWdhX2J4CT0gMCwKKyAub3JpZ192aWRlb19pc1ZHQQk9IDEsCisgLm9yaWdfdmlkZW9fcG9pbnRzCT0gOAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX3ZpZGVvdGV4dChjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJc2NyZWVuX2luZm8ub3JpZ194ICAgICAgICAgICAgPSB0YWctPnUudmlkZW90ZXh0Lng7CisJc2NyZWVuX2luZm8ub3JpZ195ICAgICAgICAgICAgPSB0YWctPnUudmlkZW90ZXh0Lnk7CisJc2NyZWVuX2luZm8ub3JpZ192aWRlb19wYWdlICAgPSB0YWctPnUudmlkZW90ZXh0LnZpZGVvX3BhZ2U7CisJc2NyZWVuX2luZm8ub3JpZ192aWRlb19tb2RlICAgPSB0YWctPnUudmlkZW90ZXh0LnZpZGVvX21vZGU7CisJc2NyZWVuX2luZm8ub3JpZ192aWRlb19jb2xzICAgPSB0YWctPnUudmlkZW90ZXh0LnZpZGVvX2NvbHM7CisJc2NyZWVuX2luZm8ub3JpZ192aWRlb19lZ2FfYnggPSB0YWctPnUudmlkZW90ZXh0LnZpZGVvX2VnYV9ieDsKKwlzY3JlZW5faW5mby5vcmlnX3ZpZGVvX2xpbmVzICA9IHRhZy0+dS52aWRlb3RleHQudmlkZW9fbGluZXM7CisJc2NyZWVuX2luZm8ub3JpZ192aWRlb19pc1ZHQSAgPSB0YWctPnUudmlkZW90ZXh0LnZpZGVvX2lzdmdhOworCXNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fcG9pbnRzID0gdGFnLT51LnZpZGVvdGV4dC52aWRlb19wb2ludHM7CisJcmV0dXJuIDA7Cit9CisKK19fdGFndGFibGUoQVRBR19WSURFT1RFWFQsIHBhcnNlX3RhZ192aWRlb3RleHQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19yYW1kaXNrKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKK3sKKwlzZXR1cF9yYW1kaXNrKCh0YWctPnUucmFtZGlzay5mbGFncyAmIDEpID09IDAsCisJCSAgICAgICh0YWctPnUucmFtZGlzay5mbGFncyAmIDIpID09IDAsCisJCSAgICAgIHRhZy0+dS5yYW1kaXNrLnN0YXJ0LCB0YWctPnUucmFtZGlzay5zaXplKTsKKwlyZXR1cm4gMDsKK30KKworX190YWd0YWJsZShBVEFHX1JBTURJU0ssIHBhcnNlX3RhZ19yYW1kaXNrKTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX2luaXRyZChjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQVRBR19JTklUUkQgaXMgZGVwcmVjYXRlZDsgIgorCQkicGxlYXNlIHVwZGF0ZSB5b3VyIGJvb3Rsb2FkZXIuXG4iKTsKKwlwaHlzX2luaXRyZF9zdGFydCA9IF9fdmlydF90b19waHlzKHRhZy0+dS5pbml0cmQuc3RhcnQpOworCXBoeXNfaW5pdHJkX3NpemUgPSB0YWctPnUuaW5pdHJkLnNpemU7CisJcmV0dXJuIDA7Cit9CisKK19fdGFndGFibGUoQVRBR19JTklUUkQsIHBhcnNlX3RhZ19pbml0cmQpOworCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfaW5pdHJkMihjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJcGh5c19pbml0cmRfc3RhcnQgPSB0YWctPnUuaW5pdHJkLnN0YXJ0OworCXBoeXNfaW5pdHJkX3NpemUgPSB0YWctPnUuaW5pdHJkLnNpemU7CisJcmV0dXJuIDA7Cit9CisKK19fdGFndGFibGUoQVRBR19JTklUUkQyLCBwYXJzZV90YWdfaW5pdHJkMik7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19zZXJpYWxucihjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJc3lzdGVtX3NlcmlhbF9sb3cgPSB0YWctPnUuc2VyaWFsbnIubG93OworCXN5c3RlbV9zZXJpYWxfaGlnaCA9IHRhZy0+dS5zZXJpYWxuci5oaWdoOworCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfU0VSSUFMLCBwYXJzZV90YWdfc2VyaWFsbnIpOworCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfcmV2aXNpb24oY29uc3Qgc3RydWN0IHRhZyAqdGFnKQoreworCXN5c3RlbV9yZXYgPSB0YWctPnUucmV2aXNpb24ucmV2OworCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfUkVWSVNJT04sIHBhcnNlX3RhZ19yZXZpc2lvbik7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19jbWRsaW5lKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKK3sKKwlzdHJsY3B5KGRlZmF1bHRfY29tbWFuZF9saW5lLCB0YWctPnUuY21kbGluZS5jbWRsaW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJcmV0dXJuIDA7Cit9CisKK19fdGFndGFibGUoQVRBR19DTURMSU5FLCBwYXJzZV90YWdfY21kbGluZSk7CisKKy8qCisgKiBTY2FuIHRoZSB0YWcgdGFibGUgZm9yIHRoaXMgdGFnLCBhbmQgY2FsbCBpdHMgcGFyc2UgZnVuY3Rpb24uCisgKiBUaGUgdGFnIHRhYmxlIGlzIGJ1aWx0IGJ5IHRoZSBsaW5rZXIgZnJvbSBhbGwgdGhlIF9fdGFndGFibGUKKyAqIGRlY2xhcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKK3sKKwlleHRlcm4gc3RydWN0IHRhZ3RhYmxlIF9fdGFndGFibGVfYmVnaW4sIF9fdGFndGFibGVfZW5kOworCXN0cnVjdCB0YWd0YWJsZSAqdDsKKworCWZvciAodCA9ICZfX3RhZ3RhYmxlX2JlZ2luOyB0IDwgJl9fdGFndGFibGVfZW5kOyB0KyspCisJCWlmICh0YWctPmhkci50YWcgPT0gdC0+dGFnKSB7CisJCQl0LT5wYXJzZSh0YWcpOworCQkJYnJlYWs7CisJCX0KKworCXJldHVybiB0IDwgJl9fdGFndGFibGVfZW5kOworfQorCisvKgorICogUGFyc2UgYWxsIHRhZ3MgaW4gdGhlIGxpc3QsIGNoZWNraW5nIGJvdGggdGhlIGdsb2JhbCBhbmQgYXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpYyB0YWcgdGFibGVzLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfdGFncyhjb25zdCBzdHJ1Y3QgdGFnICp0KQoreworCWZvciAoOyB0LT5oZHIuc2l6ZTsgdCA9IHRhZ19uZXh0KHQpKQorCQlpZiAoIXBhcnNlX3RhZyh0KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiSWdub3JpbmcgdW5yZWNvZ25pc2VkIHRhZyAweCUwOHhcbiIsCisJCQkJdC0+aGRyLnRhZyk7Cit9CisKKy8qCisgKiBUaGlzIGhvbGRzIG91ciBkZWZhdWx0cy4KKyAqLworc3RhdGljIHN0cnVjdCBpbml0X3RhZ3MgeworCXN0cnVjdCB0YWdfaGVhZGVyIGhkcjE7CisJc3RydWN0IHRhZ19jb3JlICAgY29yZTsKKwlzdHJ1Y3QgdGFnX2hlYWRlciBoZHIyOworCXN0cnVjdCB0YWdfbWVtMzIgIG1lbTsKKwlzdHJ1Y3QgdGFnX2hlYWRlciBoZHIzOworfSBpbml0X3RhZ3MgX19pbml0ZGF0YSA9IHsKKwl7IHRhZ19zaXplKHRhZ19jb3JlKSwgQVRBR19DT1JFIH0sCisJeyAxLCBQQUdFX1NJWkUsIDB4ZmYgfSwKKwl7IHRhZ19zaXplKHRhZ19tZW0zMiksIEFUQUdfTUVNIH0sCisJeyBNRU1fU0laRSwgUEhZU19PRkZTRVQgfSwKKwl7IDAsIEFUQUdfTk9ORSB9Cit9OworCitzdGF0aWMgdm9pZCAoKmluaXRfbWFjaGluZSkodm9pZCkgX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgY3VzdG9taXplX21hY2hpbmUodm9pZCkKK3sKKwkvKiBjdXN0b21pemVzIHBsYXRmb3JtIGRldmljZXMsIG9yIGFkZHMgbmV3IG9uZXMgKi8KKwlpZiAoaW5pdF9tYWNoaW5lKQorCQlpbml0X21hY2hpbmUoKTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoY3VzdG9taXplX21hY2hpbmUpOworCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCit7CisJc3RydWN0IHRhZyAqdGFncyA9IChzdHJ1Y3QgdGFnICopJmluaXRfdGFnczsKKwlzdHJ1Y3QgbWFjaGluZV9kZXNjICptZGVzYzsKKwljaGFyICpmcm9tID0gZGVmYXVsdF9jb21tYW5kX2xpbmU7CisKKwlzZXR1cF9wcm9jZXNzb3IoKTsKKwltZGVzYyA9IHNldHVwX21hY2hpbmUobWFjaGluZV9hcmNoX3R5cGUpOworCW1hY2hpbmVfbmFtZSA9IG1kZXNjLT5uYW1lOworCisJaWYgKG1kZXNjLT5zb2Z0X3JlYm9vdCkKKwkJcmVib290X3NldHVwKCJzIik7CisKKwlpZiAobWRlc2MtPnBhcmFtX29mZnNldCkKKwkJdGFncyA9IHBoeXNfdG9fdmlydChtZGVzYy0+cGFyYW1fb2Zmc2V0KTsKKworCS8qCisJICogSWYgd2UgaGF2ZSB0aGUgb2xkIHN0eWxlIHBhcmFtZXRlcnMsIGNvbnZlcnQgdGhlbSB0bworCSAqIGEgdGFnIGxpc3QuCisJICovCisJaWYgKHRhZ3MtPmhkci50YWcgIT0gQVRBR19DT1JFKQorCQljb252ZXJ0X3RvX3RhZ19saXN0KHRhZ3MpOworCWlmICh0YWdzLT5oZHIudGFnICE9IEFUQUdfQ09SRSkKKwkJdGFncyA9IChzdHJ1Y3QgdGFnICopJmluaXRfdGFnczsKKworCWlmIChtZGVzYy0+Zml4dXApCisJCW1kZXNjLT5maXh1cChtZGVzYywgdGFncywgJmZyb20sICZtZW1pbmZvKTsKKworCWlmICh0YWdzLT5oZHIudGFnID09IEFUQUdfQ09SRSkgeworCQlpZiAobWVtaW5mby5ucl9iYW5rcyAhPSAwKQorCQkJc3F1YXNoX21lbV90YWdzKHRhZ3MpOworCQlwYXJzZV90YWdzKHRhZ3MpOworCX0KKworCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX3RleHQ7CisJaW5pdF9tbS5lbmRfY29kZSAgID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CisJaW5pdF9tbS5lbmRfZGF0YSAgID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7CisJaW5pdF9tbS5icmsJICAgPSAodW5zaWduZWQgbG9uZykgJl9lbmQ7CisKKwltZW1jcHkoc2F2ZWRfY29tbWFuZF9saW5lLCBmcm9tLCBDT01NQU5EX0xJTkVfU0laRSk7CisJc2F2ZWRfY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFLTFdID0gJ1wwJzsKKwlwYXJzZV9jbWRsaW5lKGNtZGxpbmVfcCwgZnJvbSk7CisJcGFnaW5nX2luaXQoJm1lbWluZm8sIG1kZXNjKTsKKwlyZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcygmbWVtaW5mbywgbWRlc2MpOworCisJLyoKKwkgKiBTZXQgdXAgdmFyaW91cyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgcG9pbnRlcnMKKwkgKi8KKwlpbml0X2FyY2hfaXJxID0gbWRlc2MtPmluaXRfaXJxOworCXN5c3RlbV90aW1lciA9IG1kZXNjLT50aW1lcjsKKwlpbml0X21hY2hpbmUgPSBtZGVzYy0+aW5pdF9tYWNoaW5lOworCisjaWZkZWYgQ09ORklHX1ZUCisjaWYgZGVmaW5lZChDT05GSUdfVkdBX0NPTlNPTEUpCisJY29uc3dpdGNocCA9ICZ2Z2FfY29uOworI2VsaWYgZGVmaW5lZChDT05GSUdfRFVNTVlfQ09OU09MRSkKKwljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKKyNlbmRpZgorI2VuZGlmCit9CisKKworc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9jcHUoY3B1KQorCQlyZWdpc3Rlcl9jcHUoJnBlcl9jcHUoY3B1X2RhdGEsIGNwdSkuY3B1LCBjcHUsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmh3Y2FwX3N0cltdID0geworCSJzd3AiLAorCSJoYWxmIiwKKwkidGh1bWIiLAorCSIyNmJpdCIsCisJImZhc3RtdWx0IiwKKwkiZnBhIiwKKwkidmZwIiwKKwkiZWRzcCIsCisJImphdmEiLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkCitjX3Nob3dfY2FjaGUoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBpbnQgY2FjaGUpCit7CisJdW5zaWduZWQgaW50IG11bHQgPSAyICsgKENBQ0hFX00oY2FjaGUpID8gMSA6IDApOworCisJc2VxX3ByaW50ZihtLCAiJXMgc2l6ZVx0XHQ6ICVkXG4iCisJCSAgICAgICIlcyBhc3NvY1x0XHQ6ICVkXG4iCisJCSAgICAgICIlcyBsaW5lIGxlbmd0aFx0OiAlZFxuIgorCQkgICAgICAiJXMgc2V0c1x0XHQ6ICVkXG4iLAorCQl0eXBlLCBtdWx0IDw8ICg4ICsgQ0FDSEVfU0laRShjYWNoZSkpLAorCQl0eXBlLCAobXVsdCA8PCBDQUNIRV9BU1NPQyhjYWNoZSkpID4+IDEsCisJCXR5cGUsIDggPDwgQ0FDSEVfTElORShjYWNoZSksCisJCXR5cGUsIDEgPDwgKDYgKyBDQUNIRV9TSVpFKGNhY2hlKSAtIENBQ0hFX0FTU09DKGNhY2hlKSAtCisJCQkgICAgQ0FDSEVfTElORShjYWNoZSkpKTsKK30KKworc3RhdGljIGludCBjX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCWludCBpOworCisJc2VxX3ByaW50ZihtLCAiUHJvY2Vzc29yXHQ6ICVzIHJldiAlZCAoJXMpXG4iLAorCQkgICBjcHVfbmFtZSwgKGludClwcm9jZXNzb3JfaWQgJiAxNSwgZWxmX3BsYXRmb3JtKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJc2VxX3ByaW50ZihtLCAiUHJvY2Vzc29yXHQ6ICVkXG4iLCBpKTsKKwkJc2VxX3ByaW50ZihtLCAiQm9nb01JUFNcdDogJWx1LiUwMmx1XG5cbiIsCisJCQkgICBwZXJfY3B1KGNwdV9kYXRhLCBpKS5sb29wc19wZXJfamlmZnkgLyAoNTAwMDAwVUwvSFopLAorCQkJICAgKHBlcl9jcHUoY3B1X2RhdGEsIGkpLmxvb3BzX3Blcl9qaWZmeSAvICg1MDAwVUwvSFopKSAlIDEwMCk7CisJfQorI2Vsc2UgLyogQ09ORklHX1NNUCAqLworCXNlcV9wcmludGYobSwgIkJvZ29NSVBTXHQ6ICVsdS4lMDJsdVxuIiwKKwkJICAgbG9vcHNfcGVyX2ppZmZ5IC8gKDUwMDAwMC9IWiksCisJCSAgIChsb29wc19wZXJfamlmZnkgLyAoNTAwMC9IWikpICUgMTAwKTsKKyNlbmRpZgorCisJLyogZHVtcCBvdXQgdGhlIHByb2Nlc3NvciBmZWF0dXJlcyAqLworCXNlcV9wdXRzKG0sICJGZWF0dXJlc1x0OiAiKTsKKworCWZvciAoaSA9IDA7IGh3Y2FwX3N0cltpXTsgaSsrKQorCQlpZiAoZWxmX2h3Y2FwICYgKDEgPDwgaSkpCisJCQlzZXFfcHJpbnRmKG0sICIlcyAiLCBod2NhcF9zdHJbaV0pOworCisJc2VxX3ByaW50ZihtLCAiXG5DUFUgaW1wbGVtZW50ZXJcdDogMHglMDJ4XG4iLCBwcm9jZXNzb3JfaWQgPj4gMjQpOworCXNlcV9wcmludGYobSwgIkNQVSBhcmNoaXRlY3R1cmU6ICVzXG4iLCBwcm9jX2FyY2hbY3B1X2FyY2hpdGVjdHVyZSgpXSk7CisKKwlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwMGYwMDApID09IDB4MDAwMDAwMDApIHsKKwkJLyogcHJlLUFSTTcgKi8KKwkJc2VxX3ByaW50ZihtLCAiQ1BVIHBhcnRcdFx0OiAlMDd4XG4iLCBwcm9jZXNzb3JfaWQgPj4gNCk7CisJfSBlbHNlIHsKKwkJaWYgKChwcm9jZXNzb3JfaWQgJiAweDAwMDBmMDAwKSA9PSAweDAwMDA3MDAwKSB7CisJCQkvKiBBUk03ICovCisJCQlzZXFfcHJpbnRmKG0sICJDUFUgdmFyaWFudFx0OiAweCUwMnhcbiIsCisJCQkJICAgKHByb2Nlc3Nvcl9pZCA+PiAxNikgJiAxMjcpOworCQl9IGVsc2UgeworCQkJLyogcG9zdC1BUk03ICovCisJCQlzZXFfcHJpbnRmKG0sICJDUFUgdmFyaWFudFx0OiAweCV4XG4iLAorCQkJCSAgIChwcm9jZXNzb3JfaWQgPj4gMjApICYgMTUpOworCQl9CisJCXNlcV9wcmludGYobSwgIkNQVSBwYXJ0XHQ6IDB4JTAzeFxuIiwKKwkJCSAgIChwcm9jZXNzb3JfaWQgPj4gNCkgJiAweGZmZik7CisJfQorCXNlcV9wcmludGYobSwgIkNQVSByZXZpc2lvblx0OiAlZFxuIiwgcHJvY2Vzc29yX2lkICYgMTUpOworCisJeworCQl1bnNpZ25lZCBpbnQgY2FjaGVfaW5mbyA9IHJlYWRfY3B1aWQoQ1BVSURfQ0FDSEVUWVBFKTsKKwkJaWYgKGNhY2hlX2luZm8gIT0gcHJvY2Vzc29yX2lkKSB7CisJCQlzZXFfcHJpbnRmKG0sICJDYWNoZSB0eXBlXHQ6ICVzXG4iCisJCQkJICAgICAgIkNhY2hlIGNsZWFuXHQ6ICVzXG4iCisJCQkJICAgICAgIkNhY2hlIGxvY2tkb3duXHQ6ICVzXG4iCisJCQkJICAgICAgIkNhY2hlIGZvcm1hdFx0OiAlc1xuIiwKKwkJCQkgICBjYWNoZV90eXBlc1tDQUNIRV9UWVBFKGNhY2hlX2luZm8pXSwKKwkJCQkgICBjYWNoZV9jbGVhbltDQUNIRV9UWVBFKGNhY2hlX2luZm8pXSwKKwkJCQkgICBjYWNoZV9sb2NrZG93bltDQUNIRV9UWVBFKGNhY2hlX2luZm8pXSwKKwkJCQkgICBDQUNIRV9TKGNhY2hlX2luZm8pID8gIkhhcnZhcmQiIDogIlVuaWZpZWQiKTsKKworCQkJaWYgKENBQ0hFX1MoY2FjaGVfaW5mbykpIHsKKwkJCQljX3Nob3dfY2FjaGUobSwgIkkiLCBDQUNIRV9JU0laRShjYWNoZV9pbmZvKSk7CisJCQkJY19zaG93X2NhY2hlKG0sICJEIiwgQ0FDSEVfRFNJWkUoY2FjaGVfaW5mbykpOworCQkJfSBlbHNlIHsKKwkJCQljX3Nob3dfY2FjaGUobSwgIkNhY2hlIiwgQ0FDSEVfSVNJWkUoY2FjaGVfaW5mbykpOworCQkJfQorCQl9CisJfQorCisJc2VxX3B1dHMobSwgIlxuIik7CisKKwlzZXFfcHJpbnRmKG0sICJIYXJkd2FyZVx0OiAlc1xuIiwgbWFjaGluZV9uYW1lKTsKKwlzZXFfcHJpbnRmKG0sICJSZXZpc2lvblx0OiAlMDR4XG4iLCBzeXN0ZW1fcmV2KTsKKwlzZXFfcHJpbnRmKG0sICJTZXJpYWxcdFx0OiAlMDh4JTA4eFxuIiwKKwkJICAgc3lzdGVtX3NlcmlhbF9oaWdoLCBzeXN0ZW1fc2VyaWFsX2xvdyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gKnBvcyA8IDEgPyAodm9pZCAqKTEgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworfQorCitzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKKwkuc3RhcnQJPSBjX3N0YXJ0LAorCS5uZXh0CT0gY19uZXh0LAorCS5zdG9wCT0gY19zdG9wLAorCS5zaG93CT0gY19zaG93Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTkxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKQEAgLTAsMCArMSw3NDggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaW5jbHVkZSAicHRyYWNlLmgiCisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKKy8qCisgKiBGb3IgQVJNIHN5c2NhbGxzLCB3ZSBlbmNvZGUgdGhlIHN5c2NhbGwgbnVtYmVyIGludG8gdGhlIGluc3RydWN0aW9uLgorICovCisjZGVmaW5lIFNXSV9TWVNfU0lHUkVUVVJOCSgweGVmMDAwMDAwfChfX05SX3NpZ3JldHVybikpCisjZGVmaW5lIFNXSV9TWVNfUlRfU0lHUkVUVVJOCSgweGVmMDAwMDAwfChfX05SX3J0X3NpZ3JldHVybikpCisKKy8qCisgKiBGb3IgVGh1bWIgc3lzY2FsbHMsIHdlIHBhc3MgdGhlIHN5c2NhbGwgbnVtYmVyIHZpYSByNy4gIFdlIHRoZXJlZm9yZQorICogbmVlZCB0d28gMTYtYml0IGluc3RydWN0aW9ucy4KKyAqLworI2RlZmluZSBTV0lfVEhVTUJfU0lHUkVUVVJOCSgweGRmMDAgPDwgMTYgfCAweDI3MDAgfCAoX19OUl9zaWdyZXR1cm4gLSBfX05SX1NZU0NBTExfQkFTRSkpCisjZGVmaW5lIFNXSV9USFVNQl9SVF9TSUdSRVRVUk4JKDB4ZGYwMCA8PCAxNiB8IDB4MjcwMCB8IChfX05SX3J0X3NpZ3JldHVybiAtIF9fTlJfU1lTQ0FMTF9CQVNFKSkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcmV0Y29kZXNbNF0gPSB7CisJU1dJX1NZU19TSUdSRVRVUk4sCVNXSV9USFVNQl9TSUdSRVRVUk4sCisJU1dJX1NZU19SVF9TSUdSRVRVUk4sCVNXSV9USFVNQl9SVF9TSUdSRVRVUk4KK307CisKK3N0YXRpYyBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IHN5c2NhbGwpOworCisvKgorICogYXRvbWljYWxseSBzd2FwIGluIHRoZSBuZXcgc2lnbmFsIG1hc2ssIGFuZCB3YWl0IGZvciBhIHNpZ25hbC4KKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3N1c3BlbmQoaW50IHJlc3RhcnQsIHVuc2lnbmVkIGxvbmcgb2xkbWFzaywgb2xkX3NpZ3NldF90IG1hc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNpZ3NldF90IHNhdmVzZXQ7CisKKwltYXNrICY9IF9CTE9DS0FCTEU7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXJlZ3MtPkFSTV9yMCA9IC1FSU5UUjsKKworCXdoaWxlICgxKSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZSgpOworCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzLCAwKSkKKwkJCXJldHVybiByZWdzLT5BUk1fcjA7CisJfQorfQorCithc21saW5rYWdlIGludAorc3lzX3J0X3NpZ3N1c3BlbmQoc2lnc2V0X3QgX191c2VyICp1bmV3c2V0LCBzaXplX3Qgc2lnc2V0c2l6ZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OworCisJLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gKi8KKwlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCB1bmV3c2V0LCBzaXplb2YobmV3c2V0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXNpZ2RlbHNldG1hc2soJm5ld3NldCwgfl9CTE9DS0FCTEUpOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJY3VycmVudC0+YmxvY2tlZCA9IG5ld3NldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJcmVncy0+QVJNX3IwID0gLUVJTlRSOworCisJd2hpbGUgKDEpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlKCk7CisJCWlmIChkb19zaWduYWwoJnNhdmVzZXQsIHJlZ3MsIDApKQorCQkJcmV0dXJuIHJlZ3MtPkFSTV9yMDsKKwl9Cit9CisKK2FzbWxpbmthZ2UgaW50IAorc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKKwkgICAgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKm9hY3QpCit7CisJc3RydWN0IGtfc2lnYWN0aW9uIG5ld19rYSwgb2xkX2thOworCWludCByZXQ7CisKKwlpZiAoYWN0KSB7CisJCW9sZF9zaWdzZXRfdCBtYXNrOworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9oYW5kbGVyLCAmYWN0LT5zYV9oYW5kbGVyKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOworCQlfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spOworCQlzaWdpbml0c2V0KCZuZXdfa2Euc2Euc2FfbWFzaywgbWFzayk7CisJfQorCisJcmV0ID0gZG9fc2lnYWN0aW9uKHNpZywgYWN0ID8gJm5ld19rYSA6IE5VTEwsIG9hY3QgPyAmb2xkX2thIDogTlVMTCk7CisKKwlpZiAoIXJldCAmJiBvYWN0KSB7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgb2FjdCwgc2l6ZW9mKCpvYWN0KSkgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2hhbmRsZXIsICZvYWN0LT5zYV9oYW5kbGVyKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfcmVzdG9yZXIsICZvYWN0LT5zYV9yZXN0b3JlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfZmxhZ3MsICZvYWN0LT5zYV9mbGFncyk7CisJCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX21hc2suc2lnWzBdLCAmb2FjdC0+c2FfbWFzayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19JV01NWFQKKworLyogaXdtbXh0X2FyZWEgaXMgMHg5OCBieXRlcyBsb25nLCBwcmVjZWVkZWQgYnkgOCBieXRlcyBvZiBzaWduYXR1cmUgKi8KKyNkZWZpbmUgSVdNTVhUX1NUT1JBR0VfU0laRQkoMHg5OCArIDgpCisjZGVmaW5lIElXTU1YVF9NQUdJQzAJCTB4MTJlZjg0MmEKKyNkZWZpbmUgSVdNTVhUX01BR0lDMQkJMHgxYzA3Y2E3MQorCitzdHJ1Y3QgaXdtbXh0X3NpZ2ZyYW1lIHsKKwl1bnNpZ25lZCBsb25nCW1hZ2ljMDsKKwl1bnNpZ25lZCBsb25nCW1hZ2ljMTsKKwl1bnNpZ25lZCBsb25nCXN0b3JhZ2VbMHg5OC80XTsKK307CisKK3N0YXRpYyBpbnQgcGFnZV9wcmVzZW50KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB2b2lkIF9fdXNlciAqdXB0ciwgaW50IHdyKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXVwdHI7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOworCWlmIChwZ2RfcHJlc2VudCgqcGdkKSkgeworCQlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHIpOworCQlpZiAocG1kX3ByZXNlbnQoKnBtZCkpIHsKKwkJCXB0ZV90ICpwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOworCQkJcmV0dXJuIChwdGVfcHJlc2VudCgqcHRlKSAmJiAoIXdyIHx8IHB0ZV93cml0ZSgqcHRlKSkpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfbG9ja2VkKHZvaWQgX191c2VyICp1cHRyLCB2b2lkICprcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHdyaXRlLAorCQkgICAgICAgdm9pZCAoKmNvcHlmbikodm9pZCAqLCB2b2lkIF9fdXNlciAqKSkKK3sKKwl1bnNpZ25lZCBjaGFyIHYsIF9fdXNlciAqdXNlcnB0ciA9IHVwdHI7CisJaW50IGVyciA9IDA7CisKKwlkbyB7CisJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJCWlmICh3cml0ZSkgeworCQkJX19wdXRfdXNlcl9lcnJvcigwLCB1c2VycHRyLCBlcnIpOworCQkJX19wdXRfdXNlcl9lcnJvcigwLCB1c2VycHRyICsgc2l6ZSAtIDEsIGVycik7CisJCX0gZWxzZSB7CisJCQlfX2dldF91c2VyX2Vycm9yKHYsIHVzZXJwdHIsIGVycik7CisJCQlfX2dldF91c2VyX2Vycm9yKHYsIHVzZXJwdHIgKyBzaXplIC0gMSwgZXJyKTsKKwkJfQorCisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQltbSA9IGN1cnJlbnQtPm1tOworCQlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQlpZiAocGFnZV9wcmVzZW50KG1tLCB1c2VycHRyLCB3cml0ZSkgJiYKKwkJICAgIHBhZ2VfcHJlc2VudChtbSwgdXNlcnB0ciArIHNpemUgLSAxLCB3cml0ZSkpIHsKKwkJICAgIAljb3B5Zm4oa3B0ciwgdXB0cik7CisJCX0gZWxzZQorCQkJZXJyID0gMTsKKwkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCX0gd2hpbGUgKGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHByZXNlcnZlX2l3bW14dF9jb250ZXh0KHN0cnVjdCBpd21teHRfc2lnZnJhbWUgKmZyYW1lKQoreworCWludCBlcnIgPSAwOworCisJLyogdGhlIGlXTU1YdCBjb250ZXh0IG11c3QgYmUgNjQgYml0IGFsaWduZWQgKi8KKwlXQVJOX09OKCh1bnNpZ25lZCBsb25nKWZyYW1lICYgNyk7CisKKwlfX3B1dF91c2VyX2Vycm9yKElXTU1YVF9NQUdJQzAsICZmcmFtZS0+bWFnaWMwLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IoSVdNTVhUX01BR0lDMSwgJmZyYW1lLT5tYWdpYzEsIGVycik7CisKKwkvKgorCSAqIGl3bW14dF90YXNrX2NvcHkoKSBkb2Vzbid0IGNoZWNrIHVzZXIgcGVybWlzc2lvbnMuCisJICogTGV0J3MgZG8gYSBkdW1teSB3cml0ZSBvbiB0aGUgdXBwZXIgYm91bmRhcnkgdG8gZW5zdXJlCisJICogYWNjZXNzIHRvIHVzZXIgbWVtIGlzIE9LIGFsbCB3YXkgdXAuCisJICovCisJZXJyIHw9IGNvcHlfbG9ja2VkKCZmcmFtZS0+c3RvcmFnZSwgY3VycmVudF90aHJlYWRfaW5mbygpLAorCQkJICAgc2l6ZW9mKGZyYW1lLT5zdG9yYWdlKSwgMSwgaXdtbXh0X3Rhc2tfY29weSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZXN0b3JlX2l3bW14dF9jb250ZXh0KHN0cnVjdCBpd21teHRfc2lnZnJhbWUgKmZyYW1lKQoreworCXVuc2lnbmVkIGxvbmcgbWFnaWMwLCBtYWdpYzE7CisJaW50IGVyciA9IDA7CisKKwkvKiB0aGUgaVdNTVh0IGNvbnRleHQgaXMgNjQgYml0IGFsaWduZWQgKi8KKwlXQVJOX09OKCh1bnNpZ25lZCBsb25nKWZyYW1lICYgNyk7CisKKwkvKgorCSAqIFZhbGlkYXRlIGlXTU1YdCBjb250ZXh0IHNpZ25hdHVyZS4KKwkgKiBBbHNvLCBpd21teHRfdGFza19yZXN0b3JlKCkgZG9lc24ndCBjaGVjayB1c2VyIHBlcm1pc3Npb25zLgorCSAqIExldCdzIGRvIGEgZHVtbXkgd3JpdGUgb24gdGhlIHVwcGVyIGJvdW5kYXJ5IHRvIGVuc3VyZQorCSAqIGFjY2VzcyB0byB1c2VyIG1lbSBpcyBPSyBhbGwgd2F5IHVwLgorCSAqLworCV9fZ2V0X3VzZXJfZXJyb3IobWFnaWMwLCAmZnJhbWUtPm1hZ2ljMCwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKG1hZ2ljMSwgJmZyYW1lLT5tYWdpYzEsIGVycik7CisJaWYgKCFlcnIgJiYgbWFnaWMwID09IElXTU1YVF9NQUdJQzAgJiYgbWFnaWMxID09IElXTU1YVF9NQUdJQzEpCisJCWVyciA9IGNvcHlfbG9ja2VkKCZmcmFtZS0+c3RvcmFnZSwgY3VycmVudF90aHJlYWRfaW5mbygpLAorCQkJCSAgc2l6ZW9mKGZyYW1lLT5zdG9yYWdlKSwgMCwgaXdtbXh0X3Rhc2tfcmVzdG9yZSk7CisJcmV0dXJuIGVycjsKK30KKworI2VuZGlmCisKKy8qCisgKiBBdXhpbGlhcnkgc2lnbmFsIGZyYW1lLiAgVGhpcyBzYXZlcyBzdHVmZiBsaWtlIEZQIHN0YXRlLgorICogVGhlIGxheW91dCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBub3QgcGFydCBvZiB0aGUgdXNlciBBQkkuCisgKi8KK3N0cnVjdCBhdXhfc2lnZnJhbWUgeworI2lmZGVmIENPTkZJR19JV01NWFQKKwlzdHJ1Y3QgaXdtbXh0X3NpZ2ZyYW1lCWl3bW14dDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19WRlAKKwl1bmlvbiB2ZnBfc3RhdGUJCXZmcDsKKyNlbmRpZgorfTsKKworLyoKKyAqIERvIGEgc2lnbmFsIHJldHVybjsgdW5kbyB0aGUgc2lnbmFsIHN0YWNrLiAgVGhlc2UgYXJlIGFsaWduZWQgdG8gNjQtYml0LgorICovCitzdHJ1Y3Qgc2lnZnJhbWUgeworCXN0cnVjdCBzaWdjb250ZXh0IHNjOworCXVuc2lnbmVkIGxvbmcgZXh0cmFtYXNrW19OU0lHX1dPUkRTLTFdOworCXVuc2lnbmVkIGxvbmcgcmV0Y29kZTsKKwlzdHJ1Y3QgYXV4X3NpZ2ZyYW1lIGF1eCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCitzdHJ1Y3QgcnRfc2lnZnJhbWUgeworCXN0cnVjdCBzaWdpbmZvIF9fdXNlciAqcGluZm87CisJdm9pZCBfX3VzZXIgKnB1YzsKKwlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCXN0cnVjdCB1Y29udGV4dCB1YzsKKwl1bnNpZ25lZCBsb25nIHJldGNvZGU7CisJc3RydWN0IGF1eF9zaWdmcmFtZSBhdXggX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworc3RhdGljIGludAorcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLAorCQkgICBzdHJ1Y3QgYXV4X3NpZ2ZyYW1lIF9fdXNlciAqYXV4KQoreworCWludCBlcnIgPSAwOworCisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjAsICZzYy0+YXJtX3IwLCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IxLCAmc2MtPmFybV9yMSwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMiwgJnNjLT5hcm1fcjIsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjMsICZzYy0+YXJtX3IzLCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I0LCAmc2MtPmFybV9yNCwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNSwgJnNjLT5hcm1fcjUsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjYsICZzYy0+YXJtX3I2LCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I3LCAmc2MtPmFybV9yNywgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yOCwgJnNjLT5hcm1fcjgsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjksICZzYy0+YXJtX3I5LCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IxMCwgJnNjLT5hcm1fcjEwLCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX2ZwLCAmc2MtPmFybV9mcCwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9pcCwgJnNjLT5hcm1faXAsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fc3AsICZzYy0+YXJtX3NwLCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX2xyLCAmc2MtPmFybV9sciwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9wYywgJnNjLT5hcm1fcGMsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fY3BzciwgJnNjLT5hcm1fY3BzciwgZXJyKTsKKworCWVyciB8PSAhdmFsaWRfdXNlcl9yZWdzKHJlZ3MpOworCisjaWZkZWYgQ09ORklHX0lXTU1YVAorCWlmIChlcnIgPT0gMCAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl9VU0lOR19JV01NWFQpKQorCQllcnIgfD0gcmVzdG9yZV9pd21teHRfY29udGV4dCgmYXV4LT5pd21teHQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZGUAorLy8JaWYgKGVyciA9PSAwKQorLy8JCWVyciB8PSB2ZnBfcmVzdG9yZV9zdGF0ZSgmYXV4LT52ZnApOworI2VuZGlmCisKKwlyZXR1cm4gZXJyOworfQorCithc21saW5rYWdlIGludCBzeXNfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXNpZ3NldF90IHNldDsKKworCS8qIEFsd2F5cyBtYWtlIGFueSBwZW5kaW5nIHJlc3RhcnRlZCBzeXN0ZW0gY2FsbHMgcmV0dXJuIC1FSU5UUiAqLworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVzdGFydF9ibG9jay5mbiA9IGRvX25vX3Jlc3RhcnRfc3lzY2FsbDsKKworCS8qCisJICogU2luY2Ugd2Ugc3RhY2tlZCB0aGUgc2lnbmFsIG9uIGEgNjQtYml0IGJvdW5kYXJ5LAorCSAqIHRoZW4gJ3NwJyBzaG91bGQgYmUgd29yZCBhbGlnbmVkIGhlcmUuICBJZiBpdCdzCisJICogbm90LCB0aGVuIHRoZSB1c2VyIGlzIHRyeWluZyB0byBtZXNzIHdpdGggdXMuCisJICovCisJaWYgKHJlZ3MtPkFSTV9zcCAmIDcpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopcmVncy0+QVJNX3NwOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YgKCpmcmFtZSkpKQorCQlnb3RvIGJhZGZyYW1lOworCWlmIChfX2dldF91c2VyKHNldC5zaWdbMF0sICZmcmFtZS0+c2Mub2xkbWFzaykKKwkgICAgfHwgKF9OU0lHX1dPUkRTID4gMQorCSAgICAgICAgJiYgX19jb3B5X2Zyb21fdXNlcigmc2V0LnNpZ1sxXSwgJmZyYW1lLT5leHRyYW1hc2ssCisJCQkJICAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+c2MsICZmcmFtZS0+YXV4KSkKKwkJZ290byBiYWRmcmFtZTsKKworCS8qIFNlbmQgU0lHVFJBUCBpZiB3ZSdyZSBzaW5nbGUtc3RlcHBpbmcgKi8KKwlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfU0lOR0xFU1RFUCkgeworCQlwdHJhY2VfY2FuY2VsX2JwdChjdXJyZW50KTsKKwkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMSk7CisJfQorCisJcmV0dXJuIHJlZ3MtPkFSTV9yMDsKKworYmFkZnJhbWU6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOworfQorCithc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXNpZ3NldF90IHNldDsKKworCS8qIEFsd2F5cyBtYWtlIGFueSBwZW5kaW5nIHJlc3RhcnRlZCBzeXN0ZW0gY2FsbHMgcmV0dXJuIC1FSU5UUiAqLworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVzdGFydF9ibG9jay5mbiA9IGRvX25vX3Jlc3RhcnRfc3lzY2FsbDsKKworCS8qCisJICogU2luY2Ugd2Ugc3RhY2tlZCB0aGUgc2lnbmFsIG9uIGEgNjQtYml0IGJvdW5kYXJ5LAorCSAqIHRoZW4gJ3NwJyBzaG91bGQgYmUgd29yZCBhbGlnbmVkIGhlcmUuICBJZiBpdCdzCisJICogbm90LCB0aGVuIHRoZSB1c2VyIGlzIHRyeWluZyB0byBtZXNzIHdpdGggdXMuCisJICovCisJaWYgKHJlZ3MtPkFSTV9zcCAmIDcpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopcmVncy0+QVJNX3NwOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YgKCpmcmFtZSkpKQorCQlnb3RvIGJhZGZyYW1lOworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZmcmFtZS0+YXV4KSkKKwkJZ290byBiYWRmcmFtZTsKKworCWlmIChkb19zaWdhbHRzdGFjaygmZnJhbWUtPnVjLnVjX3N0YWNrLCBOVUxMLCByZWdzLT5BUk1fc3ApID09IC1FRkFVTFQpCisJCWdvdG8gYmFkZnJhbWU7CisKKwkvKiBTZW5kIFNJR1RSQVAgaWYgd2UncmUgc2luZ2xlLXN0ZXBwaW5nICovCisJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1NJTkdMRVNURVApIHsKKwkJcHRyYWNlX2NhbmNlbF9icHQoY3VycmVudCk7CisJCXNlbmRfc2lnKFNJR1RSQVAsIGN1cnJlbnQsIDEpOworCX0KKworCXJldHVybiByZWdzLT5BUk1fcjA7CisKK2JhZGZyYW1lOgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLCBzdHJ1Y3QgYXV4X3NpZ2ZyYW1lIF9fdXNlciAqYXV4LAorCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpbnQgZXJyID0gMDsKKworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IwLCAmc2MtPmFybV9yMCwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMSwgJnNjLT5hcm1fcjEsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjIsICZzYy0+YXJtX3IyLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IzLCAmc2MtPmFybV9yMywgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNCwgJnNjLT5hcm1fcjQsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjUsICZzYy0+YXJtX3I1LCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I2LCAmc2MtPmFybV9yNiwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNywgJnNjLT5hcm1fcjcsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjgsICZzYy0+YXJtX3I4LCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I5LCAmc2MtPmFybV9yOSwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMTAsICZzYy0+YXJtX3IxMCwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9mcCwgJnNjLT5hcm1fZnAsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1faXAsICZzYy0+YXJtX2lwLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3NwLCAmc2MtPmFybV9zcCwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9sciwgJnNjLT5hcm1fbHIsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcGMsICZzYy0+YXJtX3BjLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX2Nwc3IsICZzYy0+YXJtX2Nwc3IsIGVycik7CisKKwlfX3B1dF91c2VyX2Vycm9yKGN1cnJlbnQtPnRocmVhZC50cmFwX25vLCAmc2MtPnRyYXBfbm8sIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihjdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSwgJnNjLT5lcnJvcl9jb2RlLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IoY3VycmVudC0+dGhyZWFkLmFkZHJlc3MsICZzYy0+ZmF1bHRfYWRkcmVzcywgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKG1hc2ssICZzYy0+b2xkbWFzaywgZXJyKTsKKworI2lmZGVmIENPTkZJR19JV01NWFQKKwlpZiAoZXJyID09IDAgJiYgdGVzdF90aHJlYWRfZmxhZyhUSUZfVVNJTkdfSVdNTVhUKSkKKwkJZXJyIHw9IHByZXNlcnZlX2l3bW14dF9jb250ZXh0KCZhdXgtPml3bW14dCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVkZQCisvLwlpZiAoZXJyID09IDApCisvLwkJZXJyIHw9IHZmcF9zYXZlX3N0YXRlKCZhdXgtPnZmcCk7CisjZW5kaWYKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VzZXIgKgorZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZnJhbWVzaXplKQoreworCXVuc2lnbmVkIGxvbmcgc3AgPSByZWdzLT5BUk1fc3A7CisJdm9pZCBfX3VzZXIgKmZyYW1lOworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBYL09wZW4gc2FuY3Rpb25lZCBzaWduYWwgc3RhY2sgc3dpdGNoaW5nLgorCSAqLworCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYgIXNhc19zc19mbGFncyhzcCkpCisJCXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CisKKwkvKgorCSAqIEFUUENTIEIwMSBtYW5kYXRlcyA4LWJ5dGUgYWxpZ25tZW50CisJICovCisJZnJhbWUgPSAodm9pZCBfX3VzZXIgKikoKHNwIC0gZnJhbWVzaXplKSAmIH43KTsKKworCS8qCisJICogQ2hlY2sgdGhhdCB3ZSBjYW4gYWN0dWFsbHkgd3JpdGUgdG8gdGhlIHNpZ25hbCBmcmFtZS4KKwkgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBmcmFtZXNpemUpKQorCQlmcmFtZSA9IE5VTEw7CisKKwlyZXR1cm4gZnJhbWU7Cit9CisKK3N0YXRpYyBpbnQKK3NldHVwX3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkgICAgIHVuc2lnbmVkIGxvbmcgX191c2VyICpyYywgdm9pZCBfX3VzZXIgKmZyYW1lLCBpbnQgdXNpZykKK3sKKwl1bnNpZ25lZCBsb25nIGhhbmRsZXIgPSAodW5zaWduZWQgbG9uZylrYS0+c2Euc2FfaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nIHJldGNvZGU7CisJaW50IHRodW1iID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwc3IgPSByZWdzLT5BUk1fY3BzciAmIH5QU1JfZjsKKworCS8qCisJICogTWF5YmUgd2UgbmVlZCB0byBkZWxpdmVyIGEgMzItYml0IHNpZ25hbCB0byBhIDI2LWJpdCB0YXNrLgorCSAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9USElSVFlUV08pCisJCWNwc3IgPSAoY3BzciAmIH5NT0RFX01BU0spIHwgVVNSX01PREU7CisKKyNpZmRlZiBDT05GSUdfQVJNX1RIVU1CCisJaWYgKGVsZl9od2NhcCAmIEhXQ0FQX1RIVU1CKSB7CisJCS8qCisJCSAqIFRoZSBMU0Igb2YgdGhlIGhhbmRsZXIgZGV0ZXJtaW5lcyBpZiB3ZSdyZSBnb2luZyB0bworCQkgKiBiZSB1c2luZyBUSFVNQiBvciBBUk0gbW9kZSBmb3IgdGhpcyBzaWduYWwgaGFuZGxlci4KKwkJICovCisJCXRodW1iID0gaGFuZGxlciAmIDE7CisKKwkJaWYgKHRodW1iKQorCQkJY3BzciB8PSBQU1JfVF9CSVQ7CisJCWVsc2UKKwkJCWNwc3IgJj0gflBTUl9UX0JJVDsKKwl9CisjZW5kaWYKKworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikgeworCQlyZXRjb2RlID0gKHVuc2lnbmVkIGxvbmcpa2EtPnNhLnNhX3Jlc3RvcmVyOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBpZHggPSB0aHVtYjsKKworCQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKwkJCWlkeCArPSAyOworCisJCWlmIChfX3B1dF91c2VyKHJldGNvZGVzW2lkeF0sIHJjKSkKKwkJCXJldHVybiAxOworCisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBzZWVzCisJCSAqIHRoZSByZXR1cm4gY29kZSB3cml0dGVuIG9udG8gdGhlIHN0YWNrLgorCQkgKi8KKwkJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKXJjLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKShyYyArIDEpKTsKKworCQlyZXRjb2RlID0gKCh1bnNpZ25lZCBsb25nKXJjKSArIHRodW1iOworCX0KKworCXJlZ3MtPkFSTV9yMCA9IHVzaWc7CisJcmVncy0+QVJNX3NwID0gKHVuc2lnbmVkIGxvbmcpZnJhbWU7CisJcmVncy0+QVJNX2xyID0gcmV0Y29kZTsKKwlyZWdzLT5BUk1fcGMgPSBoYW5kbGVyOworCXJlZ3MtPkFSTV9jcHNyID0gY3BzcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZXR1cF9mcmFtZShpbnQgdXNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZnJhbWUpCisJCXJldHVybiAxOworCisJZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT5zYywgJmZyYW1lLT5hdXgsIHJlZ3MsIHNldC0+c2lnWzBdKTsKKworCWlmIChfTlNJR19XT1JEUyA+IDEpIHsKKwkJZXJyIHw9IF9fY29weV90b191c2VyKGZyYW1lLT5leHRyYW1hc2ssICZzZXQtPnNpZ1sxXSwKKwkJCQkgICAgICBzaXplb2YoZnJhbWUtPmV4dHJhbWFzaykpOworCX0KKworCWlmIChlcnIgPT0gMCkKKwkJZXJyID0gc2V0dXBfcmV0dXJuKHJlZ3MsIGthLCAmZnJhbWUtPnJldGNvZGUsIGZyYW1lLCB1c2lnKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3NldHVwX3J0X2ZyYW1lKGludCB1c2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCisJICAgICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisJc3RhY2tfdCBzdGFjazsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZnJhbWUpCisJCXJldHVybiAxOworCisJX19wdXRfdXNlcl9lcnJvcigmZnJhbWUtPmluZm8sICZmcmFtZS0+cGluZm8sIGVycik7CisJX19wdXRfdXNlcl9lcnJvcigmZnJhbWUtPnVjLCAmZnJhbWUtPnB1YywgZXJyKTsKKwllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKKworCV9fcHV0X3VzZXJfZXJyb3IoMCwgJmZyYW1lLT51Yy51Y19mbGFncywgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKE5VTEwsICZmcmFtZS0+dWMudWNfbGluaywgZXJyKTsKKworCW1lbXNldCgmc3RhY2ssIDAsIHNpemVvZihzdGFjaykpOworCXN0YWNrLnNzX3NwID0gKHZvaWQgX191c2VyICopY3VycmVudC0+c2FzX3NzX3NwOworCXN0YWNrLnNzX2ZsYWdzID0gc2FzX3NzX2ZsYWdzKHJlZ3MtPkFSTV9zcCk7CisJc3RhY2suc3Nfc2l6ZSA9IGN1cnJlbnQtPnNhc19zc19zaXplOworCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3N0YWNrLCAmc3RhY2ssIHNpemVvZihzdGFjaykpOworCisJZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmZyYW1lLT5hdXgsCisJCQkJcmVncywgc2V0LT5zaWdbMF0pOworCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKKworCWlmIChlcnIgPT0gMCkKKwkJZXJyID0gc2V0dXBfcmV0dXJuKHJlZ3MsIGthLCAmZnJhbWUtPnJldGNvZGUsIGZyYW1lLCB1c2lnKTsKKworCWlmIChlcnIgPT0gMCkgeworCQkvKgorCQkgKiBGb3IgcmVhbHRpbWUgc2lnbmFscyB3ZSBtdXN0IGFsc28gc2V0IHRoZSBzZWNvbmQgYW5kIHRoaXJkCisJCSAqIGFyZ3VtZW50cyBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyLgorCQkgKiAgIC0tIFBldGVyIE1heWRlbGwgPHBtYXlkZWxsQGNoaWFyay5ncmVlbmVuZC5vcmcudWs+IDIwMDAtMTItMDYKKwkJICovCisJCXJlZ3MtPkFSTV9yMSA9ICh1bnNpZ25lZCBsb25nKSZmcmFtZS0+aW5mbzsKKwkJcmVncy0+QVJNX3IyID0gKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT51YzsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdGFydF9zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPkFSTV9yMCA9IHJlZ3MtPkFSTV9PUklHX3IwOworCXJlZ3MtPkFSTV9wYyAtPSB0aHVtYl9tb2RlKHJlZ3MpID8gMiA6IDQ7Cit9CisKKy8qCisgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCisgKi8JCitzdGF0aWMgdm9pZAoraGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkgICAgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsCisJICAgICAgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgc3lzY2FsbCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJaW50IHVzaWcgPSBzaWc7CisJaW50IHJldDsKKworCS8qCisJICogSWYgd2Ugd2VyZSBmcm9tIGEgc3lzdGVtIGNhbGwsIGNoZWNrIGZvciBzeXN0ZW0gY2FsbCByZXN0YXJ0aW5nLi4uCisJICovCisJaWYgKHN5c2NhbGwpIHsKKwkJc3dpdGNoIChyZWdzLT5BUk1fcjApIHsKKwkJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKKwkJCXJlZ3MtPkFSTV9yMCA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSB7CisJCQkJcmVncy0+QVJNX3IwID0gLUVJTlRSOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQlyZXN0YXJ0X3N5c2NhbGwocmVncyk7CisJCX0KKwl9CisKKwkvKgorCSAqIHRyYW5zbGF0ZSB0aGUgc2lnbmFsCisJICovCisJaWYgKHVzaWcgPCAzMiAmJiB0aHJlYWQtPmV4ZWNfZG9tYWluICYmIHRocmVhZC0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXApCisJCXVzaWcgPSB0aHJlYWQtPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3VzaWddOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lCisJICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCisJCXJldCA9IHNldHVwX3J0X2ZyYW1lKHVzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOworCWVsc2UKKwkJcmV0ID0gc2V0dXBfZnJhbWUodXNpZywga2EsIG9sZHNldCwgcmVncyk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIHJlc3VsdGluZyByZWdpc3RlcnMgYXJlIGFjdHVhbGx5IHNhbmUuCisJICovCisJcmV0IHw9ICF2YWxpZF91c2VyX3JlZ3MocmVncyk7CisKKwkvKgorCSAqIEJsb2NrIHRoZSBzaWduYWwgaWYgd2Ugd2VyZSB1bnN1Y2Nlc3NmdWwuCisJICovCisJaWYgKHJldCAhPSAwIHx8ICEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpIHsKKwkJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJc2lnb3JzZXRzKCZ0c2stPmJsb2NrZWQsICZ0c2stPmJsb2NrZWQsCisJCQkgICZrYS0+c2Euc2FfbWFzayk7CisJCXNpZ2FkZHNldCgmdHNrLT5ibG9ja2VkLCBzaWcpOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJfQorCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm47CisKKwlmb3JjZV9zaWdzZWd2KHNpZywgdHNrKTsKK30KKworLyoKKyAqIE5vdGUgdGhhdCAnaW5pdCcgaXMgYSBzcGVjaWFsIHByb2Nlc3M6IGl0IGRvZXNuJ3QgZ2V0IHNpZ25hbHMgaXQgZG9lc24ndAorICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5CisgKiBtaXN0YWtlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBnbyB0aHJvdWdoIHRoZSBzaWduYWxzIHR3aWNlOiBvbmNlIHRvIGNoZWNrIHRoZSBzaWduYWxzIHRoYXQKKyAqIHRoZSBrZXJuZWwgY2FuIGhhbmRsZSwgYW5kIHRoZW4gd2UgYnVpbGQgYWxsIHRoZSB1c2VyLWxldmVsIHNpZ25hbCBoYW5kbGluZworICogc3RhY2stZnJhbWVzIGluIG9uZSBnbyBhZnRlciB0aGF0LgorICovCitzdGF0aWMgaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHN5c2NhbGwpCit7CisJc3RydWN0IGtfc2lnYWN0aW9uIGthOworCXNpZ2luZm9fdCBpbmZvOworCWludCBzaWducjsKKworCS8qCisJICogV2Ugd2FudCB0aGUgY29tbW9uIGNhc2UgdG8gZ28gZmFzdCwgd2hpY2gKKwkgKiBpcyB3aHkgd2UgbWF5IGluIGNlcnRhaW4gY2FzZXMgZ2V0IGhlcmUgZnJvbQorCSAqIGtlcm5lbCBtb2RlLiBKdXN0IHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nCisJICogaWYgc28uCisJICovCisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXJldHVybiAwOworCisJaWYgKHRyeV90b19mcmVlemUoMCkpCisJCWdvdG8gbm9fc2lnbmFsOworCisJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1NJTkdMRVNURVApCisJCXB0cmFjZV9jYW5jZWxfYnB0KGN1cnJlbnQpOworCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisJaWYgKHNpZ25yID4gMCkgeworCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MsIHN5c2NhbGwpOworCQlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfU0lOR0xFU1RFUCkKKwkJCXB0cmFjZV9zZXRfYnB0KGN1cnJlbnQpOworCQlyZXR1cm4gMTsKKwl9CisKKyBub19zaWduYWw6CisJLyoKKwkgKiBObyBzaWduYWwgdG8gZGVsaXZlciB0byB0aGUgcHJvY2VzcyAtIHJlc3RhcnQgdGhlIHN5c2NhbGwuCisJICovCisJaWYgKHN5c2NhbGwpIHsKKwkJaWYgKHJlZ3MtPkFSTV9yMCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSB7CisJCQlpZiAodGh1bWJfbW9kZShyZWdzKSkgeworCQkJCXJlZ3MtPkFSTV9yNyA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOworCQkJCXJlZ3MtPkFSTV9wYyAtPSAyOworCQkJfSBlbHNlIHsKKwkJCQl1MzIgX191c2VyICp1c3A7CisKKwkJCQlyZWdzLT5BUk1fc3AgLT0gMTI7CisJCQkJdXNwID0gKHUzMiBfX3VzZXIgKilyZWdzLT5BUk1fc3A7CisKKwkJCQlwdXRfdXNlcihyZWdzLT5BUk1fcGMsICZ1c3BbMF0pOworCQkJCS8qIHN3aSBfX05SX3Jlc3RhcnRfc3lzY2FsbCAqLworCQkJCXB1dF91c2VyKDB4ZWYwMDAwMDAgfCBfX05SX3Jlc3RhcnRfc3lzY2FsbCwgJnVzcFsxXSk7CisJCQkJLyogbGRyCXBjLCBbc3BdLCAjMTIgKi8KKwkJCQlwdXRfdXNlcigweGU0OWRmMDBjLCAmdXNwWzJdKTsKKworCQkJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl1c3AsCisJCQkJCQkgICAodW5zaWduZWQgbG9uZykodXNwICsgMykpOworCisJCQkJcmVncy0+QVJNX3BjID0gcmVncy0+QVJNX3NwICsgNDsKKwkJCX0KKwkJfQorCQlpZiAocmVncy0+QVJNX3IwID09IC1FUkVTVEFSVE5PSEFORCB8fAorCQkgICAgcmVncy0+QVJNX3IwID09IC1FUkVTVEFSVFNZUyB8fAorCQkgICAgcmVncy0+QVJNX3IwID09IC1FUkVTVEFSVE5PSU5UUikgeworCQkJcmVzdGFydF9zeXNjYWxsKHJlZ3MpOworCQl9CisJfQorCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9TSU5HTEVTVEVQKQorCQlwdHJhY2Vfc2V0X2JwdChjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSB2b2lkCitkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgdGhyZWFkX2ZsYWdzLCBpbnQgc3lzY2FsbCkKK3sKKwlpZiAodGhyZWFkX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQorCQlkb19zaWduYWwoJmN1cnJlbnQtPmJsb2NrZWQsIHJlZ3MsIHN5c2NhbGwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzhjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL3NtcC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTGltaXRlZCwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKKy8qCisgKiBiaXRtYXNrIG9mIHByZXNlbnQgYW5kIG9ubGluZSBDUFVzLgorICogVGhlIHByZXNlbnQgYml0bWFzayBpbmRpY2F0ZXMgdGhhdCB0aGUgQ1BVIGlzIHBoeXNpY2FsbHkgcHJlc2VudC4KKyAqIFRoZSBvbmxpbmUgYml0bWFzayBpbmRpY2F0ZXMgdGhhdCB0aGUgQ1BVIGlzIHVwIGFuZCBydW5uaW5nLgorICovCitjcHVtYXNrX3QgY3B1X3ByZXNlbnRfbWFzazsKK2NwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKKworLyoKKyAqIHN0cnVjdHVyZXMgZm9yIGludGVyLXByb2Nlc3NvciBjYWxscworICogLSBBIGNvbGxlY3Rpb24gb2Ygc2luZ2xlIGJpdCBpcGkgbWVzc2FnZXMuCisgKi8KK3N0cnVjdCBpcGlfZGF0YSB7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGxvbmcgaXBpX2NvdW50OworCXVuc2lnbmVkIGxvbmcgYml0czsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXBpX2RhdGEsIGlwaV9kYXRhKSA9IHsKKwkubG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKK307CisKK2VudW0gaXBpX21zZ190eXBlIHsKKwlJUElfVElNRVIsCisJSVBJX1JFU0NIRURVTEUsCisJSVBJX0NBTExfRlVOQywKKwlJUElfQ1BVX1NUT1AsCit9OworCitzdHJ1Y3Qgc21wX2NhbGxfc3RydWN0IHsKKwl2b2lkICgqZnVuYykodm9pZCAqaW5mbyk7CisJdm9pZCAqaW5mbzsKKwlpbnQgd2FpdDsKKwljcHVtYXNrX3QgcGVuZGluZzsKKwljcHVtYXNrX3QgdW5maW5pc2hlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21wX2NhbGxfc3RydWN0ICogdm9sYXRpbGUgc21wX2NhbGxfZnVuY3Rpb25fZGF0YTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc21wX2NhbGxfZnVuY3Rpb25fbG9jayk7CisKK2ludCBfX2luaXQgX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisJaW50IHJldDsKKworCS8qCisJICogU3Bhd24gYSBuZXcgcHJvY2VzcyBtYW51YWxseS4gIEdyYWIgYSBwb2ludGVyIHRvCisJICogaXRzIHRhc2sgc3RydWN0IHNvIHdlIGNhbiBtZXNzIHdpdGggaXQKKwkgKi8KKwlpZGxlID0gZm9ya19pZGxlKGNwdSk7CisJaWYgKElTX0VSUihpZGxlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNQVSV1OiBmb3JrKCkgZmFpbGVkXG4iLCBjcHUpOworCQlyZXR1cm4gUFRSX0VSUihpZGxlKTsKKwl9CisKKwkvKgorCSAqIE5vdyBicmluZyB0aGUgQ1BVIGludG8gb3VyIHdvcmxkLgorCSAqLworCXJldCA9IGJvb3Rfc2Vjb25kYXJ5KGNwdSwgaWRsZSk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9DUklUICJjcHVfdXA6IHByb2Nlc3NvciAlZCBmYWlsZWQgdG8gYm9vdFxuIiwgY3B1KTsKKwkJLyoKKwkJICogRklYTUU6IFdlIG5lZWQgdG8gY2xlYW4gdXAgdGhlIG5ldyBpZGxlIHRocmVhZC4gLS1ybWsKKwkJICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGxlZCBieSBib3RoIGJvb3QgYW5kIHNlY29uZGFyaWVzIHRvIG1vdmUgZ2xvYmFsIGRhdGEgaW50bworICogcGVyLXByb2Nlc3NvciBzdG9yYWdlLgorICovCit2b2lkIF9faW5pdCBzbXBfc3RvcmVfY3B1X2luZm8odW5zaWduZWQgaW50IGNwdWlkKQoreworCXN0cnVjdCBjcHVpbmZvX2FybSAqY3B1X2luZm8gPSAmcGVyX2NwdShjcHVfZGF0YSwgY3B1aWQpOworCisJY3B1X2luZm8tPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKK30KKwordm9pZCBfX2luaXQgc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJaW50IGNwdTsKKwl1bnNpZ25lZCBsb25nIGJvZ29zdW0gPSAwOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWJvZ29zdW0gKz0gcGVyX2NwdShjcHVfZGF0YSwgY3B1KS5sb29wc19wZXJfamlmZnk7CisKKwlwcmludGsoS0VSTl9JTkZPICJTTVA6IFRvdGFsIG9mICVkIHByb2Nlc3NvcnMgYWN0aXZhdGVkICIKKwkgICAgICAgIiglbHUuJTAybHUgQm9nb01JUFMpLlxuIiwKKwkgICAgICAgbnVtX29ubGluZV9jcHVzKCksCisJICAgICAgIGJvZ29zdW0gLyAoNTAwMDAwL0haKSwKKwkgICAgICAgKGJvZ29zdW0gLyAoNTAwMC9IWikpICUgMTAwKTsKK30KKwordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJY3B1X3NldChjcHUsIGNwdV9wcmVzZW50X21hc2spOworCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfaXBpX21lc3NhZ2UoY3B1bWFza190IGNhbGxtYXAsIGVudW0gaXBpX21zZ190eXBlIG1zZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjcHU7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKKwkJc3RydWN0IGlwaV9kYXRhICppcGkgPSAmcGVyX2NwdShpcGlfZGF0YSwgY3B1KTsKKworCQlzcGluX2xvY2soJmlwaS0+bG9jayk7CisJCWlwaS0+Yml0cyB8PSAxIDw8IG1zZzsKKwkJc3Bpbl91bmxvY2soJmlwaS0+bG9jayk7CisJfQorCisJLyoKKwkgKiBDYWxsIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBjcm9zcy1DUFUgY2FsbCBmdW5jdGlvbi4KKwkgKi8KKwlzbXBfY3Jvc3NfY2FsbChjYWxsbWFwKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIFlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLCBmcm9tIGEKKyAqIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyLCBub3IgZnJvbSBhIGJvdHRvbSBoYWxmIGhhbmRsZXIuCisgKi8KK2ludCBzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUodm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgcmV0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3YWl0LCBjcHVtYXNrX3QgY2FsbG1hcCkKK3sKKwlzdHJ1Y3Qgc21wX2NhbGxfc3RydWN0IGRhdGE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXQgPSAwOworCisJZGF0YS5mdW5jID0gZnVuYzsKKwlkYXRhLmluZm8gPSBpbmZvOworCWRhdGEud2FpdCA9IHdhaXQ7CisKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjYWxsbWFwKTsKKwlpZiAoY3B1c19lbXB0eShjYWxsbWFwKSkKKwkJZ290byBvdXQ7CisKKwlkYXRhLnBlbmRpbmcgPSBjYWxsbWFwOworCWlmICh3YWl0KQorCQlkYXRhLnVuZmluaXNoZWQgPSBjYWxsbWFwOworCisJLyoKKwkgKiB0cnkgdG8gZ2V0IHRoZSBtdXRleCBvbiBzbXBfY2FsbF9mdW5jdGlvbl9kYXRhCisJICovCisJc3Bpbl9sb2NrKCZzbXBfY2FsbF9mdW5jdGlvbl9sb2NrKTsKKwlzbXBfY2FsbF9mdW5jdGlvbl9kYXRhID0gJmRhdGE7CisKKwlzZW5kX2lwaV9tZXNzYWdlKGNhbGxtYXAsIElQSV9DQUxMX0ZVTkMpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwl3aGlsZSAoIWNwdXNfZW1wdHkoZGF0YS5wZW5kaW5nKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJYmFycmllcigpOworCisJLyoKKwkgKiBkaWQgd2UgdGltZSBvdXQ/CisJICovCisJaWYgKCFjcHVzX2VtcHR5KGRhdGEucGVuZGluZykpIHsKKwkJLyoKKwkJICogdGhpcyBtYXkgYmUgY2F1c2luZyBvdXIgcGFuaWMgLSByZXBvcnQgaXQKKwkJICovCisJCXByaW50ayhLRVJOX0NSSVQKKwkJICAgICAgICJDUFUldTogc21wX2NhbGxfZnVuY3Rpb24gdGltZW91dCBmb3IgJXAoJXApXG4iCisJCSAgICAgICAiICAgICAgY2FsbG1hcCAlbHggcGVuZGluZyAlbHgsICVzd2FpdFxuIiwKKwkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgZnVuYywgaW5mbywgY2FsbG1hcCwgZGF0YS5wZW5kaW5nLAorCQkgICAgICAgd2FpdCA/ICIiIDogIm5vICIpOworCisJCS8qCisJCSAqIFRSQUNFCisJCSAqLworCQl0aW1lb3V0ID0gamlmZmllcyArICg1ICogSFopOworCQl3aGlsZSAoIWNwdXNfZW1wdHkoZGF0YS5wZW5kaW5nKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJhcnJpZXIoKTsKKworCQlpZiAoY3B1c19lbXB0eShkYXRhLnBlbmRpbmcpKQorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiICAgICBSRVNPTFZFRFxuIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0NSSVQgIiAgICAgU1RJTEwgU1RVQ0tcbiIpOworCX0KKworCS8qCisJICogd2hhdGV2ZXIgaGFwcGVuZWQsIHdlJ3JlIGRvbmUgd2l0aCB0aGUgZGF0YSwgc28gcmVsZWFzZSBpdAorCSAqLworCXNtcF9jYWxsX2Z1bmN0aW9uX2RhdGEgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZzbXBfY2FsbF9mdW5jdGlvbl9sb2NrKTsKKworCWlmICghY3B1c19lbXB0eShkYXRhLnBlbmRpbmcpKSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh3YWl0KQorCQl3aGlsZSAoIWNwdXNfZW1wdHkoZGF0YS51bmZpbmlzaGVkKSkKKwkJCWJhcnJpZXIoKTsKKyBvdXQ6CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNtcF9jYWxsX2Z1bmN0aW9uKHZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IHJldHJ5LAorICAgICAgICAgICAgICAgICAgICAgIGludCB3YWl0KQoreworCXJldHVybiBzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUoZnVuYywgaW5mbywgcmV0cnksIHdhaXQsCisJCQkJCWNwdV9vbmxpbmVfbWFwKTsKK30KKwordm9pZCBzaG93X2lwaV9saXN0KHN0cnVjdCBzZXFfZmlsZSAqcCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJc2VxX3B1dHMocCwgIklQSToiKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlzZXFfcHJpbnRmKHAsICIgJTEwbHUiLCBwZXJfY3B1KGlwaV9kYXRhLCBjcHUpLmlwaV9jb3VudCk7CisKKwlzZXFfcHV0YyhwLCAnXG4nKTsKK30KKworc3RhdGljIHZvaWQgaXBpX3RpbWVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCB1c2VyID0gdXNlcl9tb2RlKHJlZ3MpOworCisJaXJxX2VudGVyKCk7CisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOworCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXIpOworCWlycV9leGl0KCk7Cit9CisKKy8qCisgKiBpcGlfY2FsbF9mdW5jdGlvbiAtIGhhbmRsZSBJUEkgZnJvbSBzbXBfY2FsbF9mdW5jdGlvbigpCisgKgorICogTm90ZSB0aGF0IHdlIGNvcHkgZGF0YSBvdXQgb2YgdGhlIGNyb3NzLWNhbGwgc3RydWN0dXJlIGFuZCB0aGVuCisgKiBsZXQgdGhlIGNhbGxlciBrbm93IHRoYXQgd2UncmUgaGVyZSBhbmQgaGF2ZSBkb25lIHdpdGggdGhlaXIgZGF0YQorICovCitzdGF0aWMgdm9pZCBpcGlfY2FsbF9mdW5jdGlvbih1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBzbXBfY2FsbF9zdHJ1Y3QgKmRhdGEgPSBzbXBfY2FsbF9mdW5jdGlvbl9kYXRhOworCXZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSA9IGRhdGEtPmZ1bmM7CisJdm9pZCAqaW5mbyA9IGRhdGEtPmluZm87CisJaW50IHdhaXQgPSBkYXRhLT53YWl0OworCisJY3B1X2NsZWFyKGNwdSwgZGF0YS0+cGVuZGluZyk7CisKKwlmdW5jKGluZm8pOworCisJaWYgKHdhaXQpCisJCWNwdV9jbGVhcihjcHUsIGRhdGEtPnVuZmluaXNoZWQpOworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN0b3BfbG9jayk7CisKKy8qCisgKiBpcGlfY3B1X3N0b3AgLSBoYW5kbGUgSVBJIGZyb20gc21wX3NlbmRfc3RvcCgpCisgKi8KK3N0YXRpYyB2b2lkIGlwaV9jcHVfc3RvcCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXNwaW5fbG9jaygmc3RvcF9sb2NrKTsKKwlwcmludGsoS0VSTl9DUklUICJDUFUldTogc3RvcHBpbmdcbiIsIGNwdSk7CisJZHVtcF9zdGFjaygpOworCXNwaW5fdW5sb2NrKCZzdG9wX2xvY2spOworCisJY3B1X2NsZWFyKGNwdSwgY3B1X29ubGluZV9tYXApOworCisJbG9jYWxfZmlxX2Rpc2FibGUoKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJd2hpbGUgKDEpCisJCWNwdV9yZWxheCgpOworfQorCisvKgorICogTWFpbiBoYW5kbGVyIGZvciBpbnRlci1wcm9jZXNzb3IgaW50ZXJydXB0cworICoKKyAqIEZvciBBUk0sIHRoZSBpcGltYXNrIG5vdyBvbmx5IGlkZW50aWZpZXMgYSBzaW5nbGUKKyAqIGNhdGVnb3J5IG9mIElQSSAoQml0IDEgSVBJcyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgYQorICogZGlmZmVyZW50IG1lY2hhbmlzbSk6CisgKgorICogIEJpdCAwIC0gSW50ZXItcHJvY2Vzc29yIGZ1bmN0aW9uIGNhbGwKKyAqLwordm9pZCBkb19JUEkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgaXBpX2RhdGEgKmlwaSA9ICZwZXJfY3B1KGlwaV9kYXRhLCBjcHUpOworCisJaXBpLT5pcGlfY291bnQrKzsKKworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgbG9uZyBtc2dzOworCisJCXNwaW5fbG9jaygmaXBpLT5sb2NrKTsKKwkJbXNncyA9IGlwaS0+Yml0czsKKwkJaXBpLT5iaXRzID0gMDsKKwkJc3Bpbl91bmxvY2soJmlwaS0+bG9jayk7CisKKwkJaWYgKCFtc2dzKQorCQkJYnJlYWs7CisKKwkJZG8geworCQkJdW5zaWduZWQgbmV4dG1zZzsKKworCQkJbmV4dG1zZyA9IG1zZ3MgJiAtbXNnczsKKwkJCW1zZ3MgJj0gfm5leHRtc2c7CisJCQluZXh0bXNnID0gZmZ6KH5uZXh0bXNnKTsKKworCQkJc3dpdGNoIChuZXh0bXNnKSB7CisJCQljYXNlIElQSV9USU1FUjoKKwkJCQlpcGlfdGltZXIocmVncyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSVBJX1JFU0NIRURVTEU6CisJCQkJLyoKKwkJCQkgKiBub3RoaW5nIG1vcmUgdG8gZG8gLSBldmV5dGhpbmcgaXMKKwkJCQkgKiBkb25lIG9uIHRoZSBpbnRlcnJ1cHQgcmV0dXJuIHBhdGgKKwkJCQkgKi8KKwkJCQlicmVhazsKKworCQkJY2FzZSBJUElfQ0FMTF9GVU5DOgorCQkJCWlwaV9jYWxsX2Z1bmN0aW9uKGNwdSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSVBJX0NQVV9TVE9QOgorCQkJCWlwaV9jcHVfc3RvcChjcHUpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0NSSVQgIkNQVSV1OiBVbmtub3duIElQSSBtZXNzYWdlIDB4JXhcbiIsCisJCQkJICAgICAgIGNwdSwgbmV4dG1zZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKG1zZ3MpOworCX0KK30KKwordm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCit7CisJc2VuZF9pcGlfbWVzc2FnZShjcHVtYXNrX29mX2NwdShjcHUpLCBJUElfUkVTQ0hFRFVMRSk7Cit9CisKK3ZvaWQgc21wX3NlbmRfdGltZXIodm9pZCkKK3sKKwljcHVtYXNrX3QgbWFzayA9IGNwdV9vbmxpbmVfbWFwOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIG1hc2spOworCXNlbmRfaXBpX21lc3NhZ2UobWFzaywgSVBJX1RJTUVSKTsKK30KKwordm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKKwlzZW5kX2lwaV9tZXNzYWdlKG1hc2ssIElQSV9DUFVfU1RPUCk7Cit9CisKKy8qCisgKiBub3Qgc3VwcG9ydGVkIGhlcmUKKyAqLworaW50IF9faW5pdCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jIGIvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFkYzYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYwpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCisgKgorICogIENvcHlyaWdodCAoQykgUGVvcGxlIHdobyB3cm90ZSBsaW51eC9hcmNoL2kzODYva2VybmVsL3N5c19pMzg2LmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgUnVzc2VsbCBLaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB2YXJpb3VzIHJhbmRvbSBzeXN0ZW0gY2FsbHMgdGhhdAorICogIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbGluZyBzZXF1ZW5jZSBvbiB0aGUgTGludXgvYXJtCisgKiAgcGxhdGZvcm0uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2VtLmg+CisjaW5jbHVkZSA8bGludXgvbXNnLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lwYy5oPgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBkb19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIG9sZF9sZW4sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBuZXdfbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpOworCisvKgorICogc3lzX3BpcGUoKSBpcyB0aGUgbm9ybWFsIEMgY2FsbGluZyBzdGFuZGFyZCBmb3IgY3JlYXRpbmcKKyAqIGEgcGlwZS4gSXQncyBub3QgdGhlIHdheSB1bml4IHRyYWRpdGlvbmFsbHkgZG9lcyB0aGlzLCB0aG91Z2guCisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19waXBlKHVuc2lnbmVkIGxvbmcgX191c2VyICpmaWxkZXMpCit7CisJaW50IGZkWzJdOworCWludCBlcnJvcjsKKworCWVycm9yID0gZG9fcGlwZShmZCk7CisJaWYgKCFlcnJvcikgeworCQlpZiAoY29weV90b191c2VyKGZpbGRlcywgZmQsIDIqc2l6ZW9mKGludCkpKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBsb3dlc3QgdmlydHVhbCBhZGRyZXNzIHdlIGNhbiBwZXJtaXQgYW55IHVzZXIgc3BhY2UKKyAqIG1hcHBpbmcgdG8gYmUgbWFwcGVkIGF0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvcgorICogbm9uLWhpZ2ggdmVjdG9yIENQVXMuCisgKi8KKyNkZWZpbmUgTUlOX01BUF9BRERSCShQQUdFX1NJWkUpCisKKy8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLworaW5saW5lIGxvbmcgZG9fbW1hcDIoCisJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisKKwlpZiAoZmxhZ3MgJiBNQVBfRklYRUQgJiYgYWRkciA8IE1JTl9NQVBfQUREUikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FQkFERjsKKwlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7CisJCWZpbGUgPSBmZ2V0KGZkKTsKKwkJaWYgKCFmaWxlKQorCQkJZ290byBvdXQ7CisJfQorCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKGZpbGUpCisJCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBwcm90OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKK307CisKK2FzbWxpbmthZ2UgaW50IG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCit7CisJaW50IGVycm9yID0gLUVGQVVMVDsKKwlzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IGE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKGEub2Zmc2V0ICYgflBBR0VfTUFTSykKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKK3N5c19hcm1fbXJlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBvbGRfbGVuLAorCSAgICAgICB1bnNpZ25lZCBsb25nIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSAtRUlOVkFMOworCisJaWYgKGZsYWdzICYgTVJFTUFQX0ZJWEVEICYmIG5ld19hZGRyIDwgTUlOX01BUF9BRERSKQorCQlnb3RvIG91dDsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0ID0gZG9fbXJlbWFwKGFkZHIsIG9sZF9sZW4sIG5ld19sZW4sIGZsYWdzLCBuZXdfYWRkcik7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCisgKiBjYWxscy4KKyAqLworCitzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbjsKKwlmZF9zZXQgX191c2VyICppbnAsICpvdXRwLCAqZXhwOworCXN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHZwOworfTsKKworYXNtbGlua2FnZSBpbnQgb2xkX3NlbGVjdChzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCit7CisJc3RydWN0IHNlbF9hcmdfc3RydWN0IGE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJLyogc3lzX3NlbGVjdCgpIGRvZXMgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBsb2NraW5nICovCisJcmV0dXJuIHN5c19zZWxlY3QoYS5uLCBhLmlucCwgYS5vdXRwLCBhLmV4cCwgYS50dnApOworfQorCisvKgorICogc3lzX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzLi4KKyAqCisgKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgorICovCithc21saW5rYWdlIGludCBzeXNfaXBjKHVpbnQgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsCisJCSAgICAgICB2b2lkIF9fdXNlciAqcHRyLCBsb25nIGZpZnRoKQoreworCWludCB2ZXJzaW9uLCByZXQ7CisKKwl2ZXJzaW9uID0gY2FsbCA+PiAxNjsgLyogaGFjayBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCWNhbGwgJj0gMHhmZmZmOworCisJc3dpdGNoIChjYWxsKSB7CisJY2FzZSBTRU1PUDoKKwkJcmV0dXJuIHN5c19zZW10aW1lZG9wIChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopcHRyLCBzZWNvbmQsIE5VTEwpOworCWNhc2UgU0VNVElNRURPUDoKKwkJcmV0dXJuIHN5c19zZW10aW1lZG9wKGZpcnN0LCAoc3RydWN0IHNlbWJ1ZiBfX3VzZXIgKilwdHIsIHNlY29uZCwKKwkJCQkJKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKilmaWZ0aCk7CisKKwljYXNlIFNFTUdFVDoKKwkJcmV0dXJuIHN5c19zZW1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKKwljYXNlIFNFTUNUTDogeworCQl1bmlvbiBzZW11biBmb3VydGg7CisJCWlmICghcHRyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcihmb3VydGguX19wYWQsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKSBwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBzeXNfc2VtY3RsIChmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm91cnRoKTsKKwl9CisKKwljYXNlIE1TR1NORDoKKwkJcmV0dXJuIHN5c19tc2dzbmQoZmlyc3QsIChzdHJ1Y3QgbXNnYnVmIF9fdXNlciAqKSBwdHIsIAorCQkJCSAgc2Vjb25kLCB0aGlyZCk7CisJY2FzZSBNU0dSQ1Y6CisJCXN3aXRjaCAodmVyc2lvbikgeworCQljYXNlIDA6IHsKKwkJCXN0cnVjdCBpcGNfa2x1ZGdlIHRtcDsKKwkJCWlmICghcHRyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsKHN0cnVjdCBpcGNfa2x1ZGdlIF9fdXNlciAqKXB0ciwKKwkJCQkJICAgc2l6ZW9mICh0bXApKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBzeXNfbXNncmN2IChmaXJzdCwgdG1wLm1zZ3AsIHNlY29uZCwKKwkJCQkJICAgdG1wLm1zZ3R5cCwgdGhpcmQpOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gc3lzX21zZ3JjdiAoZmlyc3QsCisJCQkJCSAgIChzdHJ1Y3QgbXNnYnVmIF9fdXNlciAqKSBwdHIsCisJCQkJCSAgIHNlY29uZCwgZmlmdGgsIHRoaXJkKTsKKwkJfQorCWNhc2UgTVNHR0VUOgorCQlyZXR1cm4gc3lzX21zZ2dldCAoKGtleV90KSBmaXJzdCwgc2Vjb25kKTsKKwljYXNlIE1TR0NUTDoKKwkJcmV0dXJuIHN5c19tc2djdGwoZmlyc3QsIHNlY29uZCwgKHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIgKilwdHIpOworCisJY2FzZSBTSE1BVDoKKwkJc3dpdGNoICh2ZXJzaW9uKSB7CisJCWRlZmF1bHQ6IHsKKwkJCXVsb25nIHJhZGRyOworCQkJcmV0ID0gZG9fc2htYXQoZmlyc3QsIChjaGFyIF9fdXNlciAqKXB0ciwgc2Vjb25kLCAmcmFkZHIpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIHB1dF91c2VyKHJhZGRyLCAodWxvbmcgX191c2VyICopdGhpcmQpOworCQl9CisJCWNhc2UgMTogLyogT2YgY291cnNlLCB3ZSBkb24ndCBzdXBwb3J0IGlCQ1MyISAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwljYXNlIFNITURUOiAKKwkJcmV0dXJuIHN5c19zaG1kdCAoKGNoYXIgX191c2VyICopcHRyKTsKKwljYXNlIFNITUdFVDoKKwkJcmV0dXJuIHN5c19zaG1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKKwljYXNlIFNITUNUTDoKKwkJcmV0dXJuIHN5c19zaG1jdGwgKGZpcnN0LCBzZWNvbmQsCisJCQkJICAgKHN0cnVjdCBzaG1pZF9kcyBfX3VzZXIgKikgcHRyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2htYXQoaW50IHNobWlkLCBjaGFyIF9fdXNlciAqc2htYWRkciwgaW50IHNobWZsZywKKwkJCSAgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJbG9uZyBlcnI7CisKKwllcnIgPSBkb19zaG1hdChzaG1pZCwgc2htYWRkciwgc2htZmxnLCAmcmV0KTsKKwlpZiAoZXJyID09IDApCisJCWVyciA9IHB1dF91c2VyKHJldCwgYWRkcik7CisJcmV0dXJuIGVycjsKK30KKworLyogRm9yayBhIG5ldyB0YXNrIC0gdGhpcyBjcmVhdGVzIGEgbmV3IHByb2dyYW0gdGhyZWFkLgorICogVGhpcyBpcyBjYWxsZWQgaW5kaXJlY3RseSB2aWEgYSBzbWFsbCB3cmFwcGVyCisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19mb3JrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiBkb19mb3JrKFNJR0NITEQsIHJlZ3MtPkFSTV9zcCwgcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qIENsb25lIGEgdGFzayAtIHRoaXMgY2xvbmVzIHRoZSBjYWxsaW5nIHByb2dyYW0gdGhyZWFkLgorICogVGhpcyBpcyBjYWxsZWQgaW5kaXJlY3RseSB2aWEgYSBzbWFsbCB3cmFwcGVyCisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19jbG9uZSh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIG5ld3NwLAorCQkJIGludCBfX3VzZXIgKnBhcmVudF90aWRwdHIsIGludCB0bHNfdmFsLAorCQkJIGludCBfX3VzZXIgKmNoaWxkX3RpZHB0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKCFuZXdzcCkKKwkJbmV3c3AgPSByZWdzLT5BUk1fc3A7CisKKwlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsIHJlZ3MsIDAsIHBhcmVudF90aWRwdHIsIGNoaWxkX3RpZHB0cik7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c192Zm9yayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gZG9fZm9yayhDTE9ORV9WRk9SSyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgcmVncy0+QVJNX3NwLCByZWdzLCAwLCBOVUxMLCBOVUxMKTsKK30KKworLyogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCisgKiBUaGlzIGlzIGNhbGxlZCBpbmRpcmVjdGx5IHZpYSBhIHNtYWxsIHdyYXBwZXIKKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqZmlsZW5hbWVpLCBjaGFyIF9fdXNlciAqIF9fdXNlciAqYXJndiwKKwkJCSAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmVudnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBlcnJvcjsKKwljaGFyICogZmlsZW5hbWU7CisKKwlmaWxlbmFtZSA9IGdldG5hbWUoZmlsZW5hbWVpKTsKKwllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOworCWlmIChJU19FUlIoZmlsZW5hbWUpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwgYXJndiwgZW52cCwgcmVncyk7CisJcHV0bmFtZShmaWxlbmFtZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitsb25nIGV4ZWN2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJaW50IHJldDsKKworCW1lbXNldCgmcmVncywgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJcmV0ID0gZG9fZXhlY3ZlKChjaGFyICopZmlsZW5hbWUsIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKWFyZ3YsCisJCQkoY2hhciBfX3VzZXIgKiBfX3VzZXIgKillbnZwLCAmcmVncyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTYXZlIGFyZ2MgdG8gdGhlIHJlZ2lzdGVyIHN0cnVjdHVyZSBmb3IgdXNlcnNwYWNlLgorCSAqLworCXJlZ3MuQVJNX3IwID0gcmV0OworCisJLyoKKwkgKiBXZSB3ZXJlIHN1Y2Nlc3NmdWwuICBXZSB3b24ndCBiZSByZXR1cm5pbmcgdG8gb3VyIGNhbGxlciwgYnV0CisJICogaW5zdGVhZCB0byB1c2VyIHNwYWNlIGJ5IG1hbmlwdWxhdGluZyB0aGUga2VybmVsIHN0YWNrLgorCSAqLworCWFzbSgJImFkZAlyMCwgJTAsICUxXG5cdCIKKwkJIm1vdglyMSwgJTJcblx0IgorCQkibW92CXIyLCAlM1xuXHQiCisJCSJibAltZW1tb3ZlXG5cdCIJLyogY29weSByZWdzIHRvIHRvcCBvZiBzdGFjayAqLworCQkibW92CXI4LCAjMFxuXHQiCS8qIG5vdCBhIHN5c2NhbGwgKi8KKwkJIm1vdglyOSwgJTBcblx0IgkvKiB0aHJlYWQgc3RydWN0dXJlICovCisJCSJtb3YJc3AsIHIwXG5cdCIJLyogcmVwb3NpdGlvbiBzdGFjayBwb2ludGVyICovCisJCSJiCXJldF90b191c2VyIgorCQk6CisJCTogInIiIChjdXJyZW50X3RocmVhZF9pbmZvKCkpLAorCQkgICJJciIgKFRIUkVBRF9TSVpFIC0gOCAtIHNpemVvZihyZWdzKSksCisJCSAgInIiICgmcmVncyksCisJCSAgIklyIiAoc2l6ZW9mKHJlZ3MpKQorCQk6ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJpcCIsICJtZW1vcnkiKTsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChleGVjdmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RpbWUuYyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzMmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL3RpbWUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKiAgTW9kaWZpY2F0aW9ucyBmb3IgQVJNIChDKSAxOTk0LTIwMDEgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUk0tc3BlY2lmaWMgdGltZSBoYW5kbGluZyBkZXRhaWxzOgorICogIHJlYWRpbmcgdGhlIFJUQyBhdCBib290dXAsIGV0Yy4uLgorICoKKyAqICAxOTk0LTA3LTAyICBBbGFuIE1vZHJhCisgKiAgICAgICAgICAgICAgZml4ZWQgc2V0X3J0Y19tbXNzLCBmaXhlZCB0aW1lLnllYXIgZm9yID49IDIwMDAsIG5ldyBta3RpbWUKKyAqICAxOTk4LTEyLTIwICBVcGRhdGVkIE5UUCBjb2RlIGFjY29yZGluZyB0byB0ZWNobmljYWwgbWVtb3JhbmR1bSBKYW4gJzk2CisgKiAgICAgICAgICAgICAgIkEgS2VybmVsIE1vZGVsIGZvciBQcmVjaXNpb24gVGltZWtlZXBpbmciIGJ5IERhdmUgTWlsbHMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCit1NjQgamlmZmllc182NCA9IElOSVRJQUxfSklGRklFUzsKKworRVhQT1JUX1NZTUJPTChqaWZmaWVzXzY0KTsKKworLyoKKyAqIE91ciBzeXN0ZW0gdGltZXIuCisgKi8KK3N0cnVjdCBzeXNfdGltZXIgKnN5c3RlbV90aW1lcjsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FsbF9qaWZmaWVzOworCisvKiB0aGlzIG5lZWRzIGEgYmV0dGVyIGhvbWUgKi8KK0RFRklORV9TUElOTE9DSyhydGNfbG9jayk7CisKKyNpZmRlZiBDT05GSUdfU0ExMTAwX1JUQ19NT0RVTEUKK0VYUE9SVF9TWU1CT0wocnRjX2xvY2spOworI2VuZGlmCisKKy8qIGNoYW5nZSB0aGlzIGlmIHlvdSBoYXZlIHNvbWUgY29uc3RhbnQgdGltZSBkcmlmdCAqLworI2RlZmluZSBVU0VDU19QRVJfSklGRlkJKDEwMDAwMDAvSFopCisKKyNpZmRlZiBDT05GSUdfU01QCit1bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmcCwgcGMgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOworCisJaWYgKGluX2xvY2tfZnVuY3Rpb25zKHBjKSkgeworCQlmcCA9IHJlZ3MtPkFSTV9mcDsKKwkJcGMgPSBwY19wb2ludGVyKCgodW5zaWduZWQgbG9uZyAqKWZwKVstMV0pOworCX0KKworCXJldHVybiBwYzsKK30KK0VYUE9SVF9TWU1CT0wocHJvZmlsZV9wYyk7CisjZW5kaWYKKworLyoKKyAqIGhvb2sgZm9yIHNldHRpbmcgdGhlIFJUQydzIGlkZWEgb2YgdGhlIGN1cnJlbnQgdGltZS4KKyAqLworaW50ICgqc2V0X3J0Yykodm9pZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGR1bW15X2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCisgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgU3ViLWFyY2hpdGVjdHVyZQorICogaW1wbGVtZW50YXRpb25zIGNhbiBvdmVycmlkZSB0aGlzLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygod2VhaykpIHNjaGVkX2Nsb2NrKHZvaWQpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpamlmZmllcyAqICgxMDAwMDAwMDAwIC8gSFopOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X3J0Y191cGRhdGU7CisKKy8qCisgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsbHkgc3luY2hyb25pemVkIGxpbnV4IGNsb2NrLCB0aGVuIHVwZGF0ZQorICogQ01PUyBjbG9jayBhY2NvcmRpbmdseSBldmVyeSB+MTEgbWludXRlcy4gIHNldF9ydGMoKSBoYXMgdG8gYmUKKyAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kCisgKiBzdGFydHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19zZXRfcnRjKHZvaWQpCit7CisJaWYgKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQyB8fCBzZXRfcnRjID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChuZXh0X3J0Y191cGRhdGUgJiYKKwkgICAgdGltZV9iZWZvcmUoKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjLCBuZXh0X3J0Y191cGRhdGUpKQorCQlyZXR1cm47CisKKwlpZiAoeHRpbWUudHZfbnNlYyA8IDUwMDAwMDAwMCAtICgodW5zaWduZWQpIHRpY2tfbnNlYyA+PiAxKSAmJgorCSAgICB4dGltZS50dl9uc2VjID49IDUwMDAwMDAwMCArICgodW5zaWduZWQpIHRpY2tfbnNlYyA+PiAxKSkKKwkJcmV0dXJuOworCisJaWYgKHNldF9ydGMoKSkKKwkJLyoKKwkJICogcnRjIHVwZGF0ZSBmYWlsZWQuICBUcnkgYWdhaW4gaW4gNjBzCisJCSAqLworCQluZXh0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWMgKyA2MDsKKwllbHNlCisJCW5leHRfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYyArIDY2MDsKK30KKworI2lmZGVmIENPTkZJR19MRURTCisKK3N0YXRpYyB2b2lkIGR1bW15X2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KQoreworfQorCit2b2lkICgqbGVkc19ldmVudCkobGVkX2V2ZW50X3QpID0gZHVtbXlfbGVkc19ldmVudDsKKworc3RydWN0IGxlZHNfZXZ0X25hbWUgeworCWNvbnN0IGNoYXIJbmFtZVs4XTsKKwlpbnQJCW9uOworCWludAkJb2ZmOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZWRzX2V2dF9uYW1lIGV2dF9uYW1lc1tdID0geworCXsgImFtYmVyIiwgbGVkX2FtYmVyX29uLCBsZWRfYW1iZXJfb2ZmIH0sCisJeyAiYmx1ZSIsICBsZWRfYmx1ZV9vbiwgIGxlZF9ibHVlX29mZiAgfSwKKwl7ICJncmVlbiIsIGxlZF9ncmVlbl9vbiwgbGVkX2dyZWVuX29mZiB9LAorCXsgInJlZCIsICAgbGVkX3JlZF9vbiwgICBsZWRfcmVkX29mZiAgIH0sCit9OworCitzdGF0aWMgc3NpemVfdCBsZWRzX3N0b3JlKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IC1FSU5WQUwsIGxlbiA9IHN0cmNzcG4oYnVmLCAiICIpOworCisJaWYgKGxlbiA+IDAgJiYgYnVmW2xlbl0gPT0gJ1wwJykKKwkJbGVuLS07CisKKwlpZiAoc3RybmNtcChidWYsICJjbGFpbSIsIGxlbikgPT0gMCkgeworCQlsZWRzX2V2ZW50KGxlZF9jbGFpbSk7CisJCXJldCA9IHNpemU7CisJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgInJlbGVhc2UiLCBsZW4pID09IDApIHsKKwkJbGVkc19ldmVudChsZWRfcmVsZWFzZSk7CisJCXJldCA9IHNpemU7CisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZ0X25hbWVzKTsgaSsrKSB7CisJCQlpZiAoc3RybGVuKGV2dF9uYW1lc1tpXS5uYW1lKSAhPSBsZW4gfHwKKwkJCSAgICBzdHJuY21wKGJ1ZiwgZXZ0X25hbWVzW2ldLm5hbWUsIGxlbikgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzdHJuY21wKGJ1ZitsZW4sICIgb24iLCAzKSA9PSAwKSB7CisJCQkJbGVkc19ldmVudChldnRfbmFtZXNbaV0ub24pOworCQkJCXJldCA9IHNpemU7CisJCQl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmK2xlbiwgIiBvZmYiLCA0KSA9PSAwKSB7CisJCQkJbGVkc19ldmVudChldnRfbmFtZXNbaV0ub2ZmKTsKKwkJCQlyZXQgPSBzaXplOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKGV2ZW50LCAwMjAwLCBOVUxMLCBsZWRzX3N0b3JlKTsKKworc3RhdGljIGludCBsZWRzX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWxlZHNfZXZlbnQobGVkX3N0b3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxlZHNfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJbGVkc19ldmVudChsZWRfc3RhcnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxlZHNfc2h1dGRvd24oc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlsZWRzX2V2ZW50KGxlZF9oYWx0ZWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBsZWRzX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoImxlZHMiKSwKKwkuc2h1dGRvd24JPSBsZWRzX3NodXRkb3duLAorCS5zdXNwZW5kCT0gbGVkc19zdXNwZW5kLAorCS5yZXN1bWUJCT0gbGVkc19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgbGVkc19kZXZpY2UgPSB7CisJLmlkCQk9IDAsCisJLmNscwkJPSAmbGVkc19zeXNjbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxlZHNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZsZWRzX3N5c2NsYXNzKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmbGVkc19kZXZpY2UpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gc3lzZGV2X2NyZWF0ZV9maWxlKCZsZWRzX2RldmljZSwgJmF0dHJfZXZlbnQpOworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChsZWRzX2luaXQpOworCitFWFBPUlRfU1lNQk9MKGxlZHNfZXZlbnQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19USU1FUgorc3RhdGljIGlubGluZSB2b2lkIGRvX2xlZHModm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ID0gNTA7CisKKwlpZiAoLS1jb3VudCA9PSAwKSB7CisJCWNvdW50ID0gNTA7CisJCWxlZHNfZXZlbnQobGVkX3RpbWVyKTsKKwl9Cit9CisjZWxzZQorI2RlZmluZQlkb19sZWRzKCkKKyNlbmRpZgorCit2b2lkIGRvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHNlcTsKKwl1bnNpZ25lZCBsb25nIHVzZWMsIHNlYywgbG9zdDsKKworCWRvIHsKKwkJc2VxID0gcmVhZF9zZXFiZWdpbl9pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCXVzZWMgPSBzeXN0ZW1fdGltZXItPm9mZnNldCgpOworCisJCWxvc3QgPSBqaWZmaWVzIC0gd2FsbF9qaWZmaWVzOworCQlpZiAobG9zdCkKKwkJCXVzZWMgKz0gbG9zdCAqIFVTRUNTX1BFUl9KSUZGWTsKKworCQlzZWMgPSB4dGltZS50dl9zZWM7CisJCXVzZWMgKz0geHRpbWUudHZfbnNlYyAvIDEwMDA7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7CisKKwkvKiB1c2VjIG1heSBoYXZlIGdvbmUgdXAgYSBsb3Q6IGJlIHNhZmUgKi8KKwl3aGlsZSAodXNlYyA+PSAxMDAwMDAwKSB7CisJCXVzZWMgLT0gMTAwMDAwMDsKKwkJc2VjKys7CisJfQorCisJdHYtPnR2X3NlYyA9IHNlYzsKKwl0di0+dHZfdXNlYyA9IHVzZWM7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKKworaW50IGRvX3NldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KQoreworCXRpbWVfdCB3dG1fc2VjLCBzZWMgPSB0di0+dHZfc2VjOworCWxvbmcgd3RtX25zZWMsIG5zZWMgPSB0di0+dHZfbnNlYzsKKworCWlmICgodW5zaWduZWQgbG9uZyl0di0+dHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpCisJCXJldHVybiAtRUlOVkFMOworCisJd3JpdGVfc2VxbG9ja19pcnEoJnh0aW1lX2xvY2spOworCS8qCisJICogVGhpcyBpcyByZXZvbHRpbmcuIFdlIG5lZWQgdG8gc2V0ICJ4dGltZSIgY29ycmVjdGx5LiBIb3dldmVyLCB0aGUKKwkgKiB2YWx1ZSBpbiB0aGlzIGxvY2F0aW9uIGlzIHRoZSB2YWx1ZSBhdCB0aGUgbW9zdCByZWNlbnQgdXBkYXRlIG9mCisJICogd2FsbCB0aW1lLiAgRGlzY292ZXIgd2hhdCBjb3JyZWN0aW9uIGdldHRpbWVvZmRheSgpIHdvdWxkIGhhdmUKKwkgKiBkb25lLCBhbmQgdGhlbiB1bmRvIGl0IQorCSAqLworCW5zZWMgLT0gc3lzdGVtX3RpbWVyLT5vZmZzZXQoKSAqIE5TRUNfUEVSX1VTRUM7CisJbnNlYyAtPSAoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiBUSUNLX05TRUM7CisKKwl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOworCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7CisKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CisKKwl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KKwl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOworCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwljbG9ja193YXNfc2V0KCk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKKworLyoqCisgKiBzYXZlX3RpbWVfZGVsdGEgLSBTYXZlIHRoZSBvZmZzZXQgYmV0d2VlbiBzeXN0ZW0gdGltZSBhbmQgUlRDIHRpbWUKKyAqIEBkZWx0YTogcG9pbnRlciB0byB0aW1lc3BlYyB0byBzdG9yZSBkZWx0YQorICogQHJ0YzogcG9pbnRlciB0byB0aW1lc3BlYyBmb3IgY3VycmVudCBSVEMgdGltZQorICoKKyAqIFJldHVybiBhIGRlbHRhIGJldHdlZW4gdGhlIHN5c3RlbSB0aW1lIGFuZCB0aGUgUlRDIHRpbWUsIHN1Y2gKKyAqIHRoYXQgc3lzdGVtIHRpbWUgY2FuIGJlIHJlc3RvcmVkIGxhdGVyIHdpdGggcmVzdG9yZV90aW1lX2RlbHRhKCkKKyAqLwordm9pZCBzYXZlX3RpbWVfZGVsdGEoc3RydWN0IHRpbWVzcGVjICpkZWx0YSwgc3RydWN0IHRpbWVzcGVjICpydGMpCit7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoZGVsdGEsCisJCQkJeHRpbWUudHZfc2VjIC0gcnRjLT50dl9zZWMsCisJCQkJeHRpbWUudHZfbnNlYyAtIHJ0Yy0+dHZfbnNlYyk7Cit9CitFWFBPUlRfU1lNQk9MKHNhdmVfdGltZV9kZWx0YSk7CisKKy8qKgorICogcmVzdG9yZV90aW1lX2RlbHRhIC0gUmVzdG9yZSB0aGUgY3VycmVudCBzeXN0ZW0gdGltZQorICogQGRlbHRhOiBkZWx0YSByZXR1cm5lZCBieSBzYXZlX3RpbWVfZGVsdGEoKQorICogQHJ0YzogcG9pbnRlciB0byB0aW1lc3BlYyBmb3IgY3VycmVudCBSVEMgdGltZQorICovCit2b2lkIHJlc3RvcmVfdGltZV9kZWx0YShzdHJ1Y3QgdGltZXNwZWMgKmRlbHRhLCBzdHJ1Y3QgdGltZXNwZWMgKnJ0YykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmdHMsCisJCQkJZGVsdGEtPnR2X3NlYyArIHJ0Yy0+dHZfc2VjLAorCQkJCWRlbHRhLT50dl9uc2VjICsgcnRjLT50dl9uc2VjKTsKKworCWRvX3NldHRpbWVvZmRheSgmdHMpOworfQorRVhQT1JUX1NZTUJPTChyZXN0b3JlX3RpbWVfZGVsdGEpOworCisvKgorICogS2VybmVsIHN5c3RlbSB0aW1lciBzdXBwb3J0LgorICovCit2b2lkIHRpbWVyX3RpY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOworCWRvX2xlZHMoKTsKKwlkb19zZXRfcnRjKCk7CisJZG9fdGltZXIocmVncyk7CisjaWZuZGVmIENPTkZJR19TTVAKKwl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUocmVncykpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgdGltZXJfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHN5c190aW1lciAqdGltZXIgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3lzX3RpbWVyLCBkZXYpOworCisJaWYgKHRpbWVyLT5zdXNwZW5kICE9IE5VTEwpCisJCXRpbWVyLT5zdXNwZW5kKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3lzX3RpbWVyICp0aW1lciA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzeXNfdGltZXIsIGRldik7CisKKwlpZiAodGltZXItPnJlc3VtZSAhPSBOVUxMKQorCQl0aW1lci0+cmVzdW1lKCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHRpbWVyX3N1c3BlbmQgTlVMTAorI2RlZmluZSB0aW1lcl9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHRpbWVyX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoInRpbWVyIiksCisJLnN1c3BlbmQJPSB0aW1lcl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdGltZXJfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGltZXJfaW5pdF9zeXNmcyh2b2lkKQoreworCWludCByZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnRpbWVyX3N5c2NsYXNzKTsKKwlpZiAocmV0ID09IDApIHsKKwkJc3lzdGVtX3RpbWVyLT5kZXYuY2xzID0gJnRpbWVyX3N5c2NsYXNzOworCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJnN5c3RlbV90aW1lci0+ZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworZGV2aWNlX2luaXRjYWxsKHRpbWVyX2luaXRfc3lzZnMpOworCit2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKK3sKKwlpZiAoc3lzdGVtX3RpbWVyLT5vZmZzZXQgPT0gTlVMTCkKKwkJc3lzdGVtX3RpbWVyLT5vZmZzZXQgPSBkdW1teV9nZXR0aW1lb2Zmc2V0OworCXN5c3RlbV90aW1lci0+aW5pdCgpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGM0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwpAQCAtMCwwICsxLDU5MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBSdXNzZWxsIEtpbmcKKyAqICBGcmFnbWVudHMgdGhhdCBhcHBlYXIgdGhlIHNhbWUgYXMgbGludXgvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIChDKSBMaW51cyBUb3J2YWxkcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogICd0cmFwcy5jJyBoYW5kbGVzIGhhcmR3YXJlIGV4Y2VwdGlvbnMgYWZ0ZXIgd2UgaGF2ZSBzYXZlZCBzb21lIHN0YXRlIGluCisgKiAgJ2xpbnV4L2FyY2gvYXJtL2xpYi90cmFwcy5TJy4gIE1vc3RseSBhIGRlYnVnZ2luZyBhaWQsIGJ1dCB3aWxsIHByb2JhYmx5CisgKiAga2lsbCB0aGUgb2ZmZW5kaW5nIHByb2Nlc3MuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisKKyNpbmNsdWRlICJwdHJhY2UuaCIKKworZXh0ZXJuIHZvaWQgY19iYWNrdHJhY2UgKHVuc2lnbmVkIGxvbmcgZnAsIGludCBwbW9kZSk7CitleHRlcm4gdm9pZCBzaG93X3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKKworY29uc3QgY2hhciAqcHJvY2Vzc29yX21vZGVzW109Cit7ICJVU0VSXzI2IiwgIkZJUV8yNiIgLCAiSVJRXzI2IiAsICJTVkNfMjYiICwgIlVLNF8yNiIgLCAiVUs1XzI2IiAsICJVSzZfMjYiICwgIlVLN18yNiIgLAorICAiVUs4XzI2IiAsICJVSzlfMjYiICwgIlVLMTBfMjYiLCAiVUsxMV8yNiIsICJVSzEyXzI2IiwgIlVLMTNfMjYiLCAiVUsxNF8yNiIsICJVSzE1XzI2IiwKKyAgIlVTRVJfMzIiLCAiRklRXzMyIiAsICJJUlFfMzIiICwgIlNWQ18zMiIgLCAiVUs0XzMyIiAsICJVSzVfMzIiICwgIlVLNl8zMiIgLCAiQUJUXzMyIiAsCisgICJVSzhfMzIiICwgIlVLOV8zMiIgLCAiVUsxMF8zMiIsICJVTkRfMzIiICwgIlVLMTJfMzIiLCAiVUsxM18zMiIsICJVSzE0XzMyIiwgIlNZU18zMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVyW109IHsgInByZWZldGNoIGFib3J0IiwgImRhdGEgYWJvcnQiLCAiYWRkcmVzcyBleGNlcHRpb24iLCAiaW50ZXJydXB0IiB9OworCisjaWZkZWYgQ09ORklHX0RFQlVHX1VTRVIKK3Vuc2lnbmVkIGludCB1c2VyX2RlYnVnOworCitzdGF0aWMgaW50IF9faW5pdCB1c2VyX2RlYnVnX3NldHVwKGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uKCZzdHIsICZ1c2VyX2RlYnVnKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInVzZXJfZGVidWc9IiwgdXNlcl9kZWJ1Z19zZXR1cCk7CisjZW5kaWYKKwordm9pZCBkdW1wX2JhY2t0cmFjZV9lbnRyeSh1bnNpZ25lZCBsb25nIHdoZXJlLCB1bnNpZ25lZCBsb25nIGZyb20pCit7CisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJcHJpbnRrKCJbPCUwOGx4Pl0gIiwgd2hlcmUpOworCXByaW50X3N5bWJvbCgiKCVzKSAiLCB3aGVyZSk7CisJcHJpbnRrKCJmcm9tIFs8JTA4bHg+XSAiLCBmcm9tKTsKKwlwcmludF9zeW1ib2woIiglcylcbiIsIGZyb20pOworI2Vsc2UKKwlwcmludGsoIkZ1bmN0aW9uIGVudGVyZWQgYXQgWzwlMDhseD5dIGZyb20gWzwlMDhseD5dXG4iLCB3aGVyZSwgZnJvbSk7CisjZW5kaWYKK30KKworLyoKKyAqIFN0YWNrIHBvaW50ZXJzIHNob3VsZCBhbHdheXMgYmUgd2l0aGluIHRoZSBrZXJuZWxzIHZpZXcgb2YKKyAqIHBoeXNpY2FsIG1lbW9yeS4gIElmIGl0IGlzIG5vdCB0aGVyZSwgdGhlbiB3ZSBjYW4ndCBkdW1wCisgKiBvdXQgYW55IGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBzdGFjay4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfc3RhY2sodW5zaWduZWQgbG9uZyBzcCkKK3sKKwlpZiAoc3AgPCBQQUdFX09GRlNFVCB8fCAoc3AgPiAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSAmJiBoaWdoX21lbW9yeSAhPSAwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIER1bXAgb3V0IHRoZSBjb250ZW50cyBvZiBzb21lIG1lbW9yeSBuaWNlbHkuLi4KKyAqLworc3RhdGljIHZvaWQgZHVtcF9tZW0oY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGJvdHRvbSwgdW5zaWduZWQgbG9uZyB0b3ApCit7CisJdW5zaWduZWQgbG9uZyBwID0gYm90dG9tICYgfjMxOworCW1tX3NlZ21lbnRfdCBmczsKKwlpbnQgaTsKKworCS8qCisJICogV2UgbmVlZCB0byBzd2l0Y2ggdG8ga2VybmVsIG1vZGUgc28gdGhhdCB3ZSBjYW4gdXNlIF9fZ2V0X3VzZXIKKwkgKiB0byBzYWZlbHkgcmVhZCBmcm9tIGtlcm5lbCBzcGFjZS4gIE5vdGUgdGhhdCB3ZSBub3cgZHVtcCB0aGUKKwkgKiBjb2RlIGZpcnN0LCBqdXN0IGluIGNhc2UgdGhlIGJhY2t0cmFjZSBraWxscyB1cy4KKwkgKi8KKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCisJcHJpbnRrKCIlcygweCUwOGx4IHRvIDB4JTA4bHgpXG4iLCBzdHIsIGJvdHRvbSwgdG9wKTsKKworCWZvciAocCA9IGJvdHRvbSAmIH4zMTsgcCA8IHRvcDspIHsKKwkJcHJpbnRrKCIlMDRseDogIiwgcCAmIDB4ZmZmZik7CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcCArPSA0KSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCQlpZiAocCA8IGJvdHRvbSB8fCBwID49IHRvcCkKKwkJCQlwcmludGsoIiAgICAgICAgICIpOworCQkJZWxzZSB7CisJCQkJX19nZXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopcCk7CisJCQkJcHJpbnRrKCIlMDh4ICIsIHZhbCk7CisJCQl9CisJCX0KKwkJcHJpbnRrICgiXG4iKTsKKwl9CisKKwlzZXRfZnMoZnMpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2luc3RyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisJY29uc3QgaW50IHRodW1iID0gdGh1bWJfbW9kZShyZWdzKTsKKwljb25zdCBpbnQgd2lkdGggPSB0aHVtYiA/IDQgOiA4OworCW1tX3NlZ21lbnRfdCBmczsKKwlpbnQgaTsKKworCS8qCisJICogV2UgbmVlZCB0byBzd2l0Y2ggdG8ga2VybmVsIG1vZGUgc28gdGhhdCB3ZSBjYW4gdXNlIF9fZ2V0X3VzZXIKKwkgKiB0byBzYWZlbHkgcmVhZCBmcm9tIGtlcm5lbCBzcGFjZS4gIE5vdGUgdGhhdCB3ZSBub3cgZHVtcCB0aGUKKwkgKiBjb2RlIGZpcnN0LCBqdXN0IGluIGNhc2UgdGhlIGJhY2t0cmFjZSBraWxscyB1cy4KKwkgKi8KKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCisJcHJpbnRrKCJDb2RlOiAiKTsKKwlmb3IgKGkgPSAtNDsgaSA8IDE7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdmFsLCBiYWQ7CisKKwkJaWYgKHRodW1iKQorCQkJYmFkID0gX19nZXRfdXNlcih2YWwsICYoKHUxNiAqKWFkZHIpW2ldKTsKKwkJZWxzZQorCQkJYmFkID0gX19nZXRfdXNlcih2YWwsICYoKHUzMiAqKWFkZHIpW2ldKTsKKworCQlpZiAoIWJhZCkKKwkJCXByaW50ayhpID09IDAgPyAiKCUwKngpICIgOiAiJTAqeCAiLCB3aWR0aCwgdmFsKTsKKwkJZWxzZSB7CisJCQlwcmludGsoImJhZCBQQyB2YWx1ZS4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXByaW50aygiXG4iKTsKKworCXNldF9mcyhmcyk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwl1bnNpZ25lZCBpbnQgZnA7CisJaW50IG9rID0gMTsKKworCXByaW50aygiQmFja3RyYWNlOiAiKTsKKwlmcCA9IHJlZ3MtPkFSTV9mcDsKKwlpZiAoIWZwKSB7CisJCXByaW50aygibm8gZnJhbWUgcG9pbnRlciIpOworCQlvayA9IDA7CisJfSBlbHNlIGlmICh2ZXJpZnlfc3RhY2soZnApKSB7CisJCXByaW50aygiaW52YWxpZCBmcmFtZSBwb2ludGVyIDB4JTA4eCIsIGZwKTsKKwkJb2sgPSAwOworCX0gZWxzZSBpZiAoZnAgPCAodW5zaWduZWQgbG9uZykodHNrLT50aHJlYWRfaW5mbyArIDEpKQorCQlwcmludGsoImZyYW1lIHBvaW50ZXIgdW5kZXJmbG93Iik7CisJcHJpbnRrKCJcbiIpOworCisJaWYgKG9rKQorCQljX2JhY2t0cmFjZShmcCwgcHJvY2Vzc29yX21vZGUocmVncykpOworfQorCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfRVJST1JTCisJX19iYWNrdHJhY2UoKTsKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCit2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgZnA7CisKKwlpZiAoIXRzaykKKwkJdHNrID0gY3VycmVudDsKKworCWlmICh0c2sgIT0gY3VycmVudCkKKwkJZnAgPSB0aHJlYWRfc2F2ZWRfZnAodHNrKTsKKwllbHNlCisJCWFzbSgibW92JT8gJTAsIGZwIiA6ICI9ciIgKGZwKSk7CisKKwljX2JhY2t0cmFjZShmcCwgMHgxMCk7CisJYmFycmllcigpOworfQorCitERUZJTkVfU1BJTkxPQ0soZGllX2xvY2spOworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBwcm90ZWN0ZWQgYWdhaW5zdCByZS1lbnRyYW5jeS4KKyAqLworTk9SRVRfVFlQRSB2b2lkIGRpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZXJyKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlzdGF0aWMgaW50IGRpZV9jb3VudGVyOworCisJY29uc29sZV92ZXJib3NlKCk7CisJc3Bpbl9sb2NrX2lycSgmZGllX2xvY2spOworCWJ1c3Rfc3BpbmxvY2tzKDEpOworCisJcHJpbnRrKCJJbnRlcm5hbCBlcnJvcjogJXM6ICV4IFsjJWRdXG4iLCBzdHIsIGVyciwgKytkaWVfY291bnRlcik7CisJcHJpbnRfbW9kdWxlcygpOworCXByaW50aygiQ1BVOiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCBzdGFjayBsaW1pdCA9IDB4JXApXG4iLAorCQl0c2stPmNvbW0sIHRzay0+cGlkLCB0c2stPnRocmVhZF9pbmZvICsgMSk7CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSB8fCBpbl9pbnRlcnJ1cHQoKSkgeworCQlkdW1wX21lbSgiU3RhY2s6ICIsIHJlZ3MtPkFSTV9zcCwgODE5MisodW5zaWduZWQgbG9uZyl0c2stPnRocmVhZF9pbmZvKTsKKwkJZHVtcF9iYWNrdHJhY2UocmVncywgdHNrKTsKKwkJZHVtcF9pbnN0cihyZWdzKTsKKwl9CisKKwlidXN0X3NwaW5sb2NrcygwKTsKKwlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKKwlkb19leGl0KFNJR1NFR1YpOworfQorCit2b2lkIGRpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVycikKK3sKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKQorICAgIAkJcmV0dXJuOworCisgICAgCWRpZShzdHIsIHJlZ3MsIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIG5vdGlmeV9kaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnaW5mb190ICppbmZvLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBlcnIsIHVuc2lnbmVkIGxvbmcgdHJhcCkKK3sKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCWN1cnJlbnQtPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyOworCQljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IHRyYXA7CisKKwkJZm9yY2Vfc2lnX2luZm8oaW5mby0+c2lfc2lnbm8sIGluZm8sIGN1cnJlbnQpOworCX0gZWxzZSB7CisJCWRpZShzdHIsIHJlZ3MsIGVycik7CisJfQorfQorCitzdGF0aWMgTElTVF9IRUFEKHVuZGVmX2hvb2spOworc3RhdGljIERFRklORV9TUElOTE9DSyh1bmRlZl9sb2NrKTsKKwordm9pZCByZWdpc3Rlcl91bmRlZl9ob29rKHN0cnVjdCB1bmRlZl9ob29rICpob29rKQoreworCXNwaW5fbG9ja19pcnEoJnVuZGVmX2xvY2spOworCWxpc3RfYWRkKCZob29rLT5ub2RlLCAmdW5kZWZfaG9vayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKK30KKwordm9pZCB1bnJlZ2lzdGVyX3VuZGVmX2hvb2soc3RydWN0IHVuZGVmX2hvb2sgKmhvb2spCit7CisJc3Bpbl9sb2NrX2lycSgmdW5kZWZfbG9jayk7CisJbGlzdF9kZWwoJmhvb2stPm5vZGUpOworCXNwaW5fdW5sb2NrX2lycSgmdW5kZWZfbG9jayk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb191bmRlZmluc3RyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uID0gdGh1bWJfbW9kZShyZWdzKSA/IDIgOiA0OworCXVuc2lnbmVkIGludCBpbnN0cjsKKwlzdHJ1Y3QgdW5kZWZfaG9vayAqaG9vazsKKwlzaWdpbmZvX3QgaW5mbzsKKwl2b2lkIF9fdXNlciAqcGM7CisKKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgQVJNIEFSTSwgUEMgaXMgMiBvciA0IGJ5dGVzIGFoZWFkLAorCSAqIGRlcGVuZGluZyB3aGV0aGVyIHdlJ3JlIGluIFRodW1iIG1vZGUgb3Igbm90LgorCSAqIENvcnJlY3QgdGhpcyBvZmZzZXQuCisJICovCisJcmVncy0+QVJNX3BjIC09IGNvcnJlY3Rpb247CisKKwlwYyA9ICh2b2lkIF9fdXNlciAqKWluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisJaWYgKHRodW1iX21vZGUocmVncykpIHsKKwkJZ2V0X3VzZXIoaW5zdHIsICh1MTYgX191c2VyICopcGMpOworCX0gZWxzZSB7CisJCWdldF91c2VyKGluc3RyLCAodTMyIF9fdXNlciAqKXBjKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvb2ssICZ1bmRlZl9ob29rLCBub2RlKSB7CisJCWlmICgoaW5zdHIgJiBob29rLT5pbnN0cl9tYXNrKSA9PSBob29rLT5pbnN0cl92YWwgJiYKKwkJICAgIChyZWdzLT5BUk1fY3BzciAmIGhvb2stPmNwc3JfbWFzaykgPT0gaG9vay0+Y3Bzcl92YWwpIHsKKwkJCWlmIChob29rLT5mbihyZWdzLCBpbnN0cikgPT0gMCkgeworCQkJCXNwaW5fdW5sb2NrX2lycSgmdW5kZWZfbG9jayk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdW5kZWZfbG9jayk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfVVNFUgorCWlmICh1c2VyX2RlYnVnICYgVURCR19VTkRFRklORUQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgKCVkKTogdW5kZWZpbmVkIGluc3RydWN0aW9uOiBwYz0lcFxuIiwKKwkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgcGMpOworCQlkdW1wX2luc3RyKHJlZ3MpOworCX0KKyNlbmRpZgorCisJaW5mby5zaV9zaWdubyA9IFNJR0lMTDsKKwlpbmZvLnNpX2Vycm5vID0gMDsKKwlpbmZvLnNpX2NvZGUgID0gSUxMX0lMTE9QQzsKKwlpbmZvLnNpX2FkZHIgID0gcGM7CisKKwlub3RpZnlfZGllKCJPb3BzIC0gdW5kZWZpbmVkIGluc3RydWN0aW9uIiwgcmVncywgJmluZm8sIDAsIDYpOworfQorCithc21saW5rYWdlIHZvaWQgZG9fdW5leHBfZmlxIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZm5kZWYgQ09ORklHX0lHTk9SRV9GSVEKKwlwcmludGsoIkhtbS4gIFVuZXhwZWN0ZWQgRklRIHJlY2VpdmVkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoIllvdSBtYXkgaGF2ZSBhIGhhcmR3YXJlIHByb2JsZW0uLi5cbiIpOworI2VuZGlmCit9CisKKy8qCisgKiBiYWRfbW9kZSBoYW5kbGVzIHRoZSBpbXBvc3NpYmxlIGNhc2UgaW4gdGhlIHZlY3RvcnMuICBJZiB5b3Ugc2VlIG9uZSBvZgorICogdGhlc2UsIHRoZW4gaXQncyBleHRyZW1lbHkgc2VyaW91cywgYW5kIGNvdWxkIG1lYW4geW91IGhhdmUgYnVnZ3kgaGFyZHdhcmUuCisgKiBJdCBuZXZlciByZXR1cm5zLCBhbmQgbmV2ZXIgdHJpZXMgdG8gc3luYy4gIFdlIGhvcGUgdGhhdCB3ZSBjYW4gYXQgbGVhc3QKKyAqIGR1bXAgb3V0IHNvbWUgc3RhdGUgaW5mb3JtYXRpb24uLi4KKyAqLworYXNtbGlua2FnZSB2b2lkIGJhZF9tb2RlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcmVhc29uLCBpbnQgcHJvY19tb2RlKQoreworCWNvbnNvbGVfdmVyYm9zZSgpOworCisJcHJpbnRrKEtFUk5fQ1JJVCAiQmFkIG1vZGUgaW4gJXMgaGFuZGxlciBkZXRlY3RlZDogbW9kZSAlc1xuIiwKKwkJaGFuZGxlcltyZWFzb25dLCBwcm9jZXNzb3JfbW9kZXNbcHJvY19tb2RlXSk7CisKKwlkaWUoIk9vcHMgLSBiYWQgbW9kZSIsIHJlZ3MsIDApOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcGFuaWMoImJhZCBtb2RlIik7Cit9CisKK3N0YXRpYyBpbnQgYmFkX3N5c2NhbGwoaW50IG4sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCXNpZ2luZm9fdCBpbmZvOworCisJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICE9IFBFUl9MSU5VWCAmJiB0aHJlYWQtPmV4ZWNfZG9tYWluLT5oYW5kbGVyKSB7CisJCXRocmVhZC0+ZXhlY19kb21haW4tPmhhbmRsZXIobiwgcmVncyk7CisJCXJldHVybiByZWdzLT5BUk1fcjA7CisJfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX1VTRVIKKwlpZiAodXNlcl9kZWJ1ZyAmIFVEQkdfU1lTQ0FMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlslZF0gJXM6IG9ic29sZXRlIHN5c3RlbSBjYWxsICUwOHguXG4iLAorCQkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCBuKTsKKwkJZHVtcF9pbnN0cihyZWdzKTsKKwl9CisjZW5kaWYKKworCWluZm8uc2lfc2lnbm8gPSBTSUdJTEw7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlICA9IElMTF9JTExUUlA7CisJaW5mby5zaV9hZGRyICA9ICh2b2lkIF9fdXNlciAqKWluc3RydWN0aW9uX3BvaW50ZXIocmVncykgLQorCQkJICh0aHVtYl9tb2RlKHJlZ3MpID8gMiA6IDQpOworCisJbm90aWZ5X2RpZSgiT29wcyAtIGJhZCBzeXNjYWxsIiwgcmVncywgJmluZm8sIG4sIDApOworCisJcmV0dXJuIHJlZ3MtPkFSTV9yMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkb19jYWNoZV9vcCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50IGZsYWdzKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCisJaWYgKGVuZCA8IHN0YXJ0IHx8IGZsYWdzKQorCQlyZXR1cm47CisKKwl2bWEgPSBmaW5kX3ZtYShjdXJyZW50LT5hY3RpdmVfbW0sIHN0YXJ0KTsKKwlpZiAodm1hICYmIHZtYS0+dm1fc3RhcnQgPCBlbmQpIHsKKwkJaWYgKHN0YXJ0IDwgdm1hLT52bV9zdGFydCkKKwkJCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwkJaWYgKGVuZCA+IHZtYS0+dm1fZW5kKQorCQkJZW5kID0gdm1hLT52bV9lbmQ7CisKKwkJZmx1c2hfY2FjaGVfdXNlcl9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpOworCX0KK30KKworLyoKKyAqIEhhbmRsZSBhbGwgdW5yZWNvZ25pc2VkIHN5c3RlbSBjYWxscy4KKyAqICAweDlmMDAwMCAtIDB4OWZmZmZmIGFyZSBzb21lIG1vcmUgZXNvdGVyaWMgc3lzdGVtIGNhbGxzCisgKi8KKyNkZWZpbmUgTlIoeCkgKChfX0FSTV9OUl8jI3gpIC0gX19BUk1fTlJfQkFTRSkKK2FzbWxpbmthZ2UgaW50IGFybV9zeXNjYWxsKGludCBubywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisJc2lnaW5mb190IGluZm87CisKKwlpZiAoKG5vID4+IDE2KSAhPSAweDlmKQorCQlyZXR1cm4gYmFkX3N5c2NhbGwobm8sIHJlZ3MpOworCisJc3dpdGNoIChubyAmIDB4ZmZmZikgeworCWNhc2UgMDogLyogYnJhbmNoIHRocm91Z2ggMCAqLworCQlpbmZvLnNpX3NpZ25vID0gU0lHU0VHVjsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCWluZm8uc2lfY29kZSAgPSBTRUdWX01BUEVSUjsKKwkJaW5mby5zaV9hZGRyICA9IE5VTEw7CisKKwkJbm90aWZ5X2RpZSgiYnJhbmNoIHRocm91Z2ggemVybyIsIHJlZ3MsICZpbmZvLCAwLCAwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE5SKGJyZWFrcG9pbnQpOiAvKiBTV0kgQlJFQUtfUE9JTlQgKi8KKwkJcmVncy0+QVJNX3BjIC09IHRodW1iX21vZGUocmVncykgPyAyIDogNDsKKwkJcHRyYWNlX2JyZWFrKGN1cnJlbnQsIHJlZ3MpOworCQlyZXR1cm4gcmVncy0+QVJNX3IwOworCisJLyoKKwkgKiBGbHVzaCBhIHJlZ2lvbiBmcm9tIHZpcnR1YWwgYWRkcmVzcyAncjAnIHRvIHZpcnR1YWwgYWRkcmVzcyAncjEnCisJICogX2V4Y2x1c2l2ZV8uICBUaGVyZSBpcyBubyBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb24gZWl0aGVyIGFkZHJlc3M7CisJICogdXNlciBzcGFjZSBkb2VzIG5vdCBuZWVkIHRvIGtub3cgdGhlIGhhcmR3YXJlIGNhY2hlIGxheW91dC4KKwkgKgorCSAqIHIyIGNvbnRhaW5zIGZsYWdzLiAgSXQgc2hvdWxkIEFMV0FZUyBiZSBwYXNzZWQgYXMgWkVSTyB1bnRpbCBpdAorCSAqIGlzIGRlZmluZWQgdG8gYmUgc29tZXRoaW5nIGVsc2UuICBGb3Igbm93IHdlIGlnbm9yZSBpdCwgYnV0IG1heQorCSAqIHRoZSBmaXJlcyBvZiBoZWxsIGJ1cm4gaW4geW91ciBiZWxseSBpZiB5b3UgYnJlYWsgdGhpcyBydWxlLiA7KQorCSAqCisJICogKGF0IGEgbGF0ZXIgZGF0ZSwgd2UgbWF5IHdhbnQgdG8gYWxsb3cgdGhpcyBjYWxsIHRvIG5vdCBmbHVzaAorCSAqIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgY2FjaGUuICBQYXNzaW5nICcwJyB3aWxsIGd1YXJhbnRlZSB0aGF0CisJICogZXZlcnl0aGluZyBuZWNlc3NhcnkgZ2V0cyBmbHVzaGVkIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IGluCisJICogdGhlIHNwZWNpZmllZCByZWdpb24pLgorCSAqLworCWNhc2UgTlIoY2FjaGVmbHVzaCk6CisJCWRvX2NhY2hlX29wKHJlZ3MtPkFSTV9yMCwgcmVncy0+QVJNX3IxLCByZWdzLT5BUk1fcjIpOworCQlyZXR1cm4gMDsKKworCWNhc2UgTlIodXNyMjYpOgorCQlpZiAoIShlbGZfaHdjYXAgJiBIV0NBUF8yNkJJVCkpCisJCQlicmVhazsKKwkJcmVncy0+QVJNX2Nwc3IgJj0gfk1PREUzMl9CSVQ7CisJCXJldHVybiByZWdzLT5BUk1fcjA7CisKKwljYXNlIE5SKHVzcjMyKToKKwkJaWYgKCEoZWxmX2h3Y2FwICYgSFdDQVBfMjZCSVQpKQorCQkJYnJlYWs7CisJCXJlZ3MtPkFSTV9jcHNyIHw9IE1PREUzMl9CSVQ7CisJCXJldHVybiByZWdzLT5BUk1fcjA7CisKKwljYXNlIE5SKHNldF90bHMpOgorCQl0aHJlYWQtPnRwX3ZhbHVlID0gcmVncy0+QVJNX3IwOworCQkvKgorCQkgKiBPdXIgdXNlciBhY2Nlc3NpYmxlIFRMUyBwdHIgaXMgbG9jYXRlZCBhdCAweGZmZmYwZmZjLgorCQkgKiBPbiBTTVAgcmVhZCBhY2Nlc3MgdG8gdGhpcyBhZGRyZXNzIG11c3QgcmFpc2UgYSBmYXVsdAorCQkgKiBhbmQgYmUgZW11bGF0ZWQgZnJvbSB0aGUgZGF0YSBhYm9ydCBoYW5kbGVyLgorCQkgKiBtCisJCSAqLworCQkqKCh1bnNpZ25lZCBsb25nICopMHhmZmZmMGZmYykgPSB0aHJlYWQtPnRwX3ZhbHVlOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCS8qIENhbGxzIDlmMDB4eC4uOWYwN2ZmIGFyZSBkZWZpbmVkIHRvIHJldHVybiAtRU5PU1lTCisJCSAgIGlmIG5vdCBpbXBsZW1lbnRlZCwgcmF0aGVyIHRoYW4gcmFpc2luZyBTSUdJTEwuICBUaGlzCisJCSAgIHdheSB0aGUgY2FsbGluZyBwcm9ncmFtIGNhbiBncmFjZWZ1bGx5IGRldGVybWluZSB3aGV0aGVyCisJCSAgIGEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQuICAqLworCQlpZiAobm8gPD0gMHg3ZmYpCisJCQlyZXR1cm4gLUVOT1NZUzsKKwkJYnJlYWs7CisJfQorI2lmZGVmIENPTkZJR19ERUJVR19VU0VSCisJLyoKKwkgKiBleHBlcmllbmNlIHNob3dzIHRoYXQgdGhlc2Ugc2VlbSB0byBpbmRpY2F0ZSB0aGF0CisJICogc29tZXRoaW5nIGNhdGFzdHJvcGhpYyBoYXMgaGFwcGVuZWQKKwkgKi8KKwlpZiAodXNlcl9kZWJ1ZyAmIFVEQkdfU1lTQ0FMTCkgeworCQlwcmludGsoIlslZF0gJXM6IGFybSBzeXNjYWxsICVkXG4iLAorCQkgICAgICAgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCBubyk7CisJCWR1bXBfaW5zdHIocmVncyk7CisJCWlmICh1c2VyX21vZGUocmVncykpIHsKKwkJCXNob3dfcmVncyhyZWdzKTsKKwkJCWNfYmFja3RyYWNlKHJlZ3MtPkFSTV9mcCwgcHJvY2Vzc29yX21vZGUocmVncykpOworCQl9CisJfQorI2VuZGlmCisJaW5mby5zaV9zaWdubyA9IFNJR0lMTDsKKwlpbmZvLnNpX2Vycm5vID0gMDsKKwlpbmZvLnNpX2NvZGUgID0gSUxMX0lMTFRSUDsKKwlpbmZvLnNpX2FkZHIgID0gKHZvaWQgX191c2VyICopaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAtCisJCQkgKHRodW1iX21vZGUocmVncykgPyAyIDogNCk7CisKKwlub3RpZnlfZGllKCJPb3BzIC0gYmFkIHN5c2NhbGwoMikiLCByZWdzLCAmaW5mbywgbm8sIDApOworCXJldHVybiAwOworfQorCit2b2lkIF9fYmFkX3hjaGcodm9sYXRpbGUgdm9pZCAqcHRyLCBpbnQgc2l6ZSkKK3sKKwlwcmludGsoInhjaGc6IGJhZCBkYXRhIHNpemU6IHBjIDB4JXAsIHB0ciAweCVwLCBzaXplICVkXG4iLAorCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIHB0ciwgc2l6ZSk7CisJQlVHKCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fYmFkX3hjaGcpOworCisvKgorICogQSBkYXRhIGFib3J0IHRyYXAgd2FzIHRha2VuLCBidXQgd2UgZGlkIG5vdCBoYW5kbGUgdGhlIGluc3RydWN0aW9uLgorICogVHJ5IHRvIGFib3J0IHRoZSB1c2VyIHByb2dyYW0sIG9yIHBhbmljIGlmIGl0IHdhcyB0aGUga2VybmVsLgorICovCithc21saW5rYWdlIHZvaWQKK2JhZGRhdGFhYm9ydChpbnQgY29kZSwgdW5zaWduZWQgbG9uZyBpbnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKwlzaWdpbmZvX3QgaW5mbzsKKworI2lmZGVmIENPTkZJR19ERUJVR19VU0VSCisJaWYgKHVzZXJfZGVidWcgJiBVREJHX0JBREFCT1JUKSB7CisJCXByaW50ayhLRVJOX0VSUiAiWyVkXSAlczogYmFkIGRhdGEgYWJvcnQ6IGNvZGUgJWQgaW5zdHIgMHglMDhseFxuIiwKKwkJCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgY29kZSwgaW5zdHIpOworCQlkdW1wX2luc3RyKHJlZ3MpOworCQlzaG93X3B0ZShjdXJyZW50LT5tbSwgYWRkcik7CisJfQorI2VuZGlmCisKKwlpbmZvLnNpX3NpZ25vID0gU0lHSUxMOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSAgPSBJTExfSUxMT1BDOworCWluZm8uc2lfYWRkciAgPSAodm9pZCBfX3VzZXIgKilhZGRyOworCisJbm90aWZ5X2RpZSgidW5rbm93biBkYXRhIGFib3J0IGNvZGUiLCByZWdzLCAmaW5mbywgaW5zdHIsIDApOworfQorCit2b2xhdGlsZSB2b2lkIF9fYnVnKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkICpkYXRhKQoreworCXByaW50ayhLRVJOX0NSSVQia2VybmVsIEJVRyBhdCAlczolZCEiLCBmaWxlLCBsaW5lKTsKKwlpZiAoZGF0YSkKKwkJcHJpbnRrKCIgLSBleHRyYSBkYXRhID0gJXAiLCBkYXRhKTsKKwlwcmludGsoIlxuIik7CisJKihpbnQgKikwID0gMDsKK30KK0VYUE9SVF9TWU1CT0woX19idWcpOworCit2b2lkIF9fcmVhZHdyaXRlX2J1Zyhjb25zdCBjaGFyICpmbikKK3sKKwlwcmludGsoIiVzIGNhbGxlZCwgYnV0IG5vdCBpbXBsZW1lbnRlZFxuIiwgZm4pOworCUJVRygpOworfQorRVhQT1JUX1NZTUJPTChfX3JlYWR3cml0ZV9idWcpOworCit2b2lkIF9fcHRlX2Vycm9yKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlwcmludGsoIiVzOiVkOiBiYWQgcHRlICUwOGx4LlxuIiwgZmlsZSwgbGluZSwgdmFsKTsKK30KKwordm9pZCBfX3BtZF9lcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJcHJpbnRrKCIlczolZDogYmFkIHBtZCAlMDhseC5cbiIsIGZpbGUsIGxpbmUsIHZhbCk7Cit9CisKK3ZvaWQgX19wZ2RfZXJyb3IoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXByaW50aygiJXM6JWQ6IGJhZCBwZ2QgJTA4bHguXG4iLCBmaWxlLCBsaW5lLCB2YWwpOworfQorCithc21saW5rYWdlIHZvaWQgX19kaXYwKHZvaWQpCit7CisJcHJpbnRrKCJEaXZpc2lvbiBieSB6ZXJvIGluIGtlcm5lbC5cbiIpOworCWR1bXBfc3RhY2soKTsKK30KK0VYUE9SVF9TWU1CT0woX19kaXYwKTsKKwordm9pZCBhYm9ydCh2b2lkKQoreworCUJVRygpOworCisJLyogaWYgdGhhdCBkb2Vzbid0IGtpbGwgdXMsIGhhbHQgKi8KKwlwYW5pYygiT29wcyBmYWlsZWQgdG8ga2lsbCB0aHJlYWQiKTsKK30KK0VYUE9SVF9TWU1CT0woYWJvcnQpOworCit2b2lkIF9faW5pdCB0cmFwX2luaXQodm9pZCkKK3sKKwlleHRlcm4gdm9pZCBfX3RyYXBfaW5pdCh2b2lkKTsKKworCV9fdHJhcF9pbml0KCk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKDB4ZmZmZjAwMDAsIDB4ZmZmZjAwMDAgKyBQQUdFX1NJWkUpOworCW1vZGlmeV9kb21haW4oRE9NQUlOX1VTRVIsIERPTUFJTl9DTElFTlQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzljNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIGxkIHNjcmlwdCB0byBtYWtlIEFSTSBMaW51eCBrZXJuZWwKKyAqIHRha2VuIGZyb20gdGhlIGkzODYgdmVyc2lvbiBieSBSdXNzZWxsIEtpbmcKKyAqIFdyaXR0ZW4gYnkgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+CisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisJCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShzdGV4dCkKKyNpZm5kZWYgX19BUk1FQl9fCitqaWZmaWVzID0gamlmZmllc182NDsKKyNlbHNlCitqaWZmaWVzID0gamlmZmllc182NCArIDQ7CisjZW5kaWYKK1NFQ1RJT05TCit7CisJLiA9IFRFWFRBRERSOworCS5pbml0IDogewkJCS8qIEluaXQgY29kZSBhbmQgZGF0YQkJKi8KKwkJX3N0ZXh0ID0gLjsKKwkJCV9zaW5pdHRleHQgPSAuOworCQkJKiguaW5pdC50ZXh0KQorCQkJX2Vpbml0dGV4dCA9IC47CisJCV9fcHJvY19pbmZvX2JlZ2luID0gLjsKKwkJCSooLnByb2MuaW5mbykKKwkJX19wcm9jX2luZm9fZW5kID0gLjsKKwkJX19hcmNoX2luZm9fYmVnaW4gPSAuOworCQkJKiguYXJjaC5pbmZvKQorCQlfX2FyY2hfaW5mb19lbmQgPSAuOworCQlfX3RhZ3RhYmxlX2JlZ2luID0gLjsKKwkJCSooLnRhZ2xpc3QpCisJCV9fdGFndGFibGVfZW5kID0gLjsKKwkJLiA9IEFMSUdOKDE2KTsKKwkJX19zZXR1cF9zdGFydCA9IC47CisJCQkqKC5pbml0LnNldHVwKQorCQlfX3NldHVwX2VuZCA9IC47CisJCV9fZWFybHlfYmVnaW4gPSAuOworCQkJKihfX2Vhcmx5X3BhcmFtKQorCQlfX2Vhcmx5X2VuZCA9IC47CisJCV9faW5pdGNhbGxfc3RhcnQgPSAuOworCQkJKiguaW5pdGNhbGwxLmluaXQpCisJCQkqKC5pbml0Y2FsbDIuaW5pdCkKKwkJCSooLmluaXRjYWxsMy5pbml0KQorCQkJKiguaW5pdGNhbGw0LmluaXQpCisJCQkqKC5pbml0Y2FsbDUuaW5pdCkKKwkJCSooLmluaXRjYWxsNi5pbml0KQorCQkJKiguaW5pdGNhbGw3LmluaXQpCisJCV9faW5pdGNhbGxfZW5kID0gLjsKKwkJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOworCQkJKiguY29uX2luaXRjYWxsLmluaXQpCisJCV9fY29uX2luaXRjYWxsX2VuZCA9IC47CisJCV9fc2VjdXJpdHlfaW5pdGNhbGxfc3RhcnQgPSAuOworCQkJKiguc2VjdXJpdHlfaW5pdGNhbGwuaW5pdCkKKwkJX19zZWN1cml0eV9pbml0Y2FsbF9lbmQgPSAuOworCQkuID0gQUxJR04oMzIpOworCQlfX2luaXRyYW1mc19zdGFydCA9IC47CisJCQl1c3IvYnVpbHQtaW4ubyguaW5pdC5yYW1mcykKKwkJX19pbml0cmFtZnNfZW5kID0gLjsKKwkJLiA9IEFMSUdOKDY0KTsKKwkJX19wZXJfY3B1X3N0YXJ0ID0gLjsKKwkJCSooLmRhdGEucGVyY3B1KQorCQlfX3Blcl9jcHVfZW5kID0gLjsKKyNpZm5kZWYgQ09ORklHX1hJUF9LRVJORUwKKwkJX19pbml0X2JlZ2luID0gX3N0ZXh0OworCQkqKC5pbml0LmRhdGEpCisJCS4gPSBBTElHTig0MDk2KTsKKwkJX19pbml0X2VuZCA9IC47CisjZW5kaWYKKwl9CisKKwkvRElTQ0FSRC8gOiB7CQkJLyogRXhpdCBjb2RlIGFuZCBkYXRhCQkqLworCQkqKC5leGl0LnRleHQpCisJCSooLmV4aXQuZGF0YSkKKwkJKiguZXhpdGNhbGwuZXhpdCkKKwl9CisKKwkudGV4dCA6IHsJCQkvKiBSZWFsIHRleHQgc2VnbWVudAkJKi8KKwkJX3RleHQgPSAuOwkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEJKi8KKwkJCSooLnRleHQpCisJCQlTQ0hFRF9URVhUCisJCQlMT0NLX1RFWFQKKwkJCSooLmZpeHVwKQorCQkJKiguZ251Lndhcm5pbmcpCisJCQkqKC5yb2RhdGEpCisJCQkqKC5yb2RhdGEuKikKKwkJCSooLmdsdWVfNykKKwkJCSooLmdsdWVfN3QpCisJCSooLmdvdCkJCQkvKiBHbG9iYWwgb2Zmc2V0IHRhYmxlCQkqLworCX0KKworCS4gPSBBTElHTigxNik7CisJX19leF90YWJsZSA6IHsJCQkvKiBFeGNlcHRpb24gdGFibGUJCSovCisJCV9fc3RhcnRfX19leF90YWJsZSA9IC47CisJCQkqKF9fZXhfdGFibGUpCisJCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKwl9CisKKwlST0RBVEEKKworCV9ldGV4dCA9IC47CQkJLyogRW5kIG9mIHRleHQgYW5kIHJvZGF0YSBzZWN0aW9uICovCisKKyNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAorCV9fZGF0YV9sb2MgPSBBTElHTig0KTsJCS8qIGxvY2F0aW9uIGluIGJpbmFyeSAqLworCS4gPSBEQVRBQUREUjsKKyNlbHNlCisJLiA9IEFMSUdOKDgxOTIpOworCV9fZGF0YV9sb2MgPSAuOworI2VuZGlmCisKKwkuZGF0YSA6IEFUKF9fZGF0YV9sb2MpIHsKKwkJX19kYXRhX3N0YXJ0ID0gLjsJLyogYWRkcmVzcyBpbiBtZW1vcnkgKi8KKworCQkvKgorCQkgKiBmaXJzdCwgdGhlIGluaXQgdGFzayB1bmlvbiwgYWxpZ25lZAorCQkgKiB0byBhbiA4MTkyIGJ5dGUgYm91bmRhcnkuCisJCSAqLworCQkqKC5pbml0LnRhc2spCisKKyNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAorCQkuID0gQUxJR04oNDA5Nik7CisJCV9faW5pdF9iZWdpbiA9IC47CisJCSooLmluaXQuZGF0YSkKKwkJLiA9IEFMSUdOKDQwOTYpOworCQlfX2luaXRfZW5kID0gLjsKKyNlbmRpZgorCisJCS4gPSBBTElHTig0MDk2KTsKKwkJX19ub3NhdmVfYmVnaW4gPSAuOworCQkqKC5kYXRhLm5vc2F2ZSkKKwkJLiA9IEFMSUdOKDQwOTYpOworCQlfX25vc2F2ZV9lbmQgPSAuOworCisJCS8qCisJCSAqIHRoZW4gdGhlIGNhY2hlbGluZSBhbGlnbmVkIGRhdGEKKwkJICovCisJCS4gPSBBTElHTigzMik7CisJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCisKKwkJLyoKKwkJICogYW5kIHRoZSB1c3VhbCBkYXRhIHNlY3Rpb24KKwkJICovCisJCSooLmRhdGEpCisJCUNPTlNUUlVDVE9SUworCisJCV9lZGF0YSA9IC47CisJfQorCisJLmJzcyA6IHsKKwkJX19ic3Nfc3RhcnQgPSAuOwkvKiBCU1MJCQkJKi8KKwkJKiguYnNzKQorCQkqKENPTU1PTikKKwkJX2VuZCA9IC47CisJfQorCQkJCQkvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuCSovCisJLnN0YWIgMCA6IHsgKiguc3RhYikgfQorCS5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KKwkuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorCS5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisJLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQorCS5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKwkuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CisKKy8qIHRob3NlIG11c3QgbmV2ZXIgYmUgZW1wdHkgKi8KK0FTU0VSVCgoX19wcm9jX2luZm9fZW5kIC0gX19wcm9jX2luZm9fYmVnaW4pLCAibWlzc2luZyBDUFUgc3VwcG9ydCIpCitBU1NFUlQoKF9fYXJjaF9pbmZvX2VuZCAtIF9fYXJjaF9pbmZvX2JlZ2luKSwgIm5vIG1hY2hpbmUgcmVjb3JkIGRlZmluZWQiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL01ha2VmaWxlIGIvYXJjaC9hcm0vbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTY1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorIworIyBsaW51eC9hcmNoL2FybS9saWIvTWFrZWZpbGUKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nCisjCisKK2xpYi15CQk6PSBiYWNrdHJhY2UubyBjaGFuZ2ViaXQubyBjc3VtaXB2Ni5vIGNzdW1wYXJ0aWFsLm8gICBcCisJCSAgIGNzdW1wYXJ0aWFsY29weS5vIGNzdW1wYXJ0aWFsY29weXVzZXIubyBjbGVhcmJpdC5vIFwKKwkJICAgY29weV9wYWdlLm8gZGVsYXkubyBmaW5kYml0Lm8gbWVtY2hyLm8gbWVtY3B5Lm8gICAgXAorCQkgICBtZW1zZXQubyBtZW16ZXJvLm8gc2V0Yml0Lm8gc3RybmNweV9mcm9tX3VzZXIubyAgICBcCisJCSAgIHN0cm5sZW5fdXNlci5vIHN0cmNoci5vIHN0cnJjaHIubyB0ZXN0Y2hhbmdlYml0Lm8gIFwKKwkJICAgdGVzdGNsZWFyYml0Lm8gdGVzdHNldGJpdC5vIHVhY2Nlc3MubyBnZXR1c2VyLm8gICAgXAorCQkgICBwdXR1c2VyLm8gYXNobGRpMy5vIGFzaHJkaTMubyBsc2hyZGkzLm8gbXVsZGkzLm8gICBcCisJCSAgIHVjbXBkaTIubyB1ZGl2ZGkzLm8gbGliMWZ1bmNzLm8gZGl2NjQubwkgICAgICBcCisJCSAgIGlvLXJlYWRzYi5vIGlvLXdyaXRlc2IubyBpby1yZWFkc2wubyBpby13cml0ZXNsLm8KKworaWZlcSAoJChDT05GSUdfQ1BVXzMydjMpLHkpCisgIGxpYi15CSs9IGlvLXJlYWRzdy1hcm12My5vIGlvLXdyaXRlc3ctYXJtdjMubworZWxzZQorICBsaWIteQkrPSBpby1yZWFkc3ctYXJtdjQubyBpby13cml0ZXN3LWFybXY0Lm8KK2VuZGlmCisKK2xpYi0kKENPTkZJR19BUkNIX1JQQykJCSs9IGVjYXJkLm8gaW8tYWNvcm4ubyBmbG9wcHlkbWEubworbGliLSQoQ09ORklHX0FSQ0hfQ0xQUzc1MDApCSs9IGlvLWFjb3JuLm8KK2xpYi0kKENPTkZJR19BUkNIX0w3MjAwKQkrPSBpby1hY29ybi5vCitsaWItJChDT05GSUdfQVJDSF9TSEFSSykJKz0gaW8tc2hhcmsubworCiskKG9iaikvY3N1bXBhcnRpYWxjb3B5Lm86CSQob2JqKS9jc3VtcGFydGlhbGNvcHlnZW5lcmljLlMKKyQob2JqKS9jc3VtcGFydGlhbGNvcHl1c2VyLm86CSQob2JqKS9jc3VtcGFydGlhbGNvcHlnZW5lcmljLlMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9hc2hsZGkzLmMgYi9hcmNoL2FybS9saWIvYXNobGRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGY1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvYXNobGRpMy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIE1vcmUgc3Vicm91dGluZXMgbmVlZGVkIGJ5IEdDQyBvdXRwdXQgY29kZSBvbiBzb21lIG1hY2hpbmVzLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTg5LCA5Mi05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgorCitHTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBvdGhlciBmaWxlcywKKyAgIHNvbWUgb2Ygd2hpY2ggYXJlIGNvbXBpbGVkIHdpdGggR0NDLCB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsCisgICB0aGlzIGxpYnJhcnkgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZQorICAgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5CisgICB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisvKiBzdXBwb3J0IGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUga2VybmVsLiBiYXNlZCBvbiBjb2RlIGZyb20gZ2NjLTIuOTUuMyAqLworLyogSSBNb2x0b24JMjkvMDcvMDEgKi8KKworI2luY2x1ZGUgImdjY2xpYi5oIgorCitESXR5cGUKK19fYXNobGRpMyAoREl0eXBlIHUsIHdvcmRfdHlwZSBiKQoreworICBESXVuaW9uIHc7CisgIHdvcmRfdHlwZSBibTsKKyAgREl1bmlvbiB1dTsKKworICBpZiAoYiA9PSAwKQorICAgIHJldHVybiB1OworCisgIHV1LmxsID0gdTsKKworICBibSA9IChzaXplb2YgKFNJdHlwZSkgKiBCSVRTX1BFUl9VTklUKSAtIGI7CisgIGlmIChibSA8PSAwKQorICAgIHsKKyAgICAgIHcucy5sb3cgPSAwOworICAgICAgdy5zLmhpZ2ggPSAoVVNJdHlwZSl1dS5zLmxvdyA8PCAtYm07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgVVNJdHlwZSBjYXJyaWVzID0gKFVTSXR5cGUpdXUucy5sb3cgPj4gYm07CisgICAgICB3LnMubG93ID0gKFVTSXR5cGUpdXUucy5sb3cgPDwgYjsKKyAgICAgIHcucy5oaWdoID0gKChVU0l0eXBlKXV1LnMuaGlnaCA8PCBiKSB8IGNhcnJpZXM7CisgICAgfQorCisgIHJldHVybiB3LmxsOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYXNocmRpMy5jIGIvYXJjaC9hcm0vbGliL2FzaHJkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTYyNWQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2FzaHJkaTMuYwpAQCAtMCwwICsxLDYxIEBACisvKiBNb3JlIHN1YnJvdXRpbmVzIG5lZWRlZCBieSBHQ0Mgb3V0cHV0IGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk4OSwgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggb3RoZXIgZmlsZXMsCisgICBzb21lIG9mIHdoaWNoIGFyZSBjb21waWxlZCB3aXRoIEdDQywgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAorICAgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUKKyAgIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQorICAgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworLyogc3VwcG9ydCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGtlcm5lbC4gYmFzZWQgb24gY29kZSBmcm9tIGdjYy0yLjk1LjMgKi8KKy8qIEkgTW9sdG9uICAgICAyOS8wNy8wMSAqLworCisjaW5jbHVkZSAiZ2NjbGliLmgiCisKK0RJdHlwZQorX19hc2hyZGkzIChESXR5cGUgdSwgd29yZF90eXBlIGIpCit7CisgIERJdW5pb24gdzsKKyAgd29yZF90eXBlIGJtOworICBESXVuaW9uIHV1OworCisgIGlmIChiID09IDApCisgICAgcmV0dXJuIHU7CisKKyAgdXUubGwgPSB1OworCisgIGJtID0gKHNpemVvZiAoU0l0eXBlKSAqIEJJVFNfUEVSX1VOSVQpIC0gYjsKKyAgaWYgKGJtIDw9IDApCisgICAgeworICAgICAgLyogdy5zLmhpZ2ggPSAxLi4xIG9yIDAuLjAgKi8KKyAgICAgIHcucy5oaWdoID0gdXUucy5oaWdoID4+IChzaXplb2YgKFNJdHlwZSkgKiBCSVRTX1BFUl9VTklUIC0gMSk7CisgICAgICB3LnMubG93ID0gdXUucy5oaWdoID4+IC1ibTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBVU0l0eXBlIGNhcnJpZXMgPSAoVVNJdHlwZSl1dS5zLmhpZ2ggPDwgYm07CisgICAgICB3LnMuaGlnaCA9IHV1LnMuaGlnaCA+PiBiOworICAgICAgdy5zLmxvdyA9ICgoVVNJdHlwZSl1dS5zLmxvdyA+PiBiKSB8IGNhcnJpZXM7CisgICAgfQorCisgIHJldHVybiB3LmxsOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2JhY2t0cmFjZS5TIGIvYXJjaC9hcm0vbGliL2JhY2t0cmFjZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTIxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvYmFja3RyYWNlLlMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2JhY2t0cmFjZS5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIDI3LzAzLzAzIElhbiBNb2x0b24gQ2xlYW4gdXAgQ09ORklHX0NQVQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisJCS50ZXh0CisKK0AgZnAgaXMgMCBvciBzdGFjayBmcmFtZQorCisjZGVmaW5lIGZyYW1lCXI0CisjZGVmaW5lIG5leHQJcjUKKyNkZWZpbmUgc2F2ZQlyNgorI2RlZmluZSBtYXNrCXI3CisjZGVmaW5lIG9mZnNldAlyOAorCitFTlRSWShfX2JhY2t0cmFjZSkKKwkJbW92CXIxLCAjMHgxMAorCQltb3YJcjAsIGZwCisKK0VOVFJZKGNfYmFja3RyYWNlKQorCisjaWZuZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJCW1vdglwYywgbHIKKyNlbHNlCisKKwkJc3RtZmQJc3AhLCB7cjQgLSByOCwgbHJ9CUAgU2F2ZSBhbiBleHRyYSByZWdpc3RlciBzbyB3ZSBoYXZlIGEgbG9jYXRpb24uLi4KKwkJdHN0CXIxLCAjMHgxMAkJQCAyNiBvciAzMi1iaXQ/CisJCW1vdmVxCW1hc2ssICMweGZjMDAwMDAzCisJCW1vdm5lCW1hc2ssICMwCisJCXRzdAltYXNrLCByMAorCQltb3ZuZQlyMCwgIzAKKwkJbW92cwlmcmFtZSwgcjAKKzE6CQltb3ZlcQlyMCwgIy0yCisJCUxPQURSRUdTKGVxZmQsIHNwISwge3I0IC0gcjgsIHBjfSkKKworMjoJCXN0bWZkCXNwISwge3BjfQkJQCBjYWxjdWxhdGUgb2Zmc2V0IG9mIFBDIGluIFNUTUlBIGluc3RydWN0aW9uCisJCWxkcglyMCwgW3NwXSwgIzQKKwkJYWRyCXIxLCAyYiAtIDQKKwkJc3ViCW9mZnNldCwgcjAsIHIxCisKKzM6CQl0c3QJZnJhbWUsIG1hc2sJCUAgQ2hlY2sgZm9yIGFkZHJlc3MgZXhjZXB0aW9ucy4uLgorCQlibmUJMWIKKworMTAwMToJCWxkcgluZXh0LCBbZnJhbWUsICMtMTJdCUAgZ2V0IGZwCisxMDAyOgkJbGRyCXIyLCBbZnJhbWUsICMtNF0JQCBnZXQgbHIKKzEwMDM6CQlsZHIJcjMsIFtmcmFtZSwgIzBdCQlAIGdldCBwYworCQlzdWIJc2F2ZSwgcjMsIG9mZnNldAlAIENvcnJlY3QgUEMgZm9yIHByZWZldGNoaW5nCisJCWJpYwlzYXZlLCBzYXZlLCBtYXNrCisxMDA0OgkJbGRyCXIxLCBbc2F2ZSwgIzBdCQlAIGdldCBpbnN0cnVjdGlvbiBhdCBmdW5jdGlvbgorCQltb3YJcjEsIHIxLCBsc3IgIzEwCisJCWxkcglyMywgLkxkc2krNAorCQl0ZXEJcjEsIHIzCisJCXN1YmVxCXNhdmUsIHNhdmUsICM0CisJCW1vdglyMCwgc2F2ZQorCQliaWMJcjEsIHIyLCBtYXNrCisJCWJsCWR1bXBfYmFja3RyYWNlX2VudHJ5CisKKwkJbGRyCXIwLCBbZnJhbWUsICMtOF0JQCBnZXQgc3AKKwkJc3ViCXIwLCByMCwgIzQKKzEwMDU6CQlsZHIJcjEsIFtzYXZlLCAjNF0JCUAgZ2V0IGluc3RydWN0aW9uIGF0IGZ1bmN0aW9uKzQKKwkJbW92CXIzLCByMSwgbHNyICMxMAorCQlsZHIJcjIsIC5MZHNpKzQKKwkJdGVxCXIzLCByMgkJCUAgQ2hlY2sgZm9yIHN0bWlhIHNwISwge2FyZ3N9CisJCWFkZGVxCXNhdmUsIHNhdmUsICM0CQlAIG5leHQgaW5zdHJ1Y3Rpb24KKwkJYmxlcQkuTGR1bXBzdG0KKworCQlzdWIJcjAsIGZyYW1lLCAjMTYKKzEwMDY6CQlsZHIJcjEsIFtzYXZlLCAjNF0JCUAgR2V0ICdzdG1pYSBzcCEsIHtybGlzdCwgZnAsIGlwLCBsciwgcGN9JyBpbnN0cnVjdGlvbgorCQltb3YJcjMsIHIxLCBsc3IgIzEwCisJCWxkcglyMiwgLkxkc2kKKwkJdGVxCXIzLCByMgorCQlibGVxCS5MZHVtcHN0bQorCisJCS8qCisJCSAqIEEgemVybyBuZXh0IGZyYW1lcG9pbnRlciBtZWFucyB3ZSdyZSBkb25lLgorCQkgKi8KKwkJdGVxCW5leHQsICMwCisJCUxPQURSRUdTKGVxZmQsIHNwISwge3I0IC0gcjgsIHBjfSkKKworCQkvKgorCQkgKiBUaGUgbmV4dCBmcmFtZXBvaW50ZXIgbXVzdCBiZSBhYm92ZSB0aGUKKwkJICogY3VycmVudCBmcmFtZXBvaW50ZXIuCisJCSAqLworCQljbXAJbmV4dCwgZnJhbWUKKwkJbW92CWZyYW1lLCBuZXh0CisJCWJoaQkzYgorCQliCTEwMDdmCisKKy8qCisgKiBGaXh1cCBmb3IgTERNREIKKyAqLworCQkuc2VjdGlvbiAuZml4dXAsImF4IgorCQkuYWxpZ24JMAorMTAwNzoJCWxkcglyMCwgPS5MYmFkCisJCW1vdglyMSwgZnJhbWUKKwkJYmwJcHJpbnRrCisJCUxPQURSRUdTKGZkLCBzcCEsIHtyNCAtIHI4LCBwY30pCisJCS5sdG9yZworCQkucHJldmlvdXMKKwkJCisJCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJCS5hbGlnbgkzCisJCS5sb25nCTEwMDFiLCAxMDA3YgorCQkubG9uZwkxMDAyYiwgMTAwN2IKKwkJLmxvbmcJMTAwM2IsIDEwMDdiCisJCS5sb25nCTEwMDRiLCAxMDA3YgorCQkubG9uZwkxMDA1YiwgMTAwN2IKKwkJLmxvbmcJMTAwNmIsIDEwMDdiCisJCS5wcmV2aW91cworCisjZGVmaW5lIGluc3RyIHI0CisjZGVmaW5lIHJlZyAgIHI1CisjZGVmaW5lIHN0YWNrIHI2CisKKy5MZHVtcHN0bToJc3RtZmQJc3AhLCB7aW5zdHIsIHJlZywgc3RhY2ssIHI3LCBscn0KKwkJbW92CXN0YWNrLCByMAorCQltb3YJaW5zdHIsIHIxCisJCW1vdglyZWcsICM5CisJCW1vdglyNywgIzAKKzE6CQltb3YJcjMsICMxCisJCXRzdAlpbnN0ciwgcjMsIGxzbCByZWcKKwkJYmVxCTJmCisJCWFkZAlyNywgcjcsICMxCisJCXRlcQlyNywgIzQKKwkJbW92ZXEJcjcsICMwCisJCW1vdmVxCXIzLCAjJ1xuJworCQltb3ZuZQlyMywgIycgJworCQlsZHIJcjIsIFtzdGFja10sICMtNAorCQltb3YJcjEsIHJlZworCQlhZHIJcjAsIC5MZnAKKwkJYmwJcHJpbnRrCisyOgkJc3VicwlyZWcsIHJlZywgIzEKKwkJYnBsCTFiCisJCXRlcQlyNywgIzAKKwkJYWRybmUJcjAsIC5MY3IKKwkJYmxuZQlwcmludGsKKwkJbW92CXIwLCBzdGFjaworCQlMT0FEUkVHUyhmZCwgc3AhLCB7aW5zdHIsIHJlZywgc3RhY2ssIHI3LCBwY30pCisKKy5MZnA6CQkuYXNjaXoJIiByJWQgPSAlMDhYJWMiCisuTGNyOgkJLmFzY2l6CSJcbiIKKy5MYmFkOgkJLmFzY2l6CSJCYWNrdHJhY2UgYWJvcnRlZCBkdWUgdG8gYmFkIGZyYW1lIHBvaW50ZXIgPCVwPlxuIgorCQkuYWxpZ24KKy5MZHNpOgkJLndvcmQJMHgwMGU5MmRkOCA+PiAyCisJCS53b3JkCTB4MDBlOTJkMDAgPj4gMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jaGFuZ2ViaXQuUyBiL2FyY2gvYXJtL2xpYi9jaGFuZ2ViaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY0NWNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2NoYW5nZWJpdC5TCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2NoYW5nZWJpdC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorICAgICAgICAgICAgICAgIC50ZXh0CisKKy8qIFB1cnBvc2UgIDogRnVuY3Rpb24gdG8gY2hhbmdlIGEgYml0CisgKiBQcm90b3R5cGU6IGludCBjaGFuZ2VfYml0KGludCBiaXQsIHZvaWQgKmFkZHIpCisgKi8KK0VOVFJZKF9jaGFuZ2VfYml0X2JlKQorCQllb3IJcjAsIHIwLCAjMHgxOAkJQCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXJpbmcKK0VOVFJZKF9jaGFuZ2VfYml0X2xlKQorCQlhbmQJcjIsIHIwLCAjNworCQltb3YJcjMsICMxCisJCW1vdglyMywgcjMsIGxzbCByMgorCQlzYXZlX2FuZF9kaXNhYmxlX2lycXMgaXAsIHIyCisJCWxkcmIJcjIsIFtyMSwgcjAsIGxzciAjM10KKwkJZW9yCXIyLCByMiwgcjMKKwkJc3RyYglyMiwgW3IxLCByMCwgbHNyICMzXQorCQlyZXN0b3JlX2lycXMgaXAKKwkJUkVUSU5TVFIobW92LHBjLGxyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NsZWFyYml0LlMgYi9hcmNoL2FybS9saWIvY2xlYXJiaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlhMmNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2NsZWFyYml0LlMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvY2xlYXJiaXQuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyAgICAgICAgICAgICAgICAudGV4dAorCisvKgorICogUHVycG9zZSAgOiBGdW5jdGlvbiB0byBjbGVhciBhIGJpdAorICogUHJvdG90eXBlOiBpbnQgY2xlYXJfYml0KGludCBiaXQsIHZvaWQgKmFkZHIpCisgKi8KK0VOVFJZKF9jbGVhcl9iaXRfYmUpCisJCWVvcglyMCwgcjAsICMweDE4CQlAIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcmluZworRU5UUlkoX2NsZWFyX2JpdF9sZSkKKwkJYW5kCXIyLCByMCwgIzcKKwkJbW92CXIzLCAjMQorCQltb3YJcjMsIHIzLCBsc2wgcjIKKwkJc2F2ZV9hbmRfZGlzYWJsZV9pcnFzIGlwLCByMgorCQlsZHJiCXIyLCBbcjEsIHIwLCBsc3IgIzNdCisJCWJpYwlyMiwgcjIsIHIzCisJCXN0cmIJcjIsIFtyMSwgcjAsIGxzciAjM10KKwkJcmVzdG9yZV9pcnFzIGlwCisJCVJFVElOU1RSKG1vdixwYyxscikKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY29weV9wYWdlLlMgYi9hcmNoL2FybS9saWIvY29weV9wYWdlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzOGFiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UuUwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9jb3B5cGFnZS5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFTTSBvcHRpbWlzZWQgc3RyaW5nIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisKKyNkZWZpbmUgQ09QWV9DT1VOVCAoUEFHRV9TWi82NCBQTEQoIC0xICkpCisKKwkJLnRleHQKKwkJLmFsaWduCTUKKy8qCisgKiBTdHJvbmdBUk0gb3B0aW1pc2VkIGNvcHlfcGFnZSByb3V0aW5lCisgKiBub3cgMS43OGJ5dGVzL2N5Y2xlLCB3YXMgMS42MCBieXRlcy9jeWNsZSAoNTBNSHogYnVzIC0+IDg5TUIvcykKKyAqIE5vdGUgdGhhdCB3ZSBwcm9iYWJseSBhY2hpZXZlIGNsb3NlciB0byB0aGUgMTAwTUIvcyB0YXJnZXQgd2l0aAorICogdGhlIGNvcmUgY2xvY2sgc3dpdGNoaW5nLgorICovCitFTlRSWShjb3B5X3BhZ2UpCisJCXN0bWZkCXNwISwge3I0LCBscn0JCQlACTIKKwlQTEQoCXBsZAlbcjEsICMwXQkJKQorCVBMRCgJcGxkCVtyMSwgIzMyXQkJKQorCQltb3YJcjIsICNDT1BZX0NPVU5UCQkJQAkxCisJCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0KzEKKzE6CVBMRCgJcGxkCVtyMSwgIzY0XQkJKQorCVBMRCgJcGxkCVtyMSwgIzk2XQkJKQorMjoJCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0CisJCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0KzEKKwkJc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKKwkJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMQorCQlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAJNAorCQlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAJNAorCQlzdWJzCXIyLCByMiwgIzEJCQlACTEKKwkJc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKKwkJbGRtZ3RpYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAJNAorCQliZ3QJMWIJCQkJQAkxCisJUExEKAlsZG1lcWlhIHIxISwge3IzLCByNCwgaXAsIGxyfQkpCisJUExEKAliZXEJMmIJCQkpCisJCUxPQURSRUdTKGZkLCBzcCEsIHtyNCwgcGN9KQkJQAkzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bWlwdjYuUyBiL2FyY2gvYXJtL2xpYi9jc3VtaXB2Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjVhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvY3N1bWlwdjYuUwpAQCAtMCwwICsxLDMyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9jc3VtaXB2Ni5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJCS50ZXh0CisKK0VOVFJZKF9fY3N1bV9pcHY2X21hZ2ljKQorCQlzdHIJbHIsIFtzcCwgIy00XSEKKwkJYWRkcwlpcCwgcjIsIHIzCisJCWxkbWlhCXIxLCB7cjEgLSByMywgbHJ9CisJCWFkY3MJaXAsIGlwLCByMQorCQlhZGNzCWlwLCBpcCwgcjIKKwkJYWRjcwlpcCwgaXAsIHIzCisJCWFkY3MJaXAsIGlwLCBscgorCQlsZG1pYQlyMCwge3IwIC0gcjN9CisJCWFkY3MJcjAsIGlwLCByMAorCQlhZGNzCXIwLCByMCwgcjEKKwkJYWRjcwlyMCwgcjAsIHIyCisJCWxkcglyMiwgW3NwLCAjNF0KKwkJYWRjcwlyMCwgcjAsIHIzCisJCWFkY3MJcjAsIHIwLCByMgorCQlhZGNzCXIwLCByMCwgIzAKKwkJTE9BRFJFR1MoZmQsIHNwISwge3BjfSkKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsLlMgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjVlMzcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsLlMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKKwkJLnRleHQKKworLyoKKyAqIEZ1bmN0aW9uOiBfX3UzMiBjc3VtX3BhcnRpYWwoY29uc3QgY2hhciAqc3JjLCBpbnQgbGVuLCBfX3UzMiBzdW0pCisgKiBQYXJhbXMgIDogcjAgPSBidWZmZXIsIHIxID0gbGVuLCByMiA9IGNoZWNrc3VtCisgKiBSZXR1cm5zIDogcjAgPSBuZXcgY2hlY2tzdW0KKyAqLworCitidWYJLnJlcQlyMAorbGVuCS5yZXEJcjEKK3N1bQkucmVxCXIyCit0ZDAJLnJlcQlyMwordGQxCS5yZXEJcjQJQCBzYXZlIGJlZm9yZSB1c2UKK3RkMgkucmVxCXI1CUAgc2F2ZSBiZWZvcmUgdXNlCit0ZDMJLnJlcQlscgorCisuemVybzoJCW1vdglyMCwgc3VtCisJCWFkZAlzcCwgc3AsICM0CisJCWxkcglwYywgW3NwXSwgIzQKKworCQkvKgorCQkgKiBIYW5kbGUgMCB0byA3IGJ5dGVzLCB3aXRoIGFueSBhbGlnbm1lbnQgb2Ygc291cmNlIGFuZAorCQkgKiBkZXN0aW5hdGlvbiBwb2ludGVycy4gIE5vdGUgdGhhdCB3aGVuIHdlIGdldCBoZXJlLCBDID0gMAorCQkgKi8KKy5sZXNzODoJCXRlcQlsZW4sICMwCQkJQCBjaGVjayBmb3IgemVybyBjb3VudAorCQliZXEJLnplcm8KKworCQkvKiB3ZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJ5dGUuICovCisJCXRzdAlidWYsICMxCQkJQCBvZGQgYWRkcmVzcz8KKwkJbGRybmViCXRkMCwgW2J1Zl0sICMxCisJCXN1Ym5lCWxlbiwgbGVuLCAjMQorCQlhZGNuZXMJc3VtLCBzdW0sIHRkMCwgcHV0X2J5dGVfMQorCisubGVzczQ6CQl0c3QJbGVuLCAjNgorCQliZXEJLmxlc3M4X2J5dGUKKworCQkvKiB3ZSBhcmUgbm93IGhhbGYtd29yZCBhbGlnbmVkICovCisKKy5sZXNzOF93b3JkbHA6CisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDQKKwkJbGRyaAl0ZDAsIFtidWZdLCAjMgorCQlzdWIJbGVuLCBsZW4sICMyCisjZWxzZQorCQlsZHJiCXRkMCwgW2J1Zl0sICMxCisJCWxkcmIJdGQzLCBbYnVmXSwgIzEKKwkJc3ViCWxlbiwgbGVuLCAjMgorI2lmbmRlZiBfX0FSTUVCX18KKwkJb3JyCXRkMCwgdGQwLCB0ZDMsIGxzbCAjOAorI2Vsc2UKKwkJb3JyCXRkMCwgdGQzLCB0ZDAsIGxzbCAjOAorI2VuZGlmCisjZW5kaWYKKwkJYWRjcwlzdW0sIHN1bSwgdGQwCisJCXRzdAlsZW4sICM2CisJCWJuZQkubGVzczhfd29yZGxwCisKKy5sZXNzOF9ieXRlOgl0c3QJbGVuLCAjMQkJCUAgb2RkIG51bWJlciBvZiBieXRlcworCQlsZHJuZWIJdGQwLCBbYnVmXSwgIzEJCUAgaW5jbHVkZSBsYXN0IGJ5dGUKKwkJYWRjbmVzCXN1bSwgc3VtLCB0ZDAsIHB1dF9ieXRlXzAJQCB1cGRhdGUgY2hlY2tzdW0KKworLmRvbmU6CQlhZGMJcjAsIHN1bSwgIzAJCUAgY29sbGVjdCB1cCB0aGUgbGFzdCBjYXJyeQorCQlsZHIJdGQwLCBbc3BdLCAjNAorCQl0c3QJdGQwLCAjMQkJCUAgY2hlY2sgYnVmZmVyIGFsaWdubWVudAorCQltb3ZuZQlyMCwgcjAsIHJvciAjOAkJQCByb3RhdGUgY2hlY2tzdW0gYnkgOCBiaXRzCisJCWxkcglwYywgW3NwXSwgIzQJCUAgcmV0dXJuCisKKy5ub3RfYWxpZ25lZDoJdHN0CWJ1ZiwgIzEJCQlAIG9kZCBhZGRyZXNzCisJCWxkcm5lYgl0ZDAsIFtidWZdLCAjMQkJQCBtYWtlIGV2ZW4KKwkJc3VibmUJbGVuLCBsZW4sICMxCisJCWFkY25lcwlzdW0sIHN1bSwgdGQwLCBwdXRfYnl0ZV8xCUAgdXBkYXRlIGNoZWNrc3VtCisKKwkJdHN0CWJ1ZiwgIzIJCQlAIDMyLWJpdCBhbGlnbmVkPworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA0CisJCWxkcm5laAl0ZDAsIFtidWZdLCAjMgkJQCBtYWtlIDMyLWJpdCBhbGlnbmVkCisJCXN1Ym5lCWxlbiwgbGVuLCAjMgorI2Vsc2UKKwkJbGRybmViCXRkMCwgW2J1Zl0sICMxCisJCWxkcm5lYglpcCwgW2J1Zl0sICMxCisJCXN1Ym5lCWxlbiwgbGVuLCAjMgorI2lmbmRlZiBfX0FSTUVCX18KKwkJb3JybmUJdGQwLCB0ZDAsIGlwLCBsc2wgIzgKKyNlbHNlCisJCW9ycm5lCXRkMCwgaXAsIHRkMCwgbHNsICM4CisjZW5kaWYKKyNlbmRpZgorCQlhZGNuZXMJc3VtLCBzdW0sIHRkMAkJQCB1cGRhdGUgY2hlY2tzdW0KKwkJbW92CXBjLCBscgorCitFTlRSWShjc3VtX3BhcnRpYWwpCisJCXN0bWZkCXNwISwge2J1ZiwgbHJ9CisJCWNtcAlsZW4sICM4CQkJQCBFbnN1cmUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0CisJCWJsbwkubGVzczgJCQlAIDggYnl0ZXMgdG8gY29weS4KKworCQlhZGRzCXN1bSwgc3VtLCAjMAkJQCBDID0gMAorCQl0c3QJYnVmLCAjMwkJCUAgVGVzdCBkZXN0aW5hdGlvbiBhbGlnbm1lbnQKKwkJYmxuZQkubm90X2FsaWduZWQJCUAgYWxpZ2ggZGVzdGluYXRpb24sIHJldHVybiBoZXJlCisKKzE6CQliaWNzCWlwLCBsZW4sICMzMQorCQliZXEJM2YKKworCQlzdG1mZAlzcCEsIHtyNCAtIHI1fQorMjoJCWxkbWlhCWJ1ZiEsIHt0ZDAsIHRkMSwgdGQyLCB0ZDN9CisJCWFkY3MJc3VtLCBzdW0sIHRkMAorCQlhZGNzCXN1bSwgc3VtLCB0ZDEKKwkJYWRjcwlzdW0sIHN1bSwgdGQyCisJCWFkY3MJc3VtLCBzdW0sIHRkMworCQlsZG1pYQlidWYhLCB7dGQwLCB0ZDEsIHRkMiwgdGQzfQorCQlhZGNzCXN1bSwgc3VtLCB0ZDAKKwkJYWRjcwlzdW0sIHN1bSwgdGQxCisJCWFkY3MJc3VtLCBzdW0sIHRkMgorCQlhZGNzCXN1bSwgc3VtLCB0ZDMKKwkJc3ViCWlwLCBpcCwgIzMyCisJCXRlcQlpcCwgIzAKKwkJYm5lCTJiCisJCWxkbWZkCXNwISwge3I0IC0gcjV9CisKKzM6CQl0c3QJbGVuLCAjMHgxYwkJQCBzaG91bGQgbm90IGNoYW5nZSBDCisJCWJlcQkubGVzczQKKworNDoJCWxkcgl0ZDAsIFtidWZdLCAjNAorCQlzdWIJbGVuLCBsZW4sICM0CisJCWFkY3MJc3VtLCBzdW0sIHRkMAorCQl0c3QJbGVuLCAjMHgxYworCQlibmUJNGIKKwkJYgkubGVzczQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHkuUyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTBlZTYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weS5TCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weS5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJCS50ZXh0CisKKy8qIEZ1bmN0aW9uOiBfX3UzMiBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBfX3UzMiBzdW0pCisgKiBQYXJhbXMgIDogcjAgPSBzcmMsIHIxID0gZHN0LCByMiA9IGxlbiwgcjMgPSBjaGVja3N1bQorICogUmV0dXJucyA6IHIwID0gbmV3IGNoZWNrc3VtCisgKi8KKworCQkubWFjcm8Jc2F2ZV9yZWdzCisJCXN0bWZkCXNwISwge3IxLCByNCAtIHI4LCBmcCwgaXAsIGxyLCBwY30KKwkJLmVuZG0KKworCQkubWFjcm8JbG9hZF9yZWdzLGZsYWdzCisJCUxPQURSRUdTKFxmbGFncyxmcCx7cjEsIHI0IC0gcjgsIGZwLCBzcCwgcGN9KQorCQkuZW5kbQorCisJCS5tYWNybwlsb2FkMWIsIHJlZzEKKwkJbGRyYglccmVnMSwgW3IwXSwgIzEKKwkJLmVuZG0KKworCQkubWFjcm8JbG9hZDJiLCByZWcxLCByZWcyCisJCWxkcmIJXHJlZzEsIFtyMF0sICMxCisJCWxkcmIJXHJlZzIsIFtyMF0sICMxCisJCS5lbmRtCisKKwkJLm1hY3JvCWxvYWQxbCwgcmVnMQorCQlsZHIJXHJlZzEsIFtyMF0sICM0CisJCS5lbmRtCisKKwkJLm1hY3JvCWxvYWQybCwgcmVnMSwgcmVnMgorCQlsZHIJXHJlZzEsIFtyMF0sICM0CisJCWxkcglccmVnMiwgW3IwXSwgIzQKKwkJLmVuZG0KKworCQkubWFjcm8JbG9hZDRsLCByZWcxLCByZWcyLCByZWczLCByZWc0CisJCWxkbWlhCXIwISwge1xyZWcxLCBccmVnMiwgXHJlZzMsIFxyZWc0fQorCQkuZW5kbQorCisjZGVmaW5lIEZOX0VOVFJZCUVOVFJZKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spCisKKyNpbmNsdWRlICJjc3VtcGFydGlhbGNvcHlnZW5lcmljLlMiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EyZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUwpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIHVuc2lnbmVkIGludAorICogY3N1bV9wYXJ0aWFsX2NvcHlfeHh4KGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtLCApCisgKiAgcjAgPSBzcmMsIHIxID0gZHN0LCByMiA9IGxlbiwgcjMgPSBzdW0KKyAqICBSZXR1cm5zIDogcjAgPSBjaGVja3N1bQorICoKKyAqIE5vdGUgdGhhdCAndHN0JyBhbmQgJ3RlcScgcHJlc2VydmUgdGhlIGNhcnJ5IGZsYWcuCisgKi8KKworc3JjCS5yZXEJcjAKK2RzdAkucmVxCXIxCitsZW4JLnJlcQlyMgorc3VtCS5yZXEJcjMKKworLnplcm86CQltb3YJcjAsIHN1bQorCQlsb2FkX3JlZ3MJZWEKKworCQkvKgorCQkgKiBBbGlnbiBhbiB1bmFsaWduZWQgZGVzdGluYXRpb24gcG9pbnRlci4gIFdlIGtub3cgdGhhdAorCQkgKiB3ZSBoYXZlID49IDggYnl0ZXMgaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjaworCQkgKiB0aGUgbGVuZ3RoLiAgTm90ZSB0aGF0IHRoZSBzb3VyY2UgcG9pbnRlciBoYXNuJ3QgYmVlbgorCQkgKiBhbGlnbmVkIHlldC4KKwkJICovCisuZHN0X3VuYWxpZ25lZDoJdHN0CWRzdCwgIzEKKwkJYmVxCS5kc3RfMTZiaXQKKworCQlsb2FkMWIJaXAKKwkJc3ViCWxlbiwgbGVuLCAjMQorCQlhZGNzCXN1bSwgc3VtLCBpcCwgcHV0X2J5dGVfMQlAIHVwZGF0ZSBjaGVja3N1bQorCQlzdHJiCWlwLCBbZHN0XSwgIzEKKwkJdHN0CWRzdCwgIzIKKwkJbW92ZXEJcGMsIGxyCQkJQCBkc3QgaXMgbm93IDMyYml0IGFsaWduZWQKKworLmRzdF8xNmJpdDoJbG9hZDJiCXI4LCBpcAorCQlzdWIJbGVuLCBsZW4sICMyCisJCWFkY3MJc3VtLCBzdW0sIHI4LCBwdXRfYnl0ZV8wCisJCXN0cmIJcjgsIFtkc3RdLCAjMQorCQlhZGNzCXN1bSwgc3VtLCBpcCwgcHV0X2J5dGVfMQorCQlzdHJiCWlwLCBbZHN0XSwgIzEKKwkJbW92CXBjLCBscgkJCUAgZHN0IGlzIG5vdyAzMmJpdCBhbGlnbmVkCisKKwkJLyoKKwkJICogSGFuZGxlIDAgdG8gNyBieXRlcywgd2l0aCBhbnkgYWxpZ25tZW50IG9mIHNvdXJjZSBhbmQKKwkJICogZGVzdGluYXRpb24gcG9pbnRlcnMuICBOb3RlIHRoYXQgd2hlbiB3ZSBnZXQgaGVyZSwgQyA9IDAKKwkJICovCisubGVzczg6CQl0ZXEJbGVuLCAjMAkJCUAgY2hlY2sgZm9yIHplcm8gY291bnQKKwkJYmVxCS56ZXJvCisKKwkJLyogd2UgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBieXRlLiAqLworCQl0c3QJZHN0LCAjMQkJCUAgZHN0IDE2LWJpdCBhbGlnbmVkCisJCWJlcQkubGVzczhfYWxpZ25lZAorCisJCS8qIEFsaWduIGRzdCAqLworCQlsb2FkMWIJaXAKKwkJc3ViCWxlbiwgbGVuLCAjMQorCQlhZGNzCXN1bSwgc3VtLCBpcCwgcHV0X2J5dGVfMQlAIHVwZGF0ZSBjaGVja3N1bQorCQlzdHJiCWlwLCBbZHN0XSwgIzEKKwkJdHN0CWxlbiwgIzYKKwkJYmVxCS5sZXNzOF9ieXRlb25seQorCisxOgkJbG9hZDJiCXI4LCBpcAorCQlzdWIJbGVuLCBsZW4sICMyCisJCWFkY3MJc3VtLCBzdW0sIHI4LCBwdXRfYnl0ZV8wCisJCXN0cmIJcjgsIFtkc3RdLCAjMQorCQlhZGNzCXN1bSwgc3VtLCBpcCwgcHV0X2J5dGVfMQorCQlzdHJiCWlwLCBbZHN0XSwgIzEKKy5sZXNzOF9hbGlnbmVkOgl0c3QJbGVuLCAjNgorCQlibmUJMWIKKy5sZXNzOF9ieXRlb25seToKKwkJdHN0CWxlbiwgIzEKKwkJYmVxCS5kb25lCisJCWxvYWQxYglyOAorCQlhZGNzCXN1bSwgc3VtLCByOCwgcHV0X2J5dGVfMAlAIHVwZGF0ZSBjaGVja3N1bQorCQlzdHJiCXI4LCBbZHN0XSwgIzEKKwkJYgkuZG9uZQorCitGTl9FTlRSWQorCQltb3YJaXAsIHNwCisJCXNhdmVfcmVncworCQlzdWIJZnAsIGlwLCAjNAorCisJCWNtcAlsZW4sICM4CQkJQCBFbnN1cmUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0CisJCWJsbwkubGVzczgJCQlAIDggYnl0ZXMgdG8gY29weS4KKworCQlhZGRzCXN1bSwgc3VtLCAjMAkJQCBDID0gMAorCQl0c3QJZHN0LCAjMwkJCUAgVGVzdCBkZXN0aW5hdGlvbiBhbGlnbm1lbnQKKwkJYmxuZQkuZHN0X3VuYWxpZ25lZAkJQCBhbGlnbiBkZXN0aW5hdGlvbiwgcmV0dXJuIGhlcmUKKworCQkvKgorCQkgKiBPaywgdGhlIGRzdCBwb2ludGVyIGlzIG5vdyAzMmJpdCBhbGlnbmVkLCBhbmQgd2Uga25vdworCQkgKiB0aGF0IHdlIG11c3QgaGF2ZSBtb3JlIHRoYW4gNCBieXRlcyB0byBjb3B5LiAgTm90ZQorCQkgKiB0aGF0IEMgY29udGFpbnMgdGhlIGNhcnJ5IGZyb20gdGhlIGRzdCBhbGlnbm1lbnQgYWJvdmUuCisJCSAqLworCisJCXRzdAlzcmMsICMzCQkJQCBUZXN0IHNvdXJjZSBhbGlnbm1lbnQKKwkJYm5lCS5zcmNfbm90X2FsaWduZWQKKworCQkvKiBSb3V0aW5lIGZvciBzcmMgJiBkc3QgYWxpZ25lZCAqLworCisJCWJpY3MJaXAsIGxlbiwgIzE1CisJCWJlcQkyZgorCisxOgkJbG9hZDRsCXI0LCByNSwgcjYsIHI3CisJCXN0bWlhCWRzdCEsIHtyNCwgcjUsIHI2LCByN30KKwkJYWRjcwlzdW0sIHN1bSwgcjQKKwkJYWRjcwlzdW0sIHN1bSwgcjUKKwkJYWRjcwlzdW0sIHN1bSwgcjYKKwkJYWRjcwlzdW0sIHN1bSwgcjcKKwkJc3ViCWlwLCBpcCwgIzE2CisJCXRlcQlpcCwgIzAKKwkJYm5lCTFiCisKKzI6CQlhbmRzCWlwLCBsZW4sICMxMgorCQliZXEJNGYKKwkJdHN0CWlwLCAjOAorCQliZXEJM2YKKwkJbG9hZDJsCXI0LCByNQorCQlzdG1pYQlkc3QhLCB7cjQsIHI1fQorCQlhZGNzCXN1bSwgc3VtLCByNAorCQlhZGNzCXN1bSwgc3VtLCByNQorCQl0c3QJaXAsICM0CisJCWJlcQk0ZgorCiszOgkJbG9hZDFsCXI0CisJCXN0cglyNCwgW2RzdF0sICM0CisJCWFkY3MJc3VtLCBzdW0sIHI0CisKKzQ6CQlhbmRzCWxlbiwgbGVuLCAjMworCQliZXEJLmRvbmUKKwkJbG9hZDFsCXI0CisJCXRzdAlsZW4sICMyCisJCW1vdglyNSwgcjQsIGdldF9ieXRlXzAKKwkJYmVxCS5leGl0CisJCWFkY3MJc3VtLCBzdW0sIHI0LCBwdXNoICMxNgorCQlzdHJiCXI1LCBbZHN0XSwgIzEKKwkJbW92CXI1LCByNCwgZ2V0X2J5dGVfMQorCQlzdHJiCXI1LCBbZHN0XSwgIzEKKwkJbW92CXI1LCByNCwgZ2V0X2J5dGVfMgorLmV4aXQ6CQl0c3QJbGVuLCAjMQorCQlzdHJuZWIJcjUsIFtkc3RdLCAjMQorCQlhbmRuZQlyNSwgcjUsICMyNTUKKwkJYWRjbmVzCXN1bSwgc3VtLCByNSwgcHV0X2J5dGVfMAorCisJCS8qCisJCSAqIElmIHRoZSBkc3QgcG9pbnRlciB3YXMgbm90IDE2LWJpdCBhbGlnbmVkLCB3ZQorCQkgKiBuZWVkIHRvIHJvdGF0ZSB0aGUgY2hlY2tzdW0gaGVyZSB0byBnZXQgYXJvdW5kCisJCSAqIHRoZSBpbmVmZmljaWVudCBieXRlIG1hbmlwdWxhdGlvbnMgaW4gdGhlCisJCSAqIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBjb2RlLgorCQkgKi8KKy5kb25lOgkJYWRjCXIwLCBzdW0sICMwCisJCWxkcglzdW0sIFtzcCwgIzBdCQlAIGRzdAorCQl0c3QJc3VtLCAjMQorCQltb3ZuZQlyMCwgcjAsIHJvciAjOAorCQlsb2FkX3JlZ3MJZWEKKworLnNyY19ub3RfYWxpZ25lZDoKKwkJYWRjCXN1bSwgc3VtLCAjMAkJQCBpbmNsdWRlIEMgZnJvbSBkc3QgYWxpZ25tZW50CisJCWFuZAlpcCwgc3JjLCAjMworCQliaWMJc3JjLCBzcmMsICMzCisJCWxvYWQxbAlyNQorCQljbXAJaXAsICMyCisJCWJlcQkuc3JjMl9hbGlnbmVkCisJCWJoaQkuc3JjM19hbGlnbmVkCisJCW1vdglyNCwgcjUsIHB1bGwgIzgJCUAgQyA9IDAKKwkJYmljcwlpcCwgbGVuLCAjMTUKKwkJYmVxCTJmCisxOgkJbG9hZDRsCXI1LCByNiwgcjcsIHI4CisJCW9ycglyNCwgcjQsIHI1LCBwdXNoICMyNAorCQltb3YJcjUsIHI1LCBwdWxsICM4CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICMyNAorCQltb3YJcjYsIHI2LCBwdWxsICM4CisJCW9ycglyNiwgcjYsIHI3LCBwdXNoICMyNAorCQltb3YJcjcsIHI3LCBwdWxsICM4CisJCW9ycglyNywgcjcsIHI4LCBwdXNoICMyNAorCQlzdG1pYQlkc3QhLCB7cjQsIHI1LCByNiwgcjd9CisJCWFkY3MJc3VtLCBzdW0sIHI0CisJCWFkY3MJc3VtLCBzdW0sIHI1CisJCWFkY3MJc3VtLCBzdW0sIHI2CisJCWFkY3MJc3VtLCBzdW0sIHI3CisJCW1vdglyNCwgcjgsIHB1bGwgIzgKKwkJc3ViCWlwLCBpcCwgIzE2CisJCXRlcQlpcCwgIzAKKwkJYm5lCTFiCisyOgkJYW5kcwlpcCwgbGVuLCAjMTIKKwkJYmVxCTRmCisJCXRzdAlpcCwgIzgKKwkJYmVxCTNmCisJCWxvYWQybAlyNSwgcjYKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzI0CisJCW1vdglyNSwgcjUsIHB1bGwgIzgKKwkJb3JyCXI1LCByNSwgcjYsIHB1c2ggIzI0CisJCXN0bWlhCWRzdCEsIHtyNCwgcjV9CisJCWFkY3MJc3VtLCBzdW0sIHI0CisJCWFkY3MJc3VtLCBzdW0sIHI1CisJCW1vdglyNCwgcjYsIHB1bGwgIzgKKwkJdHN0CWlwLCAjNAorCQliZXEJNGYKKzM6CQlsb2FkMWwJcjUKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzI0CisJCXN0cglyNCwgW2RzdF0sICM0CisJCWFkY3MJc3VtLCBzdW0sIHI0CisJCW1vdglyNCwgcjUsIHB1bGwgIzgKKzQ6CQlhbmRzCWxlbiwgbGVuLCAjMworCQliZXEJLmRvbmUKKwkJbW92CXI1LCByNCwgZ2V0X2J5dGVfMAorCQl0c3QJbGVuLCAjMgorCQliZXEJLmV4aXQKKwkJYWRjcwlzdW0sIHN1bSwgcjQsIHB1c2ggIzE2CisJCXN0cmIJcjUsIFtkc3RdLCAjMQorCQltb3YJcjUsIHI0LCBnZXRfYnl0ZV8xCisJCXN0cmIJcjUsIFtkc3RdLCAjMQorCQltb3YJcjUsIHI0LCBnZXRfYnl0ZV8yCisJCWIJLmV4aXQKKworLnNyYzJfYWxpZ25lZDoJbW92CXI0LCByNSwgcHVsbCAjMTYKKwkJYWRkcwlzdW0sIHN1bSwgIzAKKwkJYmljcwlpcCwgbGVuLCAjMTUKKwkJYmVxCTJmCisxOgkJbG9hZDRsCXI1LCByNiwgcjcsIHI4CisJCW9ycglyNCwgcjQsIHI1LCBwdXNoICMxNgorCQltb3YJcjUsIHI1LCBwdWxsICMxNgorCQlvcnIJcjUsIHI1LCByNiwgcHVzaCAjMTYKKwkJbW92CXI2LCByNiwgcHVsbCAjMTYKKwkJb3JyCXI2LCByNiwgcjcsIHB1c2ggIzE2CisJCW1vdglyNywgcjcsIHB1bGwgIzE2CisJCW9ycglyNywgcjcsIHI4LCBwdXNoICMxNgorCQlzdG1pYQlkc3QhLCB7cjQsIHI1LCByNiwgcjd9CisJCWFkY3MJc3VtLCBzdW0sIHI0CisJCWFkY3MJc3VtLCBzdW0sIHI1CisJCWFkY3MJc3VtLCBzdW0sIHI2CisJCWFkY3MJc3VtLCBzdW0sIHI3CisJCW1vdglyNCwgcjgsIHB1bGwgIzE2CisJCXN1YglpcCwgaXAsICMxNgorCQl0ZXEJaXAsICMwCisJCWJuZQkxYgorMjoJCWFuZHMJaXAsIGxlbiwgIzEyCisJCWJlcQk0ZgorCQl0c3QJaXAsICM4CisJCWJlcQkzZgorCQlsb2FkMmwJcjUsIHI2CisJCW9ycglyNCwgcjQsIHI1LCBwdXNoICMxNgorCQltb3YJcjUsIHI1LCBwdWxsICMxNgorCQlvcnIJcjUsIHI1LCByNiwgcHVzaCAjMTYKKwkJc3RtaWEJZHN0ISwge3I0LCByNX0KKwkJYWRjcwlzdW0sIHN1bSwgcjQKKwkJYWRjcwlzdW0sIHN1bSwgcjUKKwkJbW92CXI0LCByNiwgcHVsbCAjMTYKKwkJdHN0CWlwLCAjNAorCQliZXEJNGYKKzM6CQlsb2FkMWwJcjUKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzE2CisJCXN0cglyNCwgW2RzdF0sICM0CisJCWFkY3MJc3VtLCBzdW0sIHI0CisJCW1vdglyNCwgcjUsIHB1bGwgIzE2Cis0OgkJYW5kcwlsZW4sIGxlbiwgIzMKKwkJYmVxCS5kb25lCisJCW1vdglyNSwgcjQsIGdldF9ieXRlXzAKKwkJdHN0CWxlbiwgIzIKKwkJYmVxCS5leGl0CisJCWFkY3MJc3VtLCBzdW0sIHI0CisJCXN0cmIJcjUsIFtkc3RdLCAjMQorCQltb3YJcjUsIHI0LCBnZXRfYnl0ZV8xCisJCXN0cmIJcjUsIFtkc3RdLCAjMQorCQl0c3QJbGVuLCAjMQorCQliZXEJLmRvbmUKKwkJbG9hZDFiCXI1CisJCWIJLmV4aXQKKworLnNyYzNfYWxpZ25lZDoJbW92CXI0LCByNSwgcHVsbCAjMjQKKwkJYWRkcwlzdW0sIHN1bSwgIzAKKwkJYmljcwlpcCwgbGVuLCAjMTUKKwkJYmVxCTJmCisxOgkJbG9hZDRsCXI1LCByNiwgcjcsIHI4CisJCW9ycglyNCwgcjQsIHI1LCBwdXNoICM4CisJCW1vdglyNSwgcjUsIHB1bGwgIzI0CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICM4CisJCW1vdglyNiwgcjYsIHB1bGwgIzI0CisJCW9ycglyNiwgcjYsIHI3LCBwdXNoICM4CisJCW1vdglyNywgcjcsIHB1bGwgIzI0CisJCW9ycglyNywgcjcsIHI4LCBwdXNoICM4CisJCXN0bWlhCWRzdCEsIHtyNCwgcjUsIHI2LCByN30KKwkJYWRjcwlzdW0sIHN1bSwgcjQKKwkJYWRjcwlzdW0sIHN1bSwgcjUKKwkJYWRjcwlzdW0sIHN1bSwgcjYKKwkJYWRjcwlzdW0sIHN1bSwgcjcKKwkJbW92CXI0LCByOCwgcHVsbCAjMjQKKwkJc3ViCWlwLCBpcCwgIzE2CisJCXRlcQlpcCwgIzAKKwkJYm5lCTFiCisyOgkJYW5kcwlpcCwgbGVuLCAjMTIKKwkJYmVxCTRmCisJCXRzdAlpcCwgIzgKKwkJYmVxCTNmCisJCWxvYWQybAlyNSwgcjYKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzgKKwkJbW92CXI1LCByNSwgcHVsbCAjMjQKKwkJb3JyCXI1LCByNSwgcjYsIHB1c2ggIzgKKwkJc3RtaWEJZHN0ISwge3I0LCByNX0KKwkJYWRjcwlzdW0sIHN1bSwgcjQKKwkJYWRjcwlzdW0sIHN1bSwgcjUKKwkJbW92CXI0LCByNiwgcHVsbCAjMjQKKwkJdHN0CWlwLCAjNAorCQliZXEJNGYKKzM6CQlsb2FkMWwJcjUKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzgKKwkJc3RyCXI0LCBbZHN0XSwgIzQKKwkJYWRjcwlzdW0sIHN1bSwgcjQKKwkJbW92CXI0LCByNSwgcHVsbCAjMjQKKzQ6CQlhbmRzCWxlbiwgbGVuLCAjMworCQliZXEJLmRvbmUKKwkJbW92CXI1LCByNCwgZ2V0X2J5dGVfMAorCQl0c3QJbGVuLCAjMgorCQliZXEJLmV4aXQKKwkJc3RyYglyNSwgW2RzdF0sICMxCisJCWFkY3MJc3VtLCBzdW0sIHI0CisJCWxvYWQxbAlyNAorCQltb3YJcjUsIHI0LCBnZXRfYnl0ZV8wCisJCXN0cmIJcjUsIFtkc3RdLCAjMQorCQlhZGNzCXN1bSwgc3VtLCByNCwgcHVzaCAjMjQKKwkJbW92CXI1LCByNCwgZ2V0X2J5dGVfMQorCQliCS5leGl0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmEyZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogMjcvMDMvMDMgSWFuIE1vbHRvbiBDbGVhbiB1cCBDT05GSUdfQ1BVCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisKKwkJLnRleHQKKworCQkubWFjcm8Jc2F2ZV9yZWdzCisJCXN0bWZkCXNwISwge3IxIC0gcjIsIHI0IC0gcjgsIGZwLCBpcCwgbHIsIHBjfQorCQkuZW5kbQorCisJCS5tYWNybwlsb2FkX3JlZ3MsZmxhZ3MKKwkJbGRtXGZsYWdzCWZwLCB7cjEsIHIyLCByNC1yOCwgZnAsIHNwLCBwY30KKwkJLmVuZG0KKworCQkubWFjcm8JbG9hZDFiLAlyZWcxCis5OTk5OgkJbGRyYnQJXHJlZzEsIFtyMF0sICQxCisJCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIgorCQkuYWxpZ24JMworCQkubG9uZwk5OTk5YiwgNjAwMWYKKwkJLnByZXZpb3VzCisJCS5lbmRtCisKKwkJLm1hY3JvCWxvYWQyYiwgcmVnMSwgcmVnMgorOTk5OToJCWxkcmJ0CVxyZWcxLCBbcjBdLCAkMQorOTk5ODoJCWxkcmJ0CVxyZWcyLCBbcjBdLCAkMQorCQkuc2VjdGlvbiBfX2V4X3RhYmxlLCAiYSIKKwkJLmxvbmcJOTk5OWIsIDYwMDFmCisJCS5sb25nCTk5OThiLCA2MDAxZgorCQkucHJldmlvdXMKKwkJLmVuZG0KKworCQkubWFjcm8JbG9hZDFsLCByZWcxCis5OTk5OgkJbGRydAlccmVnMSwgW3IwXSwgJDQKKwkJLnNlY3Rpb24gX19leF90YWJsZSwgImEiCisJCS5hbGlnbgkzCisJCS5sb25nCTk5OTliLCA2MDAxZgorCQkucHJldmlvdXMKKwkJLmVuZG0KKworCQkubWFjcm8JbG9hZDJsLCByZWcxLCByZWcyCis5OTk5OgkJbGRydAlccmVnMSwgW3IwXSwgJDQKKzk5OTg6CQlsZHJ0CVxyZWcyLCBbcjBdLCAkNAorCQkuc2VjdGlvbiBfX2V4X3RhYmxlLCAiYSIKKwkJLmxvbmcJOTk5OWIsIDYwMDFmCisJCS5sb25nCTk5OThiLCA2MDAxZgorCQkucHJldmlvdXMKKwkJLmVuZG0KKworCQkubWFjcm8JbG9hZDRsLCByZWcxLCByZWcyLCByZWczLCByZWc0Cis5OTk5OgkJbGRydAlccmVnMSwgW3IwXSwgJDQKKzk5OTg6CQlsZHJ0CVxyZWcyLCBbcjBdLCAkNAorOTk5NzoJCWxkcnQJXHJlZzMsIFtyMF0sICQ0Cis5OTk2OgkJbGRydAlccmVnNCwgW3IwXSwgJDQKKwkJLnNlY3Rpb24gX19leF90YWJsZSwgImEiCisJCS5sb25nCTk5OTliLCA2MDAxZgorCQkubG9uZwk5OTk4YiwgNjAwMWYKKwkJLmxvbmcJOTk5N2IsIDYwMDFmCisJCS5sb25nCTk5OTZiLCA2MDAxZgorCQkucHJldmlvdXMKKwkJLmVuZG0KKworLyoKKyAqIHVuc2lnbmVkIGludAorICogY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCisgKiAgcjAgPSBzcmMsIHIxID0gZHN0LCByMiA9IGxlbiwgcjMgPSBzdW0sIFtzcF0gPSAqZXJyX3B0cgorICogIFJldHVybnMgOiByMCA9IGNoZWNrc3VtLCBbW3NwLCAjMF0sICMwXSA9IDAgb3IgLUVGQVVMVAorICovCisKKyNkZWZpbmUgRk5fRU5UUlkJRU5UUlkoY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKQorCisjaW5jbHVkZSAiY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TIgorCisvKgorICogRklYTUU6IG1pbm9yIGJ1Z2xldCBoZXJlCisgKiBXZSBkb24ndCByZXR1cm4gdGhlIGNoZWNrc3VtIGZvciB0aGUgZGF0YSBwcmVzZW50IGluIHRoZSBidWZmZXIuICBUbyBkbworICogc28gcHJvcGVybHksIHdlIHdvdWxkIGhhdmUgdG8gYWRkIGluIHdoYXRldmVyIHJlZ2lzdGVycyB3ZXJlIGxvYWRlZCBiZWZvcmUKKyAqIHRoZSBmYXVsdCwgd2hpY2gsIHdpdGggdGhlIGN1cnJlbnQgYXNtIGFib3ZlIGlzIG5vdCBwcmVkaWN0YWJsZS4KKyAqLworCQkuc2VjdGlvbiAuZml4dXAsImF4IgorCQkuYWxpZ24JNAorNjAwMToJCW1vdglyNCwgIy1FRkFVTFQKKwkJbGRyCXI1LCBbZnAsICM0XQkJQCAqZXJyX3B0cgorCQlzdHIJcjQsIFtyNV0KKwkJbGRtaWEJc3AsIHtyMSwgcjJ9CQlAIHJldHJpZXZlIGRzdCwgbGVuCisJCWFkZAlyMiwgcjIsIHIxCisJCW1vdglyMCwgIzAJCQlAIHplcm8gdGhlIGJ1ZmZlcgorNjAwMjoJCXRlcQlyMiwgcjEKKwkJc3RybmViCXIwLCBbcjFdLCAjMQorCQlibmUJNjAwMmIKKwkJbG9hZF9yZWdzCWVhCisJCS5wcmV2aW91cwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2RlbGF5LlMgYi9hcmNoL2FybS9saWIvZGVsYXkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdmN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2RlbGF5LlMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvZGVsYXkuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisJCS50ZXh0CisKK0xDMDoJCS53b3JkCWxvb3BzX3Blcl9qaWZmeQorCisvKgorICogMCA8PSByMCA8PSAyMDAwCisgKi8KK0VOVFJZKF9fdWRlbGF5KQorCQltb3YJcjIsICAgICAjMHg2ODAwCisJCW9ycglyMiwgcjIsICMweDAwZGIKKwkJbXVsCXIwLCByMiwgcjAKK0VOVFJZKF9fY29uc3RfdWRlbGF5KQkJCQlAIDAgPD0gcjAgPD0gMHgwMWZmZmZmZgorCQlsZHIJcjIsIExDMAorCQlsZHIJcjIsIFtyMl0JCUAgbWF4ID0gMHgwZmZmZmZmZgorCQltb3YJcjAsIHIwLCBsc3IgIzExCQlAIG1heCA9IDB4MDAwMDNmZmYKKwkJbW92CXIyLCByMiwgbHNyICMxMQkJQCBtYXggPSAweDAwMDNmZmZmCisJCW11bAlyMCwgcjIsIHIwCQlAIG1heCA9IDJeMzItMQorCQltb3ZzCXIwLCByMCwgbHNyICM2CisJCVJFVElOU1RSKG1vdmVxLHBjLGxyKQorCisvKgorICogbG9vcHMgPSAocjAgKiAweDEwYzYgKiAxMDAgKiBsb29wc19wZXJfamlmZnkpIC8gMl4zMgorICoKKyAqIE9oLCBpZiBvbmx5IHdlIGhhZCBhIGN5Y2xlIGNvdW50ZXIuLi4KKyAqLworCitAIERlbGF5IHJvdXRpbmUKK0VOVFJZKF9fZGVsYXkpCisJCXN1YnMJcjAsIHIwLCAjMQorI2lmIDAKKwkJUkVUSU5TVFIobW92bHMscGMsbHIpCisJCXN1YnMJcjAsIHIwLCAjMQorCQlSRVRJTlNUUihtb3ZscyxwYyxscikKKwkJc3VicwlyMCwgcjAsICMxCisJCVJFVElOU1RSKG1vdmxzLHBjLGxyKQorCQlzdWJzCXIwLCByMCwgIzEKKwkJUkVUSU5TVFIobW92bHMscGMsbHIpCisJCXN1YnMJcjAsIHIwLCAjMQorCQlSRVRJTlNUUihtb3ZscyxwYyxscikKKwkJc3VicwlyMCwgcjAsICMxCisJCVJFVElOU1RSKG1vdmxzLHBjLGxyKQorCQlzdWJzCXIwLCByMCwgIzEKKwkJUkVUSU5TVFIobW92bHMscGMsbHIpCisJCXN1YnMJcjAsIHIwLCAjMQorI2VuZGlmCisJCWJoaQlfX2RlbGF5CisJCVJFVElOU1RSKG1vdixwYyxscikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9kaXY2NC5TIGIvYXJjaC9hcm0vbGliL2RpdjY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5YTFjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9kaXY2NC5TCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9kaXY2NC5TCisgKgorICogIE9wdGltaXplZCBjb21wdXRhdGlvbiBvZiA2NC1iaXQgZGl2aWRlbmQgLyAzMi1iaXQgZGl2aXNvcgorICoKKyAqICBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqICBDcmVhdGVkOglPY3QgNSwgMjAwMworICogIENvcHlyaWdodDoJTW9udGEgVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpZmRlZiBfX0FSTUVCX18KKyNkZWZpbmUgeGggcjAKKyNkZWZpbmUgeGwgcjEKKyNkZWZpbmUgeWggcjIKKyNkZWZpbmUgeWwgcjMKKyNlbHNlCisjZGVmaW5lIHhsIHIwCisjZGVmaW5lIHhoIHIxCisjZGVmaW5lIHlsIHIyCisjZGVmaW5lIHloIHIzCisjZW5kaWYKKworLyoKKyAqIF9fZG9fZGl2NjQ6IHBlcmZvcm0gYSBkaXZpc2lvbiB3aXRoIDY0LWJpdCBkaXZpZGVuZCBhbmQgMzItYml0IGRpdmlzb3IuCisgKgorICogTm90ZTogQ2FsbGluZyBjb252ZW50aW9uIGlzIHRvdGFsbHkgbm9uIHN0YW5kYXJkIGZvciBvcHRpbWFsIGNvZGUuCisgKiAgICAgICBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgZG9fZGl2KCkgZnJvbSBpbmNsdWRlL2FzbS9kaXY2NC5oIG9ubHkuCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqIAl4aC14bAk9IGRpdmlkZW5kIChjbG9iYmVyZWQpCisgKiAJcjQJPSBkaXZpc29yIChwcmVzZXJ2ZWQpCisgKgorICogT3V0cHV0IHZhbHVlczoKKyAqIAl5aC15bAk9IHJlc3VsdAorICogCXhoCT0gcmVtYWluZGVyCisgKgorICogQ2xvYmJlcmVkIHJlZ3M6IHhsLCBpcAorICovCisKK0VOVFJZKF9fZG9fZGl2NjQpCisKKwlAIFRlc3QgZm9yIGVhc3kgcGF0aHMgZmlyc3QuCisJc3VicwlpcCwgcjQsICMxCisJYmxzCTlmCQkJQCBkaXZpc29yIGlzIDAgb3IgMQorCXRzdAlpcCwgcjQKKwliZXEJOGYJCQlAIGRpdmlzb3IgaXMgcG93ZXIgb2YgMgorCisJQCBTZWUgaWYgd2UgbmVlZCB0byBoYW5kbGUgdXBwZXIgMzItYml0IHJlc3VsdC4KKwljbXAJeGgsIHI0CisJbW92CXloLCAjMAorCWJsbwkzZgorCisJQCBBbGlnbiBkaXZpc29yIHdpdGggdXBwZXIgcGFydCBvZiBkaXZpZGVuZC4KKwlAIFRoZSBhbGlnbmVkIGRpdmlzb3IgaXMgc3RvcmVkIGluIHlsIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsLgorCUAgVGhlIGJpdCBwb3NpdGlvbiBpcyBzdG9yZWQgaW4gaXAuCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CXlsLCByNAorCWNseglpcCwgeGgKKwlzdWIJeWwsIHlsLCBpcAorCW1vdglpcCwgIzEKKwltb3YJaXAsIGlwLCBsc2wgeWwKKwltb3YJeWwsIHI0LCBsc2wgeWwKKworI2Vsc2UKKworCW1vdgl5bCwgcjQKKwltb3YJaXAsICMxCisxOgljbXAJeWwsICMweDgwMDAwMDAwCisJY21wY2MJeWwsIHhoCisJbW92Y2MJeWwsIHlsLCBsc2wgIzEKKwltb3ZjYwlpcCwgaXAsIGxzbCAjMQorCWJjYwkxYgorCisjZW5kaWYKKworCUAgVGhlIGRpdmlzaW9uIGxvb3AgZm9yIG5lZWRlZCB1cHBlciBiaXQgcG9zaXRpb25zLgorIAlAIEJyZWFrIG91dCBlYXJseSBpZiBkaXZpZGVuZCByZWFjaGVzIDAuCisyOgljbXAJeGgsIHlsCisJb3JyY3MJeWgsIHloLCBpcAorCXN1YmNzcwl4aCwgeGgsIHlsCisJbW92bmVzCWlwLCBpcCwgbHNyICMxCisJbW92CXlsLCB5bCwgbHNyICMxCisJYm5lCTJiCisKKwlAIFNlZSBpZiB3ZSBuZWVkIHRvIGhhbmRsZSBsb3dlciAzMi1iaXQgcmVzdWx0LgorMzoJY21wCXhoLCAjMAorCW1vdgl5bCwgIzAKKwljbXBlcQl4bCwgcjQKKwltb3Zsbwl4aCwgeGwKKwltb3ZsbwlwYywgbHIKKworCUAgVGhlIGRpdmlzaW9uIGxvb3AgZm9yIGxvd2VyIGJpdCBwb3NpdGlvbnMuCisJQCBIZXJlIHdlIHNoaWZ0IHJlbWFpbmVyIGJpdHMgbGVmdHdhcmRzIHJhdGhlciB0aGFuIG1vdmluZyB0aGUKKwlAIGRpdmlzb3IgZm9yIGNvbXBhcmlzb25zLCBjb25zaWRlcmluZyB0aGUgY2Fycnktb3V0IGJpdCBhcyB3ZWxsLgorCW1vdglpcCwgIzB4ODAwMDAwMDAKKzQ6CW1vdnMJeGwsIHhsLCBsc2wgIzEKKwlhZGNzCXhoLCB4aCwgeGgKKwliZXEJNmYKKwljbXBjYwl4aCwgcjQKKzU6CW9ycmNzCXlsLCB5bCwgaXAKKwlzdWJjcwl4aCwgeGgsIHI0CisJbW92cwlpcCwgaXAsIGxzciAjMQorCWJuZQk0YgorCW1vdglwYywgbHIKKworCUAgVGhlIHRvcCBwYXJ0IG9mIHJlbWFpbmRlciBiZWNhbWUgemVyby4gIElmIGNhcnJ5IGlzIHNldAorCUAgKHRoZSAzM3RoIGJpdCkgdGhpcyBpcyBhIGZhbHNlIHBvc2l0aXZlIHNvIHJlc3VtZSB0aGUgbG9vcC4KKwlAIE90aGVyd2lzZSwgaWYgbG93ZXIgcGFydCBpcyBhbHNvIG51bGwgdGhlbiB3ZSBhcmUgZG9uZS4KKzY6CWJjcwk1YgorCWNtcAl4bCwgIzAKKwltb3ZlcQlwYywgbHIKKworCUAgV2Ugc3RpbGwgaGF2ZSByZW1haW5lciBiaXRzIGluIHRoZSBsb3cgcGFydC4gIEJyaW5nIHRoZW0gdXAuCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CXhoLCB4bAkJCUAgd2Uga25vdyB4aCBpcyB6ZXJvIGhlcmUgc28uLi4KKwlhZGQJeGgsIHhoLCAjMQorCW1vdgl4bCwgeGwsIGxzbCB4aAorCW1vdglpcCwgaXAsIGxzciB4aAorCisjZWxzZQorCis3Ogltb3ZzCXhsLCB4bCwgbHNsICMxCisJbW92CWlwLCBpcCwgbHNyICMxCisJYmNjCTdiCisKKyNlbmRpZgorCisJQCBDdXJyZW50IHJlbWFpbmRlciBpcyBub3cgMS4gIEl0IGlzIHdvcnRobGVzcyB0byBjb21wYXJlIHdpdGgKKwlAIGRpdmlzb3IgYXQgdGhpcyBwb2ludCBzaW5jZSBkaXZpc29yIGNhbiBub3QgYmUgc21hbGxlciB0aGFuIDMgaGVyZS4KKwlAIElmIHBvc3NpYmxlLCBicmFuY2ggZm9yIGFub3RoZXIgc2hpZnQgaW4gdGhlIGRpdmlzaW9uIGxvb3AuCisJQCBJZiBubyBiaXQgcG9zaXRpb24gbGVmdCB0aGVuIHdlIGFyZSBkb25lLgorCW1vdnMJaXAsIGlwLCBsc3IgIzEKKwltb3YJeGgsICMxCisJYm5lCTRiCisJbW92CXBjLCBscgorCis4OglAIERpdmlzaW9uIGJ5IGEgcG93ZXIgb2YgMjogZGV0ZXJtaW5lIHdoYXQgdGhhdCBkaXZpc29yIG9yZGVyIGlzCisJQCB0aGVuIHNpbXBseSBzaGlmdCB2YWx1ZXMgYXJvdW5kCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CWlwLCByNAorCXJzYglpcCwgaXAsICMzMQorCisjZWxzZQorCisJbW92CXlsLCByNAorCWNtcAlyNCwgIygxIDw8IDE2KQorCW1vdglpcCwgIzAKKwltb3Zocwl5bCwgeWwsIGxzciAjMTYKKwltb3ZocwlpcCwgIzE2CisKKwljbXAJeWwsICMoMSA8PCA4KQorCW1vdmhzCXlsLCB5bCwgbHNyICM4CisJYWRkaHMJaXAsIGlwLCAjOAorCisJY21wCXlsLCAjKDEgPDwgNCkKKwltb3Zocwl5bCwgeWwsIGxzciAjNAorCWFkZGhzCWlwLCBpcCwgIzQKKworCWNtcAl5bCwgIygxIDw8IDIpCisJYWRkaGkJaXAsIGlwLCAjMworCWFkZGxzCWlwLCBpcCwgeWwsIGxzciAjMQorCisjZW5kaWYKKworCW1vdgl5aCwgeGgsIGxzciBpcAorCW1vdgl5bCwgeGwsIGxzciBpcAorCXJzYglpcCwgaXAsICMzMgorCW9ycgl5bCwgeWwsIHhoLCBsc2wgaXAKKwltb3YJeGgsIHhsLCBsc2wgaXAKKwltb3YJeGgsIHhoLCBsc3IgaXAKKwltb3YJcGMsIGxyCisKKwlAIGVxIC0+IGRpdmlzaW9uIGJ5IDE6IG9idmlvdXMgZW5vdWdoLi4uCis5Ogltb3ZlcQl5bCwgeGwKKwltb3ZlcQl5aCwgeGgKKwltb3ZlcQl4aCwgIzAKKwltb3ZlcQlwYywgbHIKKworCUAgRGl2aXNpb24gYnkgMDoKKwlzdHIJbHIsIFtzcCwgIy00XSEKKwlibAlfX2RpdjAKKworCUAgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUuLi4KKwltb3YJeWwsICMwCisJbW92CXloLCAjMAorCW1vdgl4aCwgIzAKKwlsZHIJcGMsIFtzcF0sICM0CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9lY2FyZC5TIGIvYXJjaC9hcm0vbGliL2VjYXJkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3YjYwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9lY2FyZC5TCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2VjYXJkLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogMjcvMDMvMDMgSWFuIE1vbHRvbiBDbGVhbiB1cCBDT05GSUdfQ1BVCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworI2RlZmluZSBDUFNSMlNQU1IocnQpIFwKKwkJbXJzCXJ0LCBjcHNyOyBcCisJCW1zcglzcHNyX2N4c2YsIHJ0CisKK0AgUHVycG9zZTogY2FsbCBhbiBleHBhbnNpb24gY2FyZCBsb2FkZXIgdG8gcmVhZCBieXRlcy4KK0AgUHJvdG8gIDogY2hhciByZWFkX2xvYWRlcihpbnQgb2Zmc2V0LCBjaGFyICpjYXJkX2Jhc2UsIGNoYXIgKmxvYWRlcik7CitAIFJldHVybnM6IGJ5dGUgcmVhZAorCitFTlRSWShlY2FyZF9sb2FkZXJfcmVhZCkKKwkJc3RtZmQJc3AhLCB7cjQgLSByMTIsIGxyfQorCQltb3YJcjExLCByMQorCQltb3YJcjEsIHIwCisJCUNQU1IyU1BTUihyMCkKKwkJbW92CWxyLCBwYworCQltb3YJcGMsIHIyCisJCUxPQURSRUdTKGZkLCBzcCEsIHtyNCAtIHIxMiwgcGN9KQorCitAIFB1cnBvc2U6IGNhbGwgYW4gZXhwYW5zaW9uIGNhcmQgbG9hZGVyIHRvIHJlc2V0IHRoZSBjYXJkCitAIFByb3RvICA6IHZvaWQgcmVhZF9sb2FkZXIoaW50IGNhcmRfYmFzZSwgY2hhciAqbG9hZGVyKTsKK0AgUmV0dXJuczogYnl0ZSByZWFkCisKK0VOVFJZKGVjYXJkX2xvYWRlcl9yZXNldCkKKwkJc3RtZmQJc3AhLCB7cjQgLSByMTIsIGxyfQorCQltb3YJcjExLCByMAorCQlDUFNSMlNQU1IocjApCisJCW1vdglsciwgcGMKKwkJYWRkCXBjLCByMSwgIzgKKwkJTE9BRFJFR1MoZmQsIHNwISwge3I0IC0gcjEyLCBwY30pCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9maW5kYml0LlMgYi9hcmNoL2FybS9saWIvZmluZGJpdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTVkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvZmluZGJpdC5TCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9maW5kYml0LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAxNnRoIE1hcmNoIDIwMDEgLSBKb2huIFJpcGxleSA8anJpcGxleUBzb25pY2JsdWUuY29tPgorICogICBGaXhlZCBzbyB0aGF0ICJzaXplIiBpcyBhbiBleGNsdXNpdmUgbm90IGFuIGluY2x1c2l2ZSBxdWFudGl0eS4KKyAqICAgQWxsIHVzZXJzIG9mIHRoZXNlIGZ1bmN0aW9ucyBleHBlY3QgZXhjbHVzaXZlIHNpemVzLCBhbmQgbWF5CisgKiAgIGFsc28gY2FsbCB3aXRoIHplcm8gc2l6ZS4KKyAqIFJld29ya2VkIGJ5IHJtay4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisgICAgICAgICAgICAgICAgLnRleHQKKworLyoKKyAqIFB1cnBvc2UgIDogRmluZCBhICd6ZXJvJyBiaXQKKyAqIFByb3RvdHlwZTogaW50IGZpbmRfZmlyc3RfemVyb19iaXQodm9pZCAqYWRkciwgdW5zaWduZWQgaW50IG1heGJpdCk7CisgKi8KK0VOVFJZKF9maW5kX2ZpcnN0X3plcm9fYml0X2xlKQorCQl0ZXEJcjEsICMwCQorCQliZXEJM2YKKwkJbW92CXIyLCAjMAorMToJCWxkcmIJcjMsIFtyMCwgcjIsIGxzciAjM10KKwkJZW9ycwlyMywgcjMsICMweGZmCQlAIGludmVydCBiaXRzCisJCWJuZQkuZm91bmQJCQlAIGFueSBub3cgc2V0IC0gZm91bmQgemVybyBiaXQKKwkJYWRkCXIyLCByMiwgIzgJCUAgbmV4dCBiaXQgcG9pbnRlcgorMjoJCWNtcAlyMiwgcjEJCQlAIGFueSBtb3JlPworCQlibG8JMWIKKzM6CQltb3YJcjAsIHIxCQkJQCBubyBmcmVlIGJpdHMKKwkJUkVUSU5TVFIobW92LHBjLGxyKQorCisvKgorICogUHVycG9zZSAgOiBGaW5kIG5leHQgJ3plcm8nIGJpdAorICogUHJvdG90eXBlOiBpbnQgZmluZF9uZXh0X3plcm9fYml0KHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBtYXhiaXQsIGludCBvZmZzZXQpCisgKi8KK0VOVFJZKF9maW5kX25leHRfemVyb19iaXRfbGUpCisJCXRlcQlyMSwgIzAKKwkJYmVxCTNiCisJCWFuZHMJaXAsIHIyLCAjNworCQliZXEJMWIJCQlAIElmIG5ldyBieXRlLCBnb3RvIG9sZCByb3V0aW5lCisJCWxkcmIJcjMsIFtyMCwgcjIsIGxzciAjM10KKwkJZW9yCXIzLCByMywgIzB4ZmYJCUAgbm93IGxvb2tpbmcgZm9yIGEgMSBiaXQKKwkJbW92cwlyMywgcjMsIGxzciBpcAkJQCBzaGlmdCBvZmYgdW51c2VkIGJpdHMKKwkJYm5lCS5mb3VuZAorCQlvcnIJcjIsIHIyLCAjNwkJQCBpZiB6ZXJvLCB0aGVuIG5vIGJpdHMgaGVyZQorCQlhZGQJcjIsIHIyLCAjMQkJQCBhbGlnbiBiaXQgcG9pbnRlcgorCQliCTJiCQkJQCBsb29wIGZvciBuZXh0IGJpdAorCisvKgorICogUHVycG9zZSAgOiBGaW5kIGEgJ29uZScgYml0CisgKiBQcm90b3R5cGU6IGludCBmaW5kX2ZpcnN0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBpbnQgbWF4Yml0KTsKKyAqLworRU5UUlkoX2ZpbmRfZmlyc3RfYml0X2xlKQorCQl0ZXEJcjEsICMwCQorCQliZXEJM2YKKwkJbW92CXIyLCAjMAorMToJCWxkcmIJcjMsIFtyMCwgcjIsIGxzciAjM10KKwkJbW92cwlyMywgcjMKKwkJYm5lCS5mb3VuZAkJCUAgYW55IG5vdyBzZXQgLSBmb3VuZCB6ZXJvIGJpdAorCQlhZGQJcjIsIHIyLCAjOAkJQCBuZXh0IGJpdCBwb2ludGVyCisyOgkJY21wCXIyLCByMQkJCUAgYW55IG1vcmU/CisJCWJsbwkxYgorMzoJCW1vdglyMCwgcjEJCQlAIG5vIGZyZWUgYml0cworCQlSRVRJTlNUUihtb3YscGMsbHIpCisKKy8qCisgKiBQdXJwb3NlICA6IEZpbmQgbmV4dCAnb25lJyBiaXQKKyAqIFByb3RvdHlwZTogaW50IGZpbmRfbmV4dF96ZXJvX2JpdCh2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgbWF4Yml0LCBpbnQgb2Zmc2V0KQorICovCitFTlRSWShfZmluZF9uZXh0X2JpdF9sZSkKKwkJdGVxCXIxLCAjMAorCQliZXEJM2IKKwkJYW5kcwlpcCwgcjIsICM3CisJCWJlcQkxYgkJCUAgSWYgbmV3IGJ5dGUsIGdvdG8gb2xkIHJvdXRpbmUKKwkJbGRyYglyMywgW3IwLCByMiwgbHNyICMzXQorCQltb3ZzCXIzLCByMywgbHNyIGlwCQlAIHNoaWZ0IG9mZiB1bnVzZWQgYml0cworCQlibmUJLmZvdW5kCisJCW9ycglyMiwgcjIsICM3CQlAIGlmIHplcm8sIHRoZW4gbm8gYml0cyBoZXJlCisJCWFkZAlyMiwgcjIsICMxCQlAIGFsaWduIGJpdCBwb2ludGVyCisJCWIJMmIJCQlAIGxvb3AgZm9yIG5leHQgYml0CisKKyNpZmRlZiBfX0FSTUVCX18KKworRU5UUlkoX2ZpbmRfZmlyc3RfemVyb19iaXRfYmUpCisJCXRlcQlyMSwgIzAKKwkJYmVxCTNmCisJCW1vdglyMiwgIzAKKzE6CQllb3IJcjMsIHIyLCAjMHgxOAkJQCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXJpbmcKKwkJbGRyYglyMywgW3IwLCByMywgbHNyICMzXQorCQllb3JzCXIzLCByMywgIzB4ZmYJCUAgaW52ZXJ0IGJpdHMKKwkJYm5lCS5mb3VuZAkJCUAgYW55IG5vdyBzZXQgLSBmb3VuZCB6ZXJvIGJpdAorCQlhZGQJcjIsIHIyLCAjOAkJQCBuZXh0IGJpdCBwb2ludGVyCisyOgkJY21wCXIyLCByMQkJCUAgYW55IG1vcmU/CisJCWJsbwkxYgorMzoJCW1vdglyMCwgcjEJCQlAIG5vIGZyZWUgYml0cworCQlSRVRJTlNUUihtb3YscGMsbHIpCisKK0VOVFJZKF9maW5kX25leHRfemVyb19iaXRfYmUpCisJCXRlcQlyMSwgIzAKKwkJYmVxCTNiCisJCWFuZHMJaXAsIHIyLCAjNworCQliZXEJMWIJCQlAIElmIG5ldyBieXRlLCBnb3RvIG9sZCByb3V0aW5lCisJCWVvcglyMywgcjIsICMweDE4CQlAIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcmluZworCQlsZHJiCXIzLCBbcjAsIHIzLCBsc3IgIzNdCisJCWVvcglyMywgcjMsICMweGZmCQlAIG5vdyBsb29raW5nIGZvciBhIDEgYml0CisJCW1vdnMJcjMsIHIzLCBsc3IgaXAJCUAgc2hpZnQgb2ZmIHVudXNlZCBiaXRzCisJCWJuZQkuZm91bmQKKwkJb3JyCXIyLCByMiwgIzcJCUAgaWYgemVybywgdGhlbiBubyBiaXRzIGhlcmUKKwkJYWRkCXIyLCByMiwgIzEJCUAgYWxpZ24gYml0IHBvaW50ZXIKKwkJYgkyYgkJCUAgbG9vcCBmb3IgbmV4dCBiaXQKKworRU5UUlkoX2ZpbmRfZmlyc3RfYml0X2JlKQorCQl0ZXEJcjEsICMwCisJCWJlcQkzZgorCQltb3YJcjIsICMwCisxOgkJZW9yCXIzLCByMiwgIzB4MTgJCUAgYmlnIGVuZGlhbiBieXRlIG9yZGVyaW5nCisJCWxkcmIJcjMsIFtyMCwgcjMsIGxzciAjM10KKwkJbW92cwlyMywgcjMKKwkJYm5lCS5mb3VuZAkJCUAgYW55IG5vdyBzZXQgLSBmb3VuZCB6ZXJvIGJpdAorCQlhZGQJcjIsIHIyLCAjOAkJQCBuZXh0IGJpdCBwb2ludGVyCisyOgkJY21wCXIyLCByMQkJCUAgYW55IG1vcmU/CisJCWJsbwkxYgorMzoJCW1vdglyMCwgcjEJCQlAIG5vIGZyZWUgYml0cworCQlSRVRJTlNUUihtb3YscGMsbHIpCisKK0VOVFJZKF9maW5kX25leHRfYml0X2JlKQorCQl0ZXEJcjEsICMwCisJCWJlcQkzYgorCQlhbmRzCWlwLCByMiwgIzcKKwkJYmVxCTFiCQkJQCBJZiBuZXcgYnl0ZSwgZ290byBvbGQgcm91dGluZQorCQllb3IJcjMsIHIyLCAjMHgxOAkJQCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXJpbmcKKwkJbGRyYglyMywgW3IwLCByMywgbHNyICMzXQorCQltb3ZzCXIzLCByMywgbHNyIGlwCQlAIHNoaWZ0IG9mZiB1bnVzZWQgYml0cworCQlibmUJLmZvdW5kCisJCW9ycglyMiwgcjIsICM3CQlAIGlmIHplcm8sIHRoZW4gbm8gYml0cyBoZXJlCisJCWFkZAlyMiwgcjIsICMxCQlAIGFsaWduIGJpdCBwb2ludGVyCisJCWIJMmIJCQlAIGxvb3AgZm9yIG5leHQgYml0CisKKyNlbmRpZgorCisvKgorICogT25lIG9yIG1vcmUgYml0cyBpbiB0aGUgTFNCIG9mIHIzIGFyZSBhc3N1bWVkIHRvIGJlIHNldC4KKyAqLworLmZvdW5kOgorI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisJCXJzYglyMSwgcjMsICMwCisJCWFuZAlyMywgcjMsIHIxCisJCWNseglyMywgcjMKKwkJcnNiCXIzLCByMywgIzMxCisJCWFkZAlyMCwgcjIsIHIzCisjZWxzZQorCQl0c3QJcjMsICMweDBmCisJCWFkZGVxCXIyLCByMiwgIzQKKwkJbW92bmUJcjMsIHIzLCBsc2wgIzQKKwkJdHN0CXIzLCAjMHgzMAorCQlhZGRlcQlyMiwgcjIsICMyCisJCW1vdm5lCXIzLCByMywgbHNsICMyCisJCXRzdAlyMywgIzB4NDAKKwkJYWRkZXEJcjIsIHIyLCAjMQorCQltb3YJcjAsIHIyCisjZW5kaWYKKwkJUkVUSU5TVFIobW92LHBjLGxyKQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZmxvcHB5ZG1hLlMgYi9hcmNoL2FybS9saWIvZmxvcHB5ZG1hLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3MTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9mbG9wcHlkbWEuUwpAQCAtMCwwICsxLDMyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9mbG9wcHlkbWEuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisJCS50ZXh0CisKKwkJLmdsb2JhbAlmbG9wcHlfZmlxaW5fZW5kCitFTlRSWShmbG9wcHlfZmlxaW5fc3RhcnQpCisJCXN1YnMJcjksIHI5LCAjMQorCQlsZHJndGIJcjEyLCBbcjExLCAjLTRdCisJCWxkcmxlYglyMTIsIFtyMTFdLCAjMAorCQlzdHJiCXIxMiwgW3IxMF0sICMxCisJCXN1YnMJcGMsIGxyLCAjNAorZmxvcHB5X2ZpcWluX2VuZDoKKworCQkuZ2xvYmFsCWZsb3BweV9maXFvdXRfZW5kCitFTlRSWShmbG9wcHlfZmlxb3V0X3N0YXJ0KQorCQlzdWJzCXI5LCByOSwgIzEKKwkJbGRyZ2ViCXIxMiwgW3IxMF0sICMxCisJCW1vdmx0CXIxMiwgIzAKKwkJc3RybGViCXIxMiwgW3IxMV0sICMwCisJCXN1YmxlcwlwYywgbHIsICM0CisJCXN0cmIJcjEyLCBbcjExLCAjLTRdCisJCXN1YnMJcGMsIGxyLCAjNAorZmxvcHB5X2ZpcW91dF9lbmQ6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZ2NjbGliLmggYi9hcmNoL2FybS9saWIvZ2NjbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzMTRhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9nY2NsaWIuaApAQCAtMCwwICsxLDI1IEBACisvKiBnY2NsaWIuaCAtLSBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBmdW5jdGlvbnMgJ2JvcnJvd2VkJyBmcm9tIGdjYy0yLjk1LjMgKi8KKy8qIEkgTW9sdG9uICAgICAyOS8wNy8wMSAqLworCisjZGVmaW5lIEJJVFNfUEVSX1VOSVQgIDgKKyNkZWZpbmUgU0lfVFlQRV9TSVpFIChzaXplb2YgKFNJdHlwZSkgKiBCSVRTX1BFUl9VTklUKQorCit0eXBlZGVmIHVuc2lnbmVkIGludCBVUUl0eXBlICAgIF9fYXR0cmlidXRlX18gKChtb2RlIChRSSkpKTsKK3R5cGVkZWYgICAgICAgICAgaW50IFNJdHlwZSAgICAgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVVNJdHlwZSAgICBfX2F0dHJpYnV0ZV9fICgobW9kZSAoU0kpKSk7Cit0eXBlZGVmICAgICAgICAgIGludCBESXR5cGUgICAgIF9fYXR0cmlidXRlX18gKChtb2RlIChESSkpKTsKK3R5cGVkZWYgICAgICAgICAgaW50IHdvcmRfdHlwZSAJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKF9fd29yZF9fKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVURJdHlwZSAgICBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7CisKKyNpZmRlZiBfX0FSTUVCX18KKyAgc3RydWN0IERJc3RydWN0IHtTSXR5cGUgaGlnaCwgbG93O307CisjZWxzZQorICBzdHJ1Y3QgRElzdHJ1Y3Qge1NJdHlwZSBsb3csIGhpZ2g7fTsKKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdCBESXN0cnVjdCBzOworICBESXR5cGUgbGw7Cit9IERJdW5pb247CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9nZXR1c2VyLlMgYi9hcmNoL2FybS9saWIvZ2V0dXNlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWE2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvZ2V0dXNlci5TCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2dldHVzZXIuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgSWRlYSBmcm9tIHg4NiB2ZXJzaW9uLCAoQykgQ29weXJpZ2h0IDE5OTggTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBhIG5vbi1zdGFuZGFyZCBjYWxsIGludGVyZmFjZSB0byBtYWtlIHRoZW0gbW9yZQorICogZWZmaWNpZW50LCBlc3BlY2lhbGx5IGFzIHRoZXkgcmV0dXJuIGFuIGVycm9yIHZhbHVlIGluIGFkZGl0aW9uIHRvCisgKiB0aGUgInJlYWwiIHJldHVybiB2YWx1ZS4KKyAqCisgKiBfX2dldF91c2VyX1gKKyAqCisgKiBJbnB1dHM6CXIwIGNvbnRhaW5zIHRoZSBhZGRyZXNzCisgKiBPdXRwdXRzOglyMCBpcyB0aGUgZXJyb3IgY29kZQorICoJCXIyLCByMyBjb250YWlucyB0aGUgemVyby1leHRlbmRlZCB2YWx1ZQorICoJCWxyIGNvcnJ1cHRlZAorICoKKyAqIE5vIG90aGVyIHJlZ2lzdGVycyBtdXN0IGJlIGFsdGVyZWQuICAoc2VlIGluY2x1ZGUvYXNtLWFybS91YWNjZXNzLmgKKyAqIGZvciBzcGVjaWZpYyBBU00gcmVnaXN0ZXIgdXNhZ2UpLgorICoKKyAqIE5vdGUgdGhhdCBBRERSX0xJTUlUIGlzIGVpdGhlciAwIG9yIDB4YzAwMDAwMDAuCisgKiBOb3RlIGFsc28gdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IF9fZ2V0X3VzZXJfYmFkIGlzIG5vdCBnbG9iYWwuCisgKi8KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKwkuZ2xvYmFsCV9fZ2V0X3VzZXJfMQorX19nZXRfdXNlcl8xOgorMToJbGRyYnQJcjIsIFtyMF0KKwltb3YJcjAsICMwCisJbW92CXBjLCBscgorCisJLmdsb2JhbAlfX2dldF91c2VyXzIKK19fZ2V0X3VzZXJfMjoKKzI6CWxkcmJ0CXIyLCBbcjBdLCAjMQorMzoJbGRyYnQJcjMsIFtyMF0KKyNpZm5kZWYgX19BUk1FQl9fCisJb3JyCXIyLCByMiwgcjMsIGxzbCAjOAorI2Vsc2UKKwlvcnIJcjIsIHIzLCByMiwgbHNsICM4CisjZW5kaWYKKwltb3YJcjAsICMwCisJbW92CXBjLCBscgorCisJLmdsb2JhbAlfX2dldF91c2VyXzQKK19fZ2V0X3VzZXJfNDoKKzQ6CWxkcnQJcjIsIFtyMF0KKwltb3YJcjAsICMwCisJbW92CXBjLCBscgorCisJLmdsb2JhbAlfX2dldF91c2VyXzgKK19fZ2V0X3VzZXJfODoKKzU6CWxkcnQJcjIsIFtyMF0sICM0Cis2OglsZHJ0CXIzLCBbcjBdCisJbW92CXIwLCAjMAorCW1vdglwYywgbHIKKworX19nZXRfdXNlcl9iYWRfODoKKwltb3YJcjMsICMwCitfX2dldF91c2VyX2JhZDoKKwltb3YJcjIsICMwCisJbW92CXIwLCAjLUVGQVVMVAorCW1vdglwYywgbHIKKworLnNlY3Rpb24gX19leF90YWJsZSwgImEiCisJLmxvbmcJMWIsIF9fZ2V0X3VzZXJfYmFkCisJLmxvbmcJMmIsIF9fZ2V0X3VzZXJfYmFkCisJLmxvbmcJM2IsIF9fZ2V0X3VzZXJfYmFkCisJLmxvbmcJNGIsIF9fZ2V0X3VzZXJfYmFkCisJLmxvbmcJNWIsIF9fZ2V0X3VzZXJfYmFkXzgKKwkubG9uZwk2YiwgX19nZXRfdXNlcl9iYWRfOAorLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvaW8tYWNvcm4uUyBiL2FyY2gvYXJtL2xpYi9pby1hY29ybi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWNkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvaW8tYWNvcm4uUwpAQCAtMCwwICsxLDMyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9pby1hY29ybi5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIDI3LzAzLzAzIElhbiBNb2x0b24gQ2xlYW4gdXAgQ09ORklHX0NQVQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKwkJLnRleHQKKwkJLmFsaWduCisKKy5pb3NsX3dhcm5pbmc6CisJCS5hc2NpaQkiPDQ+aW5zbC9vdXRzbCBub3QgaW1wbGVtZW50ZWQsIGNhbGxlZCBmcm9tICUwOGxYXDAiCisJCS5hbGlnbgorCisvKgorICogVGhlc2UgbWFrZSBubyBzZW5zZSBvbiBBY29ybiBtYWNoaW5lcy4KKyAqIFByaW50IGEgd2FybmluZyBtZXNzYWdlLgorICovCitFTlRSWShpbnNsKQorRU5UUlkob3V0c2wpCisJCWFkcglyMCwgLmlvc2xfd2FybmluZworCQltb3YJcjEsIGxyCisJCWIJcHJpbnRrCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvaW8tcmVhZHNiLlMgYi9hcmNoL2FybS9saWIvaW8tcmVhZHNiLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxZWY3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9pby1yZWFkc2IuUwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvaW8tcmVhZHNiLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKKy5pbnNiX2FsaWduOglyc2IJaXAsIGlwLCAjNAorCQljbXAJaXAsIHIyCisJCW1vdmd0CWlwLCByMgorCQljbXAJaXAsICMyCisJCWxkcmIJcjMsIFtyMF0KKwkJc3RyYglyMywgW3IxXSwgIzEKKwkJbGRyZ2ViCXIzLCBbcjBdCisJCXN0cmdlYglyMywgW3IxXSwgIzEKKwkJbGRyZ3RiCXIzLCBbcjBdCisJCXN0cmd0YglyMywgW3IxXSwgIzEKKwkJc3VicwlyMiwgcjIsIGlwCisJCWJuZQkuaW5zYl9hbGlnbmVkCisKK0VOVFJZKF9fcmF3X3JlYWRzYikKKwkJdGVxCXIyLCAjMAkJQCBkbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGUgemVybyBsZW4/CisJCW1vdmVxCXBjLCBscgorCQlhbmRzCWlwLCByMSwgIzMKKwkJYm5lCS5pbnNiX2FsaWduCisKKy5pbnNiX2FsaWduZWQ6CXN0bWZkCXNwISwge3I0IC0gcjYsIGxyfQorCisJCXN1YnMJcjIsIHIyLCAjMTYKKwkJYm1pCS5pbnNiX25vXzE2CisKKy5pbnNiXzE2X2xwOglsZHJiCXIzLCBbcjBdCisJCWxkcmIJcjQsIFtyMF0KKwkJbGRyYglyNSwgW3IwXQorCQltb3YJcjMsIHIzLCAgICAgcHV0X2J5dGVfMAorCQlsZHJiCXI2LCBbcjBdCisJCW9ycglyMywgcjMsIHI0LCBwdXRfYnl0ZV8xCisJCWxkcmIJcjQsIFtyMF0KKwkJb3JyCXIzLCByMywgcjUsIHB1dF9ieXRlXzIKKwkJbGRyYglyNSwgW3IwXQorCQlvcnIJcjMsIHIzLCByNiwgcHV0X2J5dGVfMworCQlsZHJiCXI2LCBbcjBdCisJCW1vdglyNCwgcjQsICAgICBwdXRfYnl0ZV8wCisJCWxkcmIJaXAsIFtyMF0KKwkJb3JyCXI0LCByNCwgcjUsIHB1dF9ieXRlXzEKKwkJbGRyYglyNSwgW3IwXQorCQlvcnIJcjQsIHI0LCByNiwgcHV0X2J5dGVfMgorCQlsZHJiCXI2LCBbcjBdCisJCW9ycglyNCwgcjQsIGlwLCBwdXRfYnl0ZV8zCisJCWxkcmIJaXAsIFtyMF0KKwkJbW92CXI1LCByNSwgICAgIHB1dF9ieXRlXzAKKwkJbGRyYglsciwgW3IwXQorCQlvcnIJcjUsIHI1LCByNiwgcHV0X2J5dGVfMQorCQlsZHJiCXI2LCBbcjBdCisJCW9ycglyNSwgcjUsIGlwLCBwdXRfYnl0ZV8yCisJCWxkcmIJaXAsIFtyMF0KKwkJb3JyCXI1LCByNSwgbHIsIHB1dF9ieXRlXzMKKwkJbGRyYglsciwgW3IwXQorCQltb3YJcjYsIHI2LCAgICAgcHV0X2J5dGVfMAorCQlvcnIJcjYsIHI2LCBpcCwgcHV0X2J5dGVfMQorCQlsZHJiCWlwLCBbcjBdCisJCW9ycglyNiwgcjYsIGxyLCBwdXRfYnl0ZV8yCisJCW9ycglyNiwgcjYsIGlwLCBwdXRfYnl0ZV8zCisJCXN0bWlhCXIxISwge3IzIC0gcjZ9CisKKwkJc3VicwlyMiwgcjIsICMxNgorCQlicGwJLmluc2JfMTZfbHAKKworCQl0c3QJcjIsICMxNQorCQlMT0FEUkVHUyhlcWZkLCBzcCEsIHtyNCAtIHI2LCBwY30pCisKKy5pbnNiX25vXzE2Ogl0c3QJcjIsICM4CisJCWJlcQkuaW5zYl9ub184CisKKwkJbGRyYglyMywgW3IwXQorCQlsZHJiCXI0LCBbcjBdCisJCWxkcmIJcjUsIFtyMF0KKwkJbW92CXIzLCByMywgICAgIHB1dF9ieXRlXzAKKwkJbGRyYglyNiwgW3IwXQorCQlvcnIJcjMsIHIzLCByNCwgcHV0X2J5dGVfMQorCQlsZHJiCXI0LCBbcjBdCisJCW9ycglyMywgcjMsIHI1LCBwdXRfYnl0ZV8yCisJCWxkcmIJcjUsIFtyMF0KKwkJb3JyCXIzLCByMywgcjYsIHB1dF9ieXRlXzMKKwkJbGRyYglyNiwgW3IwXQorCQltb3YJcjQsIHI0LCAgICAgcHV0X2J5dGVfMAorCQlsZHJiCWlwLCBbcjBdCisJCW9ycglyNCwgcjQsIHI1LCBwdXRfYnl0ZV8xCisJCW9ycglyNCwgcjQsIHI2LCBwdXRfYnl0ZV8yCisJCW9ycglyNCwgcjQsIGlwLCBwdXRfYnl0ZV8zCisJCXN0bWlhCXIxISwge3IzLCByNH0KKworLmluc2Jfbm9fODoJdHN0CXIyLCAjNAorCQliZXEJLmluc2Jfbm9fNAorCisJCWxkcmIJcjMsIFtyMF0KKwkJbGRyYglyNCwgW3IwXQorCQlsZHJiCXI1LCBbcjBdCisJCWxkcmIJcjYsIFtyMF0KKwkJbW92CXIzLCByMywgICAgIHB1dF9ieXRlXzAKKwkJb3JyCXIzLCByMywgcjQsIHB1dF9ieXRlXzEKKwkJb3JyCXIzLCByMywgcjUsIHB1dF9ieXRlXzIKKwkJb3JyCXIzLCByMywgcjYsIHB1dF9ieXRlXzMKKwkJc3RyCXIzLCBbcjFdLCAjNAorCisuaW5zYl9ub180OglhbmRzCXIyLCByMiwgIzMKKwkJTE9BRFJFR1MoZXFmZCwgc3AhLCB7cjQgLSByNiwgcGN9KQorCisJCWNtcAlyMiwgIzIKKwkJbGRyYglyMywgW3IwXQorCQlzdHJiCXIzLCBbcjFdLCAjMQorCQlsZHJnZWIJcjMsIFtyMF0KKwkJc3RyZ2ViCXIzLCBbcjFdLCAjMQorCQlsZHJndGIJcjMsIFtyMF0KKwkJc3RyZ3RiCXIzLCBbcjFdCisKKwkJTE9BRFJFR1MoZmQsIHNwISwge3I0IC0gcjYsIHBjfSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9pby1yZWFkc2wuUyBiL2FyY2gvYXJtL2xpYi9pby1yZWFkc2wuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWE5MTIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2lvLXJlYWRzbC5TCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2lvLXJlYWRzbC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCitFTlRSWShfX3Jhd19yZWFkc2wpCisJCXRlcQlyMiwgIzAJCUAgZG8gd2UgaGF2ZSB0byBjaGVjayBmb3IgdGhlIHplcm8gbGVuPworCQltb3ZlcQlwYywgbHIKKwkJYW5kcwlpcCwgcjEsICMzCisJCWJuZQkzZgorCisJCXN1YnMJcjIsIHIyLCAjNAorCQlibWkJMmYKKwkJc3RtZmQJc3AhLCB7cjQsIGxyfQorMToJCWxkcglyMywgW3IwLCAjMF0KKwkJbGRyCXI0LCBbcjAsICMwXQorCQlsZHIJaXAsIFtyMCwgIzBdCisJCWxkcglsciwgW3IwLCAjMF0KKwkJc3VicwlyMiwgcjIsICM0CisJCXN0bWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQorCQlicGwJMWIKKwkJbGRtZmQJc3AhLCB7cjQsIGxyfQorMjoJCW1vdnMJcjIsIHIyLCBsc2wgIzMxCisJCWxkcmNzCXIzLCBbcjAsICMwXQorCQlsZHJjcwlpcCwgW3IwLCAjMF0KKwkJc3RtY3NpYQlyMSEsIHtyMywgaXB9CisJCWxkcm5lCXIzLCBbcjAsICMwXQorCQlzdHJuZQlyMywgW3IxLCAjMF0KKwkJbW92CXBjLCBscgorCiszOgkJbGRyCXIzLCBbcjBdCisJCWNtcAlpcCwgIzIKKwkJbW92CWlwLCByMywgZ2V0X2J5dGVfMAorCQlzdHJiCWlwLCBbcjFdLCAjMQorCQliZ3QJNmYKKwkJbW92CWlwLCByMywgZ2V0X2J5dGVfMQorCQlzdHJiCWlwLCBbcjFdLCAjMQorCQliZXEJNWYKKwkJbW92CWlwLCByMywgZ2V0X2J5dGVfMgorCQlzdHJiCWlwLCBbcjFdLCAjMQorCis0OgkJc3VicwlyMiwgcjIsICMxCisJCW1vdglpcCwgcjMsIHB1bGwgIzI0CisJCWxkcm5lCXIzLCBbcjBdCisJCW9ycm5lCWlwLCBpcCwgcjMsIHB1c2ggIzgKKwkJc3RybmUJaXAsIFtyMV0sICM0CisJCWJuZQk0YgorCQliCThmCisKKzU6CQlzdWJzCXIyLCByMiwgIzEKKwkJbW92CWlwLCByMywgcHVsbCAjMTYKKwkJbGRybmUJcjMsIFtyMF0KKwkJb3JybmUJaXAsIGlwLCByMywgcHVzaCAjMTYKKwkJc3RybmUJaXAsIFtyMV0sICM0CisJCWJuZQk1YgorCQliCTdmCisKKzY6CQlzdWJzCXIyLCByMiwgIzEKKwkJbW92CWlwLCByMywgcHVsbCAjOAorCQlsZHJuZQlyMywgW3IwXQorCQlvcnJuZQlpcCwgaXAsIHIzLCBwdXNoICMyNAorCQlzdHJuZQlpcCwgW3IxXSwgIzQKKwkJYm5lCTZiCisKKwkJbW92CXIzLCBpcCwgZ2V0X2J5dGVfMgorCQlzdHJiCXIzLCBbcjEsICMyXQorNzoJCW1vdglyMywgaXAsIGdldF9ieXRlXzEKKwkJc3RyYglyMywgW3IxLCAjMV0KKzg6CQltb3YJcjMsIGlwLCBnZXRfYnl0ZV8wCisJCXN0cmIJcjMsIFtyMSwgIzBdCisJCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9pby1yZWFkc3ctYXJtdjMuUyBiL2FyY2gvYXJtL2xpYi9pby1yZWFkc3ctYXJtdjMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzZjZjdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2lvLXJlYWRzdy1hcm12My5TCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9pby1yZWFkc3ctYXJtdjMuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworLmluc3dfYmFkX2FsaWdubWVudDoKKwkJYWRyCXIwLCAuaW5zd19iYWRfYWxpZ25fbXNnCisJCW1vdglyMiwgbHIKKwkJYglwYW5pYworLmluc3dfYmFkX2FsaWduX21zZzoKKwkJLmFzY2l6CSJpbnN3OiBiYWQgYnVmZmVyIGFsaWdubWVudCAoMHglcCwgbHI9MHglMDhsWClcbiIKKwkJLmFsaWduCisKKy5pbnN3X2FsaWduOgl0c3QJcjEsICMxCisJCWJuZQkuaW5zd19iYWRfYWxpZ25tZW50CisKKwkJbGRyCXIzLCBbcjBdCisJCXN0cmIJcjMsIFtyMV0sICMxCisJCW1vdglyMywgcjMsIGxzciAjOAorCQlzdHJiCXIzLCBbcjFdLCAjMQorCisJCXN1YnMJcjIsIHIyLCAjMQorCQlSRVRJTlNUUihtb3ZlcSwgcGMsIGxyKQorCitFTlRSWShfX3Jhd19yZWFkc3cpCisJCXRlcQlyMiwgIzAJCUAgZG8gd2UgaGF2ZSB0byBjaGVjayBmb3IgdGhlIHplcm8gbGVuPworCQltb3ZlcQlwYywgbHIKKwkJdHN0CXIxLCAjMworCQlibmUJLmluc3dfYWxpZ24KKworLmluc3dfYWxpZ25lZDoJbW92CWlwLCAjMHhmZgorCQlvcnIJaXAsIGlwLCBpcCwgbHNsICM4CisJCXN0bWZkCXNwISwge3I0LCByNSwgcjYsIGxyfQorCisJCXN1YnMJcjIsIHIyLCAjOAorCQlibWkJLm5vX2luc3dfOAorCisuaW5zd184X2xwOglsZHIJcjMsIFtyMF0KKwkJYW5kCXIzLCByMywgaXAKKwkJbGRyCXI0LCBbcjBdCisJCW9ycglyMywgcjMsIHI0LCBsc2wgIzE2CisKKwkJbGRyCXI0LCBbcjBdCisJCWFuZAlyNCwgcjQsIGlwCisJCWxkcglyNSwgW3IwXQorCQlvcnIJcjQsIHI0LCByNSwgbHNsICMxNgorCisJCWxkcglyNSwgW3IwXQorCQlhbmQJcjUsIHI1LCBpcAorCQlsZHIJcjYsIFtyMF0KKwkJb3JyCXI1LCByNSwgcjYsIGxzbCAjMTYKKworCQlsZHIJcjYsIFtyMF0KKwkJYW5kCXI2LCByNiwgaXAKKwkJbGRyCWxyLCBbcjBdCisJCW9ycglyNiwgcjYsIGxyLCBsc2wgIzE2CisKKwkJc3RtaWEJcjEhLCB7cjMgLSByNn0KKworCQlzdWJzCXIyLCByMiwgIzgKKwkJYnBsCS5pbnN3XzhfbHAKKworCQl0c3QJcjIsICM3CisJCUxPQURSRUdTKGVxZmQsIHNwISwge3I0LCByNSwgcjYsIHBjfSkKKworLm5vX2luc3dfODoJdHN0CXIyLCAjNAorCQliZXEJLm5vX2luc3dfNAorCisJCWxkcglyMywgW3IwXQorCQlhbmQJcjMsIHIzLCBpcAorCQlsZHIJcjQsIFtyMF0KKwkJb3JyCXIzLCByMywgcjQsIGxzbCAjMTYKKworCQlsZHIJcjQsIFtyMF0KKwkJYW5kCXI0LCByNCwgaXAKKwkJbGRyCXI1LCBbcjBdCisJCW9ycglyNCwgcjQsIHI1LCBsc2wgIzE2CisKKwkJc3RtaWEJcjEhLCB7cjMsIHI0fQorCisubm9faW5zd180Ogl0c3QJcjIsICMyCisJCWJlcQkubm9faW5zd18yCisKKwkJbGRyCXIzLCBbcjBdCisJCWFuZAlyMywgcjMsIGlwCisJCWxkcglyNCwgW3IwXQorCQlvcnIJcjMsIHIzLCByNCwgbHNsICMxNgorCisJCXN0cglyMywgW3IxXSwgIzQKKworLm5vX2luc3dfMjoJdHN0CXIyLCAjMQorCQlsZHJuZQlyMywgW3IwXQorCQlzdHJuZWIJcjMsIFtyMV0sICMxCisJCW1vdm5lCXIzLCByMywgbHNyICM4CisJCXN0cm5lYglyMywgW3IxXQorCisJCUxPQURSRUdTKGZkLCBzcCEsIHtyNCwgcjUsIHI2LCBwY30pCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2lvLXJlYWRzdy1hcm12NC5TIGIvYXJjaC9hcm0vbGliL2lvLXJlYWRzdy1hcm12NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmI2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvaW8tcmVhZHN3LWFybXY0LlMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2lvLXJlYWRzdy1hcm12NC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJCS5tYWNybwlwYWNrLCByZCwgaHcxLCBodzIKKyNpZm5kZWYgX19BUk1FQl9fCisJCW9ycglccmQsIFxodzEsIFxodzIsIGxzbCAjMTYKKyNlbHNlCisJCW9ycglccmQsIFxodzIsIFxodzEsIGxzbCAjMTYKKyNlbmRpZgorCQkuZW5kbQorCisuaW5zd19hbGlnbjoJbW92cwlpcCwgcjEsIGxzbCAjMzEKKwkJYm5lCS5pbnN3X25vYWxpZ24KKwkJbGRyaAlpcCwgW3IwXQorCQlzdWIJcjIsIHIyLCAjMQorCQlzdHJoCWlwLCBbcjFdLCAjMgorCitFTlRSWShfX3Jhd19yZWFkc3cpCisJCXRlcQlyMiwgIzAKKwkJbW92ZXEJcGMsIGxyCisJCXRzdAlyMSwgIzMKKwkJYm5lCS5pbnN3X2FsaWduCisKKwkJc3RtZmQJc3AhLCB7cjQsIHI1LCBscn0KKworCQlzdWJzCXIyLCByMiwgIzgKKwkJYm1pCS5ub19pbnN3XzgKKworLmluc3dfOF9scDoJbGRyaAlyMywgW3IwXQorCQlsZHJoCXI0LCBbcjBdCisJCXBhY2sJcjMsIHIzLCByNAorCisJCWxkcmgJcjQsIFtyMF0KKwkJbGRyaAlyNSwgW3IwXQorCQlwYWNrCXI0LCByNCwgcjUKKworCQlsZHJoCXI1LCBbcjBdCisJCWxkcmgJaXAsIFtyMF0KKwkJcGFjawlyNSwgcjUsIGlwCisKKwkJbGRyaAlpcCwgW3IwXQorCQlsZHJoCWxyLCBbcjBdCisJCXBhY2sJaXAsIGlwLCBscgorCisJCXN1YnMJcjIsIHIyLCAjOAorCQlzdG1pYQlyMSEsIHtyMyAtIHI1LCBpcH0KKwkJYnBsCS5pbnN3XzhfbHAKKworLm5vX2luc3dfODoJdHN0CXIyLCAjNAorCQliZXEJLm5vX2luc3dfNAorCisJCWxkcmgJcjMsIFtyMF0KKwkJbGRyaAlyNCwgW3IwXQorCQlwYWNrCXIzLCByMywgcjQKKworCQlsZHJoCXI0LCBbcjBdCisJCWxkcmgJaXAsIFtyMF0KKwkJcGFjawlyNCwgcjQsIGlwCisKKwkJc3RtaWEJcjEhLCB7cjMsIHI0fQorCisubm9faW5zd180Ogltb3ZzCXIyLCByMiwgbHNsICMzMQorCQliY2MJLm5vX2luc3dfMgorCisJCWxkcmgJcjMsIFtyMF0KKwkJbGRyaAlpcCwgW3IwXQorCQlwYWNrCXIzLCByMywgaXAKKwkJc3RyCXIzLCBbcjFdLCAjNAorCisubm9faW5zd18yOglsZHJuZWgJcjMsIFtyMF0KKwkJc3RybmVoCXIzLCBbcjFdCisKKwkJbGRtZmQJc3AhLCB7cjQsIHI1LCBwY30KKworI2lmZGVmIF9fQVJNRUJfXworI2RlZmluZSBfQkVfT05MWV8oY29kZS4uLikJY29kZQorI2RlZmluZSBfTEVfT05MWV8oY29kZS4uLikKKyNkZWZpbmUgcHVzaF9oYnl0ZTAJCWxzciAjOAorI2RlZmluZSBwdWxsX2hieXRlMQkJbHNsICMyNAorI2Vsc2UKKyNkZWZpbmUgX0JFX09OTFlfKGNvZGUuLi4pCisjZGVmaW5lIF9MRV9PTkxZXyhjb2RlLi4uKSBjb2RlCisjZGVmaW5lIHB1c2hfaGJ5dGUwCQlsc2wgIzI0CisjZGVmaW5lIHB1bGxfaGJ5dGUxCQlsc3IgIzgKKyNlbmRpZgorCisuaW5zd19ub2FsaWduOglzdG1mZAlzcCEsIHtyNCwgbHJ9CisJCWxkcmNjYglpcCwgW3IxLCAjLTFdIQorCQliY2MJMWYKKworCQlsZHJoCWlwLCBbcjBdCisJCXN1YglyMiwgcjIsICMxCisgICBfQkVfT05MWV8oCW1vdglpcCwgaXAsIHJvciAjOAkJKQorCQlzdHJiCWlwLCBbcjFdLCAjMQorICAgX0xFX09OTFlfKAltb3YJaXAsIGlwLCBsc3IgIzgJCSkKKyAgIF9CRV9PTkxZXygJbW92CWlwLCBpcCwgbHNyICMyNAkJKQorCisxOgkJc3VicwlyMiwgcjIsICMyCisJCWJtaQkzZgorICAgX0JFX09OTFlfKAltb3YJaXAsIGlwLCBsc2wgIzI0CQkpCisKKzI6CQlsZHJoCXIzLCBbcjBdCisJCWxkcmgJcjQsIFtyMF0KKwkJc3VicwlyMiwgcjIsICMyCisJCW9ycglpcCwgaXAsIHIzLCBsc2wgIzgKKwkJb3JyCWlwLCBpcCwgcjQsIHB1c2hfaGJ5dGUwCisJCXN0cglpcCwgW3IxXSwgIzQKKwkJbW92CWlwLCByNCwgcHVsbF9oYnl0ZTEKKwkJYnBsCTJiCisKKyAgIF9CRV9PTkxZXygJbW92CWlwLCBpcCwgbHNyICMyNAkJKQorCiszOgkJdHN0CXIyLCAjMQorCQlzdHJiCWlwLCBbcjFdLCAjMQorCQlsZHJuZWgJaXAsIFtyMF0KKyAgIF9CRV9PTkxZXygJbW92bmUJaXAsIGlwLCByb3IgIzgJCSkKKwkJc3RybmViCWlwLCBbcjFdLCAjMQorICAgX0xFX09OTFlfKAltb3ZuZQlpcCwgaXAsIGxzciAjOAkJKQorICAgX0JFX09OTFlfKAltb3ZuZQlpcCwgaXAsIGxzciAjMjQJCSkKKwkJc3RybmViCWlwLCBbcjFdCisJCWxkbWZkCXNwISwge3I0LCBwY30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9pby1zaGFyay5jIGIvYXJjaC9hcm0vbGliL2lvLXNoYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4ZDQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9pby1zaGFyay5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2lvLXNoYXJrLmMKKyAqCisgKiAgYnkgQWxleGFuZGVyIFNjaHVsegorICoKKyAqIGRlcml2ZWQgZnJvbToKKyAqIGxpbnV4L2FyY2gvYXJtL2xpYi9pby1lYnNhLlMKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKwordm9pZCBwcmludF93YXJuaW5nKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5zPy9vdXRzPyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmVcbiIpOworfQorCit2b2lkIGluc2wodW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKnRvLCBpbnQgbGVuKQoreworCXByaW50X3dhcm5pbmcoKTsKK30KKwordm9pZCBpbnNiKHVuc2lnbmVkIGludCBwb3J0LCB2b2lkICp0bywgaW50IGxlbikKK3sKKwlwcmludF93YXJuaW5nKCk7Cit9CisKK3ZvaWQgb3V0c2wodW5zaWduZWQgaW50IHBvcnQsIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pCit7CisJcHJpbnRfd2FybmluZygpOworfQorCit2b2lkIG91dHNiKHVuc2lnbmVkIGludCBwb3J0LCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQoreworCXByaW50X3dhcm5pbmcoKTsKK30KKworLyogdGhlc2Ugc2hvdWxkIGJlIGluIGFzc2VtYmxlciBhZ2FpbiAqLworCisvKgorICogUHVycG9zZTogcmVhZCBhIGJsb2NrIG9mIGRhdGEgZnJvbSBhIGhhcmR3YXJlIHJlZ2lzdGVyIHRvIG1lbW9yeS4KKyAqIFByb3RvICA6IGluc3coaW50IGZyb21fcG9ydCwgdm9pZCAqdG8sIGludCBsZW5faW5fd29yZHMpOworICogUHJvdG8gIDogaW5zd2IoaW50IGZyb21fcG9ydCwgdm9pZCAqdG8sIGludCBsZW5faW5fYnl0ZXMpOworICogTm90ZXMgIDogaW5jcmVtZW50IHRvCisgKi8KKwordm9pZCBpbnN3KHVuc2lnbmVkIGludCBwb3J0LCB2b2lkICp0bywgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJKCh1bnNpZ25lZCBzaG9ydCAqKSB0bylbaV0gPSBpbncocG9ydCk7Cit9CisKK3ZvaWQgaW5zd2IodW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKnRvLCBpbnQgbGVuKQoreworCWluc3cocG9ydCwgdG8sIGxlbiA+PiAyKTsKK30KKworLyoKKyAqIFB1cnBvc2U6IHdyaXRlIGEgYmxvY2sgb2YgZGF0YSBmcm9tIG1lbW9yeSB0byBhIGhhcmR3YXJlIHJlZ2lzdGVyLgorICogUHJvdG8gIDogb3V0c3coaW50IHRvX3JlZywgdm9pZCAqZnJvbSwgaW50IGxlbl9pbl93b3Jkcyk7CisgKiBQcm90byAgOiBvdXRzd2IoaW50IHRvX3JlZywgdm9pZCAqZnJvbSwgaW50IGxlbl9pbl9ieXRlcyk7CisgKiBOb3RlcyAgOiBpbmNyZW1lbnRzIGZyb20KKyAqLworCit2b2lkIG91dHN3KHVuc2lnbmVkIGludCBwb3J0LCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlvdXR3KCgodW5zaWduZWQgc2hvcnQgKikgZnJvbSlbaV0sIHBvcnQpOworfQorCit2b2lkIG91dHN3Yih1bnNpZ25lZCBpbnQgcG9ydCwgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKK3sKKwlvdXRzdyhwb3J0LCBmcm9tLCBsZW4gPj4gMik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvaW8td3JpdGVzYi5TIGIvYXJjaC9hcm0vbGliL2lvLXdyaXRlc2IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGIyNTYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2lvLXdyaXRlc2IuUwpAQCAtMCwwICsxLDkyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9pby13cml0ZXNiLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKKwkJLm1hY3JvCW91dHdvcmQsIHJkCisjaWZuZGVmIF9fQVJNRUJfXworCQlzdHJiCVxyZCwgW3IwXQorCQltb3YJXHJkLCBccmQsIGxzciAjOAorCQlzdHJiCVxyZCwgW3IwXQorCQltb3YJXHJkLCBccmQsIGxzciAjOAorCQlzdHJiCVxyZCwgW3IwXQorCQltb3YJXHJkLCBccmQsIGxzciAjOAorCQlzdHJiCVxyZCwgW3IwXQorI2Vsc2UKKwkJbW92CWxyLCBccmQsIGxzciAjMjQKKwkJc3RyYglsciwgW3IwXQorCQltb3YJbHIsIFxyZCwgbHNyICMxNgorCQlzdHJiCWxyLCBbcjBdCisJCW1vdglsciwgXHJkLCBsc3IgIzgKKwkJc3RyYglsciwgW3IwXQorCQlzdHJiCVxyZCwgW3IwXQorI2VuZGlmCisJCS5lbmRtCisKKy5vdXRzYl9hbGlnbjoJcnNiCWlwLCBpcCwgIzQKKwkJY21wCWlwLCByMgorCQltb3ZndAlpcCwgcjIKKwkJY21wCWlwLCAjMgorCQlsZHJiCXIzLCBbcjFdLCAjMQorCQlzdHJiCXIzLCBbcjBdCisJCWxkcmdlYglyMywgW3IxXSwgIzEKKwkJc3RyZ2ViCXIzLCBbcjBdCisJCWxkcmd0YglyMywgW3IxXSwgIzEKKwkJc3RyZ3RiCXIzLCBbcjBdCisJCXN1YnMJcjIsIHIyLCBpcAorCQlibmUJLm91dHNiX2FsaWduZWQKKworRU5UUlkoX19yYXdfd3JpdGVzYikKKwkJdGVxCXIyLCAjMAkJQCBkbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGUgemVybyBsZW4/CisJCW1vdmVxCXBjLCBscgorCQlhbmRzCWlwLCByMSwgIzMKKwkJYm5lCS5vdXRzYl9hbGlnbgorCisub3V0c2JfYWxpZ25lZDoJc3RtZmQJc3AhLCB7cjQsIHI1LCBscn0KKworCQlzdWJzCXIyLCByMiwgIzE2CisJCWJtaQkub3V0c2Jfbm9fMTYKKworLm91dHNiXzE2X2xwOglsZG1pYQlyMSEsIHtyMywgcjQsIHI1LCBpcH0KKwkJb3V0d29yZAlyMworCQlvdXR3b3JkCXI0CisJCW91dHdvcmQJcjUKKwkJb3V0d29yZAlpcAorCQlzdWJzCXIyLCByMiwgIzE2CisJCWJwbAkub3V0c2JfMTZfbHAKKworCQl0c3QJcjIsICMxNQorCQlMT0FEUkVHUyhlcWZkLCBzcCEsIHtyNCwgcjUsIHBjfSkKKworLm91dHNiX25vXzE2Ogl0c3QJcjIsICM4CisJCWJlcQkub3V0c2Jfbm9fOAorCisJCWxkbWlhCXIxISwge3IzLCByNH0KKwkJb3V0d29yZAlyMworCQlvdXR3b3JkCXI0CisKKy5vdXRzYl9ub184Ogl0c3QJcjIsICM0CisJCWJlcQkub3V0c2Jfbm9fNAorCisJCWxkcglyMywgW3IxXSwgIzQKKwkJb3V0d29yZAlyMworCisub3V0c2Jfbm9fNDoJYW5kcwlyMiwgcjIsICMzCisJCUxPQURSRUdTKGVxZmQsIHNwISwge3I0LCByNSwgcGN9KQorCisJCWNtcAlyMiwgIzIKKwkJbGRyYglyMywgW3IxXSwgIzEKKwkJc3RyYglyMywgW3IwXQorCQlsZHJnZWIJcjMsIFtyMV0sICMxCisJCXN0cmdlYglyMywgW3IwXQorCQlsZHJndGIJcjMsIFtyMV0KKwkJc3RyZ3RiCXIzLCBbcjBdCisKKwkJTE9BRFJFR1MoZmQsIHNwISwge3I0LCByNSwgcGN9KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2lvLXdyaXRlc2wuUyBiL2FyY2gvYXJtL2xpYi9pby13cml0ZXNsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmMTRkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9pby13cml0ZXNsLlMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvaW8td3JpdGVzbC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCitFTlRSWShfX3Jhd193cml0ZXNsKQorCQl0ZXEJcjIsICMwCQlAIGRvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIHRoZSB6ZXJvIGxlbj8KKwkJbW92ZXEJcGMsIGxyCisJCWFuZHMJaXAsIHIxLCAjMworCQlibmUJM2YKKworCQlzdWJzCXIyLCByMiwgIzQKKwkJYm1pCTJmCisJCXN0bWZkCXNwISwge3I0LCBscn0KKzE6CQlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0KKwkJc3VicwlyMiwgcjIsICM0CisJCXN0cglyMywgW3IwLCAjMF0KKwkJc3RyCXI0LCBbcjAsICMwXQorCQlzdHIJaXAsIFtyMCwgIzBdCisJCXN0cglsciwgW3IwLCAjMF0KKwkJYnBsCTFiCisJCWxkbWZkCXNwISwge3I0LCBscn0KKzI6CQltb3ZzCXIyLCByMiwgbHNsICMzMQorCQlsZG1jc2lhCXIxISwge3IzLCBpcH0KKwkJc3RyY3MJcjMsIFtyMCwgIzBdCisJCWxkcm5lCXIzLCBbcjEsICMwXQorCQlzdHJjcwlpcCwgW3IwLCAjMF0KKwkJc3RybmUJcjMsIFtyMCwgIzBdCisJCW1vdglwYywgbHIKKworMzoJCWJpYwlyMSwgcjEsICMzCisJCWxkcglyMywgW3IxXSwgIzQKKwkJY21wCWlwLCAjMgorCQlibHQJNWYKKwkJYmd0CTZmCisKKzQ6CQltb3YJaXAsIHIzLCBwdWxsICMxNgorCQlsZHIJcjMsIFtyMV0sICM0CisJCXN1YnMJcjIsIHIyLCAjMQorCQlvcnIJaXAsIGlwLCByMywgcHVzaCAjMTYKKwkJc3RyCWlwLCBbcjBdCisJCWJuZQk0YgorCQltb3YJcGMsIGxyCisKKzU6CQltb3YJaXAsIHIzLCBwdWxsICM4CisJCWxkcglyMywgW3IxXSwgIzQKKwkJc3VicwlyMiwgcjIsICMxCisJCW9ycglpcCwgaXAsIHIzLCBwdXNoICMyNAorCQlzdHIJaXAsIFtyMF0KKwkJYm5lCTViCisJCW1vdglwYywgbHIKKworNjoJCW1vdglpcCwgcjMsIHB1bGwgIzI0CisJCWxkcglyMywgW3IxXSwgIzQKKwkJc3VicwlyMiwgcjIsICMxCisJCW9ycglpcCwgaXAsIHIzLCBwdXNoICM4CisJCXN0cglpcCwgW3IwXQorCQlibmUJNmIKKwkJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2lvLXdyaXRlc3ctYXJtdjMuUyBiL2FyY2gvYXJtL2xpYi9pby13cml0ZXN3LWFybXYzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwZTdlMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9pby13cml0ZXN3LWFybXYzLlMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2lvLXdyaXRlc3ctYXJtdjMuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworLm91dHN3X2JhZF9hbGlnbm1lbnQ6CisJCWFkcglyMCwgLm91dHN3X2JhZF9hbGlnbl9tc2cKKwkJbW92CXIyLCBscgorCQliCXBhbmljCisub3V0c3dfYmFkX2FsaWduX21zZzoKKwkJLmFzY2l6CSJvdXRzdzogYmFkIGJ1ZmZlciBhbGlnbm1lbnQgKDB4JXAsIGxyPTB4JTA4bFgpXG4iCisJCS5hbGlnbgorCisub3V0c3dfYWxpZ246CXRzdAlyMSwgIzEKKwkJYm5lCS5vdXRzd19iYWRfYWxpZ25tZW50CisKKwkJYWRkCXIxLCByMSwgIzIKKworCQlsZHIJcjMsIFtyMSwgIy00XQorCQltb3YJcjMsIHIzLCBsc3IgIzE2CisJCW9ycglyMywgcjMsIHIzLCBsc2wgIzE2CisJCXN0cglyMywgW3IwXQorCQlzdWJzCXIyLCByMiwgIzEKKwkJUkVUSU5TVFIobW92ZXEsIHBjLCBscikKKworRU5UUlkoX19yYXdfd3JpdGVzdykKKwkJdGVxCXIyLCAjMAkJQCBkbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGUgemVybyBsZW4/CisJCW1vdmVxCXBjLCBscgorCQl0c3QJcjEsICMzCisJCWJuZQkub3V0c3dfYWxpZ24KKworLm91dHN3X2FsaWduZWQ6CXN0bWZkCXNwISwge3I0LCByNSwgcjYsIGxyfQorCisJCXN1YnMJcjIsIHIyLCAjOAorCQlibWkJLm5vX291dHN3XzgKKworLm91dHN3XzhfbHA6CWxkbWlhCXIxISwge3IzLCByNCwgcjUsIHI2fQorCisJCW1vdglpcCwgcjMsIGxzbCAjMTYKKwkJb3JyCWlwLCBpcCwgaXAsIGxzciAjMTYKKwkJc3RyCWlwLCBbcjBdCisKKwkJbW92CWlwLCByMywgbHNyICMxNgorCQlvcnIJaXAsIGlwLCBpcCwgbHNsICMxNgorCQlzdHIJaXAsIFtyMF0KKworCQltb3YJaXAsIHI0LCBsc2wgIzE2CisJCW9ycglpcCwgaXAsIGlwLCBsc3IgIzE2CisJCXN0cglpcCwgW3IwXQorCisJCW1vdglpcCwgcjQsIGxzciAjMTYKKwkJb3JyCWlwLCBpcCwgaXAsIGxzbCAjMTYKKwkJc3RyCWlwLCBbcjBdCisKKwkJbW92CWlwLCByNSwgbHNsICMxNgorCQlvcnIJaXAsIGlwLCBpcCwgbHNyICMxNgorCQlzdHIJaXAsIFtyMF0KKworCQltb3YJaXAsIHI1LCBsc3IgIzE2CisJCW9ycglpcCwgaXAsIGlwLCBsc2wgIzE2CisJCXN0cglpcCwgW3IwXQorCisJCW1vdglpcCwgcjYsIGxzbCAjMTYKKwkJb3JyCWlwLCBpcCwgaXAsIGxzciAjMTYKKwkJc3RyCWlwLCBbcjBdCisKKwkJbW92CWlwLCByNiwgbHNyICMxNgorCQlvcnIJaXAsIGlwLCBpcCwgbHNsICMxNgorCQlzdHIJaXAsIFtyMF0KKworCQlzdWJzCXIyLCByMiwgIzgKKwkJYnBsCS5vdXRzd184X2xwCisKKwkJdHN0CXIyLCAjNworCQlMT0FEUkVHUyhlcWZkLCBzcCEsIHtyNCwgcjUsIHI2LCBwY30pCisKKy5ub19vdXRzd184Ogl0c3QJcjIsICM0CisJCWJlcQkubm9fb3V0c3dfNAorCisJCWxkbWlhCXIxISwge3IzLCByNH0KKworCQltb3YJaXAsIHIzLCBsc2wgIzE2CisJCW9ycglpcCwgaXAsIGlwLCBsc3IgIzE2CisJCXN0cglpcCwgW3IwXQorCisJCW1vdglpcCwgcjMsIGxzciAjMTYKKwkJb3JyCWlwLCBpcCwgaXAsIGxzbCAjMTYKKwkJc3RyCWlwLCBbcjBdCisKKwkJbW92CWlwLCByNCwgbHNsICMxNgorCQlvcnIJaXAsIGlwLCBpcCwgbHNyICMxNgorCQlzdHIJaXAsIFtyMF0KKworCQltb3YJaXAsIHI0LCBsc3IgIzE2CisJCW9ycglpcCwgaXAsIGlwLCBsc2wgIzE2CisJCXN0cglpcCwgW3IwXQorCisubm9fb3V0c3dfNDoJdHN0CXIyLCAjMgorCQliZXEJLm5vX291dHN3XzIKKworCQlsZHIJcjMsIFtyMV0sICM0CisKKwkJbW92CWlwLCByMywgbHNsICMxNgorCQlvcnIJaXAsIGlwLCBpcCwgbHNyICMxNgorCQlzdHIJaXAsIFtyMF0KKworCQltb3YJaXAsIHIzLCBsc3IgIzE2CisJCW9ycglpcCwgaXAsIGlwLCBsc2wgIzE2CisJCXN0cglpcCwgW3IwXQorCisubm9fb3V0c3dfMjoJdHN0CXIyLCAjMQorCisJCWxkcm5lCXIzLCBbcjFdCisKKwkJbW92bmUJaXAsIHIzLCBsc2wgIzE2CisJCW9ycm5lCWlwLCBpcCwgaXAsIGxzciAjMTYKKwkJc3RybmUJaXAsIFtyMF0KKworCQlMT0FEUkVHUyhmZCwgc3AhLCB7cjQsIHI1LCByNiwgcGN9KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2lvLXdyaXRlc3ctYXJtdjQuUyBiL2FyY2gvYXJtL2xpYi9pby13cml0ZXN3LWFybXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxZDdjMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9pby13cml0ZXN3LWFybXY0LlMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvaW8td3JpdGVzdy1hcm12NC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJCS5tYWNybwlvdXR3b3JkLCByZAorI2lmbmRlZiBfX0FSTUVCX18KKwkJc3RyaAlccmQsIFtyMF0KKwkJbW92CVxyZCwgXHJkLCBsc3IgIzE2CisJCXN0cmgJXHJkLCBbcjBdCisjZWxzZQorCQltb3YJbHIsIFxyZCwgbHNyICMxNgorCQlzdHJoCWxyLCBbcjBdCisJCXN0cmgJXHJkLCBbcjBdCisjZW5kaWYKKwkJLmVuZG0KKworLm91dHN3X2FsaWduOgltb3ZzCWlwLCByMSwgbHNsICMzMQorCQlibmUJLm91dHN3X25vYWxpZ24KKworCQlsZHJoCXIzLCBbcjFdLCAjMgorCQlzdWIJcjIsIHIyLCAjMQorCQlzdHJoCXIzLCBbcjBdCisKK0VOVFJZKF9fcmF3X3dyaXRlc3cpCisJCXRlcQlyMiwgIzAKKwkJbW92ZXEJcGMsIGxyCisJCWFuZHMJcjMsIHIxLCAjMworCQlibmUJLm91dHN3X2FsaWduCisKKwkJc3RtZmQJc3AhLCB7cjQsIHI1LCBscn0KKworCQlzdWJzCXIyLCByMiwgIzgKKwkJYm1pCS5ub19vdXRzd184CisKKy5vdXRzd184X2xwOglsZG1pYQlyMSEsIHtyMywgcjQsIHI1LCBpcH0KKwkJc3VicwlyMiwgcjIsICM4CisJCW91dHdvcmQJcjMKKwkJb3V0d29yZAlyNAorCQlvdXR3b3JkCXI1CisJCW91dHdvcmQJaXAKKwkJYnBsCS5vdXRzd184X2xwCisKKy5ub19vdXRzd184Ogl0c3QJcjIsICM0CisJCWJlcQkubm9fb3V0c3dfNAorCisJCWxkbWlhCXIxISwge3IzLCBpcH0KKwkJb3V0d29yZAlyMworCQlvdXR3b3JkCWlwCisKKy5ub19vdXRzd180Ogltb3ZzCXIyLCByMiwgbHNsICMzMQorCQliY2MJLm5vX291dHN3XzIKKworCQlsZHIJcjMsIFtyMV0sICM0CisJCW91dHdvcmQJcjMKKworLm5vX291dHN3XzI6CWxkcm5laAlyMywgW3IxXQorCQlzdHJuZWgJcjMsIFtyMF0KKworCQlsZG1mZAlzcCEsIHtyNCwgcjUsIHBjfQorCisjaWZkZWYgX19BUk1FQl9fCisjZGVmaW5lIHB1bGxfaGJ5dGUwCWxzbCAjOAorI2RlZmluZSBwdXNoX2hieXRlMQlsc3IgIzI0CisjZWxzZQorI2RlZmluZSBwdWxsX2hieXRlMAlsc3IgIzI0CisjZGVmaW5lIHB1c2hfaGJ5dGUxCWxzbCAjOAorI2VuZGlmCisKKy5vdXRzd19ub2FsaWduOglsZHIJcjMsIFtyMSwgLXIzXSEKKwkJc3ViY3MJcjIsIHIyLCAjMQorCQliY3MJMmYKKwkJc3VicwlyMiwgcjIsICMyCisJCWJtaQkzZgorCisxOgkJbW92CWlwLCByMywgbHNyICM4CisJCXN0cmgJaXAsIFtyMF0KKzI6CQltb3YJaXAsIHIzLCBwdWxsX2hieXRlMAorCQlsZHIJcjMsIFtyMSwgIzRdIQorCQlzdWJzCXIyLCByMiwgIzIKKwkJb3JyCWlwLCBpcCwgcjMsIHB1c2hfaGJ5dGUxCisJCXN0cmgJaXAsIFtyMF0KKwkJYnBsCTJiCisKKzM6CQl0c3QJcjIsICMxCisyOgkJbW92bmUJaXAsIHIzLCBsc3IgIzgKKwkJc3RybmVoCWlwLCBbcjBdCisJCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9saWIxZnVuY3MuUyBiL2FyY2gvYXJtL2xpYi9saWIxZnVuY3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTAyNjAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL2xpYjFmdW5jcy5TCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbGliL2xpYjFmdW5jcy5TOiBPcHRpbWl6ZWQgQVJNIGRpdmlzaW9uIHJvdXRpbmVzCisgKgorICogQXV0aG9yOiBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKiAgIC0gY29udHJpYnV0ZWQgdG8gZ2NjLTMuNCBvbiBTZXAgMzAsIDIwMDMKKyAqICAgLSBhZGFwdGVkIGZvciB0aGUgTGludXgga2VybmVsIG9uIE9jdCAyLCAyMDAzCisgKi8KKworLyogQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2xhdGVyIHZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisKKy5tYWNybyBBUk1fRElWX0JPRFkgZGl2aWRlbmQsIGRpdmlzb3IsIHJlc3VsdCwgY3VyYml0CisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CVxjdXJiaXQsIFxkaXZpc29yCisJY2x6CVxyZXN1bHQsIFxkaXZpZGVuZAorCXN1YglccmVzdWx0LCBcY3VyYml0LCBccmVzdWx0CisJbW92CVxjdXJiaXQsICMxCisJbW92CVxkaXZpc29yLCBcZGl2aXNvciwgbHNsIFxyZXN1bHQKKwltb3YJXGN1cmJpdCwgXGN1cmJpdCwgbHNsIFxyZXN1bHQKKwltb3YJXHJlc3VsdCwgIzAKKwkKKyNlbHNlCisKKwlAIEluaXRpYWxseSBzaGlmdCB0aGUgZGl2aXNvciBsZWZ0IDMgYml0cyBpZiBwb3NzaWJsZSwKKwlAIHNldCBjdXJiaXQgYWNjb3JkaW5nbHkuICBUaGlzIGFsbG93cyBmb3IgY3VyYml0IHRvIGJlIGxvY2F0ZWQKKwlAIGF0IHRoZSBsZWZ0IGVuZCBvZiBlYWNoIDQgYml0IG5pYmJsZXMgaW4gdGhlIGRpdmlzaW9uIGxvb3AKKwlAIHRvIHNhdmUgb25lIGxvb3AgaW4gbW9zdCBjYXNlcy4KKwl0c3QJXGRpdmlzb3IsICMweGUwMDAwMDAwCisJbW92ZXEJXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzMKKwltb3ZlcQlcY3VyYml0LCAjOAorCW1vdm5lCVxjdXJiaXQsICMxCisKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcyAKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKzE6CWNtcAlcZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzQKKwltb3ZsbwlcY3VyYml0LCBcY3VyYml0LCBsc2wgIzQKKwlibG8JMWIKKworCUAgRm9yIHZlcnkgYmlnIGRpdmlzb3JzLCB3ZSBtdXN0IHNoaWZ0IGl0IGEgYml0IGF0IGEgdGltZSwgb3IKKwlAIHdlIHdpbGwgYmUgaW4gZGFuZ2VyIG9mIG92ZXJmbG93aW5nLgorMToJY21wCVxkaXZpc29yLCAjMHg4MDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjMQorCW1vdmxvCVxjdXJiaXQsIFxjdXJiaXQsIGxzbCAjMQorCWJsbwkxYgorCisJbW92CVxyZXN1bHQsICMwCisKKyNlbmRpZgorCisJQCBEaXZpc2lvbiBsb29wCisxOgljbXAJXGRpdmlkZW5kLCBcZGl2aXNvcgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0CisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzEKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMQorCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0LCAgbHNyICMxCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzIKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMgorCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0LCAgbHNyICMyCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzMKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMworCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0LCAgbHNyICMzCisJY21wCVxkaXZpZGVuZCwgIzAJCQlAIEVhcmx5IHRlcm1pbmF0aW9uPworCW1vdm5lcwlcY3VyYml0LCAgIFxjdXJiaXQsICBsc3IgIzQJQCBObywgYW55IG1vcmUgYml0cyB0byBkbz8KKwltb3ZuZQlcZGl2aXNvciwgIFxkaXZpc29yLCBsc3IgIzQKKwlibmUJMWIKKworLmVuZG0KKworCisubWFjcm8gQVJNX0RJVjJfT1JERVIgZGl2aXNvciwgb3JkZXIKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisKKwljbHoJXG9yZGVyLCBcZGl2aXNvcgorCXJzYglcb3JkZXIsIFxvcmRlciwgIzMxCisKKyNlbHNlCisKKwljbXAJXGRpdmlzb3IsICMoMSA8PCAxNikKKwltb3ZocwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjMTYKKwltb3Zocwlcb3JkZXIsICMxNgorCW1vdmxvCVxvcmRlciwgIzAKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDgpCisJbW92aHMJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzgKKwlhZGRocwlcb3JkZXIsIFxvcmRlciwgIzgKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDQpCisJbW92aHMJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzQKKwlhZGRocwlcb3JkZXIsIFxvcmRlciwgIzQKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDIpCisJYWRkaGkJXG9yZGVyLCBcb3JkZXIsICMzCisJYWRkbHMJXG9yZGVyLCBcb3JkZXIsIFxkaXZpc29yLCBsc3IgIzEKKworI2VuZGlmCisKKy5lbmRtCisKKworLm1hY3JvIEFSTV9NT0RfQk9EWSBkaXZpZGVuZCwgZGl2aXNvciwgb3JkZXIsIHNwYXJlCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CVxvcmRlciwgXGRpdmlzb3IKKwljbHoJXHNwYXJlLCBcZGl2aWRlbmQKKwlzdWIJXG9yZGVyLCBcb3JkZXIsIFxzcGFyZQorCW1vdglcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCBcb3JkZXIKKworI2Vsc2UKKworCW1vdglcb3JkZXIsICMwCisKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcyAKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKzE6CWNtcAlcZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzQKKwlhZGRsbwlcb3JkZXIsIFxvcmRlciwgIzQKKwlibG8JMWIKKworCUAgRm9yIHZlcnkgYmlnIGRpdmlzb3JzLCB3ZSBtdXN0IHNoaWZ0IGl0IGEgYml0IGF0IGEgdGltZSwgb3IKKwlAIHdlIHdpbGwgYmUgaW4gZGFuZ2VyIG9mIG92ZXJmbG93aW5nLgorMToJY21wCVxkaXZpc29yLCAjMHg4MDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjMQorCWFkZGxvCVxvcmRlciwgXG9yZGVyLCAjMQorCWJsbwkxYgorCisjZW5kaWYKKworCUAgUGVyZm9ybSBhbGwgbmVlZGVkIHN1YnN0cmFjdGlvbnMgdG8ga2VlcCBvbmx5IHRoZSByZW1pbmRlci4KKwlAIERvIGNvbXBhcmlzb25zIGluIGJhdGNoIG9mIDQgZmlyc3QuCisJc3Vicwlcb3JkZXIsIFxvcmRlciwgIzMJCUAgeWVzLCAzIGlzIGludGVuZGVkIGhlcmUKKwlibHQJMmYKKworMToJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMQorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMxCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzIKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMzCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzMKKwljbXAJXGRpdmlkZW5kLCAjMQorCW1vdglcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjNAorCXN1Ymdlcwlcb3JkZXIsIFxvcmRlciwgIzQKKwliZ2UJMWIKKworCXRzdAlcb3JkZXIsICMzCisJdGVxbmUJXGRpdmlkZW5kLCAjMAorCWJlcQk1ZgorCisJQCBFaXRoZXIgMSwgMiBvciAzIGNvbXBhcmlzb24vc3Vic3RyYWN0aW9ucyBhcmUgbGVmdC4KKzI6CWNtbglcb3JkZXIsICMyCisJYmx0CTRmCisJYmVxCTNmCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwltb3YJXGRpdmlzb3IsICBcZGl2aXNvciwgIGxzciAjMQorMzoJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwltb3YJXGRpdmlzb3IsICBcZGl2aXNvciwgIGxzciAjMQorNDoJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKzU6CisuZW5kbQorCisKK0VOVFJZKF9fdWRpdnNpMykKKworCXN1YnMJcjIsIHIxLCAjMQorCW1vdmVxCXBjLCBscgorCWJjYwlMZGl2MAorCWNtcAlyMCwgcjEKKwlibHMJMTFmCisJdHN0CXIxLCByMgorCWJlcQkxMmYKKworCUFSTV9ESVZfQk9EWSByMCwgcjEsIHIyLCByMworCisJbW92CXIwLCByMgorCW1vdglwYywgbHIKKworMTE6CW1vdmVxCXIwLCAjMQorCW1vdm5lCXIwLCAjMAorCW1vdglwYywgbHIKKworMTI6CUFSTV9ESVYyX09SREVSIHIxLCByMgorCisJbW92CXIwLCByMCwgbHNyIHIyCisJbW92CXBjLCBscgorCisKK0VOVFJZKF9fdW1vZHNpMykKKworCXN1YnMJcjIsIHIxLCAjMQkJCUAgY29tcGFyZSBkaXZpc29yIHdpdGggMQorCWJjYwlMZGl2MAorCWNtcG5lCXIwLCByMQkJCQlAIGNvbXBhcmUgZGl2aWRlbmQgd2l0aCBkaXZpc29yCisJbW92ZXEgICByMCwgIzAKKwl0c3RoaQlyMSwgcjIJCQkJQCBzZWUgaWYgZGl2aXNvciBpcyBwb3dlciBvZiAyCisJYW5kZXEJcjAsIHIwLCByMgorCW1vdmxzCXBjLCBscgorCisJQVJNX01PRF9CT0RZIHIwLCByMSwgcjIsIHIzCisKKwltb3YJcGMsIGxyCisKKworRU5UUlkoX19kaXZzaTMpCisKKwljbXAJcjEsICMwCisJZW9yCWlwLCByMCwgcjEJCQlAIHNhdmUgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdC4KKwliZXEJTGRpdjAKKwlyc2JtaQlyMSwgcjEsICMwCQkJQCBsb29wcyBiZWxvdyB1c2UgdW5zaWduZWQuCisJc3VicwlyMiwgcjEsICMxCQkJQCBkaXZpc2lvbiBieSAxIG9yIC0xID8KKwliZXEJMTBmCisJbW92cwlyMywgcjAKKwlyc2JtaQlyMywgcjAsICMwCQkJQCBwb3NpdGl2ZSBkaXZpZGVuZCB2YWx1ZQorCWNtcAlyMywgcjEKKwlibHMJMTFmCisJdHN0CXIxLCByMgkJCQlAIGRpdmlzb3IgaXMgcG93ZXIgb2YgMiA/CisJYmVxCTEyZgorCisJQVJNX0RJVl9CT0RZIHIzLCByMSwgcjAsIHIyCisKKwljbXAJaXAsICMwCisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworMTA6CXRlcQlpcCwgcjAJCQkJQCBzYW1lIHNpZ24gPworCXJzYm1pCXIwLCByMCwgIzAKKwltb3YJcGMsIGxyCisKKzExOgltb3ZsbwlyMCwgIzAKKwltb3ZlcQlyMCwgaXAsIGFzciAjMzEKKwlvcnJlcQlyMCwgcjAsICMxCisJbW92CXBjLCBscgorCisxMjoJQVJNX0RJVjJfT1JERVIgcjEsIHIyCisKKwljbXAJaXAsICMwCisJbW92CXIwLCByMywgbHNyIHIyCisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworCitFTlRSWShfX21vZHNpMykKKworCWNtcAlyMSwgIzAKKwliZXEJTGRpdjAKKwlyc2JtaQlyMSwgcjEsICMwCQkJQCBsb29wcyBiZWxvdyB1c2UgdW5zaWduZWQuCisJbW92cwlpcCwgcjAJCQkJQCBwcmVzZXJ2ZSBzaWduIG9mIGRpdmlkZW5kCisJcnNibWkJcjAsIHIwLCAjMAkJCUAgaWYgbmVnYXRpdmUgbWFrZSBwb3NpdGl2ZQorCXN1YnMJcjIsIHIxLCAjMQkJCUAgY29tcGFyZSBkaXZpc29yIHdpdGggMQorCWNtcG5lCXIwLCByMQkJCQlAIGNvbXBhcmUgZGl2aWRlbmQgd2l0aCBkaXZpc29yCisJbW92ZXEJcjAsICMwCisJdHN0aGkJcjEsIHIyCQkJCUAgc2VlIGlmIGRpdmlzb3IgaXMgcG93ZXIgb2YgMgorCWFuZGVxCXIwLCByMCwgcjIKKwlibHMJMTBmCisKKwlBUk1fTU9EX0JPRFkgcjAsIHIxLCByMiwgcjMKKworMTA6CWNtcAlpcCwgIzAKKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCisKK0xkaXYwOgorCisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJX19kaXYwCisJbW92CXIwLCAjMAkJCUAgQWJvdXQgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUuCisJbGRyCXBjLCBbc3BdLCAjNAorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9sb25nbG9uZy5oIGIvYXJjaC9hcm0vbGliL2xvbmdsb25nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZWVhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9sb25nbG9uZy5oCkBAIC0wLDAgKzEsMTgzIEBACisvKiBsb25nbG9uZy5oIC0tIGJhc2VkIG9uIGNvZGUgZnJvbSBnY2MtMi45NS4zCisKKyAgIGRlZmluaXRpb25zIGZvciBtaXhlZCBzaXplIDMyLzY0IGJpdCBhcml0aG1ldGljLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBkZWZpbml0aW9uIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKKyAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIGRlZmluaXRpb24gZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEJvcnJvd2VkIGZyb20gR0NDIDIuOTUuMywgSSBNb2x0b24gMjkvMDcvMDEgKi8KKworI2lmbmRlZiBTSV9UWVBFX1NJWkUKKyNkZWZpbmUgU0lfVFlQRV9TSVpFIDMyCisjZW5kaWYKKworI2RlZmluZSBfX0JJVFM0IChTSV9UWVBFX1NJWkUgLyA0KQorI2RlZmluZSBfX2xsX0IgKDFMIDw8IChTSV9UWVBFX1NJWkUgLyAyKSkKKyNkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICgoVVNJdHlwZSkgKHQpICUgX19sbF9CKQorI2RlZmluZSBfX2xsX2hpZ2hwYXJ0KHQpICgoVVNJdHlwZSkgKHQpIC8gX19sbF9CKQorCisvKiBEZWZpbmUgYXV4aWxpYXJ5IGFzbSBtYWNyb3MuCisKKyAgIDEpIHVtdWxfcHBtbShoaWdoX3Byb2QsIGxvd19wcm9kLCBtdWx0aXBsZXIsIG11bHRpcGxpY2FuZCkKKyAgIG11bHRpcGxpZXMgdHdvIFVTSXR5cGUgaW50ZWdlcnMgTVVMVElQTEVSIGFuZCBNVUxUSVBMSUNBTkQsCisgICBhbmQgZ2VuZXJhdGVzIGEgdHdvLXBhcnQgVVNJdHlwZSBwcm9kdWN0IGluIEhJR0hfUFJPRCBhbmQKKyAgIExPV19QUk9ELgorCisgICAyKSBfX3VtdWxzaWRpMyhhLGIpIG11bHRpcGxpZXMgdHdvIFVTSXR5cGUgaW50ZWdlcnMgQSBhbmQgQiwKKyAgIGFuZCByZXR1cm5zIGEgVURJdHlwZSBwcm9kdWN0LiAgVGhpcyBpcyBqdXN0IGEgdmFyaWFudCBvZiB1bXVsX3BwbW0uCisKKyAgIDMpIHVkaXZfcXJubmQocXVvdGllbnQsIHJlbWFpbmRlciwgaGlnaF9udW1lcmF0b3IsIGxvd19udW1lcmF0b3IsCisgICBkZW5vbWluYXRvcikgZGl2aWRlcyBhIHR3by13b3JkIHVuc2lnbmVkIGludGVnZXIsIGNvbXBvc2VkIGJ5IHRoZQorICAgaW50ZWdlcnMgSElHSF9OVU1FUkFUT1IgYW5kIExPV19OVU1FUkFUT1IsIGJ5IERFTk9NSU5BVE9SIGFuZAorICAgcGxhY2VzIHRoZSBxdW90aWVudCBpbiBRVU9USUVOVCBhbmQgdGhlIHJlbWFpbmRlciBpbiBSRU1BSU5ERVIuCisgICBISUdIX05VTUVSQVRPUiBtdXN0IGJlIGxlc3MgdGhhbiBERU5PTUlOQVRPUiBmb3IgY29ycmVjdCBvcGVyYXRpb24uCisgICBJZiwgaW4gYWRkaXRpb24sIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBERU5PTUlOQVRPUiBtdXN0IGJlIDEsCisgICB0aGVuIHRoZSBwcmUtcHJvY2Vzc29yIHN5bWJvbCBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZGVmaW5lZCB0byAxLgorCisgICA0KSBzZGl2X3Fybm5kKHF1b3RpZW50LCByZW1haW5kZXIsIGhpZ2hfbnVtZXJhdG9yLCBsb3dfbnVtZXJhdG9yLAorICAgZGVub21pbmF0b3IpLiAgTGlrZSB1ZGl2X3Fybm5kIGJ1dCB0aGUgbnVtYmVycyBhcmUgc2lnbmVkLiAgVGhlCisgICBxdW90aWVudCBpcyByb3VuZGVkIHRvd2FyZHMgMC4KKworICAgNSkgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgY291bnRzIHRoZSBudW1iZXIgb2YgemVyby1iaXRzIGZyb20KKyAgIHRoZSBtc2IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdC4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiBzdGVwcyBYCisgICBuZWVkcyB0byBiZSBzaGlmdGVkIGxlZnQgdG8gc2V0IHRoZSBtc2IuICBVbmRlZmluZWQgZm9yIFggPT0gMC4KKworICAgNikgYWRkX3NzYWFhYShoaWdoX3N1bSwgbG93X3N1bSwgaGlnaF9hZGRlbmRfMSwgbG93X2FkZGVuZF8xLAorICAgaGlnaF9hZGRlbmRfMiwgbG93X2FkZGVuZF8yKSBhZGRzIHR3byB0d28td29yZCB1bnNpZ25lZCBpbnRlZ2VycywKKyAgIGNvbXBvc2VkIGJ5IEhJR0hfQURERU5EXzEgYW5kIExPV19BRERFTkRfMSwgYW5kIEhJR0hfQURERU5EXzIgYW5kCisgICBMT1dfQURERU5EXzIgcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9TVU0gYW5kCisgICBMT1dfU1VNLiAgT3ZlcmZsb3cgKGkuZS4gY2Fycnkgb3V0KSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgaXMKKyAgIGxvc3QuCisKKyAgIDcpIHN1Yl9kZG1tc3MoaGlnaF9kaWZmZXJlbmNlLCBsb3dfZGlmZmVyZW5jZSwgaGlnaF9taW51ZW5kLAorICAgbG93X21pbnVlbmQsIGhpZ2hfc3VidHJhaGVuZCwgbG93X3N1YnRyYWhlbmQpIHN1YnRyYWN0cyB0d28KKyAgIHR3by13b3JkIHVuc2lnbmVkIGludGVnZXJzLCBjb21wb3NlZCBieSBISUdIX01JTlVFTkRfMSBhbmQKKyAgIExPV19NSU5VRU5EXzEsIGFuZCBISUdIX1NVQlRSQUhFTkRfMiBhbmQgTE9XX1NVQlRSQUhFTkRfMgorICAgcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9ESUZGRVJFTkNFIGFuZAorICAgTE9XX0RJRkZFUkVOQ0UuICBPdmVyZmxvdyAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsCisgICBhbmQgaXMgbG9zdC4KKworICAgSWYgYW55IG9mIHRoZXNlIG1hY3JvcyBhcmUgbGVmdCB1bmRlZmluZWQgZm9yIGEgcGFydGljdWxhciBDUFUsCisgICBDIG1hY3JvcyBhcmUgdXNlZC4gICovCisKKyNpZiBkZWZpbmVkIChfX2FybV9fKQorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZHMJJTEsICU0LCAlNQkJCQkJXG5cCisJYWRjCSUwLCAlMiwgJTMiCQkJCQkJXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpIChzaCkpLAkJCQkJXAorCSAgICAgIj0mciIgKChVU0l0eXBlKSAoc2wpKQkJCQkJXAorCSAgIDogIiVyIiAoKFVTSXR5cGUpIChhaCkpLAkJCQkJXAorCSAgICAgInJJIiAoKFVTSXR5cGUpIChiaCkpLAkJCQkJXAorCSAgICAgIiVyIiAoKFVTSXR5cGUpIChhbCkpLAkJCQkJXAorCSAgICAgInJJIiAoKFVTSXR5cGUpIChibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YnMJJTEsICU0LCAlNQkJCQkJXG5cCisJc2JjCSUwLCAlMiwgJTMiCQkJCQkJXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpIChzaCkpLAkJCQkJXAorCSAgICAgIj0mciIgKChVU0l0eXBlKSAoc2wpKQkJCQkJXAorCSAgIDogInIiICgoVVNJdHlwZSkgKGFoKSksCQkJCQlcCisJICAgICAickkiICgoVVNJdHlwZSkgKGJoKSksCQkJCQlcCisJICAgICAiciIgKChVU0l0eXBlKSAoYWwpKSwJCQkJCVwKKwkgICAgICJySSIgKChVU0l0eXBlKSAoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAore3JlZ2lzdGVyIFVTSXR5cGUgX190MCwgX190MSwgX190MjsJCQkJCVwKKyAgX19hc21fXyAoIiVAIElubGluZWQgdW11bF9wcG1tCQkJCQlcblwKKwltb3YJJTIsICU1LCBsc3IgIzE2CQkJCQkJXG5cCisJbW92CSUwLCAlNiwgbHNyICMxNgkJCQkJCVxuXAorCWJpYwklMywgJTUsICUyLCBsc2wgIzE2CQkJCQlcblwKKwliaWMJJTQsICU2LCAlMCwgbHNsICMxNgkJCQkJXG5cCisJbXVsCSUxLCAlMywgJTQJCQkJCQlcblwKKwltdWwJJTQsICUyLCAlNAkJCQkJCVxuXAorCW11bAklMywgJTAsICUzCQkJCQkJXG5cCisJbXVsCSUwLCAlMiwgJTAJCQkJCQlcblwKKwlhZGRzCSUzLCAlNCwgJTMJCQkJCQlcblwKKwlhZGRjcwklMCwgJTAsICM2NTUzNgkJCQkJCVxuXAorCWFkZHMJJTEsICUxLCAlMywgbHNsICMxNgkJCQkJXG5cCisJYWRjCSUwLCAlMCwgJTMsIGxzciAjMTYiCQkJCQlcCisJICAgOiAiPSZyIiAoKFVTSXR5cGUpICh4aCkpLAkJCQkJXAorCSAgICAgIj1yIiAoKFVTSXR5cGUpICh4bCkpLAkJCQkJXAorCSAgICAgIj0mciIgKF9fdDApLCAiPSZyIiAoX190MSksICI9ciIgKF9fdDIpCQkJXAorCSAgIDogInIiICgoVVNJdHlwZSkgKGEpKSwJCQkJCVwKKwkgICAgICJyIiAoKFVTSXR5cGUpIChiKSkpO30KKyNkZWZpbmUgVU1VTF9USU1FIDIwCisjZGVmaW5lIFVESVZfVElNRSAxMDAKKyNlbmRpZiAvKiBfX2FybV9fICovCisKKyNkZWZpbmUgX191bXVsc2lkaTModSwgdikgXAorICAoe0RJdW5pb24gX193OwkJCQkJCQlcCisgICAgdW11bF9wcG1tIChfX3cucy5oaWdoLCBfX3cucy5sb3csIHUsIHYpOwkJCQlcCisgICAgX193LmxsOyB9KQorCisjZGVmaW5lIF9fdWRpdl9xcm5uZF9jKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19kMSwgX19kMCwgX19xMSwgX19xMDsJCQkJCVwKKyAgICBVU0l0eXBlIF9fcjEsIF9fcjAsIF9fbTsJCQkJCQlcCisgICAgX19kMSA9IF9fbGxfaGlnaHBhcnQgKGQpOwkJCQkJCVwKKyAgICBfX2QwID0gX19sbF9sb3dwYXJ0IChkKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19yMSA9IChuMSkgJSBfX2QxOwkJCQkJCQlcCisgICAgX19xMSA9IChuMSkgLyBfX2QxOwkJCQkJCQlcCisgICAgX19tID0gKFVTSXR5cGUpIF9fcTEgKiBfX2QwOwkJCQkJXAorICAgIF9fcjEgPSBfX3IxICogX19sbF9CIHwgX19sbF9oaWdocGFydCAobjApOwkJCQlcCisgICAgaWYgKF9fcjEgPCBfX20pCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19xMS0tLCBfX3IxICs9IChkKTsJCQkJCQlcCisJaWYgKF9fcjEgPj0gKGQpKSAvKiBpLmUuIHdlIGRpZG4ndCBnZXQgY2Fycnkgd2hlbiBhZGRpbmcgdG8gX19yMSAqL1wKKwkgIGlmIChfX3IxIDwgX19tKQkJCQkJCVwKKwkgICAgX19xMS0tLCBfX3IxICs9IChkKTsJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgX19yMSAtPSBfX207CQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBfX3IwID0gX19yMSAlIF9fZDE7CQkJCQkJCVwKKyAgICBfX3EwID0gX19yMSAvIF9fZDE7CQkJCQkJCVwKKyAgICBfX20gPSAoVVNJdHlwZSkgX19xMCAqIF9fZDA7CQkJCQlcCisgICAgX19yMCA9IF9fcjAgKiBfX2xsX0IgfCBfX2xsX2xvd3BhcnQgKG4wKTsJCQkJXAorICAgIGlmIChfX3IwIDwgX19tKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQkJXAorCWlmIChfX3IwID49IChkKSkJCQkJCQlcCisJICBpZiAoX19yMCA8IF9fbSkJCQkJCQlcCisJICAgIF9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIF9fcjAgLT0gX19tOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgKHEpID0gKFVTSXR5cGUpIF9fcTEgKiBfX2xsX0IgfCBfX3EwOwkJCQlcCisgICAgKHIpID0gX19yMDsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBVRElWX05FRURTX05PUk1BTElaQVRJT04gMQorI2RlZmluZSB1ZGl2X3Fybm5kIF9fdWRpdl9xcm5uZF9jCisKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX194ciA9ICh4KTsJCQkJCQkJXAorICAgIFVTSXR5cGUgX19hOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgaWYgKFNJX1RZUEVfU0laRSA8PSAzMikJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fYSA9IF9feHIgPCAoKFVTSXR5cGUpMTw8MipfX0JJVFM0KQkJCQlcCisJICA/IChfX3hyIDwgKChVU0l0eXBlKTE8PF9fQklUUzQpID8gMCA6IF9fQklUUzQpCQlcCisJICA6IChfX3hyIDwgKChVU0l0eXBlKTE8PDMqX19CSVRTNCkgPyAgMipfX0JJVFM0IDogMypfX0JJVFM0KTsJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWZvciAoX19hID0gU0lfVFlQRV9TSVpFIC0gODsgX19hID4gMDsgX19hIC09IDgpCQkJXAorCSAgaWYgKCgoX194ciA+PiBfX2EpICYgMHhmZikgIT0gMCkJCQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICAoY291bnQpID0gU0lfVFlQRV9TSVpFIC0gKF9fY2x6X3RhYltfX3hyID4+IF9fYV0gKyBfX2EpOwkJXAorICB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2xzaHJkaTMuYyBiL2FyY2gvYXJtL2xpYi9sc2hyZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NmYxYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9sc2hyZGkzLmMKQEAgLTAsMCArMSw2MSBAQAorLyogTW9yZSBzdWJyb3V0aW5lcyBuZWVkZWQgYnkgR0NDIG91dHB1dCBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAqLworLyogQ29tcGlsZSB0aGlzIG9uZSB3aXRoIGdjYy4gICovCisvKiBDb3B5cmlnaHQgKEMpIDE5ODksIDkyLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCisKK0dOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIG90aGVyIGZpbGVzLAorICAgc29tZSBvZiB3aGljaCBhcmUgY29tcGlsZWQgd2l0aCBHQ0MsIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKKyAgIHRoaXMgbGlicmFyeSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlCisgICB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAgIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKKyAgIHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKy8qIHN1cHBvcnQgZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBrZXJuZWwuIGJhc2VkIG9uIGNvZGUgZnJvbSBnY2MtMi45NS4zICovCisvKiBJIE1vbHRvbiAgICAgMjkvMDcvMDEgKi8KKworI2luY2x1ZGUgImdjY2xpYi5oIgorCitESXR5cGUKK19fbHNocmRpMyAoREl0eXBlIHUsIHdvcmRfdHlwZSBiKQoreworICBESXVuaW9uIHc7CisgIHdvcmRfdHlwZSBibTsKKyAgREl1bmlvbiB1dTsKKworICBpZiAoYiA9PSAwKQorICAgIHJldHVybiB1OworCisgIHV1LmxsID0gdTsKKworICBibSA9IChzaXplb2YgKFNJdHlwZSkgKiBCSVRTX1BFUl9VTklUKSAtIGI7CisgIGlmIChibSA8PSAwKQorICAgIHsKKyAgICAgIHcucy5oaWdoID0gMDsKKyAgICAgIHcucy5sb3cgPSAoVVNJdHlwZSl1dS5zLmhpZ2ggPj4gLWJtOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFVTSXR5cGUgY2FycmllcyA9IChVU0l0eXBlKXV1LnMuaGlnaCA8PCBibTsKKyAgICAgIHcucy5oaWdoID0gKFVTSXR5cGUpdXUucy5oaWdoID4+IGI7CisgICAgICB3LnMubG93ID0gKChVU0l0eXBlKXV1LnMubG93ID4+IGIpIHwgY2FycmllczsKKyAgICB9CisKKyAgcmV0dXJuIHcubGw7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9tZW1jaHIuUyBiL2FyY2gvYXJtL2xpYi9tZW1jaHIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM0ZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL21lbWNoci5TCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL21lbWNoci5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFTTSBvcHRpbWlzZWQgc3RyaW5nIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworCS50ZXh0CisJLmFsaWduCTUKK0VOVFJZKG1lbWNocikKKzE6CXN1YnMJcjIsIHIyLCAjMQorCWJtaQkyZgorCWxkcmIJcjMsIFtyMF0sICMxCisJdGVxCXIzLCByMQorCWJuZQkxYgorCXN1YglyMCwgcjAsICMxCisyOgltb3ZuZQlyMCwgIzAKKwlSRVRJTlNUUihtb3YscGMsbHIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvbWVtY3B5LlMgYi9hcmNoL2FybS9saWIvbWVtY3B5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9tZW1jcHkuUwpAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvbWVtY3B5LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQVNNIG9wdGltaXNlZCBzdHJpbmcgZnVuY3Rpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJCS50ZXh0CisKKyNkZWZpbmUgRU5URVIJXAorCQltb3YJaXAsc3AJO1wKKwkJc3RtZmQJc3AhLHtyMCxyNC1yOSxmcCxpcCxscixwY30JO1wKKwkJc3ViCWZwLGlwLCM0CisKKyNkZWZpbmUgRVhJVAlcCisJCUxPQURSRUdTKGVhLCBmcCwge3IwLCByNCAtIHI5LCBmcCwgc3AsIHBjfSkKKworI2RlZmluZSBFWElURVEJXAorCQlMT0FEUkVHUyhlcWVhLCBmcCwge3IwLCByNCAtIHI5LCBmcCwgc3AsIHBjfSkKKworLyoKKyAqIFByb3RvdHlwZTogdm9pZCBtZW1jcHkodm9pZCAqdG8sY29uc3Qgdm9pZCAqZnJvbSx1bnNpZ25lZCBsb25nIG4pOworICovCitFTlRSWShtZW1jcHkpCitFTlRSWShtZW1tb3ZlKQorCQlFTlRFUgorCQljbXAJcjEsIHIwCisJCWJjYwkyM2YKKwkJc3VicwlyMiwgcjIsICM0CisJCWJsdAk2ZgorCVBMRCgJcGxkCVtyMSwgIzBdCQkpCisJCWFuZHMJaXAsIHIwLCAjMworCQlibmUJN2YKKwkJYW5kcwlpcCwgcjEsICMzCisJCWJuZQk4ZgorCisxOgkJc3VicwlyMiwgcjIsICM4CisJCWJsdAk1ZgorCQlzdWJzCXIyLCByMiwgIzIwCisJCWJsdAk0ZgorCVBMRCgJcGxkCVtyMSwgIzI4XQkJKQorCVBMRCgJc3VicwlyMiwgcjIsICM2NAkJKQorCVBMRCgJYmx0CTNmCQkJKQorMjoJUExEKAlwbGQJW3IxLCAjNjBdCQkpCisJUExEKAlwbGQJW3IxLCAjOTJdCQkpCisJCWxkbWlhCXIxISwge3IzIC0gcjksIGlwfQorCQlzdWJzCXIyLCByMiwgIzMyCisJCXN0bWdlaWEJcjAhLCB7cjMgLSByOSwgaXB9CisJCWxkbWdlaWEJcjEhLCB7cjMgLSByOSwgaXB9CisJCXN1YmdlcwlyMiwgcjIsICMzMgorCQlzdG1pYQlyMCEsIHtyMyAtIHI5LCBpcH0KKwkJYmdlCTJiCiszOglQTEQoCWxkbWlhCXIxISwge3IzIC0gcjksIGlwfQkpCisJUExEKAlhZGRzCXIyLCByMiwgIzMyCQkpCisJUExEKAlzdG1nZWlhCXIwISwge3IzIC0gcjksIGlwfQkpCisJUExEKAlsZG1nZWlhCXIxISwge3IzIC0gcjksIGlwfQkpCisJUExEKAlzdWJnZXMJcjIsIHIyLCAjMzIJCSkKKwlQTEQoCXN0bWlhCXIwISwge3IzIC0gcjksIGlwfQkpCis0OgkJY21uCXIyLCAjMTYKKwkJbGRtZ2VpYQlyMSEsIHtyMyAtIHI2fQorCQlzdWJnZQlyMiwgcjIsICMxNgorCQlzdG1nZWlhCXIwISwge3IzIC0gcjZ9CisJCWFkZHMJcjIsIHIyLCAjMjAKKwkJbGRtZ2VpYQlyMSEsIHtyMyAtIHI1fQorCQlzdWJnZQlyMiwgcjIsICMxMgorCQlzdG1nZWlhCXIwISwge3IzIC0gcjV9Cis1OgkJYWRkcwlyMiwgcjIsICM4CisJCWJsdAk2ZgorCQlzdWJzCXIyLCByMiwgIzQKKwkJbGRybHQJcjMsIFtyMV0sICM0CisJCWxkbWdlaWEJcjEhLCB7cjQsIHI1fQorCQlzdWJnZQlyMiwgcjIsICM0CisJCXN0cmx0CXIzLCBbcjBdLCAjNAorCQlzdG1nZWlhCXIwISwge3I0LCByNX0KKworNjoJCWFkZHMJcjIsIHIyLCAjNAorCQlFWElURVEKKwkJY21wCXIyLCAjMgorCQlsZHJiCXIzLCBbcjFdLCAjMQorCQlsZHJnZWIJcjQsIFtyMV0sICMxCisJCWxkcmd0YglyNSwgW3IxXSwgIzEKKwkJc3RyYglyMywgW3IwXSwgIzEKKwkJc3RyZ2ViCXI0LCBbcjBdLCAjMQorCQlzdHJndGIJcjUsIFtyMF0sICMxCisJCUVYSVQKKworNzoJCXJzYglpcCwgaXAsICM0CisJCWNtcAlpcCwgIzIKKwkJbGRyYglyMywgW3IxXSwgIzEKKwkJbGRyZ2ViCXI0LCBbcjFdLCAjMQorCQlsZHJndGIJcjUsIFtyMV0sICMxCisJCXN0cmIJcjMsIFtyMF0sICMxCisJCXN0cmdlYglyNCwgW3IwXSwgIzEKKwkJc3RyZ3RiCXI1LCBbcjBdLCAjMQorCQlzdWJzCXIyLCByMiwgaXAKKwkJYmx0CTZiCisJCWFuZHMJaXAsIHIxLCAjMworCQliZXEJMWIKKworODoJCWJpYwlyMSwgcjEsICMzCisJCWxkcglyNywgW3IxXSwgIzQKKwkJY21wCWlwLCAjMgorCQliZ3QJMThmCisJCWJlcQkxM2YKKwkJY21wCXIyLCAjMTIKKwkJYmx0CTExZgorCVBMRCgJcGxkCVtyMSwgIzEyXQkJKQorCQlzdWIJcjIsIHIyLCAjMTIKKwlQTEQoCXN1YnMJcjIsIHIyLCAjMzIJCSkKKwlQTEQoCWJsdAkxMGYJCQkpCisJUExEKAlwbGQJW3IxLCAjMjhdCQkpCis5OglQTEQoCXBsZAlbcjEsICM0NF0JCSkKKzEwOgkJbW92CXIzLCByNywgcHVsbCAjOAorCQlsZG1pYQlyMSEsIHtyNCAtIHI3fQorCQlzdWJzCXIyLCByMiwgIzE2CisJCW9ycglyMywgcjMsIHI0LCBwdXNoICMyNAorCQltb3YJcjQsIHI0LCBwdWxsICM4CisJCW9ycglyNCwgcjQsIHI1LCBwdXNoICMyNAorCQltb3YJcjUsIHI1LCBwdWxsICM4CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICMyNAorCQltb3YJcjYsIHI2LCBwdWxsICM4CisJCW9ycglyNiwgcjYsIHI3LCBwdXNoICMyNAorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQorCQliZ2UJOWIKKwlQTEQoCWNtbglyMiwgIzMyCQkJKQorCVBMRCgJYmdlCTEwYgkJCSkKKwlQTEQoCWFkZAlyMiwgcjIsICMzMgkJKQorCQlhZGRzCXIyLCByMiwgIzEyCisJCWJsdAkxMmYKKzExOgkJbW92CXIzLCByNywgcHVsbCAjOAorCQlsZHIJcjcsIFtyMV0sICM0CisJCXN1YnMJcjIsIHIyLCAjNAorCQlvcnIJcjMsIHIzLCByNywgcHVzaCAjMjQKKwkJc3RyCXIzLCBbcjBdLCAjNAorCQliZ2UJMTFiCisxMjoJCXN1YglyMSwgcjEsICMzCisJCWIJNmIKKworMTM6CQljbXAJcjIsICMxMgorCQlibHQJMTZmCisJUExEKAlwbGQJW3IxLCAjMTJdCQkpCisJCXN1YglyMiwgcjIsICMxMgorCVBMRCgJc3VicwlyMiwgcjIsICMzMgkJKQorCVBMRCgJYmx0CTE1ZgkJCSkKKwlQTEQoCXBsZAlbcjEsICMyOF0JCSkKKzE0OglQTEQoCXBsZAlbcjEsICM0NF0JCSkKKzE1OgkJbW92CXIzLCByNywgcHVsbCAjMTYKKwkJbGRtaWEJcjEhLCB7cjQgLSByN30KKwkJc3VicwlyMiwgcjIsICMxNgorCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjMTYKKwkJbW92CXI0LCByNCwgcHVsbCAjMTYKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzE2CisJCW1vdglyNSwgcjUsIHB1bGwgIzE2CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICMxNgorCQltb3YJcjYsIHI2LCBwdWxsICMxNgorCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjMTYKKwkJc3RtaWEJcjAhLCB7cjMgLSByNn0KKwkJYmdlCTE0YgorCVBMRCgJY21uCXIyLCAjMzIJCQkpCisJUExEKAliZ2UJMTViCQkJKQorCVBMRCgJYWRkCXIyLCByMiwgIzMyCQkpCisJCWFkZHMJcjIsIHIyLCAjMTIKKwkJYmx0CTE3ZgorMTY6CQltb3YJcjMsIHI3LCBwdWxsICMxNgorCQlsZHIJcjcsIFtyMV0sICM0CisJCXN1YnMJcjIsIHIyLCAjNAorCQlvcnIJcjMsIHIzLCByNywgcHVzaCAjMTYKKwkJc3RyCXIzLCBbcjBdLCAjNAorCQliZ2UJMTZiCisxNzoJCXN1YglyMSwgcjEsICMyCisJCWIJNmIKKworMTg6CQljbXAJcjIsICMxMgorCQlibHQJMjFmCisJUExEKAlwbGQJW3IxLCAjMTJdCQkpCisJCXN1YglyMiwgcjIsICMxMgorCVBMRCgJc3VicwlyMiwgcjIsICMzMgkJKQorCVBMRCgJYmx0CTIwZgkJCSkKKwlQTEQoCXBsZAlbcjEsICMyOF0JCSkKKzE5OglQTEQoCXBsZAlbcjEsICM0NF0JCSkKKzIwOgkJbW92CXIzLCByNywgcHVsbCAjMjQKKwkJbGRtaWEJcjEhLCB7cjQgLSByN30KKwkJc3VicwlyMiwgcjIsICMxNgorCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjOAorCQltb3YJcjQsIHI0LCBwdWxsICMyNAorCQlvcnIJcjQsIHI0LCByNSwgcHVzaCAjOAorCQltb3YJcjUsIHI1LCBwdWxsICMyNAorCQlvcnIJcjUsIHI1LCByNiwgcHVzaCAjOAorCQltb3YJcjYsIHI2LCBwdWxsICMyNAorCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjOAorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQorCQliZ2UJMTliCisJUExEKAljbW4JcjIsICMzMgkJCSkKKwlQTEQoCWJnZQkyMGIJCQkpCisJUExEKAlhZGQJcjIsIHIyLCAjMzIJCSkKKwkJYWRkcwlyMiwgcjIsICMxMgorCQlibHQJMjJmCisyMToJCW1vdglyMywgcjcsIHB1bGwgIzI0CisJCWxkcglyNywgW3IxXSwgIzQKKwkJc3VicwlyMiwgcjIsICM0CisJCW9ycglyMywgcjMsIHI3LCBwdXNoICM4CisJCXN0cglyMywgW3IwXSwgIzQKKwkJYmdlCTIxYgorMjI6CQlzdWIJcjEsIHIxLCAjMQorCQliCTZiCisKKworMjM6CQlhZGQJcjEsIHIxLCByMgorCQlhZGQJcjAsIHIwLCByMgorCQlzdWJzCXIyLCByMiwgIzQKKwkJYmx0CTI5ZgorCVBMRCgJcGxkCVtyMSwgIy00XQkJKQorCQlhbmRzCWlwLCByMCwgIzMKKwkJYm5lCTMwZgorCQlhbmRzCWlwLCByMSwgIzMKKwkJYm5lCTMxZgorCisyNDoJCXN1YnMJcjIsIHIyLCAjOAorCQlibHQJMjhmCisJCXN1YnMJcjIsIHIyLCAjMjAKKwkJYmx0CTI3ZgorCVBMRCgJcGxkCVtyMSwgIy0zMl0JCSkKKwlQTEQoCXN1YnMJcjIsIHIyLCAjNjQJCSkKKwlQTEQoCWJsdAkyNmYJCQkpCisyNToJUExEKAlwbGQJW3IxLCAjLTY0XQkJKQorCVBMRCgJcGxkCVtyMSwgIy05Nl0JCSkKKwkJbGRtZGIJcjEhLCB7cjMgLSByOSwgaXB9CisJCXN1YnMJcjIsIHIyLCAjMzIKKwkJc3RtZ2VkYglyMCEsIHtyMyAtIHI5LCBpcH0KKwkJbGRtZ2VkYglyMSEsIHtyMyAtIHI5LCBpcH0KKwkJc3ViZ2VzCXIyLCByMiwgIzMyCisJCXN0bWRiCXIwISwge3IzIC0gcjksIGlwfQorCQliZ2UJMjViCisyNjoJUExEKAlsZG1kYglyMSEsIHtyMyAtIHI5LCBpcH0JKQorCVBMRCgJYWRkcwlyMiwgcjIsICMzMgkJKQorCVBMRCgJc3RtZ2VkYglyMCEsIHtyMyAtIHI5LCBpcH0JKQorCVBMRCgJbGRtZ2VkYglyMSEsIHtyMyAtIHI5LCBpcH0JKQorCVBMRCgJc3ViZ2VzCXIyLCByMiwgIzMyCQkpCisJUExEKAlzdG1kYglyMCEsIHtyMyAtIHI5LCBpcH0JKQorMjc6CQljbW4JcjIsICMxNgorCQlsZG1nZWRiCXIxISwge3IzIC0gcjZ9CisJCXN1YmdlCXIyLCByMiwgIzE2CisJCXN0bWdlZGIJcjAhLCB7cjMgLSByNn0KKwkJYWRkcwlyMiwgcjIsICMyMAorCQlsZG1nZWRiCXIxISwge3IzIC0gcjV9CisJCXN1YmdlCXIyLCByMiwgIzEyCisJCXN0bWdlZGIJcjAhLCB7cjMgLSByNX0KKzI4OgkJYWRkcwlyMiwgcjIsICM4CisJCWJsdAkyOWYKKwkJc3VicwlyMiwgcjIsICM0CisJCWxkcmx0CXIzLCBbcjEsICMtNF0hCisJCWxkbWdlZGIJcjEhLCB7cjQsIHI1fQorCQlzdWJnZQlyMiwgcjIsICM0CisJCXN0cmx0CXIzLCBbcjAsICMtNF0hCisJCXN0bWdlZGIJcjAhLCB7cjQsIHI1fQorCisyOToJCWFkZHMJcjIsIHIyLCAjNAorCQlFWElURVEKKwkJY21wCXIyLCAjMgorCQlsZHJiCXIzLCBbcjEsICMtMV0hCisJCWxkcmdlYglyNCwgW3IxLCAjLTFdIQorCQlsZHJndGIJcjUsIFtyMSwgIy0xXSEKKwkJc3RyYglyMywgW3IwLCAjLTFdIQorCQlzdHJnZWIJcjQsIFtyMCwgIy0xXSEKKwkJc3RyZ3RiCXI1LCBbcjAsICMtMV0hCisJCUVYSVQKKworMzA6CQljbXAJaXAsICMyCisJCWxkcmIJcjMsIFtyMSwgIy0xXSEKKwkJbGRyZ2ViCXI0LCBbcjEsICMtMV0hCisJCWxkcmd0YglyNSwgW3IxLCAjLTFdIQorCQlzdHJiCXIzLCBbcjAsICMtMV0hCisJCXN0cmdlYglyNCwgW3IwLCAjLTFdIQorCQlzdHJndGIJcjUsIFtyMCwgIy0xXSEKKwkJc3VicwlyMiwgcjIsIGlwCisJCWJsdAkyOWIKKwkJYW5kcwlpcCwgcjEsICMzCisJCWJlcQkyNGIKKworMzE6CQliaWMJcjEsIHIxLCAjMworCQlsZHIJcjMsIFtyMV0sICMwCisJCWNtcAlpcCwgIzIKKwkJYmx0CTQxZgorCQliZXEJMzZmCisJCWNtcAlyMiwgIzEyCisJCWJsdAkzNGYKKwlQTEQoCXBsZAlbcjEsICMtMTZdCQkpCisJCXN1YglyMiwgcjIsICMxMgorCVBMRCgJc3VicwlyMiwgcjIsICMzMgkJKQorCVBMRCgJYmx0CTMzZgkJCSkKKwlQTEQoCXBsZAlbcjEsICMtMzJdCQkpCiszMjoJUExEKAlwbGQJW3IxLCAjLTQ4XQkJKQorMzM6CQltb3YJcjcsIHIzLCBwdXNoICM4CisJCWxkbWRiCXIxISwge3IzLCByNCwgcjUsIHI2fQorCQlzdWJzCXIyLCByMiwgIzE2CisJCW9ycglyNywgcjcsIHI2LCBwdWxsICMyNAorCQltb3YJcjYsIHI2LCBwdXNoICM4CisJCW9ycglyNiwgcjYsIHI1LCBwdWxsICMyNAorCQltb3YJcjUsIHI1LCBwdXNoICM4CisJCW9ycglyNSwgcjUsIHI0LCBwdWxsICMyNAorCQltb3YJcjQsIHI0LCBwdXNoICM4CisJCW9ycglyNCwgcjQsIHIzLCBwdWxsICMyNAorCQlzdG1kYglyMCEsIHtyNCwgcjUsIHI2LCByN30KKwkJYmdlCTMyYgorCVBMRCgJY21uCXIyLCAjMzIJCQkpCisJUExEKAliZ2UJMzNiCQkJKQorCVBMRCgJYWRkCXIyLCByMiwgIzMyCQkpCisJCWFkZHMJcjIsIHIyLCAjMTIKKwkJYmx0CTM1ZgorMzQ6CQltb3YJaXAsIHIzLCBwdXNoICM4CisJCWxkcglyMywgW3IxLCAjLTRdIQorCQlzdWJzCXIyLCByMiwgIzQKKwkJb3JyCWlwLCBpcCwgcjMsIHB1bGwgIzI0CisJCXN0cglpcCwgW3IwLCAjLTRdIQorCQliZ2UJMzRiCiszNToJCWFkZAlyMSwgcjEsICMzCisJCWIJMjliCisKKzM2OgkJY21wCXIyLCAjMTIKKwkJYmx0CTM5ZgorCVBMRCgJcGxkCVtyMSwgIy0xNl0JCSkKKwkJc3ViCXIyLCByMiwgIzEyCisJUExEKAlzdWJzCXIyLCByMiwgIzMyCQkpCisJUExEKAlibHQJMzhmCQkJKQorCVBMRCgJcGxkCVtyMSwgIy0zMl0JCSkKKzM3OglQTEQoCXBsZAlbcjEsICMtNDhdCQkpCiszODoJCW1vdglyNywgcjMsIHB1c2ggIzE2CisJCWxkbWRiCXIxISwge3IzLCByNCwgcjUsIHI2fQorCQlzdWJzCXIyLCByMiwgIzE2CisJCW9ycglyNywgcjcsIHI2LCBwdWxsICMxNgorCQltb3YJcjYsIHI2LCBwdXNoICMxNgorCQlvcnIJcjYsIHI2LCByNSwgcHVsbCAjMTYKKwkJbW92CXI1LCByNSwgcHVzaCAjMTYKKwkJb3JyCXI1LCByNSwgcjQsIHB1bGwgIzE2CisJCW1vdglyNCwgcjQsIHB1c2ggIzE2CisJCW9ycglyNCwgcjQsIHIzLCBwdWxsICMxNgorCQlzdG1kYglyMCEsIHtyNCwgcjUsIHI2LCByN30KKwkJYmdlCTM3YgorCVBMRCgJY21uCXIyLCAjMzIJCQkpCisJUExEKAliZ2UJMzhiCQkJKQorCVBMRCgJYWRkCXIyLCByMiwgIzMyCQkpCisJCWFkZHMJcjIsIHIyLCAjMTIKKwkJYmx0CTQwZgorMzk6CQltb3YJaXAsIHIzLCBwdXNoICMxNgorCQlsZHIJcjMsIFtyMSwgIy00XSEKKwkJc3VicwlyMiwgcjIsICM0CisJCW9ycglpcCwgaXAsIHIzLCBwdWxsICMxNgorCQlzdHIJaXAsIFtyMCwgIy00XSEKKwkJYmdlCTM5YgorNDA6CQlhZGQJcjEsIHIxLCAjMgorCQliCTI5YgorCis0MToJCWNtcAlyMiwgIzEyCisJCWJsdAk0NGYKKwlQTEQoCXBsZAlbcjEsICMtMTZdCQkpCisJCXN1YglyMiwgcjIsICMxMgorCVBMRCgJc3VicwlyMiwgcjIsICMzMgkJKQorCVBMRCgJYmx0CTQzZgkJCSkKKwlQTEQoCXBsZAlbcjEsICMtMzJdCQkpCis0MjoJUExEKAlwbGQJW3IxLCAjLTQ4XQkJKQorNDM6CQltb3YJcjcsIHIzLCBwdXNoICMyNAorCQlsZG1kYglyMSEsIHtyMywgcjQsIHI1LCByNn0KKwkJc3VicwlyMiwgcjIsICMxNgorCQlvcnIJcjcsIHI3LCByNiwgcHVsbCAjOAorCQltb3YJcjYsIHI2LCBwdXNoICMyNAorCQlvcnIJcjYsIHI2LCByNSwgcHVsbCAjOAorCQltb3YJcjUsIHI1LCBwdXNoICMyNAorCQlvcnIJcjUsIHI1LCByNCwgcHVsbCAjOAorCQltb3YJcjQsIHI0LCBwdXNoICMyNAorCQlvcnIJcjQsIHI0LCByMywgcHVsbCAjOAorCQlzdG1kYglyMCEsIHtyNCwgcjUsIHI2LCByN30KKwkJYmdlCTQyYgorCVBMRCgJY21uCXIyLCAjMzIJCQkpCisJUExEKAliZ2UJNDNiCQkJKQorCVBMRCgJYWRkCXIyLCByMiwgIzMyCQkpCisJCWFkZHMJcjIsIHIyLCAjMTIKKwkJYmx0CTQ1ZgorNDQ6CQltb3YJaXAsIHIzLCBwdXNoICMyNAorCQlsZHIJcjMsIFtyMSwgIy00XSEKKwkJc3VicwlyMiwgcjIsICM0CisJCW9ycglpcCwgaXAsIHIzLCBwdWxsICM4CisJCXN0cglpcCwgW3IwLCAjLTRdIQorCQliZ2UJNDRiCis0NToJCWFkZAlyMSwgcjEsICMxCisJCWIJMjliCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9tZW1zZXQuUyBiL2FyY2gvYXJtL2xpYi9tZW1zZXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTc5NWY1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9tZW1zZXQuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9tZW1zZXQuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBU00gb3B0aW1pc2VkIHN0cmluZyBmdW5jdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKKwkudGV4dAorCS5hbGlnbgk1CisJLndvcmQJMAorCisxOglzdWJzCXIyLCByMiwgIzQJCUAgMSBkbyB3ZSBoYXZlIGVub3VnaAorCWJsdAk1ZgkJCUAgMSBieXRlcyB0byBhbGlnbiB3aXRoPworCWNtcAlyMywgIzIJCQlAIDEKKwlzdHJsdGIJcjEsIFtyMF0sICMxCQlAIDEKKwlzdHJsZWIJcjEsIFtyMF0sICMxCQlAIDEKKwlzdHJiCXIxLCBbcjBdLCAjMQkJQCAxCisJYWRkCXIyLCByMiwgcjMJCUAgMSAocjIgPSByMiAtICg0IC0gcjMpKQorLyoKKyAqIFRoZSBwb2ludGVyIGlzIG5vdyBhbGlnbmVkIGFuZCB0aGUgbGVuZ3RoIGlzIGFkanVzdGVkLiAgVHJ5IGRvaW5nIHRoZQorICogbWVtemVybyBhZ2Fpbi4KKyAqLworCitFTlRSWShtZW1zZXQpCisJYW5kcwlyMywgcjAsICMzCQlAIDEgdW5hbGlnbmVkPworCWJuZQkxYgkJCUAgMQorLyoKKyAqIHdlIGtub3cgdGhhdCB0aGUgcG9pbnRlciBpbiByMCBpcyBhbGlnbmVkIHRvIGEgd29yZCBib3VuZGFyeS4KKyAqLworCW9ycglyMSwgcjEsIHIxLCBsc2wgIzgKKwlvcnIJcjEsIHIxLCByMSwgbHNsICMxNgorCW1vdglyMywgcjEKKwljbXAJcjIsICMxNgorCWJsdAk0ZgorLyoKKyAqIFdlIG5lZWQgYW4gZXh0cmEgcmVnaXN0ZXIgZm9yIHRoaXMgbG9vcCAtIHNhdmUgdGhlIHJldHVybiBhZGRyZXNzIGFuZAorICogdXNlIHRoZSBMUgorICovCisJc3RyCWxyLCBbc3AsICMtNF0hCisJbW92CWlwLCByMQorCW1vdglsciwgcjEKKworMjoJc3VicwlyMiwgcjIsICM2NAorCXN0bWdlaWEJcjAhLCB7cjEsIHIzLCBpcCwgbHJ9CUAgNjQgYnl0ZXMgYXQgYSB0aW1lLgorCXN0bWdlaWEJcjAhLCB7cjEsIHIzLCBpcCwgbHJ9CisJc3RtZ2VpYQlyMCEsIHtyMSwgcjMsIGlwLCBscn0KKwlzdG1nZWlhCXIwISwge3IxLCByMywgaXAsIGxyfQorCWJndAkyYgorCUxPQURSRUdTKGVxZmQsIHNwISwge3BjfSkJQCBOb3cgPDY0IGJ5dGVzIHRvIGdvLgorLyoKKyAqIE5vIG5lZWQgdG8gY29ycmVjdCB0aGUgY291bnQ7IHdlJ3JlIG9ubHkgdGVzdGluZyBiaXRzIGZyb20gbm93IG9uCisgKi8KKwl0c3QJcjIsICMzMgorCXN0bW5laWEJcjAhLCB7cjEsIHIzLCBpcCwgbHJ9CisJc3RtbmVpYQlyMCEsIHtyMSwgcjMsIGlwLCBscn0KKwl0c3QJcjIsICMxNgorCXN0bW5laWEJcjAhLCB7cjEsIHIzLCBpcCwgbHJ9CisJbGRyCWxyLCBbc3BdLCAjNAorCis0Ogl0c3QJcjIsICM4CisJc3RtbmVpYQlyMCEsIHtyMSwgcjN9CisJdHN0CXIyLCAjNAorCXN0cm5lCXIxLCBbcjBdLCAjNAorLyoKKyAqIFdoZW4gd2UgZ2V0IGhlcmUsIHdlJ3ZlIGdvdCBsZXNzIHRoYW4gNCBieXRlcyB0byB6ZXJvLiAgV2UKKyAqIG1heSBoYXZlIGFuIHVuYWxpZ25lZCBwb2ludGVyIGFzIHdlbGwuCisgKi8KKzU6CXRzdAlyMiwgIzIKKwlzdHJuZWIJcjEsIFtyMF0sICMxCisJc3RybmViCXIxLCBbcjBdLCAjMQorCXRzdAlyMiwgIzEKKwlzdHJuZWIJcjEsIFtyMF0sICMxCisJUkVUSU5TVFIobW92LHBjLGxyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL21lbXplcm8uUyBiL2FyY2gvYXJtL2xpYi9tZW16ZXJvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjY2M2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9tZW16ZXJvLlMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvbWVtemVyby5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJLnRleHQKKwkuYWxpZ24JNQorCS53b3JkCTAKKy8qCisgKiBBbGlnbiB0aGUgcG9pbnRlciBpbiByMC4gIHIzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZSBhcmUKKyAqIG1pcy1hbGlnbmVkIGJ5LCBhbmQgcjEgaXMgdGhlIG51bWJlciBvZiBieXRlcy4gIElmIHIxIDwgNCwgdGhlbiB3ZQorICogZG9uJ3QgYm90aGVyOyB3ZSB1c2UgYnl0ZSBzdG9yZXMgaW5zdGVhZC4KKyAqLworMToJc3VicwlyMSwgcjEsICM0CQlAIDEgZG8gd2UgaGF2ZSBlbm91Z2gKKwlibHQJNWYJCQlAIDEgYnl0ZXMgdG8gYWxpZ24gd2l0aD8KKwljbXAJcjMsICMyCQkJQCAxCisJc3RybHRiCXIyLCBbcjBdLCAjMQkJQCAxCisJc3RybGViCXIyLCBbcjBdLCAjMQkJQCAxCisJc3RyYglyMiwgW3IwXSwgIzEJCUAgMQorCWFkZAlyMSwgcjEsIHIzCQlAIDEgKHIxID0gcjEgLSAoNCAtIHIzKSkKKy8qCisgKiBUaGUgcG9pbnRlciBpcyBub3cgYWxpZ25lZCBhbmQgdGhlIGxlbmd0aCBpcyBhZGp1c3RlZC4gIFRyeSBkb2luZyB0aGUKKyAqIG1lbXplcm8gYWdhaW4uCisgKi8KKworRU5UUlkoX19tZW16ZXJvKQorCW1vdglyMiwgIzAJCQlAIDEKKwlhbmRzCXIzLCByMCwgIzMJCUAgMSB1bmFsaWduZWQ/CisJYm5lCTFiCQkJQCAxCisvKgorICogcjMgPSAwLCBhbmQgd2Uga25vdyB0aGF0IHRoZSBwb2ludGVyIGluIHIwIGlzIGFsaWduZWQgdG8gYSB3b3JkIGJvdW5kYXJ5LgorICovCisJY21wCXIxLCAjMTYJCQlAIDEgd2UgY2FuIHNraXAgdGhpcyBjaHVuayBpZiB3ZQorCWJsdAk0ZgkJCUAgMSBoYXZlIDwgMTYgYnl0ZXMKKy8qCisgKiBXZSBuZWVkIGFuIGV4dHJhIHJlZ2lzdGVyIGZvciB0aGlzIGxvb3AgLSBzYXZlIHRoZSByZXR1cm4gYWRkcmVzcyBhbmQKKyAqIHVzZSB0aGUgTFIKKyAqLworCXN0cglsciwgW3NwLCAjLTRdIQkJQCAxCisJbW92CWlwLCByMgkJCUAgMQorCW1vdglsciwgcjIJCQlAIDEKKworMzoJc3VicwlyMSwgcjEsICM2NAkJQCAxIHdyaXRlIDMyIGJ5dGVzIG91dCBwZXIgbG9vcAorCXN0bWdlaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CUAgNAorCXN0bWdlaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CUAgNAorCXN0bWdlaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CUAgNAorCXN0bWdlaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CUAgNAorCWJndAkzYgkJCUAgMQorCUxPQURSRUdTKGVxZmQsIHNwISwge3BjfSkJQCAxLzIgcXVpY2sgZXhpdAorLyoKKyAqIE5vIG5lZWQgdG8gY29ycmVjdCB0aGUgY291bnQ7IHdlJ3JlIG9ubHkgdGVzdGluZyBiaXRzIGZyb20gbm93IG9uCisgKi8KKwl0c3QJcjEsICMzMgkJCUAgMQorCXN0bW5laWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CUAgNAorCXN0bW5laWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CUAgNAorCXRzdAlyMSwgIzE2CQkJQCAxIDE2IGJ5dGVzIG9yIG1vcmU/CisJc3RtbmVpYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JQCA0CisJbGRyCWxyLCBbc3BdLCAjNAkJQCAxCisKKzQ6CXRzdAlyMSwgIzgJCQlAIDEgOCBieXRlcyBvciBtb3JlPworCXN0bW5laWEJcjAhLCB7cjIsIHIzfQkJQCAyCisJdHN0CXIxLCAjNAkJCUAgMSA0IGJ5dGVzIG9yIG1vcmU/CisJc3RybmUJcjIsIFtyMF0sICM0CQlAIDEKKy8qCisgKiBXaGVuIHdlIGdldCBoZXJlLCB3ZSd2ZSBnb3QgbGVzcyB0aGFuIDQgYnl0ZXMgdG8gemVyby4gIFdlCisgKiBtYXkgaGF2ZSBhbiB1bmFsaWduZWQgcG9pbnRlciBhcyB3ZWxsLgorICovCis1Ogl0c3QJcjEsICMyCQkJQCAxIDIgYnl0ZXMgb3IgbW9yZT8KKwlzdHJuZWIJcjIsIFtyMF0sICMxCQlAIDEKKwlzdHJuZWIJcjIsIFtyMF0sICMxCQlAIDEKKwl0c3QJcjEsICMxCQkJQCAxIGEgYnl0ZSBsZWZ0IG92ZXIKKwlzdHJuZWIJcjIsIFtyMF0sICMxCQlAIDEKKwlSRVRJTlNUUihtb3YscGMsbHIpCQlAIDEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9tdWxkaTMuYyBiL2FyY2gvYXJtL2xpYi9tdWxkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ2MTFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL211bGRpMy5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIE1vcmUgc3Vicm91dGluZXMgbmVlZGVkIGJ5IEdDQyBvdXRwdXQgY29kZSBvbiBzb21lIG1hY2hpbmVzLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTg5LCA5Mi05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgorCitHTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBvdGhlciBmaWxlcywKKyAgIHNvbWUgb2Ygd2hpY2ggYXJlIGNvbXBpbGVkIHdpdGggR0NDLCB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsCisgICB0aGlzIGxpYnJhcnkgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZQorICAgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5CisgICB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisvKiBzdXBwb3J0IGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUga2VybmVsLiBiYXNlZCBvbiBjb2RlIGZyb20gZ2NjLTIuOTUuMyAqLworLyogSSBNb2x0b24gICAgIDI5LzA3LzAxICovCisKKyNpbmNsdWRlICJnY2NsaWIuaCIKKworI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBhLCBiKSBcCit7cmVnaXN0ZXIgVVNJdHlwZSBfX3QwLCBfX3QxLCBfX3QyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gKCIlQCBJbmxpbmVkIHVtdWxfcHBtbQkJCQkJXG5cCisgICAgICAgIG1vdiAgICAgJTIsICU1LCBsc3IgIzE2CQkJCQkJXG5cCisgICAgICAgIG1vdiAgICAgJTAsICU2LCBsc3IgIzE2CQkJCQkJXG5cCisgICAgICAgIGJpYyAgICAgJTMsICU1LCAlMiwgbHNsICMxNgkJCQkJXG5cCisgICAgICAgIGJpYyAgICAgJTQsICU2LCAlMCwgbHNsICMxNgkJCQkJXG5cCisgICAgICAgIG11bCAgICAgJTEsICUzLCAlNAkJCQkJCVxuXAorICAgICAgICBtdWwgICAgICU0LCAlMiwgJTQJCQkJCQlcblwKKyAgICAgICAgbXVsICAgICAlMywgJTAsICUzCQkJCQkJXG5cCisgICAgICAgIG11bCAgICAgJTAsICUyLCAlMAkJCQkJCVxuXAorICAgICAgICBhZGRzICAgICUzLCAlNCwgJTMJCQkJCQlcblwKKyAgICAgICAgYWRkY3MgICAlMCwgJTAsICM2NTUzNgkJCQkJCVxuXAorICAgICAgICBhZGRzICAgICUxLCAlMSwgJTMsIGxzbCAjMTYJCQkJCVxuXAorICAgICAgICBhZGMgICAgICUwLCAlMCwgJTMsIGxzciAjMTYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICA6ICI9JnIiICgoVVNJdHlwZSkgKHhoKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICI9ciIgKChVU0l0eXBlKSAoeGwpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICI9JnIiIChfX3QwKSwgIj0mciIgKF9fdDEpLCAiPXIiIChfX3QyKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICA6ICJyIiAoKFVTSXR5cGUpIChhKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICJyIiAoKFVTSXR5cGUpIChiKSkpO30KKworCisjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKKyAgKHtESXVuaW9uIF9fdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bXVsX3BwbW0gKF9fdy5zLmhpZ2gsIF9fdy5zLmxvdywgdSwgdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3cubGw7IH0pCisKKworREl0eXBlCitfX211bGRpMyAoREl0eXBlIHUsIERJdHlwZSB2KQoreworICBESXVuaW9uIHc7CisgIERJdW5pb24gdXUsIHZ2OworCisgIHV1LmxsID0gdSwKKyAgdnYubGwgPSB2OworCisgIHcubGwgPSBfX3VtdWxzaWRpMyAodXUucy5sb3csIHZ2LnMubG93KTsKKyAgdy5zLmhpZ2ggKz0gKChVU0l0eXBlKSB1dS5zLmxvdyAqIChVU0l0eXBlKSB2di5zLmhpZ2gKKyAgICAgICAgICAgICAgICsgKFVTSXR5cGUpIHV1LnMuaGlnaCAqIChVU0l0eXBlKSB2di5zLmxvdyk7CisKKyAgcmV0dXJuIHcubGw7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9wdXR1c2VyLlMgYi9hcmNoL2FybS9saWIvcHV0dXNlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTM5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvcHV0dXNlci5TCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL3B1dHVzZXIuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgSWRlYSBmcm9tIHg4NiB2ZXJzaW9uLCAoQykgQ29weXJpZ2h0IDE5OTggTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBhIG5vbi1zdGFuZGFyZCBjYWxsIGludGVyZmFjZSB0byBtYWtlCisgKiB0aGVtIG1vcmUgZWZmaWNpZW50LCBlc3BlY2lhbGx5IGFzIHRoZXkgcmV0dXJuIGFuIGVycm9yCisgKiB2YWx1ZSBpbiBhZGRpdGlvbiB0byB0aGUgInJlYWwiIHJldHVybiB2YWx1ZS4KKyAqCisgKiBfX3B1dF91c2VyX1gKKyAqCisgKiBJbnB1dHM6CXIwIGNvbnRhaW5zIHRoZSBhZGRyZXNzCisgKgkJcjIsIHIzIGNvbnRhaW5zIHRoZSB2YWx1ZQorICogT3V0cHV0czoJcjAgaXMgdGhlIGVycm9yIGNvZGUKKyAqCQlsciBjb3JydXB0ZWQKKyAqCisgKiBObyBvdGhlciByZWdpc3RlcnMgbXVzdCBiZSBhbHRlcmVkLiAgKHNlZSBpbmNsdWRlL2FzbS1hcm0vdWFjY2Vzcy5oCisgKiBmb3Igc3BlY2lmaWMgQVNNIHJlZ2lzdGVyIHVzYWdlKS4KKyAqCisgKiBOb3RlIHRoYXQgQUREUl9MSU1JVCBpcyBlaXRoZXIgMCBvciAweGMwMDAwMDAwCisgKiBOb3RlIGFsc28gdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IF9fcHV0X3VzZXJfYmFkIGlzIG5vdCBnbG9iYWwuCisgKi8KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKwkuZ2xvYmFsCV9fcHV0X3VzZXJfMQorX19wdXRfdXNlcl8xOgorMToJc3RyYnQJcjIsIFtyMF0KKwltb3YJcjAsICMwCisJbW92CXBjLCBscgorCisJLmdsb2JhbAlfX3B1dF91c2VyXzIKK19fcHV0X3VzZXJfMjoKKwltb3YJaXAsIHIyLCBsc3IgIzgKKyNpZm5kZWYgX19BUk1FQl9fCisyOglzdHJidAlyMiwgW3IwXSwgIzEKKzM6CXN0cmJ0CWlwLCBbcjBdCisjZWxzZQorMjoJc3RyYnQJaXAsIFtyMF0sICMxCiszOglzdHJidAlyMiwgW3IwXQorI2VuZGlmCisJbW92CXIwLCAjMAorCW1vdglwYywgbHIKKworCS5nbG9iYWwJX19wdXRfdXNlcl80CitfX3B1dF91c2VyXzQ6Cis0OglzdHJ0CXIyLCBbcjBdCisJbW92CXIwLCAjMAorCW1vdglwYywgbHIKKworCS5nbG9iYWwJX19wdXRfdXNlcl84CitfX3B1dF91c2VyXzg6Cis1OglzdHJ0CXIyLCBbcjBdLCAjNAorNjoJc3RydAlyMywgW3IwXQorCW1vdglyMCwgIzAKKwltb3YJcGMsIGxyCisKK19fcHV0X3VzZXJfYmFkOgorCW1vdglyMCwgIy1FRkFVTFQKKwltb3YJcGMsIGxyCisKKy5zZWN0aW9uIF9fZXhfdGFibGUsICJhIgorCS5sb25nCTFiLCBfX3B1dF91c2VyX2JhZAorCS5sb25nCTJiLCBfX3B1dF91c2VyX2JhZAorCS5sb25nCTNiLCBfX3B1dF91c2VyX2JhZAorCS5sb25nCTRiLCBfX3B1dF91c2VyX2JhZAorCS5sb25nCTViLCBfX3B1dF91c2VyX2JhZAorCS5sb25nCTZiLCBfX3B1dF91c2VyX2JhZAorLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvc2V0Yml0LlMgYi9hcmNoL2FybS9saWIvc2V0Yml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMzdkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9zZXRiaXQuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9zZXRiaXQuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKwkJLnRleHQKKworLyoKKyAqIFB1cnBvc2UgIDogRnVuY3Rpb24gdG8gc2V0IGEgYml0CisgKiBQcm90b3R5cGU6IGludCBzZXRfYml0KGludCBiaXQsIHZvaWQgKmFkZHIpCisgKi8KK0VOVFJZKF9zZXRfYml0X2JlKQorCQllb3IJcjAsIHIwLCAjMHgxOAkJQCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXJpbmcKK0VOVFJZKF9zZXRfYml0X2xlKQorCQlhbmQJcjIsIHIwLCAjNworCQltb3YJcjMsICMxCisJCW1vdglyMywgcjMsIGxzbCByMgorCQlzYXZlX2FuZF9kaXNhYmxlX2lycXMgaXAsIHIyCisJCWxkcmIJcjIsIFtyMSwgcjAsIGxzciAjM10KKwkJb3JyCXIyLCByMiwgcjMKKwkJc3RyYglyMiwgW3IxLCByMCwgbHNyICMzXQorCQlyZXN0b3JlX2lycXMgaXAKKwkJUkVUSU5TVFIobW92LHBjLGxyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3N0cmNoci5TIGIvYXJjaC9hcm0vbGliL3N0cmNoci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWI0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvc3RyY2hyLlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvc3RyY2hyLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQVNNIG9wdGltaXNlZCBzdHJpbmcgZnVuY3Rpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJCS50ZXh0CisJCS5hbGlnbgk1CitFTlRSWShzdHJjaHIpCisJCWFuZAlyMSwgcjEsICMweGZmCisxOgkJbGRyYglyMiwgW3IwXSwgIzEKKwkJdGVxCXIyLCByMQorCQl0ZXFuZQlyMiwgIzAKKwkJYm5lCTFiCisJCXRlcQlyMiwgcjEKKwkJbW92bmUJcjAsICMwCisJCXN1YmVxCXIwLCByMCwgIzEKKwkJUkVUSU5TVFIobW92LHBjLGxyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3N0cm5jcHlfZnJvbV91c2VyLlMgYi9hcmNoL2FybS9saWIvc3RybmNweV9mcm9tX3VzZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjljYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL3N0cm5jcHlfZnJvbV91c2VyLlMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvc3RybmNweV9mcm9tX3VzZXIuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworCS50ZXh0CisJLmFsaWduCTUKKworLyoKKyAqIENvcHkgYSBzdHJpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4KKyAqICByMCA9IGRzdCwgcjEgPSBzcmMsIHIyID0gYnl0ZSBsZW5ndGgKKyAqIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCAoc3RybGVuIG9mIGNvcGllZCBzdHJpbmcpLAorICogIC1FRkFVTFQgb24gZXhjZXB0aW9uLCBvciAibGVuIiBpZiB3ZSBmaWxsIHRoZSB3aG9sZSBidWZmZXIKKyAqLworRU5UUlkoX19hcmNoX3N0cm5jcHlfZnJvbV91c2VyKQorCXNhdmVfbHIKKwltb3YJaXAsIHIxCisxOglzdWJzCXIyLCByMiwgIzEKK1VTRVIoCWxkcnBsYnQJcjMsIFtyMV0sICMxKQorCWJtaQkyZgorCXN0cmIJcjMsIFtyMF0sICMxCisJdGVxCXIzLCAjMAorCWJuZQkxYgorCXN1YglyMSwgcjEsICMxCUAgdGFrZSBOVUwgY2hhcmFjdGVyIG91dCBvZiBjb3VudAorMjoJc3ViCXIwLCByMSwgaXAKKwlyZXN0b3JlX3BjCisKKwkuc2VjdGlvbiAuZml4dXAsImF4IgorCS5hbGlnbgkwCis5MDAxOgltb3YJcjMsICMwCisJc3RyYglyMywgW3IwLCAjMF0JQCBudWxsIHRlcm1pbmF0ZQorCW1vdglyMCwgIy1FRkFVTFQKKwlyZXN0b3JlX3BjCisJLnByZXZpb3VzCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9zdHJubGVuX3VzZXIuUyBiL2FyY2gvYXJtL2xpYi9zdHJubGVuX3VzZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2JjZDgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL3N0cm5sZW5fdXNlci5TCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL3N0cm5sZW5fdXNlci5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisJLnRleHQKKwkuYWxpZ24JNQorCisvKiBQcm90b3R5cGU6IHVuc2lnbmVkIGxvbmcgX19hcmNoX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzdHIsIGxvbmcgbikKKyAqIFB1cnBvc2UgIDogZ2V0IGxlbmd0aCBvZiBhIHN0cmluZyBpbiB1c2VyIG1lbW9yeQorICogUGFyYW1zICAgOiBzdHIgLSBhZGRyZXNzIG9mIHN0cmluZyBpbiB1c2VyIG1lbW9yeQorICogUmV0dXJucyAgOiBsZW5ndGggb2Ygc3RyaW5nICppbmNsdWRpbmcgdGVybWluYXRvcioKKyAqCSAgICAgIG9yIHplcm8gb24gZXhjZXB0aW9uLCBvciBuICsgMSBpZiB0b28gbG9uZworICovCitFTlRSWShfX2FyY2hfc3Rybmxlbl91c2VyKQorCXNhdmVfbHIKKwltb3YJcjIsIHIwCisxOgorVVNFUigJbGRyYnQJcjMsIFtyMF0sICMxKQorCXRlcQlyMywgIzAKKwliZXEJMmYKKwlzdWJzCXIxLCByMSwgIzEKKwlibmUJMWIKKwlhZGQJcjAsIHIwLCAjMQorMjoJc3ViCXIwLCByMCwgcjIKKwlyZXN0b3JlX3BjCisKKwkuc2VjdGlvbiAuZml4dXAsImF4IgorCS5hbGlnbgkwCis5MDAxOgltb3YJcjAsICMwCisJcmVzdG9yZV9wYworCS5wcmV2aW91cwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3N0cnJjaHIuUyBiL2FyY2gvYXJtL2xpYi9zdHJyY2hyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MjNmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2xpYi9zdHJyY2hyLlMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvc3RycmNoci5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFTTSBvcHRpbWlzZWQgc3RyaW5nIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworCQkudGV4dAorCQkuYWxpZ24JNQorRU5UUlkoc3RycmNocikKKwkJbW92CXIzLCAjMAorMToJCWxkcmIJcjIsIFtyMF0sICMxCisJCXRlcQlyMiwgcjEKKwkJc3ViZXEJcjMsIHIwLCAjMQorCQl0ZXEJcjIsICMwCisJCWJuZQkxYgorCQltb3YJcjAsIHIzCisJCVJFVElOU1RSKG1vdixwYyxscikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi90ZXN0Y2hhbmdlYml0LlMgYi9hcmNoL2FybS9saWIvdGVzdGNoYW5nZWJpdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYmE0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvdGVzdGNoYW5nZWJpdC5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL3Rlc3RjaGFuZ2ViaXQuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyAgICAgICAgICAgICAgICAudGV4dAorCitFTlRSWShfdGVzdF9hbmRfY2hhbmdlX2JpdF9iZSkKKwkJZW9yCXIwLCByMCwgIzB4MTgJCUAgYmlnIGVuZGlhbiBieXRlIG9yZGVyaW5nCitFTlRSWShfdGVzdF9hbmRfY2hhbmdlX2JpdF9sZSkKKwkJYWRkCXIxLCByMSwgcjAsIGxzciAjMworCQlhbmQJcjMsIHIwLCAjNworCQltb3YJcjAsICMxCisJCXNhdmVfYW5kX2Rpc2FibGVfaXJxcyBpcCwgcjIKKwkJbGRyYglyMiwgW3IxXQorCQl0c3QJcjIsIHIwLCBsc2wgcjMKKwkJZW9yCXIyLCByMiwgcjAsIGxzbCByMworCQlzdHJiCXIyLCBbcjFdCisJCXJlc3RvcmVfaXJxcyBpcAorCQltb3ZlcQlyMCwgIzAKKwkJUkVUSU5TVFIobW92LHBjLGxyKQorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi90ZXN0Y2xlYXJiaXQuUyBiL2FyY2gvYXJtL2xpYi90ZXN0Y2xlYXJiaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdjNWJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL3Rlc3RjbGVhcmJpdC5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL3Rlc3RjbGVhcmJpdC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorICAgICAgICAgICAgICAgIC50ZXh0CisKK0VOVFJZKF90ZXN0X2FuZF9jbGVhcl9iaXRfYmUpCisJCWVvcglyMCwgcjAsICMweDE4CQlAIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcmluZworRU5UUlkoX3Rlc3RfYW5kX2NsZWFyX2JpdF9sZSkKKwkJYWRkCXIxLCByMSwgcjAsIGxzciAjMwlAIEdldCBieXRlIG9mZnNldAorCQlhbmQJcjMsIHIwLCAjNwkJQCBHZXQgYml0IG9mZnNldAorCQltb3YJcjAsICMxCisJCXNhdmVfYW5kX2Rpc2FibGVfaXJxcyBpcCwgcjIKKwkJbGRyYglyMiwgW3IxXQorCQl0c3QJcjIsIHIwLCBsc2wgcjMKKwkJYmljCXIyLCByMiwgcjAsIGxzbCByMworCQlzdHJiCXIyLCBbcjFdCisJCXJlc3RvcmVfaXJxcyBpcAorCQltb3ZlcQlyMCwgIzAKKwkJUkVUSU5TVFIobW92LHBjLGxyKQorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi90ZXN0c2V0Yml0LlMgYi9hcmNoL2FybS9saWIvdGVzdHNldGJpdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzBmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvdGVzdHNldGJpdC5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL3Rlc3RzZXRiaXQuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyAgICAgICAgICAgICAgICAudGV4dAorCitFTlRSWShfdGVzdF9hbmRfc2V0X2JpdF9iZSkKKwkJZW9yCXIwLCByMCwgIzB4MTgJCUAgYmlnIGVuZGlhbiBieXRlIG9yZGVyaW5nCitFTlRSWShfdGVzdF9hbmRfc2V0X2JpdF9sZSkKKwkJYWRkCXIxLCByMSwgcjAsIGxzciAjMwlAIEdldCBieXRlIG9mZnNldAorCQlhbmQJcjMsIHIwLCAjNwkJQCBHZXQgYml0IG9mZnNldAorCQltb3YJcjAsICMxCisJCXNhdmVfYW5kX2Rpc2FibGVfaXJxcyBpcCwgcjIKKwkJbGRyYglyMiwgW3IxXQorCQl0c3QJcjIsIHIwLCBsc2wgcjMKKwkJb3JyCXIyLCByMiwgcjAsIGxzbCByMworCQlzdHJiCXIyLCBbcjFdCisJCXJlc3RvcmVfaXJxcyBpcAorCQltb3ZlcQlyMCwgIzAKKwkJUkVUSU5TVFIobW92LHBjLGxyKQorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi91YWNjZXNzLlMgYi9hcmNoL2FybS9saWIvdWFjY2Vzcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZWQwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvdWFjY2Vzcy5TCkBAIC0wLDAgKzEsNjk3IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi91YWNjZXNzLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBSb3V0aW5lcyB0byBibG9jayBjb3B5IGRhdGEgdG8vZnJvbSB1c2VyIG1lbW9yeQorICogICBUaGVzZSBhcmUgaGlnaGx5IG9wdGltaXNlZCBib3RoIGZvciB0aGUgNGsgcGFnZSBzaXplCisgKiAgIGFuZCBmb3IgdmFyaW91cyBhbGlnbm1lbnRzLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworCQkudGV4dAorCisjZGVmaW5lIFBBR0VfU0hJRlQgMTIKKworLyogUHJvdG90eXBlOiBpbnQgX19hcmNoX2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3QgY2hhciAqZnJvbSwgc2l6ZV90IG4pCisgKiBQdXJwb3NlICA6IGNvcHkgYSBibG9jayB0byB1c2VyIG1lbW9yeSBmcm9tIGtlcm5lbCBtZW1vcnkKKyAqIFBhcmFtcyAgIDogdG8gICAtIHVzZXIgbWVtb3J5CisgKiAgICAgICAgICA6IGZyb20gLSBrZXJuZWwgbWVtb3J5CisgKiAgICAgICAgICA6IG4gICAgLSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogUmV0dXJucyAgOiBOdW1iZXIgb2YgYnl0ZXMgTk9UIGNvcGllZC4KKyAqLworCisuYzJ1X2Rlc3Rfbm90X2FsaWduZWQ6CisJCXJzYglpcCwgaXAsICM0CisJCWNtcAlpcCwgIzIKKwkJbGRyYglyMywgW3IxXSwgIzEKK1VTRVIoCQlzdHJidAlyMywgW3IwXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJbGRyZ2ViCXIzLCBbcjFdLCAjMQorVVNFUigJCXN0cmdlYnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCWxkcmd0YglyMywgW3IxXSwgIzEKK1VTRVIoCQlzdHJndGJ0CXIzLCBbcjBdLCAjMSkJCQlAIE1heSBmYXVsdAorCQlzdWIJcjIsIHIyLCBpcAorCQliCS5jMnVfZGVzdF9hbGlnbmVkCisKK0VOVFJZKF9fYXJjaF9jb3B5X3RvX3VzZXIpCisJCXN0bWZkCXNwISwge3IyLCByNCAtIHI3LCBscn0KKwkJY21wCXIyLCAjNAorCQlibHQJLmMydV9ub3RfZW5vdWdoCisJUExEKAlwbGQJW3IxLCAjMF0JCSkKKwlQTEQoCXBsZAlbcjAsICMwXQkJKQorCQlhbmRzCWlwLCByMCwgIzMKKwkJYm5lCS5jMnVfZGVzdF9ub3RfYWxpZ25lZAorLmMydV9kZXN0X2FsaWduZWQ6CisKKwkJYW5kcwlpcCwgcjEsICMzCisJCWJuZQkuYzJ1X3NyY19ub3RfYWxpZ25lZAorLyoKKyAqIFNlZWluZyBhcyB0aGVyZSBoYXMgdG8gYmUgYXQgbGVhc3QgOCBieXRlcyB0byBjb3B5LCB3ZSBjYW4KKyAqIGNvcHkgb25lIHdvcmQsIGFuZCBmb3JjZSBhIHVzZXItbW9kZSBwYWdlIGZhdWx0Li4uCisgKi8KKworLmMydV8wZnVwaToJc3VicwlyMiwgcjIsICM0CisJCWFkZG1pCWlwLCByMiwgIzQKKwkJYm1pCS5jMnVfMG5vd29yZHMKKwkJbGRyCXIzLCBbcjFdLCAjNAorVVNFUigJCXN0cnQJcjMsIFtyMF0sICM0KQkJCUAgTWF5IGZhdWx0CisJCW1vdglpcCwgcjAsIGxzbCAjMzIgLSBQQUdFX1NISUZUCUAgT24gZWFjaCBwYWdlLCB1c2UgYSBsZC9zdD8/dCBpbnN0cnVjdGlvbgorCQlyc2IJaXAsIGlwLCAjMAorCQltb3ZzCWlwLCBpcCwgbHNyICMzMiAtIFBBR0VfU0hJRlQKKwkJYmVxCS5jMnVfMGZ1cGkKKy8qCisgKiBpcCA9IG1heCBuby4gb2YgYnl0ZXMgdG8gY29weSBiZWZvcmUgbmVlZGluZyBhbm90aGVyICJzdHJ0IiBpbnNuCisgKi8KKwkJY21wCXIyLCBpcAorCQltb3ZsdAlpcCwgcjIKKwkJc3ViCXIyLCByMiwgaXAKKwkJc3VicwlpcCwgaXAsICMzMgorCQlibHQJLmMydV8wcmVtOGxwCisJUExEKAlwbGQJW3IxLCAjMjhdCQkpCisJUExEKAlwbGQJW3IwLCAjMjhdCQkpCisJUExEKAlzdWJzCWlwLCBpcCwgIzY0CQkJKQorCVBMRCgJYmx0CS5jMnVfMGNweW5vcGxkCQkpCisJUExEKAlwbGQJW3IxLCAjNjBdCQkpCisJUExEKAlwbGQJW3IwLCAjNjBdCQkpCisKKy5jMnVfMGNweThscDoKKwlQTEQoCXBsZAlbcjEsICM5Ml0JCSkKKwlQTEQoCXBsZAlbcjAsICM5Ml0JCSkKKy5jMnVfMGNweW5vcGxkOglsZG1pYQlyMSEsIHtyMyAtIHI2fQorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJbGRtaWEJcjEhLCB7cjMgLSByNn0KKwkJc3VicwlpcCwgaXAsICMzMgorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJYnBsCS5jMnVfMGNweThscAorCVBMRCgJY21uCWlwLCAjNjQJCQkpCisJUExEKAliZ2UJLmMydV8wY3B5bm9wbGQJCSkKKwlQTEQoCWFkZAlpcCwgaXAsICM2NAkJKQorCisuYzJ1XzByZW04bHA6CWNtbglpcCwgIzE2CisJCWxkbWdlaWEJcjEhLCB7cjMgLSByNn0KKwkJc3RtZ2VpYQlyMCEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJdHN0CWlwLCAjOAorCQlsZG1uZWlhCXIxISwge3IzIC0gcjR9CisJCXN0bW5laWEJcjAhLCB7cjMgLSByNH0JCQlAIFNob3VsZG50IGZhdWx0CisJCXRzdAlpcCwgIzQKKwkJbGRybmUJcjMsIFtyMV0sICM0CisJCXN0cm5ldAlyMywgW3IwXSwgIzQJCQlAIFNob3VsZG50IGZhdWx0CisJCWFuZHMJaXAsIGlwLCAjMworCQliZXEJLmMydV8wZnVwaQorLmMydV8wbm93b3JkczoJdGVxCWlwLCAjMAorCQliZXEJLmMydV9maW5pc2hlZAorLmMydV9ub3dvcmRzOgljbXAJaXAsICMyCisJCWxkcmIJcjMsIFtyMV0sICMxCitVU0VSKAkJc3RyYnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCWxkcmdlYglyMywgW3IxXSwgIzEKK1VTRVIoCQlzdHJnZWJ0CXIzLCBbcjBdLCAjMSkJCQlAIE1heSBmYXVsdAorCQlsZHJndGIJcjMsIFtyMV0sICMxCitVU0VSKAkJc3RyZ3RidAlyMywgW3IwXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJYgkuYzJ1X2ZpbmlzaGVkCisKKy5jMnVfbm90X2Vub3VnaDoKKwkJbW92cwlpcCwgcjIKKwkJYm5lCS5jMnVfbm93b3JkcworLmMydV9maW5pc2hlZDoJbW92CXIwLCAjMAorCQlMT0FEUkVHUyhmZCxzcCEse3IyLCByNCAtIHI3LCBwY30pCisKKy5jMnVfc3JjX25vdF9hbGlnbmVkOgorCQliaWMJcjEsIHIxLCAjMworCQlsZHIJcjcsIFtyMV0sICM0CisJCWNtcAlpcCwgIzIKKwkJYmd0CS5jMnVfM2Z1cGkKKwkJYmVxCS5jMnVfMmZ1cGkKKy5jMnVfMWZ1cGk6CXN1YnMJcjIsIHIyLCAjNAorCQlhZGRtaQlpcCwgcjIsICM0CisJCWJtaQkuYzJ1XzFub3dvcmRzCisJCW1vdglyMywgcjcsIHB1bGwgIzgKKwkJbGRyCXI3LCBbcjFdLCAjNAorCQlvcnIJcjMsIHIzLCByNywgcHVzaCAjMjQKK1VTRVIoCQlzdHJ0CXIzLCBbcjBdLCAjNCkJCQlAIE1heSBmYXVsdAorCQltb3YJaXAsIHIwLCBsc2wgIzMyIC0gUEFHRV9TSElGVAorCQlyc2IJaXAsIGlwLCAjMAorCQltb3ZzCWlwLCBpcCwgbHNyICMzMiAtIFBBR0VfU0hJRlQKKwkJYmVxCS5jMnVfMWZ1cGkKKwkJY21wCXIyLCBpcAorCQltb3ZsdAlpcCwgcjIKKwkJc3ViCXIyLCByMiwgaXAKKwkJc3VicwlpcCwgaXAsICMxNgorCQlibHQJLmMydV8xcmVtOGxwCisJUExEKAlwbGQJW3IxLCAjMTJdCQkpCisJUExEKAlwbGQJW3IwLCAjMTJdCQkpCisJUExEKAlzdWJzCWlwLCBpcCwgIzMyCQkpCisJUExEKAlibHQJLmMydV8xY3B5bm9wbGQJCSkKKwlQTEQoCXBsZAlbcjEsICMyOF0JCSkKKwlQTEQoCXBsZAlbcjAsICMyOF0JCSkKKworLmMydV8xY3B5OGxwOgorCVBMRCgJcGxkCVtyMSwgIzQ0XQkJKQorCVBMRCgJcGxkCVtyMCwgIzQ0XQkJKQorLmMydV8xY3B5bm9wbGQ6CW1vdglyMywgcjcsIHB1bGwgIzgKKwkJbGRtaWEJcjEhLCB7cjQgLSByN30KKwkJc3VicwlpcCwgaXAsICMxNgorCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjMjQKKwkJbW92CXI0LCByNCwgcHVsbCAjOAorCQlvcnIJcjQsIHI0LCByNSwgcHVzaCAjMjQKKwkJbW92CXI1LCByNSwgcHVsbCAjOAorCQlvcnIJcjUsIHI1LCByNiwgcHVzaCAjMjQKKwkJbW92CXI2LCByNiwgcHVsbCAjOAorCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjMjQKKwkJc3RtaWEJcjAhLCB7cjMgLSByNn0JCQlAIFNob3VsZG50IGZhdWx0CisJCWJwbAkuYzJ1XzFjcHk4bHAKKwlQTEQoCWNtbglpcCwgIzMyCQkJKQorCVBMRCgJYmdlCS5jMnVfMWNweW5vcGxkCQkpCisJUExEKAlhZGQJaXAsIGlwLCAjMzIJCSkKKworLmMydV8xcmVtOGxwOgl0c3QJaXAsICM4CisJCW1vdm5lCXIzLCByNywgcHVsbCAjOAorCQlsZG1uZWlhCXIxISwge3I0LCByN30KKwkJb3JybmUJcjMsIHIzLCByNCwgcHVzaCAjMjQKKwkJbW92bmUJcjQsIHI0LCBwdWxsICM4CisJCW9ycm5lCXI0LCByNCwgcjcsIHB1c2ggIzI0CisJCXN0bW5laWEJcjAhLCB7cjMgLSByNH0JCQlAIFNob3VsZG50IGZhdWx0CisJCXRzdAlpcCwgIzQKKwkJbW92bmUJcjMsIHI3LCBwdWxsICM4CisJCWxkcm5lCXI3LCBbcjFdLCAjNAorCQlvcnJuZQlyMywgcjMsIHI3LCBwdXNoICMyNAorCQlzdHJuZXQJcjMsIFtyMF0sICM0CQkJQCBTaG91bGRudCBmYXVsdAorCQlhbmRzCWlwLCBpcCwgIzMKKwkJYmVxCS5jMnVfMWZ1cGkKKy5jMnVfMW5vd29yZHM6CW1vdglyMywgcjcsIGdldF9ieXRlXzEKKwkJdGVxCWlwLCAjMAorCQliZXEJLmMydV9maW5pc2hlZAorCQljbXAJaXAsICMyCitVU0VSKAkJc3RyYnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCW1vdmdlCXIzLCByNywgZ2V0X2J5dGVfMgorVVNFUigJCXN0cmdlYnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCW1vdmd0CXIzLCByNywgZ2V0X2J5dGVfMworVVNFUigJCXN0cmd0YnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCWIJLmMydV9maW5pc2hlZAorCisuYzJ1XzJmdXBpOglzdWJzCXIyLCByMiwgIzQKKwkJYWRkbWkJaXAsIHIyLCAjNAorCQlibWkJLmMydV8ybm93b3JkcworCQltb3YJcjMsIHI3LCBwdWxsICMxNgorCQlsZHIJcjcsIFtyMV0sICM0CisJCW9ycglyMywgcjMsIHI3LCBwdXNoICMxNgorVVNFUigJCXN0cnQJcjMsIFtyMF0sICM0KQkJCUAgTWF5IGZhdWx0CisJCW1vdglpcCwgcjAsIGxzbCAjMzIgLSBQQUdFX1NISUZUCisJCXJzYglpcCwgaXAsICMwCisJCW1vdnMJaXAsIGlwLCBsc3IgIzMyIC0gUEFHRV9TSElGVAorCQliZXEJLmMydV8yZnVwaQorCQljbXAJcjIsIGlwCisJCW1vdmx0CWlwLCByMgorCQlzdWIJcjIsIHIyLCBpcAorCQlzdWJzCWlwLCBpcCwgIzE2CisJCWJsdAkuYzJ1XzJyZW04bHAKKwlQTEQoCXBsZAlbcjEsICMxMl0JCSkKKwlQTEQoCXBsZAlbcjAsICMxMl0JCSkKKwlQTEQoCXN1YnMJaXAsIGlwLCAjMzIJCSkKKwlQTEQoCWJsdAkuYzJ1XzJjcHlub3BsZAkJKQorCVBMRCgJcGxkCVtyMSwgIzI4XQkJKQorCVBMRCgJcGxkCVtyMCwgIzI4XQkJKQorCisuYzJ1XzJjcHk4bHA6CisJUExEKAlwbGQJW3IxLCAjNDRdCQkpCisJUExEKAlwbGQJW3IwLCAjNDRdCQkpCisuYzJ1XzJjcHlub3BsZDoJbW92CXIzLCByNywgcHVsbCAjMTYKKwkJbGRtaWEJcjEhLCB7cjQgLSByN30KKwkJc3VicwlpcCwgaXAsICMxNgorCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjMTYKKwkJbW92CXI0LCByNCwgcHVsbCAjMTYKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzE2CisJCW1vdglyNSwgcjUsIHB1bGwgIzE2CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICMxNgorCQltb3YJcjYsIHI2LCBwdWxsICMxNgorCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjMTYKKwkJc3RtaWEJcjAhLCB7cjMgLSByNn0JCQlAIFNob3VsZG50IGZhdWx0CisJCWJwbAkuYzJ1XzJjcHk4bHAKKwlQTEQoCWNtbglpcCwgIzMyCQkJKQorCVBMRCgJYmdlCS5jMnVfMmNweW5vcGxkCQkpCisJUExEKAlhZGQJaXAsIGlwLCAjMzIJCSkKKworLmMydV8ycmVtOGxwOgl0c3QJaXAsICM4CisJCW1vdm5lCXIzLCByNywgcHVsbCAjMTYKKwkJbGRtbmVpYQlyMSEsIHtyNCwgcjd9CisJCW9ycm5lCXIzLCByMywgcjQsIHB1c2ggIzE2CisJCW1vdm5lCXI0LCByNCwgcHVsbCAjMTYKKwkJb3JybmUJcjQsIHI0LCByNywgcHVzaCAjMTYKKwkJc3RtbmVpYQlyMCEsIHtyMyAtIHI0fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJdHN0CWlwLCAjNAorCQltb3ZuZQlyMywgcjcsIHB1bGwgIzE2CisJCWxkcm5lCXI3LCBbcjFdLCAjNAorCQlvcnJuZQlyMywgcjMsIHI3LCBwdXNoICMxNgorCQlzdHJuZXQJcjMsIFtyMF0sICM0CQkJQCBTaG91bGRudCBmYXVsdAorCQlhbmRzCWlwLCBpcCwgIzMKKwkJYmVxCS5jMnVfMmZ1cGkKKy5jMnVfMm5vd29yZHM6CW1vdglyMywgcjcsIGdldF9ieXRlXzIKKwkJdGVxCWlwLCAjMAorCQliZXEJLmMydV9maW5pc2hlZAorCQljbXAJaXAsICMyCitVU0VSKAkJc3RyYnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCW1vdmdlCXIzLCByNywgZ2V0X2J5dGVfMworVVNFUigJCXN0cmdlYnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCWxkcmd0YglyMywgW3IxXSwgIzAKK1VTRVIoCQlzdHJndGJ0CXIzLCBbcjBdLCAjMSkJCQlAIE1heSBmYXVsdAorCQliCS5jMnVfZmluaXNoZWQKKworLmMydV8zZnVwaToJc3VicwlyMiwgcjIsICM0CisJCWFkZG1pCWlwLCByMiwgIzQKKwkJYm1pCS5jMnVfM25vd29yZHMKKwkJbW92CXIzLCByNywgcHVsbCAjMjQKKwkJbGRyCXI3LCBbcjFdLCAjNAorCQlvcnIJcjMsIHIzLCByNywgcHVzaCAjOAorVVNFUigJCXN0cnQJcjMsIFtyMF0sICM0KQkJCUAgTWF5IGZhdWx0CisJCW1vdglpcCwgcjAsIGxzbCAjMzIgLSBQQUdFX1NISUZUCisJCXJzYglpcCwgaXAsICMwCisJCW1vdnMJaXAsIGlwLCBsc3IgIzMyIC0gUEFHRV9TSElGVAorCQliZXEJLmMydV8zZnVwaQorCQljbXAJcjIsIGlwCisJCW1vdmx0CWlwLCByMgorCQlzdWIJcjIsIHIyLCBpcAorCQlzdWJzCWlwLCBpcCwgIzE2CisJCWJsdAkuYzJ1XzNyZW04bHAKKwlQTEQoCXBsZAlbcjEsICMxMl0JCSkKKwlQTEQoCXBsZAlbcjAsICMxMl0JCSkKKwlQTEQoCXN1YnMJaXAsIGlwLCAjMzIJCSkKKwlQTEQoCWJsdAkuYzJ1XzNjcHlub3BsZAkJKQorCVBMRCgJcGxkCVtyMSwgIzI4XQkJKQorCVBMRCgJcGxkCVtyMCwgIzI4XQkJKQorCisuYzJ1XzNjcHk4bHA6CisJUExEKAlwbGQJW3IxLCAjNDRdCQkpCisJUExEKAlwbGQJW3IwLCAjNDRdCQkpCisuYzJ1XzNjcHlub3BsZDoJbW92CXIzLCByNywgcHVsbCAjMjQKKwkJbGRtaWEJcjEhLCB7cjQgLSByN30KKwkJc3VicwlpcCwgaXAsICMxNgorCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjOAorCQltb3YJcjQsIHI0LCBwdWxsICMyNAorCQlvcnIJcjQsIHI0LCByNSwgcHVzaCAjOAorCQltb3YJcjUsIHI1LCBwdWxsICMyNAorCQlvcnIJcjUsIHI1LCByNiwgcHVzaCAjOAorCQltb3YJcjYsIHI2LCBwdWxsICMyNAorCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjOAorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJYnBsCS5jMnVfM2NweThscAorCVBMRCgJY21uCWlwLCAjMzIJCQkpCisJUExEKAliZ2UJLmMydV8zY3B5bm9wbGQJCSkKKwlQTEQoCWFkZAlpcCwgaXAsICMzMgkJKQorCisuYzJ1XzNyZW04bHA6CXRzdAlpcCwgIzgKKwkJbW92bmUJcjMsIHI3LCBwdWxsICMyNAorCQlsZG1uZWlhCXIxISwge3I0LCByN30KKwkJb3JybmUJcjMsIHIzLCByNCwgcHVzaCAjOAorCQltb3ZuZQlyNCwgcjQsIHB1bGwgIzI0CisJCW9ycm5lCXI0LCByNCwgcjcsIHB1c2ggIzgKKwkJc3RtbmVpYQlyMCEsIHtyMyAtIHI0fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJdHN0CWlwLCAjNAorCQltb3ZuZQlyMywgcjcsIHB1bGwgIzI0CisJCWxkcm5lCXI3LCBbcjFdLCAjNAorCQlvcnJuZQlyMywgcjMsIHI3LCBwdXNoICM4CisJCXN0cm5ldAlyMywgW3IwXSwgIzQJCQlAIFNob3VsZG50IGZhdWx0CisJCWFuZHMJaXAsIGlwLCAjMworCQliZXEJLmMydV8zZnVwaQorLmMydV8zbm93b3JkczoJbW92CXIzLCByNywgZ2V0X2J5dGVfMworCQl0ZXEJaXAsICMwCisJCWJlcQkuYzJ1X2ZpbmlzaGVkCisJCWNtcAlpcCwgIzIKK1VTRVIoCQlzdHJidAlyMywgW3IwXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJbGRyZ2ViCXIzLCBbcjFdLCAjMQorVVNFUigJCXN0cmdlYnQJcjMsIFtyMF0sICMxKQkJCUAgTWF5IGZhdWx0CisJCWxkcmd0YglyMywgW3IxXSwgIzAKK1VTRVIoCQlzdHJndGJ0CXIzLCBbcjBdLCAjMSkJCQlAIE1heSBmYXVsdAorCQliCS5jMnVfZmluaXNoZWQKKworCQkuc2VjdGlvbiAuZml4dXAsImF4IgorCQkuYWxpZ24JMAorOTAwMToJCUxPQURSRUdTKGZkLHNwISwge3IwLCByNCAtIHI3LCBwY30pCisJCS5wcmV2aW91cworCisvKiBQcm90b3R5cGU6IHVuc2lnbmVkIGxvbmcgX19hcmNoX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLGNvbnN0IHZvaWQgKmZyb20sdW5zaWduZWQgbG9uZyBuKTsKKyAqIFB1cnBvc2UgIDogY29weSBhIGJsb2NrIGZyb20gdXNlciBtZW1vcnkgdG8ga2VybmVsIG1lbW9yeQorICogUGFyYW1zICAgOiB0byAgIC0ga2VybmVsIG1lbW9yeQorICogICAgICAgICAgOiBmcm9tIC0gdXNlciBtZW1vcnkKKyAqICAgICAgICAgIDogbiAgICAtIG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBSZXR1cm5zICA6IE51bWJlciBvZiBieXRlcyBOT1QgY29waWVkLgorICovCisuY2Z1X2Rlc3Rfbm90X2FsaWduZWQ6CisJCXJzYglpcCwgaXAsICM0CisJCWNtcAlpcCwgIzIKK1VTRVIoCQlsZHJidAlyMywgW3IxXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJc3RyYglyMywgW3IwXSwgIzEKK1VTRVIoCQlsZHJnZWJ0CXIzLCBbcjFdLCAjMSkJCQlAIE1heSBmYXVsdAorCQlzdHJnZWIJcjMsIFtyMF0sICMxCitVU0VSKAkJbGRyZ3RidAlyMywgW3IxXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJc3RyZ3RiCXIzLCBbcjBdLCAjMQorCQlzdWIJcjIsIHIyLCBpcAorCQliCS5jZnVfZGVzdF9hbGlnbmVkCisKK0VOVFJZKF9fYXJjaF9jb3B5X2Zyb21fdXNlcikKKwkJc3RtZmQJc3AhLCB7cjAsIHIyLCByNCAtIHI3LCBscn0KKwkJY21wCXIyLCAjNAorCQlibHQJLmNmdV9ub3RfZW5vdWdoCisJUExEKAlwbGQJW3IxLCAjMF0JCSkKKwlQTEQoCXBsZAlbcjAsICMwXQkJKQorCQlhbmRzCWlwLCByMCwgIzMKKwkJYm5lCS5jZnVfZGVzdF9ub3RfYWxpZ25lZAorLmNmdV9kZXN0X2FsaWduZWQ6CisJCWFuZHMJaXAsIHIxLCAjMworCQlibmUJLmNmdV9zcmNfbm90X2FsaWduZWQKKy8qCisgKiBTZWVpbmcgYXMgdGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IDggYnl0ZXMgdG8gY29weSwgd2UgY2FuCisgKiBjb3B5IG9uZSB3b3JkLCBhbmQgZm9yY2UgYSB1c2VyLW1vZGUgcGFnZSBmYXVsdC4uLgorICovCisKKy5jZnVfMGZ1cGk6CXN1YnMJcjIsIHIyLCAjNAorCQlhZGRtaQlpcCwgcjIsICM0CisJCWJtaQkuY2Z1XzBub3dvcmRzCitVU0VSKAkJbGRydAlyMywgW3IxXSwgIzQpCisJCXN0cglyMywgW3IwXSwgIzQKKwkJbW92CWlwLCByMSwgbHNsICMzMiAtIFBBR0VfU0hJRlQJQCBPbiBlYWNoIHBhZ2UsIHVzZSBhIGxkL3N0Pz90IGluc3RydWN0aW9uCisJCXJzYglpcCwgaXAsICMwCisJCW1vdnMJaXAsIGlwLCBsc3IgIzMyIC0gUEFHRV9TSElGVAorCQliZXEJLmNmdV8wZnVwaQorLyoKKyAqIGlwID0gbWF4IG5vLiBvZiBieXRlcyB0byBjb3B5IGJlZm9yZSBuZWVkaW5nIGFub3RoZXIgInN0cnQiIGluc24KKyAqLworCQljbXAJcjIsIGlwCisJCW1vdmx0CWlwLCByMgorCQlzdWIJcjIsIHIyLCBpcAorCQlzdWJzCWlwLCBpcCwgIzMyCisJCWJsdAkuY2Z1XzByZW04bHAKKwlQTEQoCXBsZAlbcjEsICMyOF0JCSkKKwlQTEQoCXBsZAlbcjAsICMyOF0JCSkKKwlQTEQoCXN1YnMJaXAsIGlwLCAjNjQJCQkpCisJUExEKAlibHQJLmNmdV8wY3B5bm9wbGQJCSkKKwlQTEQoCXBsZAlbcjEsICM2MF0JCSkKKwlQTEQoCXBsZAlbcjAsICM2MF0JCSkKKworLmNmdV8wY3B5OGxwOgorCVBMRCgJcGxkCVtyMSwgIzkyXQkJKQorCVBMRCgJcGxkCVtyMCwgIzkyXQkJKQorLmNmdV8wY3B5bm9wbGQ6CWxkbWlhCXIxISwge3IzIC0gcjZ9CQkJQCBTaG91bGRudCBmYXVsdAorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQorCQlsZG1pYQlyMSEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJc3VicwlpcCwgaXAsICMzMgorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQorCQlicGwJLmNmdV8wY3B5OGxwCisJUExEKAljbW4JaXAsICM2NAkJCSkKKwlQTEQoCWJnZQkuY2Z1XzBjcHlub3BsZAkJKQorCVBMRCgJYWRkCWlwLCBpcCwgIzY0CQkpCisKKy5jZnVfMHJlbThscDoJY21uCWlwLCAjMTYKKwkJbGRtZ2VpYQlyMSEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJc3RtZ2VpYQlyMCEsIHtyMyAtIHI2fQorCQl0c3QJaXAsICM4CisJCWxkbW5laWEJcjEhLCB7cjMgLSByNH0JCQlAIFNob3VsZG50IGZhdWx0CisJCXN0bW5laWEJcjAhLCB7cjMgLSByNH0KKwkJdHN0CWlwLCAjNAorCQlsZHJuZXQJcjMsIFtyMV0sICM0CQkJQCBTaG91bGRudCBmYXVsdAorCQlzdHJuZQlyMywgW3IwXSwgIzQKKwkJYW5kcwlpcCwgaXAsICMzCisJCWJlcQkuY2Z1XzBmdXBpCisuY2Z1XzBub3dvcmRzOgl0ZXEJaXAsICMwCisJCWJlcQkuY2Z1X2ZpbmlzaGVkCisuY2Z1X25vd29yZHM6CWNtcAlpcCwgIzIKK1VTRVIoCQlsZHJidAlyMywgW3IxXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJc3RyYglyMywgW3IwXSwgIzEKK1VTRVIoCQlsZHJnZWJ0CXIzLCBbcjFdLCAjMSkJCQlAIE1heSBmYXVsdAorCQlzdHJnZWIJcjMsIFtyMF0sICMxCitVU0VSKAkJbGRyZ3RidAlyMywgW3IxXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJc3RyZ3RiCXIzLCBbcjBdLCAjMQorCQliCS5jZnVfZmluaXNoZWQKKworLmNmdV9ub3RfZW5vdWdoOgorCQltb3ZzCWlwLCByMgorCQlibmUJLmNmdV9ub3dvcmRzCisuY2Z1X2ZpbmlzaGVkOgltb3YJcjAsICMwCisJCWFkZAlzcCwgc3AsICM4CisJCUxPQURSRUdTKGZkLHNwISx7cjQgLSByNywgcGN9KQorCisuY2Z1X3NyY19ub3RfYWxpZ25lZDoKKwkJYmljCXIxLCByMSwgIzMKK1VTRVIoCQlsZHJ0CXI3LCBbcjFdLCAjNCkJCQlAIE1heSBmYXVsdAorCQljbXAJaXAsICMyCisJCWJndAkuY2Z1XzNmdXBpCisJCWJlcQkuY2Z1XzJmdXBpCisuY2Z1XzFmdXBpOglzdWJzCXIyLCByMiwgIzQKKwkJYWRkbWkJaXAsIHIyLCAjNAorCQlibWkJLmNmdV8xbm93b3JkcworCQltb3YJcjMsIHI3LCBwdWxsICM4CitVU0VSKAkJbGRydAlyNywgW3IxXSwgIzQpCQkJQCBNYXkgZmF1bHQKKwkJb3JyCXIzLCByMywgcjcsIHB1c2ggIzI0CisJCXN0cglyMywgW3IwXSwgIzQKKwkJbW92CWlwLCByMSwgbHNsICMzMiAtIFBBR0VfU0hJRlQKKwkJcnNiCWlwLCBpcCwgIzAKKwkJbW92cwlpcCwgaXAsIGxzciAjMzIgLSBQQUdFX1NISUZUCisJCWJlcQkuY2Z1XzFmdXBpCisJCWNtcAlyMiwgaXAKKwkJbW92bHQJaXAsIHIyCisJCXN1YglyMiwgcjIsIGlwCisJCXN1YnMJaXAsIGlwLCAjMTYKKwkJYmx0CS5jZnVfMXJlbThscAorCVBMRCgJcGxkCVtyMSwgIzEyXQkJKQorCVBMRCgJcGxkCVtyMCwgIzEyXQkJKQorCVBMRCgJc3VicwlpcCwgaXAsICMzMgkJKQorCVBMRCgJYmx0CS5jZnVfMWNweW5vcGxkCQkpCisJUExEKAlwbGQJW3IxLCAjMjhdCQkpCisJUExEKAlwbGQJW3IwLCAjMjhdCQkpCisKKy5jZnVfMWNweThscDoKKwlQTEQoCXBsZAlbcjEsICM0NF0JCSkKKwlQTEQoCXBsZAlbcjAsICM0NF0JCSkKKy5jZnVfMWNweW5vcGxkOgltb3YJcjMsIHI3LCBwdWxsICM4CisJCWxkbWlhCXIxISwge3I0IC0gcjd9CQkJQCBTaG91bGRudCBmYXVsdAorCQlzdWJzCWlwLCBpcCwgIzE2CisJCW9ycglyMywgcjMsIHI0LCBwdXNoICMyNAorCQltb3YJcjQsIHI0LCBwdWxsICM4CisJCW9ycglyNCwgcjQsIHI1LCBwdXNoICMyNAorCQltb3YJcjUsIHI1LCBwdWxsICM4CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICMyNAorCQltb3YJcjYsIHI2LCBwdWxsICM4CisJCW9ycglyNiwgcjYsIHI3LCBwdXNoICMyNAorCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQorCQlicGwJLmNmdV8xY3B5OGxwCisJUExEKAljbW4JaXAsICMzMgkJCSkKKwlQTEQoCWJnZQkuY2Z1XzFjcHlub3BsZAkJKQorCVBMRCgJYWRkCWlwLCBpcCwgIzMyCQkpCisKKy5jZnVfMXJlbThscDoJdHN0CWlwLCAjOAorCQltb3ZuZQlyMywgcjcsIHB1bGwgIzgKKwkJbGRtbmVpYQlyMSEsIHtyNCwgcjd9CQkJQCBTaG91bGRudCBmYXVsdAorCQlvcnJuZQlyMywgcjMsIHI0LCBwdXNoICMyNAorCQltb3ZuZQlyNCwgcjQsIHB1bGwgIzgKKwkJb3JybmUJcjQsIHI0LCByNywgcHVzaCAjMjQKKwkJc3RtbmVpYQlyMCEsIHtyMyAtIHI0fQorCQl0c3QJaXAsICM0CisJCW1vdm5lCXIzLCByNywgcHVsbCAjOAorVVNFUigJCWxkcm5ldAlyNywgW3IxXSwgIzQpCQkJQCBNYXkgZmF1bHQKKwkJb3JybmUJcjMsIHIzLCByNywgcHVzaCAjMjQKKwkJc3RybmUJcjMsIFtyMF0sICM0CisJCWFuZHMJaXAsIGlwLCAjMworCQliZXEJLmNmdV8xZnVwaQorLmNmdV8xbm93b3JkczoJbW92CXIzLCByNywgZ2V0X2J5dGVfMQorCQl0ZXEJaXAsICMwCisJCWJlcQkuY2Z1X2ZpbmlzaGVkCisJCWNtcAlpcCwgIzIKKwkJc3RyYglyMywgW3IwXSwgIzEKKwkJbW92Z2UJcjMsIHI3LCBnZXRfYnl0ZV8yCisJCXN0cmdlYglyMywgW3IwXSwgIzEKKwkJbW92Z3QJcjMsIHI3LCBnZXRfYnl0ZV8zCisJCXN0cmd0YglyMywgW3IwXSwgIzEKKwkJYgkuY2Z1X2ZpbmlzaGVkCisKKy5jZnVfMmZ1cGk6CXN1YnMJcjIsIHIyLCAjNAorCQlhZGRtaQlpcCwgcjIsICM0CisJCWJtaQkuY2Z1XzJub3dvcmRzCisJCW1vdglyMywgcjcsIHB1bGwgIzE2CitVU0VSKAkJbGRydAlyNywgW3IxXSwgIzQpCQkJQCBNYXkgZmF1bHQKKwkJb3JyCXIzLCByMywgcjcsIHB1c2ggIzE2CisJCXN0cglyMywgW3IwXSwgIzQKKwkJbW92CWlwLCByMSwgbHNsICMzMiAtIFBBR0VfU0hJRlQKKwkJcnNiCWlwLCBpcCwgIzAKKwkJbW92cwlpcCwgaXAsIGxzciAjMzIgLSBQQUdFX1NISUZUCisJCWJlcQkuY2Z1XzJmdXBpCisJCWNtcAlyMiwgaXAKKwkJbW92bHQJaXAsIHIyCisJCXN1YglyMiwgcjIsIGlwCisJCXN1YnMJaXAsIGlwLCAjMTYKKwkJYmx0CS5jZnVfMnJlbThscAorCVBMRCgJcGxkCVtyMSwgIzEyXQkJKQorCVBMRCgJcGxkCVtyMCwgIzEyXQkJKQorCVBMRCgJc3VicwlpcCwgaXAsICMzMgkJKQorCVBMRCgJYmx0CS5jZnVfMmNweW5vcGxkCQkpCisJUExEKAlwbGQJW3IxLCAjMjhdCQkpCisJUExEKAlwbGQJW3IwLCAjMjhdCQkpCisKKy5jZnVfMmNweThscDoKKwlQTEQoCXBsZAlbcjEsICM0NF0JCSkKKwlQTEQoCXBsZAlbcjAsICM0NF0JCSkKKy5jZnVfMmNweW5vcGxkOgltb3YJcjMsIHI3LCBwdWxsICMxNgorCQlsZG1pYQlyMSEsIHtyNCAtIHI3fQkJCUAgU2hvdWxkbnQgZmF1bHQKKwkJc3VicwlpcCwgaXAsICMxNgorCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjMTYKKwkJbW92CXI0LCByNCwgcHVsbCAjMTYKKwkJb3JyCXI0LCByNCwgcjUsIHB1c2ggIzE2CisJCW1vdglyNSwgcjUsIHB1bGwgIzE2CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICMxNgorCQltb3YJcjYsIHI2LCBwdWxsICMxNgorCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjMTYKKwkJc3RtaWEJcjAhLCB7cjMgLSByNn0KKwkJYnBsCS5jZnVfMmNweThscAorCVBMRCgJY21uCWlwLCAjMzIJCQkpCisJUExEKAliZ2UJLmNmdV8yY3B5bm9wbGQJCSkKKwlQTEQoCWFkZAlpcCwgaXAsICMzMgkJKQorCisuY2Z1XzJyZW04bHA6CXRzdAlpcCwgIzgKKwkJbW92bmUJcjMsIHI3LCBwdWxsICMxNgorCQlsZG1uZWlhCXIxISwge3I0LCByN30JCQlAIFNob3VsZG50IGZhdWx0CisJCW9ycm5lCXIzLCByMywgcjQsIHB1c2ggIzE2CisJCW1vdm5lCXI0LCByNCwgcHVsbCAjMTYKKwkJb3JybmUJcjQsIHI0LCByNywgcHVzaCAjMTYKKwkJc3RtbmVpYQlyMCEsIHtyMyAtIHI0fQorCQl0c3QJaXAsICM0CisJCW1vdm5lCXIzLCByNywgcHVsbCAjMTYKK1VTRVIoCQlsZHJuZXQJcjcsIFtyMV0sICM0KQkJCUAgTWF5IGZhdWx0CisJCW9ycm5lCXIzLCByMywgcjcsIHB1c2ggIzE2CisJCXN0cm5lCXIzLCBbcjBdLCAjNAorCQlhbmRzCWlwLCBpcCwgIzMKKwkJYmVxCS5jZnVfMmZ1cGkKKy5jZnVfMm5vd29yZHM6CW1vdglyMywgcjcsIGdldF9ieXRlXzIKKwkJdGVxCWlwLCAjMAorCQliZXEJLmNmdV9maW5pc2hlZAorCQljbXAJaXAsICMyCisJCXN0cmIJcjMsIFtyMF0sICMxCisJCW1vdmdlCXIzLCByNywgZ2V0X2J5dGVfMworCQlzdHJnZWIJcjMsIFtyMF0sICMxCitVU0VSKAkJbGRyZ3RidAlyMywgW3IxXSwgIzApCQkJQCBNYXkgZmF1bHQKKwkJc3RyZ3RiCXIzLCBbcjBdLCAjMQorCQliCS5jZnVfZmluaXNoZWQKKworLmNmdV8zZnVwaToJc3VicwlyMiwgcjIsICM0CisJCWFkZG1pCWlwLCByMiwgIzQKKwkJYm1pCS5jZnVfM25vd29yZHMKKwkJbW92CXIzLCByNywgcHVsbCAjMjQKK1VTRVIoCQlsZHJ0CXI3LCBbcjFdLCAjNCkJCQlAIE1heSBmYXVsdAorCQlvcnIJcjMsIHIzLCByNywgcHVzaCAjOAorCQlzdHIJcjMsIFtyMF0sICM0CisJCW1vdglpcCwgcjEsIGxzbCAjMzIgLSBQQUdFX1NISUZUCisJCXJzYglpcCwgaXAsICMwCisJCW1vdnMJaXAsIGlwLCBsc3IgIzMyIC0gUEFHRV9TSElGVAorCQliZXEJLmNmdV8zZnVwaQorCQljbXAJcjIsIGlwCisJCW1vdmx0CWlwLCByMgorCQlzdWIJcjIsIHIyLCBpcAorCQlzdWJzCWlwLCBpcCwgIzE2CisJCWJsdAkuY2Z1XzNyZW04bHAKKwlQTEQoCXBsZAlbcjEsICMxMl0JCSkKKwlQTEQoCXBsZAlbcjAsICMxMl0JCSkKKwlQTEQoCXN1YnMJaXAsIGlwLCAjMzIJCSkKKwlQTEQoCWJsdAkuY2Z1XzNjcHlub3BsZAkJKQorCVBMRCgJcGxkCVtyMSwgIzI4XQkJKQorCVBMRCgJcGxkCVtyMCwgIzI4XQkJKQorCisuY2Z1XzNjcHk4bHA6CisJUExEKAlwbGQJW3IxLCAjNDRdCQkpCisJUExEKAlwbGQJW3IwLCAjNDRdCQkpCisuY2Z1XzNjcHlub3BsZDoJbW92CXIzLCByNywgcHVsbCAjMjQKKwkJbGRtaWEJcjEhLCB7cjQgLSByN30JCQlAIFNob3VsZG50IGZhdWx0CisJCW9ycglyMywgcjMsIHI0LCBwdXNoICM4CisJCW1vdglyNCwgcjQsIHB1bGwgIzI0CisJCW9ycglyNCwgcjQsIHI1LCBwdXNoICM4CisJCW1vdglyNSwgcjUsIHB1bGwgIzI0CisJCW9ycglyNSwgcjUsIHI2LCBwdXNoICM4CisJCW1vdglyNiwgcjYsIHB1bGwgIzI0CisJCW9ycglyNiwgcjYsIHI3LCBwdXNoICM4CisJCXN0bWlhCXIwISwge3IzIC0gcjZ9CisJCXN1YnMJaXAsIGlwLCAjMTYKKwkJYnBsCS5jZnVfM2NweThscAorCVBMRCgJY21uCWlwLCAjMzIJCQkpCisJUExEKAliZ2UJLmNmdV8zY3B5bm9wbGQJCSkKKwlQTEQoCWFkZAlpcCwgaXAsICMzMgkJKQorCisuY2Z1XzNyZW04bHA6CXRzdAlpcCwgIzgKKwkJbW92bmUJcjMsIHI3LCBwdWxsICMyNAorCQlsZG1uZWlhCXIxISwge3I0LCByN30JCQlAIFNob3VsZG50IGZhdWx0CisJCW9ycm5lCXIzLCByMywgcjQsIHB1c2ggIzgKKwkJbW92bmUJcjQsIHI0LCBwdWxsICMyNAorCQlvcnJuZQlyNCwgcjQsIHI3LCBwdXNoICM4CisJCXN0bW5laWEJcjAhLCB7cjMgLSByNH0KKwkJdHN0CWlwLCAjNAorCQltb3ZuZQlyMywgcjcsIHB1bGwgIzI0CitVU0VSKAkJbGRybmV0CXI3LCBbcjFdLCAjNCkJCQlAIE1heSBmYXVsdAorCQlvcnJuZQlyMywgcjMsIHI3LCBwdXNoICM4CisJCXN0cm5lCXIzLCBbcjBdLCAjNAorCQlhbmRzCWlwLCBpcCwgIzMKKwkJYmVxCS5jZnVfM2Z1cGkKKy5jZnVfM25vd29yZHM6CW1vdglyMywgcjcsIGdldF9ieXRlXzMKKwkJdGVxCWlwLCAjMAorCQliZXEJLmNmdV9maW5pc2hlZAorCQljbXAJaXAsICMyCisJCXN0cmIJcjMsIFtyMF0sICMxCitVU0VSKAkJbGRyZ2VidAlyMywgW3IxXSwgIzEpCQkJQCBNYXkgZmF1bHQKKwkJc3RyZ2ViCXIzLCBbcjBdLCAjMQorVVNFUigJCWxkcmd0YnQJcjMsIFtyMV0sICMxKQkJCUAgTWF5IGZhdWx0CisJCXN0cmd0YglyMywgW3IwXSwgIzEKKwkJYgkuY2Z1X2ZpbmlzaGVkCisKKwkJLnNlY3Rpb24gLmZpeHVwLCJheCIKKwkJLmFsaWduCTAKKwkJLyoKKwkJICogV2UgdG9vayBhbiBleGNlcHRpb24uICByMCBjb250YWlucyBhIHBvaW50ZXIgdG8KKwkJICogdGhlIGJ5dGUgbm90IGNvcGllZC4KKwkJICovCis5MDAxOgkJbGRyCXIyLCBbc3BdLCAjNAkJCUAgdm9pZCAqdG8KKwkJc3ViCXIyLCByMCwgcjIJCQlAIGJ5dGVzIGNvcGllZAorCQlsZHIJcjEsIFtzcF0sICM0CQkJQCB1bnNpZ25lZCBsb25nIGNvdW50CisJCXN1YnMJcjQsIHIxLCByMgkJCUAgYnl0ZXMgbGVmdCB0byBjb3B5CisJCW1vdm5lCXIxLCByNAorCQlibG5lCV9fbWVtemVybworCQltb3YJcjAsIHI0CisJCUxPQURSRUdTKGZkLHNwISwge3I0IC0gcjcsIHBjfSkKKwkJLnByZXZpb3VzCisKKy8qIFByb3RvdHlwZTogaW50IF9fYXJjaF9jbGVhcl91c2VyKHZvaWQgKmFkZHIsIHNpemVfdCBzeikKKyAqIFB1cnBvc2UgIDogY2xlYXIgc29tZSB1c2VyIG1lbW9yeQorICogUGFyYW1zICAgOiBhZGRyIC0gdXNlciBtZW1vcnkgYWRkcmVzcyB0byBjbGVhcgorICogICAgICAgICAgOiBzeiAgIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNsZWFyCisgKiBSZXR1cm5zICA6IG51bWJlciBvZiBieXRlcyBOT1QgY2xlYXJlZAorICovCitFTlRSWShfX2FyY2hfY2xlYXJfdXNlcikKKwkJc3RtZmQJc3AhLCB7cjEsIGxyfQorCQltb3YJcjIsICMwCisJCWNtcAlyMSwgIzQKKwkJYmx0CTJmCisJCWFuZHMJaXAsIHIwLCAjMworCQliZXEJMWYKKwkJY21wCWlwLCAjMgorVVNFUigJCXN0cmJ0CXIyLCBbcjBdLCAjMSkKK1VTRVIoCQlzdHJsZWJ0CXIyLCBbcjBdLCAjMSkKK1VTRVIoCQlzdHJsdGJ0CXIyLCBbcjBdLCAjMSkKKwkJcnNiCWlwLCBpcCwgIzQKKwkJc3ViCXIxLCByMSwgaXAJCUAgIDcgIDYgIDUgIDQgIDMgIDIgIDEKKzE6CQlzdWJzCXIxLCByMSwgIzgJCUAgLTEgLTIgLTMgLTQgLTUgLTYgLTcKK1VTRVIoCQlzdHJwbHQJcjIsIFtyMF0sICM0KQorVVNFUigJCXN0cnBsdAlyMiwgW3IwXSwgIzQpCisJCWJwbAkxYgorCQlhZGRzCXIxLCByMSwgIzQJCUAgIDMgIDIgIDEgIDAgLTEgLTIgLTMKK1VTRVIoCQlzdHJwbHQJcjIsIFtyMF0sICM0KQorMjoJCXRzdAlyMSwgIzIJCQlAIDF4IDF4IDB4IDB4IDF4IDF4IDB4CitVU0VSKAkJc3RybmVidAlyMiwgW3IwXSwgIzEpCitVU0VSKAkJc3RybmVidAlyMiwgW3IwXSwgIzEpCisJCXRzdAlyMSwgIzEJCQlAIHgxIHgwIHgxIHgwIHgxIHgwIHgxCitVU0VSKAkJc3RybmVidAlyMiwgW3IwXSwgIzEpCisJCW1vdglyMCwgIzAKKwkJTE9BRFJFR1MoZmQsc3AhLCB7cjEsIHBjfSkKKworCQkuc2VjdGlvbiAuZml4dXAsImF4IgorCQkuYWxpZ24JMAorOTAwMToJCUxPQURSRUdTKGZkLHNwISwge3IwLCBwY30pCisJCS5wcmV2aW91cworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvdWNtcGRpMi5jIGIvYXJjaC9hcm0vbGliL3VjbXBkaTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZhZTYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbGliL3VjbXBkaTIuYwpAQCAtMCwwICsxLDUxIEBACisvKiBNb3JlIHN1YnJvdXRpbmVzIG5lZWRlZCBieSBHQ0Mgb3V0cHV0IGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk4OSwgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggb3RoZXIgZmlsZXMsCisgICBzb21lIG9mIHdoaWNoIGFyZSBjb21waWxlZCB3aXRoIEdDQywgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAorICAgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUKKyAgIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQorICAgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworLyogc3VwcG9ydCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGtlcm5lbC4gYmFzZWQgb24gY29kZSBmcm9tIGdjYy0yLjk1LjMgKi8KKy8qIEkgTW9sdG9uICAgICAyOS8wNy8wMSAqLworCisjaW5jbHVkZSAiZ2NjbGliLmgiCisKK3dvcmRfdHlwZQorX191Y21wZGkyIChESXR5cGUgYSwgREl0eXBlIGIpCit7CisgIERJdW5pb24gYXUsIGJ1OworCisgIGF1LmxsID0gYSwgYnUubGwgPSBiOworCisgIGlmICgoVVNJdHlwZSkgYXUucy5oaWdoIDwgKFVTSXR5cGUpIGJ1LnMuaGlnaCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoKFVTSXR5cGUpIGF1LnMuaGlnaCA+IChVU0l0eXBlKSBidS5zLmhpZ2gpCisgICAgcmV0dXJuIDI7CisgIGlmICgoVVNJdHlwZSkgYXUucy5sb3cgPCAoVVNJdHlwZSkgYnUucy5sb3cpCisgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYgKChVU0l0eXBlKSBhdS5zLmxvdyA+IChVU0l0eXBlKSBidS5zLmxvdykKKyAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi91ZGl2ZGkzLmMgYi9hcmNoL2FybS9saWIvdWRpdmRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNTE5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvdWRpdmRpMy5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiBNb3JlIHN1YnJvdXRpbmVzIG5lZWRlZCBieSBHQ0Mgb3V0cHV0IGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk4OSwgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggb3RoZXIgZmlsZXMsCisgICBzb21lIG9mIHdoaWNoIGFyZSBjb21waWxlZCB3aXRoIEdDQywgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAorICAgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUKKyAgIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQorICAgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworLyogc3VwcG9ydCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGtlcm5lbC4gYmFzZWQgb24gY29kZSBmcm9tIGdjYy0yLjk1LjMgKi8KKy8qIEkgTW9sdG9uICAgICAyOS8wNy8wMSAqLworCisjaW5jbHVkZSAiZ2NjbGliLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworc3RhdGljIGNvbnN0IFVRSXR5cGUgX19jbHpfdGFiW10gPQoreworICAwLDEsMiwyLDMsMywzLDMsNCw0LDQsNCw0LDQsNCw0LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsCisgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKyAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKyAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAorICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCisgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKK307CisKK1VESXR5cGUKK19fdWRpdm1vZGRpNCAoVURJdHlwZSBuLCBVREl0eXBlIGQsIFVESXR5cGUgKnJwKQoreworICBESXVuaW9uIHd3OworICBESXVuaW9uIG5uLCBkZDsKKyAgREl1bmlvbiBycjsKKyAgVVNJdHlwZSBkMCwgZDEsIG4wLCBuMSwgbjI7CisgIFVTSXR5cGUgcTAsIHExOworICBVU0l0eXBlIGIsIGJtOworCisgIG5uLmxsID0gbjsKKyAgZGQubGwgPSBkOworCisgIGQwID0gZGQucy5sb3c7CisgIGQxID0gZGQucy5oaWdoOworICBuMCA9IG5uLnMubG93OworICBuMSA9IG5uLnMuaGlnaDsKKworICBpZiAoZDEgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZDAgPiBuMSkKKyAgICAgICAgeworICAgICAgICAgIC8qIDBxID0gbm4gLyAwRCAqLworCisgICAgICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAoYm0sIGQwKTsKKworICAgICAgICAgIGlmIChibSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBOb3JtYWxpemUsIGkuZS4gbWFrZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlCisgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yIHNldC4gICovCisKKyAgICAgICAgICAgICAgZDAgPSBkMCA8PCBibTsKKyAgICAgICAgICAgICAgbjEgPSAobjEgPDwgYm0pIHwgKG4wID4+IChTSV9UWVBFX1NJWkUgLSBibSkpOworICAgICAgICAgICAgICBuMCA9IG4wIDw8IGJtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgdWRpdl9xcm5uZCAocTAsIG4wLCBuMSwgbjAsIGQwKTsKKyAgICAgICAgICBxMSA9IDA7CisKKyAgICAgICAgICAvKiBSZW1haW5kZXIgaW4gbjAgPj4gYm0uICAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBxcSA9IE5OIC8gMGQgKi8KKworICAgICAgICAgIGlmIChkMCA9PSAwKQorICAgICAgICAgICAgZDAgPSAxIC8gZDA7ICAgICAgICAvKiBEaXZpZGUgaW50ZW50aW9uYWxseSBieSB6ZXJvLiAgKi8KKworICAgICAgICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGJtLCBkMCk7CisKKyAgICAgICAgICBpZiAoYm0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRnJvbSAobjEgPj0gZDApIC9cICh0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgZDAgaXMgc2V0KSwKKyAgICAgICAgICAgICAgICAgY29uY2x1ZGUgKHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBuMSBpcyBzZXQpIC9cICh0aGUKKyAgICAgICAgICAgICAgICAgbGVhZGluZyBxdW90aWVudCBkaWdpdCBxMSA9IDEpLgorCisgICAgICAgICAgICAgICAgIFRoaXMgc3BlY2lhbCBjYXNlIGlzIG5lY2Vzc2FyeSwgbm90IGFuIG9wdGltaXphdGlvbi4KKyAgICAgICAgICAgICAgICAgKFNoaWZ0cyBjb3VudHMgb2YgU0lfVFlQRV9TSVpFIGFyZSB1bmRlZmluZWQuKSAgKi8KKworICAgICAgICAgICAgICBuMSAtPSBkMDsKKyAgICAgICAgICAgICAgcTEgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTm9ybWFsaXplLiAgKi8KKworICAgICAgICAgICAgICBiID0gU0lfVFlQRV9TSVpFIC0gYm07CisKKyAgICAgICAgICAgICAgZDAgPSBkMCA8PCBibTsKKyAgICAgICAgICAgICAgbjIgPSBuMSA+PiBiOworICAgICAgICAgICAgICBuMSA9IChuMSA8PCBibSkgfCAobjAgPj4gYik7CisgICAgICAgICAgICAgIG4wID0gbjAgPDwgYm07CisKKyAgICAgICAgICAgICAgdWRpdl9xcm5uZCAocTEsIG4xLCBuMiwgbjEsIGQwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIG4xICE9IGQwLi4uICAqLworCisgICAgICAgICAgdWRpdl9xcm5uZCAocTAsIG4wLCBuMSwgbjAsIGQwKTsKKworICAgICAgICAgIC8qIFJlbWFpbmRlciBpbiBuMCA+PiBibS4gICovCisgICAgICAgIH0KKworICAgICAgaWYgKHJwICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICByci5zLmxvdyA9IG4wID4+IGJtOworICAgICAgICAgIHJyLnMuaGlnaCA9IDA7CisgICAgICAgICAgKnJwID0gcnIubGw7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZDEgPiBuMSkKKyAgICAgICAgeworICAgICAgICAgIC8qIDAwID0gbm4gLyBERCAqLworCisgICAgICAgICAgcTAgPSAwOworICAgICAgICAgIHExID0gMDsKKworICAgICAgICAgIC8qIFJlbWFpbmRlciBpbiBuMW4wLiAgKi8KKyAgICAgICAgICBpZiAocnAgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcnIucy5sb3cgPSBuMDsKKyAgICAgICAgICAgICAgcnIucy5oaWdoID0gbjE7CisgICAgICAgICAgICAgICpycCA9IHJyLmxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiAwcSA9IE5OIC8gZGQgKi8KKworICAgICAgICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGJtLCBkMSk7CisgICAgICAgICAgaWYgKGJtID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEZyb20gKG4xID49IGQxKSAvXCAodGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGQxIGlzIHNldCksCisgICAgICAgICAgICAgICAgIGNvbmNsdWRlICh0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgbjEgaXMgc2V0KSAvXCAodGhlCisgICAgICAgICAgICAgICAgIHF1b3RpZW50IGRpZ2l0IHEwID0gMCBvciAxKS4KKworICAgICAgICAgICAgICAgICBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWNlc3NhcnksIG5vdCBhbiBvcHRpbWl6YXRpb24uICAqLworCisgICAgICAgICAgICAgIC8qIFRoZSBjb25kaXRpb24gb24gdGhlIG5leHQgbGluZSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhhdAorICAgICAgICAgICAgICAgICBuMSA+PSBkMSAodHJ1ZSBkdWUgdG8gcHJvZ3JhbSBmbG93KS4gICovCisgICAgICAgICAgICAgIGlmIChuMSA+IGQxIHx8IG4wID49IGQwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHEwID0gMTsKKyAgICAgICAgICAgICAgICAgIHN1Yl9kZG1tc3MgKG4xLCBuMCwgbjEsIG4wLCBkMSwgZDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHEwID0gMDsKKworICAgICAgICAgICAgICBxMSA9IDA7CisKKyAgICAgICAgICAgICAgaWYgKHJwICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcnIucy5sb3cgPSBuMDsKKyAgICAgICAgICAgICAgICAgIHJyLnMuaGlnaCA9IG4xOworICAgICAgICAgICAgICAgICAgKnJwID0gcnIubGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVVNJdHlwZSBtMSwgbTA7CisgICAgICAgICAgICAgIC8qIE5vcm1hbGl6ZS4gICovCisKKyAgICAgICAgICAgICAgYiA9IFNJX1RZUEVfU0laRSAtIGJtOworCisgICAgICAgICAgICAgIGQxID0gKGQxIDw8IGJtKSB8IChkMCA+PiBiKTsKKyAgICAgICAgICAgICAgZDAgPSBkMCA8PCBibTsKKyAgICAgICAgICAgICAgbjIgPSBuMSA+PiBiOworICAgICAgICAgICAgICBuMSA9IChuMSA8PCBibSkgfCAobjAgPj4gYik7CisgICAgICAgICAgICAgIG4wID0gbjAgPDwgYm07CisKKyAgICAgICAgICAgICAgdWRpdl9xcm5uZCAocTAsIG4xLCBuMiwgbjEsIGQxKTsKKyAgICAgICAgICAgICAgdW11bF9wcG1tIChtMSwgbTAsIHEwLCBkMCk7CisKKyAgICAgICAgICAgICAgaWYgKG0xID4gbjEgfHwgKG0xID09IG4xICYmIG0wID4gbjApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHEwLS07CisgICAgICAgICAgICAgICAgICBzdWJfZGRtbXNzIChtMSwgbTAsIG0xLCBtMCwgZDEsIGQwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcTEgPSAwOworCisgICAgICAgICAgICAgIC8qIFJlbWFpbmRlciBpbiAobjFuMCAtIG0xbTApID4+IGJtLiAgKi8KKyAgICAgICAgICAgICAgaWYgKHJwICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3ViX2RkbW1zcyAobjEsIG4wLCBuMSwgbjAsIG0xLCBtMCk7CisgICAgICAgICAgICAgICAgICByci5zLmxvdyA9IChuMSA8PCBiKSB8IChuMCA+PiBibSk7CisgICAgICAgICAgICAgICAgICByci5zLmhpZ2ggPSBuMSA+PiBibTsKKyAgICAgICAgICAgICAgICAgICpycCA9IHJyLmxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICB3dy5zLmxvdyA9IHEwOworICB3dy5zLmhpZ2ggPSBxMTsKKyAgcmV0dXJuIHd3LmxsOworfQorCitVREl0eXBlCitfX3VkaXZkaTMgKFVESXR5cGUgbiwgVURJdHlwZSBkKQoreworICByZXR1cm4gX191ZGl2bW9kZGk0IChuLCBkLCAoVURJdHlwZSAqKSAwKTsKK30KKworVURJdHlwZQorX191bW9kZGkzIChVREl0eXBlIHUsIFVESXR5cGUgdikKK3sKKyAgVURJdHlwZSB3OworCisgICh2b2lkKSBfX3VkaXZtb2RkaTQgKHUgLHYsICZ3KTsKKworICByZXR1cm4gdzsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTY3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L0tjb25maWcKQEAgLTAsMCArMSw3MSBAQAoraWYgQVJDSF9DTFBTNzExWAorCittZW51ICJDTFBTNzExWC9FUDcyMVggSW1wbGVtZW50YXRpb25zIgorCitjb25maWcgQVJDSF9BVVRDUFUxMgorCWJvb2wgIkFVVENQVTEyIgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoZSBrZXJuZWwgb24gdGhlIGF1dHJvbml4IGF1dGNwdTEyCisJICBib2FyZC4gVGhpcyBib2FyZCBpcyBiYXNlZCBvbiBhIENpcnJ1cyBMb2dpYyBDUzg5NzEyLgorCitjb25maWcgQVJDSF9DREI4OTcxMgorCWJvb2wgIkNEQjg5NzEyIgorCWhlbHAKKwkgIFRoaXMgaXMgYW4gZXZhbHVhdGlvbiBib2FyZCBmcm9tIENpcnJ1cyBmb3IgdGhlIENTODk3MTIgcHJvY2Vzc29yLgorCSAgVGhlIGJvYXJkIGluY2x1ZGVzIDIgc2VyaWFsIHBvcnRzLCBFdGhlcm5ldCwgSVJEQSwgYW5kIGV4cGFuc2lvbgorCSAgaGVhZGVycy4gIEl0IGNvbWVzIHdpdGggMTYgTUIgU0RSQU0gYW5kIDggTUIgZmxhc2ggUk9NLgorCitjb25maWcgQVJDSF9DRUlWQQorCWJvb2wgIkNFSVZBIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gdGhlIENlaXZhL1BvbGFyb2lkCisJICBQaG90b01heCBEaWdpdGFsIFBpY3R1cmUgRnJhbWUuCisKK2NvbmZpZyBBUkNIX0NMRVA3MzEyCisJYm9vbCAiQ0xFUDczMTIiCisKK2NvbmZpZyBBUkNIX0VEQjcyMTEKKwlib29sICJFREI3MjExIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gYSBDaXJydXMgTG9naWMgRURCLTcyMTEKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBBUkNIX1A3MjBUCisJYm9vbCAiUDcyMFQiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiB0aGUgQVJNIFByb3NwZWN0b3IKKwkgIDcyMFQuCisKK2NvbmZpZyBBUkNIX0ZPUlRVTkVUCisJYm9vbCAiRk9SVFVORVQiCisKKyMgWFhYIE1heWJlIHRoZXNlIHNob3VsZCBpbmRpY2F0ZSByZWdpc3RlciBjb21wYXRpYmlsaXR5CisjIGluc3RlYWQgb2YgYmVpbmcgbXV0dWFsbHkgZXhjbHVzaXZlLgorY29uZmlnIEFSQ0hfRVA3MjExCisJYm9vbAorCWRlcGVuZHMgb24gQVJDSF9FREI3MjExCisJZGVmYXVsdCB5CisKK2NvbmZpZyBBUkNIX0VQNzIxMgorCWJvb2wKKwlkZXBlbmRzIG9uIEFSQ0hfUDcyMFQgfHwgQVJDSF9DRUlWQQorCWRlZmF1bHQgeQorCitjb25maWcgRVA3MlhYX1JPTV9CT09UCisJYm9vbCAiRVA3Mnh4IFJPTSBib290IgorCWRlcGVuZHMgb24gQVJDSF9FUDcyMTEgfHwgQVJDSF9FUDcyMTIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91ciBDTFBTNzExeC1iYXNlZCBrZXJuZWwgd2lsbCB1c2UgdGhlIGJvb3RzdHJhcAorCSAgbW9kZSBtZW1vcnkgbWFwIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZW1vcnkgbWFwLgorCisJICBQcm9jZXNzb3JzIGRlcml2ZWQgZnJvbSB0aGUgQ2lycnVzIENMUFMtNzExWCBjb3JlIHN1cHBvcnQgdHdvIGJvb3QKKwkgIG1vZGVzLiAgTm9ybWFsIG1vZGUgYm9vdHMgZnJvbSB0aGUgZXh0ZXJuYWwgbWVtb3J5IGRldmljZSBhdCBDUzAuCisJICBCb290c3RyYXAgbW9kZSByZWFycmFuZ2VzIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFwLCBwbGFjaW5nIGFuCisJICBpbnRlcm5hbCAxMjggYnl0ZSBib290c3RyYXAgUk9NIGF0IENTMC4gIFRoaXMgb3B0aW9uIHBlcmZvcm1zIHRoZQorCSAgYWRkcmVzcyBtYXAgY2hhbmdlcyByZXF1aXJlZCB0byBzdXBwb3J0IGJvb3RpbmcgaW4gdGhpcyBtb2RlLgorCisJICBZb3UgYWxtb3N0IHN1cmVseSB3YW50IHRvIHNheSBOIGhlcmUuCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTk3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJOj0gaXJxLm8gbW0ubyB0aW1lLm8KK29iai1tCQkJOj0KK29iai1uCQkJOj0KK29iai0JCQk6PQorCitvYmotJChDT05GSUdfQVJDSF9DRUlWQSkgKz0gY2VpdmEubworb2JqLSQoQ09ORklHX0FSQ0hfQVVUQ1BVMTIpICs9IGF1dGNwdTEyLm8KK29iai0kKENPTkZJR19BUkNIX0NEQjg5NzEyKSArPSBjZGI4OTcxMi5vCitvYmotJChDT05GSUdfQVJDSF9DTEVQNzMxMikgKz0gY2xlcDczMTIubworb2JqLSQoQ09ORklHX0FSQ0hfRURCNzIxMSkgICs9IGVkYjcyMTEtYXJjaC5vIGVkYjcyMTEtbW0ubworb2JqLSQoQ09ORklHX0FSQ0hfRk9SVFVORVQpICs9IGZvcnR1bmV0Lm8KK29iai0kKENPTkZJR19BUkNIX1A3MjBUKSAgICArPSBwNzIwdC5vCitsZWRzLSQoQ09ORklHX0FSQ0hfUDcyMFQpICAgKz0gcDcyMHQtbGVkcy5vCitvYmotJChDT05GSUdfTEVEUykgICAgICAgICAgKz0gJChsZWRzLXkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkMjkzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDcgQEAKKyMgVGhlIHN0YW5kYXJkIGxvY2F0aW9ucyBmb3Igc3R1ZmYgb24gQ0xQUzcxMXggdHlwZSBwcm9jZXNzb3JzCisgICB6cmVsYWRkci15CQkJCTo9IDB4YzAwMjgwMDAgCitwYXJhbXNfcGh5cy15CQkJCTo9IDB4YzAwMDAxMDAKKyMgU2hvdWxkIHByb2JhYmx5IGhhdmUgc29tZSBhZ3JlZW1lbnQgb24gdGhlc2UuLi4KK2luaXRyZF9waHlzLSQoQ09ORklHX0FSQ0hfUDcyMFQpCTo9IDB4YzA0MDAwMDAKK2luaXRyZF9waHlzLSQoQ09ORklHX0FSQ0hfQ0RCODk3MTIpCTo9IDB4MDA3MDAwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDY3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKKyAqCisgKiAoYykgMjAwMSBUaG9tYXMgR2xlaXhuZXIsIGF1dHJvbml4IGF1dG9tYXRpb24gPGdsZWl4bmVyQGF1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdXRjcHUxMi5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qCisgKiBUaGUgb24tY2hpcCByZWdpc3RlcnMgYXJlIGdpdmVuIGEgc2l6ZSBvZiAxTUIgc28gdGhhdCBhIHNlY3Rpb24gY2FuCisgKiBiZSB1c2VkIHRvIG1hcCB0aGVtOyB0aGlzIHNhdmVzIGEgcGFnZSB0YWJsZS4gIFRoaXMgaXMgdGhlIHBsYWNlIHRvCisgKiBhZGQgbWFwcGluZ3MgZm9yIFJPTSwgZXhwYW5zaW9uIG1lbW9yeSwgUENNQ0lBLCBldGMuICAoaWYgc3RhdGljCisgKiBtYXBwaW5ncyBhcmUgY2hvc2VuIGZvciB0aG9zZSBhcmVhcykuCisgKgorKi8KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdXRjcHUxMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsLCBwaHlzaWNhbCwgbGVuZ3RoLCB0eXBlICovCisgLyogbWVtb3J5LW1hcHBlZCBleHRyYSBpbyBhbmQgQ1M4OTAwQSBFdGhlcm5ldCBjaGlwICovCisgLyogZXRoZXJuZXQgY2hpcCAqLworIAl7IEFVVENQVTEyX1ZJUlRfQ1M4OTAwQSwgQVVUQ1BVMTJfUEhZU19DUzg5MDBBLCBTWl8xTSwgTVRfREVWSUNFIH0KK307CisKK3ZvaWQgX19pbml0IGF1dGNwdTEyX21hcF9pbyh2b2lkKQoreworICAgICAgICBjbHBzNzExeF9tYXBfaW8oKTsKKyAgICAgICAgaW90YWJsZV9pbml0KGF1dGNwdTEyX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXV0Y3B1MTJfaW9fZGVzYykpOworfQorCitNQUNISU5FX1NUQVJUKEFVVENQVTEyLCAiYXV0cm9uaXggYXV0Y3B1MTIiKQorCU1BSU5UQUlORVIoIlRob21hcyBHbGVpeG5lciIpCisgICAgICAgIEJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZmYwMDAwMDApCisJQk9PVF9QQVJBTVMoMHhjMDAyMDAwMCkKKwlNQVBJTyhhdXRjcHUxMl9tYXBfaW8pCisJSU5JVElSUShjbHBzNzExeF9pbml0X2lycSkKKwkudGltZXIJCT0gJmNscHM3MTF4X3RpbWVyLAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjRmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qCisgKiBNYXAgdGhlIENTODk3MTIgRXRoZXJuZXQgcG9ydC4gIFRoYXQgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZQorICogZXRoZXJuZXQgZHJpdmVyLCBwZXJoYXBzLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGNkYjg5NzEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsgRVRIRVJfQkFTRSwgRVRIRVJfU1RBUlQsIEVUSEVSX1NJWkUsIE1UX0RFVklDRSB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY2RiODk3MTJfbWFwX2lvKHZvaWQpCit7CisJY2xwczcxMXhfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KGNkYjg5NzEyX2lvX2Rlc2MsIEFSUkFZX1NJWkUoY2RiODk3MTJfaW9fZGVzYykpOworfQorCitNQUNISU5FX1NUQVJUKENEQjg5NzEyLCAiQ2lycnVzLUNEQjg5NzEyIikKKwlNQUlOVEFJTkVSKCJSYXkgTGVodGluaWVtaSIpCisJQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmZjAwMDAwMCkKKwlCT09UX1BBUkFNUygweGMwMDAwMTAwKQorCU1BUElPKGNkYjg5NzEyX21hcF9pbykKKwlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDkzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2FyY2gtY2VpdmEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIFJvYiBTY290dCA8cnNjb3R0QG10cm9iLmZkbnMubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgY2VpdmFfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgLyogdmlydHVhbCwgcGh5c2ljYWwsIGxlbmd0aCwgdHlwZSAqLworCisgLyogU0VEMTM1NSBjb250cm9sbGVkIHZpZGVvIFJBTSAmIHJlZ2lzdGVycyAqLworIHsgQ0VJVkFfVklSVF9TRUQxMzU1LCBDRUlWQV9QSFlTX1NFRDEzNTUsIFNaXzJNLCBNVF9ERVZJQ0UgfQorCit9OworCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjZWl2YV9tYXBfaW8odm9pZCkKK3sKKyAgICAgICAgY2xwczcxMXhfbWFwX2lvKCk7CisgICAgICAgIGlvdGFibGVfaW5pdChjZWl2YV9pb19kZXNjLCBBUlJBWV9TSVpFKGNlaXZhX2lvX2Rlc2MpKTsKK30KKworCitNQUNISU5FX1NUQVJUKENFSVZBLCAiQ0VJVkEvUG9sYXJvaWQgUGhvdG8gTUFYIERpZ2l0YWwgUGljdHVyZSBGcmFtZSIpCisJTUFJTlRBSU5FUigiUm9iIFNjb3R0IikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGZmMDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8oY2VpdmFfbWFwX2lvKQorCUlOSVRJUlEoY2xwczcxMXhfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMjFjYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHZvaWQgX19pbml0CitmaXh1cF9jbGVwNzMxMihzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLAorCSAgICBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCW1pLT5ucl9iYW5rcz0xOworCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHhjMDAwMDAwMDsKKwltaS0+YmFua1swXS5zaXplID0gMHgwMTAwMDAwMDsKKwltaS0+YmFua1swXS5ub2RlID0gMDsKK30KKworCitNQUNISU5FX1NUQVJUKENMRVA3MjEyLCAiQ2lycnVzIExvZ2ljIDcyMTIvNzMxMiIpCisJTUFJTlRBSU5FUigiTm9ib2R5IikKKyAgICAgICAgQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmZjAwMDAwMCkKKwlCT09UX1BBUkFNUygweGMwMDAwMTAwKQorCUZJWFVQKGZpeHVwX2NsZXA3MzEyKQorCU1BUElPKGNscHM3MTF4X21hcF9pbykKKwlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhiODAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jb21tb24uaApAQCAtMCwwICsxLDExIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jb21tb24uaAorICoKKyAqIENvbW1vbiBiaXRzLgorICovCisKK3N0cnVjdCBzeXNfdGltZXI7CisKK2V4dGVybiB2b2lkIGNscHM3MTF4X21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIGNscHM3MTF4X2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgY2xwczcxMXhfdGltZXI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjVhNGRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9kbWEuYwpAQCAtMCwwICsxLDI3IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZG1hLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2RtYS5oPgorCit2b2lkIF9faW5pdCBhcmNoX2RtYV9pbml0KGRtYV90ICpkbWEpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtYXJjaC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmM0NjMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXJjaC1lZGI3MjExLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIEJsdWUgTXVnLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworZXh0ZXJuIHZvaWQgZWRiNzIxMV9tYXBfaW8odm9pZCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZml4dXBfZWRiNzIxMShzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLAorCSAgICAgIGNoYXIgKipjbWRsaW5lLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJLyoKKwkgKiBCYW5rIHN0YXJ0IGFkZHJlc3NlcyBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGluZm9ybWF0aW9uCisJICogcGFzc2VkIGluIGZyb20gdGhlIGJvb3QgbG9hZGVyLiAgV2UgY291bGQgcG90ZW50aWFsbHkKKwkgKiBkZXRlY3QgdGhlbSwgYnV0IGluc3RlYWQgd2UgaGFyZC1jb2RlIHRoZW0uCisJICoKKwkgKiBCYW5rcyBzaXplcyBfYXJlXyBwcmVzZW50IGluIHRoZSBwYXJhbSBibG9jaywgYnV0IHdlJ3JlCisJICogbm90IHVzaW5nIHRoYXQgaW5mb3JtYXRpb24geWV0LgorCSAqLworCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHhjMDAwMDAwMDsKKwltaS0+YmFua1swXS5zaXplID0gOCoxMDI0KjEwMjQ7CisJbWktPmJhbmtbMF0ubm9kZSA9IDA7CisJbWktPmJhbmtbMV0uc3RhcnQgPSAweGMxMDAwMDAwOworCW1pLT5iYW5rWzFdLnNpemUgPSA4KjEwMjQqMTAyNDsKKwltaS0+YmFua1sxXS5ub2RlID0gMTsKKwltaS0+bnJfYmFua3MgPSAyOworfQorCitNQUNISU5FX1NUQVJUKEVEQjcyMTEsICJDTC1FREI3MjExIChFUDcyMTEgZXZhbCBib2FyZCkiKQorCU1BSU5UQUlORVIoIkpvbiBNY0NsaW50b2NrIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGZmMDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMjAxMDApCS8qIDB4YzAwMDAwMDAgLSAweGMwMDFmZmZmIGNhbiBiZSB2aWRlbyBSQU0gKi8KKwlGSVhVUChmaXh1cF9lZGI3MjExKQorCU1BUElPKGVkYjcyMTFfbWFwX2lvKQorCUlOSVRJUlEoY2xwczcxMXhfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDdiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvbW0uYworICoKKyAqICBFeHRyYSBNTSByb3V0aW5lcyBmb3IgdGhlIEVEQjcyMTEgYm9hcmQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIEJsdWUgTXVnLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyAKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworZXh0ZXJuIHZvaWQgY2xwczcxMXhfbWFwX2lvKHZvaWQpOworCisvKgorICogVGhlIG9uLWNoaXAgcmVnaXN0ZXJzIGFyZSBnaXZlbiBhIHNpemUgb2YgMU1CIHNvIHRoYXQgYSBzZWN0aW9uIGNhbgorICogYmUgdXNlZCB0byBtYXAgdGhlbTsgdGhpcyBzYXZlcyBhIHBhZ2UgdGFibGUuICBUaGlzIGlzIHRoZSBwbGFjZSB0bworICogYWRkIG1hcHBpbmdzIGZvciBST00sIGV4cGFuc2lvbiBtZW1vcnksIFBDTUNJQSwgZXRjLiAgKGlmIHN0YXRpYworICogbWFwcGluZ3MgYXJlIGNob3NlbiBmb3IgdGhvc2UgYXJlYXMpLgorICoKKyAqIEhlcmUgaXMgYSBwaHlzaWNhbCBtZW1vcnkgbWFwICh0byBiZSBmbGVzaGVkIG91dCBsYXRlcik6CisgKgorICogUGh5c2ljYWwgQWRkcmVzcyAgU2l6ZSAgRGVzY3JpcHRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYzAwMDAwMDAtYzAwMWZmZmYgMTI4S0IgcmVzZXJ2ZWQgZm9yIHZpZGVvIFJBTSBbMV0KKyAqIGMwMDIwMDAwLWMwMDIzZmZmICAxNktCIHBhcmFtZXRlcnMgKHNlZSBEb2N1bWVudGF0aW9uL2FybS9TZXR1cCkKKyAqIGMwMDI0MDAwLWMwMDI3ZmZmICAxNktCIHN3YXBwZXJfcGdfZGlyICh0YXNrIDAgcGFnZSBkaXJlY3RvcnkpCisgKiBjMDAyODAwMC0uLi4gICAgICAgICAgICBrZXJuZWwgaW1hZ2UgKFRFWFRBRERSKQorICoKKyAqIFsxXSBVbnVzZWQgcGFnZXMgc2hvdWxkIGJlIGdpdmVuIGJhY2sgdG8gdGhlIFZNOyB0aGV5IGFyZSBub3QgeWV0LgorICogICAgIFRoZSBwYXJhbWV0ZXIgYmxvY2sgc2hvdWxkIGFsc28gYmUgcmVsZWFzZWQgKG5vdCBzdXJlIGlmIHRoaXMKKyAqICAgICBoYXBwZW5zKS4KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBlZGI3MjExX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIC8qIHZpcnR1YWwsIHBoeXNpY2FsLCBsZW5ndGgsIHR5cGUgKi8KKworIC8qIG1lbW9yeS1tYXBwZWQgZXh0cmEga2V5Ym9hcmQgcm93IGFuZCBDUzg5MDBBIEV0aGVybmV0IGNoaXAgKi8KKyB7IEVQNzIxMV9WSVJUX0VYVEtCRCwgIEVQNzIxMV9QSFlTX0VYVEtCRCwgIFNaXzFNLCBNVF9ERVZJQ0UgfSwgCisgeyBFUDcyMTFfVklSVF9DUzg5MDBBLCBFUDcyMTFfUEhZU19DUzg5MDBBLCBTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAvKiBmbGFzaCBiYW5rcyAqLworIHsgRVA3MjExX1ZJUlRfRkxBU0gxLCAgRVA3MjExX1BIWVNfRkxBU0gxLCAgU1pfOE0sIE1UX0RFVklDRSB9LAorIHsgRVA3MjExX1ZJUlRfRkxBU0gyLCAgRVA3MjExX1BIWVNfRkxBU0gyLCAgU1pfOE0sIE1UX0RFVklDRSB9Cit9OworCit2b2lkIF9faW5pdCBlZGI3MjExX21hcF9pbyh2b2lkKQoreworICAgICAgICBjbHBzNzExeF9tYXBfaW8oKTsKKyAgICAgICAgaW90YWJsZV9pbml0KGVkYjcyMTFfaW9fZGVzYywgQVJSQVlfU0laRShlZGI3MjExX2lvX2Rlc2MpKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzViOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKKyAqCisgKiAgRGVyaXZlZCBmcm9tIGxpbnV4L2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9hcmNoLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdHJ1Y3QgbWVtaW5mbyBtZW1tYXAgPSB7CisJLm5yX2JhbmtzCT0gMSwKKwkuYmFuawkJPSB7CisJCXsKKwkJCS5zdGFydAk9IDB4QzAwMDAwMDAsCisJCQkuc2l6ZQk9IDB4MDEwMDAwMDAsCisJCQkubm9kZQk9IDAKKwkJfSwKKwl9LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX0lNQUdFX1BBUkFNUworeworCWludAlyYW1kaXNrX29rOworCWludAlyYW1kaXNrX2FkZHJlc3M7CisJaW50CXJhbWRpc2tfc2l6ZTsKKwlpbnQJcmFtX3NpemU7CisJaW50CWV4dHJhX3BhcmFtX3R5cGU7CisJaW50CWV4dHJhX3BhcmFtX3B0cjsKKwlpbnQJY29tbWFuZF9saW5lOworfSBJTUFHRV9QQVJBTVM7CisKKyNkZWZpbmUgSU1BR0VfUEFSQU1TX1BIWVMJMHhDMDFGMDAwMAorCitzdGF0aWMgdm9pZCBfX2luaXQKK2ZvcnR1bmV0X2ZpeHVwKHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MsIHN0cnVjdCB0YWcgKnRhZ3MsCisJCSBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCUlNQUdFX1BBUkFNUyAqaXAgPSBwaHlzX3RvX3ZpcnQoSU1BR0VfUEFSQU1TX1BIWVMpOworCSpjbWRsaW5lID0gcGh5c190b192aXJ0KGlwLT5jb21tYW5kX2xpbmUpOworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmKGlwLT5yYW1kaXNrX29rKQorCXsKKwkJaW5pdHJkX3N0YXJ0ID0gX19waHlzX3RvX3ZpcnQoaXAtPnJhbWRpc2tfYWRkcmVzcyk7CisJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBpcC0+cmFtZGlza19zaXplOworCX0KKyNlbmRpZgorCW1lbW1hcC5iYW5rWzBdLnNpemUgPSBpcC0+cmFtX3NpemU7CisJKm1pID0gbWVtbWFwOworfQorCitNQUNISU5FX1NUQVJUKEZPUlRVTkVULCAiQVJNLUZvcnR1TmV0IikKKwlNQUlOVEFJTkVSKCJGb3J0dU5ldCBJbmMuIikKKyAgICAgICAgQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmMDAwMDAwMCkKKwlCT09UX1BBUkFNUygweDAwMDAwMDAwKQorCUZJWFVQKGZvcnR1bmV0X2ZpeHVwKQorCU1BUElPKGNscHM3MTF4X21hcF9pbykKKwlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlOTI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaXJxLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pcnEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgorCitzdGF0aWMgdm9pZCBpbnQxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgaW50bXIxOworCisJaW50bXIxID0gY2xwc19yZWFkbChJTlRNUjEpOworCWludG1yMSAmPSB+KDEgPDwgaXJxKTsKKwljbHBzX3dyaXRlbChpbnRtcjEsIElOVE1SMSk7Cit9CisKK3N0YXRpYyB2b2lkIGludDFfYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIGludG1yMTsKKworCWludG1yMSA9IGNscHNfcmVhZGwoSU5UTVIxKTsKKwlpbnRtcjEgJj0gfigxIDw8IGlycSk7CisJY2xwc193cml0ZWwoaW50bXIxLCBJTlRNUjEpOworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUV9DU0lOVDogIGNscHNfd3JpdGVsKDAsIENPRU9JKTsgIGJyZWFrOworCWNhc2UgSVJRX1RDMU9JOiAgY2xwc193cml0ZWwoMCwgVEMxRU9JKTsgYnJlYWs7CisJY2FzZSBJUlFfVEMyT0k6ICBjbHBzX3dyaXRlbCgwLCBUQzJFT0kpOyBicmVhazsKKwljYXNlIElSUV9SVENNSTogIGNscHNfd3JpdGVsKDAsIFJUQ0VPSSk7IGJyZWFrOworCWNhc2UgSVJRX1RJTlQ6ICAgY2xwc193cml0ZWwoMCwgVEVPSSk7ICAgYnJlYWs7CisJY2FzZSBJUlFfVU1TSU5UOiBjbHBzX3dyaXRlbCgwLCBVTVNFT0kpOyBicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGludDFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIGludG1yMTsKKworCWludG1yMSA9IGNscHNfcmVhZGwoSU5UTVIxKTsKKwlpbnRtcjEgfD0gMSA8PCBpcnE7CisJY2xwc193cml0ZWwoaW50bXIxLCBJTlRNUjEpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgaW50MV9jaGlwID0geworCS5hY2sJPSBpbnQxX2FjaywKKwkubWFzawk9IGludDFfbWFzaywKKwkudW5tYXNrID0gaW50MV91bm1hc2ssCit9OworCitzdGF0aWMgdm9pZCBpbnQyX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgaW50bXIyOworCisJaW50bXIyID0gY2xwc19yZWFkbChJTlRNUjIpOworCWludG1yMiAmPSB+KDEgPDwgKGlycSAtIDE2KSk7CisJY2xwc193cml0ZWwoaW50bXIyLCBJTlRNUjIpOworfQorCitzdGF0aWMgdm9pZCBpbnQyX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBpbnRtcjI7CisKKwlpbnRtcjIgPSBjbHBzX3JlYWRsKElOVE1SMik7CisJaW50bXIyICY9IH4oMSA8PCAoaXJxIC0gMTYpKTsKKwljbHBzX3dyaXRlbChpbnRtcjIsIElOVE1SMik7CisKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgSVJRX0tCRElOVDogY2xwc193cml0ZWwoMCwgS0JERU9JKTsgYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbnQyX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBpbnRtcjI7CisKKwlpbnRtcjIgPSBjbHBzX3JlYWRsKElOVE1SMik7CisJaW50bXIyIHw9IDEgPDwgKGlycSAtIDE2KTsKKwljbHBzX3dyaXRlbChpbnRtcjIsIElOVE1SMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpbnQyX2NoaXAgPSB7CisJLmFjawk9IGludDJfYWNrLAorCS5tYXNrCT0gaW50Ml9tYXNrLAorCS51bm1hc2sgPSBpbnQyX3VubWFzaywKK307CisKK3ZvaWQgX19pbml0IGNscHM3MTF4X2luaXRfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7CisJICAgICAgICBpZiAoSU5UMV9JUlFTICYgKDEgPDwgaSkpIHsKKwkgICAgICAgIAlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkgICAgICAgIAlzZXRfaXJxX2NoaXAoaSwgJmludDFfY2hpcCk7CisJICAgICAgICAJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJCX0KKwkJaWYgKElOVDJfSVJRUyAmICgxIDw8IGkpKSB7CisJCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfY2hpcChpLCAmaW50Ml9jaGlwKTsKKwkJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCQl9CQkJCisJfQorCisJLyoKKwkgKiBEaXNhYmxlIGludGVycnVwdHMKKwkgKi8KKwljbHBzX3dyaXRlbCgwLCBJTlRNUjEpOworCWNscHNfd3JpdGVsKDAsIElOVE1SMik7CisKKwkvKgorCSAqIENsZWFyIGRvd24gYW55IHBlbmRpbmcgaW50ZXJydXB0cworCSAqLworCWNscHNfd3JpdGVsKDAsIENPRU9JKTsKKwljbHBzX3dyaXRlbCgwLCBUQzFFT0kpOworCWNscHNfd3JpdGVsKDAsIFRDMkVPSSk7CisJY2xwc193cml0ZWwoMCwgUlRDRU9JKTsKKwljbHBzX3dyaXRlbCgwLCBURU9JKTsKKwljbHBzX3dyaXRlbCgwLCBVTVNFT0kpOworCWNscHNfd3JpdGVsKDAsIFNZTkNJTyk7CisJY2xwc193cml0ZWwoMCwgS0JERU9JKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvbW0uYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjBiN2NhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9tbS5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9tbS5jCisgKgorICogIEdlbmVyaWMgTU0gc2V0dXAgZm9yIHRoZSBDTFBTNzExeC1iYXNlZCBtYWNoaW5lcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgorCisvKgorICogVGhpcyBtYXBzIHRoZSBnZW5lcmljIENMUFM3MTF4IHJlZ2lzdGVycworICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGNscHM3MTF4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgQ0xQUzcxMTFfVklSVF9CQVNFLAlDTFBTNzExMV9QSFlTX0JBU0UsCTEwNDg1NzYsIE1UX0RFVklDRSB9Cit9OworCit2b2lkIF9faW5pdCBjbHBzNzExeF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQoY2xwczcxMXhfaW9fZGVzYywgQVJSQVlfU0laRShjbHBzNzExeF9pb19kZXNjKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LWxlZHMuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQtbGVkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTViMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LWxlZHMuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvbGVkcy5jCisgKgorICogIEludGVncmF0b3IgTEVEIGNvbnRyb2wgcm91dGluZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9lcDcyMTIuaD4KKworc3RhdGljIHZvaWQgcDcyMHRfbGVkc19ldmVudChsZWRfZXZlbnRfdCBsZWRldnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcGRkcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzd2l0Y2gobGVkZXZ0KSB7CisJY2FzZSBsZWRfaWRsZV9zdGFydDoKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJYnJlYWs7CisKKwljYXNlIGxlZF90aW1lcjoKKwkJcGRkciA9IGNscHNfcmVhZGIoUEREUik7CisJCWNscHNfd3JpdGViKHBkZHIgXiAxLCBQRERSKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxlZHNfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3A3MjB0KCkpCisJCWxlZHNfZXZlbnQgPSBwNzIwdF9sZWRzX2V2ZW50OworCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwobGVkc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI2OWRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzcGxkLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLyoKKyAqIE1hcCB0aGUgUDcyMFQgc3lzdGVtIFBMRC4gIEl0IG9jY3VwaWVzIHR3byBhZGRyZXNzIHNwYWNlczoKKyAqICBTWVNQTERfUEhZU19CQVNFIGFuZCBTWVNQTERfUEhZU19CQVNFICsgMHgwMDQwMDAwMAorICogV2UgbWFwIGJvdGggaGVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBwNzIwdF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7IFNZU1BMRF9WSVJUX0JBU0UsCVNZU1BMRF9QSFlTX0JBU0UsIDEwNDg1NzYsIE1UX0RFVklDRSB9LAorCXsgMHhmZTQwMDAwMCwJCTB4MTA0MDAwMDAsCSAgMTA0ODU3NiwgTVRfREVWSUNFIH0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZml4dXBfcDcyMHQoc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYywgc3RydWN0IHRhZyAqdGFnLAorCSAgICBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCS8qCisJICogT3VyIGJvb3Rsb2FkZXIgZG9lc24ndCBzZXR1cCBhbnkgdGFncyAoeWV0KS4KKwkgKi8KKwlpZiAodGFnLT5oZHIudGFnICE9IEFUQUdfQ09SRSkgeworCQl0YWctPmhkci50YWcgPSBBVEFHX0NPUkU7CisJCXRhZy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfY29yZSk7CisJCXRhZy0+dS5jb3JlLmZsYWdzID0gMDsKKwkJdGFnLT51LmNvcmUucGFnZXNpemUgPSBQQUdFX1NJWkU7CisJCXRhZy0+dS5jb3JlLnJvb3RkZXYgPSAweDAxMDA7CisKKwkJdGFnID0gdGFnX25leHQodGFnKTsKKwkJdGFnLT5oZHIudGFnID0gQVRBR19NRU07CisJCXRhZy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfbWVtMzIpOworCQl0YWctPnUubWVtLnNpemUgPSA0MDk2OworCQl0YWctPnUubWVtLnN0YXJ0ID0gUEhZU19PRkZTRVQ7CisKKwkJdGFnID0gdGFnX25leHQodGFnKTsKKwkJdGFnLT5oZHIudGFnID0gQVRBR19OT05FOworCQl0YWctPmhkci5zaXplID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwNzIwdF9tYXBfaW8odm9pZCkKK3sKKwljbHBzNzExeF9tYXBfaW8oKTsKKwlpb3RhYmxlX2luaXQocDcyMHRfaW9fZGVzYywgQVJSQVlfU0laRShwNzIwdF9pb19kZXNjKSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoUDcyMFQsICJBUk0tUHJvc3BlY3RvcjcyMFQiKQorCU1BSU5UQUlORVIoIkFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQiKQorCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZmYwMDAwMDApCisJQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKKwlGSVhVUChmaXh1cF9wNzIwdCkKKwlNQVBJTyhwNzIwdF9tYXBfaW8pCisJSU5JVElSUShjbHBzNzExeF9pbml0X2lycSkKKwkudGltZXIJCT0gJmNscHM3MTF4X3RpbWVyLAorTUFDSElORV9FTkQKKworc3RhdGljIGludCBwNzIwdF9od19pbml0KHZvaWQpCit7CisJLyoKKwkgKiBQb3dlciBkb3duIGFzIG11Y2ggYXMgcG9zc2libGUgaW4gY2FzZSB3ZSBkb24ndAorCSAqIGhhdmUgdGhlIGRyaXZlcnMgbG9hZGVkLgorCSAqLworCVBMRF9MQ0RFTiA9IDA7CisJUExEX1BXUiAgJj0gfihQTERfUzRfT058UExEX1MzX09OfFBMRF9TMl9PTnxQTERfUzFfT04pOworCisJUExEX0tCRCAgID0gMDsKKwlQTERfSU8gICAgPSAwOworCVBMRF9JUkRBICA9IDA7CisJUExEX0NPREVDID0gMDsKKwlQTERfVENIICAgPSAwOworCVBMRF9TUEkgICA9IDA7CisjaWZuZGVmIENPTkZJR19ERUJVR19MTAorCVBMRF9DT00yICA9IDA7CisJUExEX0NPTTEgID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwocDcyMHRfaHdfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzZDRlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvdGltZS5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC90aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xwczcxMTEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworCisvKgorICogZ2V0dGltZW9mZnNldCgpIHJldHVybnMgdGltZSBzaW5jZSBsYXN0IHRpbWVyIHRpY2ssIGluIHVzZWNzLgorICoKKyAqICdMQVRDSCcgaXMgaHdjbG9jayB0aWNrcyAoc2VlIENMT0NLX1RJQ0tfUkFURSBpbiB0aW1leC5oKSBwZXIgamlmZnkuCisgKiAndGljaycgaXMgdXNlY3MgcGVyIGppZmZ5LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHBzNzExeF9nZXR0aW1lb2Zmc2V0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBod3RpY2tzOworCWh3dGlja3MgPSBMQVRDSCAtIChjbHBzX3JlYWRsKFRDMkQpICYgMHhmZmZmKTsJLyogc2luY2UgbGFzdCB1bmRlcmZsb3cgKi8KKwlyZXR1cm4gKGh3dGlja3MgKiAodGlja19uc2VjIC8gMTAwMCkpIC8gTEFUQ0g7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIHRpbWVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorcDcyMHRfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisJdGltZXJfdGljayhyZWdzKTsKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2xwczcxMXhfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJDTFBTNzExeCBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gcDcyMHRfdGltZXJfaW50ZXJydXB0Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY2xwczcxMXhfdGltZXJfaW5pdCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0djsKKwl1bnNpZ25lZCBpbnQgc3lzY29uOworCisJc3lzY29uID0gY2xwc19yZWFkbChTWVNDT04xKTsKKwlzeXNjb24gfD0gU1lTQ09OMV9UQzJTIHwgU1lTQ09OMV9UQzJNOworCWNscHNfd3JpdGVsKHN5c2NvbiwgU1lTQ09OMSk7CisKKwljbHBzX3dyaXRlbChMQVRDSC0xLCBUQzJEKTsgLyogNTEya0h6IC8gMTAwSHogLSAxICovCisKKwlzZXR1cF9pcnEoSVJRX1RDMk9JLCAmY2xwczcxMXhfdGltZXJfaXJxKTsKKworCXR2LnR2X25zZWMgPSAwOworCXR2LnR2X3NlYyA9IGNscHNfcmVhZGwoUlRDRFIpOworCWRvX3NldHRpbWVvZmRheSgmdHYpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGNscHM3MTF4X3RpbWVyID0geworCS5pbml0CQk9IGNscHM3MTF4X3RpbWVyX2luaXQsCisJLm9mZnNldAkJPSBjbHBzNzExeF9nZXR0aW1lb2Zmc2V0LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDhlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJOj0gY29yZS5vCitvYmotbQkJCTo9CitvYmotbgkJCTo9CitvYmotCQkJOj0KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTY1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSwyIEBACisgICB6cmVsYWRkci15CTo9IDB4MTAwMDgwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZlZGVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFJ1c3NlbGwgS2luZworICogIENvcHlyaWdodCAoQykgMTk5OSBOZXh1cyBFbGVjdHJvbmljcyBMdGQKKyAqCisgKiBFeHRyYSBNTSByb3V0aW5lcyBmb3IgQ0w3NTAwIGFyY2hpdGVjdHVyZQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9tZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCitzdGF0aWMgdm9pZCBjbDc1MDBfYWNrX2lycV9hKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHZhbCwgbWFzazsKKworCW1hc2sgPSAxIDw8IGlycTsKKwl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0EpOworCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0lSUU1BU0tBKTsKKwlpb21kX3dyaXRlYihtYXNrLCBJT01EX0lSUUNMUkEpOworfQorCitzdGF0aWMgdm9pZCBjbDc1MDBfbWFza19pcnFfYSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCBpcnE7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tBKTsKKwlpb21kX3dyaXRlYih2YWwgJiB+bWFzaywgSU9NRF9JUlFNQVNLQSk7Cit9CisKK3N0YXRpYyB2b2lkIGNsNzUwMF91bm1hc2tfaXJxX2EodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOworCisJbWFzayA9IDEgPDwgaXJxOworCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9JUlFNQVNLQSk7CisJaW9tZF93cml0ZWIodmFsIHwgbWFzaywgSU9NRF9JUlFNQVNLQSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBjbHBzNzUwMF9hX2NoaXAgPSB7CisJLmFjawk9IGNsNzUwMF9hY2tfaXJxX2EsCisJLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfYSwKKwkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfYSwKK307CisKK3N0YXRpYyB2b2lkIGNsNzUwMF9tYXNrX2lycV9iKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHZhbCwgbWFzazsKKworCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKwl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0IpOworCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0lSUU1BU0tCKTsKK30KKworc3RhdGljIHZvaWQgY2w3NTAwX3VubWFza19pcnFfYih1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tCKTsKKwlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tCKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGNscHM3NTAwX2JfY2hpcCA9IHsKKwkuYWNrCT0gY2w3NTAwX21hc2tfaXJxX2IsCisJLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfYiwKKwkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfYiwKK307CisKK3N0YXRpYyB2b2lkIGNsNzUwMF9tYXNrX2lycV9jKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHZhbCwgbWFzazsKKworCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKwl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0MpOworCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0lSUU1BU0tDKTsKK30KKworc3RhdGljIHZvaWQgY2w3NTAwX3VubWFza19pcnFfYyh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tDKTsKKwlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tDKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGNscHM3NTAwX2NfY2hpcCA9IHsKKwkuYWNrCT0gY2w3NTAwX21hc2tfaXJxX2MsCisJLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfYywKKwkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfYywKK307CisKK3N0YXRpYyB2b2lkIGNsNzUwMF9tYXNrX2lycV9kKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHZhbCwgbWFzazsKKworCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKwl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0QpOworCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0lSUU1BU0tEKTsKK30KKworc3RhdGljIHZvaWQgY2w3NTAwX3VubWFza19pcnFfZCh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tEKTsKKwlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tEKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGNscHM3NTAwX2RfY2hpcCA9IHsKKwkuYWNrCT0gY2w3NTAwX21hc2tfaXJxX2QsCisJLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfZCwKKwkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfZCwKK307CisKK3N0YXRpYyB2b2lkIGNsNzUwMF9tYXNrX2lycV9kbWEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOworCisJbWFzayA9IDEgPDwgKGlycSAmIDcpOworCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9ETUFNQVNLKTsKKwlpb21kX3dyaXRlYih2YWwgJiB+bWFzaywgSU9NRF9ETUFNQVNLKTsKK30KKworc3RhdGljIHZvaWQgY2w3NTAwX3VubWFza19pcnFfZG1hKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHZhbCwgbWFzazsKKworCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKwl2YWwgPSBpb21kX3JlYWRiKElPTURfRE1BTUFTSyk7CisJaW9tZF93cml0ZWIodmFsIHwgbWFzaywgSU9NRF9ETUFNQVNLKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGNscHM3NTAwX2RtYV9jaGlwID0geworCS5hY2sJPSBjbDc1MDBfbWFza19pcnFfZG1hLAorCS5tYXNrCT0gY2w3NTAwX21hc2tfaXJxX2RtYSwKKwkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfZG1hLAorfTsKKworc3RhdGljIHZvaWQgY2w3NTAwX21hc2tfaXJxX2ZpcSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0ZJUU1BU0spOworCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0ZJUU1BU0spOworfQorCitzdGF0aWMgdm9pZCBjbDc1MDBfdW5tYXNrX2lycV9maXEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOworCisJbWFzayA9IDEgPDwgKGlycSAmIDcpOworCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9GSVFNQVNLKTsKKwlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0ZJUU1BU0spOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgY2xwczc1MDBfZmlxX2NoaXAgPSB7CisJLmFjawk9IGNsNzUwMF9tYXNrX2lycV9maXEsCisJLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfZmlxLAorCS51bm1hc2sJPSBjbDc1MDBfdW5tYXNrX2lycV9maXEsCit9OworCitzdGF0aWMgdm9pZCBjbDc1MDBfbm9fYWN0aW9uKHVuc2lnbmVkIGludCBpcnEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBjbHBzNzUwMF9ub19jaGlwID0geworCS5hY2sJPSBjbDc1MDBfbm9fYWN0aW9uLAorCS5tYXNrCT0gY2w3NTAwX25vX2FjdGlvbiwKKwkudW5tYXNrCT0gY2w3NTAwX25vX2FjdGlvbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycV9pc2EgPSB7IG5vX2FjdGlvbiwgMCwgQ1BVX01BU0tfTk9ORSwgImlzYSIsIE5VTEwsIE5VTEwgfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNscHM3NTAwX2luaXRfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGlycSwgZmxhZ3M7CisKKwlpb21kX3dyaXRlYigwLCBJT01EX0lSUU1BU0tBKTsKKwlpb21kX3dyaXRlYigwLCBJT01EX0lSUU1BU0tCKTsKKwlpb21kX3dyaXRlYigwLCBJT01EX0ZJUU1BU0spOworCWlvbWRfd3JpdGViKDAsIElPTURfRE1BTUFTSyk7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCWZsYWdzID0gSVJRRl9WQUxJRDsKKworCQlpZiAoaXJxIDw9IDYgfHwgKGlycSA+PSA5ICYmIGlycSA8PSAxNSkgfHwKKwkJICAgIChpcnEgPj0gNDggJiYgaXJxIDw9IDU1KSkKKwkJCWZsYWdzIHw9IElSUUZfUFJPQkU7CisKKwkJc3dpdGNoIChpcnEpIHsKKwkJY2FzZSAwIC4uLiA3OgorCQkJc2V0X2lycV9jaGlwKGlycSwgJmNscHM3NTAwX2FfY2hpcCk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgOCAuLi4gMTU6CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmY2xwczc1MDBfYl9jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSAxNiAuLi4gMjI6CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmY2xwczc1MDBfZG1hX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIDI0IC4uLiAzMToKKwkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9jX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIDQwIC4uLiA0NzoKKwkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9kX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIDQ4IC4uLiA1NToKKwkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9ub19jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSA2NCAuLi4gNzI6CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmY2xwczc1MDBfZmlxX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNldHVwX2lycShJUlFfSVNBLCAmaXJxX2lzYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgY2w3NTAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsgSU9fQkFTRSwJSU9fU1RBUlQsCUlPX1NJWkUsICAgIE1UX0RFVklDRSB9LAkvKiBJTyBzcGFjZQkqLworCXsgSVNBX0JBU0UsCUlTQV9TVEFSVCwJSVNBX1NJWkUsICAgTVRfREVWSUNFIH0sCS8qIElTQSBzcGFjZQkqLworCXsgRkxBU0hfQkFTRSwJRkxBU0hfU1RBUlQsCUZMQVNIX1NJWkUsIE1UX0RFVklDRSB9LAkvKiBGbGFzaAkqLworCXsgTEVEX0JBU0UsCUxFRF9TVEFSVCwJTEVEX1NJWkUsICAgTVRfREVWSUNFIH0gCS8qIExFRAkJKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjbHBzNzUwMF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQoY2w3NTAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoY2w3NTAwX2lvX2Rlc2MpKTsKK30KKworZXh0ZXJuIHZvaWQgaW9jdGltZV9pbml0KHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9jX3RpbWVyX2dldHRpbWVvZmZzZXQodm9pZCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorY2xwczc1MDBfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwl0aW1lcl90aWNrKHJlZ3MpOworCisJLyogV2h5IG5vdCB1c2luZyBkb19sZWRzIGludGVyZmFjZT8/ICovCisJeworCQkvKiBUd2lua2xlIHRoZSBsaWdodHMuICovCisJCXN0YXRpYyBpbnQgY291bnQsIHN0YXRlID0gMHhmZjAwOworCQlpZiAoY291bnQtLSA9PSAwKSB7CisJCQlzdGF0ZSBePSAweDEwMDsKKwkJCWNvdW50ID0gMjU7CisJCQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilMRURfQUREUkVTUykgPSBzdGF0ZTsKKwkJfQorCX0KKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNscHM3NTAwX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiQ0xQUzc1MDAgVGltZXIgVGljayIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IGNscHM3NTAwX3RpbWVyX2ludGVycnVwdAorfTsKKworLyoKKyAqIFNldCB1cCB0aW1lciBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBjbHBzNzUwMF90aW1lcl9pbml0KHZvaWQpCit7CisJaW9jdGltZV9pbml0KCk7CisJc2V0dXBfaXJxKElSUV9USU1FUiwgJmNscHM3NTAwX3RpbWVyX2lycSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGNscHM3NTAwX3RpbWVyID0geworCS5pbml0CQk9IGNscHM3NTAwX3RpbWVyX2luaXQsCisJLm9mZnNldAkJPSBpb2NfdGltZXJfZ2V0dGltZW9mZnNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gMHgwMzAxMGZlMCwKKwkJLmlycQkJPSAxMCwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAorCQkucmVnc2hpZnQJPSAyLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCB8IFVQRl9TS0lQX1RFU1QsCisJfSwKKwl7CisJCS5tYXBiYXNlCT0gMHgwMzAxMGJlMCwKKwkJLmlycQkJPSAwLAorCQkudWFydGNsawk9IDE4NDMyMDAsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQIHwgVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsKKwkJLmlvYmFzZQkJPSBJU0FTTE9UX0lPICsgMHgyZTgsCisJCS5pcnEJCT0gNDEsCisJCS51YXJ0Y2xrCT0gMTg0MzIwMCwKKwkJLnJlZ3NoaWZ0CT0gMCwKKwkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCisJfSwKKwl7CisJCS5pb2Jhc2UJCT0gSVNBU0xPVF9JTyArIDB4M2U4LAorCQkuaXJxCQk9IDQwLAorCQkudWFydGNsawk9IDE4NDMyMDAsCisJCS5yZWdzaGlmdAk9IDAsCisJCS5pb3R5cGUJCT0gVVBJT19QT1JULAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjbHBzNzUwMF9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKK30KKworTUFDSElORV9TVEFSVChDTFBTNzUwMCwgIkNMLVBTNzUwMCIpCisJTUFJTlRBSU5FUigiUGhpbGlwIEJsdW5kZWxsIikKKwlCT09UX01FTSgweDEwMDAwMDAwLCAweDAzMDAwMDAwLCAweGUwMDAwMDAwKQorCU1BUElPKGNscHM3NTAwX21hcF9pbykKKwlJTklUSVJRKGNscHM3NTAwX2luaXRfaXJxKQorCQkuaW5pdF9tYWNoaW5lCT0gY2xwczc1MDBfaW5pdCwKKwkJLnRpbWVyCQk9ICZjbHBzNzUwMF90aW1lciwKK01BQ0hJTkVfRU5ECisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTIwYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJOj0gY29yZS5vIGlvLm8KK29iai1tCQkJOj0KK29iai1uCQkJOj0KK29iai0JCQk6PQorCitvYmotJChDT05GSUdfTEVEUykJKz0gbGVkcy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjEyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDQgQEAKKyAgIHpyZWxhZGRyLXkJOj0gMHgwMDAwODAwMAorcGFyYW1zX3BoeXMteQk6PSAweDAwMDAwNDAwCitpbml0cmRfcGh5cy15CTo9IDB4MDA4MDAwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzNjJkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBFeHRyYSBNTSByb3V0aW5lcyBmb3IgdGhlIEVCU0EtMTEwIGFyY2hpdGVjdHVyZQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNkZWZpbmUgSVJRX01BU0sJCTB4ZmUwMDAwMDAJLyogcmVhZCAqLworI2RlZmluZSBJUlFfTVNFVAkJMHhmZTAwMDAwMAkvKiB3cml0ZSAqLworI2RlZmluZSBJUlFfU1RBVAkJMHhmZjAwMDAwMAkvKiByZWFkICovCisjZGVmaW5lIElSUV9NQ0xSCQkweGZmMDAwMDAwCS8qIHdyaXRlICovCisKK3N0YXRpYyB2b2lkIGVic2ExMTBfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlfX3Jhd193cml0ZWIoMSA8PCBpcnEsIElSUV9NQ0xSKTsKK30KKworc3RhdGljIHZvaWQgZWJzYTExMF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJX19yYXdfd3JpdGViKDEgPDwgaXJxLCBJUlFfTVNFVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBlYnNhMTEwX2lycV9jaGlwID0geworCS5hY2sJPSBlYnNhMTEwX21hc2tfaXJxLAorCS5tYXNrCT0gZWJzYTExMF9tYXNrX2lycSwKKwkudW5tYXNrID0gZWJzYTExMF91bm1hc2tfaXJxLAorfTsKKyAKK3N0YXRpYyB2b2lkIF9faW5pdCBlYnNhMTEwX2luaXRfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fcmF3X3dyaXRlYigweGZmLCBJUlFfTUNMUik7CisJX19yYXdfd3JpdGViKDB4NTUsIElSUV9NU0VUKTsKKwlfX3Jhd193cml0ZWIoMHgwMCwgSVJRX01TRVQpOworCWlmIChfX3Jhd19yZWFkYihJUlFfTUFTSykgIT0gMHg1NSkKKwkJd2hpbGUgKDEpOworCV9fcmF3X3dyaXRlYigweGZmLCBJUlFfTUNMUik7CS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgZW5hYmxlcyAqLworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJmVic2ExMTBfaXJxX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBlYnNhMTEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCS8qCisJICogc3BhcnNlIGV4dGVybmFsLWRlY29kZSBJU0FJTyBzcGFjZQorCSAqLworCXsgSVJRX1NUQVQsICAgIFRSSUNLNF9QSFlTLCBQR0RJUl9TSVpFLCAgTVRfREVWSUNFIH0sIC8qIElSUV9TVEFUL0lSUV9NQ0xSICovCisJeyBJUlFfTUFTSywgICAgVFJJQ0szX1BIWVMsIFBHRElSX1NJWkUsICBNVF9ERVZJQ0UgfSwgLyogSVJRX01BU0svSVJRX01TRVQgKi8KKwl7IFNPRlRfQkFTRSwgICBUUklDSzFfUEhZUywgUEdESVJfU0laRSwgIE1UX0RFVklDRSB9LCAvKiBTT0ZUX0JBU0UgKi8KKwl7IFBJVF9CQVNFLCAgICBUUklDSzBfUEhZUywgUEdESVJfU0laRSwgIE1UX0RFVklDRSB9LCAvKiBQSVRfQkFTRSAqLworCisJLyoKKwkgKiBzZWxmLWRlY29kZSBJU0FJTyBzcGFjZQorCSAqLworCXsgSVNBSU9fQkFTRSwgIElTQUlPX1BIWVMsICBJU0FJT19TSVpFLCAgTVRfREVWSUNFIH0sCisJeyBJU0FNRU1fQkFTRSwgSVNBTUVNX1BIWVMsIElTQU1FTV9TSVpFLCBNVF9ERVZJQ0UgfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVic2ExMTBfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KGVic2ExMTBfaW9fZGVzYywgQVJSQVlfU0laRShlYnNhMTEwX2lvX2Rlc2MpKTsKK30KKworCisjZGVmaW5lIFBJVF9DVFJMCQkoUElUX0JBU0UgKyAweDBkKQorI2RlZmluZSBQSVRfVDIJCQkoUElUX0JBU0UgKyAweDA5KQorI2RlZmluZSBQSVRfVDEJCQkoUElUX0JBU0UgKyAweDA1KQorI2RlZmluZSBQSVRfVDAJCQkoUElUX0JBU0UgKyAweDAxKQorCisvKgorICogVGhpcyBpcyB0aGUgcmF0ZSBhdCB3aGljaCB5b3VyIE1DTEsgc2lnbmFsIHRvZ2dsZXMgKGluIEh6KQorICogVGhpcyB3YXMgbWVhc3VyZWQgb24gYSAxMCBkaWdpdCBmcmVxdWVuY3kgY291bnRlciBzYW1wbGluZworICogb3ZlciAxIHNlY29uZC4KKyAqLworI2RlZmluZSBNQ0xLCTQ3ODk0MDAwCisKKy8qCisgKiBUaGlzIGlzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBQSVQgdGltZXJzIGdldCBjbG9ja2VkCisgKi8KKyNkZWZpbmUgQ0xLQlk3CShNQ0xLIC8gNykKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNvdW50ZXIgdmFsdWUuICBXZSB0aWNrIGF0IDIwMEh6IG9uIHRoaXMgcGxhdGZvcm0uCisgKi8KKyNkZWZpbmUgQ09VTlQJKChDTEtCWTcgKyAoSFogLyAyKSkgLyBIWikKKworLyoKKyAqIEdldCB0aGUgdGltZSBvZmZzZXQgZnJvbSB0aGUgc3lzdGVtIFBJVC4gIE5vdGUgdGhhdCBpZiB3ZSBoYXZlIG1pc3NlZCBhbgorICogaW50ZXJydXB0LCB0aGVuIHRoZSBQSVQgY291bnRlciB3aWxsIHJvbGwgb3ZlciAoaWUsIGJlIG5lZ2F0aXZlKS4KKyAqIFRoaXMgYWN0dWFsbHkgd29ya3Mgb3V0IHRvIGJlIGNvbnZlbmllbnQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVic2ExMTBfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBjb3VudDsKKworCV9fcmF3X3dyaXRlYigweDQwLCBQSVRfQ1RSTCk7CisJY291bnQgPSBfX3Jhd19yZWFkYihQSVRfVDEpOworCWNvdW50IHw9IF9fcmF3X3JlYWRiKFBJVF9UMSkgPDwgODsKKworCS8qCisJICogSWYgY291bnQgPiBDT1VOVCwgbWFrZSB0aGUgbnVtYmVyIG5lZ2F0aXZlLgorCSAqLworCWlmIChjb3VudCA+IENPVU5UKQorCQljb3VudCB8PSAweGZmZmYwMDAwOworCisJb2Zmc2V0ID0gQ09VTlQ7CisJb2Zmc2V0IC09IGNvdW50OworCisJLyoKKwkgKiBgb2Zmc2V0JyBpcyBpbiB1bml0cyBvZiB0aW1lciBjb3VudHMuICBDb252ZXJ0CisJICogb2Zmc2V0IHRvIHVuaXRzIG9mIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwlvZmZzZXQgPSBvZmZzZXQgKiAoMTAwMDAwMCAvIEhaKSAvIENPVU5UOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGlycXJldHVybl90CitlYnNhMTEwX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBjb3VudDsKKworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJLyogbGF0Y2ggYW5kIHJlYWQgdGltZXIgMSAqLworCV9fcmF3X3dyaXRlYigweDQwLCBQSVRfQ1RSTCk7CisJY291bnQgPSBfX3Jhd19yZWFkYihQSVRfVDEpOworCWNvdW50IHw9IF9fcmF3X3JlYWRiKFBJVF9UMSkgPDwgODsKKworCWNvdW50ICs9IENPVU5UOworCisJX19yYXdfd3JpdGViKGNvdW50ICYgMHhmZiwgUElUX1QxKTsKKwlfX3Jhd193cml0ZWIoY291bnQgPj4gOCwgUElUX1QxKTsKKworCXRpbWVyX3RpY2socmVncyk7CisKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBlYnNhMTEwX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiRUJTQTExMCBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gZWJzYTExMF90aW1lcl9pbnRlcnJ1cHQKK307CisKKy8qCisgKiBTZXQgdXAgdGltZXIgaW50ZXJydXB0LgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZWJzYTExMF90aW1lcl9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBUaW1lciAxLCBtb2RlIDIsIExTQi9NU0IKKwkgKi8KKwlfX3Jhd193cml0ZWIoMHg3MCwgUElUX0NUUkwpOworCV9fcmF3X3dyaXRlYihDT1VOVCAmIDB4ZmYsIFBJVF9UMSk7CisJX19yYXdfd3JpdGViKENPVU5UID4+IDgsIFBJVF9UMSk7CisKKwlzZXR1cF9pcnEoSVJRX0VCU0ExMTBfVElNRVIwLCAmZWJzYTExMF90aW1lcl9pcnEpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBlYnNhMTEwX3RpbWVyID0geworCS5pbml0CQk9IGVic2ExMTBfdGltZXJfaW5pdCwKKwkub2Zmc2V0CQk9IGVic2ExMTBfZ2V0dGltZW9mZnNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5pb2Jhc2UJCT0gMHgzZjgsCisJCS5pcnEJCT0gMSwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAorCQkucmVnc2hpZnQJPSAwLAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsKKwkJLmlvYmFzZQkJPSAweDJmOCwKKwkJLmlycQkJPSAyLAorCQkudWFydGNsawk9IDE4NDMyMDAsCisJCS5yZWdzaGlmdAk9IDAsCisJCS5pb3R5cGUJCT0gVVBJT19QT1JULAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVic2ExMTBfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNlcmlhbF9kZXZpY2UpOworfQorCithcmNoX2luaXRjYWxsKGVic2ExMTBfaW5pdCk7CisKK01BQ0hJTkVfU1RBUlQoRUJTQTExMCwgIkVCU0ExMTAiKQorCU1BSU5UQUlORVIoIlJ1c3NlbGwgS2luZyIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHhlMDAwMDAwMCwgMHhlMDAwMDAwMCkKKwlCT09UX1BBUkFNUygweDAwMDAwNDAwKQorCURJU0FCTEVfUEFSUE9SVCgwKQorCURJU0FCTEVfUEFSUE9SVCgyKQorCVNPRlRfUkVCT09UCisJTUFQSU8oZWJzYTExMF9tYXBfaW8pCisJSU5JVElSUShlYnNhMTEwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmZWJzYTExMF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW8uYyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmN2ViNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW8uYwpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWVic2ExMTAvaXNhbWVtLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFBlcmZvcm0gIklTQSIgbWVtb3J5IGFuZCBJTyBhY2Nlc3Nlcy4gIFRoZSBFQlNBMTEwIGhhcyBzb21lICJwZWN1bGlhcml0aWVzIgorICogaW4gdGhlIHdheSBpdCBoYW5kbGVzIGFjY2Vzc2VzIHRvIG9kZCBJTyBwb3J0cyBvbiAxNi1iaXQgZGV2aWNlcy4gIFRoZXNlCisgKiBkZXZpY2VzIGhhdmUgdGhlaXIgRDAtRDE1IGxpbmVzIGNvbm5lY3RlZCB0byB0aGUgcHJvY2Vzc29ycyBEMC1EMTUgbGluZXMuCisgKiBTaW5jZSB0aGV5IGV4cGVjdCBhbGwgYnl0ZSBJTyBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiBEMC1ENywgYW5kIHRoZQorICogU3Ryb25nQVJNIGV4cGVjdHMgdG8gdHJhbnNmZXIgdGhlIGJ5dGUgdG8gdGhlc2Ugb2RkIGFkZHJlc3NlcyBvbiBEOC1EMTUsCisgKiB3ZSBtdXN0IHVzZSBhIHRyaWNrIHRvIGdldCB0aGUgcmVxdWlyZWQgYmVoYXZpb3VyLgorICoKKyAqIFRoZSB0cmljayBlbXBsb3llZCBoZXJlIGlzIHRvIHVzZSBsb25nIHdvcmQgc3RvcmVzIHRvIG9kZCBhZGRyZXNzIC0xLiAgVGhlCisgKiBnbHVlIGxvZ2ljIHBpY2tzIHRoaXMgdXAgYXMgYSAidHJpY2siIGFjY2VzcywgYW5kIGFzc2VydHMgdGhlIExTQiBvZiB0aGUKKyAqIHBlcmlwaGVyYWxzIGFkZHJlc3MgYnVzLCB0aGVyZWJ5IGFjY2Vzc2luZyB0aGUgb2RkIElPIHBvcnQuICBNZWFud2hpbGUsIHRoZQorICogU3Ryb25nQVJNIHRyYW5zZmVycyBpdHMgZGF0YSBvbiBEMC1ENyBhcyBleHBlY3RlZC4KKyAqCisgKiBUaGluZ3MgZ2V0IG1vcmUgaW50ZXJlc3Rpbmcgb24gdGhlIHBhc3MtMSBFQlNBMTEwIC0gdGhlIFBDTUNJQSBjb250cm9sbGVyCisgKiB3aXJpbmcgd2FzIHNjcmV3ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGhhZCBsaW1pdGVkIG1lbW9yeSBzcGFjZSBhY2Nlc3MuCisgKiBMdWNraWx5LCB0aGUgd29yay1hcm91bmQgZm9yIHRoaXMgaXMgbm90IHRvbyBob3JyaWJsZS4gIFNlZQorICogX19pc2FtZW1fY29udmVydF9hZGRyIGZvciB0aGUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpfX2lzYW1lbV9jb252ZXJ0X2FkZHIodm9pZCBfX2lvbWVtICphZGRyKQoreworCXUzMiByZXQsIGEgPSAodTMyIF9fZm9yY2UpIGFkZHI7CisKKwkvKgorCSAqIFRoZSBQQ01DSUEgY29udHJvbGxlciBpcyB3aXJlZCB1cCBhcyBmb2xsb3dzOgorCSAqICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCisJICogUENNQ0lBIHwgMiAyIDIgMiB8IDEgMSAxIDEgfCAxIDEgMSAxIHwgMSAxICAgICB8ICAgICAgICAgfCAgICAgICAgIHwKKwkgKiAgICAgICAgfCAzIDIgMSAwIHwgOSA4IDcgNiB8IDUgNCAzIDIgfCAxIDAgOSA4IHwgNyA2IDUgNCB8IDMgMiAxIDAgfAorCSAqICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCisJICogIENQVSAgIHwgMiAyIDIgMiB8IDIgMSAxIDEgfCAxIDEgMSAxIHwgMSAxIDEgICB8ICAgICAgICAgfCAgICAgICAgIHwKKwkgKiAgICAgICAgfCA0IDMgMiAxIHwgMCA5IDkgOCB8IDcgNiA1IDQgfCAzIDIgMCA5IHwgOCA3IDYgNSB8IDQgMyAyIHggfAorCSAqICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCisJICoKKwkgKiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGFjY2VzcyBQQ01DSUEgcmVnaW9ucyBhcyBmb2xsb3dzOgorCSAqCTB4KjEwMDAwIC0+IDB4KjFmZmZmCisJICoJMHgqNzAwMDAgLT4gMHgqN2ZmZmYKKwkgKgkweCo5MDAwMCAtPiAweCo5ZmZmZgorCSAqCTB4KmYwMDAwIC0+IDB4KmZmZmZmCisJICovCisJcmV0ICA9IChhICYgMHhmODAzZmUpIDw8IDE7CisJcmV0IHw9IChhICYgMHgwM2ZjMDApIDw8IDI7CisKKwlyZXQgKz0gMHhlODAwMDAwMDsKKworCWlmICgoYSAmIDB4MjAwMDApID09IChhICYgMHg0MDAwMCkgPj4gMSkKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilyZXQ7CisKKwlCVUcoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHJlYWRbYndsXSBhbmQgd3JpdGVbYndsXQorICovCit1OCBfX3JlYWRiKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl2b2lkIF9faW9tZW0gKmEgPSBfX2lzYW1lbV9jb252ZXJ0X2FkZHIoYWRkcik7CisJdTMyIHJldDsKKworCWlmICgodW5zaWduZWQgbG9uZylhZGRyICYgMSkKKwkJcmV0ID0gX19yYXdfcmVhZGwoYSk7CisJZWxzZQorCQlyZXQgPSBfX3Jhd19yZWFkYihhKTsKKwlyZXR1cm4gcmV0OworfQorCit1MTYgX19yZWFkdyh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdm9pZCBfX2lvbWVtICphID0gX19pc2FtZW1fY29udmVydF9hZGRyKGFkZHIpOworCisJaWYgKCh1bnNpZ25lZCBsb25nKWFkZHIgJiAxKQorCQlCVUcoKTsKKworCXJldHVybiBfX3Jhd19yZWFkdyhhKTsKK30KKwordTMyIF9fcmVhZGwodm9pZCBfX2lvbWVtICphZGRyKQoreworCXZvaWQgX19pb21lbSAqYSA9IF9faXNhbWVtX2NvbnZlcnRfYWRkcihhZGRyKTsKKwl1MzIgcmV0OworCisJaWYgKCh1bnNpZ25lZCBsb25nKWFkZHIgJiAzKQorCQlCVUcoKTsKKworCXJldCA9IF9fcmF3X3JlYWR3KGEpOworCXJldCB8PSBfX3Jhd19yZWFkdyhhICsgNCkgPDwgMTY7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChfX3JlYWRiKTsKK0VYUE9SVF9TWU1CT0woX19yZWFkdyk7CitFWFBPUlRfU1lNQk9MKF9fcmVhZGwpOworCit2b2lkIF9fd3JpdGViKHU4IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXZvaWQgX19pb21lbSAqYSA9IF9faXNhbWVtX2NvbnZlcnRfYWRkcihhZGRyKTsKKworCWlmICgodW5zaWduZWQgbG9uZylhZGRyICYgMSkKKwkJX19yYXdfd3JpdGVsKHZhbCwgYSk7CisJZWxzZQorCQlfX3Jhd193cml0ZWIodmFsLCBhKTsKK30KKwordm9pZCBfX3dyaXRldyh1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdm9pZCBfX2lvbWVtICphID0gX19pc2FtZW1fY29udmVydF9hZGRyKGFkZHIpOworCisJaWYgKCh1bnNpZ25lZCBsb25nKWFkZHIgJiAxKQorCQlCVUcoKTsKKworCV9fcmF3X3dyaXRldyh2YWwsIGEpOworfQorCit2b2lkIF9fd3JpdGVsKHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl2b2lkIF9faW9tZW0gKmEgPSBfX2lzYW1lbV9jb252ZXJ0X2FkZHIoYWRkcik7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpYWRkciAmIDMpCisJCUJVRygpOworCisJX19yYXdfd3JpdGV3KHZhbCwgYSk7CisJX19yYXdfd3JpdGV3KHZhbCA+PiAxNiwgYSArIDQpOworfQorCitFWFBPUlRfU1lNQk9MKF9fd3JpdGViKTsKK0VYUE9SVF9TWU1CT0woX193cml0ZXcpOworRVhQT1JUX1NZTUJPTChfX3dyaXRlbCk7CisKKyNkZWZpbmUgU1VQRVJJT19QT1JUKHApIFwKKwkoKChwKSA+PiAzKSA9PSAoMHgzZjggPj4gMykgfHwgXAorCSAoKHApID4+IDMpID09ICgweDJmOCA+PiAzKSB8fCBcCisJICgocCkgPj4gMykgPT0gKDB4Mzc4ID4+IDMpKQorCisvKgorICogV2UncmUgYWRkcmVzc2luZyBhbiA4IG9yIDE2LWJpdCBwZXJpcGhlcmFsIHdoaWNoIHRyYW5mZXJzCisgKiBvZGQgYWRkcmVzc2VzIG9uIHRoZSBsb3cgSVNBIGJ5dGUgbGFuZS4KKyAqLwordTggX19pbmI4KHVuc2lnbmVkIGludCBwb3J0KQoreworCXUzMiByZXQ7CisKKwkvKgorCSAqIFRoZSBTdXBlcklPIHJlZ2lzdGVycyB1c2Ugc2FuZSBhZGRyZXNzaW5nIHRlY2huaXF1ZXMuLi4KKwkgKi8KKwlpZiAoU1VQRVJJT19QT1JUKHBvcnQpKQorCQlyZXQgPSBfX3Jhd19yZWFkYigodm9pZCBfX2lvbWVtICopSVNBSU9fQkFTRSArIChwb3J0IDw8IDIpKTsKKwllbHNlIHsKKwkJdm9pZCBfX2lvbWVtICphID0gKHZvaWQgX19pb21lbSAqKUlTQUlPX0JBU0UgKyAoKHBvcnQgJiB+MSkgPDwgMSk7CisKKwkJLyoKKwkJICogU2hhbWUgbm90aGluZyBlbHNlIGRvZXMKKwkJICovCisJCWlmIChwb3J0ICYgMSkKKwkJCXJldCA9IF9fcmF3X3JlYWRsKGEpOworCQllbHNlCisJCQlyZXQgPSBfX3Jhd19yZWFkYihhKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdlJ3JlIGFkZHJlc3NpbmcgYSAxNi1iaXQgcGVyaXBoZXJhbCB3aGljaCB0cmFuc2ZlcnMgb2RkCisgKiBhZGRyZXNzZXMgb24gdGhlIGhpZ2ggSVNBIGJ5dGUgbGFuZS4KKyAqLwordTggX19pbmIxNih1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJLyoKKwkgKiBUaGUgU3VwZXJJTyByZWdpc3RlcnMgdXNlIHNhbmUgYWRkcmVzc2luZyB0ZWNobmlxdWVzLi4uCisJICovCisJaWYgKFNVUEVSSU9fUE9SVChwb3J0KSkKKwkJb2Zmc2V0ID0gcG9ydCA8PCAyOworCWVsc2UKKwkJb2Zmc2V0ID0gKHBvcnQgJiB+MSkgPDwgMSB8IChwb3J0ICYgMSk7CisKKwlyZXR1cm4gX19yYXdfcmVhZGIoKHZvaWQgX19pb21lbSAqKUlTQUlPX0JBU0UgKyBvZmZzZXQpOworfQorCit1MTYgX19pbncodW5zaWduZWQgaW50IHBvcnQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCS8qCisJICogVGhlIFN1cGVySU8gcmVnaXN0ZXJzIHVzZSBzYW5lIGFkZHJlc3NpbmcgdGVjaG5pcXVlcy4uLgorCSAqLworCWlmIChTVVBFUklPX1BPUlQocG9ydCkpCisJCW9mZnNldCA9IHBvcnQgPDwgMjsKKwllbHNlIHsKKwkJb2Zmc2V0ID0gcG9ydCA8PCAxOworCQlCVUdfT04ocG9ydCAmIDEpOworCX0KKwlyZXR1cm4gX19yYXdfcmVhZHcoKHZvaWQgX19pb21lbSAqKUlTQUlPX0JBU0UgKyBvZmZzZXQpOworfQorCisvKgorICogRmFrZSBhIDMyLWJpdCByZWFkIHdpdGggdHdvIDE2LWJpdCByZWFkcy4gIE5lZWRlZCBmb3IgM2M1ODkuCisgKi8KK3UzMiBfX2lubCh1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKmE7CisKKwlpZiAoU1VQRVJJT19QT1JUKHBvcnQpIHx8IHBvcnQgJiAzKQorCQlCVUcoKTsKKworCWEgPSAodm9pZCBfX2lvbWVtICopSVNBSU9fQkFTRSArICgocG9ydCAmIH4xKSA8PCAxKTsKKworCXJldHVybiBfX3Jhd19yZWFkdyhhKSB8IF9fcmF3X3JlYWR3KGEgKyA0KSA8PCAxNjsKK30KKworRVhQT1JUX1NZTUJPTChfX2luYjgpOworRVhQT1JUX1NZTUJPTChfX2luYjE2KTsKK0VYUE9SVF9TWU1CT0woX19pbncpOworRVhQT1JUX1NZTUJPTChfX2lubCk7CisKK3ZvaWQgX19vdXRiOCh1OCB2YWwsIHVuc2lnbmVkIGludCBwb3J0KQoreworCS8qCisJICogVGhlIFN1cGVySU8gcmVnaXN0ZXJzIHVzZSBzYW5lIGFkZHJlc3NpbmcgdGVjaG5pcXVlcy4uLgorCSAqLworCWlmIChTVVBFUklPX1BPUlQocG9ydCkpCisJCV9fcmF3X3dyaXRlYih2YWwsICh2b2lkIF9faW9tZW0gKilJU0FJT19CQVNFICsgKHBvcnQgPDwgMikpOworCWVsc2UgeworCQl2b2lkIF9faW9tZW0gKmEgPSAodm9pZCBfX2lvbWVtICopSVNBSU9fQkFTRSArICgocG9ydCAmIH4xKSA8PCAxKTsKKworCQkvKgorCQkgKiBTaGFtZSBub3RoaW5nIGVsc2UgZG9lcworCQkgKi8KKwkJaWYgKHBvcnQgJiAxKQorCQkJX19yYXdfd3JpdGVsKHZhbCwgYSk7CisJCWVsc2UKKwkJCV9fcmF3X3dyaXRlYih2YWwsIGEpOworCX0KK30KKwordm9pZCBfX291dGIxNih1OCB2YWwsIHVuc2lnbmVkIGludCBwb3J0KQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwkvKgorCSAqIFRoZSBTdXBlcklPIHJlZ2lzdGVycyB1c2Ugc2FuZSBhZGRyZXNzaW5nIHRlY2huaXF1ZXMuLi4KKwkgKi8KKwlpZiAoU1VQRVJJT19QT1JUKHBvcnQpKQorCQlvZmZzZXQgPSBwb3J0IDw8IDI7CisJZWxzZQorCQlvZmZzZXQgPSAocG9ydCAmIH4xKSA8PCAxIHwgKHBvcnQgJiAxKTsKKworCV9fcmF3X3dyaXRlYih2YWwsICh2b2lkIF9faW9tZW0gKilJU0FJT19CQVNFICsgb2Zmc2V0KTsKK30KKwordm9pZCBfX291dHcodTE2IHZhbCwgdW5zaWduZWQgaW50IHBvcnQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCS8qCisJICogVGhlIFN1cGVySU8gcmVnaXN0ZXJzIHVzZSBzYW5lIGFkZHJlc3NpbmcgdGVjaG5pcXVlcy4uLgorCSAqLworCWlmIChTVVBFUklPX1BPUlQocG9ydCkpCisJCW9mZnNldCA9IHBvcnQgPDwgMjsKKwllbHNlIHsKKwkJb2Zmc2V0ID0gcG9ydCA8PCAxOworCQlCVUdfT04ocG9ydCAmIDEpOworCX0KKwlfX3Jhd193cml0ZXcodmFsLCAodm9pZCBfX2lvbWVtICopSVNBSU9fQkFTRSArIG9mZnNldCk7Cit9CisKK3ZvaWQgX19vdXRsKHUzMiB2YWwsIHVuc2lnbmVkIGludCBwb3J0KQoreworCUJVRygpOworfQorCitFWFBPUlRfU1lNQk9MKF9fb3V0YjgpOworRVhQT1JUX1NZTUJPTChfX291dGIxNik7CitFWFBPUlRfU1lNQk9MKF9fb3V0dyk7CitFWFBPUlRfU1lNQk9MKF9fb3V0bCk7CisKK3ZvaWQgb3V0c2IodW5zaWduZWQgaW50IHBvcnQsIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pCit7CisJdTMyIG9mZjsKKworCWlmIChTVVBFUklPX1BPUlQocG9ydCkpCisJCW9mZiA9IHBvcnQgPDwgMjsKKwllbHNlIHsKKwkJb2ZmID0gKHBvcnQgJiB+MSkgPDwgMTsKKwkJaWYgKHBvcnQgJiAxKQorCQkJQlVHKCk7CisJfQorCisJX19yYXdfd3JpdGVzYigodm9pZCBfX2lvbWVtICopSVNBSU9fQkFTRSArIG9mZiwgZnJvbSwgbGVuKTsKK30KKwordm9pZCBpbnNiKHVuc2lnbmVkIGludCBwb3J0LCB2b2lkICpmcm9tLCBpbnQgbGVuKQoreworCXUzMiBvZmY7CisKKwlpZiAoU1VQRVJJT19QT1JUKHBvcnQpKQorCQlvZmYgPSBwb3J0IDw8IDI7CisJZWxzZSB7CisJCW9mZiA9IChwb3J0ICYgfjEpIDw8IDE7CisJCWlmIChwb3J0ICYgMSkKKwkJCUJVRygpOworCX0KKworCV9fcmF3X3JlYWRzYigodm9pZCBfX2lvbWVtICopSVNBSU9fQkFTRSArIG9mZiwgZnJvbSwgbGVuKTsKK30KKworRVhQT1JUX1NZTUJPTChvdXRzYik7CitFWFBPUlRfU1lNQk9MKGluc2IpOworCit2b2lkIG91dHN3KHVuc2lnbmVkIGludCBwb3J0LCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQoreworCXUzMiBvZmY7CisKKwlpZiAoU1VQRVJJT19QT1JUKHBvcnQpKQorCQlvZmYgPSBwb3J0IDw8IDI7CisJZWxzZSB7CisJCW9mZiA9IChwb3J0ICYgfjEpIDw8IDE7CisJCWlmIChwb3J0ICYgMSkKKwkJCUJVRygpOworCX0KKworCV9fcmF3X3dyaXRlc3coKHZvaWQgX19pb21lbSAqKUlTQUlPX0JBU0UgKyBvZmYsIGZyb20sIGxlbik7Cit9CisKK3ZvaWQgaW5zdyh1bnNpZ25lZCBpbnQgcG9ydCwgdm9pZCAqZnJvbSwgaW50IGxlbikKK3sKKwl1MzIgb2ZmOworCisJaWYgKFNVUEVSSU9fUE9SVChwb3J0KSkKKwkJb2ZmID0gcG9ydCA8PCAyOworCWVsc2UgeworCQlvZmYgPSAocG9ydCAmIH4xKSA8PCAxOworCQlpZiAocG9ydCAmIDEpCisJCQlCVUcoKTsKKwl9CisKKwlfX3Jhd19yZWFkc3coKHZvaWQgX19pb21lbSAqKUlTQUlPX0JBU0UgKyBvZmYsIGZyb20sIGxlbik7Cit9CisKK0VYUE9SVF9TWU1CT0wob3V0c3cpOworRVhQT1JUX1NZTUJPTChpbnN3KTsKKworLyoKKyAqIFdlIGltcGxlbWVudCB0aGVzZSBhcyAxNi1iaXQgaW5zdy9vdXRzdywgbWFpbmx5IGZvcgorICogM2M1ODkgY2FyZHMuCisgKi8KK3ZvaWQgb3V0c2wodW5zaWduZWQgaW50IHBvcnQsIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pCit7CisJdTMyIG9mZiA9IHBvcnQgPDwgMTsKKworCWlmIChTVVBFUklPX1BPUlQocG9ydCkgfHwgcG9ydCAmIDMpCisJCUJVRygpOworCisJX19yYXdfd3JpdGVzdygodm9pZCBfX2lvbWVtICopSVNBSU9fQkFTRSArIG9mZiwgZnJvbSwgbGVuIDw8IDEpOworfQorCit2b2lkIGluc2wodW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKmZyb20sIGludCBsZW4pCit7CisJdTMyIG9mZiA9IHBvcnQgPDwgMTsKKworCWlmIChTVVBFUklPX1BPUlQocG9ydCkgfHwgcG9ydCAmIDMpCisJCUJVRygpOworCisJX19yYXdfcmVhZHN3KCh2b2lkIF9faW9tZW0gKilJU0FJT19CQVNFICsgb2ZmLCBmcm9tLCBsZW4gPDwgMSk7Cit9CisKK0VYUE9SVF9TWU1CT0wob3V0c2wpOworRVhQT1JUX1NZTUJPTChpbnNsKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvbGVkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzhjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvbGVkcy5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2xlZHMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgRUJTQS0xMTAgTEVEIGNvbnRyb2wgcm91dGluZXMuICBXZSB1c2UgdGhlIGxlZCBhcyBmb2xsb3dzOgorICoKKyAqICAgLSBSZWQgLSB0b2dnbGVzIHN0YXRlIGV2ZXJ5IDUwIHRpbWVyIGludGVycnVwdHMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworc3RhdGljIHNwaW5sb2NrX3QgbGVkc19sb2NrOworCitzdGF0aWMgdm9pZCBlYnNhMTEwX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgbGVkZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGVkc19sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2gobGVkZXZ0KSB7CisJY2FzZSBsZWRfdGltZXI6CisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKVNPRlRfQkFTRSBePSAxMjg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVkc19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxlZHNfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX2Vic2ExMTAoKSkKKwkJbGVkc19ldmVudCA9IGVic2ExMTBfbGVkc19ldmVudDsKKworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKGxlZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkODk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvS2NvbmZpZwpAQCAtMCwwICsxLDIzIEBACitpZiBBUkNIX0NBTUVMT1QKKworbWVudSAiRXB4YTEwZGIiCisKK2NvbW1lbnQgIlBMRCBob3Rzd2FwIHN1cHBvcnQiCisKK2NvbmZpZyBQTEQKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBQTERfSE9UU1dBUAorCWJvb2wgIlN1cHBvcnQgZm9yIFBMRCBkZXZpY2UgaG90cGx1Z2dpbmcgKGV4cGVyaW1lbnRhbCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIGR5bmFtaWMgbG9hZGluZyBhbmQgY29uZmlndXJhdGlvbiBvZgorCSAgY29tcGF0aWJsZSBkcml2ZXJzIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBQTEQgYXJlIGNoYW5nZWQuIFRoaXMKKwkgIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgcmVxdWlyZXMgY29uZmlndXJhdGlvbiB0b29scyB3aGljaCBhcmUKKwkgIG5vdCB5ZXQgZ2VuZXJhbGx5IGF2YWlsYWJsZS4gU2F5IE4gaGVyZS4gWW91IG11c3QgZW5hYmxlIHRoZSBrZXJuZWwKKwkgIG1vZHVsZSBsb2FkZXIgZm9yIHRoaXMgZmVhdHVyZSB0byB3b3JrLgorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGZiZDdkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCisjIE9iamVjdCBmaWxlIGxpc3RzLgorCitvYmoteQkJCTo9IGFyY2gubyBpcnEubyBtbS5vIHRpbWUubyAKK29iai1tCQkJOj0KK29iai1uCQkJOj0KK29iai0JCQk6PQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiZWM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDIgQEAKKyAgIHpyZWxhZGRyLXkJOj0gMHgwMDAwODAwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvYXJjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDAzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvYXJjaC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLmlvYmFzZQkJPSAweDNmOCwKKwkJLmlycQkJPSBJUlFfVUFSVElOVDAsCisjZXJyb3IgRklYTUUKKwkJLnVhcnRjbGsJPSAwLAorCQkucmVnc2hpZnQJPSAwLAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsKKwkJLmlvYmFzZQkJPSAweDJmOCwKKwkJLmlycQkJPSBJUlFfVUFSVElOVDEsCisjZXJyb3IgRklYTUUKKwkJLnVhcnRjbGsJPSAwLAorCQkucmVnc2hpZnQJPSAwLAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDAsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitleHRlcm4gdm9pZCBlcHhhMTBkYl9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBlcHhhMTBkYl9pbml0X2lycSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGVweGExMGRiX3RpbWVyOworCitNQUNISU5FX1NUQVJUKENBTUVMT1QsICJBbHRlcmEgRXB4YTEwZGIiKQorCU1BSU5UQUlORVIoIkFsdGVyYSBDb3Jwb3JhdGlvbiIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHg3ZmZmYzAwMCwgMHhmZmZmYzAwMCkKKwlNQVBJTyhlcHhhMTBkYl9tYXBfaW8pCisJSU5JVElSUShlcHhhMTBkYl9pbml0X2lycSkKKwkudGltZXIJCT0gJmVweGExMGRiX3RpbWVyLAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9kbWEuYyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1MWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvZG1hLmMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWVweGExMGRiL2RtYS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9kbWEuaD4KKwordm9pZCBfX2luaXQgYXJjaF9kbWFfaW5pdChkbWFfdCAqZG1hKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9pcnEuYyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmOTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvaXJxLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWVweGExMGRiL2lycS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaW50X2N0cmwwMC5oPgorCisKK3N0YXRpYyB2b2lkIGVweGFfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKyAgICAgICAgd3JpdGVsKDEgPDwgaXJxLCBJTlRfTUMoSU9fQUREUkVTUyhFWENfSU5UX0NUUkwwMF9CQVNFKSkpOworfQorCitzdGF0aWMgdm9pZCBlcHhhX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKyAgICAgICAgd3JpdGVsKDEgPDwgaXJxLCBJTlRfTVMoSU9fQUREUkVTUyhFWENfSU5UX0NUUkwwMF9CQVNFKSkpOworfQorIAorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgZXB4YV9pcnFfY2hpcCA9IHsKKwkuYWNrCQk9IGVweGFfbWFza19pcnEsCisJLm1hc2sJCT0gZXB4YV9tYXNrX2lycSwKKwkudW5tYXNrCQk9IGVweGFfdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXJxX3Jlc291cmNlID0geworCS5uYW1lCT0gImlycV9oYW5kbGVyIiwKKwkuc3RhcnQJPSBJT19BRERSRVNTKEVYQ19JTlRfQ1RSTDAwX0JBU0UpLAorCS5lbmQJPSBJT19BRERSRVNTKElOVF9QUklPUklUWV9GQyhFWENfSU5UX0NUUkwwMF9CQVNFKSkrNCwKK307CisKK3ZvaWQgX19pbml0IGVweGExMGRiX2luaXRfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJCisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZpcnFfcmVzb3VyY2UpOworCisJLyoKKwkgKiBUaGlzIGJpdCBzZXRzIHVwIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB1c2luZyAKKwkgKiB0aGUgNiBQTEQgaW50ZXJydXB0cyBtb2RlICh0aGUgZGVmYXVsdCkgZWFjaCAKKwkgKiBpcnFzIGlzIGFzc2lnbmVkIGEgcHJpb3JpdHkgd2hpY2ggaXMgdGhlIHNhbWUKKwkgKiBhcyBpdHMgaW50ZXJydXB0IG51bWJlci4gVGhpcyBzY2hlbWUgaXMgdXNlZCBiZWNhdXNlIAorCSAqIGl0cyBlYXN5LCBidXQgeW91IG1heSB3YW50IHRvIGNoYW5nZSBpdCBkZXBlbmRpbmcKKwkgKiBvbiB0aGUgY29udGVudHMgb2YgeW91ciBQTEQKKwkgKi8KKworCXdyaXRlbCgzLElOVF9NT0RFKElPX0FERFJFU1MoRVhDX0lOVF9DVFJMMDBfQkFTRSkpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKXsKKwkJd3JpdGVsKGkrMSwgSU5UX1BSSU9SSVRZX1AwKElPX0FERFJFU1MoRVhDX0lOVF9DVFJMMDBfQkFTRSkpICsgKDQqaSkpOworCQlzZXRfaXJxX2NoaXAoaSwmZXB4YV9pcnFfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpLGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwl3cml0ZWwoLTEsSU5UX01DKElPX0FERFJFU1MoRVhDX0lOVF9DVFJMMDBfQkFTRSkpKTsKKworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9tbS5jIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTU3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL21tLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWVweGExMGRiL21tLmMKKyAqCisgKiAgTU0gcm91dGluZXMgZm9yIEFsdGVyYSdhIEVweGExMGRiIGJvYXJkCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyAKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworLyogUGFnZSB0YWJsZSBtYXBwaW5nIGZvciBJL08gcmVnaW9uICovCisgCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGVweGExMGRiX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgSU9fQUREUkVTUyhFWENfUkVHSVNURVJTX0JBU0UpLCAgIEVYQ19SRUdJU1RFUlNfQkFTRSwgICAgU1pfMTZLLCBNVF9ERVZJQ0UgfSwgCisgeyBJT19BRERSRVNTKEVYQ19QTERfQkxPQ0swX0JBU0UpLCAgRVhDX1BMRF9CTE9DSzBfQkFTRSwgICBTWl8xNkssIE1UX0RFVklDRSB9LCAKKyB7IElPX0FERFJFU1MoRVhDX1BMRF9CTE9DSzFfQkFTRSksICBFWENfUExEX0JMT0NLMV9CQVNFLCAgIFNaXzE2SywgTVRfREVWSUNFIH0sIAorIHsgSU9fQUREUkVTUyhFWENfUExEX0JMT0NLMl9CQVNFKSwgIEVYQ19QTERfQkxPQ0syX0JBU0UsICAgU1pfMTZLLCBNVF9ERVZJQ0UgfSwgCisgeyBJT19BRERSRVNTKEVYQ19QTERfQkxPQ0szX0JBU0UpLCAgRVhDX1BMRF9CTE9DSzNfQkFTRSwgICBTWl8xNkssIE1UX0RFVklDRSB9LCAKKyB7IEZMQVNIX1ZBRERSKEVYQ19FQklfQkxPQ0swX0JBU0UpLCBFWENfRUJJX0JMT0NLMF9CQVNFLCAgIFNaXzE2TSwgTVRfREVWSUNFIH0KK307CisKK3ZvaWQgX19pbml0IGVweGExMGRiX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChlcHhhMTBkYl9pb19kZXNjLCBBUlJBWV9TSVpFKGVweGExMGRiX2lvX2Rlc2MpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5OTFmMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi90aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNkZWZpbmUgVElNRVIwMF9UWVBFICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKQorI2luY2x1ZGUgPGFzbS9hcmNoL3RpbWVyMDAuaD4KKworc3RhdGljIGludCBlcHhhMTBkYl9zZXRfcnRjKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXB4YTEwZGJfcnRjX2luaXQodm9pZCkKK3sKKwlzZXRfcnRjID0gZXB4YTEwZGJfc2V0X3J0YzsKKworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKGVweGExMGRiX3J0Y19pbml0KTsKKworCisvKgorICogSVJRIGhhbmRsZXIgZm9yIHRoZSB0aW1lcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2VweGExMGRiX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJLy8gLi4uY2xlYXIgdGhlIGludGVycnVwdAorCSpUSU1FUjBfQ1IoSU9fQUREUkVTUyhFWENfVElNRVIwMF9CQVNFKSl8PVRJTUVSMF9DUl9DSV9NU0s7CisKKwl0aW1lcl90aWNrKHJlZ3MpOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGVweGExMGRiX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiRXhjYWxpYnVyIFRpbWVyIFRpY2siLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBlcHhhMTBkYl90aW1lcl9pbnRlcnJ1cHQKK307CisKKy8qCisgKiBTZXQgdXAgdGltZXIgaW50ZXJydXB0LCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGVweGExMGRiX3RpbWVyX2luaXQodm9pZCkKK3sKKwkvKiBTdGFydCB0aGUgdGltZXIgKi8KKwkqVElNRVIwX0xJTUlUKElPX0FERFJFU1MoRVhDX1RJTUVSMDBfQkFTRSkpPSh1bnNpZ25lZCBpbnQpKEVYQ19BSEIyX0NMS19GUkVRVUVOQ1kvMjAwKTsKKwkqVElNRVIwX1BSRVNDQUxFKElPX0FERFJFU1MoRVhDX1RJTUVSMDBfQkFTRSkpPTE7CisJKlRJTUVSMF9DUihJT19BRERSRVNTKEVYQ19USU1FUjAwX0JBU0UpKT1USU1FUjBfQ1JfSUVfTVNLIHwgVElNRVIwX0NSX1NfTVNLOworCisJc2V0dXBfaXJxKElSUV9USU1FUjAsICZlcHhhMTBkYl90aW1lcl9pcnEpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGVweGExMGRiX3RpbWVyID0geworCS5pbml0CQk9IGVweGExMGRiX3RpbWVyX2luaXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDkwYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL0tjb25maWcKQEAgLTAsMCArMSw4MCBAQAoraWYgQVJDSF9GT09UQlJJREdFCisKK21lbnUgIkZvb3RicmlkZ2UgSW1wbGVtZW50YXRpb25zIgorCitjb25maWcgQVJDSF9DQVRTCisJYm9vbCAiQ0FUUyIKKwlzZWxlY3QgRk9PVEJSSURHRV9IT1NUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiB0aGUgQ0FUUy4KKworCSAgU2F5aW5nIE4gd2lsbCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIEZvb3RicmlkZ2Uga2VybmVsLgorCitjb25maWcgQVJDSF9QRVJTT05BTF9TRVJWRVIKKwlib29sICJDb21wYXEgUGVyc29uYWwgU2VydmVyIgorCXNlbGVjdCBGT09UQlJJREdFX0hPU1QKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIHRoZSBDb21wYXEKKwkgIFBlcnNvbmFsIFNlcnZlci4KKworCSAgU2F5aW5nIE4gd2lsbCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIEZvb3RicmlkZ2Uga2VybmVsLgorCisJICBUaGUgQ29tcGFxIFBlcnNvbmFsIFNlcnZlciBpcyBub3QgYXZhaWxhYmxlIGZvciBwdXJjaGFzZS4KKwkgIFRoZXJlIGFyZSBubyBwcm9kdWN0IHBsYW5zIGJleW9uZCB0aGUgY3VycmVudCByZXNlYXJjaAorCSAgcHJvdG90eXBlcyBhdCB0aGlzIHRpbWUuICBJbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQ6CisKKwkgIDxodHRwOi8vd3d3LmNybC5ocGwuaHAuY29tL3Byb2plY3RzL3BlcnNvbmFsc2VydmVyLz4KKworCSAgSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvciBjb21tZW50cyBhYm91dCB0aGUgIENvbXBhcSBQZXJzb25hbAorCSAgU2VydmVyLCBzZW5kIGUtbWFpbCB0byA8c2tpZmZAY3JsLmRlYy5jb20+LgorCitjb25maWcgQVJDSF9FQlNBMjg1X0FERElOCisJYm9vbCAiRUJTQTI4NSAoYWRkaW4gbW9kZSkiCisJc2VsZWN0IEFSQ0hfRUJTQTI4NQorCXNlbGVjdCBGT09UQlJJREdFX0FERElOCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiB0aGUgRUJTQTI4NSBjYXJkCisJICBpbiBhZGRpbiBtb2RlLgorCisJICBTYXlpbmcgTiB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgRm9vdGJyaWRnZSBrZXJuZWwuCisKK2NvbmZpZyBBUkNIX0VCU0EyODVfSE9TVAorCWJvb2wgIkVCU0EyODUgKGhvc3QgbW9kZSkiCisJc2VsZWN0IEFSQ0hfRUJTQTI4NQorCXNlbGVjdCBGT09UQlJJREdFX0hPU1QKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIHRoZSBFQlNBMjg1IGNhcmQKKwkgIGluIGhvc3QgKCJjZW50cmFsIGZ1bmN0aW9uIikgbW9kZS4KKworCSAgU2F5aW5nIE4gd2lsbCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIEZvb3RicmlkZ2Uga2VybmVsLgorCitjb25maWcgQVJDSF9ORVRXSU5ERVIKKwlib29sICJOZXRXaW5kZXIiCisJc2VsZWN0IEZPT1RCUklER0VfSE9TVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gdGhlIFJlYmVsLkNPTQorCSAgTmV0V2luZGVyLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtYWNoaW5lIGNhbiBiZSBmb3VuZCBhdDoKKworCSAgPGh0dHA6Ly93d3cubmV0d2luZGVyLm9yZy8+CisKKwkgIFNheWluZyBOIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBGb290YnJpZGdlIGtlcm5lbC4KKworZW5kbWVudQorCisjIEZvb3RicmlkZ2Ugc3VwcG9ydAorY29uZmlnIEZPT1RCUklER0UKKwlib29sCisKKyMgRm9vdGJyaWRnZSBpbiBob3N0IG1vZGUKK2NvbmZpZyBGT09UQlJJREdFX0hPU1QKKwlib29sCisKKyMgRm9vdGJyaWRnZSBpbiBhZGRpbiBtb2RlCitjb25maWcgRk9PVEJSSURHRV9BRERJTgorCWJvb2wKKworIyBFQlNBMjg1IGJvYXJkIGluIGVpdGhlciBob3N0IG9yIGFkZGluIG1vZGUKK2NvbmZpZyBBUkNIX0VCU0EyODUKKwlib29sCisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5NGFkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9NYWtlZmlsZQpAQCAtMCwwICsxLDMwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCisjIE9iamVjdCBmaWxlIGxpc3RzLgorCitvYmoteQkJCTo9IGNvbW1vbi5vIGRjMjEyODUubyBkbWEubyBpc2EtaXJxLm8gdGltZS5vCitvYmotbQkJCTo9CitvYmotbgkJCTo9CitvYmotCQkJOj0KKworcGNpLSQoQ09ORklHX0FSQ0hfQ0FUUykgKz0gY2F0cy1wY2kubworcGNpLSQoQ09ORklHX0FSQ0hfRUJTQTI4NV9IT1NUKSArPSBlYnNhMjg1LXBjaS5vCitwY2ktJChDT05GSUdfQVJDSF9ORVRXSU5ERVIpICs9IG5ldHdpbmRlci1wY2kubworcGNpLSQoQ09ORklHX0FSQ0hfUEVSU09OQUxfU0VSVkVSKSArPSBwZXJzb25hbC1wY2kubworCitsZWRzLSQoQ09ORklHX0FSQ0hfQ08yODUpICs9IGVic2EyODUtbGVkcy5vCitsZWRzLSQoQ09ORklHX0FSQ0hfRUJTQTI4NSkgKz0gZWJzYTI4NS1sZWRzLm8KK2xlZHMtJChDT05GSUdfQVJDSF9ORVRXSU5ERVIpICs9IG5ldHdpbmRlci1sZWRzLm8KKworb2JqLSQoQ09ORklHX0FSQ0hfQ0FUUykgKz0gY2F0cy1ody5vIGlzYS10aW1lci5vCitvYmotJChDT05GSUdfQVJDSF9DTzI4NSkgKz0gY28yODUubyBkYzIxMjg1LXRpbWVyLm8KK29iai0kKENPTkZJR19BUkNIX0VCU0EyODUpICs9IGVic2EyODUubyBkYzIxMjg1LXRpbWVyLm8KK29iai0kKENPTkZJR19BUkNIX05FVFdJTkRFUikgKz0gbmV0d2luZGVyLWh3Lm8gaXNhLXRpbWVyLm8KK29iai0kKENPTkZJR19BUkNIX1BFUlNPTkFMX1NFUlZFUikgKz0gcGVyc29uYWwubyBkYzIxMjg1LXRpbWVyLm8KKworb2JqLSQoQ09ORklHX1BDSSkJKz0kKHBjaS15KQorb2JqLSQoQ09ORklHX0xFRFMpCSs9JChsZWRzLXkpCisKK29iai0kKENPTkZJR19JU0EpCSs9IGlzYS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTc1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDQgQEAKKyAgIHpyZWxhZGRyLXkJOj0gMHgwMDAwODAwMAorcGFyYW1zX3BoeXMteQk6PSAweDAwMDAwMTAwCitpbml0cmRfcGh5cy15CTo9IDB4MDA4MDAwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjZWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKKyAqCisgKiBDQVRTIG1hY2hpbmUgZml4dXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgUnVzc2VsbCBLaW5nLCBQaGlsIEJsdW5kZWxsCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZGVjMjEyODUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNkZWZpbmUgQ0ZHX1BPUlQJMHgzNzAKKyNkZWZpbmUgSU5ERVhfUE9SVAkoQ0ZHX1BPUlQpCisjZGVmaW5lIERBVEFfUE9SVAkoQ0ZHX1BPUlQgKyAxKQorCitzdGF0aWMgaW50IF9faW5pdCBjYXRzX2h3X2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19jYXRzKCkpIHsKKwkJLyogU2V0IEFsYWRkaW4gdG8gQ09ORklHVVJFIG1vZGUgKi8KKwkJb3V0YigweDUxLCBDRkdfUE9SVCk7CisJCW91dGIoMHgyMywgQ0ZHX1BPUlQpOworCisJCS8qIFNlbGVjdCBsb2dpY2FsIGRldmljZSAzICovCisJCW91dGIoMHgwNywgSU5ERVhfUE9SVCk7CisJCW91dGIoMHgwMywgREFUQV9QT1JUKTsKKworCQkvKiBTZXQgcGFyYWxsZWwgcG9ydCB0byBETUEgY2hhbm5lbCAzLCBFQ1ArRVBQMS45LCAKKwkJICAgZW5hYmxlIEVQUCB0aW1lb3V0ICovCisJCW91dGIoMHg3NCwgSU5ERVhfUE9SVCk7CisJCW91dGIoMHgwMywgREFUQV9QT1JUKTsKKwkKKwkJb3V0YigweGYwLCBJTkRFWF9QT1JUKTsKKwkJb3V0YigweDBmLCBEQVRBX1BPUlQpOworCisJCW91dGIoMHhmMSwgSU5ERVhfUE9SVCk7CisJCW91dGIoMHgwNywgREFUQV9QT1JUKTsKKworCQkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgNCAqLworCQlvdXRiKDB4MDcsIElOREVYX1BPUlQpOworCQlvdXRiKDB4MDQsIERBVEFfUE9SVCk7CisKKwkJLyogVUFSVDEgaGlnaCBzcGVlZCBtb2RlICovCisJCW91dGIoMHhmMCwgSU5ERVhfUE9SVCk7CisJCW91dGIoMHgwMiwgREFUQV9QT1JUKTsKKworCQkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgNSAqLworCQlvdXRiKDB4MDcsIElOREVYX1BPUlQpOworCQlvdXRiKDB4MDUsIERBVEFfUE9SVCk7CisKKwkJLyogVUFSVDIgaGlnaCBzcGVlZCBtb2RlICovCisJCW91dGIoMHhmMCwgSU5ERVhfUE9SVCk7CisJCW91dGIoMHgwMiwgREFUQV9QT1JUKTsKKworCQkvKiBTZXQgQWxhZGRpbiB0byBSVU4gbW9kZSAqLworCQlvdXRiKDB4YmIsIENGR19QT1JUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChjYXRzX2h3X2luaXQpOworCisvKgorICogQ0FUUyB1c2VzIHNvZnQtcmVib290IGJ5IGRlZmF1bHQsIHNpbmNlCisgKiBoYXJkIHJlYm9vdHMgZmFpbCBvbiBlYXJseSBib2FyZHMuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAorZml4dXBfY2F0cyhzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLAorCSAgIGNoYXIgKipjbWRsaW5lLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJT1JJR19WSURFT19MSU5FUyAgPSAyNTsKKwlPUklHX1ZJREVPX1BPSU5UUyA9IDE2OworCU9SSUdfWSA9IDI0OworfQorCitNQUNISU5FX1NUQVJUKENBVFMsICJDaGFsaWNlLUNBVFMiKQorCU1BSU5UQUlORVIoIlBoaWxpcCBCbHVuZGVsbCIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgREMyMTI4NV9BUk1DU1JfQkFTRSwgMHhmZTAwMDAwMCkKKwlCT09UX1BBUkFNUygweDAwMDAwMTAwKQorCVNPRlRfUkVCT09UCisJRklYVVAoZml4dXBfY2F0cykKKwlNQVBJTyhmb290YnJpZGdlX21hcF9pbykKKwlJTklUSVJRKGZvb3RicmlkZ2VfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZpc2FfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk4NGZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtcGNpLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLXBjaS5jCisgKgorICogUENJIGJpb3MtdHlwZSBpbml0aWFsaXNhdGlvbiBmb3IgUENJIG1hY2hpbmVzCisgKgorICogQml0cyB0YWtlbiBmcm9tIHZhcmlvdXMgcGxhY2VzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8qIGNhdHMgaG9zdC1zcGVjaWZpYyBzdHVmZiAqLworc3RhdGljIGludCBpcnFtYXBfY2F0c1tdIF9faW5pdGRhdGEgPSB7IElSUV9QQ0ksIElSUV9JTjAsIElSUV9JTjEsIElSUV9JTjMgfTsKKworc3RhdGljIGludCBfX2luaXQgY2F0c19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoZGV2LT5pcnEgPj0gMTI4KQorCQlyZXR1cm4gZGV2LT5pcnEgJiAweDFmOworCisJaWYgKGRldi0+aXJxID49IDEgJiYgZGV2LT5pcnEgPD0gNCkKKwkJcmV0dXJuIGlycW1hcF9jYXRzW2Rldi0+aXJxIC0gMV07CisKKwlpZiAoZGV2LT5pcnEgIT0gMCkKKwkJcHJpbnRrKCJQQ0k6IGRldmljZSAlMDJ4OiUwMnggaGFzIHVua25vd24gaXJxIGxpbmUgJXhcbiIsCisJCSAgICAgICBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuLCBkZXYtPmlycSk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiB3aHkgbm90IHRoZSBzdGFuZGFyZCBQQ0kgc3dpenpsZT8gIGRvZXMgdGhpcyBwcmV2ZW50IDQtcG9ydCB0dWxpcAorICogY2FyZHMgYmVpbmcgdXNlZCAoaWUsIHBjaS1wY2kgYnJpZGdlIGJhc2VkIGNhcmRzKT8KKyAqLworc3RhdGljIHN0cnVjdCBod19wY2kgY2F0c19wY2kgX19pbml0ZGF0YSA9IHsKKwkuc3dpenpsZQkJPSBOVUxMLAorCS5tYXBfaXJxCQk9IGNhdHNfbWFwX2lycSwKKwkubnJfY29udHJvbGxlcnMJCT0gMSwKKwkuc2V0dXAJCQk9IGRjMjEyODVfc2V0dXAsCisJLnNjYW4JCQk9IGRjMjEyODVfc2Nhbl9idXMsCisJLnByZWluaXQJCT0gZGMyMTI4NV9wcmVpbml0LAorCS5wb3N0aW5pdAkJPSBkYzIxMjg1X3Bvc3Rpbml0LAorfTsKKworc3RhdGljIGludCBjYXRzX3BjaV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfY2F0cygpKQorCQlwY2lfY29tbW9uX2luaXQoJmNhdHNfcGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKGNhdHNfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY28yODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU0MTkxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvMjg1LmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jbzI4NS5jCisgKgorICogQ08yODUgbWFjaGluZSBmaXh1cAorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQKK2ZpeHVwX2NvZWJzYTI4NShzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLAorCQljaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCWV4dGVybiB1bnNpZ25lZCBsb25nIGJvb3RfbWVtb3J5X2VuZDsKKwlleHRlcm4gY2hhciBib290X2NvbW1hbmRfbGluZVtdOworCisJbWktPm5yX2JhbmtzICAgICAgPSAxOworCW1pLT5iYW5rWzBdLnN0YXJ0ID0gUEhZU19PRkZTRVQ7CisJbWktPmJhbmtbMF0uc2l6ZSAgPSBib290X21lbW9yeV9lbmQ7CisJbWktPmJhbmtbMF0ubm9kZSAgPSAwOworCisJKmNtZGxpbmUgPSBib290X2NvbW1hbmRfbGluZTsKK30KKworTUFDSElORV9TVEFSVChDTzI4NSwgImNvLUVCU0EyODUiKQorCU1BSU5UQUlORVIoIk1hcmsgdmFuIERvZXNidXJnIikKKwlCT09UX01FTSgweDAwMDAwMDAwLCBEQzIxMjg1X0FSTUNTUl9CQVNFLCAweDdjZjAwMDAwKQorCUZJWFVQKGZpeHVwX2NvZWJzYTI4NSkKKwlNQVBJTyhmb290YnJpZGdlX21hcF9pbykKKwlJTklUSVJRKGZvb3RicmlkZ2VfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZmb290YnJpZGdlX3RpbWVyLAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODIzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIFJ1c3NlbGwgS2luZywgRGF2ZSBHaWxiZXJ0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyAKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitleHRlcm4gdm9pZCBfX2luaXQgaXNhX2luaXRfaXJxKHVuc2lnbmVkIGludCBpcnEpOworCit1bnNpZ25lZCBpbnQgbWVtX2ZjbGtfMjEyODUgPSA1MDAwMDAwMDsKKworRVhQT1JUX1NZTUJPTChtZW1fZmNsa18yMTI4NSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW1jbGsoY29uc3Qgc3RydWN0IHRhZyAqdGFnKQoreworCW1lbV9mY2xrXzIxMjg1ID0gdGFnLT51Lm1lbWNsay5mbWVtY2xrOworCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfTUVNQ0xLLCBwYXJzZV90YWdfbWVtY2xrKTsKKworLyoKKyAqIEZvb3RicmlkZ2UgSVJRIHRyYW5zbGF0aW9uIHRhYmxlCisgKiAgQ29udmVydHMgZnJvbSBvdXIgSVJRIG51bWJlcnMgaW50byBGb290QnJpZGdlIG1hc2tzCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgZmJfaXJxX21hc2tbXSA9IHsKKwlJUlFfTUFTS19VQVJUX1JYLAkvKiAgMCAqLworCUlSUV9NQVNLX1VBUlRfVFgsCS8qICAxICovCisJSVJRX01BU0tfVElNRVIxLAkvKiAgMiAqLworCUlSUV9NQVNLX1RJTUVSMiwJLyogIDMgKi8KKwlJUlFfTUFTS19USU1FUjMsCS8qICA0ICovCisJSVJRX01BU0tfSU4wLAkJLyogIDUgKi8KKwlJUlFfTUFTS19JTjEsCQkvKiAgNiAqLworCUlSUV9NQVNLX0lOMiwJCS8qICA3ICovCisJSVJRX01BU0tfSU4zLAkJLyogIDggKi8KKwlJUlFfTUFTS19ET09SQkVMTEhPU1QsCS8qICA5ICovCisJSVJRX01BU0tfRE1BMSwJCS8qIDEwICovCisJSVJRX01BU0tfRE1BMiwJCS8qIDExICovCisJSVJRX01BU0tfUENJLAkJLyogMTIgKi8KKwlJUlFfTUFTS19TRFJBTVBBUklUWSwJLyogMTMgKi8KKwlJUlFfTUFTS19JMk9JTlBPU1QsCS8qIDE0ICovCisJSVJRX01BU0tfUENJX0FCT1JULAkvKiAxNSAqLworCUlSUV9NQVNLX1BDSV9TRVJSLAkvKiAxNiAqLworCUlSUV9NQVNLX0RJU0NBUkRfVElNRVIsCS8qIDE3ICovCisJSVJRX01BU0tfUENJX0RQRVJSLAkvKiAxOCAqLworCUlSUV9NQVNLX1BDSV9QRVJSLAkvKiAxOSAqLworfTsKKworc3RhdGljIHZvaWQgZmJfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwkqQ1NSX0lSUV9ESVNBQkxFID0gZmJfaXJxX21hc2tbX0RDMjEyODVfSU5SKGlycSldOworfQorCitzdGF0aWMgdm9pZCBmYl91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJKkNTUl9JUlFfRU5BQkxFID0gZmJfaXJxX21hc2tbX0RDMjEyODVfSU5SKGlycSldOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgZmJfY2hpcCA9IHsKKwkuYWNrCT0gZmJfbWFza19pcnEsCisJLm1hc2sJPSBmYl9tYXNrX2lycSwKKwkudW5tYXNrID0gZmJfdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2ZiX2luaXRfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGlycTsKKworCS8qCisJICogc2V0dXAgREMyMTI4NSBJUlFzCisJICovCisJKkNTUl9JUlFfRElTQUJMRSA9IC0xOworCSpDU1JfRklRX0RJU0FCTEUgPSAtMTsKKworCWZvciAoaXJxID0gX0RDMjEyODVfSVJRKDApOyBpcnEgPCBfREMyMTI4NV9JUlEoMjApOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmZmJfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorfQorCit2b2lkIF9faW5pdCBmb290YnJpZGdlX2luaXRfaXJxKHZvaWQpCit7CisJX19mYl9pbml0X2lycSgpOworCisJaWYgKCFmb290YnJpZGdlX2Nmbl9tb2RlKCkpCisJCXJldHVybjsKKworCWlmIChtYWNoaW5lX2lzX2Vic2EyODUoKSkKKwkJLyogVGhlIGZvbGxvd2luZyBpcyBkZXBlbmRlbnQgb24gd2hpY2ggc2xvdAorCQkgKiB5b3UgcGx1ZyB0aGUgU291dGhicmlkZ2UgY2FyZCBpbnRvLiAgV2UKKwkJICogY3VycmVudGx5IGFzc3VtZSB0aGF0IHlvdSBwbHVnIGl0IGludG8KKwkJICogdGhlIHJpZ2h0LWhhbmQgbW9zdCBzbG90LgorCQkgKi8KKwkJaXNhX2luaXRfaXJxKElSUV9QQ0kpOworCisJaWYgKG1hY2hpbmVfaXNfY2F0cygpKQorCQlpc2FfaW5pdF9pcnEoSVJRX0lOMik7CisKKwlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJaXNhX2luaXRfaXJxKElSUV9JTjMpOworfQorCisvKgorICogQ29tbW9uIG1hcHBpbmcgZm9yIGFsbCBzeXN0ZW1zLiAgTm90ZSB0aGF0IHRoZSBvdXRib3VuZCB3cml0ZSBmbHVzaCBpcworICogY29tbWVudGVkIG91dCBzaW5jZSB0aGVyZSBpcyBhICJObyBGaXgiIHByb2JsZW0gd2l0aCBpdC4gIE5vdCBtYXBwaW5nCisgKiBpdCBtZWFucyB0aGF0IHdlIGhhdmUgZXh0cmEgYnVsbGV0IHByb3RlY3Rpb24gb24gb3VyIGZlZXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgZmJfY29tbW9uX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgQVJNQ1NSX0JBU0UsCSBEQzIxMjg1X0FSTUNTUl9CQVNFLAkgICAgQVJNQ1NSX1NJWkUsICBNVF9ERVZJQ0UgfSwKKyB7IFhCVVNfQkFTRSwgICAgMHg0MDAwMDAwMCwJCSAgICBYQlVTX1NJWkUsICAgIE1UX0RFVklDRSB9Cit9OworCisvKgorICogVGhlIG1hcHBpbmcgd2hlbiB0aGUgZm9vdGJyaWRnZSBpcyBpbiBob3N0IG1vZGUuICBXZSBkb24ndCBtYXAgYW55IG9mCisgKiB0aGlzIHdoZW4gd2UgYXJlIGluIGFkZC1pbiBtb2RlLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGVic2EyODVfaG9zdF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0ZPT1RCUklER0UpICYmIGRlZmluZWQoQ09ORklHX0ZPT1RCUklER0VfSE9TVCkKKyB7IFBDSU1FTV9CQVNFLCAgREMyMTI4NV9QQ0lfTUVNLAkgICAgUENJTUVNX1NJWkUsICBNVF9ERVZJQ0UgfSwKKyB7IFBDSUNGRzBfQkFTRSwgREMyMTI4NV9QQ0lfVFlQRV8wX0NPTkZJRywgUENJQ0ZHMF9TSVpFLCBNVF9ERVZJQ0UgfSwKKyB7IFBDSUNGRzFfQkFTRSwgREMyMTI4NV9QQ0lfVFlQRV8xX0NPTkZJRywgUENJQ0ZHMV9TSVpFLCBNVF9ERVZJQ0UgfSwKKyB7IFBDSUlBQ0tfQkFTRSwgREMyMTI4NV9QQ0lfSUFDSywJICAgIFBDSUlBQ0tfU0laRSwgTVRfREVWSUNFIH0sCisgeyBQQ0lPX0JBU0UsICAgIERDMjEyODVfUENJX0lPLAkgICAgUENJT19TSVpFLAkgIE1UX0RFVklDRSB9CisjZW5kaWYKK307CisKKy8qCisgKiBUaGUgQ08tZWJzYTI4NSBtYXBwaW5nLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGNvMjg1X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworI2lmZGVmIENPTkZJR19BUkNIX0NPMjg1CisgeyBQQ0lPX0JBU0UsCSBEQzIxMjg1X1BDSV9JTywJICAgIFBDSU9fU0laRSwgICAgTVRfREVWSUNFIH0sCisgeyBQQ0lNRU1fQkFTRSwJIERDMjEyODVfUENJX01FTSwJICAgIFBDSU1FTV9TSVpFLCAgTVRfREVWSUNFIH0KKyNlbmRpZgorfTsKKwordm9pZCBfX2luaXQgZm9vdGJyaWRnZV9tYXBfaW8odm9pZCkKK3sKKwkvKgorCSAqIFNldCB1cCB0aGUgY29tbW9uIG1hcHBpbmcgZmlyc3Q7IHdlIG5lZWQgdGhpcyB0bworCSAqIGRldGVybWluZSB3aGV0aGVyIHdlJ3JlIGluIGhvc3QgbW9kZSBvciBub3QuCisJICovCisJaW90YWJsZV9pbml0KGZiX2NvbW1vbl9pb19kZXNjLCBBUlJBWV9TSVpFKGZiX2NvbW1vbl9pb19kZXNjKSk7CisKKwkvKgorCSAqIE5vdywgd29yayBvdXQgd2hhdCB3ZSd2ZSBnb3QgdG8gbWFwIGluIGFkZGl0aW9uIG9uIHRoaXMKKwkgKiBwbGF0Zm9ybS4KKwkgKi8KKwlpZiAobWFjaGluZV9pc19jbzI4NSgpKQorCQlpb3RhYmxlX2luaXQoY28yODVfaW9fZGVzYywgQVJSQVlfU0laRShjbzI4NV9pb19kZXNjKSk7CisJaWYgKGZvb3RicmlkZ2VfY2ZuX21vZGUoKSkKKwkJaW90YWJsZV9pbml0KGVic2EyODVfaG9zdF9pb19kZXNjLCBBUlJBWV9TSVpFKGVic2EyODVfaG9zdF9pb19kZXNjKSk7Cit9CisKKyNpZmRlZiBDT05GSUdfRk9PVEJSSURHRV9BRERJTgorCisvKgorICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzc2VzIHRvIFBDSSBhZGRyZXNzZXMgYW5kIFBDSQorICogYWRkcmVzc2VzIHRvIHZpcnR1YWwgYWRkcmVzc2VzLiAgTm90ZSB0aGF0IGl0IGlzIG9ubHkgbGVnYWwgdG8gdXNlIHRoZXNlCisgKiBvbiBtZW1vcnkgb2J0YWluZWQgdmlhIGdldF96ZXJvZWRfcGFnZSBvciBrbWFsbG9jLgorICovCit1bnNpZ25lZCBsb25nIF9fdmlydF90b19idXModW5zaWduZWQgbG9uZyByZXMpCit7CisJV0FSTl9PTihyZXMgPCBQQUdFX09GRlNFVCB8fCByZXMgPj0gKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpOworCisJcmV0dXJuIChyZXMgLSBQQUdFX09GRlNFVCkgKyAoKkNTUl9QQ0lTRFJBTUJBU0UgJiAweGZmZmZmZmYwKTsKK30KK0VYUE9SVF9TWU1CT0woX192aXJ0X3RvX2J1cyk7CisKK3Vuc2lnbmVkIGxvbmcgX19idXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIHJlcykKK3sKKwlyZXMgLT0gKCpDU1JfUENJU0RSQU1CQVNFICYgMHhmZmZmZmZmMCk7CisJcmVzICs9IFBBR0VfT0ZGU0VUOworCisJV0FSTl9PTihyZXMgPCBQQUdFX09GRlNFVCB8fCByZXMgPj0gKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpOworCisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0woX19idXNfdG9fdmlydCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MGUzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmgKQEAgLTAsMCArMSw5IEBACisKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGZvb3RicmlkZ2VfdGltZXI7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBpc2FfdGltZXI7CisKK2V4dGVybiB2b2lkIGlzYV9ydGNfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgZm9vdGJyaWRnZV9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBmb290YnJpZGdlX2luaXRfaXJxKHZvaWQpOworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODBlMWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LXRpbWVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFJ1c3NlbGwgS2luZy4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggUGhpbCBCbHVuZGVsbAorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qCisgKiBGb290YnJpZGdlIHRpbWVyIDEgc3VwcG9ydC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXIxX2xhdGNoOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcjFfZ2V0dGltZW9mZnNldCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0gdGltZXIxX2xhdGNoIC0gKkNTUl9USU1FUjFfVkFMVUU7CisKKwlyZXR1cm4gKCh0aWNrX25zZWMgLyAxMDAwKSAqIHZhbHVlKSAvIHRpbWVyMV9sYXRjaDsKK30KKworc3RhdGljIGlycXJldHVybl90Cit0aW1lcjFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwkqQ1NSX1RJTUVSMV9DTFIgPSAwOworCisJdGltZXJfdGljayhyZWdzKTsKKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGZvb3RicmlkZ2VfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJUaW1lcjEgdGltZXIgdGljayIsCisJLmhhbmRsZXIJPSB0aW1lcjFfaW50ZXJydXB0LAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCit9OworCisvKgorICogU2V0IHVwIHRpbWVyIGludGVycnVwdC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGZvb3RicmlkZ2VfdGltZXJfaW5pdCh2b2lkKQoreworCWlzYV9ydGNfaW5pdCgpOworCisJdGltZXIxX2xhdGNoID0gKG1lbV9mY2xrXzIxMjg1ICsgOCAqIEhaKSAvICgxNiAqIEhaKTsKKworCSpDU1JfVElNRVIxX0NMUiAgPSAwOworCSpDU1JfVElNRVIxX0xPQUQgPSB0aW1lcjFfbGF0Y2g7CisJKkNTUl9USU1FUjFfQ05UTCA9IFRJTUVSX0NOVExfRU5BQkxFIHwgVElNRVJfQ05UTF9BVVRPUkVMT0FEIHwgVElNRVJfQ05UTF9ESVYxNjsKKworCXNldHVwX2lycShJUlFfVElNRVIxLCAmZm9vdGJyaWRnZV90aW1lcl9pcnEpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGZvb3RicmlkZ2VfdGltZXIgPSB7CisJLmluaXQJCT0gZm9vdGJyaWRnZV90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gdGltZXIxX2dldHRpbWVvZmZzZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ODg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2RlYzIxMjg1LmM6IFBDSSBmdW5jdGlvbnMgZm9yIERDMjEyODUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgUnVzc2VsbCBLaW5nCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgUGhpbCBCbHVuZGVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgorCisjZGVmaW5lIE1BWF9TTE9UUwkJMjEKKworI2RlZmluZSBQQ0lDTURfQUJPUlQJCSgoUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUfCBcCisJCQkJICBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQpPDwxNikKKworI2RlZmluZSBQQ0lDTURfRVJST1JfQklUUwkoKFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZIHwgXAorCQkJCSAgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwgXAorCQkJCSAgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIHwgXAorCQkJCSAgUENJX1NUQVRVU19QQVJJVFkpIDw8IDE2KQorCitleHRlcm4gaW50IHNldHVwX2FybV9pcnEoaW50LCBzdHJ1Y3QgaXJxYWN0aW9uICopOworZXh0ZXJuIHZvaWQgcGNpYmlvc19yZXBvcnRfc3RhdHVzKHVfaW50IHN0YXR1c19tYXNrLCBpbnQgd2Fybik7CitleHRlcm4gdm9pZCByZWdpc3Rlcl9pc2FfcG9ydHModW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitkYzIxMjg1X2Jhc2VfYWRkcmVzcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKKworCWlmIChidXMtPm51bWJlciA9PSAwKSB7CisJCWlmIChQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwkJCS8qCisJCQkgKiBGb3IgZGV2Zm4gMCwgcG9pbnQgYXQgdGhlIDIxMjg1CisJCQkgKi8KKwkJCWFkZHIgPSBBUk1DU1JfQkFTRTsKKwkJZWxzZSB7CisJCQlkZXZmbiAtPSAxIDw8IDM7CisKKwkJCWlmIChkZXZmbiA8IFBDSV9ERVZGTihNQVhfU0xPVFMsIDApKQorCQkJCWFkZHIgPSBQQ0lDRkcwX0JBU0UgfCAweGMwMDAwMCB8IChkZXZmbiA8PCA4KTsKKwkJfQorCX0gZWxzZQorCQlhZGRyID0gUENJQ0ZHMV9CQVNFIHwgKGJ1cy0+bnVtYmVyIDw8IDE2KSB8IChkZXZmbiA8PCA4KTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW50CitkYzIxMjg1X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAorCQkgICAgaW50IHNpemUsIHUzMiAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZGMyMTI4NV9iYXNlX2FkZHJlc3MoYnVzLCBkZXZmbik7CisJdTMyIHYgPSAweGZmZmZmZmZmOworCisJaWYgKGFkZHIpCisJCXN3aXRjaCAoc2l6ZSkgeworCQljYXNlIDE6CisJCQlhc20oImxkciU/YgklMCwgWyUxLCAlMl0iCisJCQkJOiAiPXIiICh2KSA6ICJyIiAoYWRkciksICJyIiAod2hlcmUpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlhc20oImxkciU/aAklMCwgWyUxLCAlMl0iCisJCQkJOiAiPXIiICh2KSA6ICJyIiAoYWRkciksICJyIiAod2hlcmUpKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlhc20oImxkciU/CSUwLCBbJTEsICUyXSIKKwkJCQk6ICI9ciIgKHYpIDogInIiIChhZGRyKSwgInIiICh3aGVyZSkpOworCQkJYnJlYWs7CisJCX0KKworCSp2YWx1ZSA9IHY7CisKKwl2ID0gKkNTUl9QQ0lDTUQ7CisJaWYgKHYgJiBQQ0lDTURfQUJPUlQpIHsKKwkJKkNTUl9QQ0lDTUQgPSB2ICYgKDB4ZmZmZnxQQ0lDTURfQUJPUlQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludAorZGMyMTI4NV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsCisJCSAgICAgaW50IHNpemUsIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBkYzIxMjg1X2Jhc2VfYWRkcmVzcyhidXMsIGRldmZuKTsKKwl1MzIgdjsKKworCWlmIChhZGRyKQorCQlzd2l0Y2ggKHNpemUpIHsKKwkJY2FzZSAxOgorCQkJYXNtKCJzdHIlP2IJJTAsIFslMSwgJTJdIgorCQkJCTogOiAiciIgKHZhbHVlKSwgInIiIChhZGRyKSwgInIiICh3aGVyZSkpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFzbSgic3RyJT9oCSUwLCBbJTEsICUyXSIKKwkJCQk6IDogInIiICh2YWx1ZSksICJyIiAoYWRkciksICJyIiAod2hlcmUpKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlhc20oInN0ciU/CSUwLCBbJTEsICUyXSIKKwkJCQk6IDogInIiICh2YWx1ZSksICJyIiAoYWRkciksICJyIiAod2hlcmUpKTsKKwkJCWJyZWFrOworCQl9CisKKwl2ID0gKkNTUl9QQ0lDTUQ7CisJaWYgKHYgJiBQQ0lDTURfQUJPUlQpIHsKKwkJKkNTUl9QQ0lDTUQgPSB2ICYgKDB4ZmZmZnxQQ0lDTURfQUJPUlQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGRjMjEyODVfb3BzID0geworCS5yZWFkCT0gZGMyMTI4NV9yZWFkX2NvbmZpZywKKwkud3JpdGUJPSBkYzIxMjg1X3dyaXRlX2NvbmZpZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzZXJyX3RpbWVyOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBlcnJfdGltZXI7CisKK3N0YXRpYyB2b2lkIGRjMjEyODVfZW5hYmxlX2Vycm9yKHVuc2lnbmVkIGxvbmcgX19kYXRhKQoreworCXN3aXRjaCAoX19kYXRhKSB7CisJY2FzZSBJUlFfUENJX1NFUlI6CisJCWRlbF90aW1lcigmc2Vycl90aW1lcik7CisJCWJyZWFrOworCisJY2FzZSBJUlFfUENJX1BFUlI6CisJCWRlbF90aW1lcigmcGVycl90aW1lcik7CisJCWJyZWFrOworCX0KKworCWVuYWJsZV9pcnEoX19kYXRhKTsKK30KKworLyoKKyAqIFdhcm4gb24gUENJIGVycm9ycy4KKyAqLworc3RhdGljIGlycXJldHVybl90IGRjMjEyODVfYWJvcnRfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGNtZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJY21kID0gKkNTUl9QQ0lDTUQ7CisJc3RhdHVzID0gY21kID4+IDE2OworCWNtZCA9IGNtZCAmIDB4ZmZmZjsKKworCWlmIChzdGF0dXMgJiBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogbWFzdGVyIGFib3J0LCBwYz0weCUwOGx4XG4iLAorCQkJaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSk7CisJCWNtZCB8PSBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgPDwgMTY7CisJfQorCisJaWYgKHN0YXR1cyAmIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiB0YXJnZXQgYWJvcnQ6ICIpOworCQlwY2liaW9zX3JlcG9ydF9zdGF0dXMoUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwKKwkJCQkgICAgICBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQgfAorCQkJCSAgICAgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCwgMSk7CisJCXByaW50aygiXG4iKTsKKworCQljbWQgfD0gUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIDw8IDE2OworCX0KKworCSpDU1JfUENJQ01EID0gY21kOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZGMyMTI4NV9zZXJyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgY250bDsKKworCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IHN5c3RlbSBlcnJvciByZWNlaXZlZDogIik7CisJcGNpYmlvc19yZXBvcnRfc3RhdHVzKFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiwgMSk7CisJcHJpbnRrKCJcbiIpOworCisJY250bCA9ICpDU1JfU0ExMTBfQ05UTCAmIDB4ZmZmZmRmMDc7CisJKkNTUl9TQTExMF9DTlRMID0gY250bCB8IFNBMTEwX0NOVExfUlhTRVJSOworCisJLyoKKwkgKiBiYWNrIG9mZiB0aGlzIGludGVycnVwdAorCSAqLworCWRpc2FibGVfaXJxKGlycSk7CisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJYWRkX3RpbWVyKHRpbWVyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRjMjEyODVfZGlzY2FyZF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBkaXNjYXJkIHRpbWVyIGV4cGlyZWRcbiIpOworCSpDU1JfU0ExMTBfQ05UTCAmPSAweGZmZmZkZTA3OworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZGMyMTI4NV9kcGFyaXR5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBjbWQ7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBkYXRhIHBhcml0eSBlcnJvciBkZXRlY3RlZDogIik7CisJcGNpYmlvc19yZXBvcnRfc3RhdHVzKFBDSV9TVEFUVVNfUEFSSVRZIHwgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFksIDEpOworCXByaW50aygiXG4iKTsKKworCWNtZCA9ICpDU1JfUENJQ01EICYgMHhmZmZmOworCSpDU1JfUENJQ01EID0gY21kIHwgMSA8PCAyNDsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRjMjEyODVfcGFyaXR5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgY21kOworCisJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogcGFyaXR5IGVycm9yIGRldGVjdGVkOiAiKTsKKwlwY2liaW9zX3JlcG9ydF9zdGF0dXMoUENJX1NUQVRVU19QQVJJVFkgfCBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSwgMSk7CisJcHJpbnRrKCJcbiIpOworCisJY21kID0gKkNTUl9QQ0lDTUQgJiAweGZmZmY7CisJKkNTUl9QQ0lDTUQgPSBjbWQgfCAxIDw8IDMxOworCisJLyoKKwkgKiBiYWNrIG9mZiB0aGlzIGludGVycnVwdAorCSAqLworCWRpc2FibGVfaXJxKGlycSk7CisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJYWRkX3RpbWVyKHRpbWVyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IF9faW5pdCBkYzIxMjg1X3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYgKG5yIHx8ICFmb290YnJpZGdlX2Nmbl9tb2RlKCkpCisJCXJldHVybiAwOworCisJcmVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIDIsIEdGUF9LRVJORUwpOworCWlmICghcmVzKSB7CisJCXByaW50aygib3V0IG9mIG1lbW9yeSBmb3Igcm9vdCBidXMgcmVzb3VyY2VzIik7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogMik7CisKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwlyZXNbMF0ubmFtZSAgPSAiRm9vdGJyaWRnZSBub24tcHJlZmV0Y2giOworCXJlc1sxXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9QUkVGRVRDSDsKKwlyZXNbMV0ubmFtZSAgPSAiRm9vdGJyaWRnZSBwcmVmZXRjaCI7CisKKwlhbGxvY2F0ZV9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZyZXNbMV0sIDB4MjAwMDAwMDAsCisJCQkgIDB4YTAwMDAwMDAsIDB4ZmZmZmZmZmYsIDB4MjAwMDAwMDAsIE5VTEwsIE5VTEwpOworCWFsbG9jYXRlX3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnJlc1swXSwgMHg0MDAwMDAwMCwKKwkJCSAgMHg4MDAwMDAwMCwgMHhmZmZmZmZmZiwgMHg0MDAwMDAwMCwgTlVMTCwgTlVMTCk7CisKKwlzeXMtPnJlc291cmNlWzBdID0gJmlvcG9ydF9yZXNvdXJjZTsKKwlzeXMtPnJlc291cmNlWzFdID0gJnJlc1swXTsKKwlzeXMtPnJlc291cmNlWzJdID0gJnJlc1sxXTsKKwlzeXMtPm1lbV9vZmZzZXQgID0gREMyMTI4NV9QQ0lfTUVNOworCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBwY2lfYnVzICogX19pbml0IGRjMjEyODVfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJcmV0dXJuIHBjaV9zY2FuX2J1cygwLCAmZGMyMTI4NV9vcHMsIHN5cyk7Cit9CisKK3ZvaWQgX19pbml0IGRjMjEyODVfcHJlaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBtZW1fc2l6ZSwgbWVtX21hc2s7CisJaW50IGNmbl9tb2RlOworCisJbWVtX3NpemUgPSAodW5zaWduZWQgaW50KWhpZ2hfbWVtb3J5IC0gUEFHRV9PRkZTRVQ7CisJZm9yIChtZW1fbWFzayA9IDB4MDAxMDAwMDA7IG1lbV9tYXNrIDwgMHgxMDAwMDAwMDsgbWVtX21hc2sgPDw9IDEpCisJCWlmIChtZW1fbWFzayA+PSBtZW1fc2l6ZSkKKwkJCWJyZWFrOwkJCisKKwkvKgorCSAqIFRoZXNlIHJlZ2lzdGVycyBuZWVkIHRvIGJlIHNldCB1cCB3aGV0aGVyIHdlJ3JlIHRoZQorCSAqIGNlbnRyYWwgZnVuY3Rpb24gb3Igbm90LgorCSAqLworCSpDU1JfU0RSQU1CQVNFTUFTSyAgICA9IChtZW1fbWFzayAtIDEpICYgMHgwZmZjMDAwMDsKKwkqQ1NSX1NEUkFNQkFTRU9GRlNFVCAgPSAwOworCSpDU1JfUk9NQkFTRU1BU0sgICAgICA9IDB4ODAwMDAwMDA7CisJKkNTUl9DU1JCQVNFTUFTSyAgICAgID0gMDsKKwkqQ1NSX0NTUkJBU0VPRkZTRVQgICAgPSAwOworCSpDU1JfUENJQUREUl9FWFROICAgICA9IDA7CisKKwljZm5fbW9kZSA9IF9fZm9vdGJyaWRnZV9jZm5fbW9kZSgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBEQzIxMjg1IGZvb3RicmlkZ2UsIHJldmlzaW9uICUwMmxYLCBpbiAiCisJCSIlcyBtb2RlXG4iLCAqQ1NSX0NMQVNTUkVWICYgMHhmZiwgY2ZuX21vZGUgPworCQkiY2VudHJhbCBmdW5jdGlvbiIgOiAiYWRkaW4iKTsKKworCWlmIChmb290YnJpZGdlX2Nmbl9tb2RlKCkpIHsKKwkJLyoKKwkJICogQ2xlYXIgYW55IGV4aXN0aW5nIGVycm9ycyAtIHdlIGFyZW4ndAorCQkgKiBpbnRlcmVzdGVkIGluIGhpc3RvcmljYWwgZGF0YS4uLgorCQkgKi8KKwkJKkNTUl9TQTExMF9DTlRMCT0gKCpDU1JfU0ExMTBfQ05UTCAmIDB4ZmZmZmRlMDcpIHwKKwkJCQkgIFNBMTEwX0NOVExfUlhTRVJSOworCQkqQ1NSX1BDSUNNRCA9ICgqQ1NSX1BDSUNNRCAmIDB4ZmZmZikgfCBQQ0lDTURfRVJST1JfQklUUzsKKwl9CisKKwlpbml0X3RpbWVyKCZzZXJyX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZwZXJyX3RpbWVyKTsKKworCXNlcnJfdGltZXIuZGF0YSA9IElSUV9QQ0lfU0VSUjsKKwlzZXJyX3RpbWVyLmZ1bmN0aW9uID0gZGMyMTI4NV9lbmFibGVfZXJyb3I7CisJcGVycl90aW1lci5kYXRhID0gSVJRX1BDSV9QRVJSOworCXBlcnJfdGltZXIuZnVuY3Rpb24gPSBkYzIxMjg1X2VuYWJsZV9lcnJvcjsKKworCS8qCisJICogV2UgZG9uJ3QgY2FyZSBpZiB0aGVzZSBmYWlsLgorCSAqLworCXJlcXVlc3RfaXJxKElSUV9QQ0lfU0VSUiwgZGMyMTI4NV9zZXJyX2lycSwgU0FfSU5URVJSVVBULAorCQkgICAgIlBDSSBzeXN0ZW0gZXJyb3IiLCAmc2Vycl90aW1lcik7CisJcmVxdWVzdF9pcnEoSVJRX1BDSV9QRVJSLCBkYzIxMjg1X3Bhcml0eV9pcnEsIFNBX0lOVEVSUlVQVCwKKwkJICAgICJQQ0kgcGFyaXR5IGVycm9yIiwgJnBlcnJfdGltZXIpOworCXJlcXVlc3RfaXJxKElSUV9QQ0lfQUJPUlQsIGRjMjEyODVfYWJvcnRfaXJxLCBTQV9JTlRFUlJVUFQsCisJCSAgICAiUENJIGFib3J0IiwgTlVMTCk7CisJcmVxdWVzdF9pcnEoSVJRX0RJU0NBUkRfVElNRVIsIGRjMjEyODVfZGlzY2FyZF9pcnEsIFNBX0lOVEVSUlVQVCwKKwkJICAgICJEaXNjYXJkIHRpbWVyIiwgTlVMTCk7CisJcmVxdWVzdF9pcnEoSVJRX1BDSV9EUEVSUiwgZGMyMTI4NV9kcGFyaXR5X2lycSwgU0FfSU5URVJSVVBULAorCQkgICAgIlBDSSBkYXRhIHBhcml0eSIsIE5VTEwpOworCisJaWYgKGNmbl9tb2RlKSB7CisJCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY3NyaW87CisKKwkJY3NyaW8uZmxhZ3MgID0gSU9SRVNPVVJDRV9JTzsKKwkJY3NyaW8ubmFtZSAgID0gIkZvb3RicmlkZ2UiOworCisJCWFsbG9jYXRlX3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZjc3JpbywgMTI4LAorCQkJCSAgMHhmZjAwLCAweGZmZmYsIDEyOCwgTlVMTCwgTlVMTCk7CisKKwkJLyoKKwkJICogTWFwIG91ciBTRFJBTSBhdCBhIGtub3duIGFkZHJlc3MgaW4gUENJIHNwYWNlLCBqdXN0IGluIGNhc2UKKwkJICogdGhlIGZpcm13YXJlIGhhZCBvdGhlciBpZGVhcy4gIFVzaW5nIGEgbm9uemVybyBiYXNlIGlzCisJCSAqIG5lY2Vzc2FyeSwgc2luY2Ugc29tZSBWR0EgY2FyZHMgZm9yY2VmdWxseSB1c2UgUENJIGFkZHJlc3NlcworCQkgKiBpbiB0aGUgcmFuZ2UgMHgwMDBhMDAwMCB0byAweDAwMGMwMDAwLiAoZWcsIFMzIGNhcmRzKS4KKwkJICovCisJCSpDU1JfUENJQ1NSQkFTRSAgICAgICA9IDB4ZjQwMDAwMDA7CisJCSpDU1JfUENJQ1NSSU9CQVNFICAgICA9IGNzcmlvLnN0YXJ0OworCQkqQ1NSX1BDSVNEUkFNQkFTRSAgICAgPSBfX3ZpcnRfdG9fYnVzKFBBR0VfT0ZGU0VUKTsKKwkJKkNTUl9QQ0lST01CQVNFICAgICAgID0gMDsKKwkJKkNTUl9QQ0lDTUQgPSBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIgfAorCQkJICAgICAgUENJX0NPTU1BTkRfSU5WQUxJREFURSB8IFBDSUNNRF9FUlJPUl9CSVRTOworCX0gZWxzZSBpZiAoZm9vdGJyaWRnZV9jZm5fbW9kZSgpICE9IDApIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIG5vdCBjb21waWxlZCB0byBhY2NlcHQgImFkZC1pbiIgbW9kZSwgdGhlbgorCQkgKiB3ZSBhcmUgdXNpbmcgYSBjb25zdGFudCB2aXJ0X3RvX2J1cyB0cmFuc2xhdGlvbiB3aGljaAorCQkgKiBjYW4gbm90IGhvcGUgdG8gY2F0ZXIgZm9yIHRoZSB3YXkgdGhlIGhvc3QgQklPUyAgaGFzCisJCSAqIHNldCB1cCB0aGUgbWFjaGluZS4KKwkJICovCisJCXBhbmljKCJQQ0k6IHRoaXMga2VybmVsIGlzIGNvbXBpbGVkIGZvciBjZW50cmFsICIKKwkJCSJmdW5jdGlvbiBtb2RlIG9ubHkiKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGRjMjEyODVfcG9zdGluaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9pc2FfcG9ydHMoREMyMTI4NV9QQ0lfTUVNLCBEQzIxMjg1X1BDSV9JTywgMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMTM5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kbWEuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9kbWEtZWJzYTI4NS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OCBQaGlsIEJsdW5kZWxsCisgKgorICogRE1BIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBFQlNBLTI4NS9DQVRTIGFyY2hpdGVjdHVyZXMKKyAqCisgKiAgQ2hhbmdlbG9nOgorICogICAwOS1Ob3YtMTk5OCBSTUsJU3BsaXQgb3V0IElTQSBETUEgZnVuY3Rpb25zIHRvIGRtYS1pc2EuYworICogICAxNy1NYXItMTk5OSBSTUsJQWxsb3cgYW55IEVCU0EyODUtbGlrZSBhcmNoaXRlY3R1cmUgdG8gaGF2ZQorICoJCQlJU0EgRE1BIGNvbnRyb2xsZXJzLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisKKyNpZiAwCitzdGF0aWMgaW50IGZiX2RtYV9yZXF1ZXN0KGRtYWNoX3QgY2hhbm5lbCwgZG1hX3QgKmRtYSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgZmJfZG1hX2VuYWJsZShkbWFjaF90IGNoYW5uZWwsIGRtYV90ICpkbWEpCit7Cit9CisKK3N0YXRpYyB2b2lkIGZiX2RtYV9kaXNhYmxlKGRtYWNoX3QgY2hhbm5lbCwgZG1hX3QgKmRtYSkKK3sKK30KKworc3RhdGljIHN0cnVjdCBkbWFfb3BzIGZiX2RtYV9vcHMgPSB7CisJLnR5cGUJCT0gImZiIiwKKwkucmVxdWVzdAk9IGZiX2RtYV9yZXF1ZXN0LAorCS5lbmFibGUJCT0gZmJfZG1hX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGZiX2RtYV9kaXNhYmxlLAorfTsKKyNlbmRpZgorCit2b2lkIF9faW5pdCBhcmNoX2RtYV9pbml0KGRtYV90ICpkbWEpCit7CisjaWYgMAorCWRtYVtfREMyMTI4NV9ETUEoMCldLmRfb3BzID0gJmZiX2RtYV9vcHM7CisJZG1hW19EQzIxMjg1X0RNQSgxKV0uZF9vcHMgPSAmZmJfZG1hX29wczsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JU0FfRE1BCisJaWYgKGZvb3RicmlkZ2VfY2ZuX21vZGUoKSkKKwkJaXNhX2luaXRfZG1hKGRtYSArIF9JU0FfRE1BKDApKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtbGVkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjN2MzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS1sZWRzLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtbGVkcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBFQlNBLTI4NSBjb250cm9sIHJvdXRpbmVzLgorICoKKyAqIFRoZSBFQlNBLTI4NSB1c2VzIHRoZSBsZWRzIGFzIGZvbGxvd3M6CisgKiAgLSBHcmVlbiAtIHRvZ2dsZXMgc3RhdGUgZXZlcnkgNTAgdGltZXIgaW50ZXJydXB0cworICogIC0gQW1iZXIgLSBPbiBpZiBzeXN0ZW0gaXMgbm90IGlkbGUKKyAqICAtIFJlZCAgIC0gY3VycmVudGx5IHVudXNlZAorICoKKyAqIENoYW5nZWxvZzoKKyAqICAgMDItMDUtMTk5OQlSTUsJVmFyaW91cyBjbGVhbnVwcworICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECTEKKyNkZWZpbmUgTEVEX1NUQVRFX0NMQUlNRUQJMgorc3RhdGljIGNoYXIgbGVkX3N0YXRlOworc3RhdGljIGNoYXIgaHdfbGVkX3N0YXRlOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxlZHNfbG9jayk7CisKK3N0YXRpYyB2b2lkIGVic2EyODVfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsZWRzX2xvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAoZXZ0KSB7CisJY2FzZSBsZWRfc3RhcnQ6CisJCWh3X2xlZF9zdGF0ZSA9IFhCVVNfTEVEX1JFRCB8IFhCVVNfTEVEX0dSRUVOOworI2lmbmRlZiBDT05GSUdfTEVEU19DUFUKKwkJaHdfbGVkX3N0YXRlIHw9IFhCVVNfTEVEX0FNQkVSOworI2VuZGlmCisJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfRU5BQkxFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9zdG9wOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9FTkFCTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX2NsYWltOgorCQlsZWRfc3RhdGUgfD0gTEVEX1NUQVRFX0NMQUlNRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IFhCVVNfTEVEX1JFRCB8IFhCVVNfTEVEX0dSRUVOIHwgWEJVU19MRURfQU1CRVI7CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVsZWFzZToKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gWEJVU19MRURfUkVEIHwgWEJVU19MRURfR1JFRU4gfCBYQlVTX0xFRF9BTUJFUjsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfTEVEU19USU1FUgorCWNhc2UgbGVkX3RpbWVyOgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgXj0gWEJVU19MRURfR1JFRU47CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgfD0gWEJVU19MRURfQU1CRVI7CisJCWJyZWFrOworCisJY2FzZSBsZWRfaWRsZV9lbmQ6CisJCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKwkJCWh3X2xlZF9zdGF0ZSAmPSB+WEJVU19MRURfQU1CRVI7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIGxlZF9oYWx0ZWQ6CisJCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKwkJCWh3X2xlZF9zdGF0ZSAmPSB+WEJVU19MRURfUkVEOworCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gflhCVVNfTEVEX0dSRUVOOworCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IFhCVVNfTEVEX0dSRUVOOworCQlicmVhazsKKworCWNhc2UgbGVkX2FtYmVyX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gflhCVVNfTEVEX0FNQkVSOworCQlicmVhazsKKworCWNhc2UgbGVkX2FtYmVyX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IFhCVVNfTEVEX0FNQkVSOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH5YQlVTX0xFRF9SRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVkX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IFhCVVNfTEVEX1JFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKQorCQkqWEJVU19MRURTID0gaHdfbGVkX3N0YXRlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVkc19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxlZHNfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX2Vic2EyODUoKSB8fCBtYWNoaW5lX2lzX2NvMjg1KCkpCisJCWxlZHNfZXZlbnQgPSBlYnNhMjg1X2xlZHNfZXZlbnQ7CisKKwlsZWRzX2V2ZW50KGxlZF9zdGFydCk7CisKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChsZWRzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBjMGJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtcGNpLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LXBjaS5jCisgKgorICogUENJIGJpb3MtdHlwZSBpbml0aWFsaXNhdGlvbiBmb3IgUENJIG1hY2hpbmVzCisgKgorICogQml0cyB0YWtlbiBmcm9tIHZhcmlvdXMgcGxhY2VzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKK3N0YXRpYyBpbnQgaXJxbWFwX2Vic2EyODVbXSBfX2luaXRkYXRhID0geyBJUlFfSU4zLCBJUlFfSU4xLCBJUlFfSU4wLCBJUlFfUENJIH07CisKK3N0YXRpYyBpbnQgX19pbml0IGVic2EyODVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09OVEFRICYmCisJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ09OVEFRXzgyQzY5MykKKwkJc3dpdGNoIChQQ0lfRlVOQyhkZXYtPmRldmZuKSkgeworCQkJY2FzZSAxOglyZXR1cm4gMTQ7CisJCQljYXNlIDI6CXJldHVybiAxNTsKKwkJCWNhc2UgMzoJcmV0dXJuIDEyOworCQl9CisKKwlyZXR1cm4gaXJxbWFwX2Vic2EyODVbKHNsb3QgKyBwaW4pICYgM107Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcGNpIGVic2EyODVfcGNpIF9faW5pdGRhdGEgPSB7CisJLnN3aXp6bGUJCT0gcGNpX3N0ZF9zd2l6emxlLAorCS5tYXBfaXJxCQk9IGVic2EyODVfbWFwX2lycSwKKwkubnJfY29udHJvbGxlcnMJCT0gMSwKKwkuc2V0dXAJCQk9IGRjMjEyODVfc2V0dXAsCisJLnNjYW4JCQk9IGRjMjEyODVfc2Nhbl9idXMsCisJLnByZWluaXQJCT0gZGMyMTI4NV9wcmVpbml0LAorCS5wb3N0aW5pdAkJPSBkYzIxMjg1X3Bvc3Rpbml0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZWJzYTI4NV9pbml0X3BjaSh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX2Vic2EyODUoKSkKKwkJcGNpX2NvbW1vbl9pbml0KCZlYnNhMjg1X3BjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChlYnNhMjg1X2luaXRfcGNpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTMxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCisgKgorICogRUJTQTI4NSBtYWNoaW5lIGZpeHVwCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZGVjMjEyODUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK01BQ0hJTkVfU1RBUlQoRUJTQTI4NSwgIkVCU0EyODUiKQorCU1BSU5UQUlORVIoIlJ1c3NlbGwgS2luZyIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgREMyMTI4NV9BUk1DU1JfQkFTRSwgMHhmZTAwMDAwMCkKKwlCT09UX1BBUkFNUygweDAwMDAwMTAwKQorCVZJREVPKDB4MDAwYTAwMDAsIDB4MDAwYmZmZmYpCisJTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCisJSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS50aW1lcgkJPSAmZm9vdGJyaWRnZV90aW1lciwKK01BQ0hJTkVfRU5ECisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMTAxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pcnEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDIyLUF1Zy0xOTk4IFJNSwlSZXN0cnVjdHVyZWQgSVJRIHJvdXRpbmVzCisgKiAgIDAzLVNlcC0xOTk4IFBKQglNZXJnZWQgQ0FUUyBzdXBwb3J0CisgKiAgIDIwLUphbi0xOTk4IFJNSwlTdGFydGVkIG1lcmdlIG9mIEVCU0EyODYsIENBVFMgYW5kIE5ldFdpbmRlcgorICogICAyNi1KYW4tMTk5OSBQSkIJRG9uJ3QgdXNlIElBQ0sgb24gQ0FUUworICogICAxNi1NYXItMTk5OSBSTUsJQWRkZWQgYXV0b2RldGVjdCBvZiBJU0EgUElDcworICovCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKK3N0YXRpYyB2b2lkIGlzYV9tYXNrX3BpY19sb19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGlycSAmIDcpOworCisJb3V0YihpbmIoUElDX01BU0tfTE8pIHwgbWFzaywgUElDX01BU0tfTE8pOworfQorCitzdGF0aWMgdm9pZCBpc2FfYWNrX3BpY19sb19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGlycSAmIDcpOworCisJb3V0YihpbmIoUElDX01BU0tfTE8pIHwgbWFzaywgUElDX01BU0tfTE8pOworCW91dGIoMHgyMCwgUElDX0xPKTsKK30KKworc3RhdGljIHZvaWQgaXNhX3VubWFza19waWNfbG9faXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKworCW91dGIoaW5iKFBJQ19NQVNLX0xPKSAmIH5tYXNrLCBQSUNfTUFTS19MTyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpc2FfbG9fY2hpcCA9IHsKKwkuYWNrCT0gaXNhX2Fja19waWNfbG9faXJxLAorCS5tYXNrCT0gaXNhX21hc2tfcGljX2xvX2lycSwKKwkudW5tYXNrID0gaXNhX3VubWFza19waWNfbG9faXJxLAorfTsKKworc3RhdGljIHZvaWQgaXNhX21hc2tfcGljX2hpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoaXJxICYgNyk7CisKKwlvdXRiKGluYihQSUNfTUFTS19ISSkgfCBtYXNrLCBQSUNfTUFTS19ISSk7Cit9CisKK3N0YXRpYyB2b2lkIGlzYV9hY2tfcGljX2hpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoaXJxICYgNyk7CisKKwlvdXRiKGluYihQSUNfTUFTS19ISSkgfCBtYXNrLCBQSUNfTUFTS19ISSk7CisJb3V0YigweDYyLCBQSUNfTE8pOworCW91dGIoMHgyMCwgUElDX0hJKTsKK30KKworc3RhdGljIHZvaWQgaXNhX3VubWFza19waWNfaGlfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKworCW91dGIoaW5iKFBJQ19NQVNLX0hJKSAmIH5tYXNrLCBQSUNfTUFTS19ISSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpc2FfaGlfY2hpcCA9IHsKKwkuYWNrCT0gaXNhX2Fja19waWNfaGlfaXJxLAorCS5tYXNrCT0gaXNhX21hc2tfcGljX2hpX2lycSwKKwkudW5tYXNrID0gaXNhX3VubWFza19waWNfaGlfaXJxLAorfTsKKworc3RhdGljIHZvaWQKK2lzYV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGlzYV9pcnEgPSAqKHVuc2lnbmVkIGNoYXIgKilQQ0lJQUNLX0JBU0U7CisKKwlpZiAoaXNhX2lycSA8IF9JU0FfSVJRKDApIHx8IGlzYV9pcnEgPj0gX0lTQV9JUlEoMTYpKSB7CisJCWRvX2JhZF9JUlEoaXNhX2lycSwgZGVzYywgcmVncyk7CisJCXJldHVybjsKKwl9CisKKwlkZXNjID0gaXJxX2Rlc2MgKyBpc2FfaXJxOworCWRlc2MtPmhhbmRsZShpc2FfaXJxLCBkZXNjLCByZWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxX2Nhc2NhZGUgPSB7IC5oYW5kbGVyID0gbm9fYWN0aW9uLCAubmFtZSA9ICJjYXNjYWRlIiwgfTsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGljMV9yZXNvdXJjZSA9IHsgInBpYzEiLCAweDIwLCAweDNmIH07CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBpYzJfcmVzb3VyY2UgPSB7ICJwaWMyIiwgMHhhMCwgMHhiZiB9OworCit2b2lkIF9faW5pdCBpc2FfaW5pdF9pcnEodW5zaWduZWQgaW50IGhvc3RfaXJxKQoreworCXVuc2lnbmVkIGludCBpcnE7CisKKwkvKgorCSAqIFNldHVwLCBhbmQgdGhlbiBwcm9iZSBmb3IgYW4gSVNBIFBJQworCSAqIElmIHRoZSBQSUMgaXMgbm90IHRoZXJlLCB0aGVuIHdlCisJICogaWdub3JlIHRoZSBQSUMuCisJICovCisJb3V0YigweDExLCBQSUNfTE8pOworCW91dGIoX0lTQV9JUlEoMCksIFBJQ19NQVNLX0xPKTsJLyogSVJRIG51bWJlcgkJKi8KKwlvdXRiKDB4MDQsIFBJQ19NQVNLX0xPKTsJLyogU2xhdmUgb24gQ2gyCQkqLworCW91dGIoMHgwMSwgUElDX01BU0tfTE8pOwkvKiB4ODYJCQkqLworCW91dGIoMHhmNSwgUElDX01BU0tfTE8pOwkvKiBwYXR0ZXJuOiAxMTExMDEwMQkqLworCisJb3V0YigweDExLCBQSUNfSEkpOworCW91dGIoX0lTQV9JUlEoOCksIFBJQ19NQVNLX0hJKTsJLyogSVJRIG51bWJlcgkJKi8KKwlvdXRiKDB4MDIsIFBJQ19NQVNLX0hJKTsJLyogU2xhdmUgb24gQ2gxCQkqLworCW91dGIoMHgwMSwgUElDX01BU0tfSEkpOwkvKiB4ODYJCQkqLworCW91dGIoMHhmYSwgUElDX01BU0tfSEkpOwkvKiBwYXR0ZXJuOiAxMTExMTAxMAkqLworCisJb3V0YigweDBiLCBQSUNfTE8pOworCW91dGIoMHgwYiwgUElDX0hJKTsKKworCWlmIChpbmIoUElDX01BU0tfTE8pID09IDB4ZjUgJiYgaW5iKFBJQ19NQVNLX0hJKSA9PSAweGZhKSB7CisJCW91dGIoMHhmZiwgUElDX01BU0tfTE8pOy8qIG1hc2sgYWxsIElSUXMJKi8KKwkJb3V0YigweGZmLCBQSUNfTUFTS19ISSk7LyogbWFzayBhbGwgSVJRcwkqLworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIklSUTogSVNBIFBJQyBub3QgZm91bmRcbiIpOworCQlob3N0X2lycSA9ICh1bnNpZ25lZCBpbnQpLTE7CisJfQorCisJaWYgKGhvc3RfaXJxICE9ICh1bnNpZ25lZCBpbnQpLTEpIHsKKwkJZm9yIChpcnEgPSBfSVNBX0lSUSgwKTsgaXJxIDwgX0lTQV9JUlEoOCk7IGlycSsrKSB7CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXNhX2xvX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJCX0KKworCQlmb3IgKGlycSA9IF9JU0FfSVJRKDgpOyBpcnEgPCBfSVNBX0lSUSgxNik7IGlycSsrKSB7CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXNhX2hpX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJCX0KKworCQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwaWMxX3Jlc291cmNlKTsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcGljMl9yZXNvdXJjZSk7CisJCXNldHVwX2lycShJUlFfSVNBX0NBU0NBREUsICZpcnFfY2FzY2FkZSk7CisKKwkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaG9zdF9pcnEsIGlzYV9pcnFfaGFuZGxlcik7CisKKwkJLyoKKwkJICogT24gdGhlIE5ldFdpbmRlciwgZG9uJ3QgYXV0b21hdGljYWxseQorCQkgKiBlbmFibGUgSVNBIElSUTExIHdoZW4gaXQgaXMgcmVxdWVzdGVkLgorCQkgKiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgbWlzc2luZyBwdWxsLXVwCisJCSAqIHJlc2lzdG9yIG9uIHRoaXMgbGluZS4KKwkJICovCisJCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKQorCQkJc2V0X2lycV9mbGFncyhfSVNBX0lSUSgxMSksIElSUUZfVkFMSUQgfAorCQkJCSAgICAgIElSUUZfUFJPQkUgfCBJUlFGX05PQVVUT0VOKTsKKwl9Cit9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS10aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS10aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmVmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLXRpbWVyLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLXRpbWVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFJ1c3NlbGwgS2luZy4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggUGhpbCBCbHVuZGVsbAorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qCisgKiBJU0EgdGltZXIgdGljayBzdXBwb3J0CisgKi8KKyNkZWZpbmUgbVNFQ18xMF9mcm9tXzE0ICgoMTQzMTgxODAgKyAxMDApIC8gMjAwKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpc2FfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCWludCBjb3VudDsKKworCXN0YXRpYyBpbnQgY291bnRfcCA9IChtU0VDXzEwX2Zyb21fMTQvNik7ICAgIC8qIGZvciB0aGUgZmlyc3QgY2FsbCBhZnRlciBib290ICovCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgamlmZmllc19wID0gMDsKKworCS8qCisJICogY2FjaGUgdm9sYXRpbGUgamlmZmllcyB0ZW1wb3JhcmlseTsgd2UgaGF2ZSBJUlFzIHR1cm5lZCBvZmYuIAorCSAqLworCXVuc2lnbmVkIGxvbmcgamlmZmllc190OworCisJLyogdGltZXIgY291bnQgbWF5IHVuZGVyZmxvdyByaWdodCBoZXJlICovCisJb3V0Yl9wKDB4MDAsIDB4NDMpOwkvKiBsYXRjaCB0aGUgY291bnQgQVNBUCAqLworCisJY291bnQgPSBpbmJfcCgweDQwKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLworCisJLyoKKwkgKiBXZSBkbyB0aGlzIGd1YXJhbnRlZWQgZG91YmxlIG1lbW9yeSBhY2Nlc3MgaW5zdGVhZCBvZiBhIF9wIAorCSAqIHBvc3RmaXggaW4gdGhlIHByZXZpb3VzIHBvcnQgYWNjZXNzLiBXaGVlZSwgaGFja2FkeSBoYWNrCisJICovCisgCWppZmZpZXNfdCA9IGppZmZpZXM7CisKKwljb3VudCB8PSBpbmJfcCgweDQwKSA8PCA4OworCisJLyogRGV0ZWN0IHRpbWVyIHVuZGVyZmxvd3MuICBJZiB3ZSBoYXZlbid0IGhhZCBhIHRpbWVyIHRpY2sgc2luY2UgCisJICAgdGhlIGxhc3QgdGltZSB3ZSB3ZXJlIGNhbGxlZCwgYW5kIHRpbWUgaXMgYXBwYXJlbnRseSBnb2luZworCSAgIGJhY2t3YXJkcywgdGhlIGNvdW50ZXIgbXVzdCBoYXZlIHdyYXBwZWQgZHVyaW5nIHRoaXMgcm91dGluZS4gKi8KKwlpZiAoKGppZmZpZXNfdCA9PSBqaWZmaWVzX3ApICYmIChjb3VudCA+IGNvdW50X3ApKQorCQljb3VudCAtPSAobVNFQ18xMF9mcm9tXzE0LzYpOworCWVsc2UKKwkJamlmZmllc19wID0gamlmZmllc190OworCisJY291bnRfcCA9IGNvdW50OworCisJY291bnQgPSAoKChtU0VDXzEwX2Zyb21fMTQvNiktMSkgLSBjb3VudCkgKiAodGlja19uc2VjIC8gMTAwMCk7CisJY291bnQgPSAoY291bnQgKyAobVNFQ18xMF9mcm9tXzE0LzYpLzIpIC8gKG1TRUNfMTBfZnJvbV8xNC82KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlycXJldHVybl90Citpc2FfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisJdGltZXJfdGljayhyZWdzKTsKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXNhX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiSVNBIHRpbWVyIHRpY2siLAorCS5oYW5kbGVyCT0gaXNhX3RpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGlzYV90aW1lcl9pbml0KHZvaWQpCit7CisJaXNhX3J0Y19pbml0KCk7CisKKwkvKiBlbmFibGUgUElUIHRpbWVyICovCisJLyogc2V0IGZvciBwZXJpb2RpYyAoNCkgYW5kIExTQi9NU0Igd3JpdGUgKDB4MzApICovCisJb3V0YigweDM0LCAweDQzKTsKKwlvdXRiKChtU0VDXzEwX2Zyb21fMTQvNikgJiAweEZGLCAweDQwKTsKKwlvdXRiKChtU0VDXzEwX2Zyb21fMTQvNikgPj4gOCwgMHg0MCk7CisKKwlzZXR1cF9pcnEoSVJRX0lTQV9USU1FUiwgJmlzYV90aW1lcl9pcnEpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGlzYV90aW1lciA9IHsKKwkuaW5pdAkJPSBpc2FfdGltZXJfaW5pdCwKKwkub2Zmc2V0CQk9IGlzYV9nZXR0aW1lb2Zmc2V0LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNhMWZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkuaW9iYXNlCQk9IDB4M2Y4LAorCQkuaXJxCQk9IElSUV9JU0FfVUFSVCwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAorCQkucmVnc2hpZnQJPSAwLAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsKKwkJLmlvYmFzZQkJPSAweDJmOCwKKwkJLmlycQkJPSBJUlFfSVNBX1VBUlQyLAorCQkudWFydGNsawk9IDE4NDMyMDAsCisJCS5yZWdzaGlmdAk9IDAsCisJCS5pb3R5cGUJCT0gVVBJT19QT1JULAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZvb3RicmlkZ2VfaXNhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKK30KKworYXJjaF9pbml0Y2FsbChmb290YnJpZGdlX2lzYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFkZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCkBAIC0wLDAgKzEsNjYwIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCisgKgorICogTmV0d2luZGVyIG1hY2hpbmUgZml4dXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgUnVzc2VsbCBLaW5nLCBQaGlsIEJsdW5kZWxsCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisjZGVmaW5lIElSREFfSU9fQkFTRQkJMHgxODAKKyNkZWZpbmUgR1AxX0lPX0JBU0UJCTB4MzM4CisjZGVmaW5lIEdQMl9JT19CQVNFCQkweDMzYQorCisKKyNpZmRlZiBDT05GSUdfTEVEUworI2RlZmluZSBERUZBVUxUX0xFRFMJMAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9MRURTCUdQSU9fR1JFRU5fTEVECisjZW5kaWYKKworLyoKKyAqIFdpbmJvbmQgV0I4Mzk3N0YgYWNjZXNzaWJpbGl0eSBzdHVmZgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2I5Nzdfb3Blbih2b2lkKQoreworCW91dGIoMHg4NywgMHgzNzApOworCW91dGIoMHg4NywgMHgzNzApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2I5NzdfY2xvc2Uodm9pZCkKK3sKKwlvdXRiKDB4YWEsIDB4MzcwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdiOTc3X3diKGludCByZWcsIGludCB2YWwpCit7CisJb3V0YihyZWcsIDB4MzcwKTsKKwlvdXRiKHZhbCwgMHgzNzEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2I5Nzdfd3coaW50IHJlZywgaW50IHZhbCkKK3sKKwlvdXRiKHJlZywgMHgzNzApOworCW91dGIodmFsID4+IDgsIDB4MzcxKTsKKwlvdXRiKHJlZyArIDEsIDB4MzcwKTsKKwlvdXRiKHZhbCAmIDI1NSwgMHgzNzEpOworfQorCisjZGVmaW5lIHdiOTc3X2RldmljZV9zZWxlY3QoZGV2KQl3Yjk3N193YigweDA3LCBkZXYpCisjZGVmaW5lIHdiOTc3X2RldmljZV9kaXNhYmxlKCkJCXdiOTc3X3diKDB4MzAsIDB4MDApCisjZGVmaW5lIHdiOTc3X2RldmljZV9lbmFibGUoKQkJd2I5Nzdfd2IoMHgzMCwgMHgwMSkKKworLyoKKyAqIFRoaXMgaXMgYSBsb2NrIGZvciBhY2Nlc3NpbmcgcG9ydHMgR1AxX0lPX0JBU0UgYW5kIEdQMl9JT19CQVNFCisgKi8KK0RFRklORV9TUElOTE9DSyhncGlvX2xvY2spOworCitzdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfZ3Bpb19vcDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3VycmVudF9ncGlvX2lvOworc3RhdGljIHVuc2lnbmVkIGludCBjdXJyZW50X2NwbGQ7CisKK3ZvaWQgZ3Bpb19tb2RpZnlfb3AoaW50IG1hc2ssIGludCBzZXQpCit7CisJdW5zaWduZWQgaW50IG5ld19ncGlvLCBjaGFuZ2VkOworCisJbmV3X2dwaW8gPSAoY3VycmVudF9ncGlvX29wICYgfm1hc2spIHwgc2V0OworCWNoYW5nZWQgPSBuZXdfZ3BpbyBeIGN1cnJlbnRfZ3Bpb19vcDsKKwljdXJyZW50X2dwaW9fb3AgPSBuZXdfZ3BpbzsKKworCWlmIChjaGFuZ2VkICYgMHhmZikKKwkJb3V0YihuZXdfZ3BpbywgR1AxX0lPX0JBU0UpOworCWlmIChjaGFuZ2VkICYgMHhmZjAwKQorCQlvdXRiKG5ld19ncGlvID4+IDgsIEdQMl9JT19CQVNFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZ3Bpb19tb2RpZnlfaW8oaW50IG1hc2ssIGludCBpbikKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X2dwaW8sIGNoYW5nZWQ7CisJaW50IHBvcnQ7CisKKwluZXdfZ3BpbyA9IChjdXJyZW50X2dwaW9faW8gJiB+bWFzaykgfCBpbjsKKwljaGFuZ2VkID0gbmV3X2dwaW8gXiBjdXJyZW50X2dwaW9faW87CisJY3VycmVudF9ncGlvX2lvID0gbmV3X2dwaW87CisKKwljaGFuZ2VkID4+PSAxOworCW5ld19ncGlvID4+PSAxOworCisJd2I5NzdfZGV2aWNlX3NlbGVjdCg3KTsKKworCWZvciAocG9ydCA9IDB4ZTE7IGNoYW5nZWQgJiYgcG9ydCA8IDB4ZTg7IGNoYW5nZWQgPj49IDEpIHsKKwkJd2I5Nzdfd2IocG9ydCwgbmV3X2dwaW8gJiAxKTsKKworCQlwb3J0ICs9IDE7CisJCW5ld19ncGlvID4+PSAxOworCX0KKworCXdiOTc3X2RldmljZV9zZWxlY3QoOCk7CisKKwlmb3IgKHBvcnQgPSAweGU4OyBjaGFuZ2VkICYmIHBvcnQgPCAweGVjOyBjaGFuZ2VkID4+PSAxKSB7CisJCXdiOTc3X3diKHBvcnQsIG5ld19ncGlvICYgMSk7CisKKwkJcG9ydCArPSAxOworCQluZXdfZ3BpbyA+Pj0gMTsKKwl9Cit9CisKK3ZvaWQgZ3Bpb19tb2RpZnlfaW8oaW50IG1hc2ssIGludCBpbikKK3sKKwkvKiBPcGVuIHVwIHRoZSBTdXBlcklPIGNoaXAgKi8KKwl3Yjk3N19vcGVuKCk7CisKKwlfX2dwaW9fbW9kaWZ5X2lvKG1hc2ssIGluKTsKKworCS8qIENsb3NlIHVwIHRoZSBFRkVSIGdhdGUgKi8KKwl3Yjk3N19jbG9zZSgpOworfQorCitpbnQgZ3Bpb19yZWFkKHZvaWQpCit7CisJcmV0dXJuIGluYihHUDFfSU9fQkFTRSkgfCBpbmIoR1AyX0lPX0JBU0UpIDw8IDg7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBXaW5ib25kIFc4Mzk3N0YgZ2xvYmFsIHJlZ2lzdGVycworICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2I5NzdfaW5pdF9nbG9iYWwodm9pZCkKK3sKKwkvKgorCSAqIEVuYWJsZSBSL1cgY29uZmlnIHJlZ2lzdGVycworCSAqLworCXdiOTc3X3diKDB4MjYsIDB4NDApOworCisJLyoKKwkgKiBQb3dlciBkb3duIEZEQyAobm90IHVzZWQpCisJICovCisJd2I5Nzdfd2IoMHgyMiwgMHhmZSk7CisKKwkvKgorCSAqIEdQMTIsIEdQMTEsIENJUlJYLCBJUlJYSCwgR1AxMAorCSAqLworCXdiOTc3X3diKDB4MmEsIDB4YzEpOworCisJLyoKKwkgKiBHUDIzLCBHUDIyLCBHUDIxLCBHUDIwLCBHUDEzCisJICovCisJd2I5Nzdfd2IoMHgyYiwgMHg2Yik7CisKKwkvKgorCSAqIEdQMTcsIEdQMTYsIEdQMTUsIEdQMTQKKwkgKi8KKwl3Yjk3N193YigweDJjLCAweDU1KTsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIFdpbmJvbmQgVzgzOTc3RiBwcmludGVyIHBvcnQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdiOTc3X2luaXRfcHJpbnRlcih2b2lkKQoreworCXdiOTc3X2RldmljZV9zZWxlY3QoMSk7CisKKwkvKgorCSAqIG1vZGUgMSA9PSBFUFAKKwkgKi8KKwl3Yjk3N193YigweGYwLCAweDAxKTsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIFdpbmJvbmQgVzgzOTc3RiBrZXlib2FyZCBjb250cm9sbGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3Yjk3N19pbml0X2tleWJvYXJkKHZvaWQpCit7CisJd2I5NzdfZGV2aWNlX3NlbGVjdCg1KTsKKworCS8qCisJICogS2V5Ym9hcmQgY29udHJvbGxlciBhZGRyZXNzCisJICovCisJd2I5Nzdfd3coMHg2MCwgMHgwMDYwKTsKKwl3Yjk3N193dygweDYyLCAweDAwNjQpOworCisJLyoKKwkgKiBLZXlib2FyZCBJUlEgMSwgYWN0aXZlIGhpZ2gsIGVkZ2UgdHJpZ2dlcgorCSAqLworCXdiOTc3X3diKDB4NzAsIDEpOworCXdiOTc3X3diKDB4NzEsIDB4MDIpOworCisJLyoKKwkgKiBNb3VzZSBJUlEgNSwgYWN0aXZlIGhpZ2gsIGVkZ2UgdHJpZ2dlcgorCSAqLworCXdiOTc3X3diKDB4NzIsIDUpOworCXdiOTc3X3diKDB4NzMsIDB4MDIpOworCisJLyoKKwkgKiBLQkMgOE1IegorCSAqLworCXdiOTc3X3diKDB4ZjAsIDB4NDApOworCisJLyoKKwkgKiBFbmFibGUgZGV2aWNlCisJICovCisJd2I5NzdfZGV2aWNlX2VuYWJsZSgpOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgV2luYm9uZCBXODM5NzdGIEluZnJhLVJlZCBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdiOTc3X2luaXRfaXJkYSh2b2lkKQoreworCXdiOTc3X2RldmljZV9zZWxlY3QoNik7CisKKwkvKgorCSAqIElSIGJhc2UgYWRkcmVzcworCSAqLworCXdiOTc3X3d3KDB4NjAsIElSREFfSU9fQkFTRSk7CisKKwkvKgorCSAqIElSREEgSVJRIDYsIGFjdGl2ZSBoaWdoLCBlZGdlIHRyaWdnZXIKKwkgKi8KKwl3Yjk3N193YigweDcwLCA2KTsKKwl3Yjk3N193YigweDcxLCAweDAyKTsKKworCS8qCisJICogUlggRE1BIC0gSVNBIERNQSAwCisJICovCisJd2I5Nzdfd2IoMHg3NCwgMHgwMCk7CisKKwkvKgorCSAqIFRYIERNQSAtIERpc2FibGUgVHggRE1BCisJICovCisJd2I5Nzdfd2IoMHg3NSwgMHgwNCk7CisKKwkvKgorCSAqIEFwcGVuZCBDUkMsIEVuYWJsZSBiYW5rIHNlbGVjdGlvbgorCSAqLworCXdiOTc3X3diKDB4ZjAsIDB4MDMpOworCisJLyoKKwkgKiBFbmFibGUgZGV2aWNlCisJICovCisJd2I5NzdfZGV2aWNlX2VuYWJsZSgpOworfQorCisvKgorICogSW5pdGlhbGlzZSBXaW5ib25kIFc4Mzk3N0YgZ2VuZXJhbCBwdXJwb3NlIElPCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3Yjk3N19pbml0X2dwaW8odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBTZXQgdXAgaW5pdGlhbCBJL08gZGVmaW5pdGlvbnMKKwkgKi8KKwljdXJyZW50X2dwaW9faW8gPSAtMTsKKwlfX2dwaW9fbW9kaWZ5X2lvKC0xLCBHUElPX0RPTkUgfCBHUElPX1dEVElNRVIpOworCisJd2I5NzdfZGV2aWNlX3NlbGVjdCg3KTsKKworCS8qCisJICogR3JvdXAxIGJhc2UgYWRkcmVzcworCSAqLworCXdiOTc3X3d3KDB4NjAsIEdQMV9JT19CQVNFKTsKKwl3Yjk3N193dygweDYyLCAwKTsKKwl3Yjk3N193dygweDY0LCAwKTsKKworCS8qCisJICogR1AxMCAoT3JhZ2UgYnV0dG9uKSBJUlEgMTAsIGFjdGl2ZSBoaWdoLCBlZGdlIHRyaWdnZXIKKwkgKi8KKwl3Yjk3N193YigweDcwLCAxMCk7CisJd2I5Nzdfd2IoMHg3MSwgMHgwMik7CisKKwkvKgorCSAqIEdQMTA6IERlYm91bmNlIGZpbHRlciBlbmFibGVkLCBJUlEsIGlucHV0CisJICovCisJd2I5Nzdfd2IoMHhlMCwgMHgxOSk7CisKKwkvKgorCSAqIEVuYWJsZSBHcm91cDEKKwkgKi8KKwl3Yjk3N19kZXZpY2VfZW5hYmxlKCk7CisKKwl3Yjk3N19kZXZpY2Vfc2VsZWN0KDgpOworCisJLyoKKwkgKiBHcm91cDIgYmFzZSBhZGRyZXNzCisJICovCisJd2I5Nzdfd3coMHg2MCwgR1AyX0lPX0JBU0UpOworCisJLyoKKwkgKiBDbGVhciB3YXRjaGRvZyB0aW1lciByZWdzCisJICogIC0gdGltZXIgZGlzYWJsZQorCSAqLworCXdiOTc3X3diKDB4ZjIsIDB4MDApOworCisJLyoKKwkgKiAgLSBkaXNhYmxlIExFRCwgbm8gbW91c2Ugbm9yIGtleWJvYXJkIElSUQorCSAqLworCXdiOTc3X3diKDB4ZjMsIDB4MDApOworCisJLyoKKwkgKiAgLSB0aW1lciBjb3VudGluZywgZGlzYWJsZSBwb3dlciBMRUQsIGRpc2FibGUgdGltZW91b3QKKwkgKi8KKwl3Yjk3N193YigweGY0LCAweDAwKTsKKworCS8qCisJICogRW5hYmxlIGdyb3VwMgorCSAqLworCXdiOTc3X2RldmljZV9lbmFibGUoKTsKKworCS8qCisJICogU2V0IEdyb3VwMS9Hcm91cDIgb3V0cHV0cworCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwlncGlvX21vZGlmeV9vcCgtMSwgR1BJT19SRURfTEVEIHwgR1BJT19GQU4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgV2luYm9uZCBXODM5NzdGIGNoaXAuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB3Yjk3N19pbml0KHZvaWQpCit7CisJcmVxdWVzdF9yZWdpb24oMHgzNzAsIDIsICJXODM5NzdBRiBjb25maWd1cmF0aW9uIik7CisKKwkvKgorCSAqIE9wZW4gdXAgdGhlIFN1cGVySU8gY2hpcAorCSAqLworCXdiOTc3X29wZW4oKTsKKworCS8qCisJICogSW5pdGlhbGlzZSB0aGUgZ2xvYmFsIHJlZ2lzdGVycworCSAqLworCXdiOTc3X2luaXRfZ2xvYmFsKCk7CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIHZhcmlvdXMgZGV2aWNlcyBpbgorCSAqIHRoZSBtdWx0aS1JTyBjaGlwLgorCSAqLworCXdiOTc3X2luaXRfcHJpbnRlcigpOworCXdiOTc3X2luaXRfa2V5Ym9hcmQoKTsKKwl3Yjk3N19pbml0X2lyZGEoKTsKKwl3Yjk3N19pbml0X2dwaW8oKTsKKworCS8qCisJICogQ2xvc2UgdXAgdGhlIEVGRVIgZ2F0ZQorCSAqLworCXdiOTc3X2Nsb3NlKCk7Cit9CisKK3ZvaWQgY3BsZF9tb2RpZnkoaW50IG1hc2ssIGludCBzZXQpCit7CisJaW50IG1zazsKKworCWN1cnJlbnRfY3BsZCA9IChjdXJyZW50X2NwbGQgJiB+bWFzaykgfCBzZXQ7CisKKwlncGlvX21vZGlmeV9pbyhHUElPX0RBVEEgfCBHUElPX0lPQ0xLIHwgR1BJT19JT0xPQUQsIDApOworCWdwaW9fbW9kaWZ5X29wKEdQSU9fSU9MT0FELCAwKTsKKworCWZvciAobXNrID0gODsgbXNrOyBtc2sgPj49IDEpIHsKKwkJaW50IGJpdCA9IGN1cnJlbnRfY3BsZCAmIG1zazsKKworCQlncGlvX21vZGlmeV9vcChHUElPX0RBVEEgfCBHUElPX0lPQ0xLLCBiaXQgPyBHUElPX0RBVEEgOiAwKTsKKwkJZ3Bpb19tb2RpZnlfb3AoR1BJT19JT0NMSywgR1BJT19JT0NMSyk7CisJfQorCisJZ3Bpb19tb2RpZnlfb3AoR1BJT19JT0NMS3xHUElPX0RBVEEsIDApOworCWdwaW9fbW9kaWZ5X29wKEdQSU9fSU9MT0FEfEdQSU9fRFNDTEssIEdQSU9fSU9MT0FEfEdQSU9fRFNDTEspOworCWdwaW9fbW9kaWZ5X29wKEdQSU9fSU9MT0FELCAwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNwbGRfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJY3BsZF9tb2RpZnkoLTEsIENQTERfVU5NVVRFIHwgQ1BMRF83MTExX0RJU0FCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByd2FfdW5sb2NrW10gX19pbml0ZGF0YSA9Cit7IDB4MDAsIDB4MDAsIDB4NmEsIDB4YjUsIDB4ZGEsIDB4ZWQsIDB4ZjYsIDB4ZmIsIDB4N2QsIDB4YmUsIDB4ZGYsIDB4NmYsIDB4MzcsIDB4MWIsCisgIDB4MGQsIDB4ODYsIDB4YzMsIDB4NjEsIDB4YjAsIDB4NTgsIDB4MmMsIDB4MTYsIDB4OGIsIDB4NDUsIDB4YTIsIDB4ZDEsIDB4ZTgsIDB4NzQsCisgIDB4M2EsIDB4OWQsIDB4Y2UsIDB4ZTcsIDB4NzMsIDB4MzkgfTsKKworI2lmbmRlZiBERUJVRworI2RlZmluZSBkcHJpbnRrKHguLi4pCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKHguLi4pIHByaW50ayh4KQorI2VuZGlmCisKKyNkZWZpbmUgV1JJVEVfUldBKHIsdikgZG8geyBvdXRiKChyKSwgMHgyNzkpOyB1ZGVsYXkoMTApOyBvdXRiKCh2KSwgMHhhNzkpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcndhMDEwX3VubG9jayh2b2lkKQoreworCWludCBpOworCisJV1JJVEVfUldBKDIsIDIpOworCW1kZWxheSgxMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHJ3YV91bmxvY2spOyBpKyspIHsKKwkJb3V0Yihyd2FfdW5sb2NrW2ldLCAweDI3OSk7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcndhMDEwX3JlYWRfaWRlbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNpWzldOworCWludCBpLCBqOworCisJV1JJVEVfUldBKDMsIDApOworCVdSSVRFX1JXQSgwLCAxMjgpOworCisJb3V0YigxLCAweDI3OSk7CisKKwltZGVsYXkoMSk7CisKKwlkcHJpbnRrKCJJZGVudGlmaWVyOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCXNpW2ldID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJaW50IGJpdDsKKwkJCXVkZWxheSgyNTApOworCQkJaW5iKDB4MjAzKTsKKwkJCXVkZWxheSgyNTApOworCQkJYml0ID0gaW5iKDB4MjAzKTsKKwkJCWRwcmludGsoIiUwMlggIiwgYml0KTsKKwkJCWJpdCA9IChiaXQgPT0gMHhhYSkgPyAxIDogMDsKKwkJCXNpW2ldIHw9IGJpdCA8PCBqOworCQl9CisJCWRwcmludGsoIiglMDJYKSAiLCBzaVtpXSk7CisJfQorCWRwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByd2EwMTBfZ2xvYmFsX2luaXQodm9pZCkKK3sKKwlXUklURV9SV0EoNiwgMik7CS8vIEFzc2lnbiBhIGNhcmQgbm8gPSAyCisKKwlkcHJpbnRrKCJDYXJkIG5vID0gJWRcbiIsIGluYigweDIwMykpOworCisJLyogZGlzYWJsZSB0aGUgbW9kZW0gc2VjdGlvbiBvZiB0aGUgY2hpcCAqLworCVdSSVRFX1JXQSg3LCAzKTsKKwlXUklURV9SV0EoMHgzMCwgMCk7CisKKwkvKiBkaXNhYmxlIHRoZSBjZHJvbSBzZWN0aW9uIG9mIHRoZSBjaGlwICovCisJV1JJVEVfUldBKDcsIDQpOworCVdSSVRFX1JXQSgweDMwLCAwKTsKKworCS8qIGRpc2FibGUgdGhlIE1QVS00MDEgc2VjdGlvbiBvZiB0aGUgY2hpcCAqLworCVdSSVRFX1JXQSg3LCAyKTsKKwlXUklURV9SV0EoMHgzMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByd2EwMTBfZ2FtZV9wb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCVdSSVRFX1JXQSg3LCA1KTsKKworCWRwcmludGsoIlNsaWRlciBiYXNlOiAiKTsKKwlXUklURV9SV0EoMHg2MSwgMSk7CisJaSA9IGluYigweDIwMyk7CisKKwlXUklURV9SV0EoMHg2MCwgMik7CisJZHByaW50aygiJTAyWCUwMlggKDIwMSlcbiIsIGluYigweDIwMyksIGkpOworCisJV1JJVEVfUldBKDB4MzAsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcndhMDEwX3dhdmVhcnRpc3RfaW5pdChpbnQgYmFzZSwgaW50IGlycSwgaW50IGRtYSkKK3sKKwlpbnQgaTsKKworCVdSSVRFX1JXQSg3LCAwKTsKKworCWRwcmludGsoIldhdmVBcnRpc3QgYmFzZTogIik7CisJV1JJVEVfUldBKDB4NjEsIGJhc2UgJiAyNTUpOworCWkgPSBpbmIoMHgyMDMpOworCisJV1JJVEVfUldBKDB4NjAsIGJhc2UgPj4gOCk7CisJZHByaW50aygiJTAyWCUwMlggKCVYKSwiLCBpbmIoMHgyMDMpLCBpLCBiYXNlKTsKKworCVdSSVRFX1JXQSgweDcwLCBpcnEpOworCWRwcmludGsoIiBpcnE6ICVkICglZCksIiwgaW5iKDB4MjAzKSwgaXJxKTsKKworCVdSSVRFX1JXQSgweDc0LCBkbWEpOworCWRwcmludGsoIiBkbWE6ICVkICglZClcbiIsIGluYigweDIwMyksIGRtYSk7CisKKwlXUklURV9SV0EoMHgzMCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByd2EwMTBfc291bmRibGFzdGVyX2luaXQoaW50IHNiX2Jhc2UsIGludCBhbF9iYXNlLCBpbnQgaXJxLCBpbnQgZG1hKQoreworCWludCBpOworCisJV1JJVEVfUldBKDcsIDEpOworCisJZHByaW50aygiU291bmRCbGFzdGVyIGJhc2U6ICIpOworCVdSSVRFX1JXQSgweDYxLCBzYl9iYXNlICYgMjU1KTsKKwlpID0gaW5iKDB4MjAzKTsKKworCVdSSVRFX1JXQSgweDYwLCBzYl9iYXNlID4+IDgpOworCWRwcmludGsoIiUwMlglMDJYICglWCksIiwgaW5iKDB4MjAzKSwgaSwgc2JfYmFzZSk7CisKKwlkcHJpbnRrKCIgaXJxOiAiKTsKKwlXUklURV9SV0EoMHg3MCwgaXJxKTsKKwlkcHJpbnRrKCIlZCAoJWQpLCIsIGluYigweDIwMyksIGlycSk7CisKKwlkcHJpbnRrKCIgOC1iaXQgRE1BOiAiKTsKKwlXUklURV9SV0EoMHg3NCwgZG1hKTsKKwlkcHJpbnRrKCIlZCAoJWQpXG4iLCBpbmIoMHgyMDMpLCBkbWEpOworCisJZHByaW50aygiQWRMaWIgYmFzZTogIik7CisJV1JJVEVfUldBKDB4NjMsIGFsX2Jhc2UgJiAyNTUpOworCWkgPSBpbmIoMHgyMDMpOworCisJV1JJVEVfUldBKDB4NjIsIGFsX2Jhc2UgPj4gOCk7CisJZHByaW50aygiJTAyWCUwMlggKCVYKVxuIiwgaW5iKDB4MjAzKSwgaSwgYWxfYmFzZSk7CisKKwlXUklURV9SV0EoMHgzMCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ3YTAxMF9zb3VuZGJsYXN0ZXJfcmVzZXQodm9pZCkKK3sKKwlpbnQgaTsKKworCW91dGIoMSwgMHgyMjYpOworCXVkZWxheSgzKTsKKwlvdXRiKDAsIDB4MjI2KTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaWYgKGluYigweDIyZSkgJiAweDgwKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisJaWYgKGkgPT0gNSkKKwkJcHJpbnRrKCJTb3VuZEJsYXN0ZXI6IERTUCByZXNldCBmYWlsZWRcbiIpOworCisJZHByaW50aygiU291bmRCbGFzdGVyIERTUCByZXNldDogJTAyWCAoQUEpXG4iLCBpbmIoMHgyMmEpKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaWYgKChpbmIoMHgyMmMpICYgMHg4MCkgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCisJaWYgKGkgPT0gNSkKKwkJcHJpbnRrKCJTb3VuZEJsYXN0ZXI6IERTUCBub3QgcmVhZHlcbiIpOworCWVsc2UgeworCQlvdXRiKDB4ZTEsIDB4MjJjKTsKKworCQlkcHJpbnRrKCJTb3VuZEJsYXN0ZXIgRFNQIGlkOiAiKTsKKwkJaSA9IGluYigweDIyYSk7CisJCXVkZWxheSgxKTsKKwkJaSB8PSBpbmIoMHgyMmEpIDw8IDg7CisJCWRwcmludGsoIiUwNFhcbiIsIGkpOworCisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWlmICgoaW5iKDB4MjJjKSAmIDB4ODApID09IDApCisJCQkJYnJlYWs7CisJCQltZGVsYXkoMSk7CisJCX0KKworCQlpZiAoaSA9PSA1KQorCQkJcHJpbnRrKCJTb3VuZEJsYXN0ZXI6IGNvdWxkIG5vdCB0dXJuIHNwZWFrZXIgb2ZmXG4iKTsKKworCQlvdXRiKDB4ZDMsIDB4MjJjKTsKKwl9CisKKwkvKiB0dXJuIG9uIE9QTDMgKi8KKwlvdXRiKDUsIDB4MzhhKTsKKwlvdXRiKDEsIDB4MzhiKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHJ3YTAxMF9pbml0KHZvaWQpCit7CisJcndhMDEwX3VubG9jaygpOworCXJ3YTAxMF9yZWFkX2lkZW50KCk7CisJcndhMDEwX2dsb2JhbF9pbml0KCk7CisJcndhMDEwX2dhbWVfcG9ydF9pbml0KCk7CisJcndhMDEwX3dhdmVhcnRpc3RfaW5pdCgweDI1MCwgMywgNyk7CisJcndhMDEwX3NvdW5kYmxhc3Rlcl9pbml0KDB4MjIwLCAweDM4OCwgMywgMSk7CisJcndhMDEwX3NvdW5kYmxhc3Rlcl9yZXNldCgpOworfQorCitFWFBPUlRfU1lNQk9MKGdwaW9fbG9jayk7CitFWFBPUlRfU1lNQk9MKGdwaW9fbW9kaWZ5X29wKTsKK0VYUE9SVF9TWU1CT0woZ3Bpb19tb2RpZnlfaW8pOworRVhQT1JUX1NZTUJPTChjcGxkX21vZGlmeSk7CisKKy8qCisgKiBJbml0aWFsaXNlIGFueSBvdGhlciBoYXJkd2FyZSBhZnRlciB3ZSd2ZSBnb3QgdGhlIFBDSSBidXMKKyAqIGluaXRpYWxpc2VkLiAgV2UgbWF5IG5lZWQgdGhlIFBDSSBidXMgdG8gdGFsayB0byB0aGlzIG90aGVyCisgKiBoYXJkd2FyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgbndfaHdfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJd2I5NzdfaW5pdCgpOworCQljcGxkX2luaXQoKTsKKwkJcndhMDEwX2luaXQoKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJCWdwaW9fbW9kaWZ5X29wKEdQSU9fUkVEX0xFRHxHUElPX0dSRUVOX0xFRCwgREVGQVVMVF9MRURTKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKG53X2h3X2luaXQpOworCisvKgorICogT2xkZXIgTmVUVHJvbXMgZWl0aGVyIGRvIG5vdCBwcm92aWRlIGEgcGFyYW1ldGVycworICogcGFnZSwgb3IgdGhleSBkb24ndCBzdXBwbHkgY29ycmVjdCBpbmZvcm1hdGlvbiBpbgorICogdGhlIHBhcmFtZXRlciBwYWdlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQKK2ZpeHVwX25ldHdpbmRlcihzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLAorCQljaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworI2lmZGVmIENPTkZJR19JU0FQTlAKKwlleHRlcm4gaW50IGlzYXBucF9kaXNhYmxlOworCisJLyoKKwkgKiBXZSBtdXN0IG5vdCB1c2UgdGhlIGtlcm5lbHMgSVNBUG5QIGNvZGUKKwkgKiBvbiB0aGUgTmV0V2luZGVyIC0gaXQgd2lsbCByZXNldCB0aGUgc2V0dGluZ3MKKwkgKiBmb3IgdGhlIFdhdmVBcnRpc3QgY2hpcCBhbmQgcmVuZGVyIGl0IGlub3BlcmFibGUuCisJICovCisJaXNhcG5wX2Rpc2FibGUgPSAxOworI2VuZGlmCit9CisKK01BQ0hJTkVfU1RBUlQoTkVUV0lOREVSLCAiUmViZWwtTmV0V2luZGVyIikKKwlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmcvUmViZWwuY29tIikKKwlCT09UX01FTSgweDAwMDAwMDAwLCBEQzIxMjg1X0FSTUNTUl9CQVNFLCAweGZlMDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCisJVklERU8oMHgwMDBhMDAwMCwgMHgwMDBiZmZmZikKKwlESVNBQkxFX1BBUlBPUlQoMCkKKwlESVNBQkxFX1BBUlBPUlQoMikKKwlGSVhVUChmaXh1cF9uZXR3aW5kZXIpCisJTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCisJSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS50aW1lcgkJPSAmaXNhX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1sZWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1MWZjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItbGVkcy5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItbGVkcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTmV0V2luZGVyIExFRCBjb250cm9sIHJvdXRpbmVzLgorICoKKyAqIFRoZSBOZXR3aW5kZXIgdXNlcyB0aGUgbGVkcyBhcyBmb2xsb3dzOgorICogIC0gR3JlZW4gLSB0b2dnbGVzIHN0YXRlIGV2ZXJ5IDUwIHRpbWVyIGludGVycnVwdHMKKyAqICAtIFJlZCAgIC0gT24gaWYgdGhlIHN5c3RlbSBpcyBub3QgaWRsZQorICoKKyAqIENoYW5nZWxvZzoKKyAqICAgMDItMDUtMTk5OQlSTUsJVmFyaW91cyBjbGVhbnVwcworICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECTEKKyNkZWZpbmUgTEVEX1NUQVRFX0NMQUlNRUQJMgorc3RhdGljIGNoYXIgbGVkX3N0YXRlOworc3RhdGljIGNoYXIgaHdfbGVkX3N0YXRlOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxlZHNfbG9jayk7CitleHRlcm4gc3BpbmxvY2tfdCBncGlvX2xvY2s7CisKK3N0YXRpYyB2b2lkIG5ldHdpbmRlcl9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxlZHNfbG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChldnQpIHsKKwljYXNlIGxlZF9zdGFydDoKKwkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9FTkFCTEVEOworCQlod19sZWRfc3RhdGUgPSBHUElPX0dSRUVOX0xFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9zdG9wOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9FTkFCTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX2NsYWltOgorCQlsZWRfc3RhdGUgfD0gTEVEX1NUQVRFX0NMQUlNRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVsZWFzZToKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfTEVEU19USU1FUgorCWNhc2UgbGVkX3RpbWVyOgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgXj0gR1BJT19HUkVFTl9MRUQ7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgJj0gfkdQSU9fUkVEX0xFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlIHw9IEdQSU9fUkVEX0xFRDsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgbGVkX2hhbHRlZDoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlIHw9IEdQSU9fUkVEX0xFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9ncmVlbl9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IEdQSU9fR1JFRU5fTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH5HUElPX0dSRUVOX0xFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9hbWJlcl9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IEdQSU9fR1JFRU5fTEVEIHwgR1BJT19SRURfTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX2FtYmVyX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH4oR1BJT19HUkVFTl9MRUQgfCBHUElPX1JFRF9MRUQpOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IEdQSU9fUkVEX0xFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWRfb2ZmOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfkdQSU9fUkVEX0xFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsZWRzX2xvY2ssIGZsYWdzKTsKKworCWlmICAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCQlncGlvX21vZGlmeV9vcChHUElPX1JFRF9MRUQgfCBHUElPX0dSRUVOX0xFRCwgaHdfbGVkX3N0YXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBsZWRzX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJbGVkc19ldmVudCA9IG5ldHdpbmRlcl9sZWRzX2V2ZW50OworCisJbGVkc19ldmVudChsZWRfc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwobGVkc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItcGNpLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNjNkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLXBjaS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLXBjaS5jCisgKgorICogUENJIGJpb3MtdHlwZSBpbml0aWFsaXNhdGlvbiBmb3IgUENJIG1hY2hpbmVzCisgKgorICogQml0cyB0YWtlbiBmcm9tIHZhcmlvdXMgcGxhY2VzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8qCisgKiBXZSBub3cgdXNlIHRoZSBzbG90IElEIGluc3RlYWQgb2YgdGhlIGRldmljZSBpZGVudGlmaWVycyB0byBzZWxlY3QKKyAqIHdoaWNoIGludGVycnVwdCBpcyByb3V0ZWQgd2hlcmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5ldHdpbmRlcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlzd2l0Y2ggKHNsb3QpIHsKKwljYXNlIDA6ICAvKiBob3N0IGJyaWRnZSAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgOTogIC8qIEN5YmVyUHJvICovCisJCXJldHVybiBJUlFfTkVUV0lOREVSX1ZHQTsKKworCWNhc2UgMTA6IC8qIERDMjExNDMgKi8KKwkJcmV0dXJuIElSUV9ORVRXSU5ERVJfRVRIRVIxMDA7CisKKwljYXNlIDEyOiAvKiBXaW5ib25kIDU1MyAqLworCQlyZXR1cm4gSVJRX0lTQV9IQVJERElTSzE7CisKKwljYXNlIDEzOiAvKiBXaW5ib25kIDg5Qzk0MEYgKi8KKwkJcmV0dXJuIElSUV9ORVRXSU5ERVJfRVRIRVIxMDsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiUENJOiB1bmtub3duIGRldmljZSBpbiBzbG90ICVzXG4iLAorCQkJcGNpX25hbWUoZGV2KSk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBod19wY2kgbmV0d2luZGVyX3BjaSBfX2luaXRkYXRhID0geworCS5zd2l6emxlCQk9IHBjaV9zdGRfc3dpenpsZSwKKwkubWFwX2lycQkJPSBuZXR3aW5kZXJfbWFwX2lycSwKKwkubnJfY29udHJvbGxlcnMJCT0gMSwKKwkuc2V0dXAJCQk9IGRjMjEyODVfc2V0dXAsCisJLnNjYW4JCQk9IGRjMjEyODVfc2Nhbl9idXMsCisJLnByZWluaXQJCT0gZGMyMTI4NV9wcmVpbml0LAorCS5wb3N0aW5pdAkJPSBkYzIxMjg1X3Bvc3Rpbml0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmV0d2luZGVyX3BjaV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfbmV0d2luZGVyKCkpCisJCXBjaV9jb21tb25faW5pdCgmbmV0d2luZGVyX3BjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChuZXR3aW5kZXJfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwtcGNpLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC1wY2kuYworICoKKyAqIFBDSSBiaW9zLXR5cGUgaW5pdGlhbGlzYXRpb24gZm9yIFBDSSBtYWNoaW5lcworICoKKyAqIEJpdHMgdGFrZW4gZnJvbSB2YXJpb3VzIHBsYWNlcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCitzdGF0aWMgaW50IGlycW1hcF9wZXJzb25hbF9zZXJ2ZXJbXSBfX2luaXRkYXRhID0geworCUlSUV9JTjAsIElSUV9JTjEsIElSUV9JTjIsIElSUV9JTjMsIDAsIDAsIDAsCisJSVJRX0RPT1JCRUxMSE9TVCwgSVJRX0RNQTEsIElSUV9ETUEyLCBJUlFfUENJCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwZXJzb25hbF9zZXJ2ZXJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJdW5zaWduZWQgY2hhciBsaW5lOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZsaW5lKTsKKworCWlmIChsaW5lID4gMHg0MCAmJiBsaW5lIDw9IDB4NWYpIHsKKwkJLyogbGluZSBjb3JyZXNwb25kcyB0byB0aGUgYml0IGNvbnRyb2xsaW5nIHRoaXMgaW50ZXJydXB0CisJCSAqIGluIHRoZSBmb290YnJpZGdlLiAgSWdub3JlIHRoZSBmaXJzdCA4IGludGVycnVwdCBiaXRzLAorCQkgKiBsb29rIHVwIHRoZSByZXN0IGluIHRoZSBtYXAuICBJTjAgaXMgYml0IG51bWJlciA4CisJCSAqLworCQlyZXR1cm4gaXJxbWFwX3BlcnNvbmFsX3NlcnZlclsobGluZSAmIDB4MWYpIC0gOF07CisJfSBlbHNlIGlmIChsaW5lID09IDApIHsKKwkJLyogbm8gaW50ZXJydXB0ICovCisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gaXJxbWFwX3BlcnNvbmFsX3NlcnZlclsobGluZSAtIDEpICYgM107Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcGNpIHBlcnNvbmFsX3NlcnZlcl9wY2kgX19pbml0ZGF0YSA9IHsKKwkubWFwX2lycQkJPSBwZXJzb25hbF9zZXJ2ZXJfbWFwX2lycSwKKwkubnJfY29udHJvbGxlcnMJCT0gMSwKKwkuc2V0dXAJCQk9IGRjMjEyODVfc2V0dXAsCisJLnNjYW4JCQk9IGRjMjEyODVfc2Nhbl9idXMsCisJLnByZWluaXQJCT0gZGMyMTI4NV9wcmVpbml0LAorCS5wb3N0aW5pdAkJPSBkYzIxMjg1X3Bvc3Rpbml0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGVyc29uYWxfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19wZXJzb25hbF9zZXJ2ZXIoKSkKKwkJcGNpX2NvbW1vbl9pbml0KCZwZXJzb25hbF9zZXJ2ZXJfcGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHBlcnNvbmFsX3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MDg2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwuYworICoKKyAqIFBlcnNvbmFsIHNlcnZlciAoU2tpZmYpIG1hY2hpbmUgZml4dXAKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworTUFDSElORV9TVEFSVChQRVJTT05BTF9TRVJWRVIsICJDb21wYXEtUGVyc29uYWxTZXJ2ZXIiKQorCU1BSU5UQUlORVIoIkphbWV5IEhpY2tzIC8gR2VvcmdlIEZyYW5jZSIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgREMyMTI4NV9BUk1DU1JfQkFTRSwgMHhmZTAwMDAwMCkKKwlCT09UX1BBUkFNUygweDAwMDAwMTAwKQorCU1BUElPKGZvb3RicmlkZ2VfbWFwX2lvKQorCUlOSVRJUlEoZm9vdGJyaWRnZV9pbml0X2lycSkKKwkudGltZXIJCT0gJmZvb3RicmlkZ2VfdGltZXIsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY0YTBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3RpbWUuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMjg1L3RpbWUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggUnVzc2VsbCBLaW5nLgorICogIENvcHlyaWdodCAoQykgMTk5OCBQaGlsIEJsdW5kZWxsCisgKgorICogQ0FUUyBoYXMgYSByZWFsLXRpbWUgY2xvY2ssIHRob3VnaCB0aGUgZXZhbHVhdGlvbiBib2FyZCBkb2Vzbid0LgorICoKKyAqIENoYW5nZWxvZzoKKyAqICAyMS1NYXItMTk5OAlSTUsJQ3JlYXRlZAorICogIDI3LUF1Zy0xOTk4CVBKQglDQVRTIHN1cHBvcnQKKyAqICAyOC1EZWMtMTk5OAlBUEgJTWFkZSBsZWRzIG9wdGlvbmFsCisgKiAgMjAtSmFuLTE5OTkJUk1LCVN0YXJ0ZWQgbWVyZ2Ugb2YgRUJTQTI4NSwgQ0FUUyBhbmQgTmV0V2luZGVyCisgKiAgMTYtTWFyLTE5OTkJUk1LCU1vcmUgc3VwcG9ydCBmb3IgRUJTQTI4NS1saWtlIG1hY2hpbmVzIHdpdGggUlRDcyBpbgorICovCisKKyNkZWZpbmUgUlRDX1BPUlQoeCkJCShydGNfYmFzZSsoeCkpCisjZGVmaW5lIFJUQ19BTFdBWVNfQkNECQkwCisKKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIGludCBydGNfYmFzZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGdldF9pc2FfY21vc190aW1lKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKKwlpbnQgaTsKKworCS8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgUlRDIG1ha2VzIHNlbnNlLi4uLi4KKwlpZiAoKENNT1NfUkVBRChSVENfVkFMSUQpICYgUlRDX1ZSVCkgPT0gMCkKKwkJcmV0dXJuIG1rdGltZSgxOTcwLCAxLCAxLCAwLCAwLCAwKTsKKworCS8qIFRoZSBMaW51eCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgQ01PUyBjbG9jayByZWdpc3RlciBjb250ZW50czoKKwkgKiBXaGVuIHRoZSBVcGRhdGUtSW4tUHJvZ3Jlc3MgKFVJUCkgZmxhZyBnb2VzIGZyb20gMSB0byAwLCB0aGUKKwkgKiBSVEMgcmVnaXN0ZXJzIHNob3cgdGhlIHNlY29uZCB3aGljaCBoYXMgcHJlY2lzZWx5IGp1c3Qgc3RhcnRlZC4KKwkgKiBMZXQncyBob3BlIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGludGVycHJldCB0aGUgUlRDIHRoZSBzYW1lIHdheS4KKwkgKi8KKwkvKiByZWFkIFJUQyBleGFjdGx5IG9uIGZhbGxpbmcgZWRnZSBvZiB1cGRhdGUgZmxhZyAqLworCWZvciAoaSA9IDAgOyBpIDwgMTAwMDAwMCA7IGkrKykgLyogbWF5IHRha2UgdXAgdG8gMSBzZWNvbmQuLi4gKi8KKwkJaWYgKENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpICYgUlRDX1VJUCkKKwkJCWJyZWFrOworCisJZm9yIChpID0gMCA7IGkgPCAxMDAwMDAwIDsgaSsrKSAvKiBtdXN0IHRyeSBhdCBsZWFzdCAyLjIyOCBtcyAqLworCQlpZiAoIShDTU9TX1JFQUQoUlRDX0ZSRVFfU0VMRUNUKSAmIFJUQ19VSVApKQorCQkJYnJlYWs7CisKKwlkbyB7IC8qIElzbid0IHRoaXMgb3ZlcmtpbGwgPyBVSVAgYWJvdmUgc2hvdWxkIGd1YXJhbnRlZSBjb25zaXN0ZW5jeSAqLworCQlzZWMgID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKTsKKwkJbWluICA9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7CisJCWhvdXIgPSBDTU9TX1JFQUQoUlRDX0hPVVJTKTsKKwkJZGF5ICA9IENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKKwkJbW9uICA9IENNT1NfUkVBRChSVENfTU9OVEgpOworCQl5ZWFyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKKwl9IHdoaWxlIChzZWMgIT0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKSk7CisKKwlpZiAoIShDTU9TX1JFQUQoUlRDX0NPTlRST0wpICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpIHsKKwkJQkNEX1RPX0JJTihzZWMpOworCQlCQ0RfVE9fQklOKG1pbik7CisJCUJDRF9UT19CSU4oaG91cik7CisJCUJDRF9UT19CSU4oZGF5KTsKKwkJQkNEX1RPX0JJTihtb24pOworCQlCQ0RfVE9fQklOKHllYXIpOworCX0KKwlpZiAoKHllYXIgKz0gMTkwMCkgPCAxOTcwKQorCQl5ZWFyICs9IDEwMDsKKwlyZXR1cm4gbWt0aW1lKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYyk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lzYV9jbW9zX3RpbWUodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgcmVhbF9zZWNvbmRzLCByZWFsX21pbnV0ZXMsIGNtb3NfbWludXRlczsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbCwgc2F2ZV9mcmVxX3NlbGVjdDsKKwl1bnNpZ25lZCBsb25nIG5vd3RpbWUgPSB4dGltZS50dl9zZWM7CisKKwlzYXZlX2NvbnRyb2wgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOyAvKiB0ZWxsIHRoZSBjbG9jayBpdCdzIGJlaW5nIHNldCAqLworCUNNT1NfV1JJVEUoKHNhdmVfY29udHJvbHxSVENfU0VUKSwgUlRDX0NPTlRST0wpOworCisJc2F2ZV9mcmVxX3NlbGVjdCA9IENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpOyAvKiBzdG9wIGFuZCByZXNldCBwcmVzY2FsZXIgKi8KKwlDTU9TX1dSSVRFKChzYXZlX2ZyZXFfc2VsZWN0fFJUQ19ESVZfUkVTRVQyKSwgUlRDX0ZSRVFfU0VMRUNUKTsKKworCWNtb3NfbWludXRlcyA9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7CisJaWYgKCEoc2F2ZV9jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpCisJCUJDRF9UT19CSU4oY21vc19taW51dGVzKTsKKworCS8qCisJICogc2luY2Ugd2UncmUgb25seSBhZGp1c3RpbmcgbWludXRlcyBhbmQgc2Vjb25kcywKKwkgKiBkb24ndCBpbnRlcmZlcmUgd2l0aCBob3VyIG92ZXJmbG93LiBUaGlzIGF2b2lkcworCSAqIG1lc3Npbmcgd2l0aCB1bmtub3duIHRpbWUgem9uZXMgYnV0IHJlcXVpcmVzIHlvdXIKKwkgKiBSVEMgbm90IHRvIGJlIG9mZiBieSBtb3JlIHRoYW4gMTUgbWludXRlcworCSAqLworCXJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MDsKKwlyZWFsX21pbnV0ZXMgPSBub3d0aW1lIC8gNjA7CisJaWYgKCgoYWJzKHJlYWxfbWludXRlcyAtIGNtb3NfbWludXRlcykgKyAxNSkvMzApICYgMSkKKwkJcmVhbF9taW51dGVzICs9IDMwOwkJLyogY29ycmVjdCBmb3IgaGFsZiBob3VyIHRpbWUgem9uZSAqLworCXJlYWxfbWludXRlcyAlPSA2MDsKKworCWlmIChhYnMocmVhbF9taW51dGVzIC0gY21vc19taW51dGVzKSA8IDMwKSB7CisJCWlmICghKHNhdmVfY29udHJvbCAmIFJUQ19ETV9CSU5BUlkpIHx8IFJUQ19BTFdBWVNfQkNEKSB7CisJCQlCSU5fVE9fQkNEKHJlYWxfc2Vjb25kcyk7CisJCQlCSU5fVE9fQkNEKHJlYWxfbWludXRlcyk7CisJCX0KKwkJQ01PU19XUklURShyZWFsX3NlY29uZHMsUlRDX1NFQ09ORFMpOworCQlDTU9TX1dSSVRFKHJlYWxfbWludXRlcyxSVENfTUlOVVRFUyk7CisJfSBlbHNlCisJCXJldHZhbCA9IC0xOworCisJLyogVGhlIGZvbGxvd2luZyBmbGFncyBoYXZlIHRvIGJlIHJlbGVhc2VkIGV4YWN0bHkgaW4gdGhpcyBvcmRlciwKKwkgKiBvdGhlcndpc2UgdGhlIERTMTI4ODcgKHBvcHVsYXIgTUMxNDY4MThBIGNsb25lIHdpdGggaW50ZWdyYXRlZAorCSAqIGJhdHRlcnkgYW5kIHF1YXJ0eikgd2lsbCBub3QgcmVzZXQgdGhlIG9zY2lsbGF0b3IgYW5kIHdpbGwgbm90CisJICogdXBkYXRlIHByZWNpc2VseSA1MDAgbXMgbGF0ZXIuIFlvdSB3b24ndCBmaW5kIHRoaXMgbWVudGlvbmVkIGluCisJICogdGhlIERhbGxhcyBTZW1pY29uZHVjdG9yIGRhdGEgc2hlZXRzLCBidXQgd2hvIGJlbGlldmVzIGRhdGEKKwkgKiBzaGVldHMgYW55d2F5IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIE1hcmt1cyBLdWhuCisJICovCisJQ01PU19XUklURShzYXZlX2NvbnRyb2wsIFJUQ19DT05UUk9MKTsKKwlDTU9TX1dSSVRFKHNhdmVfZnJlcV9zZWxlY3QsIFJUQ19GUkVRX1NFTEVDVCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIF9faW5pdCBpc2FfcnRjX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19jbzI4NSgpIHx8CisJICAgIG1hY2hpbmVfaXNfcGVyc29uYWxfc2VydmVyKCkpCisJCS8qCisJCSAqIEFkZC1pbiAyMTI4NXMgc2hvdWxkbid0IGFjY2VzcyB0aGUgUlRDCisJCSAqLworCQlydGNfYmFzZSA9IDA7CisJZWxzZQorCQlydGNfYmFzZSA9IDB4NzA7CisKKwlpZiAocnRjX2Jhc2UpIHsKKwkJaW50IHJlZ19kLCByZWdfYjsKKworCQkvKgorCQkgKiBQcm9iZSBmb3IgdGhlIFJUQy4KKwkJICovCisJCXJlZ19kID0gQ01PU19SRUFEKFJUQ19SRUdfRCk7CisKKwkJLyoKKwkJICogbWFrZSBzdXJlIHRoZSBkaXZpZGVyIGlzIHNldAorCQkgKi8KKwkJQ01PU19XUklURShSVENfUkVGX0NMQ0tfMzJLSFosIFJUQ19SRUdfQSk7CisKKwkJLyoKKwkJICogU2V0IGNvbnRyb2wgcmVnIEIKKwkJICogICAoMjQgaG91ciBtb2RlLCB1cGRhdGUgZW5hYmxlZCkKKwkJICovCisJCXJlZ19iID0gQ01PU19SRUFEKFJUQ19SRUdfQikgJiAweDdmOworCQlyZWdfYiB8PSAyOworCQlDTU9TX1dSSVRFKHJlZ19iLCBSVENfUkVHX0IpOworCisJCWlmICgoQ01PU19SRUFEKFJUQ19SRUdfQSkgJiAweDdmKSA9PSBSVENfUkVGX0NMQ0tfMzJLSFogJiYKKwkJICAgIENNT1NfUkVBRChSVENfUkVHX0IpID09IHJlZ19iKSB7CisJCQlzdHJ1Y3QgdGltZXNwZWMgdHY7CisKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgUlRDLiAgQ2hlY2sgdGhlIGJhdHRlcnkKKwkJCSAqLworCQkJaWYgKChyZWdfZCAmIDB4ODApID09IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlRDOiAqKiogd2FybmluZzogQ01PUyBiYXR0ZXJ5IGJhZFxuIik7CisKKwkJCXR2LnR2X25zZWMgPSAwOworCQkJdHYudHZfc2VjID0gZ2V0X2lzYV9jbW9zX3RpbWUoKTsKKwkJCWRvX3NldHRpbWVvZmRheSgmdHYpOworCQkJc2V0X3J0YyA9IHNldF9pc2FfY21vc190aW1lOworCQl9IGVsc2UKKwkJCXJ0Y19iYXNlID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWg3MjB4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2OTgyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvS2NvbmZpZwpAQCAtMCwwICsxLDM4IEBACitpZiBBUkNIX0g3MjBYCisKK21lbnUgImg3MjB4IEltcGxlbWVudGF0aW9ucyIKKworY29uZmlnIEFSQ0hfSDcyMDEKKwlib29sICJnbXMzMGM3MjAxIgorCWRlcGVuZHMgb24gQVJDSF9INzIwWAorCXNlbGVjdCBDUFVfSDcyMDEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEh5bml4IEdNUzMwQzcyMDEgUmVmZXJlbmNlIEJvYXJkCisKK2NvbmZpZyBBUkNIX0g3MjAyCisJYm9vbCAiaG1zMzBjNzIwMiIKKwlzZWxlY3QgQ1BVX0g3MjAyCisJZGVwZW5kcyBvbiBBUkNIX0g3MjBYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBIeW5peCBITVMzMEM3MjAyIFJlZmVyZW5jZSBCb2FyZAorCitlbmRtZW51CisKK2NvbmZpZyBDUFVfSDcyMDEKKwlib29sCisJaGVscAorCSAgU2VsZWN0IGNvZGUgc3BlY2lmaWMgdG8gaDcyMDEgdmFyaWFudHMKKworY29uZmlnIENQVV9INzIwMgorCWJvb2wKKwloZWxwCisJICBTZWxlY3QgY29kZSBzcGVjaWZpYyB0byBoNzIwMiB2YXJpYW50cworY29uZmlnIEg3MjAyX1NFUklBTDIzCisJZGVwZW5kcyBvbiBDUFVfSDcyMDIKKwlib29sICJVc2Ugc2VyaWFsIHBvcnRzIDIrMyIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3aXNoIHRvIHVzZSBzZXJpYWwgcG9ydHMgMiszLiBUaGV5IHNoYXJlIHRoZWlyCisJICBwaW5zIHdpdGggdGhlIGtleWJvYXJkIG1hdHJpeCBjb250cm9sbGVyLCBzbyB5b3UgaGF2ZSB0byBkZWNpZGUuCisKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWg3MjB4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Y2Y3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgQ29tbW9uIHN1cHBvcnQKK29iai15IDo9IGNvbW1vbi5vCitvYmotbSA6PQorb2JqLW4gOj0KK29iai0gIDo9CisKKyMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydAorCitvYmotJChDT05GSUdfQVJDSF9INzIwMSkJCSs9IGg3MjAxLWV2YWwubworb2JqLSQoQ09ORklHX0FSQ0hfSDcyMDIpCQkrPSBoNzIwMi1ldmFsLm8KK29iai0kKENPTkZJR19DUFVfSDcyMDEpIAkJKz0gY3B1LWg3MjAxLm8KK29iai0kKENPTkZJR19DUFVfSDcyMDIpIAkJKz0gY3B1LWg3MjAyLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtaDcyMHgvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjk4NDAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsMiBAQAorICAgenJlbGFkZHItJChDT05GSUdfQVJDSF9INzIwWCkJOj0gMHg0MDAwODAwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmFhM2FmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jb21tb24uYwpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtaDcyMHgvY29tbW9uLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgICAgICAgICAgICAgIDIwMDMgUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPgorICogICAgICAgICAgICAgICAyMDA0IFNhc2NoYSBIYXVlciAgICA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBjb21tb24gc3R1ZmYgZm9yIEh5bml4IGg3MjB4IHByb2Nlc3NvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2RtYS5oPgorCisjaWYgMAorI2RlZmluZSBJUlFEQkcoYXJncy4uLikgcHJpbnRrKGFyZ3MpCisjZWxzZQorI2RlZmluZSBJUlFEQkcoYXJncy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCit2b2lkIF9faW5pdCBhcmNoX2RtYV9pbml0KGRtYV90ICpkbWEpCit7Cit9CisKKy8qCisgKiBSZXR1cm4gdXNlY3Mgc2luY2UgbGFzdCB0aW1lciByZWxvYWQKKyAqICh0aW1lcmNvdW50ICogKHVzZWNzIHBlcmppZmZpZSkpIC8gKHRpY2tzIHBlciBqaWZmaWUpCisgKi8KK3Vuc2lnbmVkIGxvbmcgaDcyMHhfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCXJldHVybiAoQ1BVX1JFRyAoVElNRVJfVklSVCwgVE0wX0NPVU5UKSAqIHRpY2tfdXNlYykgLyBMQVRDSDsKK30KKworLyoKKyAqIG1hc2sgR2xvYmFsIGlycSdzCisgKi8KK3N0YXRpYyB2b2lkIG1hc2tfZ2xvYmFsX2lycSAodW5zaWduZWQgaW50IGlycSApCit7CisJQ1BVX1JFRyAoSVJRQ19WSVJULCBJUlFDX0lFUikgJj0gfigxIDw8IGlycSk7Cit9CisKKy8qCisgKiB1bm1hc2sgR2xvYmFsIGlycSdzCisgKi8KK3N0YXRpYyB2b2lkIHVubWFza19nbG9iYWxfaXJxICh1bnNpZ25lZCBpbnQgaXJxICkKK3sKKwlDUFVfUkVHIChJUlFDX1ZJUlQsIElSUUNfSUVSKSB8PSAoMSA8PCBpcnEpOworfQorCisKKy8qCisgKiBhY2sgR1BJTyBpcnEncworICogQWNrIG9ubHkgZm9yIGVkZ2UgdHJpZ2dlcmVkIGludCdzIHZhbGlkCisgKi8KK3N0YXRpYyB2b2lkIGlubGluZSBhY2tfZ3Bpb19pcnEodTMyIGlycSkKK3sKKwl1MzIgcmVnX2Jhc2UgPSBHUElPX1ZJUlQoSVJRX1RPX1JFR05PKGlycSkpOworCXUzMiBiaXQgPSBJUlFfVE9fQklUKGlycSk7CisJaWYgKCAoQ1BVX1JFRyAocmVnX2Jhc2UsIEdQSU9fRURHRSkgJiBiaXQpKQorCQlDUFVfUkVHIChyZWdfYmFzZSwgR1BJT19DTFIpID0gYml0OworfQorCisvKgorICogbWFzayBHUElPIGlycSdzCisgKi8KK3N0YXRpYyB2b2lkIGlubGluZSBtYXNrX2dwaW9faXJxKHUzMiBpcnEpCit7CisJdTMyIHJlZ19iYXNlID0gR1BJT19WSVJUKElSUV9UT19SRUdOTyhpcnEpKTsKKwl1MzIgYml0ID0gSVJRX1RPX0JJVChpcnEpOworCUNQVV9SRUcgKHJlZ19iYXNlLCBHUElPX01BU0spICY9IH5iaXQ7Cit9CisKKy8qCisgKiB1bm1hc2sgR1BJTyBpcnEncworICovCitzdGF0aWMgdm9pZCBpbmxpbmUgdW5tYXNrX2dwaW9faXJxKHUzMiBpcnEpCit7CisJdTMyIHJlZ19iYXNlID0gR1BJT19WSVJUKElSUV9UT19SRUdOTyhpcnEpKTsKKwl1MzIgYml0ID0gSVJRX1RPX0JJVChpcnEpOworCUNQVV9SRUcgKHJlZ19iYXNlLCBHUElPX01BU0spIHw9IGJpdDsKK30KKworc3RhdGljIHZvaWQKK2g3MjB4X2dwaW9faGFuZGxlcih1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGlycSwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGlycWRlc2MgKmRlc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCUlSUURCRygiJXMgaXJxOiAlZFxuIixfX0ZVTkNUSU9OX18saXJxKTsKKwlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJd2hpbGUgKG1hc2spIHsKKwkJaWYgKG1hc2sgJiAxKSB7CisJCQlJUlFEQkcoImhhbmRsaW5nIGlycSAlZFxuIiwgaXJxKTsKKwkJCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQl9CisJCWlycSsrOworCQlkZXNjKys7CisJCW1hc2sgPj49IDE7CisJfQorfQorCitzdGF0aWMgdm9pZAoraDcyMHhfZ3Bpb2FfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzaywgaXJxOworCisJbWFzayA9IENQVV9SRUcoR1BJT19BX1ZJUlQsR1BJT19TVEFUKTsKKwlpcnEgPSBJUlFfQ0hBSU5FRF9HUElPQSgwKTsKKwlJUlFEQkcoIiVzIG1hc2s6IDB4JTA4eCBpcnE6ICVkXG4iLF9fRlVOQ1RJT05fXyxtYXNrLGlycSk7CisJaDcyMHhfZ3Bpb19oYW5kbGVyKG1hc2ssIGlycSwgZGVzYywgcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkCitoNzIweF9ncGlvYl9kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBtYXNrLCBpcnE7CisJbWFzayA9IENQVV9SRUcoR1BJT19CX1ZJUlQsR1BJT19TVEFUKTsKKwlpcnEgPSBJUlFfQ0hBSU5FRF9HUElPQigwKTsKKwlJUlFEQkcoIiVzIG1hc2s6IDB4JTA4eCBpcnE6ICVkXG4iLF9fRlVOQ1RJT05fXyxtYXNrLGlycSk7CisJaDcyMHhfZ3Bpb19oYW5kbGVyKG1hc2ssIGlycSwgZGVzYywgcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkCitoNzIweF9ncGlvY19kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBtYXNrLCBpcnE7CisKKwltYXNrID0gQ1BVX1JFRyhHUElPX0NfVklSVCxHUElPX1NUQVQpOworCWlycSA9IElSUV9DSEFJTkVEX0dQSU9DKDApOworCUlSUURCRygiJXMgbWFzazogMHglMDh4IGlycTogJWRcbiIsX19GVU5DVElPTl9fLG1hc2ssaXJxKTsKKwloNzIweF9ncGlvX2hhbmRsZXIobWFzaywgaXJxLCBkZXNjLCByZWdzKTsKK30KKworc3RhdGljIHZvaWQKK2g3MjB4X2dwaW9kX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2ssIGlycTsKKworCW1hc2sgPSBDUFVfUkVHKEdQSU9fRF9WSVJULEdQSU9fU1RBVCk7CisJaXJxID0gSVJRX0NIQUlORURfR1BJT0QoMCk7CisJSVJRREJHKCIlcyBtYXNrOiAweCUwOHggaXJxOiAlZFxuIixfX0ZVTkNUSU9OX18sbWFzayxpcnEpOworCWg3MjB4X2dwaW9faGFuZGxlcihtYXNrLCBpcnEsIGRlc2MsIHJlZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0NQVV9INzIwMgorc3RhdGljIHZvaWQKK2g3MjB4X2dwaW9lX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2ssIGlycTsKKworCW1hc2sgPSBDUFVfUkVHKEdQSU9fRV9WSVJULEdQSU9fU1RBVCk7CisJaXJxID0gSVJRX0NIQUlORURfR1BJT0UoMCk7CisJSVJRREJHKCIlcyBtYXNrOiAweCUwOHggaXJxOiAlZFxuIixfX0ZVTkNUSU9OX18sbWFzayxpcnEpOworCWg3MjB4X2dwaW9faGFuZGxlcihtYXNrLCBpcnEsIGRlc2MsIHJlZ3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBoNzIweF9nbG9iYWxfY2hpcCA9IHsKKwkuYWNrID0gbWFza19nbG9iYWxfaXJxLAorCS5tYXNrID0gbWFza19nbG9iYWxfaXJxLAorCS51bm1hc2sgPSB1bm1hc2tfZ2xvYmFsX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBoNzIweF9ncGlvX2NoaXAgPSB7CisJLmFjayA9IGFja19ncGlvX2lycSwKKwkubWFzayA9IG1hc2tfZ3Bpb19pcnEsCisJLnVubWFzayA9IHVubWFza19ncGlvX2lycSwKK307CisKKy8qCisgKiBJbml0aWFsaXplIElSUSdzLCBtYXNrIGFsbCwgZW5hYmxlIG11bHRpcGxleGVkIGlycSdzCisgKi8KK3ZvaWQgX19pbml0IGg3MjB4X2luaXRfaXJxICh2b2lkKQoreworCWludCAJaXJxOworCisJLyogTWFzayBnbG9iYWwgaXJxJ3MgKi8KKwlDUFVfUkVHIChJUlFDX1ZJUlQsIElSUUNfSUVSKSA9IDB4MDsKKworCS8qIE1hc2sgYWxsIG11bHRpcGxleGVkIGlycSdzICovCisJQ1BVX1JFRyAoR1BJT19BX1ZJUlQsIEdQSU9fTUFTSykgPSAweDA7CisJQ1BVX1JFRyAoR1BJT19CX1ZJUlQsIEdQSU9fTUFTSykgPSAweDA7CisJQ1BVX1JFRyAoR1BJT19DX1ZJUlQsIEdQSU9fTUFTSykgPSAweDA7CisJQ1BVX1JFRyAoR1BJT19EX1ZJUlQsIEdQSU9fTUFTSykgPSAweDA7CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBJUlEncywgZmFzdCBwYXRoICovCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9HTEJMX0lSUVM7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZoNzIweF9nbG9iYWxfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSBtdWx0aXBsZXhlZCBJUlEncywgc2xvdyBwYXRoICovCisJZm9yIChpcnEgPSBJUlFfQ0hBSU5FRF9HUElPQSgwKSA7IGlycSA8PSBJUlFfQ0hBSU5FRF9HUElPRCgzMSk7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZoNzIweF9ncGlvX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEICk7CisJfQorCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9HUElPQSwgaDcyMHhfZ3Bpb2FfZGVtdXhfaGFuZGxlcik7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU9CLCBoNzIweF9ncGlvYl9kZW11eF9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfR1BJT0MsIGg3MjB4X2dwaW9jX2RlbXV4X2hhbmRsZXIpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9HUElPRCwgaDcyMHhfZ3Bpb2RfZGVtdXhfaGFuZGxlcik7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0g3MjAyCisJZm9yIChpcnEgPSBJUlFfQ0hBSU5FRF9HUElPRSgwKSA7IGlycSA8PSBJUlFfQ0hBSU5FRF9HUElPRSgzMSk7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZoNzIweF9ncGlvX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEICk7CisJfQorCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9HUElPRSwgaDcyMHhfZ3Bpb2VfZGVtdXhfaGFuZGxlcik7CisjZW5kaWYKKworCS8qIEVuYWJsZSBtdWx0aXBsZXhlZCBpcnEncyAqLworCUNQVV9SRUcgKElSUUNfVklSVCwgSVJRQ19JRVIpID0gSVJRX0VOQV9NVVg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaDcyMHhfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeyBJT19WSVJULCBJT19QSFlTLCBJT19TSVpFLCBNVF9ERVZJQ0UgfSwKK307CisKKy8qIEluaXRpYWxpemUgaW8gdGFibGVzICovCit2b2lkIF9faW5pdCBoNzIweF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQoaDcyMHhfaW9fZGVzYyxBUlJBWV9TSVpFKGg3MjB4X2lvX2Rlc2MpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Nzk4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogICAgICAgICAgICAgICAyMDAzIFJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4KKyAqICAgICAgICAgICAgICAgMjAwNCBTYXNjaGEgSGF1ZXIgICAgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CisgKgorICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIHN0dWZmIGZvciBIeW5peCBHTVMzMEM3MjAxIGRldmVsb3BtZW50IGJvYXJkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaDcyMHhfZ2V0dGltZW9mZnNldCh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBoNzIweF9pbml0X2lycSAodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgaDcyMHhfbWFwX2lvKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfSDcyMDIKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGg3MjAyX3RpbWVyOworZXh0ZXJuIHZvaWQgX19pbml0IGluaXRfaHdfaDcyMDIodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgaDcyMDJfaW5pdF9pcnEgKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGg3MjAyX2luaXRfdGltZSh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfSDcyMDEKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGg3MjAxX3RpbWVyOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMS5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDM2NTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDEuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDEuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICAgICAgICAgICAgICAgMjAwMyBSb2JlcnQgU2Nod2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+CisgKiAgICAgICAgICAgICAgIDIwMDQgU2FzY2hhIEhhdWVyICAgIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIHByb2Nlc3NvciBzcGVjaWZpYyBzdHVmZiBmb3IgdGhlIEh5bml4IGg3MjAxCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKy8qCisgKiBUaW1lciBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2g3MjAxX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJQ1BVX1JFRyAoVElNRVJfVklSVCwgVElNRVJfVE9QU1RBVCk7CisJdGltZXJfdGljayhyZWdzKTsKKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGg3MjAxX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiaDcyMDEgVGltZXIgVGljayIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IGg3MjAxX3RpbWVyX2ludGVycnVwdAorfTsKKworLyoKKyAqIFNldHVwIFRJTUVSMCBhcyBzeXN0ZW0gdGltZXIKKyAqLwordm9pZCBfX2luaXQgaDcyMDFfaW5pdF90aW1lKHZvaWQpCit7CisJQ1BVX1JFRyAoVElNRVJfVklSVCwgVE0wX1BFUklPRCkgPSBMQVRDSDsKKwlDUFVfUkVHIChUSU1FUl9WSVJULCBUTTBfQ1RSTCkgPSBUTV9SRVNFVDsKKwlDUFVfUkVHIChUSU1FUl9WSVJULCBUTTBfQ1RSTCkgPSBUTV9SRVBFQVQgfCBUTV9TVEFSVDsKKwlDUFVfUkVHIChUSU1FUl9WSVJULCBUSU1FUl9UT1BDVFJMKSA9IEVOQUJMRV9UTTBfSU5UUiB8IFRJTUVSX0VOQUJMRV9CSVQ7CisKKwlzZXR1cF9pcnEoSVJRX1RJTUVSMCwgJmg3MjAxX3RpbWVyX2lycSk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgaDcyMDFfdGltZXIgPSB7CisJLmluaXQJCT0gaDcyMDFfaW5pdF90aW1lLAorCS5vZmZzZXQJCT0gaDcyMHhfZ2V0dGltZW9mZnNldCwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWI4ZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYwpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgICAgICAgICAgICAgIDIwMDMgUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPgorICogICAgICAgICAgICAgICAyMDA0IFNhc2NoYSBIYXVlciAgICA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBwcm9jZXNzb3Igc3BlY2lmaWMgc3R1ZmYgZm9yIHRoZSBIeW5peCBoNzIwMgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoNzIwMnBzMl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IDB4ODAwMmMwMDAsCisJCS5lbmQJPSAweDgwMDJjMDQwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1BTMiwKKwkJLmVuZAk9IElSUV9QUzIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoNzIwMnBzMl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImg3MjAycHMyIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGg3MjAycHMyX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gaDcyMDJwczJfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1lbWJhc2UJPSAodm9pZCopU0VSSUFMMF9WSVJULAorCQkubWFwYmFzZQk9IFNFUklBTDBfQkFTRSwKKwkJLmlycQkJPSBJUlFfVUFSVDAsCisJCS51YXJ0Y2xrCT0gMioxODQzMjAwLAorCQkucmVnc2hpZnQJPSAyLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCX0sCisJeworCQkubWVtYmFzZQk9ICh2b2lkKilTRVJJQUwxX1ZJUlQsCisJCS5tYXBiYXNlCT0gU0VSSUFMMV9CQVNFLAorCQkuaXJxCQk9IElSUV9VQVJUMSwKKwkJLnVhcnRjbGsJPSAyKjE4NDMyMDAsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCisJfSwKKyNpZmRlZiBDT05GSUdfSDcyMDJfU0VSSUFMMjMKKwl7CisJCS5tZW1iYXNlCT0gKHZvaWQqKVNFUklBTDJfVklSVCwKKwkJLm1hcGJhc2UJPSBTRVJJQUwyX0JBU0UsCisJCS5pcnEJCT0gSVJRX1VBUlQyLAorCQkudWFydGNsawk9IDIqMTg0MzIwMCwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsKKwkJLm1lbWJhc2UJPSAodm9pZCopU0VSSUFMM19WSVJULAorCQkubWFwYmFzZQk9IFNFUklBTDNfQkFTRSwKKwkJLmlycQkJPSBJUlFfVUFSVDMsCisJCS51YXJ0Y2xrCT0gMioxODQzMjAwLAorCQkucmVnc2hpZnQJPSAyLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCX0sCisjZW5kaWYKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSAwLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZoNzIwMnBzMl9kZXZpY2UsCisJJnNlcmlhbF9kZXZpY2UsCit9OworCisvKiBBbHRob3VnaCB3ZSBoYXZlIHR3byBpbnRlcnJ1cHQgbGluZXMgZm9yIHRoZSB0aW1lcnMsIHdlIG9ubHkgaGF2ZSBvbmUKKyAqIHN0YXR1cyByZWdpc3RlciB3aGljaCBjbGVhcnMgYWxsIHBlbmRpbmcgdGltZXIgaW50ZXJydXB0cyBvbiByZWFkaW5nLiBTbworICogd2UgaGF2ZSB0byBoYW5kbGUgYWxsIHRpbWVyIGludGVycnVwdHMgaW4gb25lIHBsYWNlLgorICovCitzdGF0aWMgdm9pZAoraDcyMDJfdGltZXJ4X2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2ssIGlycTsKKworCW1hc2sgPSBDUFVfUkVHIChUSU1FUl9WSVJULCBUSU1FUl9UT1BTVEFUKTsKKworCWlmICggbWFzayAmIFRTVEFUX1QwSU5UICkgeworCQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwkJdGltZXJfdGljayhyZWdzKTsKKwkJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwkJaWYoIG1hc2sgPT0gVFNUQVRfVDBJTlQgKQorCQkJcmV0dXJuOworCX0KKworCW1hc2sgPj49IDE7CisJaXJxID0gSVJRX1RJTUVSMTsKKwlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJd2hpbGUgKG1hc2spIHsKKwkJaWYgKG1hc2sgJiAxKQorCQkJZGVzYy0+aGFuZGxlKGlycSwgZGVzYywgcmVncyk7CisJCWlycSsrOworCQlkZXNjKys7CisJCW1hc2sgPj49IDE7CisJfQorfQorCisvKgorICogVGltZXIgaW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90CitoNzIwMl90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwloNzIwMl90aW1lcnhfZGVtdXhfaGFuZGxlcigwLCBOVUxMLCByZWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBtYXNrIG11bHRpcGxleGVkIHRpbWVyIGlycSdzCisgKi8KK3N0YXRpYyB2b2lkIGlubGluZSBtYXNrX3RpbWVyeF9pcnEgKHUzMiBpcnEpCit7CisJdW5zaWduZWQgaW50IGJpdDsKKwliaXQgPSAyIDw8ICgoaXJxID09IElSUV9USU1FUjY0QikgPyA0IDogKGlycSAtIElSUV9USU1FUjEpKTsKKwlDUFVfUkVHIChUSU1FUl9WSVJULCBUSU1FUl9UT1BDVFJMKSAmPSB+Yml0OworfQorCisvKgorICogdW5tYXNrIG11bHRpcGxleGVkIHRpbWVyIGlycSdzCisgKi8KK3N0YXRpYyB2b2lkIGlubGluZSB1bm1hc2tfdGltZXJ4X2lycSAodTMyIGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgYml0OworCWJpdCA9IDIgPDwgKChpcnEgPT0gSVJRX1RJTUVSNjRCKSA/IDQgOiAoaXJxIC0gSVJRX1RJTUVSMSkpOworCUNQVV9SRUcgKFRJTUVSX1ZJUlQsIFRJTUVSX1RPUENUUkwpIHw9IGJpdDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGg3MjAyX3RpbWVyeF9jaGlwID0geworCS5hY2sgPSBtYXNrX3RpbWVyeF9pcnEsCisJLm1hc2sgPSBtYXNrX3RpbWVyeF9pcnEsCisJLnVubWFzayA9IHVubWFza190aW1lcnhfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaDcyMDJfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJoNzIwMiBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gaDcyMDJfdGltZXJfaW50ZXJydXB0Cit9OworCisvKgorICogU2V0dXAgVElNRVIwIGFzIHN5c3RlbSB0aW1lcgorICovCit2b2lkIF9faW5pdCBoNzIwMl9pbml0X3RpbWUodm9pZCkKK3sKKwlDUFVfUkVHIChUSU1FUl9WSVJULCBUTTBfUEVSSU9EKSA9IExBVENIOworCUNQVV9SRUcgKFRJTUVSX1ZJUlQsIFRNMF9DVFJMKSA9IFRNX1JFU0VUOworCUNQVV9SRUcgKFRJTUVSX1ZJUlQsIFRNMF9DVFJMKSA9IFRNX1JFUEVBVCB8IFRNX1NUQVJUOworCUNQVV9SRUcgKFRJTUVSX1ZJUlQsIFRJTUVSX1RPUENUUkwpID0gRU5BQkxFX1RNMF9JTlRSIHwgVElNRVJfRU5BQkxFX0JJVDsKKworCXNldHVwX2lycShJUlFfVElNRVIwLCAmaDcyMDJfdGltZXJfaXJxKTsKK30KKworc3RydWN0IHN5c190aW1lciBoNzIwMl90aW1lciA9IHsKKwkuaW5pdAkJPSBoNzIwMl9pbml0X3RpbWUsCisJLm9mZnNldAkJPSBoNzIweF9nZXR0aW1lb2Zmc2V0LAorfTsKKwordm9pZCBfX2luaXQgaDcyMDJfaW5pdF9pcnEgKHZvaWQpCit7CisJaW50IAlpcnE7CisKKwlDUFVfUkVHIChHUElPX0VfVklSVCwgR1BJT19NQVNLKSA9IDB4MDsKKworCWZvciAoaXJxID0gSVJRX1RJTUVSMTsKKwkgICAgICAgICAgICAgICAgICBpcnEgPCBJUlFfQ0hBSU5FRF9USU1FUlgoTlJfVElNRVJYX0lSUVMpOyBpcnErKykgeworCQltYXNrX3RpbWVyeF9pcnEoaXJxKTsKKwkJc2V0X2lycV9jaGlwKGlycSwgJmg3MjAyX3RpbWVyeF9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCApOworCX0KKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfVElNRVJYLCBoNzIwMl90aW1lcnhfZGVtdXhfaGFuZGxlcik7CisKKwloNzIweF9pbml0X2lycSgpOworfQorCit2b2lkIF9faW5pdCBpbml0X2h3X2g3MjAyKHZvaWQpCit7CisJLyogRW5hYmxlIGNsb2NrcyAqLworCUNQVV9SRUcgKFBNVV9CQVNFLCBQTVVfUExMX0NUUkwpIHw9IFBMTF8yX0VOIHwgUExMXzFfRU4gfCBQTExfM19NVVRFOworCisJQ1BVX1JFRyAoU0VSSUFMMF9WSVJULCBTRVJJQUxfRU5BQkxFKSA9IFNFUklBTF9FTkFCTEVfRU47CisJQ1BVX1JFRyAoU0VSSUFMMV9WSVJULCBTRVJJQUxfRU5BQkxFKSA9IFNFUklBTF9FTkFCTEVfRU47CisjaWZkZWYgQ09ORklHX0g3MjAyX1NFUklBTDIzCisJQ1BVX1JFRyAoU0VSSUFMMl9WSVJULCBTRVJJQUxfRU5BQkxFKSA9IFNFUklBTF9FTkFCTEVfRU47CisJQ1BVX1JFRyAoU0VSSUFMM19WSVJULCBTRVJJQUxfRU5BQkxFKSA9IFNFUklBTF9FTkFCTEVfRU47CisJQ1BVX0lPIChHUElPX0FNVUxTRUwpID0gQU1VTFNFTF9VU0lOMiB8IEFNVUxTRUxfVVNPVVQyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICBBTVVMU0VMX1VTSU4zIHwgQU1VTFNFTF9VU09VVDM7CisjZW5kaWYKKwkodm9pZCkgcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDEtZXZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjRiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgICAgICAgICAgICAgIDIwMDMgUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPgorICogICAgICAgICAgICAgICAyMDA0IFNhc2NoYSBIYXVlciAgICA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgc3R1ZmYgZm9yIEh5bml4IEdNUzMwQzcyMDEgZGV2ZWxvcG1lbnQgYm9hcmQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKK01BQ0hJTkVfU1RBUlQoSDcyMDEsICJIeW5peCBHTVMzMEM3MjAxIikKKwlNQUlOVEFJTkVSKCJSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4IikKKwlCT09UX01FTSgweDQwMDAwMDAwLCAweDgwMDAwMDAwLCAweGYwMDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDEwMDApCisJTUFQSU8oaDcyMHhfbWFwX2lvKQorCUlOSVRJUlEoaDcyMHhfaW5pdF9pcnEpCisJLnRpbWVyID0gJmg3MjAxX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1NmEwMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICAgICAgICAgICAgICAgMjAwMyBSb2JlcnQgU2Nod2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+CisgKgkJIDIwMDQgU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBzdHVmZiBmb3IgSHluaXggSE1TMzBDNzIwMiBkZXZlbG9wbWVudCBib2FyZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjaXJydXNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBFVEgwX1BIWVMgKyAweDMwMCwKKwkJLmVuZAk9IEVUSDBfUEhZUyArIDB4MzAwICsgMHgxMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9DSEFJTkVEX0dQSU9CKDgpLAorCQkuZW5kCT0gSVJRX0NIQUlORURfR1BJT0IoOCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjaXJydXNfZGV2aWNlID0geworCS5uYW1lCQk9ICJjaXJydXMtY3M4OXgwIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNpcnJ1c19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNpcnJ1c19yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmNpcnJ1c19kZXZpY2UsCit9OworCisvKgorICogSGFyZHdhcmUgaW5pdC4gVGhpcyBpcyBjYWxsZWQgZWFybHkgaW4gaW5pdGNhbGxzCisgKiBQbGFjZSBwaW4gaW5pdHMgaGVyZS4gU28geW91IGF2b2lkIGFkZGluZyB1Z2x5CisgKiAjaWZkZWYgc3R1ZmYgdG8gY29tbW9uIGRyaXZlcnMuCisgKiBVc2UgdGhpcyBvbmx5LCBpZiB5b3VyIGJvb3Rsb2FkZXIgaXMgbm90IGFibGUKKyAqIHRvIGluaXRpYWxpemUgdGhlIHBpbnMgcHJvcGVyLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9ldmFsX2g3MjAyKHZvaWQpCit7CisJaW5pdF9od19oNzIwMigpOworCSh2b2lkKSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gcG9ydGIgYml0IDggKGV0aGVybmV0KSAqLworCUNQVV9SRUcgKEdQSU9fQl9WSVJULCBHUElPX1BPTCkgJj0gfigxIDw8IDgpOworCUNQVV9SRUcgKEdQSU9fQl9WSVJULCBHUElPX0VOKSB8PSAoMSA8PCA4KTsKK30KKworTUFDSElORV9TVEFSVChINzIwMiwgIkh5bml4IEhNUzMwQzcyMDIiKQorCU1BSU5UQUlORVIoIlJvYmVydCBTY2h3ZWJlbCwgUGVuZ3V0cm9uaXgiKQorCUJPT1RfTUVNKDB4NDAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjAwMDAwMDApCisJQk9PVF9QQVJBTVMoMHg0MDAwMDEwMCkKKwlNQVBJTyhoNzIweF9tYXBfaW8pCisJSU5JVElSUShoNzIwMl9pbml0X2lycSkKKwkudGltZXIgPSAmaDcyMDJfdGltZXIsCisJSU5JVF9NQUNISU5FKGluaXRfZXZhbF9oNzIwMikKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg1ODEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACittZW51ICJJTVggSW1wbGVtZW50YXRpb25zIgorCWRlcGVuZHMgb24gQVJDSF9JTVgKKworY29uZmlnIEFSQ0hfTVgxQURTCisJYm9vbCAibXgxYWRzIgorCWRlcGVuZHMgb24gQVJDSF9JTVgKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIE1vdG9yb2xhIE1YMUFEUyBib2FyZAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjdkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZQpAQCAtMCwwICsxLDE5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworIyBOb3RlISBEZXBlbmRlbmNpZXMgYXJlIGRvbmUgYXV0b21hZ2ljYWxseSBieSAnbWFrZSBkZXAnLCB3aGljaCBhbHNvCisjIHJlbW92ZXMgYW55IG9sZCBkZXBlbmRlbmNpZXMuIERPTidUIHB1dCB5b3VyIG93biBkZXBlbmRlbmNpZXMgaGVyZQorIyB1bmxlc3MgaXQncyBzb21ldGhpbmcgc3BlY2lhbCAoaWUgbm90IGEgLmMgZmlsZSkuCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJKz0gaXJxLm8gdGltZS5vIGRtYS5vIGdlbmVyaWMubworCisjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKK29iai0kKENPTkZJR19BUkNIX01YMUFEUykgKz0gbXgxYWRzLm8KKworIyBTdXBwb3J0IGZvciBibGlua3kgbGlnaHRzCitsZWQteSA6PSBsZWRzLm8KKworb2JqLSQoQ09ORklHX0xFRFMpCSs9ICAkKGxlZC15KQorbGVkLSQoQ09ORklHX0FSQ0hfTVgxQURTKSArPSBsZWRzLW14MWFkcy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDcyY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDIgQEAKKyAgICB6cmVsYWRkci0kKENPTkZJR19BUkNIX01YMUFEUykJOj0gMHgwODAwODAwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTU5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9kbWEuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWlteC9kbWEuYworICoKKyAqICBpbXggRE1BIHJlZ2lzdHJhdGlvbiBhbmQgSVJRIGRpc3BhdGNoaW5nCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgMDMvMDMvMjAwNCBTYXNjaGEgSGF1ZXIgPHNhc2NoYUBzYXNjaGFoYXVlci5kZT4KKyAqICAgICAgICAgICAgIGluaXRpYWwgdmVyc2lvbiBoZWF2aWx5IGluc3BpcmVkIGJ5CisgKiAgICAgICAgICAgICBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS9kbWEuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdGF0aWMgc3RydWN0IGRtYV9jaGFubmVsIHsKKwljaGFyICpuYW1lOworCXZvaWQgKCppcnFfaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKwl2b2lkICgqZXJyX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisJdm9pZCAqZGF0YTsKK30gZG1hX2NoYW5uZWxzWzExXTsKKworLyogc2V0IGVycl9oYW5kbGVyIHRvIE5VTEwgdG8gaGF2ZSB0aGUgc3RhbmRhcmQgaW5mby1vbmx5IGVycm9yIGhhbmRsZXIgKi8KK2ludAoraW14X3JlcXVlc3RfZG1hKGNoYXIgKm5hbWUsIGlteF9kbWFfcHJpbyBwcmlvLAorCQl2b2lkICgqaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCisJCXZvaWQgKCplcnJfaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBmb3VuZCA9IDA7CisKKwkvKiBiYXNpYyBzYW5pdHkgY2hlY2tzICovCisJaWYgKCFuYW1lIHx8ICFpcnFfaGFuZGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiB0cnkgZ3JhYmJpbmcgYSBETUEgY2hhbm5lbCB3aXRoIHRoZSByZXF1ZXN0ZWQgcHJpb3JpdHkgKi8KKwlmb3IgKGkgPSBwcmlvOyBpIDwgcHJpbyArIChwcmlvID09IERNQV9QUklPX0xPVykgPyA4IDogNDsgaSsrKSB7CisJCWlmICghZG1hX2NoYW5uZWxzW2ldLm5hbWUpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQkvKiByZXF1ZXN0ZWQgcHJpbyBncm91cCBpcyBmdWxsLCB0cnkgaGllciBwcmlvcml0aWVzICovCisJCWZvciAoaSA9IHByaW8gLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKCFkbWFfY2hhbm5lbHNbaV0ubmFtZSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChmb3VuZCkgeworCQlESU1SICY9IH4oMSA8PCBpKTsKKwkJZG1hX2NoYW5uZWxzW2ldLm5hbWUgPSBuYW1lOworCQlkbWFfY2hhbm5lbHNbaV0uaXJxX2hhbmRsZXIgPSBpcnFfaGFuZGxlcjsKKwkJZG1hX2NoYW5uZWxzW2ldLmVycl9oYW5kbGVyID0gZXJyX2hhbmRsZXI7CisJCWRtYV9jaGFubmVsc1tpXS5kYXRhID0gZGF0YTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBtb3JlIGF2YWlsYWJsZSBETUEgY2hhbm5lbHMgZm9yICVzXG4iLAorCQkgICAgICAgbmFtZSk7CisJCWkgPSAtRU5PREVWOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gaTsKK30KKwordm9pZAoraW14X2ZyZWVfZG1hKGludCBkbWFfY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZG1hX2NoYW5uZWxzW2RtYV9jaF0ubmFtZSkgeworCQlwcmludGsoS0VSTl9DUklUCisJCSAgICAgICAiJXM6IHRyeWluZyB0byBmcmVlIGNoYW5uZWwgJWQgd2hpY2ggaXMgYWxyZWFkeSBmcmVlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZG1hX2NoKTsKKwkJcmV0dXJuOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlESU1SICY9IH4oMSA8PCBkbWFfY2gpOworCWRtYV9jaGFubmVsc1tkbWFfY2hdLm5hbWUgPSBOVUxMOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90CitkbWFfZXJyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgZGlzciA9IERJU1I7CisJc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBlcnJfbWFzayA9IERCVE9TUiB8IERSVE9TUiB8IERTRVNSIHwgREJPU1I7CisKKwlESVNSID0gZGlzcjsKKwlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgeworCQljaGFubmVsID0gJmRtYV9jaGFubmVsc1tpXTsKKworCQlpZiAoIChlcnJfbWFzayAmIDE8PGkpICYmIGNoYW5uZWwtPm5hbWUgJiYgY2hhbm5lbC0+ZXJyX2hhbmRsZXIpIHsKKwkJCWNoYW5uZWwtPmVycl9oYW5kbGVyKGksIGNoYW5uZWwtPmRhdGEsIHJlZ3MpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoREJUT1NSICYgKDEgPDwgaSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiQnVyc3QgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCisJCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7CisJCQlEQlRPU1IgfD0gKDEgPDwgaSk7CisJCX0KKwkJaWYgKERSVE9TUiAmICgxIDw8IGkpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIlJlcXVlc3QgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCisJCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7CisJCQlEUlRPU1IgfD0gKDEgPDwgaSk7CisJCX0KKwkJaWYgKERTRVNSICYgKDEgPDwgaSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiVHJhbnNmZXIgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCisJCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7CisJCQlEU0VTUiB8PSAoMSA8PCBpKTsKKwkJfQorCQlpZiAoREJPU1IgJiAoMSA8PCBpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJCdWZmZXIgb3ZlcmZsb3cgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCisJCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7CisJCQlEQk9TUiB8PSAoMSA8PCBpKTsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGksIGRpc3IgPSBESVNSOworCisJRElTUiA9IGRpc3I7CisJZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKKwkJaWYgKGRpc3IgJiAoMSA8PCBpKSkgeworCQkJc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gJmRtYV9jaGFubmVsc1tpXTsKKwkJCWlmIChjaGFubmVsLT5uYW1lICYmIGNoYW5uZWwtPmlycV9oYW5kbGVyKSB7CisJCQkJY2hhbm5lbC0+aXJxX2hhbmRsZXIoaSwgY2hhbm5lbC0+ZGF0YSwgcmVncyk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogSVJRIGZvciBhbiB1bnJlZ2lzdGVyZWQgRE1BIGNoYW5uZWw6CisJCQkJICogbGV0J3MgY2xlYXIgdGhlIGludGVycnVwdHMgYW5kIGRpc2FibGUgaXQuCisJCQkJICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAic3B1cmlvdXMgSVJRIGZvciBETUEgY2hhbm5lbCAlZFxuIiwgaSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraW14X2RtYV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIHJlc2V0IERNQSBtb2R1bGUgKi8KKwlEQ1IgPSBEQ1JfRFJTVDsKKworCXJldCA9IHJlcXVlc3RfaXJxKERNQV9JTlQsIGRtYV9pcnFfaGFuZGxlciwgMCwgIkRNQSIsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV293ISAgQ2FuJ3QgcmVnaXN0ZXIgSVJRIGZvciBETUFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKERNQV9FUlIsIGRtYV9lcnJfaGFuZGxlciwgMCwgIkRNQSIsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV293ISAgQ2FuJ3QgcmVnaXN0ZXIgRVJSSVJRIGZvciBETUFcbiIpOworCQlmcmVlX2lycShETUFfSU5ULCBOVUxMKTsKKwl9CisKKwkvKiBlbmFibGUgRE1BIG1vZHVsZSAqLworCURDUiA9IERDUl9ERU47CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCURJU1IgPSAweDNmZjsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJRElNUiA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCithcmNoX2luaXRjYWxsKGlteF9kbWFfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0woaW14X3JlcXVlc3RfZG1hKTsKK0VYUE9SVF9TWU1CT0woaW14X2ZyZWVfZG1hKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtaW14L2dlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM3N2QwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZ2VuZXJpYy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogIGFyY2gvYXJtL21hY2gtaW14L2dlbmVyaWMuYworICoKKyAqICBhdXRob3I6IFNhc2NoYSBIYXVlcgorICogIENyZWF0ZWQ6IGFwcmlsIDIwdGgsIDIwMDQKKyAqICBDb3B5cmlnaHQ6IFN5bmVydHJvbml4eCBHbWJICisgKgorICogIENvbW1vbiBjb2RlIGZvciBpLk1YIG1hY2hpbmVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCit2b2lkIGlteF9ncGlvX21vZGUoaW50IGdwaW9fbW9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgcGluID0gZ3Bpb19tb2RlICYgR1BJT19QSU5fTUFTSzsKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IChncGlvX21vZGUgJiBHUElPX1BPUlRfTUFTSykgPj4gNTsKKwl1bnNpZ25lZCBpbnQgb2NyID0gKGdwaW9fbW9kZSAmIEdQSU9fT0NSX01BU0spID4+IDEwOworCXVuc2lnbmVkIGludCB0bXA7CisKKwkvKiBQdWxsdXAgZW5hYmxlICovCisJaWYoZ3Bpb19tb2RlICYgR1BJT19QVUVOKQorCQlQVUVOKHBvcnQpIHw9ICgxPDxwaW4pOworCWVsc2UKKwkJUFVFTihwb3J0KSAmPSB+KDE8PHBpbik7CisKKwkvKiBEYXRhIGRpcmVjdGlvbiAqLworCWlmKGdwaW9fbW9kZSAmIEdQSU9fT1VUKQorCQlERElSKHBvcnQpIHw9IDE8PHBpbjsKKwllbHNlCisJCURESVIocG9ydCkgJj0gfigxPDxwaW4pOworCisJLyogUHJpbWFyeSAvIGFsdGVybmF0ZSBmdW5jdGlvbiAqLworCWlmKGdwaW9fbW9kZSAmIEdQSU9fQUYpCisJCUdQUihwb3J0KSB8PSAoMTw8cGluKTsKKwllbHNlCisJCUdQUihwb3J0KSAmPSB+KDE8PHBpbik7CisKKwkvKiB1c2UgYXMgZ3Bpbz8gKi8KKwlpZiggb2NyID09IDMgKQorCQlHSVVTKHBvcnQpIHw9ICgxPDxwaW4pOworCWVsc2UKKwkJR0lVUyhwb3J0KSAmPSB+KDE8PHBpbik7CisKKwkvKiBPdXRwdXQgLyBpbnB1dCBjb25maWd1cmF0aW9uICovCisJLyogRklYTUU6IEknbSBub3QgdmVyeSBzdXJlIGFib3V0IE9DUiBhbmQgSUNPTkYsIHNvbWVvbmUKKwkgKiBzaG91bGQgaGF2ZSBhIGxvb2sgb3ZlciBpdAorCSAqLworCWlmKHBpbjwxNikgeworCQl0bXAgPSBPQ1IxKHBvcnQpOworCQl0bXAgJj0gfiggMzw8KHBpbioyKSk7CisJCXRtcCB8PSAob2NyIDw8IChwaW4qMikpOworCQlPQ1IxKHBvcnQpID0gdG1wOworCisJCWlmKCBncGlvX21vZGUgJglHUElPX0FPVVQgKQorCQkJSUNPTkZBMShwb3J0KSAmPSB+KCAzPDwocGluKjIpKTsKKwkJaWYoIGdwaW9fbW9kZSAmCUdQSU9fQk9VVCApCisJCQlJQ09ORkIxKHBvcnQpICY9IH4oIDM8PChwaW4qMikpOworCX0gZWxzZSB7CisJCXRtcCA9IE9DUjIocG9ydCk7CisJCXRtcCAmPSB+KCAzPDwoKHBpbi0xNikqMikpOworCQl0bXAgfD0gKG9jciA8PCAoKHBpbi0xNikqMikpOworCQlPQ1IyKHBvcnQpID0gdG1wOworCisJCWlmKCBncGlvX21vZGUgJglHUElPX0FPVVQgKQorCQkJSUNPTkZBMihwb3J0KSAmPSB+KCAzPDwoKHBpbi0xNikqMikpOworCQlpZiggZ3Bpb19tb2RlICYJR1BJT19CT1VUICkKKwkJCUlDT05GQjIocG9ydCkgJj0gfiggMzw8KChwaW4tMTYpKjIpKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woaW14X2dwaW9fbW9kZSk7CisKKy8qCisgKiAgZ2V0IHRoZSBzeXN0ZW0gcGxsIGNsb2NrIGluIEh6CisgKgorICogICAgICAgICAgICAgICAgICBtZmkgKyBtZm4gLyAobWZkICsxKQorICogIGYgPSAyICogZl9yZWYgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICBwZCArIDEKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpbXhfZGVjb2RlX3BsbCh1bnNpZ25lZCBpbnQgcGxsKQoreworCXUzMiBtZmkgPSAocGxsID4+IDEwKSAmIDB4ZjsKKwl1MzIgbWZuID0gcGxsICYgMHgzZmY7CisJdTMyIG1mZCA9IChwbGwgPj4gMTYpICYgMHgzZmY7CisJdTMyIHBkID0gIChwbGwgPj4gMjYpICYgMHhmOworCXUzMiBmX3JlZiA9IChDU0NSICYgQ1NDUl9TWVNURU1fU0VMKSA/IDE2MDAwMDAwIDogKENMSzMyICogNTEyKTsKKworCW1maSA9IG1maSA8PSA1ID8gNSA6IG1maTsKKworCXJldHVybiAoMiAqIChmX3JlZj4+MTApICogKCAobWZpPDwxMCkgKyAobWZuPDwxMCkgLyAobWZkKzEpICkpIC8gKHBkKzEpOworfQorCit1bnNpZ25lZCBpbnQgaW14X2dldF9zeXN0ZW1fY2xrKHZvaWQpCit7CisJcmV0dXJuIGlteF9kZWNvZGVfcGxsKFNQQ1RMMCk7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9nZXRfc3lzdGVtX2Nsayk7CisKK3Vuc2lnbmVkIGludCBpbXhfZ2V0X21jdV9jbGsodm9pZCkKK3sKKwlyZXR1cm4gaW14X2RlY29kZV9wbGwoTVBDVEwwKTsKK30KK0VYUE9SVF9TWU1CT0woaW14X2dldF9tY3VfY2xrKTsKKworLyoKKyAqICBnZXQgcGVyaXBoZXJhbCBjbG9jayAxICggVUFSVFsxMl0sIFRpbWVyWzEyXSwgUFdNICkKKyAqLwordW5zaWduZWQgaW50IGlteF9nZXRfcGVyY2xrMSh2b2lkKQoreworCXJldHVybiBpbXhfZ2V0X3N5c3RlbV9jbGsoKSAvICgoKFBDRFIpICYgMHhmKSsxKTsKK30KK0VYUE9SVF9TWU1CT0woaW14X2dldF9wZXJjbGsxKTsKKworLyoKKyAqICBnZXQgcGVyaXBoZXJhbCBjbG9jayAyICggTENELCBTRCwgU1BJWzEyXSApCisgKi8KK3Vuc2lnbmVkIGludCBpbXhfZ2V0X3BlcmNsazIodm9pZCkKK3sKKwlyZXR1cm4gaW14X2dldF9zeXN0ZW1fY2xrKCkgLyAoKChQQ0RSPj40KSAmIDB4ZikrMSk7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9nZXRfcGVyY2xrMik7CisKKy8qCisgKiAgZ2V0IHBlcmlwaGVyYWwgY2xvY2sgMyAoIFNTSSApCisgKi8KK3Vuc2lnbmVkIGludCBpbXhfZ2V0X3BlcmNsazModm9pZCkKK3sKKwlyZXR1cm4gaW14X2dldF9zeXN0ZW1fY2xrKCkgLyAoKChQQ0RSPj4xNikgJiAweDdmKSsxKTsKK30KK0VYUE9SVF9TWU1CT0woaW14X2dldF9wZXJjbGszKTsKKworLyoKKyAqICBnZXQgaGNsayAoIFNEUkFNLCBDU0ksIE1lbW9yeSBTdGljaywgSTJDLCBETUEgKQorICovCit1bnNpZ25lZCBpbnQgaW14X2dldF9oY2xrKHZvaWQpCit7CisJcmV0dXJuIGlteF9nZXRfc3lzdGVtX2NsaygpIC8gKCgoQ1NDUj4+MTApICYgMHhmKSsxKTsKK30KK0VYUE9SVF9TWU1CT0woaW14X2dldF9oY2xrKTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfbW1jX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHgwMDIxNDAwMCwKKwkJLmVuZAk9IDB4MDAyMTQwRkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAoU0RIQ19JTlQpLAorCQkuZW5kCT0gKFNESENfSU5UKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9tbWNfZGV2aWNlID0geworCS5uYW1lCQk9ICJpbXgtbW1jIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaW14X21tY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGlteF9tbWNfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfdWFydDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDAwMjA2MDAwLAorCQkuZW5kCT0gMHgwMDIwNjBGRiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IChVQVJUMV9NSU5UX1JYKSwKKwkJLmVuZAk9IChVQVJUMV9NSU5UX1JYKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IChVQVJUMV9NSU5UX1RYKSwKKwkJLmVuZAk9IChVQVJUMV9NSU5UX1RYKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF91YXJ0MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImlteC11YXJ0IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaW14X3VhcnQxX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gaW14X3VhcnQxX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3VhcnQyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHgwMDIwNzAwMCwKKwkJLmVuZAk9IDB4MDAyMDcwRkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAoVUFSVDJfTUlOVF9SWCksCisJCS5lbmQJPSAoVUFSVDJfTUlOVF9SWCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSAoVUFSVDJfTUlOVF9UWCksCisJCS5lbmQJPSAoVUFSVDJfTUlOVF9UWCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfdWFydDJfZGV2aWNlID0geworCS5uYW1lCQk9ICJpbXgtdWFydCIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGlteF91YXJ0Ml9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGlteF91YXJ0Ml9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlteGZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHgwMDIwNTAwMCwKKwkJLmVuZAk9IDB4MDAyMDUwRkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBMQ0RDX0lOVCwKKwkJLmVuZAk9IExDRENfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14ZmJfZGV2aWNlID0geworCS5uYW1lCQk9ICJpbXgtZmIiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpbXhmYl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGlteGZiX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaW14X21tY19kZXZpY2UsCisJJmlteGZiX2RldmljZSwKKwkmaW14X3VhcnQxX2RldmljZSwKKwkmaW14X3VhcnQyX2RldmljZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW14X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCS8qIHZpcnR1YWwgICAgIHBoeXNpY2FsICAgIGxlbmd0aCAgICAgIHR5cGUgKi8KKwl7SU1YX0lPX0JBU0UsIElNWF9JT19QSFlTLCBJTVhfSU9fU0laRSwgTVRfREVWSUNFfSwKK307CisKK3ZvaWQgX19pbml0CitpbXhfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KGlteF9pb19kZXNjLCBBUlJBWV9TSVpFKGlteF9pb19kZXNjKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlteF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQorCitzdWJzeXNfaW5pdGNhbGwoaW14X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZ2VuZXJpYy5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvZ2VuZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTAwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9nZW5lcmljLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWlteC9nZW5lcmljLmgKKyAqCisgKiBBdXRob3I6CVNhc2NoYSBIYXVlciA8c2FzY2hhQHNhc2NoYWhhdWVyLmRlPgorICogQ29weXJpZ2h0OglTeW5lcnRyb25peHggR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworZXh0ZXJuIHZvaWQgX19pbml0IGlteF9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgaW14X2luaXRfaXJxKHZvaWQpOworCitzdHJ1Y3Qgc3lzX3RpbWVyOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgaW14X3RpbWVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzI3MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvaXJxLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbXgvaXJxLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IEFSTSBMaW1pdGVkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNoYW5lIE5heSAoc2hhbmVAbWluaXJsLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIDAzLzAzLzIwMDQgICBTYXNjaGEgSGF1ZXIgPHNhc2NoYUBzYXNjaGFoYXVlci5kZT4KKyAqICAgICAgICAgICAgICAgQ29waWVkIGZyb20gdGhlIG1vdG9yb2xhIGJzcCBwYWNrYWdlIGFuZCBhZGRlZCBncGlvIGRlbXV4CisgKiAgICAgICAgICAgICAgIGludGVycnVwdCBoYW5kbGVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisvKgorICoKKyAqIFdlIHNpbXBseSB1c2UgdGhlIEVOQUJMRSBESVNBQkxFIHJlZ2lzdGVycyBpbnNpZGUgb2YgdGhlIElNWAorICogdG8gdHVybiBvbi9vZmYgc3BlY2lmaWMgaW50ZXJydXB0cy4gIEZJWE1FLSBXZSBzaG91bGQKKyAqIGFsc28gYWRkIHN1cHBvcnQgZm9yIHRoZSBhY2NlbGVyYXRlZCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogYnkgcHV0dGluZyBvZmZldHMgdG8gaXJxIGp1bXAgY29kZSBpbiB0aGUgYXBwcm9wcmlhdGUKKyAqIHBsYWNlcy4KKyAqCisgKi8KKworI2RlZmluZSBJTlRFTk5VTV9PRkYgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBJTlRESVNOVU1fT0ZGICAgICAgICAgICAgIDB4QworCisjZGVmaW5lIFZBX0FJVENfQkFTRSAgICAgICAgICAgICAgSU9fQUREUkVTUyhJTVhfQUlUQ19CQVNFKQorI2RlZmluZSBJTVhfQUlUQ19JTlRESVNOVU0gICAgICAgKFZBX0FJVENfQkFTRSArIElOVERJU05VTV9PRkYpCisjZGVmaW5lIElNWF9BSVRDX0lOVEVOTlVNICAgICAgICAoVkFfQUlUQ19CQVNFICsgSU5URU5OVU1fT0ZGKQorCisjaWYgMAorI2RlZmluZSBERUJVR19JUlEoZm10Li4uKQlwcmludGsoZm10KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfSVJRKGZtdC4uLikJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitpbXhfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlfX3Jhd193cml0ZWwoaXJxLCBJTVhfQUlUQ19JTlRESVNOVU0pOworfQorCitzdGF0aWMgdm9pZAoraW14X3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlfX3Jhd193cml0ZWwoaXJxLCBJTVhfQUlUQ19JTlRFTk5VTSk7Cit9CisKK3N0YXRpYyBpbnQKK2lteF9ncGlvX2lycV90eXBlKHVuc2lnbmVkIGludCBfaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxX3R5cGUgPSAwLCBpcnEsIHJlZywgYml0OworCisJaXJxID0gX2lycSAtIElSUV9HUElPQSgwKTsKKwlyZWcgPSBpcnEgPj4gNTsKKwliaXQgPSAxIDw8IChpcnEgJSAzMik7CisKKwlpZiAodHlwZSA9PSBJUlFUX1BST0JFKSB7CisJCS8qIERvbid0IG1lc3Mgd2l0aCBlbmFibGVkIEdQSU9zIHVzaW5nIHByZWNvbmZpZ3VyZWQgZWRnZXMgb3IKKwkJICAgR1BJT3Mgc2V0IHRvIGFsdGVybmF0ZSBmdW5jdGlvbiBkdXJpbmcgcHJvYmUgKi8KKwkJLyogVE9ETzogc3VwcG9ydCBwcm9iZSAqLworLy8gICAgICAgICAgICAgIGlmICgoR1BJT19JUlFfcmlzaW5nX2VkZ2VbaWR4XSB8IEdQSU9fSVJRX2ZhbGxpbmdfZWRnZVtpZHhdKSAmCisvLyAgICAgICAgICAgICAgICAgIEdQSU9fYml0KGdwaW8pKQorLy8gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisvLyAgICAgICAgICAgICAgaWYgKEdBRlIoZ3BpbykgJiAoMHgzIDw8ICgoKGdwaW8pICYgMHhmKSoyKSkpCisvLyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKy8vICAgICAgICAgICAgICB0eXBlID0gX19JUlFUX1JJU0VER0UgfCBfX0lSUVRfRkFMRURHRTsKKwl9CisKKwlHSVVTKHJlZykgfD0gYml0OworCURESVIocmVnKSAmPSB+KGJpdCk7CisKKwlERUJVR19JUlEoInNldHRpbmcgdHlwZSBvZiBpcnEgJWQgdG8gIiwgX2lycSk7CisKKwlpZiAodHlwZSAmIF9fSVJRVF9SSVNFREdFKSB7CisJCURFQlVHX0lSUSgicmlzaW5nIGVkZ2VzXG4iKTsKKwkJaXJxX3R5cGUgPSAweDA7CisJfQorCWlmICh0eXBlICYgX19JUlFUX0ZBTEVER0UpIHsKKwkJREVCVUdfSVJRKCJmYWxsaW5nIGVkZ2VzXG4iKTsKKwkJaXJxX3R5cGUgPSAweDE7CisJfQorCWlmICh0eXBlICYgX19JUlFUX0xPV0xWTCkgeworCQlERUJVR19JUlEoImxvdyBsZXZlbFxuIik7CisJCWlycV90eXBlID0gMHgzOworCX0KKwlpZiAodHlwZSAmIF9fSVJRVF9ISUdITFZMKSB7CisJCURFQlVHX0lSUSgiaGlnaCBsZXZlbFxuIik7CisJCWlycV90eXBlID0gMHgyOworCX0KKworCWlmIChpcnEgJSAzMiA8IDE2KSB7CisJCUlDUjEocmVnKSA9IChJQ1IxKHJlZykgJiB+KDB4MyA8PCAoKGlycSAlIDE2KSAqIDIpKSkgfAorCQkgICAgKGlycV90eXBlIDw8ICgoaXJxICUgMTYpICogMikpOworCX0gZWxzZSB7CisJCUlDUjIocmVnKSA9IChJQ1IyKHJlZykgJiB+KDB4MyA8PCAoKGlycSAlIDE2KSAqIDIpKSkgfAorCQkgICAgKGlycV90eXBlIDw8ICgoaXJxICUgMTYpICogMikpOworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkCitpbXhfZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJREVCVUdfSVJRKCIlczogaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJSVNSKElSUV9UT19SRUcoaXJxKSkgfD0gMSA8PCAoKGlycSAtIElSUV9HUElPQSgwKSkgJSAzMik7Cit9CisKK3N0YXRpYyB2b2lkCitpbXhfZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCURFQlVHX0lSUSgiJXM6IGlycSAlZFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOworCUlNUihJUlFfVE9fUkVHKGlycSkpICY9IH4oIDEgPDwgKChpcnEgLSBJUlFfR1BJT0EoMCkpICUgMzIpKTsKK30KKworc3RhdGljIHZvaWQKK2lteF9ncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlERUJVR19JUlEoIiVzOiBpcnEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKKwlJTVIoSVJRX1RPX1JFRyhpcnEpKSB8PSAxIDw8ICgoaXJxIC0gSVJRX0dQSU9BKDApKSAlIDMyKTsKK30KKworc3RhdGljIHZvaWQKK2lteF9ncGlvX2hhbmRsZXIodW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCBpcnEsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJd2hpbGUgKG1hc2spIHsKKwkJaWYgKG1hc2sgJiAxKSB7CisJCQlERUJVR19JUlEoImhhbmRsaW5nIGlycSAlZFxuIiwgaXJxKTsKKwkJCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQl9CisJCWlycSsrOworCQlkZXNjKys7CisJCW1hc2sgPj49IDE7CisJfQorfQorCitzdGF0aWMgdm9pZAoraW14X2dwaW9hX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2ssIGlycTsKKworCW1hc2sgPSBJU1IoMCk7CisJaXJxID0gSVJRX0dQSU9BKDApOworCWlteF9ncGlvX2hhbmRsZXIobWFzaywgaXJxLCBkZXNjLCByZWdzKTsKK30KKworc3RhdGljIHZvaWQKK2lteF9ncGlvYl9kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBtYXNrLCBpcnE7CisKKwltYXNrID0gSVNSKDEpOworCWlycSA9IElSUV9HUElPQigwKTsKKwlpbXhfZ3Bpb19oYW5kbGVyKG1hc2ssIGlycSwgZGVzYywgcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbXhfZ3Bpb2NfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzaywgaXJxOworCisJbWFzayA9IElTUigyKTsKKwlpcnEgPSBJUlFfR1BJT0MoMCk7CisJaW14X2dwaW9faGFuZGxlcihtYXNrLCBpcnEsIGRlc2MsIHJlZ3MpOworfQorCitzdGF0aWMgdm9pZAoraW14X2dwaW9kX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2ssIGlycTsKKworCW1hc2sgPSBJU1IoMyk7CisJaXJxID0gSVJRX0dQSU9EKDApOworCWlteF9ncGlvX2hhbmRsZXIobWFzaywgaXJxLCBkZXNjLCByZWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGlteF9pbnRlcm5hbF9jaGlwID0geworCS5hY2sgPSBpbXhfbWFza19pcnEsCisJLm1hc2sgPSBpbXhfbWFza19pcnEsCisJLnVubWFzayA9IGlteF91bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGlteF9ncGlvX2NoaXAgPSB7CisJLmFjayA9IGlteF9ncGlvX2Fja19pcnEsCisJLm1hc2sgPSBpbXhfZ3Bpb19tYXNrX2lycSwKKwkudW5tYXNrID0gaW14X2dwaW9fdW5tYXNrX2lycSwKKwkudHlwZSA9IGlteF9ncGlvX2lycV90eXBlLAorfTsKKwordm9pZCBfX2luaXQKK2lteF9pbml0X2lycSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisKKwlERUJVR19JUlEoIkluaXRpYWxpemluZyBpbXggaW50ZXJydXB0c1xuIik7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzIGluaXRpYWxseSAqLworCUlNUigwKSA9IDA7CisJSU1SKDEpID0gMDsKKwlJTVIoMikgPSAwOworCUlNUigzKSA9IDA7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IElNWF9JUlFTOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmaW14X2ludGVybmFsX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CisJfQorCisJZm9yIChpcnEgPSBJUlFfR1BJT0EoMCk7IGlycSA8IElSUV9HUElPRCgzMik7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZpbXhfZ3Bpb19jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CisJfQorCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoR1BJT19JTlRfUE9SVEEsIGlteF9ncGlvYV9kZW11eF9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihHUElPX0lOVF9QT1JUQiwgaW14X2dwaW9iX2RlbXV4X2hhbmRsZXIpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKEdQSU9fSU5UX1BPUlRDLCBpbXhfZ3Bpb2NfZGVtdXhfaGFuZGxlcik7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoR1BJT19JTlRfUE9SVEQsIGlteF9ncGlvZF9kZW11eF9oYW5kbGVyKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgaW5pdGlhbGx5LiAqLworCS8qIEluIElNWCB0aGlzIGlzIGRvbmUgaW4gdGhlIGJvb3Rsb2FkZXIuICovCit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9sZWRzLW14MWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbGVkcy1teDFhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjM5OWIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbGVkcy1teDFhZHMuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1pbXgvbGVkcy1teDFhZHMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTYXNjaGEgSGF1ZXIgPHNhc2NoYUBzYXNjaGFoYXVlci5kZT4KKyAqCisgKiBPcmlnaW5hbCAobGVkcy1mb290YnJpZGdlLmMpIGJ5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlICJsZWRzLmgiCisKKy8qCisgKiBUaGUgTVgxQURTIEJvYXJkIGhhcyBvbmx5IG9uZSB1c2FibGUgTEVELAorICogc28gc2VsZWN0IG9ubHkgdGhlIHRpbWVyIGxlZCBvciB0aGUKKyAqIGNwdSB1c2FnZSBsZWQKKyAqLwordm9pZAorbXgxYWRzX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgbGVkZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzd2l0Y2ggKGxlZGV2dCkgeworI2lmZGVmIENPTkZJR19MRURTX0NQVQorCWNhc2UgbGVkX2lkbGVfc3RhcnQ6CisJCURSKDApICY9IH4oMTw8Mik7CisJCWJyZWFrOworCisJY2FzZSBsZWRfaWRsZV9lbmQ6CisJCURSKDApIHw9IDE8PDI7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19USU1FUgorCWNhc2UgbGVkX3RpbWVyOgorCQlEUigwKSBePSAxPDwyOworI2VuZGlmCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L2xlZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFjMWRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbGVkcy5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWlteC9sZWRzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2FzY2hhIEhhdWVyIDxzYXNjaGFAc2FzY2hhaGF1ZXIuZGU+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlICJsZWRzLmgiCisKK3N0YXRpYyBpbnQgX19pbml0CitsZWRzX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19teDFhZHMoKSkgeworCQlsZWRzX2V2ZW50ID0gbXgxYWRzX2xlZHNfZXZlbnQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwobGVkc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2xlZHMuaCBiL2FyY2gvYXJtL21hY2gtaW14L2xlZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2ZhMjFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbGVkcy5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9sZWRzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2FzY2hhIEhhdWVyIDxzYXNjaGFAc2FzY2hhaGF1ZXIuZGU+CisgKgorICogYmxpbmt5IGxpZ2h0cyBmb3IgSU1YLWJhc2VkIHN5c3RlbXMKKyAqCisgKi8KK2V4dGVybiB2b2lkIG14MWFkc19sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L214MWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNWRkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1pbXgvbXgxYWRzLmMKKyAqCisgKiBJbml0aWFsbHkgYmFzZWQgb246CisgKglsaW51eC0yLjYuNy1pbXgvYXJjaC9hcm0vbWFjaC1pbXgvc2NiOTMyOC5jCisgKglDb3B5cmlnaHQgKGMpIDIwMDQgU2FzY2hhIEhhdWVyIDxzYXNjaGFAc2FzY2hhaGF1ZXIuZGU+CisgKgorICogMjAwNCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDFhZHNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBJTVhfQ1M0X1ZJUlQsCisJCS5lbmQJPSBJTVhfQ1M0X1ZJUlQgKyAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDEzLAorCQkuZW5kCT0gMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDFhZHNfZGV2aWNlID0geworCS5uYW1lCQk9ICJteDFhZHMiLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShteDFhZHNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBteDFhZHNfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZteDFhZHNfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0CitteDFhZHNfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19MRURTCisJaW14X2dwaW9fbW9kZShHUElPX1BPUlRBIHwgR1BJT19PVVQgfCBHUElPX0dQSU8gfCAyKTsKKyNlbmRpZgorCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MWFkc19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwkvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICBsZW5ndGggICAgICB0eXBlICovCisJe0lNWF9DUzBfVklSVCwgSU1YX0NTMF9QSFlTLCBJTVhfQ1MwX1NJWkUsIE1UX0RFVklDRX0sCisJe0lNWF9DUzFfVklSVCwgSU1YX0NTMV9QSFlTLCBJTVhfQ1MxX1NJWkUsIE1UX0RFVklDRX0sCisJe0lNWF9DUzJfVklSVCwgSU1YX0NTMl9QSFlTLCBJTVhfQ1MyX1NJWkUsIE1UX0RFVklDRX0sCisJe0lNWF9DUzNfVklSVCwgSU1YX0NTM19QSFlTLCBJTVhfQ1MzX1NJWkUsIE1UX0RFVklDRX0sCisJe0lNWF9DUzRfVklSVCwgSU1YX0NTNF9QSFlTLCBJTVhfQ1M0X1NJWkUsIE1UX0RFVklDRX0sCisJe0lNWF9DUzVfVklSVCwgSU1YX0NTNV9QSFlTLCBJTVhfQ1M1X1NJWkUsIE1UX0RFVklDRX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQKK214MWFkc19tYXBfaW8odm9pZCkKK3sKKwlpbXhfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KG14MWFkc19pb19kZXNjLCBBUlJBWV9TSVpFKG14MWFkc19pb19kZXNjKSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoTVgxQURTLCAiTW90b3JvbGEgTVgxQURTIikKKwlNQUlOVEFJTkVSKCJTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4IikKKwlCT09UX01FTSgweDA4MDAwMDAwLCAweDAwMjAwMDAwLCAweGUwMjAwMDAwKQorCUJPT1RfUEFSQU1TKDB4MDgwMDAxMDApCisJTUFQSU8obXgxYWRzX21hcF9pbykKKwlJTklUSVJRKGlteF9pbml0X2lycSkKKwkudGltZXIJCT0gJmlteF90aW1lciwKKwlJTklUX01BQ0hJTkUobXgxYWRzX2luaXQpCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjFlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgU2hhbmUgTmF5IChzaGFuZUBtaW5pcmwuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKy8qIFVzZSB0aW1lciAxIGFzIHN5c3RlbSB0aW1lciAqLworI2RlZmluZSBUSU1FUl9CQVNFIElNWF9USU0xX0JBU0UKKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIHVzIHNpbmNlIGxhc3QgY2xvY2sgaW50ZXJydXB0LiAgTm90ZSB0aGF0IGludGVycnVwdHMKKyAqIHdpbGwgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGRvX2dldHRpbWVvZmZzZXQoKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbXhfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdGlja3M7CisKKwkvKgorCSAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlja3MuICBOb3RlIHRoYXQgdGhlcmUgaXMgYSByYWNlCisJICogY29uZGl0aW9uIGJldHdlZW4gdXMgcmVhZGluZyB0aGUgdGltZXIgYW5kIGNoZWNraW5nIGZvcgorCSAqIGFuIGludGVycnVwdC4gIFdlIGdldCBhcm91bmQgdGhpcyBieSBlbnN1cmluZyB0aGF0IHRoZQorCSAqIGNvdW50ZXIgaGFzIG5vdCByZWxvYWRlZCBiZXR3ZWVuIG91ciB0d28gcmVhZHMuCisJICovCisJdGlja3MgPSBJTVhfVENOKFRJTUVSX0JBU0UpOworCisJLyoKKwkgKiBJbnRlcnJ1cHQgcGVuZGluZz8gIElmIHNvLCB3ZSd2ZSByZWxvYWRlZCBvbmNlIGFscmVhZHkuCisJICovCisJaWYgKElNWF9UU1RBVChUSU1FUl9CQVNFKSAmIFRTVEFUX0NPTVApCisJCXRpY2tzICs9IExBVENIOworCisJLyoKKwkgKiBDb252ZXJ0IHRoZSB0aWNrcyB0byB1c2VjcworCSAqLworCXJldHVybiAoMTAwMDAwMCAvIENMSzMyKSAqIHRpY2tzOworfQorCisvKgorICogSVJRIGhhbmRsZXIgZm9yIHRoZSB0aW1lcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2lteF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKworCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwlpZiAoSU1YX1RTVEFUKFRJTUVSX0JBU0UpKQorCQlJTVhfVFNUQVQoVElNRVJfQkFTRSkgPSAwOworCisJdGltZXJfdGljayhyZWdzKTsKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpbXhfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJpLk1YIFRpbWVyIFRpY2siLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBpbXhfdGltZXJfaW50ZXJydXB0Cit9OworCisvKgorICogU2V0IHVwIHRpbWVyIGludGVycnVwdCwgYW5kIHJldHVybiB0aGUgY3VycmVudCB0aW1lIGluIHNlY29uZHMuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpbXhfdGltZXJfaW5pdCh2b2lkKQoreworCS8qCisJICogSW5pdGlhbGlzZSB0byBhIGtub3duIHN0YXRlIChhbGwgdGltZXJzIG9mZiwgYW5kIHRpbWluZyByZXNldCkKKwkgKi8KKwlJTVhfVENUTChUSU1FUl9CQVNFKSA9IDA7CisJSU1YX1RQUkVSKFRJTUVSX0JBU0UpID0gMDsKKwlJTVhfVENNUChUSU1FUl9CQVNFKSA9IExBVENIIC0gMTsKKwlJTVhfVENUTChUSU1FUl9CQVNFKSA9IFRDVExfQ0xLXzMyIHwgVENUTF9JUlFFTiB8IFRDVExfVEVOOworCisJLyoKKwkgKiBNYWtlIGlycXMgaGFwcGVuIGZvciB0aGUgc3lzdGVtIHRpbWVyCisJICovCisJc2V0dXBfaXJxKFRJTTFfSU5ULCAmaW14X3RpbWVyX2lycSk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgaW14X3RpbWVyID0geworCS5pbml0CQk9IGlteF90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gaW14X2dldHRpbWVvZmZzZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjk3ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL0tjb25maWcKQEAgLTAsMCArMSwzMyBAQAoraWYgQVJDSF9JTlRFR1JBVE9SCisKK21lbnUgIkludGVncmF0b3IgT3B0aW9ucyIKKworY29uZmlnIEFSQ0hfSU5URUdSQVRPUl9BUAorCWJvb2wgIlN1cHBvcnQgSW50ZWdyYXRvci9BUCBhbmQgSW50ZWdyYXRvci9QUDIgcGxhdGZvcm1zIgorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBJbnRlZ3JhdG9yL0FQIGFuZAorCSAgSW50ZWdyYXRvci9QUDIgcGxhdGZvcm1zLgorCitjb25maWcgQVJDSF9JTlRFR1JBVE9SX0NQCisJYm9vbCAiU3VwcG9ydCBJbnRlZ3JhdG9yL0NQIHBsYXRmb3JtIgorCXNlbGVjdCBBUkNIX0NJTlRFR1JBVE9SCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJNKFIpIEludGVncmF0b3IgQ1AgcGxhdGZvcm0uCisKK2NvbmZpZyBBUkNIX0NJTlRFR1JBVE9SCisJYm9vbAorCitjb25maWcgSU5URUdSQVRPUl9JTVBEMQorCXRyaXN0YXRlICJJbmNsdWRlIHN1cHBvcnQgZm9yIEludGVncmF0b3IvSU0tUEQxIgorCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SX0FQCisJaGVscAorCSAgVGhlIElNLVBEMSBpcyBhbiBhZGQtb24gbG9naWMgbW9kdWxlIGZvciB0aGUgSW50ZWdyYXRvciB3aGljaAorCSAgYWxsb3dzIEFSTShSKSBMdGQgUHJpbWVDZWxscyB0byBiZSBkZXZlbG9wZWQgYW5kIGV2YWx1YXRlZC4KKwkgIFRoZSBJTS1QRDEgY2FuIGJlIGZvdW5kIG9uIHRoZSBJbnRlZ3JhdG9yL1BQMiBwbGF0Zm9ybS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaW1wZDEuCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThkYWFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJCQk6PSBjbG9jay5vIGNvcmUubyBsbS5vIHRpbWUubworb2JqLSQoQ09ORklHX0FSQ0hfSU5URUdSQVRPUl9BUCkJKz0gaW50ZWdyYXRvcl9hcC5vCitvYmotJChDT05GSUdfQVJDSF9JTlRFR1JBVE9SX0NQKQkrPSBpbnRlZ3JhdG9yX2NwLm8KKworb2JqLSQoQ09ORklHX0xFRFMpCQkJKz0gbGVkcy5vCitvYmotJChDT05GSUdfUENJKQkJCSs9IHBjaV92My5vIHBjaS5vCitvYmotJChDT05GSUdfQ1BVX0ZSRVFfSU5URUdSQVRPUikJKz0gY3B1Lm8KK29iai0kKENPTkZJR19JTlRFR1JBVE9SX0lNUEQxKQkJKz0gaW1wZDEubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2U3NWFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSw0IEBACisgICB6cmVsYWRkci15CTo9IDB4MDAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHgwMDAwMDEwMAoraW5pdHJkX3BoeXMteQk6PSAweDAwODAwMDAwCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyMDA1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZC4KKyAqICBXcml0dGVuIGJ5IERlZXAgQmx1ZSBTb2x1dGlvbnMgTGltaXRlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2ljc3Q1MjUuaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisKK3N0YXRpYyBMSVNUX0hFQUQoY2xvY2tzKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGNsb2Nrc19zZW0pOworCitzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCit7CisJc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CisKKwlkb3duKCZjbG9ja3Nfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKKwkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKKwkJCWNsayA9IHA7CisJCQlicmVhazsKKwkJfQorCX0KKwl1cCgmY2xvY2tzX3NlbSk7CisKKwlyZXR1cm4gY2xrOworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKKwordm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwltb2R1bGVfcHV0KGNsay0+b3duZXIpOworfQorRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKKworaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKKwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKKworaW50IGNsa191c2Uoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfdXNlKTsKKwordm9pZCBjbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQoreworfQorRVhQT1JUX1NZTUJPTChjbGtfdW51c2UpOworCit1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKKworbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlzdHJ1Y3QgaWNzdDUyNV92Y28gdmNvOworCisJdmNvID0gaWNzdDUyNV9raHpfdG9fdmNvKGNsay0+cGFyYW1zLCByYXRlIC8gMTAwMCk7CisJcmV0dXJuIGljc3Q1MjVfa2h6KGNsay0+cGFyYW1zLCB2Y28pICogMTAwMDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3JvdW5kX3JhdGUpOworCitpbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCByZXQgPSAtRUlPOworCWlmIChjbGstPnNldHZjbykgeworCQlzdHJ1Y3QgaWNzdDUyNV92Y28gdmNvOworCisJCXZjbyA9IGljc3Q1MjVfa2h6X3RvX3ZjbyhjbGstPnBhcmFtcywgcmF0ZSAvIDEwMDApOworCQljbGstPnJhdGUgPSBpY3N0NTI1X2toeihjbGstPnBhcmFtcywgdmNvKSAqIDEwMDA7CisKKwkJcHJpbnRrKCJDbG9jayAlczogc2V0dGluZyBWQ08gcmVnIHBhcmFtczogUz0lZCBSPSVkIFY9JWRcbiIsCisJCQljbGstPm5hbWUsIHZjby5zLCB2Y28uciwgdmNvLnYpOworCisJCWNsay0+c2V0dmNvKGNsaywgdmNvKTsKKwkJcmV0ID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19zZXRfcmF0ZSk7CisKKy8qCisgKiBUaGVzZSBhcmUgZml4ZWQgY2xvY2tzLgorICovCitzdGF0aWMgc3RydWN0IGNsayBrbWlfY2xrID0geworCS5uYW1lCT0gIktNSVJFRkNMSyIsCisJLnJhdGUJPSAyNDAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnRfY2xrID0geworCS5uYW1lCT0gIlVBUlRDTEsiLAorCS5yYXRlCT0gMTQ3NDU2MDAsCit9OworCitpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlkb3duKCZjbG9ja3Nfc2VtKTsKKwlsaXN0X2FkZCgmY2xrLT5ub2RlLCAmY2xvY2tzKTsKKwl1cCgmY2xvY2tzX3NlbSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19yZWdpc3Rlcik7CisKK3ZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQoreworCWRvd24oJmNsb2Nrc19zZW0pOworCWxpc3RfZGVsKCZjbGstPm5vZGUpOworCXVwKCZjbG9ja3Nfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOworCitzdGF0aWMgaW50IF9faW5pdCBjbGtfaW5pdCh2b2lkKQoreworCWNsa19yZWdpc3Rlcigma21pX2Nsayk7CisJY2xrX3JlZ2lzdGVyKCZ1YXJ0X2Nsayk7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGNsa19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllNjMyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkLgorICogIFdyaXR0ZW4gYnkgRGVlcCBCbHVlIFNvbHV0aW9ucyBMaW1pdGVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KK3N0cnVjdCBtb2R1bGU7CitzdHJ1Y3QgaWNzdDUyNV9wYXJhbXM7CisKK3N0cnVjdCBjbGsgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwl1bnNpZ25lZCBsb25nCQlyYXRlOworCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKKwljb25zdCBjaGFyCQkqbmFtZTsKKwljb25zdCBzdHJ1Y3QgaWNzdDUyNV9wYXJhbXMgKnBhcmFtczsKKwl2b2lkCQkJKmRhdGE7CisJdm9pZAkJCSgqc2V0dmNvKShzdHJ1Y3QgY2xrICosIHN0cnVjdCBpY3N0NTI1X3ZjbyB2Y28pOworfTsKKworaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29tbW9uLmgKQEAgLTAsMCArMSwyIEBACitleHRlcm4gdm9pZCBpbnRlZ3JhdG9yX3RpbWVfaW5pdCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50ZWdyYXRvcl9nZXR0aW1lb2Zmc2V0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNTBjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY20uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBydGNfZGV2aWNlID0geworCS5kZXYJCT0geworCQkuYnVzX2lkCT0gIm1iOjE1IiwKKwl9LAorCS5yZXMJCT0geworCQkuc3RhcnQJPSBJTlRFR1JBVE9SX1JUQ19CQVNFLAorCQkuZW5kCT0gSU5URUdSQVRPUl9SVENfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuaXJxCQk9IHsgSVJRX1JUQ0lOVCwgTk9fSVJRIH0sCisJLnBlcmlwaGlkCT0gMHgwMDA0MTAzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgdWFydDBfZGV2aWNlID0geworCS5kZXYJCT0geworCQkuYnVzX2lkCT0gIm1iOjE2IiwKKwl9LAorCS5yZXMJCT0geworCQkuc3RhcnQJPSBJTlRFR1JBVE9SX1VBUlQwX0JBU0UsCisJCS5lbmQJPSBJTlRFR1JBVE9SX1VBUlQwX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLmlycQkJPSB7IElSUV9VQVJUSU5UMCwgTk9fSVJRIH0sCisJLnBlcmlwaGlkCT0gMHgwMDQxMDEwLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0MV9kZXZpY2UgPSB7CisJLmRldgkJPSB7CisJCS5idXNfaWQJPSAibWI6MTciLAorCX0sCisJLnJlcwkJPSB7CisJCS5zdGFydAk9IElOVEVHUkFUT1JfVUFSVDFfQkFTRSwKKwkJLmVuZAk9IElOVEVHUkFUT1JfVUFSVDFfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuaXJxCQk9IHsgSVJRX1VBUlRJTlQxLCBOT19JUlEgfSwKKwkucGVyaXBoaWQJPSAweDAwNDEwMTAsCit9OworCitzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIGttaTBfZGV2aWNlID0geworCS5kZXYJCT0geworCQkuYnVzX2lkCT0gIm1iOjE4IiwKKwl9LAorCS5yZXMJCT0geworCQkuc3RhcnQJPSBLTUkwX0JBU0UsCisJCS5lbmQJPSBLTUkwX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLmlycQkJPSB7IElSUV9LTUlJTlQwLCBOT19JUlEgfSwKKwkucGVyaXBoaWQJPSAweDAwMDQxMDUwLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBrbWkxX2RldmljZSA9IHsKKwkuZGV2CQk9IHsKKwkJLmJ1c19pZAk9ICJtYjoxOSIsCisJfSwKKwkucmVzCQk9IHsKKwkJLnN0YXJ0CT0gS01JMV9CQVNFLAorCQkuZW5kCT0gS01JMV9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS5pcnEJCT0geyBJUlFfS01JSU5UMSwgTk9fSVJRIH0sCisJLnBlcmlwaGlkCT0gMHgwMDA0MTA1MCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFtYmFfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJJnJ0Y19kZXZpY2UsCisJJnVhcnQwX2RldmljZSwKKwkmdWFydDFfZGV2aWNlLAorCSZrbWkwX2RldmljZSwKKwkma21pMV9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbnRlZ3JhdG9yX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtYmFfZGV2cyk7IGkrKykgeworCQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmQgPSBhbWJhX2RldnNbaV07CisJCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKGQsICZpb21lbV9yZXNvdXJjZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoaW50ZWdyYXRvcl9pbml0KTsKKworI2RlZmluZSBDTV9DVFJMCUlPX0FERFJFU1MoSU5URUdSQVRPUl9IRFJfQkFTRSkgKyBJTlRFR1JBVE9SX0hEUl9DVFJMX09GRlNFVAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNtX2xvY2spOworCisvKioKKyAqIGNtX2NvbnRyb2wgLSB1cGRhdGUgdGhlIENNX0NUUkwgcmVnaXN0ZXIuCisgKiBAbWFzazogYml0cyB0byBjaGFuZ2UKKyAqIEBzZXQ6IGJpdHMgdG8gc2V0CisgKi8KK3ZvaWQgY21fY29udHJvbCh1MzIgbWFzaywgdTMyIHNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21fbG9jaywgZmxhZ3MpOworCXZhbCA9IHJlYWRsKENNX0NUUkwpICYgfm1hc2s7CisJd3JpdGVsKHZhbCB8IHNldCwgQ01fQ1RSTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21fbG9jaywgZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKGNtX2NvbnRyb2wpOworCisvKgorICogV2hlcmUgaXMgdGhlIHRpbWVyIChWQSk/CisgKi8KKyNkZWZpbmUgVElNRVIwX1ZBX0JBU0UgKElPX0FERFJFU1MoSU5URUdSQVRPUl9DVF9CQVNFKSsweDAwMDAwMDAwKQorI2RlZmluZSBUSU1FUjFfVkFfQkFTRSAoSU9fQUREUkVTUyhJTlRFR1JBVE9SX0NUX0JBU0UpKzB4MDAwMDAxMDApCisjZGVmaW5lIFRJTUVSMl9WQV9CQVNFIChJT19BRERSRVNTKElOVEVHUkFUT1JfQ1RfQkFTRSkrMHgwMDAwMDIwMCkKKyNkZWZpbmUgVkFfSUNfQkFTRSAgICAgSU9fQUREUkVTUyhJTlRFR1JBVE9SX0lDX0JBU0UpIAorCisvKgorICogSG93IGxvbmcgaXMgdGhlIHRpbWVyIGludGVydmFsPworICovCisjZGVmaW5lIFRJTUVSX0lOVEVSVkFMCShUSUNLU19QRVJfdVNFQyAqIG1TRUNfMTApCisjaWYgVElNRVJfSU5URVJWQUwgPj0gMHgxMDAwMDAKKyNkZWZpbmUgVElDS1MyVVNFQ1MoeCkJKDI1NiAqICh4KSAvIFRJQ0tTX1BFUl91U0VDKQorI2VsaWYgVElNRVJfSU5URVJWQUwgPj0gMHgxMDAwMAorI2RlZmluZSBUSUNLUzJVU0VDUyh4KQkoMTYgKiAoeCkgLyBUSUNLU19QRVJfdVNFQykKKyNlbHNlCisjZGVmaW5lIFRJQ0tTMlVTRUNTKHgpCSgoeCkgLyBUSUNLU19QRVJfdVNFQykKKyNlbmRpZgorCisvKgorICogV2hhdCBkb2VzIGl0IGxvb2sgbGlrZT8KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVGltZXJTdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgVGltZXJMb2FkOworCXVuc2lnbmVkIGxvbmcgVGltZXJWYWx1ZTsKKwl1bnNpZ25lZCBsb25nIFRpbWVyQ29udHJvbDsKKwl1bnNpZ25lZCBsb25nIFRpbWVyQ2xlYXI7Cit9IFRpbWVyU3RydWN0X3Q7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX3JlbG9hZDsKKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIG1zIHNpbmNlIGxhc3QgY2xvY2sgaW50ZXJydXB0LiAgTm90ZSB0aGF0IGludGVycnVwdHMKKyAqIHdpbGwgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGRvX2dldHRpbWVvZmZzZXQoKQorICovCit1bnNpZ25lZCBsb25nIGludGVncmF0b3JfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMSA9IChUaW1lclN0cnVjdF90ICopVElNRVIxX1ZBX0JBU0U7CisJdW5zaWduZWQgbG9uZyB0aWNrczEsIHRpY2tzMiwgc3RhdHVzOworCisJLyoKKwkgKiBHZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpY2tzLiAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgcmFjZQorCSAqIGNvbmRpdGlvbiBiZXR3ZWVuIHVzIHJlYWRpbmcgdGhlIHRpbWVyIGFuZCBjaGVja2luZyBmb3IKKwkgKiBhbiBpbnRlcnJ1cHQuICBXZSBnZXQgYXJvdW5kIHRoaXMgYnkgZW5zdXJpbmcgdGhhdCB0aGUKKwkgKiBjb3VudGVyIGhhcyBub3QgcmVsb2FkZWQgYmV0d2VlbiBvdXIgdHdvIHJlYWRzLgorCSAqLworCXRpY2tzMiA9IHRpbWVyMS0+VGltZXJWYWx1ZSAmIDB4ZmZmZjsKKwlkbyB7CisJCXRpY2tzMSA9IHRpY2tzMjsKKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoVkFfSUNfQkFTRSArIElSUV9SQVdfU1RBVFVTKTsKKwkJdGlja3MyID0gdGltZXIxLT5UaW1lclZhbHVlICYgMHhmZmZmOworCX0gd2hpbGUgKHRpY2tzMiA+IHRpY2tzMSk7CisKKwkvKgorCSAqIE51bWJlciBvZiB0aWNrcyBzaW5jZSBsYXN0IGludGVycnVwdC4KKwkgKi8KKwl0aWNrczEgPSB0aW1lcl9yZWxvYWQgLSB0aWNrczI7CisKKwkvKgorCSAqIEludGVycnVwdCBwZW5kaW5nPyAgSWYgc28sIHdlJ3ZlIHJlbG9hZGVkIG9uY2UgYWxyZWFkeS4KKwkgKi8KKwlpZiAoc3RhdHVzICYgKDEgPDwgSVJRX1RJTUVSSU5UMSkpCisJCXRpY2tzMSArPSB0aW1lcl9yZWxvYWQ7CisKKwkvKgorCSAqIENvbnZlcnQgdGhlIHRpY2tzIHRvIHVzZWNzCisJICovCisJcmV0dXJuIFRJQ0tTMlVTRUNTKHRpY2tzMSk7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIHRpbWVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAoraW50ZWdyYXRvcl90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjEgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMV9WQV9CQVNFOworCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwkvLyAuLi5jbGVhciB0aGUgaW50ZXJydXB0CisJdGltZXIxLT5UaW1lckNsZWFyID0gMTsKKworCXRpbWVyX3RpY2socmVncyk7CisKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpbnRlZ3JhdG9yX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiSW50ZWdyYXRvciBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gaW50ZWdyYXRvcl90aW1lcl9pbnRlcnJ1cHQKK307CisKKy8qCisgKiBTZXQgdXAgdGltZXIgaW50ZXJydXB0LCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy4KKyAqLwordm9pZCBfX2luaXQgaW50ZWdyYXRvcl90aW1lX2luaXQodW5zaWduZWQgbG9uZyByZWxvYWQsIHVuc2lnbmVkIGludCBjdHJsKQoreworCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMCA9ICh2b2xhdGlsZSBUaW1lclN0cnVjdF90ICopVElNRVIwX1ZBX0JBU0U7CisJdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIxID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjFfVkFfQkFTRTsKKwl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjIgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMl9WQV9CQVNFOworCXVuc2lnbmVkIGludCB0aW1lcl9jdHJsID0gMHg4MCB8IDB4NDA7CS8qIHBlcmlvZGljICovCisKKwl0aW1lcl9yZWxvYWQgPSByZWxvYWQ7CisJdGltZXJfY3RybCB8PSBjdHJsOworCisJaWYgKHRpbWVyX3JlbG9hZCA+IDB4MTAwMDAwKSB7CisJCXRpbWVyX3JlbG9hZCA+Pj0gODsKKwkJdGltZXJfY3RybCB8PSAweDA4OyAvKiAvMjU2ICovCisJfSBlbHNlIGlmICh0aW1lcl9yZWxvYWQgPiAweDAxMDAwMCkgeworCQl0aW1lcl9yZWxvYWQgPj49IDQ7CisJCXRpbWVyX2N0cmwgfD0gMHgwNDsgLyogLzE2ICovCisJfQorCisJLyoKKwkgKiBJbml0aWFsaXNlIHRvIGEga25vd24gc3RhdGUgKGFsbCB0aW1lcnMgb2ZmKQorCSAqLworCXRpbWVyMC0+VGltZXJDb250cm9sID0gMDsKKwl0aW1lcjEtPlRpbWVyQ29udHJvbCA9IDA7CisJdGltZXIyLT5UaW1lckNvbnRyb2wgPSAwOworCisJdGltZXIxLT5UaW1lckxvYWQgICAgPSB0aW1lcl9yZWxvYWQ7CisJdGltZXIxLT5UaW1lclZhbHVlICAgPSB0aW1lcl9yZWxvYWQ7CisJdGltZXIxLT5UaW1lckNvbnRyb2wgPSB0aW1lcl9jdHJsOworCisJLyogCisJICogTWFrZSBpcnFzIGhhcHBlbiBmb3IgdGhlIHN5c3RlbSB0aW1lcgorCSAqLworCXNldHVwX2lycShJUlFfVElNRVJJTlQxLCAmaW50ZWdyYXRvcl90aW1lcl9pcnEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzU4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY3B1LmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NwdS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICoKKyAqICAkSWQ6IGNwdS5jLHYgMS42IDIwMDIvMDcvMTggMTM6NTg6NTEgcm1rIEV4cCAkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDUFUgc3VwcG9ydCBmdW5jdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2ljc3Q1MjUuaD4KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBpbnRlZ3JhdG9yX2RyaXZlcjsKKworI2RlZmluZSBDTV9JRCAgCShJT19BRERSRVNTKElOVEVHUkFUT1JfSERSX0JBU0UpK0lOVEVHUkFUT1JfSERSX0lEX09GRlNFVCkKKyNkZWZpbmUgQ01fT1NDCShJT19BRERSRVNTKElOVEVHUkFUT1JfSERSX0JBU0UpK0lOVEVHUkFUT1JfSERSX09TQ19PRkZTRVQpCisjZGVmaW5lIENNX1NUQVQgKElPX0FERFJFU1MoSU5URUdSQVRPUl9IRFJfQkFTRSkrSU5URUdSQVRPUl9IRFJfU1RBVF9PRkZTRVQpCisjZGVmaW5lIENNX0xPQ0sgKElPX0FERFJFU1MoSU5URUdSQVRPUl9IRFJfQkFTRSkrSU5URUdSQVRPUl9IRFJfTE9DS19PRkZTRVQpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWNzdDUyNV9wYXJhbXMgbGNsa19wYXJhbXMgPSB7CisJLnJlZgkJPSAyNDAwMCwKKwkudmNvX21heAk9IDMyMDAwMCwKKwkudmRfbWluCQk9IDgsCisJLnZkX21heAkJPSAxMzIsCisJLnJkX21pbgkJPSAyNCwKKwkucmRfbWF4CQk9IDI0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpY3N0NTI1X3BhcmFtcyBjY2xrX3BhcmFtcyA9IHsKKwkucmVmCQk9IDI0MDAwLAorCS52Y29fbWF4CT0gMzIwMDAwLAorCS52ZF9taW4JCT0gMTIsCisJLnZkX21heAkJPSAxNjAsCisJLnJkX21pbgkJPSAyNCwKKwkucmRfbWF4CQk9IDI0LAorfTsKKworLyoKKyAqIFZhbGlkYXRlIHRoZSBzcGVlZCBwb2xpY3kuCisgKi8KK3N0YXRpYyBpbnQgaW50ZWdyYXRvcl92ZXJpZnlfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBpY3N0NTI1X3ZjbyB2Y287CisKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgCisJCQkJICAgICBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsIAorCQkJCSAgICAgcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKKworCXZjbyA9IGljc3Q1MjVfa2h6X3RvX3ZjbygmY2Nsa19wYXJhbXMsIHBvbGljeS0+bWF4KTsKKwlwb2xpY3ktPm1heCA9IGljc3Q1MjVfa2h6KCZjY2xrX3BhcmFtcywgdmNvKTsKKworCXZjbyA9IGljc3Q1MjVfa2h6X3RvX3ZjbygmY2Nsa19wYXJhbXMsIHBvbGljeS0+bWluKTsKKwlwb2xpY3ktPm1pbiA9IGljc3Q1MjVfa2h6KCZjY2xrX3BhcmFtcywgdmNvKTsKKworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCAKKwkJCQkgICAgIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwgCisJCQkJICAgICBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpbnRlZ3JhdG9yX3NldF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCQkgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CisJaW50IGNwdSA9IHBvbGljeS0+Y3B1OworCXN0cnVjdCBpY3N0NTI1X3ZjbyB2Y287CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJdV9pbnQgY21fb3NjOworCisJLyoKKwkgKiBTYXZlIHRoaXMgdGhyZWFkcyBjcHVzX2FsbG93ZWQgbWFzay4KKwkgKi8KKwljcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwkvKgorCSAqIEJpbmQgdG8gdGhlIHNwZWNpZmllZCBDUFUuICBXaGVuIHRoaXMgY2FsbCByZXR1cm5zLAorCSAqIHdlIHNob3VsZCBiZSBydW5uaW5nIG9uIHRoZSByaWdodCBDUFUuCisJICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlCVUdfT04oY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwkvKiBnZXQgY3VycmVudCBzZXR0aW5nICovCisJY21fb3NjID0gX19yYXdfcmVhZGwoQ01fT1NDKTsKKworCWlmIChtYWNoaW5lX2lzX2ludGVncmF0b3IoKSkgeworCQl2Y28ucyA9IChjbV9vc2MgPj4gOCkgJiA3OworCX0gZWxzZSBpZiAobWFjaGluZV9pc19jaW50ZWdyYXRvcigpKSB7CisJCXZjby5zID0gMTsKKwl9CisJdmNvLnYgPSBjbV9vc2MgJiAyNTU7CisJdmNvLnIgPSAyMjsKKwlmcmVxcy5vbGQgPSBpY3N0NTI1X2toeigmY2Nsa19wYXJhbXMsIHZjbyk7CisKKwkvKiBpY3N0NTI1X2toel90b192Y28gcm91bmRzIGRvd24gLS0gc28gd2UgbmVlZCB0aGUgbmV4dAorCSAqIGxhcmdlciBmcmVxIGluIGNhc2Ugb2YgQ1BVRlJFUV9SRUxBVElPTl9MLgorCSAqLworCWlmIChyZWxhdGlvbiA9PSBDUFVGUkVRX1JFTEFUSU9OX0wpCisJCXRhcmdldF9mcmVxICs9IDk5OTsKKwlpZiAodGFyZ2V0X2ZyZXEgPiBwb2xpY3ktPm1heCkKKwkJdGFyZ2V0X2ZyZXEgPSBwb2xpY3ktPm1heDsKKwl2Y28gPSBpY3N0NTI1X2toel90b192Y28oJmNjbGtfcGFyYW1zLCB0YXJnZXRfZnJlcSk7CisJZnJlcXMubmV3ID0gaWNzdDUyNV9raHooJmNjbGtfcGFyYW1zLCB2Y28pOworCisJZnJlcXMuY3B1ID0gcG9saWN5LT5jcHU7CisKKwlpZiAoZnJlcXMub2xkID09IGZyZXFzLm5ldykgeworCQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdXNfYWxsb3dlZCk7CisJCXJldHVybiAwOworCX0KKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwljbV9vc2MgPSBfX3Jhd19yZWFkbChDTV9PU0MpOworCisJaWYgKG1hY2hpbmVfaXNfaW50ZWdyYXRvcigpKSB7CisJCWNtX29zYyAmPSAweGZmZmZmODAwOworCQljbV9vc2MgfD0gdmNvLnMgPDwgODsKKwl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfY2ludGVncmF0b3IoKSkgeworCQljbV9vc2MgJj0gMHhmZmZmZmYwMDsKKwl9CisJY21fb3NjIHw9IHZjby52OworCisJX19yYXdfd3JpdGVsKDB4YTA1ZiwgQ01fTE9DSyk7CisJX19yYXdfd3JpdGVsKGNtX29zYywgQ01fT1NDKTsKKwlfX3Jhd193cml0ZWwoMCwgQ01fTE9DSyk7CisKKwkvKgorCSAqIFJlc3RvcmUgdGhlIENQVXMgYWxsb3dlZCBtYXNrLgorCSAqLworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1c19hbGxvd2VkKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWdyYXRvcl9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCXVuc2lnbmVkIGludCBjdXJyZW50X2ZyZXE7CisJdV9pbnQgY21fb3NjOworCXN0cnVjdCBpY3N0NTI1X3ZjbyB2Y287CisKKwljcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCUJVR19PTihjcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIGRldGVjdCBtZW1vcnkgZXRjLiAqLworCWNtX29zYyA9IF9fcmF3X3JlYWRsKENNX09TQyk7CisKKwlpZiAobWFjaGluZV9pc19pbnRlZ3JhdG9yKCkpIHsKKwkJdmNvLnMgPSAoY21fb3NjID4+IDgpICYgNzsKKwl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfY2ludGVncmF0b3IoKSkgeworCQl2Y28ucyA9IDE7CisJfQorCXZjby52ID0gY21fb3NjICYgMjU1OworCXZjby5yID0gMjI7CisKKwljdXJyZW50X2ZyZXEgPSBpY3N0NTI1X2toeigmY2Nsa19wYXJhbXMsIHZjbyk7IC8qIGN1cnJlbnQgZnJlcSAqLworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzX2FsbG93ZWQpOworCisJcmV0dXJuIGN1cnJlbnRfZnJlcTsKK30KKworc3RhdGljIGludCBpbnRlZ3JhdG9yX2NwdWZyZXFfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKworCS8qIHNldCBkZWZhdWx0IHBvbGljeSBhbmQgY3B1aW5mbyAqLworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gMTYwMDAwOworCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IDEyMDAwOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwMDAwOyAvKiAxIG1zLCBhc3N1bWVkICovCisJcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gaW50ZWdyYXRvcl9nZXQocG9saWN5LT5jcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgaW50ZWdyYXRvcl9kcml2ZXIgPSB7CisJLnZlcmlmeQkJPSBpbnRlZ3JhdG9yX3ZlcmlmeV9wb2xpY3ksCisJLnRhcmdldAkJPSBpbnRlZ3JhdG9yX3NldF90YXJnZXQsCisJLmdldAkJPSBpbnRlZ3JhdG9yX2dldCwKKwkuaW5pdAkJPSBpbnRlZ3JhdG9yX2NwdWZyZXFfaW5pdCwKKwkubmFtZQkJPSAiaW50ZWdyYXRvciIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbnRlZ3JhdG9yX2NwdV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZpbnRlZ3JhdG9yX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpbnRlZ3JhdG9yX2NwdV9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmaW50ZWdyYXRvcl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SICgiUnVzc2VsbCBNLiBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJjcHVmcmVxIGRyaXZlciBmb3IgQVJNIEludGVncmF0b3IgQ1BVcyIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaW50ZWdyYXRvcl9jcHVfaW5pdCk7Cittb2R1bGVfZXhpdChpbnRlZ3JhdG9yX2NwdV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9kbWEuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU2ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2RtYS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2RtYS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2RtYS5oPgorCit2b2lkIF9faW5pdCBhcmNoX2RtYV9pbml0KGRtYV90ICpkbWEpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW1wZDEuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzJmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW1wZDEuYwpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW1wZDEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBjb3JlIHN1cHBvcnQgZm9yIHRoZSBJTS1QRDEgbW9kdWxlLgorICoKKyAqIE1vZHVsZSAvIGJvb3QgcGFyYW1ldGVycy4KKyAqICAgbG1pZD1uICAgaW1wZDEubG1pZD1uIC0gc2V0IHRoZSBsb2dpYyBtb2R1bGUgcG9zaXRpb24gaW4gc3RhY2sgdG8gJ24nCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDUyNS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmFfY2xjZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2xtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaW1wZDEuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisKK3N0YXRpYyBpbnQgbW9kdWxlX2lkOworCittb2R1bGVfcGFyYW1fbmFtZWQobG1pZCwgbW9kdWxlX2lkLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhsbWlkLCAibG9naWMgbW9kdWxlIHN0YWNrIHBvc2l0aW9uIik7CisKK3N0cnVjdCBpbXBkMV9tb2R1bGUgeworCXZvaWQgX19pb21lbQkqYmFzZTsKKwlzdHJ1Y3QgY2xrCXZjb3NbMl07Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGljc3Q1MjVfcGFyYW1zIGltcGQxX3Zjb19wYXJhbXMgPSB7CisJLnJlZgkJPSAyNDAwMCwJLyogMjQgTUh6ICovCisJLnZjb19tYXgJPSAyMDAwMDAsCS8qIDIwMCBNSHogKi8KKwkudmRfbWluCQk9IDEyLAorCS52ZF9tYXgJCT0gNTE5LAorCS5yZF9taW4JCT0gMywKKwkucmRfbWF4CQk9IDEyMCwKK307CisKK3N0YXRpYyB2b2lkIGltcGQxX3NldHZjbyhzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBpY3N0NTI1X3ZjbyB2Y28pCit7CisJc3RydWN0IGltcGQxX21vZHVsZSAqaW1wZDEgPSBjbGstPmRhdGE7CisJaW50IHZjb25yID0gY2xrIC0gaW1wZDEtPnZjb3M7CisJdTMyIHZhbDsKKworCXZhbCA9IHZjby52IHwgKHZjby5yIDw8IDkpIHwgKHZjby5zIDw8IDE2KTsKKworCXdyaXRlbCgweGEwNWYsIGltcGQxLT5iYXNlICsgSU1QRDFfTE9DSyk7CisJc3dpdGNoICh2Y29ucikgeworCWNhc2UgMDoKKwkJd3JpdGVsKHZhbCwgaW1wZDEtPmJhc2UgKyBJTVBEMV9PU0MxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl3cml0ZWwodmFsLCBpbXBkMS0+YmFzZSArIElNUEQxX09TQzIpOworCQlicmVhazsKKwl9CisJd3JpdGVsKDAsIGltcGQxLT5iYXNlICsgSU1QRDFfTE9DSyk7CisKKyNpZiBERUJVRworCXZjby52ID0gdmFsICYgMHgxZmY7CisJdmNvLnIgPSAodmFsID4+IDkpICYgMHg3ZjsKKwl2Y28ucyA9ICh2YWwgPj4gMTYpICYgNzsKKworCXByX2RlYnVnKCJJTS1QRDE6IFZDTyVkIGNsb2NrIGlzICVsZCBrSHpcbiIsCisJCSB2Y29uciwgaWNzdDUyNV9raHooJmltcGQxX3Zjb19wYXJhbXMsIHZjbykpOworI2VuZGlmCit9CisKK3ZvaWQgaW1wZDFfdHdlYWtfY29udHJvbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBtYXNrLCB1MzIgdmFsKQoreworCXN0cnVjdCBpbXBkMV9tb2R1bGUgKmltcGQxID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIGN1cjsKKworCXZhbCAmPSBtYXNrOworCWN1ciA9IHJlYWRsKGltcGQxLT5iYXNlICsgSU1QRDFfQ1RSTCkgJiB+bWFzazsKKwl3cml0ZWwoY3VyIHwgdmFsLCBpbXBkMS0+YmFzZSArIElNUEQxX0NUUkwpOworfQorCitFWFBPUlRfU1lNQk9MKGltcGQxX3R3ZWFrX2NvbnRyb2wpOworCisvKgorICogQ0xDRCBzdXBwb3J0CisgKi8KKyNkZWZpbmUgUEFORUwJCVBST1NQRUNUT1IKKworI2RlZmluZSBMVE0xMEMyMDkJCTEKKyNkZWZpbmUgUFJPU1BFQ1RPUgkJMgorI2RlZmluZSBTVkdBCQkJMworI2RlZmluZSBWR0EJCQk0CisKKyNpZiBQQU5FTCA9PSBWR0EKKyNkZWZpbmUgUEFORUxUWVBFCXZnYQorc3RhdGljIHN0cnVjdCBjbGNkX3BhbmVsIHZnYSA9IHsKKwkubW9kZQkJPSB7CisJCS5uYW1lCQk9ICJWR0EiLAorCQkucmVmcmVzaAk9IDYwLAorCQkueHJlcwkJPSA2NDAsCisJCS55cmVzCQk9IDQ4MCwKKwkJLnBpeGNsb2NrCT0gMzk3MjEsCisJCS5sZWZ0X21hcmdpbgk9IDQwLAorCQkucmlnaHRfbWFyZ2luCT0gMjQsCisJCS51cHBlcl9tYXJnaW4JPSAzMiwKKwkJLmxvd2VyX21hcmdpbgk9IDExLAorCQkuaHN5bmNfbGVuCT0gOTYsCisJCS52c3luY19sZW4JPSAyLAorCQkuc3luYwkJPSAwLAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LAorCS53aWR0aAkJPSAtMSwKKwkuaGVpZ2h0CQk9IC0xLAorCS50aW0yCQk9IFRJTTJfQkNEIHwgVElNMl9JUEMsCisJLmNudGwJCT0gQ05UTF9MQ0RURlQgfCBDTlRMX0xDRFZDT01QKDEpLAorCS5jb25uZWN0b3IJPSBJTVBEMV9DVFJMX0RJU1BfVkdBLAorCS5icHAJCT0gMTYsCisJLmdyYXlzY2FsZQk9IDAsCit9OworCisjZWxpZiBQQU5FTCA9PSBTVkdBCisjZGVmaW5lIFBBTkVMVFlQRQlzdmdhCitzdGF0aWMgc3RydWN0IGNsY2RfcGFuZWwgc3ZnYSA9IHsKKwkubW9kZQkJPSB7CisJCS5uYW1lCQk9ICJTVkdBIiwKKwkJLnJlZnJlc2gJPSAwLAorCQkueHJlcwkJPSA4MDAsCisJCS55cmVzCQk9IDYwMCwKKwkJLnBpeGNsb2NrCT0gMjc3NzgsCisJCS5sZWZ0X21hcmdpbgk9IDIwLAorCQkucmlnaHRfbWFyZ2luCT0gMjAsCisJCS51cHBlcl9tYXJnaW4JPSA1LAorCQkubG93ZXJfbWFyZ2luCT0gNSwKKwkJLmhzeW5jX2xlbgk9IDE2NCwKKwkJLnZzeW5jX2xlbgk9IDYyLAorCQkuc3luYwkJPSAwLAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LAorCS53aWR0aAkJPSAtMSwKKwkuaGVpZ2h0CQk9IC0xLAorCS50aW0yCQk9IFRJTTJfQkNELAorCS5jbnRsCQk9IENOVExfTENEVEZUIHwgQ05UTF9MQ0RWQ09NUCgxKSwKKwkuY29ubmVjdG9yCT0gSU1QRDFfQ1RSTF9ESVNQX1ZHQSwKKwkuYnBwCQk9IDE2LAorCS5ncmF5c2NhbGUJPSAwLAorfTsKKworI2VsaWYgUEFORUwgPT0gUFJPU1BFQ1RPUgorI2RlZmluZSBQQU5FTFRZUEUJcHJvc3BlY3Rvcgorc3RhdGljIHN0cnVjdCBjbGNkX3BhbmVsIHByb3NwZWN0b3IgPSB7CisJLm1vZGUJCT0geworCQkubmFtZQkJPSAiUFJPU1BFQ1RPUiIsCisJCS5yZWZyZXNoCT0gMCwKKwkJLnhyZXMJCT0gNjQwLAorCQkueXJlcwkJPSA0ODAsCisJCS5waXhjbG9jawk9IDQwMDAwLAorCQkubGVmdF9tYXJnaW4JPSAzMywKKwkJLnJpZ2h0X21hcmdpbgk9IDY0LAorCQkudXBwZXJfbWFyZ2luCT0gMzYsCisJCS5sb3dlcl9tYXJnaW4JPSA3LAorCQkuaHN5bmNfbGVuCT0gNjQsCisJCS52c3luY19sZW4JPSAyNSwKKwkJLnN5bmMJCT0gRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorCX0sCisJLndpZHRoCQk9IC0xLAorCS5oZWlnaHQJCT0gLTEsCisJLnRpbTIJCT0gVElNMl9CQ0QsCisJLmNudGwJCT0gQ05UTF9MQ0RURlQgfCBDTlRMX0xDRFZDT01QKDEpLAorCS5maXhlZHRpbWluZ3MJPSAxLAorCS5jb25uZWN0b3IJPSBJTVBEMV9DVFJMX0RJU1BfTENELAorCS5icHAJCT0gMTYsCisJLmdyYXlzY2FsZQk9IDAsCit9OworCisjZWxpZiBQQU5FTCA9PSBMVE0xMEMyMDkKKyNkZWZpbmUgUEFORUxUWVBFCWx0bTEwYzIwOQorLyoKKyAqIFVudGVzdGVkLgorICovCitzdGF0aWMgc3RydWN0IGNsY2RfcGFuZWwgbHRtMTBjMjA5ID0geworCS5tb2RlCQk9IHsKKwkJLm5hbWUJCT0gIkxUTTEwQzIwOSIsCisJCS5yZWZyZXNoCT0gMCwKKwkJLnhyZXMJCT0gNjQwLAorCQkueXJlcwkJPSA0ODAsCisJCS5waXhjbG9jawk9IDQwMDAwLAorCQkubGVmdF9tYXJnaW4JPSAyMCwKKwkJLnJpZ2h0X21hcmdpbgk9IDIwLAorCQkudXBwZXJfbWFyZ2luCT0gMTksCisJCS5sb3dlcl9tYXJnaW4JPSAxOSwKKwkJLmhzeW5jX2xlbgk9IDIwLAorCQkudnN5bmNfbGVuCT0gMTAsCisJCS5zeW5jCQk9IEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LAorCS53aWR0aAkJPSAtMSwKKwkuaGVpZ2h0CQk9IC0xLAorCS50aW0yCQk9IFRJTTJfQkNELAorCS5jbnRsCQk9IENOVExfTENEVEZUIHwgQ05UTF9MQ0RWQ09NUCgxKSwKKwkuZml4ZWR0aW1pbmdzCT0gMSwKKwkuY29ubmVjdG9yCT0gSU1QRDFfQ1RSTF9ESVNQX0xDRCwKKwkuYnBwCQk9IDE2LAorCS5ncmF5c2NhbGUJPSAwLAorfTsKKyNlbmRpZgorCisvKgorICogRGlzYWJsZSBhbGwgZGlzcGxheSBjb25uZWN0b3JzIG9uIHRoZSBpbnRlcmZhY2UgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCBpbXBkMWZiX2NsY2RfZGlzYWJsZShzdHJ1Y3QgY2xjZF9mYiAqZmIpCit7CisJaW1wZDFfdHdlYWtfY29udHJvbChmYi0+ZGV2LT5kZXYucGFyZW50LCBJTVBEMV9DVFJMX0RJU1BfTUFTSywgMCk7Cit9CisKKy8qCisgKiBFbmFibGUgdGhlIHJlbGV2YW50IGNvbm5lY3RvciBvbiB0aGUgaW50ZXJmYWNlIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgaW1wZDFmYl9jbGNkX2VuYWJsZShzdHJ1Y3QgY2xjZF9mYiAqZmIpCit7CisJaW1wZDFfdHdlYWtfY29udHJvbChmYi0+ZGV2LT5kZXYucGFyZW50LCBJTVBEMV9DVFJMX0RJU1BfTUFTSywKKwkJCWZiLT5wYW5lbC0+Y29ubmVjdG9yIHwgSU1QRDFfQ1RSTF9ESVNQX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgaW1wZDFmYl9jbGNkX3NldHVwKHN0cnVjdCBjbGNkX2ZiICpmYikKK3sKKwl1bnNpZ25lZCBsb25nIGZyYW1lYmFzZSA9IGZiLT5kZXYtPnJlcy5zdGFydCArIDB4MDEwMDAwMDA7CisJdW5zaWduZWQgbG9uZyBmcmFtZXNpemUgPSBTWl8xTTsKKwlpbnQgcmV0ID0gMDsKKworCWZiLT5wYW5lbCA9ICZQQU5FTFRZUEU7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihmcmFtZWJhc2UsIGZyYW1lc2l6ZSwgImNsY2QgZnJhbWVidWZmZXIiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklNLVBEMTogdW5hYmxlIHRvIHJlc2VydmUgZnJhbWVidWZmZXJcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWZiLT5mYi5zY3JlZW5fYmFzZSA9IGlvcmVtYXAoZnJhbWViYXNlLCBmcmFtZXNpemUpOworCWlmICghZmItPmZiLnNjcmVlbl9iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSU0tUEQxOiB1bmFibGUgdG8gbWFwIGZyYW1lYnVmZmVyXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2J1ZmZlcjsKKwl9CisKKwlmYi0+ZmIuZml4LnNtZW1fc3RhcnQJPSBmcmFtZWJhc2U7CisJZmItPmZiLmZpeC5zbWVtX2xlbgk9IGZyYW1lc2l6ZTsKKworCXJldHVybiAwOworCisgZnJlZV9idWZmZXI6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGZyYW1lYmFzZSwgZnJhbWVzaXplKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGltcGQxZmJfY2xjZF9tbWFwKHN0cnVjdCBjbGNkX2ZiICpmYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZTsKKworCXN0YXJ0ID0gdm1hLT52bV9wZ29mZiArIChmYi0+ZmIuZml4LnNtZW1fc3RhcnQgPj4gUEFHRV9TSElGVCk7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBzdGFydCwgc2l6ZSwKKwkJCSAgICAgICB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyB2b2lkIGltcGQxZmJfY2xjZF9yZW1vdmUoc3RydWN0IGNsY2RfZmIgKmZiKQoreworCWlvdW5tYXAoZmItPmZiLnNjcmVlbl9iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oZmItPmZiLmZpeC5zbWVtX3N0YXJ0LCBmYi0+ZmIuZml4LnNtZW1fbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGNkX2JvYXJkIGltcGQxX2NsY2RfZGF0YSA9IHsKKwkubmFtZQkJPSAiSU0tUEQvMSIsCisJLmNoZWNrCQk9IGNsY2RmYl9jaGVjaywKKwkuZGVjb2RlCQk9IGNsY2RmYl9kZWNvZGUsCisJLmRpc2FibGUJPSBpbXBkMWZiX2NsY2RfZGlzYWJsZSwKKwkuZW5hYmxlCQk9IGltcGQxZmJfY2xjZF9lbmFibGUsCisJLnNldHVwCQk9IGltcGQxZmJfY2xjZF9zZXR1cCwKKwkubW1hcAkJPSBpbXBkMWZiX2NsY2RfbW1hcCwKKwkucmVtb3ZlCQk9IGltcGQxZmJfY2xjZF9yZW1vdmUsCit9OworCitzdHJ1Y3QgaW1wZDFfZGV2aWNlIHsKKwl1bnNpZ25lZCBsb25nCW9mZnNldDsKKwl1bnNpZ25lZCBpbnQJaXJxWzJdOworCXVuc2lnbmVkIGludAlpZDsKKwl2b2lkCQkqcGxhdGZvcm1fZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW1wZDFfZGV2aWNlIGltcGQxX2RldnNbXSA9IHsKKwl7CisJCS5vZmZzZXQJPSAweDAzMDAwMDAwLAorCQkuaWQJPSAweDAwMDQxMTkwLAorCX0sIHsKKwkJLm9mZnNldAk9IDB4MDAxMDAwMDAsCisJCS5pcnEJPSB7IDEgfSwKKwkJLmlkCT0gMHgwMDE0MTAxMSwKKwl9LCB7CisJCS5vZmZzZXQJPSAweDAwMjAwMDAwLAorCQkuaXJxCT0geyAyIH0sCisJCS5pZAk9IDB4MDAxNDEwMTEsCisJfSwgeworCQkub2Zmc2V0CT0gMHgwMDMwMDAwMCwKKwkJLmlycQk9IHsgMyB9LAorCQkuaWQJPSAweDAwMDQxMDIyLAorCX0sIHsKKwkJLm9mZnNldAk9IDB4MDA0MDAwMDAsCisJCS5pcnEJPSB7IDQgfSwKKwkJLmlkCT0gMHgwMDA0MTA2MSwKKwl9LCB7CisJCS5vZmZzZXQJPSAweDAwNTAwMDAwLAorCQkuaXJxCT0geyA1IH0sCisJCS5pZAk9IDB4MDAwNDEwNjEsCisJfSwgeworCQkub2Zmc2V0CT0gMHgwMDYwMDAwMCwKKwkJLmlycQk9IHsgNiB9LAorCQkuaWQJPSAweDAwMDQxMTMwLAorCX0sIHsKKwkJLm9mZnNldAk9IDB4MDA3MDAwMDAsCisJCS5pcnEJPSB7IDcsIDggfSwKKwkJLmlkCT0gMHgwMDA0MTE4MSwKKwl9LCB7CisJCS5vZmZzZXQJPSAweDAwODAwMDAwLAorCQkuaXJxCT0geyA5IH0sCisJCS5pZAk9IDB4MDAwNDEwNDEsCisJfSwgeworCQkub2Zmc2V0CT0gMHgwMTAwMDAwMCwKKwkJLmlycQk9IHsgMTEgfSwKKwkJLmlkCT0gMHgwMDA0MTExMCwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaW1wZDFfY2xjZF9kYXRhLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppbXBkMV92Y29uYW1lc1syXSA9IHsKKwkiQ0xDRENMSyIsCisJIkFVWFZDTzIiLAorfTsKKworc3RhdGljIGludCBpbXBkMV9wcm9iZShzdHJ1Y3QgbG1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGltcGQxX21vZHVsZSAqaW1wZDE7CisJaW50IGksIHJldDsKKworCWlmIChkZXYtPmlkICE9IG1vZHVsZV9pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlLnN0YXJ0LCBTWl80SywgIkxNIHJlZ2lzdGVycyIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaW1wZDEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW1wZDFfbW9kdWxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbXBkMSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2VfbG07CisJfQorCW1lbXNldChpbXBkMSwgMCwgc2l6ZW9mKHN0cnVjdCBpbXBkMV9tb2R1bGUpKTsKKworCWltcGQxLT5iYXNlID0gaW9yZW1hcChkZXYtPnJlc291cmNlLnN0YXJ0LCBTWl80Syk7CisJaWYgKCFpbXBkMS0+YmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfaW1wZDE7CisJfQorCisJbG1fc2V0X2RydmRhdGEoZGV2LCBpbXBkMSk7CisKKwlwcmludGsoIklNLVBEMSBmb3VuZCBhdCAweCUwOGx4XG4iLCBkZXYtPnJlc291cmNlLnN0YXJ0KTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGltcGQxLT52Y29zKTsgaSsrKSB7CisJCWltcGQxLT52Y29zW2ldLm93bmVyID0gVEhJU19NT0RVTEUsCisJCWltcGQxLT52Y29zW2ldLm5hbWUgPSBpbXBkMV92Y29uYW1lc1tpXSwKKwkJaW1wZDEtPnZjb3NbaV0ucGFyYW1zID0gJmltcGQxX3Zjb19wYXJhbXMsCisJCWltcGQxLT52Y29zW2ldLmRhdGEgPSBpbXBkMSwKKwkJaW1wZDEtPnZjb3NbaV0uc2V0dmNvID0gaW1wZDFfc2V0dmNvOworCisJCWNsa19yZWdpc3RlcigmaW1wZDEtPnZjb3NbaV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGltcGQxX2RldnMpOyBpKyspIHsKKwkJc3RydWN0IGltcGQxX2RldmljZSAqaWRldiA9IGltcGQxX2RldnMgKyBpOworCQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmQ7CisJCXVuc2lnbmVkIGxvbmcgcGNfYmFzZTsKKworCQlwY19iYXNlID0gZGV2LT5yZXNvdXJjZS5zdGFydCArIGlkZXYtPm9mZnNldDsKKworCQlkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFtYmFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZCkKKwkJCWNvbnRpbnVlOworCisJCW1lbXNldChkLCAwLCBzaXplb2Yoc3RydWN0IGFtYmFfZGV2aWNlKSk7CisKKwkJc25wcmludGYoZC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGQtPmRldi5idXNfaWQpLAorCQkJICJsbSV4OiU1LjVseCIsIGRldi0+aWQsIGlkZXYtPm9mZnNldCA+PiAxMik7CisKKwkJZC0+ZGV2LnBhcmVudAk9ICZkZXYtPmRldjsKKwkJZC0+cmVzLnN0YXJ0CT0gZGV2LT5yZXNvdXJjZS5zdGFydCArIGlkZXYtPm9mZnNldDsKKwkJZC0+cmVzLmVuZAk9IGQtPnJlcy5zdGFydCArIFNaXzRLIC0gMTsKKwkJZC0+cmVzLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU07CisJCWQtPmlycVswXQk9IGRldi0+aXJxOworCQlkLT5pcnFbMV0JPSBkZXYtPmlycTsKKwkJZC0+cGVyaXBoaWQJPSBpZGV2LT5pZDsKKwkJZC0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBpZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJCXJldCA9IGFtYmFfZGV2aWNlX3JlZ2lzdGVyKGQsICZkZXYtPnJlc291cmNlKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKCJ1bmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlICVzOiAlZFxuIiwKKwkJCQlkLT5kZXYuYnVzX2lkLCByZXQpOworCQkJa2ZyZWUoZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworIGZyZWVfaW1wZDE6CisJaWYgKGltcGQxICYmIGltcGQxLT5iYXNlKQorCQlpb3VubWFwKGltcGQxLT5iYXNlKTsKKwlpZiAoaW1wZDEpCisJCWtmcmVlKGltcGQxKTsKKyByZWxlYXNlX2xtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlLnN0YXJ0LCBTWl80Syk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW1wZDFfcmVtb3ZlKHN0cnVjdCBsbV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW1wZDFfbW9kdWxlICppbXBkMSA9IGxtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CisJaW50IGk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbiwgJmRldi0+ZGV2LmNoaWxkcmVuKSB7CisJCXN0cnVjdCBkZXZpY2UgKmQgPSBsaXN0X3RvX2RldihsKTsKKworCQlkZXZpY2VfdW5yZWdpc3RlcihkKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbXBkMS0+dmNvcyk7IGkrKykKKwkJY2xrX3VucmVnaXN0ZXIoJmltcGQxLT52Y29zW2ldKTsKKworCWxtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwlpb3VubWFwKGltcGQxLT5iYXNlKTsKKwlrZnJlZShpbXBkMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+cmVzb3VyY2Uuc3RhcnQsIFNaXzRLKTsKK30KKworc3RhdGljIHN0cnVjdCBsbV9kcml2ZXIgaW1wZDFfZHJpdmVyID0geworCS5kcnYgPSB7CisJCS5uYW1lCT0gImltcGQxIiwKKwl9LAorCS5wcm9iZQkJPSBpbXBkMV9wcm9iZSwKKwkucmVtb3ZlCQk9IGltcGQxX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGltcGQxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbG1fZHJpdmVyX3JlZ2lzdGVyKCZpbXBkMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW1wZDFfZXhpdCh2b2lkKQoreworCWxtX2RyaXZlcl91bnJlZ2lzdGVyKCZpbXBkMV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbXBkMV9pbml0KTsKK21vZHVsZV9leGl0KGltcGQxX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVncmF0b3IvSU0tUEQxIGxvZ2ljIG1vZHVsZSBjb3JlIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmE5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9rbWkuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2xtLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLyogCisgKiBBbGwgSU8gYWRkcmVzc2VzIGFyZSBtYXBwZWQgb250byBWQSAweEZGRngueHh4eCwgd2hlcmUgeC54eHh4CisgKiBpcyB0aGUgKFBBID4+IDEyKS4KKyAqCisgKiBTZXR1cCBhIFZBIGZvciB0aGUgSW50ZWdyYXRvciBpbnRlcnJ1cHQgY29udHJvbGxlciAoZm9yIGhlYWRlciAjMCwKKyAqIGp1c3QgZm9yIG5vdykuCisgKi8KKyNkZWZpbmUgVkFfSUNfQkFTRQlJT19BRERSRVNTKElOVEVHUkFUT1JfSUNfQkFTRSkgCisjZGVmaW5lIFZBX1NDX0JBU0UJSU9fQUREUkVTUyhJTlRFR1JBVE9SX1NDX0JBU0UpCisjZGVmaW5lIFZBX0VCSV9CQVNFCUlPX0FERFJFU1MoSU5URUdSQVRPUl9FQklfQkFTRSkKKyNkZWZpbmUgVkFfQ01JQ19CQVNFCUlPX0FERFJFU1MoSU5URUdSQVRPUl9IRFJfQkFTRSkgKyBJTlRFR1JBVE9SX0hEUl9JQ19PRkZTRVQKKworLyoKKyAqIExvZ2ljYWwgICAgICBQaHlzaWNhbAorICogZTgwMDAwMDAJNDAwMDAwMDAJUENJIG1lbW9yeQkJUEhZU19QQ0lfTUVNX0JBU0UJKG1heCA1MTJNKQorICogZWMwMDAwMDAJNjEwMDAwMDAJUENJIGNvbmZpZyBzcGFjZQlQSFlTX1BDSV9DT05GSUdfQkFTRQkobWF4IDE2TSkKKyAqIGVkMDAwMDAwCTYyMDAwMDAwCVBDSSBWMyByZWdzCQlQSFlTX1BDSV9WM19CQVNFCShtYXggNjRrKQorICogZWUwMDAwMDAJNjAwMDAwMDAJUENJIElPCQkJUEhZU19QQ0lfSU9fQkFTRQkobWF4IDE2TSkKKyAqIGVmMDAwMDAwCQkJQ2FjaGUgZmx1c2gKKyAqIGYxMDAwMDAwCTEwMDAwMDAwCUNvcmUgbW9kdWxlIHJlZ2lzdGVycworICogZjExMDAwMDAJMTEwMDAwMDAJU3lzdGVtIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisgKiBmMTIwMDAwMAkxMjAwMDAwMAlFQkkgcmVnaXN0ZXJzCisgKiBmMTMwMDAwMAkxMzAwMDAwMAlDb3VudGVyL1RpbWVyCisgKiBmMTQwMDAwMAkxNDAwMDAwMAlJbnRlcnJ1cHQgY29udHJvbGxlcgorICogZjE2MDAwMDAJMTYwMDAwMDAJVUFSVCAwCisgKiBmMTcwMDAwMAkxNzAwMDAwMAlVQVJUIDEKKyAqIGYxYTAwMDAwCTFhMDAwMDAwCURlYnVnIExFRHMKKyAqIGYxYjAwMDAwCTFiMDAwMDAwCUdQSU8KKyAqLworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGFwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgSU9fQUREUkVTUyhJTlRFR1JBVE9SX0hEUl9CQVNFKSwgICBJTlRFR1JBVE9SX0hEUl9CQVNFLCAgIFNaXzRLLCAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKElOVEVHUkFUT1JfU0NfQkFTRSksICAgIElOVEVHUkFUT1JfU0NfQkFTRSwgICAgU1pfNEssICBNVF9ERVZJQ0UgfSwKKyB7IElPX0FERFJFU1MoSU5URUdSQVRPUl9FQklfQkFTRSksICAgSU5URUdSQVRPUl9FQklfQkFTRSwgICBTWl80SywgIE1UX0RFVklDRSB9LAorIHsgSU9fQUREUkVTUyhJTlRFR1JBVE9SX0NUX0JBU0UpLCAgICBJTlRFR1JBVE9SX0NUX0JBU0UsICAgIFNaXzRLLCAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKElOVEVHUkFUT1JfSUNfQkFTRSksICAgIElOVEVHUkFUT1JfSUNfQkFTRSwgICAgU1pfNEssICBNVF9ERVZJQ0UgfSwKKyB7IElPX0FERFJFU1MoSU5URUdSQVRPUl9VQVJUMF9CQVNFKSwgSU5URUdSQVRPUl9VQVJUMF9CQVNFLCBTWl80SywgIE1UX0RFVklDRSB9LAorIHsgSU9fQUREUkVTUyhJTlRFR1JBVE9SX1VBUlQxX0JBU0UpLCBJTlRFR1JBVE9SX1VBUlQxX0JBU0UsIFNaXzRLLCAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKElOVEVHUkFUT1JfREJHX0JBU0UpLCAgIElOVEVHUkFUT1JfREJHX0JBU0UsICAgU1pfNEssICBNVF9ERVZJQ0UgfSwKKyB7IElPX0FERFJFU1MoSU5URUdSQVRPUl9HUElPX0JBU0UpLCAgSU5URUdSQVRPUl9HUElPX0JBU0UsICBTWl80SywgIE1UX0RFVklDRSB9LAorIHsgUENJX01FTU9SWV9WQUREUiwgICAgICAgICAgICAgICAgICBQSFlTX1BDSV9NRU1fQkFTRSwgICAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisgeyBQQ0lfQ09ORklHX1ZBRERSLCAgICAgICAgICAgICAgICAgIFBIWVNfUENJX0NPTkZJR19CQVNFLCAgU1pfMTZNLCBNVF9ERVZJQ0UgfSwKKyB7IFBDSV9WM19WQUREUiwgICAgICAgICAgICAgICAgICAgICAgUEhZU19QQ0lfVjNfQkFTRSwgICAgICBTWl82NEssIE1UX0RFVklDRSB9LAorIHsgUENJX0lPX1ZBRERSLCAgICAgICAgICAgICAgICAgICAgICBQSFlTX1BDSV9JT19CQVNFLCAgICAgIFNaXzY0SywgTVRfREVWSUNFIH0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQoYXBfaW9fZGVzYywgQVJSQVlfU0laRShhcF9pb19kZXNjKSk7Cit9CisKKyNkZWZpbmUgSU5URUdSQVRPUl9TQ19WQUxJRF9JTlQJMHgwMDNmZmZmZgorCitzdGF0aWMgdm9pZCBzY19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXdyaXRlbCgxIDw8IGlycSwgVkFfSUNfQkFTRSArIElSUV9FTkFCTEVfQ0xFQVIpOworfQorCitzdGF0aWMgdm9pZCBzY191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJd3JpdGVsKDEgPDwgaXJxLCBWQV9JQ19CQVNFICsgSVJRX0VOQUJMRV9TRVQpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgc2NfY2hpcCA9IHsKKwkuYWNrCT0gc2NfbWFza19pcnEsCisJLm1hc2sJPSBzY19tYXNrX2lycSwKKwkudW5tYXNrID0gc2NfdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcF9pbml0X2lycSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBpbml0aWFsbHkuICovCisJLyogRG8gdGhlIGNvcmUgbW9kdWxlIG9uZXMgKi8KKwl3cml0ZWwoLTEsIFZBX0NNSUNfQkFTRSArIElSUV9FTkFCTEVfQ0xFQVIpOworCisJLyogZG8gdGhlIGhlYWRlciBjYXJkIHN0dWZmIG5leHQgKi8KKwl3cml0ZWwoLTEsIFZBX0lDX0JBU0UgKyBJUlFfRU5BQkxFX0NMRUFSKTsKKwl3cml0ZWwoLTEsIFZBX0lDX0JBU0UgKyBGSVFfRU5BQkxFX0NMRUFSKTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJaWYgKCgoMSA8PCBpKSAmIElOVEVHUkFUT1JfU0NfVkFMSURfSU5UKSAhPSAwKSB7CisJCQlzZXRfaXJxX2NoaXAoaSwgJnNjX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGksIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwkJfQorCX0KK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaWNfaXJxX2VuYWJsZTsKKworc3RhdGljIGludCBpcnFfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJaWNfaXJxX2VuYWJsZSA9IHJlYWRsKFZBX0lDX0JBU0UgKyBJUlFfRU5BQkxFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcnFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJLyogZGlzYWJsZSBhbGwgaXJxIHNvdXJjZXMgKi8KKwl3cml0ZWwoLTEsIFZBX0NNSUNfQkFTRSArIElSUV9FTkFCTEVfQ0xFQVIpOworCXdyaXRlbCgtMSwgVkFfSUNfQkFTRSArIElSUV9FTkFCTEVfQ0xFQVIpOworCXdyaXRlbCgtMSwgVkFfSUNfQkFTRSArIEZJUV9FTkFCTEVfQ0xFQVIpOworCisJd3JpdGVsKGljX2lycV9lbmFibGUsIFZBX0lDX0JBU0UgKyBJUlFfRU5BQkxFX1NFVCk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBpcnFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGlycV9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGlycV9jbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJpcnEiKSwKKwkuc3VzcGVuZAk9IGlycV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaXJxX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBpcnFfZGV2aWNlID0geworCS5pZAk9IDAsCisJLmNscwk9ICZpcnFfY2xhc3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcnFfaW5pdF9zeXNmcyh2b2lkKQoreworCWludCByZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmlycV9jbGFzcyk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJmlycV9kZXZpY2UpOworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChpcnFfaW5pdF9zeXNmcyk7CisKKy8qCisgKiBGbGFzaCBoYW5kbGluZy4KKyAqLworI2RlZmluZSBTQ19DVFJMQyAoVkFfU0NfQkFTRSArIElOVEVHUkFUT1JfU0NfQ1RSTENfT0ZGU0VUKQorI2RlZmluZSBTQ19DVFJMUyAoVkFfU0NfQkFTRSArIElOVEVHUkFUT1JfU0NfQ1RSTFNfT0ZGU0VUKQorI2RlZmluZSBFQklfQ1NSMSAoVkFfRUJJX0JBU0UgKyBJTlRFR1JBVE9SX0VCSV9DU1IxX09GRlNFVCkKKyNkZWZpbmUgRUJJX0xPQ0sgKFZBX0VCSV9CQVNFICsgSU5URUdSQVRPUl9FQklfTE9DS19PRkZTRVQpCisKK3N0YXRpYyBpbnQgYXBfZmxhc2hfaW5pdCh2b2lkKQoreworCXUzMiB0bXA7CisKKwl3cml0ZWwoSU5URUdSQVRPUl9TQ19DVFJMX25GTFZQUEVOIHwgSU5URUdSQVRPUl9TQ19DVFJMX25GTFdQLCBTQ19DVFJMQyk7CisKKwl0bXAgPSByZWFkbChFQklfQ1NSMSkgfCBJTlRFR1JBVE9SX0VCSV9XUklURV9FTkFCTEU7CisJd3JpdGVsKHRtcCwgRUJJX0NTUjEpOworCisJaWYgKCEocmVhZGwoRUJJX0NTUjEpICYgSU5URUdSQVRPUl9FQklfV1JJVEVfRU5BQkxFKSkgeworCQl3cml0ZWwoMHhhMDVmLCBFQklfTE9DSyk7CisJCXdyaXRlbCh0bXAsIEVCSV9DU1IxKTsKKwkJd3JpdGVsKDAsIEVCSV9MT0NLKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwX2ZsYXNoX2V4aXQodm9pZCkKK3sKKwl1MzIgdG1wOworCisJd3JpdGVsKElOVEVHUkFUT1JfU0NfQ1RSTF9uRkxWUFBFTiB8IElOVEVHUkFUT1JfU0NfQ1RSTF9uRkxXUCwgU0NfQ1RSTEMpOworCisJdG1wID0gcmVhZGwoRUJJX0NTUjEpICYgfklOVEVHUkFUT1JfRUJJX1dSSVRFX0VOQUJMRTsKKwl3cml0ZWwodG1wLCBFQklfQ1NSMSk7CisKKwlpZiAocmVhZGwoRUJJX0NTUjEpICYgSU5URUdSQVRPUl9FQklfV1JJVEVfRU5BQkxFKSB7CisJCXdyaXRlbCgweGEwNWYsIEVCSV9MT0NLKTsKKwkJd3JpdGVsKHRtcCwgRUJJX0NTUjEpOworCQl3cml0ZWwoMCwgRUJJX0xPQ0spOworCX0KK30KKworc3RhdGljIHZvaWQgYXBfZmxhc2hfc2V0X3ZwcChpbnQgb24pCit7CisJdW5zaWduZWQgbG9uZyByZWcgPSBvbiA/IFNDX0NUUkxTIDogU0NfQ1RSTEM7CisKKwl3cml0ZWwoSU5URUdSQVRPUl9TQ19DVFJMX25GTFZQUEVOLCByZWcpOworfQorCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgYXBfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkud2lkdGgJCT0gNCwKKwkuaW5pdAkJPSBhcF9mbGFzaF9pbml0LAorCS5leGl0CQk9IGFwX2ZsYXNoX2V4aXQsCisJLnNldF92cHAJPSBhcF9mbGFzaF9zZXRfdnBwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjZmlfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IElOVEVHUkFUT1JfRkxBU0hfQkFTRSwKKwkuZW5kCQk9IElOVEVHUkFUT1JfRkxBU0hfQkFTRSArIElOVEVHUkFUT1JfRkxBU0hfU0laRSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2ZpX2ZsYXNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXJtZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZhcF9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZjZmlfZmxhc2hfcmVzb3VyY2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXBfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2NfZGVjOworCWludCBpOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjZmlfZmxhc2hfZGV2aWNlKTsKKworCXNjX2RlYyA9IHJlYWRsKFZBX1NDX0JBU0UgKyBJTlRFR1JBVE9SX1NDX0RFQ19PRkZTRVQpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IGxtX2RldmljZSAqbG1kZXY7CisKKwkJaWYgKChzY19kZWMgJiAoMTYgPDwgaSkpID09IDApCisJCQljb250aW51ZTsKKworCQlsbWRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFsbWRldikKKwkJCWNvbnRpbnVlOworCisJCW1lbXNldChsbWRldiwgMCwgc2l6ZW9mKHN0cnVjdCBsbV9kZXZpY2UpKTsKKworCQlsbWRldi0+cmVzb3VyY2Uuc3RhcnQgPSAweGMwMDAwMDAwICsgMHgxMDAwMDAwMCAqIGk7CisJCWxtZGV2LT5yZXNvdXJjZS5lbmQgPSBsbWRldi0+cmVzb3VyY2Uuc3RhcnQgKyAweDBmZmZmZmZmOworCQlsbWRldi0+cmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJbG1kZXYtPmlycSA9IElSUV9BUF9FWFBJTlQwICsgaTsKKwkJbG1kZXYtPmlkID0gaTsKKworCQlsbV9kZXZpY2VfcmVnaXN0ZXIobG1kZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGFwX2luaXRfdGltZXIodm9pZCkKK3sKKwlpbnRlZ3JhdG9yX3RpbWVfaW5pdCgxMDAwMDAwICogVElDS1NfUEVSX3VTRUMgLyBIWiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGFwX3RpbWVyID0geworCS5pbml0CQk9IGFwX2luaXRfdGltZXIsCisJLm9mZnNldAkJPSBpbnRlZ3JhdG9yX2dldHRpbWVvZmZzZXQsCit9OworCitNQUNISU5FX1NUQVJUKElOVEVHUkFUT1IsICJBUk0tSW50ZWdyYXRvciIpCisJTUFJTlRBSU5FUigiQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHgxNjAwMDAwMCwgMHhmMTYwMDAwMCkKKwlCT09UX1BBUkFNUygweDAwMDAwMTAwKQorCU1BUElPKGFwX21hcF9pbykKKwlJTklUSVJRKGFwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmYXBfdGltZXIsCisJSU5JVF9NQUNISU5FKGFwX2luaXQpCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMTVjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhX2ttaS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhX2NsY2QuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDUyNS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvY20uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9sbS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKworI2RlZmluZSBJTlRDUF9QQV9NTUNfQkFTRQkJMHgxYzAwMDAwMAorI2RlZmluZSBJTlRDUF9QQV9BQUNJX0JBU0UJCTB4MWQwMDAwMDAKKworI2RlZmluZSBJTlRDUF9QQV9GTEFTSF9CQVNFCQkweDI0MDAwMDAwCisjZGVmaW5lIElOVENQX0ZMQVNIX1NJWkUJCVNaXzMyTQorCisjZGVmaW5lIElOVENQX1BBX0NMQ0RfQkFTRQkJMHhjMDAwMDAwMAorCisjZGVmaW5lIElOVENQX1ZBX0NJQ19CQVNFCQkweGYxMDAwMDQwCisjZGVmaW5lIElOVENQX1ZBX1BJQ19CQVNFCQkweGYxNDAwMDAwCisjZGVmaW5lIElOVENQX1ZBX1NJQ19CQVNFCQkweGZjYTAwMDAwCisKKyNkZWZpbmUgSU5UQ1BfUEFfRVRIX0JBU0UJCTB4YzgwMDAwMDAKKyNkZWZpbmUgSU5UQ1BfRVRIX1NJWkUJCQkweDEwCisKKyNkZWZpbmUgSU5UQ1BfVkFfQ1RSTF9CQVNFCQkweGZjYjAwMDAwCisjZGVmaW5lIElOVENQX0ZMQVNIUFJPRwkJCTB4MDQKKyNkZWZpbmUgQ0lOVEVHUkFUT1JfRkxBU0hQUk9HX0ZMVlBQRU4JKDEgPDwgMCkKKyNkZWZpbmUgQ0lOVEVHUkFUT1JfRkxBU0hQUk9HX0ZMV1JFTgkoMSA8PCAxKQorCisvKgorICogTG9naWNhbCAgICAgIFBoeXNpY2FsCisgKiBmMTAwMDAwMAkxMDAwMDAwMAlDb3JlIG1vZHVsZSByZWdpc3RlcnMKKyAqIGYxMTAwMDAwCTExMDAwMDAwCVN5c3RlbSBjb250cm9sbGVyIHJlZ2lzdGVycworICogZjEyMDAwMDAJMTIwMDAwMDAJRUJJIHJlZ2lzdGVycworICogZjEzMDAwMDAJMTMwMDAwMDAJQ291bnRlci9UaW1lcgorICogZjE0MDAwMDAJMTQwMDAwMDAJSW50ZXJydXB0IGNvbnRyb2xsZXIKKyAqIGYxNjAwMDAwCTE2MDAwMDAwCVVBUlQgMAorICogZjE3MDAwMDAJMTcwMDAwMDAJVUFSVCAxCisgKiBmMWEwMDAwMAkxYTAwMDAwMAlEZWJ1ZyBMRURzCisgKiBmMWIwMDAwMAkxYjAwMDAwMAlHUElPCisgKi8KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbnRjcF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IElPX0FERFJFU1MoSU5URUdSQVRPUl9IRFJfQkFTRSksICAgSU5URUdSQVRPUl9IRFJfQkFTRSwgICBTWl80SywgIE1UX0RFVklDRSB9LAorIHsgSU9fQUREUkVTUyhJTlRFR1JBVE9SX1NDX0JBU0UpLCAgICBJTlRFR1JBVE9SX1NDX0JBU0UsICAgIFNaXzRLLCAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKElOVEVHUkFUT1JfRUJJX0JBU0UpLCAgIElOVEVHUkFUT1JfRUJJX0JBU0UsICAgU1pfNEssICBNVF9ERVZJQ0UgfSwKKyB7IElPX0FERFJFU1MoSU5URUdSQVRPUl9DVF9CQVNFKSwgICAgSU5URUdSQVRPUl9DVF9CQVNFLCAgICBTWl80SywgIE1UX0RFVklDRSB9LAorIHsgSU9fQUREUkVTUyhJTlRFR1JBVE9SX0lDX0JBU0UpLCAgICBJTlRFR1JBVE9SX0lDX0JBU0UsICAgIFNaXzRLLCAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKElOVEVHUkFUT1JfVUFSVDBfQkFTRSksIElOVEVHUkFUT1JfVUFSVDBfQkFTRSwgU1pfNEssICBNVF9ERVZJQ0UgfSwKKyB7IElPX0FERFJFU1MoSU5URUdSQVRPUl9VQVJUMV9CQVNFKSwgSU5URUdSQVRPUl9VQVJUMV9CQVNFLCBTWl80SywgIE1UX0RFVklDRSB9LAorIHsgSU9fQUREUkVTUyhJTlRFR1JBVE9SX0RCR19CQVNFKSwgICBJTlRFR1JBVE9SX0RCR19CQVNFLCAgIFNaXzRLLCAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKElOVEVHUkFUT1JfR1BJT19CQVNFKSwgIElOVEVHUkFUT1JfR1BJT19CQVNFLCAgU1pfNEssICBNVF9ERVZJQ0UgfSwKKyB7IDB4ZmM5MDAwMDAsIDB4YzkwMDAwMDAsIFNaXzRLLCBNVF9ERVZJQ0UgfSwKKyB7IDB4ZmNhMDAwMDAsIDB4Y2EwMDAwMDAsIFNaXzRLLCBNVF9ERVZJQ0UgfSwKKyB7IDB4ZmNiMDAwMDAsIDB4Y2IwMDAwMDAsIFNaXzRLLCBNVF9ERVZJQ0UgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbnRjcF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQoaW50Y3BfaW9fZGVzYywgQVJSQVlfU0laRShpbnRjcF9pb19kZXNjKSk7Cit9CisKKyNkZWZpbmUgY2ljX3dyaXRlbAlfX3Jhd193cml0ZWwKKyNkZWZpbmUgY2ljX3JlYWRsCV9fcmF3X3JlYWRsCisjZGVmaW5lIHBpY193cml0ZWwJX19yYXdfd3JpdGVsCisjZGVmaW5lIHBpY19yZWFkbAlfX3Jhd19yZWFkbAorI2RlZmluZSBzaWNfd3JpdGVsCV9fcmF3X3dyaXRlbAorI2RlZmluZSBzaWNfcmVhZGwJX19yYXdfcmVhZGwKKworc3RhdGljIHZvaWQgY2ljX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxIC09IElSUV9DSUNfU1RBUlQ7CisJY2ljX3dyaXRlbCgxIDw8IGlycSwgSU5UQ1BfVkFfQ0lDX0JBU0UgKyBJUlFfRU5BQkxFX0NMRUFSKTsKK30KKworc3RhdGljIHZvaWQgY2ljX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnEgLT0gSVJRX0NJQ19TVEFSVDsKKwljaWNfd3JpdGVsKDEgPDwgaXJxLCBJTlRDUF9WQV9DSUNfQkFTRSArIElSUV9FTkFCTEVfU0VUKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGNpY19jaGlwID0geworCS5hY2sJPSBjaWNfbWFza19pcnEsCisJLm1hc2sJPSBjaWNfbWFza19pcnEsCisJLnVubWFzawk9IGNpY191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHZvaWQgcGljX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxIC09IElSUV9QSUNfU1RBUlQ7CisJcGljX3dyaXRlbCgxIDw8IGlycSwgSU5UQ1BfVkFfUElDX0JBU0UgKyBJUlFfRU5BQkxFX0NMRUFSKTsKK30KKworc3RhdGljIHZvaWQgcGljX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnEgLT0gSVJRX1BJQ19TVEFSVDsKKwlwaWNfd3JpdGVsKDEgPDwgaXJxLCBJTlRDUF9WQV9QSUNfQkFTRSArIElSUV9FTkFCTEVfU0VUKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHBpY19jaGlwID0geworCS5hY2sJPSBwaWNfbWFza19pcnEsCisJLm1hc2sJPSBwaWNfbWFza19pcnEsCisJLnVubWFzayA9IHBpY191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHZvaWQgc2ljX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxIC09IElSUV9TSUNfU1RBUlQ7CisJc2ljX3dyaXRlbCgxIDw8IGlycSwgSU5UQ1BfVkFfU0lDX0JBU0UgKyBJUlFfRU5BQkxFX0NMRUFSKTsKK30KKworc3RhdGljIHZvaWQgc2ljX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnEgLT0gSVJRX1NJQ19TVEFSVDsKKwlzaWNfd3JpdGVsKDEgPDwgaXJxLCBJTlRDUF9WQV9TSUNfQkFTRSArIElSUV9FTkFCTEVfU0VUKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHNpY19jaGlwID0geworCS5hY2sJPSBzaWNfbWFza19pcnEsCisJLm1hc2sJPSBzaWNfbWFza19pcnEsCisJLnVubWFzawk9IHNpY191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHZvaWQKK3NpY19oYW5kbGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IHNpY19yZWFkbChJTlRDUF9WQV9TSUNfQkFTRSArIElSUV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWRvX2JhZF9JUlEoaXJxLCBkZXNjLCByZWdzKTsKKwkJcmV0dXJuOworCX0KKworCWRvIHsKKwkJaXJxID0gZmZzKHN0YXR1cykgLSAxOworCQlzdGF0dXMgJj0gfigxIDw8IGlycSk7CisKKwkJaXJxICs9IElSUV9TSUNfU1RBUlQ7CisKKwkJZGVzYyA9IGlycV9kZXNjICsgaXJxOworCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwl9IHdoaWxlIChzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW50Y3BfaW5pdF9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qCisJICogRGlzYWJsZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMKKwkgKi8KKwlwaWNfd3JpdGVsKDB4ZmZmZmZmZmYsIElOVENQX1ZBX1BJQ19CQVNFICsgSVJRX0VOQUJMRV9DTEVBUik7CisJcGljX3dyaXRlbCgweGZmZmZmZmZmLCBJTlRDUF9WQV9QSUNfQkFTRSArIEZJUV9FTkFCTEVfQ0xFQVIpOworCisJZm9yIChpID0gSVJRX1BJQ19TVEFSVDsgaSA8PSBJUlFfUElDX0VORDsgaSsrKSB7CisJCWlmIChpID09IDExKQorCQkJaSA9IDIyOworCQlpZiAoaSA9PSBJUlFfQ1BfQ1BQTERJTlQpCisJCQlpKys7CisJCWlmIChpID09IDI5KQorCQkJYnJlYWs7CisJCXNldF9pcnFfY2hpcChpLCAmcGljX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJY2ljX3dyaXRlbCgweGZmZmZmZmZmLCBJTlRDUF9WQV9DSUNfQkFTRSArIElSUV9FTkFCTEVfQ0xFQVIpOworCWNpY193cml0ZWwoMHhmZmZmZmZmZiwgSU5UQ1BfVkFfQ0lDX0JBU0UgKyBGSVFfRU5BQkxFX0NMRUFSKTsKKworCWZvciAoaSA9IElSUV9DSUNfU1RBUlQ7IGkgPD0gSVJRX0NJQ19FTkQ7IGkrKykgeworCQlzZXRfaXJxX2NoaXAoaSwgJmNpY19jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7CisJfQorCisJc2ljX3dyaXRlbCgweDAwMDAwZmZmLCBJTlRDUF9WQV9TSUNfQkFTRSArIElSUV9FTkFCTEVfQ0xFQVIpOworCXNpY193cml0ZWwoMHgwMDAwMGZmZiwgSU5UQ1BfVkFfU0lDX0JBU0UgKyBGSVFfRU5BQkxFX0NMRUFSKTsKKworCWZvciAoaSA9IElSUV9TSUNfU1RBUlQ7IGkgPD0gSVJRX1NJQ19FTkQ7IGkrKykgeworCQlzZXRfaXJxX2NoaXAoaSwgJnNpY19jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KKworCXNldF9pcnFfaGFuZGxlcihJUlFfQ1BfQ1BQTERJTlQsIHNpY19oYW5kbGVfaXJxKTsKKwlwaWNfdW5tYXNrX2lycShJUlFfQ1BfQ1BQTERJTlQpOworfQorCisvKgorICogQ2xvY2sgaGFuZGxpbmcKKyAqLworI2RlZmluZSBDTV9MT0NLIChJT19BRERSRVNTKElOVEVHUkFUT1JfSERSX0JBU0UpK0lOVEVHUkFUT1JfSERSX0xPQ0tfT0ZGU0VUKQorI2RlZmluZSBDTV9BVVhPU0MgKElPX0FERFJFU1MoSU5URUdSQVRPUl9IRFJfQkFTRSkrMHgxYykKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpY3N0NTI1X3BhcmFtcyBjcF9hdXh2Y29fcGFyYW1zID0geworCS5yZWYJCT0gMjQwMDAsCisJLnZjb19tYXgJPSAzMjAwMDAsCisJLnZkX21pbiAJPSA4LAorCS52ZF9tYXggCT0gMjYzLAorCS5yZF9taW4gCT0gMywKKwkucmRfbWF4IAk9IDY1LAorfTsKKworc3RhdGljIHZvaWQgY3BfYXV4dmNvX3NldChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBpY3N0NTI1X3ZjbyB2Y28pCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKENNX0FVWE9TQykgJiB+MHg3ZmZmZjsKKwl2YWwgfD0gdmNvLnYgfCAodmNvLnIgPDwgOSkgfCAodmNvLnMgPDwgMTYpOworCisJd3JpdGVsKDB4YTA1ZiwgQ01fTE9DSyk7CisJd3JpdGVsKHZhbCwgQ01fQVVYT1NDKTsKKwl3cml0ZWwoMCwgQ01fTE9DSyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNwX2NsY2RfY2xrID0geworCS5uYW1lCT0gIkNMQ0RDTEsiLAorCS5wYXJhbXMJPSAmY3BfYXV4dmNvX3BhcmFtcywKKwkuc2V0dmNvID0gY3BfYXV4dmNvX3NldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNwX21tY2lfY2xrID0geworCS5uYW1lCT0gIk1DTEsiLAorCS5yYXRlCT0gMTQ3NDU2MDAsCit9OworCisvKgorICogRmxhc2ggaGFuZGxpbmcuCisgKi8KK3N0YXRpYyBpbnQgaW50Y3BfZmxhc2hfaW5pdCh2b2lkKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChJTlRDUF9WQV9DVFJMX0JBU0UgKyBJTlRDUF9GTEFTSFBST0cpOworCXZhbCB8PSBDSU5URUdSQVRPUl9GTEFTSFBST0dfRkxXUkVOOworCXdyaXRlbCh2YWwsIElOVENQX1ZBX0NUUkxfQkFTRSArIElOVENQX0ZMQVNIUFJPRyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50Y3BfZmxhc2hfZXhpdCh2b2lkKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChJTlRDUF9WQV9DVFJMX0JBU0UgKyBJTlRDUF9GTEFTSFBST0cpOworCXZhbCAmPSB+KENJTlRFR1JBVE9SX0ZMQVNIUFJPR19GTFZQUEVOfENJTlRFR1JBVE9SX0ZMQVNIUFJPR19GTFdSRU4pOworCXdyaXRlbCh2YWwsIElOVENQX1ZBX0NUUkxfQkFTRSArIElOVENQX0ZMQVNIUFJPRyk7Cit9CisKK3N0YXRpYyB2b2lkIGludGNwX2ZsYXNoX3NldF92cHAoaW50IG9uKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChJTlRDUF9WQV9DVFJMX0JBU0UgKyBJTlRDUF9GTEFTSFBST0cpOworCWlmIChvbikKKwkJdmFsIHw9IENJTlRFR1JBVE9SX0ZMQVNIUFJPR19GTFZQUEVOOworCWVsc2UKKwkJdmFsICY9IH5DSU5URUdSQVRPUl9GTEFTSFBST0dfRkxWUFBFTjsKKwl3cml0ZWwodmFsLCBJTlRDUF9WQV9DVFJMX0JBU0UgKyBJTlRDUF9GTEFTSFBST0cpOworfQorCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgaW50Y3BfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkud2lkdGgJCT0gNCwKKwkuaW5pdAkJPSBpbnRjcF9mbGFzaF9pbml0LAorCS5leGl0CQk9IGludGNwX2ZsYXNoX2V4aXQsCisJLnNldF92cHAJPSBpbnRjcF9mbGFzaF9zZXRfdnBwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbnRjcF9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gSU5UQ1BfUEFfRkxBU0hfQkFTRSwKKwkuZW5kCQk9IElOVENQX1BBX0ZMQVNIX0JBU0UgKyBJTlRDUF9GTEFTSF9TSVpFIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbnRjcF9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImFybWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmaW50Y3BfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmaW50Y3BfZmxhc2hfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IElOVENQX1BBX0VUSF9CQVNFLAorCQkuZW5kCT0gSU5UQ1BfUEFfRVRIX0JBU0UgKyBJTlRDUF9FVEhfU0laRSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfQ1BfRVRISU5ULAorCQkuZW5kCT0gSVJRX0NQX0VUSElOVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaW50Y3BfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJJmludGNwX2ZsYXNoX2RldmljZSwKKwkmc21jOTF4X2RldmljZSwKK307CisKKy8qCisgKiBJdCBzZWVtcyB0aGF0IHRoZSBjYXJkIGluc2VydGlvbiBpbnRlcnJ1cHQgcmVtYWlucyBhY3RpdmUgYWZ0ZXIKKyAqIHdlJ3ZlIGFja25vd2xlZGdlZCBpdC4gIFdlIHRoZXJlZm9yZSBpZ25vcmUgdGhlIGludGVycnVwdCwgYW5kCisgKiByZWx5IG9uIHJlYWRpbmcgaXQgZnJvbSB0aGUgU0lDLiAgVGhpcyBhbHNvIG1lYW5zIHRoYXQgd2UgbXVzdAorICogY2xlYXIgdGhlIGxhdGNoZWQgaW50ZXJydXB0LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1tY19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkbCgweGZjYTAwMDA0KTsKKwl3cml0ZWwoOCwgMHhmY2IwMDAwOCk7CisKKwlyZXR1cm4gc3RhdHVzICYgODsKK30KKworc3RhdGljIHN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSBtbWNfZGF0YSA9IHsKKwkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLnN0YXR1cwkJPSBtbWNfc3RhdHVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBtbWNfZGV2aWNlID0geworCS5kZXYJCT0geworCQkuYnVzX2lkCT0gIm1iOjFjIiwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmbW1jX2RhdGEsCisJfSwKKwkucmVzCQk9IHsKKwkJLnN0YXJ0CT0gSU5UQ1BfUEFfTU1DX0JBU0UsCisJCS5lbmQJPSBJTlRDUF9QQV9NTUNfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuaXJxCQk9IHsgSVJRX0NQX01NQ0lJTlQwLCBJUlFfQ1BfTU1DSUlOVDEgfSwKKwkucGVyaXBoaWQJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBhYWNpX2RldmljZSA9IHsKKwkuZGV2CQk9IHsKKwkJLmJ1c19pZAk9ICJtYjoxZCIsCisJfSwKKwkucmVzCQk9IHsKKwkJLnN0YXJ0CT0gSU5UQ1BfUEFfQUFDSV9CQVNFLAorCQkuZW5kCT0gSU5UQ1BfUEFfQUFDSV9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS5pcnEJCT0geyBJUlFfQ1BfQUFDSUlOVCwgTk9fSVJRIH0sCisJLnBlcmlwaGlkCT0gMCwKK307CisKKworLyoKKyAqIENMQ0Qgc3VwcG9ydAorICovCitzdGF0aWMgc3RydWN0IGNsY2RfcGFuZWwgdmdhID0geworCS5tb2RlCQk9IHsKKwkJLm5hbWUJCT0gIlZHQSIsCisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDY0MCwKKwkJLnlyZXMJCT0gNDgwLAorCQkucGl4Y2xvY2sJPSAzOTcyMSwKKwkJLmxlZnRfbWFyZ2luCT0gNDAsCisJCS5yaWdodF9tYXJnaW4JPSAyNCwKKwkJLnVwcGVyX21hcmdpbgk9IDMyLAorCQkubG93ZXJfbWFyZ2luCT0gMTEsCisJCS5oc3luY19sZW4JPSA5NiwKKwkJLnZzeW5jX2xlbgk9IDIsCisJCS5zeW5jCQk9IDAsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorCX0sCisJLndpZHRoCQk9IC0xLAorCS5oZWlnaHQJCT0gLTEsCisJLnRpbTIJCT0gVElNMl9CQ0QgfCBUSU0yX0lQQywKKwkuY250bAkJPSBDTlRMX0xDRFRGVCB8IENOVExfTENEVkNPTVAoMSksCisJLmJwcAkJPSAxNiwKKwkuZ3JheXNjYWxlCT0gMCwKK307CisKKy8qCisgKiBFbnN1cmUgVkdBIGlzIHNlbGVjdGVkLgorICovCitzdGF0aWMgdm9pZCBjcF9jbGNkX2VuYWJsZShzdHJ1Y3QgY2xjZF9mYiAqZmIpCit7CisJY21fY29udHJvbChDTV9DVFJMX0xDRE1VWFNFTF9NQVNLLCBDTV9DVFJMX0xDRE1VWFNFTF9WR0EpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmcmFtZXNpemUgPSBTWl8xTTsKKworc3RhdGljIGludCBjcF9jbGNkX3NldHVwKHN0cnVjdCBjbGNkX2ZiICpmYikKK3sKKwlkbWFfYWRkcl90IGRtYTsKKworCWZiLT5wYW5lbCA9ICZ2Z2E7CisKKwlmYi0+ZmIuc2NyZWVuX2Jhc2UgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKCZmYi0+ZGV2LT5kZXYsIGZyYW1lc2l6ZSwKKwkJCQkJCSAgICAmZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZiLT5mYi5zY3JlZW5fYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNMQ0Q6IHVuYWJsZSB0byBtYXAgZnJhbWVidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmYi0+ZmIuZml4LnNtZW1fc3RhcnQJPSBkbWE7CisJZmItPmZiLmZpeC5zbWVtX2xlbgk9IGZyYW1lc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwX2NsY2RfbW1hcChzdHJ1Y3QgY2xjZF9mYiAqZmIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiBkbWFfbW1hcF93cml0ZWNvbWJpbmUoJmZiLT5kZXYtPmRldiwgdm1hLAorCQkJCSAgICAgZmItPmZiLnNjcmVlbl9iYXNlLAorCQkJCSAgICAgZmItPmZiLmZpeC5zbWVtX3N0YXJ0LAorCQkJCSAgICAgZmItPmZiLmZpeC5zbWVtX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2NsY2RfcmVtb3ZlKHN0cnVjdCBjbGNkX2ZiICpmYikKK3sKKwlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJmZiLT5kZXYtPmRldiwgZmItPmZiLmZpeC5zbWVtX2xlbiwKKwkJCSAgICAgIGZiLT5mYi5zY3JlZW5fYmFzZSwgZmItPmZiLmZpeC5zbWVtX3N0YXJ0KTsKK30KKworc3RhdGljIHN0cnVjdCBjbGNkX2JvYXJkIGNsY2RfZGF0YSA9IHsKKwkubmFtZQkJPSAiSW50ZWdyYXRvci9DUCIsCisJLmNoZWNrCQk9IGNsY2RmYl9jaGVjaywKKwkuZGVjb2RlCQk9IGNsY2RmYl9kZWNvZGUsCisJLmVuYWJsZQkJPSBjcF9jbGNkX2VuYWJsZSwKKwkuc2V0dXAJCT0gY3BfY2xjZF9zZXR1cCwKKwkubW1hcAkJPSBjcF9jbGNkX21tYXAsCisJLnJlbW92ZQkJPSBjcF9jbGNkX3JlbW92ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgY2xjZF9kZXZpY2UgPSB7CisJLmRldgkJPSB7CisJCS5idXNfaWQJPSAibWI6YzAiLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmY2xjZF9kYXRhLAorCX0sCisJLnJlcwkJPSB7CisJCS5zdGFydAk9IElOVENQX1BBX0NMQ0RfQkFTRSwKKwkJLmVuZAk9IElOVENQX1BBX0NMQ0RfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuZG1hX21hc2sJPSB+MCwKKwkuaXJxCQk9IHsgSVJRX0NQX0NMQ0RDSU5ULCBOT19JUlEgfSwKKwkucGVyaXBoaWQJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkmbW1jX2RldmljZSwKKwkmYWFjaV9kZXZpY2UsCisJJmNsY2RfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGludGNwX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWNsa19yZWdpc3RlcigmY3BfY2xjZF9jbGspOworCWNsa19yZWdpc3RlcigmY3BfbW1jaV9jbGspOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoaW50Y3BfZGV2cywgQVJSQVlfU0laRShpbnRjcF9kZXZzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKKwkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOworCQlhbWJhX2RldmljZV9yZWdpc3RlcihkLCAmaW9tZW1fcmVzb3VyY2UpOworCX0KK30KKworI2RlZmluZSBUSU1FUl9DVFJMX0lFCSgxIDw8IDUpCQkJLyogSW50ZXJydXB0IEVuYWJsZSAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaW50Y3BfdGltZXJfaW5pdCh2b2lkKQoreworCWludGVncmF0b3JfdGltZV9pbml0KDEwMDAwMDAgLyBIWiwgVElNRVJfQ1RSTF9JRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGNwX3RpbWVyID0geworCS5pbml0CQk9IGludGNwX3RpbWVyX2luaXQsCisJLm9mZnNldAkJPSBpbnRlZ3JhdG9yX2dldHRpbWVvZmZzZXQsCit9OworCitNQUNISU5FX1NUQVJUKENJTlRFR1JBVE9SLCAiQVJNLUludGVncmF0b3JDUCIpCisJTUFJTlRBSU5FUigiQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHgxNjAwMDAwMCwgMHhmMTYwMDAwMCkKKwlCT09UX1BBUkFNUygweDAwMDAwMTAwKQorCU1BUElPKGludGNwX21hcF9pbykKKwlJTklUSVJRKGludGNwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmY3BfdGltZXIsCisJSU5JVF9NQUNISU5FKGludGNwX2luaXQpCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sZWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxODJiNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sZWRzLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvbGVkcy5jCisgKgorICogIEludGVncmF0b3IvQVAgYW5kIEludGVncmF0b3IvQ1AgTEVEIGNvbnRyb2wgcm91dGluZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IEFSTSBMaW1pdGVkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbS5oPgorCitzdGF0aWMgaW50IHNhdmVkX2xlZHM7CisKK3N0YXRpYyB2b2lkIGludGVncmF0b3JfbGVkc19ldmVudChsZWRfZXZlbnRfdCBsZWRldnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb25zdCB1bnNpZ25lZCBpbnQgZGJnX2Jhc2UgPSBJT19BRERSRVNTKElOVEVHUkFUT1JfREJHX0JBU0UpOworCXVuc2lnbmVkIGludCB1cGRhdGVfYWxwaGFfbGVkczsKKwkKKwkvLyB5dXAsIGNoYW5nZSB0aGUgTEVEcworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl1cGRhdGVfYWxwaGFfbGVkcyA9IDA7CisKKwlzd2l0Y2gobGVkZXZ0KSB7CisJY2FzZSBsZWRfaWRsZV9zdGFydDoKKwkJY21fY29udHJvbChDTV9DVFJMX0xFRCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBsZWRfaWRsZV9lbmQ6CisJCWNtX2NvbnRyb2woQ01fQ1RSTF9MRUQsIENNX0NUUkxfTEVEKTsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF90aW1lcjoKKwkJc2F2ZWRfbGVkcyBePSBHUkVFTl9MRUQ7CisJCXVwZGF0ZV9hbHBoYV9sZWRzID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWRfb246CisJCXNhdmVkX2xlZHMgfD0gUkVEX0xFRDsKKwkJdXBkYXRlX2FscGhhX2xlZHMgPSAxOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vZmY6CisJCXNhdmVkX2xlZHMgJj0gflJFRF9MRUQ7CisJCXVwZGF0ZV9hbHBoYV9sZWRzID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAodXBkYXRlX2FscGhhX2xlZHMpIHsKKwkJd2hpbGUgKF9fcmF3X3JlYWRsKGRiZ19iYXNlICsgSU5URUdSQVRPUl9EQkdfQUxQSEFfT0ZGU0VUKSAmIDEpOworCQlfX3Jhd193cml0ZWwoc2F2ZWRfbGVkcywgZGJnX2Jhc2UgKyBJTlRFR1JBVE9SX0RCR19MRURTX09GRlNFVCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbGVkc19pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfaW50ZWdyYXRvcigpIHx8IG1hY2hpbmVfaXNfY2ludGVncmF0b3IoKSkKKwkJbGVkc19ldmVudCA9IGludGVncmF0b3JfbGVkc19ldmVudDsKKworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKGxlZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvbG0uYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjE5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvbG0uYwpAQCAtMCwwICsxLDk2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sbS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZCwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbG0uaD4KKworI2RlZmluZSB0b19sbV9kZXZpY2UoZCkJY29udGFpbmVyX29mKGQsIHN0cnVjdCBsbV9kZXZpY2UsIGRldikKKyNkZWZpbmUgdG9fbG1fZHJpdmVyKGQpCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgbG1fZHJpdmVyLCBkcnYpCisKK3N0YXRpYyBpbnQgbG1fbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIGxtX2J1c3R5cGUgPSB7CisJLm5hbWUJCT0gImxvZ2ljbW9kdWxlIiwKKwkubWF0Y2gJCT0gbG1fbWF0Y2gsCisvLwkuc3VzcGVuZAk9IGxtX3N1c3BlbmQsCisvLwkucmVzdW1lCQk9IGxtX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZsbV9idXN0eXBlKTsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwobG1faW5pdCk7CisKK3N0YXRpYyBpbnQgbG1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbWRldiA9IHRvX2xtX2RldmljZShkZXYpOworCXN0cnVjdCBsbV9kcml2ZXIgKmxtZHJ2ID0gdG9fbG1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCXJldHVybiBsbWRydi0+cHJvYmUobG1kZXYpOworfQorCitzdGF0aWMgaW50IGxtX2J1c19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBsbV9kZXZpY2UgKmxtZGV2ID0gdG9fbG1fZGV2aWNlKGRldik7CisJc3RydWN0IGxtX2RyaXZlciAqbG1kcnYgPSB0b19sbV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJbG1kcnYtPnJlbW92ZShsbWRldik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGxtX2RyaXZlciAqZHJ2KQoreworCWRydi0+ZHJ2LmJ1cyA9ICZsbV9idXN0eXBlOworCWRydi0+ZHJ2LnByb2JlID0gbG1fYnVzX3Byb2JlOworCWRydi0+ZHJ2LnJlbW92ZSA9IGxtX2J1c19yZW1vdmU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRydik7Cit9CisKK3ZvaWQgbG1fZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGxtX2RyaXZlciAqZHJ2KQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRydik7Cit9CisKK3N0YXRpYyB2b2lkIGxtX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbG1fZGV2aWNlICpkID0gdG9fbG1fZGV2aWNlKGRldik7CisKKwlrZnJlZShkKTsKK30KKworaW50IGxtX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgbG1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWRldi0+ZGV2LnJlbGVhc2UgPSBsbV9kZXZpY2VfcmVsZWFzZTsKKwlkZXYtPmRldi5idXMgPSAmbG1fYnVzdHlwZTsKKworCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2LmJ1c19pZCksICJsbSVkIiwgZGV2LT5pZCk7CisJZGV2LT5yZXNvdXJjZS5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOworCisJcmV0ID0gcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZkZXYtPnJlc291cmNlKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmRldik7CisJCWlmIChyZXQpCisJCQlyZWxlYXNlX3Jlc291cmNlKCZkZXYtPnJlc291cmNlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChsbV9kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChsbV9kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0ZWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLWludGVncmF0b3IuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgQVJNIExpbWl0ZWQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICoKKyAqICBQQ0kgZnVuY3Rpb25zIGZvciBJbnRlZ3JhdG9yCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8qIAorICogQSBzbWFsbCBub3RlIGFib3V0IGJyaWRnZXMgYW5kIGludGVycnVwdHMuICBUaGUgREVDY2hpcCAyMTA1MCAoYW5kCisgKiBsYXRlcikgYWRoZXJlcyB0byB0aGUgUENJLVBDSSBicmlkZ2Ugc3BlY2lmaWNhdGlvbi4gIFRoaXMgc2F5cyB0aGF0CisgKiB0aGUgaW50ZXJydXB0cyBvbiB0aGUgb3RoZXIgc2lkZSBvZiBhIGJyaWRnZSBhcmUgc3dpenpsZWQgaW4gdGhlCisgKiBmb2xsb3dpbmcgbWFubmVyOgorICoKKyAqIERldiAgICBJbnRlcnJ1cHQgICBJbnRlcnJ1cHQgCisgKiAgICAgICAgUGluIG9uICAgICAgUGluIG9uIAorICogICAgICAgIERldmljZSAgICAgIENvbm5lY3RvcgorICoKKyAqICAgNCAgICBBICAgICAgICAgICBBCisgKiAgICAgICAgQiAgICAgICAgICAgQgorICogICAgICAgIEMgICAgICAgICAgIEMKKyAqICAgICAgICBEICAgICAgICAgICBECisgKiAKKyAqICAgNSAgICBBICAgICAgICAgICBCCisgKiAgICAgICAgQiAgICAgICAgICAgQworICogICAgICAgIEMgICAgICAgICAgIEQKKyAqICAgICAgICBEICAgICAgICAgICBBCisgKgorICogICA2ICAgIEEgICAgICAgICAgIEMKKyAqICAgICAgICBCICAgICAgICAgICBECisgKiAgICAgICAgQyAgICAgICAgICAgQQorICogICAgICAgIEQgICAgICAgICAgIEIKKyAqCisgKiAgIDcgICAgQSAgICAgICAgICAgRAorICogICAgICAgIEIgICAgICAgICAgIEEKKyAqICAgICAgICBDICAgICAgICAgICBCCisgKiAgICAgICAgRCAgICAgICAgICAgQworICoKKyAqIFdoZXJlIEEgPSBwaW4gMSwgQiA9IHBpbiAyIGFuZCBzbyBvbiBhbmQgcGluPTAgPSBkZWZhdWx0ID0gQS4KKyAqIFRodXMsIGVhY2ggc3dpenpsZSBpcyAoKHBpbi0xKSArIChkZXZpY2UjLTQpKSAlIDQKKyAqCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgc3dpenpsZXMgZm9yIGV4YWN0bHkgb25lIGJyaWRnZS4gIAorICovCitzdGF0aWMgaW5saW5lIGludCBicmlkZ2Vfc3dpenpsZShpbnQgcGluLCB1bnNpZ25lZCBpbnQgc2xvdCkgCit7CisJcmV0dXJuIChwaW4gKyBzbG90KSAmIDM7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBtdWx0aXBsZSBicmlkZ2VzLgorICovCitzdGF0aWMgdTggX19pbml0IGludGVncmF0b3Jfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKK3sKKwlpbnQgcGluID0gKnBpbnA7CisKKwlpZiAocGluID09IDApCisJCXBpbiA9IDE7CisKKwlwaW4gLT0gMTsKKwl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKKwkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSk7CisJCS8qCisJCSAqIG1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMsIHN3aXp6bGluZyBhcyB3ZSBnby4KKwkJICovCisJCWRldiA9IGRldi0+YnVzLT5zZWxmOworCX0KKwkqcGlucCA9IHBpbiArIDE7CisKKwlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Cit9CisKK3N0YXRpYyBpbnQgaXJxX3RhYls0XSBfX2luaXRkYXRhID0geworCUlSUV9BUF9QQ0lJTlQwLAlJUlFfQVBfUENJSU5UMSwJSVJRX0FQX1BDSUlOVDIsCUlSUV9BUF9QQ0lJTlQzCit9OworCisvKgorICogbWFwIHRoZSBzcGVjaWZpZWQgZGV2aWNlL3Nsb3QvcGluIHRvIGFuIElSUS4gIFRoaXMgd29ya3Mgb3V0IHN1Y2gKKyAqIHRoYXQgc2xvdCA5IHBpbiAxIGlzIElOVDAsIHBpbiAyIGlzIElOVDEsIGFuZCBzbG90IDEwIHBpbiAxIGlzIElOVDEuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGludGVncmF0b3JfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaW50IGludG5yID0gKChzbG90IC0gOSkgKyAocGluIC0gMSkpICYgMzsKKworCXJldHVybiBpcnFfdGFiW2ludG5yXTsKK30KKworZXh0ZXJuIHZvaWQgcGNpX3YzX2luaXQodm9pZCAqKTsKKworc3RhdGljIHN0cnVjdCBod19wY2kgaW50ZWdyYXRvcl9wY2kgX19pbml0ZGF0YSA9IHsKKwkuc3dpenpsZQkJPSBpbnRlZ3JhdG9yX3N3aXp6bGUsCisJLm1hcF9pcnEJCT0gaW50ZWdyYXRvcl9tYXBfaXJxLAorCS5zZXR1cAkJCT0gcGNpX3YzX3NldHVwLAorCS5ucl9jb250cm9sbGVycwkJPSAxLAorCS5zY2FuCQkJPSBwY2lfdjNfc2Nhbl9idXMsCisJLnByZWluaXQJCT0gcGNpX3YzX3ByZWluaXQsCisJLnBvc3Rpbml0CQk9IHBjaV92M19wb3N0aW5pdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGludGVncmF0b3JfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19pbnRlZ3JhdG9yKCkpCisJCXBjaV9jb21tb25faW5pdCgmaW50ZWdyYXRvcl9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaW50ZWdyYXRvcl9wY2lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpX3YzLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpX3YzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5YTYzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2lfdjMuYwpAQCAtMCwwICsxLDYwNCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpX3YzLmMKKyAqCisgKiAgUENJIGZ1bmN0aW9ucyBmb3IgVjMgaG9zdCBQQ0kgYnJpZGdlCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9wY2lfdjMuaD4KKworLyoKKyAqIFRoZSBWMyBQQ0kgaW50ZXJmYWNlIGNoaXAgaW4gSW50ZWdyYXRvciBwcm92aWRlcyBzZXZlcmFsIHdpbmRvd3MgZnJvbQorICogbG9jYWwgYnVzIG1lbW9yeSBpbnRvIHRoZSBQQ0kgbWVtb3J5IGFyZWFzLiAgIFVuZm9ydHVuYXRlbHksIHRoZXJlCisgKiBhcmUgbm90IHJlYWxseSBlbm91Z2ggd2luZG93cyBmb3Igb3VyIHVzYWdlLCB0aGVyZWZvcmUgd2UgcmV1c2UgCisgKiBvbmUgb2YgdGhlIHdpbmRvd3MgZm9yIGFjY2VzcyB0byBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4gIFRoZQorICogbWVtb3J5IG1hcCBpcyBhcyBmb2xsb3dzOgorICogCisgKiBMb2NhbCBCdXMgTWVtb3J5ICAgICAgICAgVXNhZ2UKKyAqIAorICogNDAwMDAwMDAgLSA0RkZGRkZGRiAgICAgIFBDSSBtZW1vcnkuICAyNTZNIG5vbi1wcmVmZXRjaGFibGUKKyAqIDUwMDAwMDAwIC0gNUZGRkZGRkYgICAgICBQQ0kgbWVtb3J5LiAgMjU2TSBwcmVmZXRjaGFibGUKKyAqIDYwMDAwMDAwIC0gNjBGRkZGRkYgICAgICBQQ0kgSU8uICAxNk0KKyAqIDYxMDAwMDAwIC0gNjFGRkZGRkYgICAgICBQQ0kgQ29uZmlndXJhdGlvbi4gMTZNCisgKiAKKyAqIFRoZXJlIGFyZSB0aHJlZSBWMyB3aW5kb3dzLCBlYWNoIGRlc2NyaWJlZCBieSBhIHBhaXIgb2YgVjMgcmVnaXN0ZXJzLgorICogVGhlc2UgYXJlIExCX0JBU0UwL0xCX01BUDAsIExCX0JBU0UxL0xCX01BUDEgYW5kIExCX0JBU0UyL0xCX01BUDIuCisgKiBCYXNlMCBhbmQgQmFzZTEgY2FuIGJlIHVzZWQgZm9yIGFueSB0eXBlIG9mIFBDSSBtZW1vcnkgYWNjZXNzLiAgIEJhc2UyCisgKiBjYW4gYmUgdXNlZCBlaXRoZXIgZm9yIFBDSSBJL08gb3IgZm9yIEkyMCBhY2Nlc3Nlcy4gIEJ5IGRlZmF1bHQsIHVIQUwKKyAqIHVzZXMgdGhpcyBvbmx5IGZvciBQQ0kgSU8gc3BhY2UuCisgKiAKKyAqIE5vcm1hbGx5IHRoZXNlIHNwYWNlcyBhcmUgbWFwcGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgYmFzZSByZWdpc3RlcnM6CisgKiAKKyAqIFVzYWdlIExvY2FsIEJ1cyBNZW1vcnkgICAgICAgICBCYXNlL01hcCByZWdpc3RlcnMgdXNlZAorICogCisgKiBNZW0gICA0MDAwMDAwMCAtIDRGRkZGRkZGICAgICAgTEJfQkFTRTAvTEJfTUFQMAorICogTWVtICAgNTAwMDAwMDAgLSA1RkZGRkZGRiAgICAgIExCX0JBU0UxL0xCX01BUDEKKyAqIElPICAgIDYwMDAwMDAwIC0gNjBGRkZGRkYgICAgICBMQl9CQVNFMi9MQl9NQVAyCisgKiBDZmcgICA2MTAwMDAwMCAtIDYxRkZGRkZGCisgKiAKKyAqIFRoaXMgbWVhbnMgdGhhdCBJMjAgYW5kIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2Vzc2VzIHdpbGwgZmFpbC4KKyAqIFdoZW4gUENJIGNvbmZpZ3VyYXRpb24gYWNjZXNzZXMgYXJlIG5lZWRlZCAodmlhIHRoZSB1SEFMIFBDSSAKKyAqIGNvbmZpZ3VyYXRpb24gc3BhY2UgcHJpbWl0aXZlcykgd2UgbXVzdCByZW1hcCB0aGUgc3BhY2VzIGFzIGZvbGxvd3M6CisgKiAKKyAqIFVzYWdlIExvY2FsIEJ1cyBNZW1vcnkgICAgICAgICBCYXNlL01hcCByZWdpc3RlcnMgdXNlZAorICogCisgKiBNZW0gICA0MDAwMDAwMCAtIDRGRkZGRkZGICAgICAgTEJfQkFTRTAvTEJfTUFQMAorICogTWVtICAgNTAwMDAwMDAgLSA1RkZGRkZGRiAgICAgIExCX0JBU0UwL0xCX01BUDAKKyAqIElPICAgIDYwMDAwMDAwIC0gNjBGRkZGRkYgICAgICBMQl9CQVNFMi9MQl9NQVAyCisgKiBDZmcgICA2MTAwMDAwMCAtIDYxRkZGRkZGICAgICAgTEJfQkFTRTEvTEJfTUFQMQorICogCisgKiBUbyBtYWtlIHRoaXMgd29yaywgdGhlIGNvZGUgZGVwZW5kcyBvbiBvdmVybGFwcGluZyB3aW5kb3dzIHdvcmtpbmcuCisgKiBUaGUgVjMgY2hpcCB0cmFuc2xhdGVzIGFuIGFkZHJlc3MgYnkgY2hlY2tpbmcgaXRzIHJhbmdlIHdpdGhpbiAKKyAqIGVhY2ggb2YgdGhlIEJBU0UvTUFQIHBhaXJzIGluIHR1cm4gKGluIGFzY2VuZGluZyByZWdpc3RlciBudW1iZXIKKyAqIG9yZGVyKS4gIEl0IHdpbGwgdXNlIHRoZSBmaXJzdCBtYXRjaGluZyBwYWlyLiAgIFNvLCBmb3IgZXhhbXBsZSwKKyAqIGlmIHRoZSBzYW1lIGFkZHJlc3MgaXMgbWFwcGVkIGJ5IGJvdGggTEJfQkFTRTAvTEJfTUFQMCBhbmQKKyAqIExCX0JBU0UxL0xCX01BUDEsIHRoZSBWMyB3aWxsIHVzZSB0aGUgdHJhbnNsYXRpb24gZnJvbSAKKyAqIExCX0JBU0UwL0xCX01BUDAuCisgKiAKKyAqIFRvIGFsbG93IFBDSSBDb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcywgdGhlIGNvZGUgZW5sYXJnZXMgdGhlCisgKiB3aW5kb3cgbWFwcGVkIGJ5IExCX0JBU0UwL0xCX01BUDAgZnJvbSAyNTZNIHRvIDUxMk0uICBUaGlzIG9jY2x1ZGVzCisgKiB0aGUgd2luZG93cyBjdXJyZW50bHkgbWFwcGVkIGJ5IExCX0JBU0UxL0xCX01BUDEgc28gdGhhdCBpdCBjYW4KKyAqIGJlIHJlbWFwcGVkIGZvciB1c2UgYnkgY29uZmlndXJhdGlvbiBjeWNsZXMuCisgKiAKKyAqIEF0IHRoZSBlbmQgb2YgdGhlIFBDSSBDb25maWd1cmF0aW9uIHNwYWNlIGFjY2Vzc2VzLCAKKyAqIExCX0JBU0UxL0xCX01BUDEgaXMgcmVzZXQgdG8gbWFwIFBDSSBNZW1vcnkuICBGaW5hbGx5IHRoZSB3aW5kb3cKKyAqIG1hcHBlZCBieSBMQl9CQVNFMC9MQl9NQVAwIGlzIHJlZHVjZWQgaW4gc2l6ZSBmcm9tIDUxMk0gdG8gMjU2TSB0bworICogcmV2ZWFsIHRoZSBub3cgcmVzdG9yZWQgTEJfQkFTRTEvTEJfTUFQMSB3aW5kb3cuCisgKiAKKyAqIE5PVEU6IFdlIGRvIG5vdCBzZXQgdXAgSTJPIG1hcHBpbmcuICBJIHN1c3BlY3QgdGhhdCB0aGlzIGlzIG9ubHkKKyAqIGZvciBhbiBpbnRlbGxpZ2VudCAodGFyZ2V0KSBkZXZpY2UuICBVc2luZyBJMk8gZGlzYWJsZXMgbW9zdCBvZgorICogdGhlIG1hcHBpbmdzIGludG8gUENJIG1lbW9yeS4KKyAqLworCisvLyBWMyBhY2Nlc3Mgcm91dGluZXMKKyNkZWZpbmUgdjNfd3JpdGViKG8sdikgX19yYXdfd3JpdGViKHYsIFBDSV9WM19WQUREUiArICh1bnNpZ25lZCBpbnQpKG8pKQorI2RlZmluZSB2M19yZWFkYihvKSAgICAoX19yYXdfcmVhZGIoUENJX1YzX1ZBRERSICsgKHVuc2lnbmVkIGludCkobykpKQorCisjZGVmaW5lIHYzX3dyaXRldyhvLHYpIF9fcmF3X3dyaXRldyh2LCBQQ0lfVjNfVkFERFIgKyAodW5zaWduZWQgaW50KShvKSkKKyNkZWZpbmUgdjNfcmVhZHcobykgICAgKF9fcmF3X3JlYWR3KFBDSV9WM19WQUREUiArICh1bnNpZ25lZCBpbnQpKG8pKSkKKworI2RlZmluZSB2M193cml0ZWwobyx2KSBfX3Jhd193cml0ZWwodiwgUENJX1YzX1ZBRERSICsgKHVuc2lnbmVkIGludCkobykpCisjZGVmaW5lIHYzX3JlYWRsKG8pICAgIChfX3Jhd19yZWFkbChQQ0lfVjNfVkFERFIgKyAodW5zaWduZWQgaW50KShvKSkpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIHJvdXRpbmU6CXVIQUxpcl9QQ0lNYWtlQ29uZmlnQWRkcmVzcygpCisgKgorICogcGFyYW1ldGVyczoJYnVzID0gd2hpY2ggYnVzCisgKiAgICAgICAgICAgICAgZGV2aWNlID0gd2hpY2ggZGV2aWNlCisgKiAgICAgICAgICAgICAgZnVuY3Rpb24gPSB3aGljaCBmdW5jdGlvbgorICoJCW9mZnNldCA9IGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXIgd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqCisgKiBkZXNjcmlwdGlvbjoJdGhpcyByb3V0aW5lIHdpbGwgZ2VuZXJhdGUgYSBwbGF0Zm9ybSBkZXBlbmRlbnQgY29uZmlnCisgKgkJYWRkcmVzcy4KKyAqCisgKiBjYWxsczoJbm9uZQorICoKKyAqIHJldHVybnM6CWNvbmZpZ3VyYXRpb24gYWRkcmVzcyB0byBwbGF5IG9uIHRoZSBQQ0kgYnVzCisgKgorICogVG8gZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIFBDSSBjb25maWd1cmF0aW9uIGN5Y2xlcyBpbiB0aGUgUENJIAorICogY29uZmlndXJhdGlvbiBhZGRyZXNzIHNwYWNlLCB5b3UgcHJlc2VudCB0aGUgVjMgd2l0aCB0aGUgZm9sbG93aW5nIHBhdHRlcm4gCisgKiAod2hpY2ggaXMgdmVyeSBuZWFybHkgYSB0eXBlIDEgKGV4Y2VwdCB0aGF0IHRoZSBsb3dlciB0d28gYml0cyBhcmUgMDAgYW5kCisgKiBub3QgMDEpLiAgIEluIG9yZGVyIGZvciB0aGlzIG1hcHBpbmcgdG8gd29yayB5b3UgbmVlZCB0byBzZXQgdXAgb25lIG9mCisgKiB0aGUgbG9jYWwgdG8gUENJIGFwZXJhdHVyZXMgdG8gMTZNYnl0ZXMgaW4gbGVuZ3RoIHRyYW5zbGF0aW5nIHRvCisgKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBzdGFydGluZyBhdCAweDAwMDAuMDAwMC4KKyAqCisgKiBQQ0kgY29uZmlndXJhdGlvbiBjeWNsZXMgbG9vayBsaWtlIHRoaXM6CisgKgorICogVHlwZSAwOgorICoKKyAqICAzIDN8MyAzIDIgMnwyIDIgMiAyfDIgMiAyIDJ8MSAxIDEgMXwxIDEgMSAxfDEgMSAKKyAqICAzIDJ8MSAwIDkgOHw3IDYgNSA0fDMgMiAxIDB8OSA4IDcgNnw1IDQgMyAyfDEgMCA5IDh8NyA2IDUgNHwzIDIgMSAwCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgfCB8RHxEfER8RHxEfER8RHxEfER8RHxEfER8RHxEfER8RHxEfER8RHxEfER8RnxGfEZ8UnxSfFJ8UnxSfFJ8MHwwfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKgorICoJMzE6MTEJRGV2aWNlIHNlbGVjdCBiaXQuCisgKiAJMTA6OAlGdW5jdGlvbiBudW1iZXIKKyAqIAkgNzoyCVJlZ2lzdGVyIG51bWJlcgorICoKKyAqIFR5cGUgMToKKyAqCisgKiAgMyAzfDMgMyAyIDJ8MiAyIDIgMnwyIDIgMiAyfDEgMSAxIDF8MSAxIDEgMXwxIDEgCisgKiAgMyAyfDEgMCA5IDh8NyA2IDUgNHwzIDIgMSAwfDkgOCA3IDZ8NSA0IDMgMnwxIDAgOSA4fDcgNiA1IDR8MyAyIDEgMAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8IHwgfCB8IHwgfCB8IHwgfCB8IHxCfEJ8QnxCfEJ8QnxCfEJ8RHxEfER8RHxEfEZ8RnxGfFJ8UnxSfFJ8UnxSfDB8MXwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoKKyAqCTMxOjI0CXJlc2VydmVkCisgKgkyMzoxNglidXMgbnVtYmVyICg4IGJpdHMgPSAxMjggcG9zc2libGUgYnVzZXMpCisgKgkxNToxMQlEZXZpY2UgbnVtYmVyICg1IGJpdHMpCisgKgkxMDo4CWZ1bmN0aW9uIG51bWJlcgorICoJIDc6MglyZWdpc3RlciBudW1iZXIKKyAqICAKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyh2M19sb2NrKTsKKworI2RlZmluZSBQQ0lfQlVTX05PTk1FTV9TVEFSVAkweDAwMDAwMDAwCisjZGVmaW5lIFBDSV9CVVNfTk9OTUVNX1NJWkUJU1pfMjU2TQorCisjZGVmaW5lIFBDSV9CVVNfUFJFTUVNX1NUQVJUCVBDSV9CVVNfTk9OTUVNX1NUQVJUICsgUENJX0JVU19OT05NRU1fU0laRQorI2RlZmluZSBQQ0lfQlVTX1BSRU1FTV9TSVpFCVNaXzI1Nk0KKworI2lmIFBDSV9CVVNfTk9OTUVNX1NUQVJUICYgMHgwMDBmZmZmZgorI2Vycm9yIFBDSV9CVVNfTk9OTUVNX1NUQVJUIG11c3QgYmUgbWVnYWJ5dGUgYWxpZ25lZAorI2VuZGlmCisjaWYgUENJX0JVU19QUkVNRU1fU1RBUlQgJiAweDAwMGZmZmZmCisjZXJyb3IgUENJX0JVU19QUkVNRU1fU1RBUlQgbXVzdCBiZSBtZWdhYnl0ZSBhbGlnbmVkCisjZW5kaWYKKworI3VuZGVmIFYzX0xCX0JBU0VfUFJFRkVUQ0gKKyNkZWZpbmUgVjNfTEJfQkFTRV9QUkVGRVRDSCAwCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHYzX29wZW5fY29uZmlnX3dpbmRvdyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hcGFkZHJlc3MsIGJ1c25yOworCisJYnVzbnIgPSBidXMtPm51bWJlcjsKKworCS8qCisJICogVHJhcCBvdXQgaWxsZWdhbCB2YWx1ZXMKKwkgKi8KKwlpZiAob2Zmc2V0ID4gMjU1KQorCQlCVUcoKTsKKwlpZiAoYnVzbnIgPiAyNTUpCisJCUJVRygpOworCWlmIChkZXZmbiA+IDI1NSkKKwkJQlVHKCk7CisKKwlpZiAoYnVzbnIgPT0gMCkgeworCQlpbnQgc2xvdCA9IFBDSV9TTE9UKGRldmZuKTsKKworCQkvKgorCQkgKiBsb2NhbCBidXMgc2VnbWVudCBzbyBuZWVkIGEgdHlwZSAwIGNvbmZpZyBjeWNsZQorCQkgKgorCQkgKiBidWlsZCB0aGUgUENJIGNvbmZpZ3VyYXRpb24gImFkZHJlc3MiIHdpdGggb25lLWhvdCBpbgorCQkgKiBBMzEtQTExCisJCSAqCisJCSAqIG1hcGFkZHJlc3M6CisJCSAqICAzOjEgPSBjb25maWcgY3ljbGUgKDEwMSkKKwkJICogIDAgICA9IFBDSSBBMSAmIEEwIGFyZSAwICgwKQorCQkgKi8KKwkJYWRkcmVzcyA9IFBDSV9GVU5DKGRldmZuKSA8PCA4OworCQltYXBhZGRyZXNzID0gVjNfTEJfTUFQX1RZUEVfQ09ORklHOworCisJCWlmIChzbG90ID4gMTIpCisJCQkvKgorCQkJICogaGlnaCBvcmRlciBiaXRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBNQVAgcmVnaXN0ZXIKKwkJCSAqLworCQkJbWFwYWRkcmVzcyB8PSAxIDw8IChzbG90IC0gNSk7CisJCWVsc2UKKwkJCS8qCisJCQkgKiBsb3cgb3JkZXIgYml0cyBoYW5kbGVkIGRpcmVjdGx5IGluIHRoZSBhZGRyZXNzCisJCQkgKi8KKwkJCWFkZHJlc3MgfD0gMSA8PCAoc2xvdCArIDExKTsKKwl9IGVsc2UgeworICAgICAgICAJLyoKKwkJICogbm90IHRoZSBsb2NhbCBidXMgc2VnbWVudCBzbyBuZWVkIGEgdHlwZSAxIGNvbmZpZyBjeWNsZQorCQkgKgorCQkgKiBhZGRyZXNzOgorCQkgKiAgMjM6MTYgPSBidXMgbnVtYmVyCisJCSAqICAxNToxMSA9IHNsb3QgbnVtYmVyICg3OjMgb2YgZGV2Zm4pCisJCSAqICAxMDo4ICA9IGZ1bmMgbnVtYmVyICgyOjAgb2YgZGV2Zm4pCisJCSAqCisJCSAqIG1hcGFkZHJlc3M6CisJCSAqICAzOjEgPSBjb25maWcgY3ljbGUgKDEwMSkKKwkJICogIDAgICA9IFBDSSBBMSAmIEEwIGZyb20gaG9zdCBidXMgKDEpCisJCSAqLworCQltYXBhZGRyZXNzID0gVjNfTEJfTUFQX1RZUEVfQ09ORklHIHwgVjNfTEJfTUFQX0FEX0xPV19FTjsKKwkJYWRkcmVzcyA9IChidXNuciA8PCAxNikgfCAoZGV2Zm4gPDwgOCk7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgYmFzZTAgdG8gc2VlIGFsbCA1MTJNYnl0ZXMgb2YgbWVtb3J5IHNwYWNlIChub3QKKwkgKiBwcmVmZXRjaGFibGUpLCB0aGlzIGZyZWVzIHVwIGJhc2UxIGZvciByZS11c2UgYnkKKwkgKiBjb25maWd1cmF0aW9uIG1lbW9yeQorCSAqLworCXYzX3dyaXRlbChWM19MQl9CQVNFMCwgdjNfYWRkcl90b19sYl9iYXNlKFBIWVNfUENJX01FTV9CQVNFKSB8CisJCQlWM19MQl9CQVNFX0FEUl9TSVpFXzUxMk1CIHwgVjNfTEJfQkFTRV9FTkFCTEUpOworCisJLyoKKwkgKiBTZXQgdXAgYmFzZTEvbWFwMSB0byBwb2ludCBpbnRvIGNvbmZpZ3VyYXRpb24gc3BhY2UuCisJICovCisJdjNfd3JpdGVsKFYzX0xCX0JBU0UxLCB2M19hZGRyX3RvX2xiX2Jhc2UoUEhZU19QQ0lfQ09ORklHX0JBU0UpIHwKKwkJCVYzX0xCX0JBU0VfQURSX1NJWkVfMTZNQiB8IFYzX0xCX0JBU0VfRU5BQkxFKTsKKwl2M193cml0ZXcoVjNfTEJfTUFQMSwgbWFwYWRkcmVzcyk7CisKKwlyZXR1cm4gUENJX0NPTkZJR19WQUREUiArIGFkZHJlc3MgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHYzX2Nsb3NlX2NvbmZpZ193aW5kb3codm9pZCkKK3sKKwkvKgorCSAqIFJlYXNzaWduIGJhc2UxIGZvciB1c2UgYnkgcHJlZmV0Y2hhYmxlIFBDSSBtZW1vcnkKKwkgKi8KKwl2M193cml0ZWwoVjNfTEJfQkFTRTEsIHYzX2FkZHJfdG9fbGJfYmFzZShQSFlTX1BDSV9NRU1fQkFTRSArIFNaXzI1Nk0pIHwKKwkJCVYzX0xCX0JBU0VfQURSX1NJWkVfMjU2TUIgfCBWM19MQl9CQVNFX1BSRUZFVENIIHwKKwkJCVYzX0xCX0JBU0VfRU5BQkxFKTsKKwl2M193cml0ZXcoVjNfTEJfTUFQMSwgdjNfYWRkcl90b19sYl9tYXAoUENJX0JVU19QUkVNRU1fU1RBUlQpIHwKKwkJCVYzX0xCX01BUF9UWVBFX01FTV9NVUxUSVBMRSk7CisKKwkvKgorCSAqIEFuZCBzaHJpbmsgYmFzZTAgYmFjayB0byBhIDI1Nk0gd2luZG93IChOT1RFOiBNQVAwIGFscmVhZHkgY29ycmVjdCkKKwkgKi8KKwl2M193cml0ZWwoVjNfTEJfQkFTRTAsIHYzX2FkZHJfdG9fbGJfYmFzZShQSFlTX1BDSV9NRU1fQkFTRSkgfAorCQkJVjNfTEJfQkFTRV9BRFJfU0laRV8yNTZNQiB8IFYzX0xCX0JBU0VfRU5BQkxFKTsKK30KKworc3RhdGljIGludCB2M19yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwKKwkJCSAgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnYzX2xvY2ssIGZsYWdzKTsKKwlhZGRyID0gdjNfb3Blbl9jb25maWdfd2luZG93KGJ1cywgZGV2Zm4sIHdoZXJlKTsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJdiA9IF9fcmF3X3JlYWRiKGFkZHIpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJdiA9IF9fcmF3X3JlYWR3KGFkZHIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXYgPSBfX3Jhd19yZWFkbChhZGRyKTsKKwkJYnJlYWs7CisJfQorCisJdjNfY2xvc2VfY29uZmlnX3dpbmRvdygpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnYzX2xvY2ssIGZsYWdzKTsKKworCSp2YWwgPSB2OworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgdjNfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAorCQkJICAgaW50IHNpemUsIHUzMiB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdjNfbG9jaywgZmxhZ3MpOworCWFkZHIgPSB2M19vcGVuX2NvbmZpZ193aW5kb3coYnVzLCBkZXZmbiwgd2hlcmUpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQlfX3Jhd193cml0ZWIoKHU4KXZhbCwgYWRkcik7CisJCV9fcmF3X3JlYWRiKGFkZHIpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJX19yYXdfd3JpdGV3KCh1MTYpdmFsLCBhZGRyKTsKKwkJX19yYXdfcmVhZHcoYWRkcik7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlfX3Jhd193cml0ZWwodmFsLCBhZGRyKTsKKwkJX19yYXdfcmVhZGwoYWRkcik7CisJCWJyZWFrOworCX0KKworCXYzX2Nsb3NlX2NvbmZpZ193aW5kb3coKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2M19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgcGNpX3YzX29wcyA9IHsKKwkucmVhZAk9IHYzX3JlYWRfY29uZmlnLAorCS53cml0ZQk9IHYzX3dyaXRlX2NvbmZpZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugbm9uX21lbSA9IHsKKwkubmFtZQk9ICJQQ0kgbm9uLXByZWZldGNoYWJsZSIsCisJLnN0YXJ0CT0gUEhZU19QQ0lfTUVNX0JBU0UgKyBQQ0lfQlVTX05PTk1FTV9TVEFSVCwKKwkuZW5kCT0gUEhZU19QQ0lfTUVNX0JBU0UgKyBQQ0lfQlVTX05PTk1FTV9TVEFSVCArIFBDSV9CVVNfTk9OTUVNX1NJWkUgLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwcmVfbWVtID0geworCS5uYW1lCT0gIlBDSSBwcmVmZXRjaGFibGUiLAorCS5zdGFydAk9IFBIWVNfUENJX01FTV9CQVNFICsgUENJX0JVU19QUkVNRU1fU1RBUlQsCisJLmVuZAk9IFBIWVNfUENJX01FTV9CQVNFICsgUENJX0JVU19QUkVNRU1fU1RBUlQgKyBQQ0lfQlVTX1BSRU1FTV9TSVpFIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfUFJFRkVUQ0gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2lfdjNfc2V0dXBfcmVzb3VyY2VzKHN0cnVjdCByZXNvdXJjZSAqKnJlc291cmNlKQoreworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJm5vbl9tZW0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUENJOiB1bmFibGUgdG8gYWxsb2NhdGUgbm9uLXByZWZldGNoYWJsZSAiCisJCSAgICAgICAibWVtb3J5IHJlZ2lvblxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnByZV9tZW0pKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoJm5vbl9tZW0pOworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogdW5hYmxlIHRvIGFsbG9jYXRlIHByZWZldGNoYWJsZSAiCisJCSAgICAgICAibWVtb3J5IHJlZ2lvblxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyoKKwkgKiBidXMtPnJlc291cmNlWzBdIGlzIHRoZSBJTyByZXNvdXJjZSBmb3IgdGhpcyBidXMKKwkgKiBidXMtPnJlc291cmNlWzFdIGlzIHRoZSBtZW0gcmVzb3VyY2UgZm9yIHRoaXMgYnVzCisJICogYnVzLT5yZXNvdXJjZVsyXSBpcyB0aGUgcHJlZmV0Y2ggbWVtIHJlc291cmNlIGZvciB0aGlzIGJ1cworCSAqLworCXJlc291cmNlWzBdID0gJmlvcG9ydF9yZXNvdXJjZTsKKwlyZXNvdXJjZVsxXSA9ICZub25fbWVtOworCXJlc291cmNlWzJdID0gJnByZV9tZW07CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoZXNlIGRvbid0IHNlZW0gdG8gYmUgaW1wbGVtZW50ZWQgb24gdGhlIEludGVncmF0b3IgSSBoYXZlLCB3aGljaAorICogbWVhbnMgSSBjYW4ndCBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgcmVhc29uIGZvciB0aGUgcG0yZmIKKyAqIHByb2JsZW1zLiAgSSBzdXBwb3NlIEknbGwganVzdCBoYXZlIHRvIG1pbmQtbWVsZCB3aXRoIHRoZSBtYWNoaW5lLiA7KQorICovCisjZGVmaW5lIFNDX1BDSSAgICAgKElPX0FERFJFU1MoSU5URUdSQVRPUl9TQ19CQVNFKSArIElOVEVHUkFUT1JfU0NfUENJRU5BQkxFX09GRlNFVCkKKyNkZWZpbmUgU0NfTEJGQUREUiAoSU9fQUREUkVTUyhJTlRFR1JBVE9SX1NDX0JBU0UpICsgMHgyMCkKKyNkZWZpbmUgU0NfTEJGQ09ERSAoSU9fQUREUkVTUyhJTlRFR1JBVE9SX1NDX0JBU0UpICsgMHgyNCkKKworc3RhdGljIGludAordjNfcGNpX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGZzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBwYyA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisJdW5zaWduZWQgbG9uZyBpbnN0ciA9ICoodW5zaWduZWQgbG9uZyAqKXBjOworI2lmIDAKKwljaGFyIGJ1ZlsxMjhdOworCisJc3ByaW50ZihidWYsICJWMyBmYXVsdDogYWRkciAweCUwOGx4LCBGU1IgMHglMDN4LCBQQyAweCUwOGx4IFslMDhseF0gTEJGQUREUj0lMDh4IExCRkNPREU9JTAyeCBJU1RBVD0lMDJ4XG4iLAorCQlhZGRyLCBmc3IsIHBjLCBpbnN0ciwgX19yYXdfcmVhZGwoU0NfTEJGQUREUiksIF9fcmF3X3JlYWRsKFNDX0xCRkNPREUpICYgMjU1LAorCQl2M19yZWFkYihWM19MQl9JU1RBVCkpOworCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIGJ1Zik7CisJcHJpbnRhc2NpaShidWYpOworI2VuZGlmCisKKwl2M193cml0ZWIoVjNfTEJfSVNUQVQsIDApOworCV9fcmF3X3dyaXRlbCgzLCBTQ19QQ0kpOworCisJLyoKKwkgKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgZXhlY3V0ZWQgd2FzIGEgcmVhZCwKKwkgKiBtYWtlIGl0IGxvb2sgbGlrZSBpdCByZWFkIGFsbC1vbmVzLgorCSAqLworCWlmICgoaW5zdHIgJiAweDBjMTAwMDAwKSA9PSAweDA0MTAwMDAwKSB7CisJCWludCByZWcgPSAoaW5zdHIgPj4gMTIpICYgMTU7CisJCXVuc2lnbmVkIGxvbmcgdmFsOworCisJCWlmIChpbnN0ciAmIDB4MDA0MDAwMDApCisJCQl2YWwgPSAyNTU7CisJCWVsc2UKKwkJCXZhbCA9IC0xOworCisJCXJlZ3MtPnVyZWdzW3JlZ10gPSB2YWw7CisJCXJlZ3MtPkFSTV9wYyArPSA0OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGluc3RyICYgMHgwZTEwMDA5MCkgPT0gMHgwMDEwMDA5MCkgeworCQlpbnQgcmVnID0gKGluc3RyID4+IDEyKSAmIDE1OworCisJCXJlZ3MtPnVyZWdzW3JlZ10gPSAtMTsKKwkJcmVncy0+QVJNX3BjICs9IDQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdjNfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfTEwKKwl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKwl1bnNpZ25lZCBsb25nIGluc3RyID0gKih1bnNpZ25lZCBsb25nICopcGM7CisJY2hhciBidWZbMTI4XTsKKworCXNwcmludGYoYnVmLCAiVjMgaW50ICVkOiBwYz0weCUwOGx4IFslMDhseF0gTEJGQUREUj0lMDh4IExCRkNPREU9JTAyeCBJU1RBVD0lMDJ4XG4iLCBpcnEsCisJCXBjLCBpbnN0ciwgX19yYXdfcmVhZGwoU0NfTEJGQUREUiksIF9fcmF3X3JlYWRsKFNDX0xCRkNPREUpICYgMjU1LAorCQl2M19yZWFkYihWM19MQl9JU1RBVCkpOworCXByaW50YXNjaWkoYnVmKTsKKyNlbmRpZgorCisJdjNfd3JpdGV3KFYzX1BDSV9TVEFULCAweGYwMDApOworCXYzX3dyaXRlYihWM19MQl9JU1RBVCwgMCk7CisJX19yYXdfd3JpdGVsKDMsIFNDX1BDSSk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfTEwKKwkvKgorCSAqIElmIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBleGVjdXRlZCB3YXMgYSByZWFkLAorCSAqIG1ha2UgaXQgbG9vayBsaWtlIGl0IHJlYWQgYWxsLW9uZXMuCisJICovCisJaWYgKChpbnN0ciAmIDB4MGMxMDAwMDApID09IDB4MDQxMDAwMDApIHsKKwkJaW50IHJlZyA9IChpbnN0ciA+PiAxNikgJiAxNTsKKwkJc3ByaW50ZihidWYsICIgICByZWclZCA9ICUwOGx4XG4iLCByZWcsIHJlZ3MtPnVyZWdzW3JlZ10pOworCQlwcmludGFzY2lpKGJ1Zik7CisJfQorI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgX19pbml0IHBjaV92M19zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChuciA9PSAwKSB7CisJCXN5cy0+bWVtX29mZnNldCA9IFBIWVNfUENJX01FTV9CQVNFOworCQlyZXQgPSBwY2lfdjNfc2V0dXBfcmVzb3VyY2VzKHN5cy0+cmVzb3VyY2UpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBwY2lfYnVzICpwY2lfdjNfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJcmV0dXJuIHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmcGNpX3YzX29wcywgc3lzKTsKK30KKworLyoKKyAqIFYzX0xCX0JBU0U/IC0gbG9jYWwgYnVzIGFkZHJlc3MKKyAqIFYzX0xCX01BUD8gIC0gcGNpIGJ1cyBhZGRyZXNzCisgKi8KK3ZvaWQgX19pbml0IHBjaV92M19wcmVpbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBIb29rIGluIG91ciBmYXVsdCBoYW5kbGVyIGZvciBQQ0kgZXJyb3JzCisJICovCisJaG9va19mYXVsdF9jb2RlKDQsIHYzX3BjaV9mYXVsdCwgU0lHQlVTLCAiZXh0ZXJuYWwgYWJvcnQgb24gbGluZWZldGNoIik7CisJaG9va19mYXVsdF9jb2RlKDYsIHYzX3BjaV9mYXVsdCwgU0lHQlVTLCAiZXh0ZXJuYWwgYWJvcnQgb24gbGluZWZldGNoIik7CisJaG9va19mYXVsdF9jb2RlKDgsIHYzX3BjaV9mYXVsdCwgU0lHQlVTLCAiZXh0ZXJuYWwgYWJvcnQgb24gbm9uLWxpbmVmZXRjaCIpOworCWhvb2tfZmF1bHRfY29kZSgxMCwgdjNfcGNpX2ZhdWx0LCBTSUdCVVMsICJleHRlcm5hbCBhYm9ydCBvbiBub24tbGluZWZldGNoIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdjNfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBVbmxvY2sgVjMgcmVnaXN0ZXJzLCBidXQgb25seSBpZiB0aGV5IHdlcmUgcHJldmlvdXNseSBsb2NrZWQuCisJICovCisJaWYgKHYzX3JlYWR3KFYzX1NZU1RFTSkgJiBWM19TWVNURU1fTV9MT0NLKQorCQl2M193cml0ZXcoVjNfU1lTVEVNLCAweGEwNWYpOworCisJLyoKKwkgKiBTZXR1cCB3aW5kb3cgMCAtIFBDSSBub24tcHJlZmV0Y2hhYmxlIG1lbW9yeQorCSAqICBMb2NhbDogMHg0MDAwMDAwMCBCdXM6IDB4MDAwMDAwMDAgU2l6ZTogMjU2TUIKKwkgKi8KKwl2M193cml0ZWwoVjNfTEJfQkFTRTAsIHYzX2FkZHJfdG9fbGJfYmFzZShQSFlTX1BDSV9NRU1fQkFTRSkgfAorCQkJVjNfTEJfQkFTRV9BRFJfU0laRV8yNTZNQiB8IFYzX0xCX0JBU0VfRU5BQkxFKTsKKwl2M193cml0ZXcoVjNfTEJfTUFQMCwgdjNfYWRkcl90b19sYl9tYXAoUENJX0JVU19OT05NRU1fU1RBUlQpIHwKKwkJCVYzX0xCX01BUF9UWVBFX01FTSk7CisKKwkvKgorCSAqIFNldHVwIHdpbmRvdyAxIC0gUENJIHByZWZldGNoYWJsZSBtZW1vcnkKKwkgKiAgTG9jYWw6IDB4NTAwMDAwMDAgQnVzOiAweDEwMDAwMDAwIFNpemU6IDI1Nk1CCisJICovCisJdjNfd3JpdGVsKFYzX0xCX0JBU0UxLCB2M19hZGRyX3RvX2xiX2Jhc2UoUEhZU19QQ0lfTUVNX0JBU0UgKyBTWl8yNTZNKSB8CisJCQlWM19MQl9CQVNFX0FEUl9TSVpFXzI1Nk1CIHwgVjNfTEJfQkFTRV9QUkVGRVRDSCB8CisJCQlWM19MQl9CQVNFX0VOQUJMRSk7CisJdjNfd3JpdGV3KFYzX0xCX01BUDEsIHYzX2FkZHJfdG9fbGJfbWFwKFBDSV9CVVNfUFJFTUVNX1NUQVJUKSB8CisJCQlWM19MQl9NQVBfVFlQRV9NRU1fTVVMVElQTEUpOworCisJLyoKKwkgKiBTZXR1cCB3aW5kb3cgMiAtIFBDSSBJTworCSAqLworCXYzX3dyaXRlbChWM19MQl9CQVNFMiwgdjNfYWRkcl90b19sYl9iYXNlMihQSFlTX1BDSV9JT19CQVNFKSB8CisJCQlWM19MQl9CQVNFX0VOQUJMRSk7CisJdjNfd3JpdGV3KFYzX0xCX01BUDIsIHYzX2FkZHJfdG9fbGJfbWFwMigwKSk7CisKKwkvKgorCSAqIERpc2FibGUgUENJIHRvIGhvc3QgSU8gY3ljbGVzCisJICovCisJdGVtcCA9IHYzX3JlYWR3KFYzX1BDSV9DRkcpICYgflYzX1BDSV9DRkdfTV9JMk9fRU47CisJdGVtcCB8PSBWM19QQ0lfQ0ZHX01fSU9fUkVHX0RJUyB8IFYzX1BDSV9DRkdfTV9JT19ESVM7CisJdjNfd3JpdGV3KFYzX1BDSV9DRkcsIHRlbXApOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkZJRk9fQ0ZHOiAlMDR4ICBGSUZPX1BSSU86ICUwNHhcbiIsCisJCXYzX3JlYWR3KFYzX0ZJRk9fQ0ZHKSwgdjNfcmVhZHcoVjNfRklGT19QUklPUklUWSkpOworCisJLyoKKwkgKiBTZXQgdGhlIFYzIEZJRk8gc3VjaCB0aGF0IHdyaXRlcyBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuCisJICogcmVhZHMsIGFuZCBsb2NhbCBidXMgd3JpdGUgY2F1c2VzIGxvY2FsIGJ1cyByZWFkIGZpZm8gZmx1c2guCisJICogU2FtZSBmb3IgUENJLgorCSAqLworCXYzX3dyaXRldyhWM19GSUZPX1BSSU9SSVRZLCAweDBhMGEpOworCisJLyoKKwkgKiBSZS1sb2NrIHRoZSBzeXN0ZW0gcmVnaXN0ZXIuCisJICovCisJdGVtcCA9IHYzX3JlYWR3KFYzX1NZU1RFTSkgfCBWM19TWVNURU1fTV9MT0NLOworCXYzX3dyaXRldyhWM19TWVNURU0sIHRlbXApOworCisJLyoKKwkgKiBDbGVhciBhbnkgZXJyb3IgY29uZGl0aW9ucywgYW5kIGVuYWJsZSB3cml0ZSBlcnJvcnMuCisJICovCisJdjNfd3JpdGViKFYzX0xCX0lTVEFULCAwKTsKKwl2M193cml0ZXcoVjNfTEJfQ0ZHLCB2M19yZWFkdyhWM19MQl9DRkcpIHwgKDEgPDwgMTApKTsKKwl2M193cml0ZWIoVjNfTEJfSU1BU0ssIDB4MjgpOworCV9fcmF3X3dyaXRlbCgzLCBTQ19QQ0kpOworCisJLyoKKwkgKiBHcmFiIHRoZSBQQ0kgZXJyb3IgaW50ZXJydXB0LgorCSAqLworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BUF9WM0lOVCwgdjNfaXJxLCAwLCAiVjMiLCBOVUxMKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIlBDSTogdW5hYmxlIHRvIGdyYWIgUENJIGVycm9yICIKKwkJICAgICAgICJpbnRlcnJ1cHQ6ICVkXG4iLCByZXQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdjNfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIF9faW5pdCBwY2lfdjNfcG9zdGluaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGNpX2NtZDsKKworCXBjaV9jbWQgPSBQQ0lfQ09NTUFORF9NRU1PUlkgfAorCQkgIFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisKKwl2M193cml0ZXcoVjNfUENJX0NNRCwgcGNpX2NtZCk7CisKKwl2M193cml0ZWIoVjNfTEJfSVNUQVQsIH4weDQwKTsKKwl2M193cml0ZWIoVjNfTEJfSU1BU0ssIDB4NjgpOworCisjaWYgMAorCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BUF9MQlVTVElNRU9VVCwgbGJfdGltZW91dCwgMCwgImJ1cyB0aW1lb3V0IiwgTlVMTCk7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IHVuYWJsZSB0byBncmFiIGxvY2FsIGJ1cyB0aW1lb3V0ICIKKwkJICAgICAgICJpbnRlcnJ1cHQ6ICVkXG4iLCByZXQpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDcyOWRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3RpbWUuYwpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvdGltZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjZGVmaW5lIFJUQ19EUgkJKDApCisjZGVmaW5lIFJUQ19NUgkJKDQpCisjZGVmaW5lIFJUQ19TVEFUCSg4KQorI2RlZmluZSBSVENfRU9JCQkoOCkKKyNkZWZpbmUgUlRDX0xSCQkoMTIpCisjZGVmaW5lIFJUQ19DUgkJKDE2KQorI2RlZmluZSBSVENfQ1JfTUlFCSgxIDw8IDApCisKK2V4dGVybiBpbnQgKCpzZXRfcnRjKSh2b2lkKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnJ0Y19iYXNlOworCitzdGF0aWMgaW50IGludGVncmF0b3Jfc2V0X3J0Yyh2b2lkKQoreworCV9fcmF3X3dyaXRlbCh4dGltZS50dl9zZWMsIHJ0Y19iYXNlICsgUlRDX0xSKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcnRjX3JlYWRfYWxhcm0oc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJcnRjX3RpbWVfdG9fdG0ocmVhZGwocnRjX2Jhc2UgKyBSVENfTVIpLCAmYWxybS0+dGltZSk7Cit9CisKK3N0YXRpYyBpbnQgcnRjX3NldF9hbGFybShzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJaW50IHJldDsKKworCXJldCA9IHJ0Y190bV90b190aW1lKCZhbHJtLT50aW1lLCAmdGltZSk7CisJaWYgKHJldCA9PSAwKQorCQl3cml0ZWwodGltZSwgcnRjX2Jhc2UgKyBSVENfTVIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJ0Y19yZWFkX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlydGNfdGltZV90b190bShyZWFkbChydGNfYmFzZSArIFJUQ19EUiksIHRtKTsKK30KKworLyoKKyAqIFNldCB0aGUgUlRDIHRpbWUuICBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCBhY2N1cmF0ZWx5IHNldAorICogdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBjb3VudGVyIHVwZGF0ZXMuCisgKgorICogQWxzbywgc2luY2UgUlRDX0xSIGlzIHRyYW5zZmVycmVkIHRvIFJUQ19DUiBvbiBuZXh0IHJpc2luZworICogZWRnZSBvZiB0aGUgMUh6IGNsb2NrLCB3ZSBtdXN0IHdyaXRlIHRoZSB0aW1lIG9uZSBzZWNvbmQKKyAqIGluIGFkdmFuY2UuCisgKi8KK3N0YXRpYyBpbnQgcnRjX3NldF90aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCByZXQ7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSh0bSwgJnRpbWUpOworCWlmIChyZXQgPT0gMCkKKwkJd3JpdGVsKHRpbWUgKyAxLCBydGNfYmFzZSArIFJUQ19MUik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19vcHMgcnRjX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWRfdGltZQk9IHJ0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IHJ0Y19zZXRfYWxhcm0sCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXdyaXRlbCgwLCBydGNfYmFzZSArIFJUQ19FT0kpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBydGNfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIHZvaWQgKmlkKQoreworCWludCByZXQ7CisKKwlpZiAocnRjX2Jhc2UpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXQgPSBhbWJhX3JlcXVlc3RfcmVnaW9ucyhkZXYsIE5VTEwpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcnRjX2Jhc2UgPSBpb3JlbWFwKGRldi0+cmVzLnN0YXJ0LCBTWl80Syk7CisJaWYgKCFydGNfYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlc19vdXQ7CisJfQorCisJX19yYXdfd3JpdGVsKDAsIHJ0Y19iYXNlICsgUlRDX0NSKTsKKwlfX3Jhd193cml0ZWwoMCwgcnRjX2Jhc2UgKyBSVENfRU9JKTsKKworCXh0aW1lLnR2X3NlYyA9IF9fcmF3X3JlYWRsKHJ0Y19iYXNlICsgUlRDX0RSKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxWzBdLCBydGNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQkgICJydGMtcGwwMzAiLCBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gbWFwX291dDsKKworCXJldCA9IHJlZ2lzdGVyX3J0YygmcnRjX29wcyk7CisJaWYgKHJldCkKKwkJZ290byBpcnFfb3V0OworCisJc2V0X3J0YyA9IGludGVncmF0b3Jfc2V0X3J0YzsKKwlyZXR1cm4gMDsKKworIGlycV9vdXQ6CisJZnJlZV9pcnEoZGV2LT5pcnFbMF0sIGRldik7CisgbWFwX291dDoKKwlpb3VubWFwKHJ0Y19iYXNlKTsKKwlydGNfYmFzZSA9IE5VTEw7CisgcmVzX291dDoKKwlhbWJhX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0Y19yZW1vdmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYpCit7CisJc2V0X3J0YyA9IE5VTEw7CisKKwl3cml0ZWwoMCwgcnRjX2Jhc2UgKyBSVENfQ1IpOworCisJZnJlZV9pcnEoZGV2LT5pcnFbMF0sIGRldik7CisJdW5yZWdpc3Rlcl9ydGMoJnJ0Y19vcHMpOworCisJaW91bm1hcChydGNfYmFzZSk7CisJcnRjX2Jhc2UgPSBOVUxMOworCWFtYmFfcmVsZWFzZV9yZWdpb25zKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBydGNfZGVsdGE7CisKK3N0YXRpYyBpbnQgcnRjX3N1c3BlbmQoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgcnRjOworCisJcnRjLnR2X3NlYyA9IHJlYWRsKHJ0Y19iYXNlICsgUlRDX0RSKTsKKwlydGMudHZfbnNlYyA9IDA7CisJc2F2ZV90aW1lX2RlbHRhKCZydGNfZGVsdGEsICZydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRjX3Jlc3VtZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgcnRjOworCisJcnRjLnR2X3NlYyA9IHJlYWRsKHJ0Y19iYXNlICsgUlRDX0RSKTsKKwlydGMudHZfbnNlYyA9IDA7CisJcmVzdG9yZV90aW1lX2RlbHRhKCZydGNfZGVsdGEsICZydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBydGNfaWRzW10gPSB7CisJeworCQkuaWQJPSAweDAwMDQxMDMwLAorCQkubWFzawk9IDB4MDAwZmZmZmYsCisJfSwKKwl7IDAsIDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kcml2ZXIgcnRjX2RyaXZlciA9IHsKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAicnRjLXBsMDMwIiwKKwl9LAorCS5wcm9iZQkJPSBydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBydGNfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBydGNfcmVzdW1lLAorCS5pZF90YWJsZQk9IHJ0Y19pZHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbnRlZ3JhdG9yX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIGFtYmFfZHJpdmVyX3JlZ2lzdGVyKCZydGNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGludGVncmF0b3JfcnRjX2V4aXQodm9pZCkKK3sKKwlhbWJhX2RyaXZlcl91bnJlZ2lzdGVyKCZydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW50ZWdyYXRvcl9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChpbnRlZ3JhdG9yX3J0Y19leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmU4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9LY29uZmlnCkBAIC0wLDAgKzEsNjMgQEAKK2lmIEFSQ0hfSU9QM1hYCisKK21lbnUgIklPUDN4eCBJbXBsZW1lbnRhdGlvbiBPcHRpb25zIgorCitjb21tZW50ICJJT1AzeHggUGxhdGZvcm0gVHlwZXMiCisKK2NvbmZpZyBBUkNIX0lRODAzMjEKKwlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgSVE4MDMyMSIKKwlzZWxlY3QgQVJDSF9JT1AzMjEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHJ1biB5b3VyIGtlcm5lbCBvbiB0aGUgSW50ZWwgSVE4MDMyMQorCSAgZXZhbHVhdGlvbiBraXQgZm9yIHRoZSBJT1AzMjEgY2hpcHNldC4KKworY29uZmlnIEFSQ0hfSVEzMTI0NAorCWJvb2wgIkVuYWJsZSBzdXBwb3J0IGZvciBJUTMxMjQ0IgorCXNlbGVjdCBBUkNIX0lPUDMyMQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gcnVuIHlvdXIga2VybmVsIG9uIHRoZSBJbnRlbCBJUTMxMjQ0CisJICBldmFsdWF0aW9uIGtpdCBmb3IgdGhlIElPUDMyMSBjaGlwc2V0LgorCitjb25maWcgQVJDSF9JUTgwMzMxCisJYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIElRODAzMzEiCisJc2VsZWN0IEFSQ0hfSU9QMzMxCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBydW4geW91ciBrZXJuZWwgb24gdGhlIEludGVsIElRODAzMzEKKwkgIGV2YWx1YXRpb24ga2l0IGZvciB0aGUgSU9QMzMxIGNoaXBzZXQuCisKK2NvbmZpZyBNQUNIX0lRODAzMzIKKwlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgSVE4MDMzMiIKKwlzZWxlY3QgQVJDSF9JT1AzMzEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHJ1biB5b3VyIGtlcm5lbCBvbiB0aGUgSW50ZWwgSVE4MDMzMgorCSAgZXZhbHVhdGlvbiBraXQgZm9yIHRoZSBJT1AzMzIgY2hpcHNldAorCitjb25maWcgQVJDSF9FUDgwMjE5CisgICAgYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIEVQODAyMTkiCisgICAgc2VsZWN0IEFSQ0hfSU9QMzIxCisgICAgc2VsZWN0IEFSQ0hfSVEzMTI0NAorCisjIFdoaWNoIElPUCB2YXJpYW50IGFyZSB3ZSBydW5uaW5nPworY29uZmlnIEFSQ0hfSU9QMzIxCisJYm9vbAorCWhlbHAKKwkgIFRoZSBJUTgwMzIxIHVzZXMgdGhlIElPUDMyMSB2YXJpYW50LgorCSAgVGhlIElRMzEyNDQgYW5kIEVQODAyMTkgdXNlcyB0aGUgSU9QMzIxIHZhcmlhbnQuCisKK2NvbmZpZyBBUkNIX0lPUDMzMQorCWJvb2wKKwlkZWZhdWx0IEFSQ0hfSVE4MDMzMQorCWhlbHAKKwkgIFRoZSBJUTgwMzMxLCBJUTgwMzMyLCBhbmQgSVE4MDMzMyB1c2VzIHRoZSBJT1AzMzEgdmFyaWFudC4KKworY29tbWVudCAiSU9QM3h4IENoaXBzZXQgRmVhdHVyZXMiCisKK2NvbmZpZyBJT1AzMzFfU1RFUEQKKwlib29sICJDaGlwIHN0ZXBwaW5nIEQgb2YgdGhlIElPUDgwMzMxIHByb2Nlc3NvciBvciBJT1A4MDMzMyIKKwlkZXBlbmRzIG9uIChBUkNIX0lPUDMzMSkKKwloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBTdGVwRCBvZiB0aGUgSU9QODAzMzEgb3IgSU9QODAzMworCQkgIGJhc2VkIHBsYXRmb3Jtcy4KKworZW5kbWVudQorZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3ZWIxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJOj0gY29tbW9uLm8KKworb2JqLW0JCQk6PQorb2JqLW4JCQk6PQorb2JqLQkJCTo9CisKK29iai0kKENPTkZJR19BUkNIX0lPUDMyMSkgICs9IGlvcDMyMS1zZXR1cC5vIGlvcDMyMS1pcnEubyBpb3AzMjEtcGNpLm8gaW9wMzIxLXRpbWUubworCitvYmotJChDT05GSUdfQVJDSF9JT1AzMzEpICArPSBpb3AzMzEtc2V0dXAubyBpb3AzMzEtaXJxLm8gaW9wMzMxLXBjaS5vIGlvcDMzMS10aW1lLm8KKworb2JqLSQoQ09ORklHX0FSQ0hfSVE4MDMyMSkgKz0gaXE4MDMyMS1tbS5vIGlxODAzMjEtcGNpLm8KKworb2JqLSQoQ09ORklHX0FSQ0hfSVEzMTI0NCkgKz0gaXEzMTI0NC1tbS5vIGlxMzEyNDQtcGNpLm8KKworb2JqLSQoQ09ORklHX0FSQ0hfSVE4MDMzMSkgKz0gaXE4MDMzMS1tbS5vIGlxODAzMzEtcGNpLm8KKworb2JqLSQoQ09ORklHX01BQ0hfSVE4MDMzMikgKz0gaXE4MDMzMi1tbS5vIGlxODAzMzItcGNpLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODdhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsOSBAQAorICAgenJlbGFkZHIteQk6PSAweGEwMDA4MDAwCitwYXJhbXNfcGh5cy15CTo9IDB4YTAwMDAxMDAKK2luaXRyZF9waHlzLXkJOj0gMHhhMDgwMDAwMAoraWZlcSAoJChDT05GSUdfQVJDSF9JT1AzMzEpLHkpCisgICB6cmVsYWRkci15CTo9IDB4MDAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHgwMDAwMDEwMAoraW5pdHJkX3BoeXMteQk6PSAweDAwODAwMDAwCitlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTczOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9jb21tb24uYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1pb3AzeHgvY29tbW9uLmMKKyAqCisgKiBDb21tb24gcm91dGluZXMgc2hhcmVkIGFjcm9zcyBhbGwgSU9QM3h4IGltcGxlbWVudGF0aW9ucworICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBtdmlzdGEuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDAzIChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisvKgorICogU2hhcmVkIHZhcmlhYmxlcworICovCit1bnNpZ25lZCBsb25nIGlvcDN4eF9wY2liaW9zX21pbl9pbyA9IDA7Cit1bnNpZ25lZCBsb25nIGlvcDN4eF9wY2liaW9zX21pbl9tZW0gPSAwOworCisjaWZkZWYgQ09ORklHX0FSQ0hfRVA4MDIxOQorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLyoKKyAqIERlZmF1bHQgcG93ZXItb2ZmIGZvciBFUDgwMjE5CisgKi8KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZXA4MDIxOV9zZW5kX3RvX3BpYyhfX3U4IGMpIHsKK30KKwordm9pZCBlcDgwMjE5X3Bvd2VyX29mZih2b2lkKQoreworCS8qCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYSBTSFVURE9XTl9DT01QTEVURSBtZXNzYWdlIHRvIHRoZSBQSUMgY29udHJvbGxlcgorICAgICAqIG92ZXIgSTJDLiAgV2UgYXJlIG5vdCB1c2luZyB0aGUgaTJjIHN1YnN5c3RlbSBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gcG93ZXIKKyAgICAgKiBvZmYgYW5kIGl0IG1heSBiZSByZW1vdmVkCisgICAgICovCisKKwkvKiBTZW5kIHRoZSBBZGRyZXNzIGJ5dGUgdy8gdGhlIHN0YXJ0IGNvbmRpdGlvbiAqLworCSpJT1AzMjFfSURCUjEgPSAweDYwOworCSpJT1AzMjFfSUNSMSA9IDB4RTk7CisgICAgbWRlbGF5KDEpOworCisJLyogU2VuZCB0aGUgU1RBUlRfTVNHIGJ5dGUgdy8gbm8gc3RhcnQgb3Igc3RvcCBjb25kaXRpb24gKi8KKwkqSU9QMzIxX0lEQlIxID0gMHgwRjsKKwkqSU9QMzIxX0lDUjEgPSAweEU4OworICAgIG1kZWxheSgxKTsKKworCS8qIFNlbmQgdGhlIFNIVVRET1dOX0NPTVBMRVRFIE1lc3NhZ2UgSUQgYnl0ZSB3LyBubyBzdGFydCBvciBzdG9wIGNvbmRpdGlvbiAqLworCSpJT1AzMjFfSURCUjEgPSAweDAzOworCSpJT1AzMjFfSUNSMSA9IDB4RTg7CisgICAgbWRlbGF5KDEpOworCisJLyogU2VuZCBhbiBpZ25vcmVkIGJ5dGUgdy8gc3RvcCBjb25kaXRpb24gKi8KKwkqSU9QMzIxX0lEQlIxID0gMHgwMDsKKwkqSU9QMzIxX0lDUjEgPSAweEVBOworCisJd2hpbGUgKDEpIDsKK30KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCitzdGF0aWMgaW50IF9faW5pdCBlcDgwMjE5X2luaXQodm9pZCkKK3sKKwlwbV9wb3dlcl9vZmYgPSBlcDgwMjE5X3Bvd2VyX29mZjsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoZXA4MDIxOV9pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLWlycS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmFhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtaXJxLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1pcnEuYworICoKKyAqIEdlbmVyaWMgSU9QMzIxIElSUSBoYW5kbGluZyBmdW5jdGlvbmFsaXR5CisgKgorICogQXV0aG9yOiBSb3J5IEJvbHQgPHJvcnlib2x0QHBhY2JlbGwubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvcnkgQm9sdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWRkZWQgSU9QM1hYIGNoaXBzZXQgYW5kIElRODAzMjEgYm9hcmQgbWFza2luZyBjb2RlLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCitzdGF0aWMgdTMyIGlvcDMyMV9tYXNrIC8qID0gMCAqLzsKKworc3RhdGljIGlubGluZSB2b2lkIGludGN0bF93cml0ZSh1MzIgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibWNyIHA2LDAsJTAsYzAsYzAsMCI6OiJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRzdHJfd3JpdGUodTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwwLCUwLGM0LGMwLDAiOjoiciIgKHZhbCkpOworfQorCitzdGF0aWMgdm9pZAoraW9wMzIxX2lycV9tYXNrICh1bnNpZ25lZCBpbnQgaXJxKQoreworCisJaW9wMzIxX21hc2sgJj0gfigxIDw8IChpcnEgLSBJT1AzMjFfSVJRX09GUykpOworCisJaW50Y3RsX3dyaXRlKGlvcDMyMV9tYXNrKTsKK30KKworc3RhdGljIHZvaWQKK2lvcDMyMV9pcnFfdW5tYXNrICh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlvcDMyMV9tYXNrIHw9ICgxIDw8IChpcnEgLSBJT1AzMjFfSVJRX09GUykpOworCisJaW50Y3RsX3dyaXRlKGlvcDMyMV9tYXNrKTsKK30KKworc3RydWN0IGlycWNoaXAgZXh0X2NoaXAgPSB7CisJLmFjayAgICA9IGlvcDMyMV9pcnFfbWFzaywKKwkubWFzayAgID0gaW9wMzIxX2lycV9tYXNrLAorCS51bm1hc2sgPSBpb3AzMjFfaXJxX3VubWFzaywKK307CisKK3ZvaWQgX19pbml0IGlvcDMyMV9pbml0X2lycSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCB0bXA7CisKKwkvKiBFbmFibGUgYWNjZXNzIHRvIGNvcHJvY2Vzc29yIDYgZm9yIGRlYWxpbmcgd2l0aCBJUlFzLgorCSAqIEZyb20gUk1LOgorCSAqIEJhc2ljYWxseSwgdGhlIEludGVsIGRvY3VtZW50YXRpb24gaGVyZSBpcyBwb29yLiAgSXQgYXBwZWFycyB0aGF0CisJICogeW91IG5lZWQgdG8gc2V0IHRoZSBiaXQgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIGNvcHJvY2Vzc29yIGZyb20KKwkgKiBTVkMgbW9kZS4gIFdoZXRoZXIgdGhhdCBhbGxvd3MgYWNjZXNzIGZyb20gdXNlciBzcGFjZSBvciBub3QgaXMKKwkgKiB1bmNsZWFyLgorCSAqLworCWFzbSB2b2xhdGlsZSAoCisJCSJtcmMgcDE1LCAwLCAlMCwgYzE1LCBjMSwgMFxuXHQiCisJCSJvcnIgJTAsICUwLCAlMVxuXHQiCisJCSJtY3IgcDE1LCAwLCAlMCwgYzE1LCBjMSwgMFxuXHQiCisJCS8qIFRoZSBhY3Rpb24gaXMgZGVsYXllZCwgc28gd2UgaGF2ZSB0byBkbyB0aGlzOiAqLworCQkibXJjIHAxNSwgMCwgJTAsIGMxNSwgYzEsIDBcblx0IgorCQkibW92ICUwLCAlMFxuXHQiCisJCSJzdWIgcGMsIHBjLCAjNCIKKwkJOiAiPXIiICh0bXApIDogImkiICgxIDw8IDYpICk7CisKKwlpbnRjdGxfd3JpdGUoMCk7CQkvLyBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisJaW50c3RyX3dyaXRlKDApOwkJLy8gdHJlYXQgYWxsIGFzIElSUQorCWlmKG1hY2hpbmVfaXNfaXE4MDMyMSgpIHx8CisJICAgbWFjaGluZV9pc19pcTMxMjQ0KCkpIAkvLyBhbGwgaW50ZXJydXB0cyBhcmUgaW5wdXRzIHRvIGNoaXAKKwkJKklPUDMyMV9QQ0lJUlNSID0gMHgwZjsKKworCWZvcihpID0gSU9QMzIxX0lSUV9PRlM7IGkgPCBOUl9JT1AzMjFfSVJRUzsgaSsrKQorCXsKKwkJc2V0X2lycV9jaGlwKGksICZleHRfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTZhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtcGNpLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtcGNpLmMKKyAqCisgKiBQQ0kgc3VwcG9ydCBmb3IgdGhlIEludGVsIElPUDMyMSBjaGlwc2V0CisgKgorICogQXV0aG9yOiBSb3J5IEJvbHQgPHJvcnlib2x0QHBhY2JlbGwubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvcnkgQm9sdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2lvcDMyMS5oPgorCisvLyAjZGVmaW5lIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSAgREJHKHguLi4pIHByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUgIERCRyh4Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIFRoaXMgcm91dGluZSBidWlsZHMgZWl0aGVyIGEgdHlwZTAgb3IgdHlwZTEgY29uZmlndXJhdGlvbiBjb21tYW5kLiAgSWYgdGhlCisgKiBidXMgaXMgb24gdGhlIDgwMzIxIHRoZW4gYSB0eXBlMCBtYWRlLCBlbHNlIGEgdHlwZTEgaXMgY3JlYXRlZC4KKyAqLworc3RhdGljIHUzMiBpb3AzMjFfY2ZnX2FkZHJlc3Moc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuLCBpbnQgd2hlcmUpCit7CisJc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzID0gYnVzLT5zeXNkYXRhOworCXUzMiBhZGRyOworCisJaWYgKHN5cy0+YnVzbnIgPT0gYnVzLT5udW1iZXIpCisJCWFkZHIgPSAxIDw8IChQQ0lfU0xPVChkZXZmbikgKyAxNikgfCAoUENJX1NMT1QoZGV2Zm4pIDw8IDExKTsKKwllbHNlCisJCWFkZHIgPSBidXMtPm51bWJlciA8PCAxNiB8IFBDSV9TTE9UKGRldmZuKSA8PCAxMSB8IDE7CisKKwlhZGRyIHw9CVBDSV9GVU5DKGRldmZuKSA8PCA4IHwgKHdoZXJlICYgfjMpOworCisJcmV0dXJuIGFkZHI7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIHRoZSBzdGF0dXMgb2YgdGhlIGxhc3QgY29uZmlndXJhdGlvbiBjeWNsZS4gIElmIGFuIGVycm9yCisgKiB3YXMgZGV0ZWN0ZWQgaXQgcmV0dXJucyBhIDEsIGVsc2UgaXQgcmV0dXJucyBhIDAuICBUaGUgZXJyb3JzIGJlaW5nIGNoZWNrZWQKKyAqIGFyZSBwYXJpdHksIG1hc3RlciBhYm9ydCwgdGFyZ2V0IGFib3J0IChtYXN0ZXIgYW5kIHRhcmdldCkuICBUaGVzZSB0eXBlcyBvZgorICogZXJyb3JzIG9jY3VyZSBkdXJpbmcgYSBjb25maWcgY3ljbGUgd2hlcmUgdGhlcmUgaXMgbm8gZGV2aWNlLCBsaWtlIGR1cmluZworICogdGhlIGRpc2NvdmVyeSBzdGFnZS4KKyAqLworc3RhdGljIGludCBpb3AzMjFfcGNpX3N0YXR1cyh2b2lkKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIENoZWNrIHRoZSBzdGF0dXMgcmVnaXN0ZXJzLgorCSAqLworCXN0YXR1cyA9ICpJT1AzMjFfQVRVU1I7CisJaWYgKHN0YXR1cyAmIDB4ZjkwMCkKKwl7CisJCURCRygiXHRcdFx0UENJOiBQMCAtIHN0YXR1cyA9IDB4JTA4eFxuIiwgc3RhdHVzKTsKKwkJKklPUDMyMV9BVFVTUiA9IHN0YXR1cyAmIDB4ZjkwMDsKKwkJcmV0ID0gMTsKKwl9CisJc3RhdHVzID0gKklPUDMyMV9BVFVJU1I7CisJaWYgKHN0YXR1cyAmIDB4Njc5ZikKKwl7CisJCURCRygiXHRcdFx0UENJOiBQMSAtIHN0YXR1cyA9IDB4JTA4eFxuIiwgc3RhdHVzKTsKKwkJKklPUDMyMV9BVFVJU1IgPSBzdGF0dXMgJiAweDY3OWY7CisJCXJldCA9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTaW1wbHkgd3JpdGUgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgYW5kIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIGRhdGEuICBOb3RlIHRoYXQgdGhlIDQgbm9wJ3MgZW5zdXJlIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlCisgKiBhIGRlbGF5ZWQgYWJvcnQgKGluIHRoZW9yeS4pCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGlvcDMyMV9yZWFkKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1MzIgdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJzdHIJJTEsIFslMl1cblx0IgorCQkibGRyCSUwLCBbJTNdXG5cdCIKKwkJIm5vcFxuXHQiCisJCSJub3Bcblx0IgorCQkibm9wXG5cdCIKKwkJIm5vcFxuXHQiCisJCTogIj1yIiAodmFsKQorCQk6ICJyIiAoYWRkciksICJyIiAoSU9QMzIxX09DQ0FSKSwgInIiIChJT1AzMjFfT0NDRFIpKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBUaGUgcmVhZCByb3V0aW5lcyBtdXN0IGNoZWNrIHRoZSBlcnJvciBzdGF0dXMgb2YgdGhlIGxhc3QgY29uZmlndXJhdGlvbgorICogY3ljbGUuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSByb3V0aW5lIHJldHVybnMgYWxsIGhleCBmJ3MuCisgKi8KK3N0YXRpYyBpbnQKK2lvcDMyMV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwKKwkJaW50IHNpemUsIHUzMiAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaW9wMzIxX2NmZ19hZGRyZXNzKGJ1cywgZGV2Zm4sIHdoZXJlKTsKKwl1MzIgdmFsID0gaW9wMzIxX3JlYWQoYWRkcikgPj4gKCh3aGVyZSAmIDMpICogOCk7CisKKwlpZiggaW9wMzIxX3BjaV9zdGF0dXMoKSApCisJCXZhbCA9IDB4ZmZmZmZmZmY7CisKKwkqdmFsdWUgPSB2YWw7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50Citpb3AzMjFfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAorCQlpbnQgc2l6ZSwgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGlvcDMyMV9jZmdfYWRkcmVzcyhidXMsIGRldmZuLCB3aGVyZSk7CisJdTMyIHZhbDsKKworCWlmIChzaXplICE9IDQpIHsKKwkJdmFsID0gaW9wMzIxX3JlYWQoYWRkcik7CisJCWlmICghaW9wMzIxX3BjaV9zdGF0dXMoKSA9PSAwKQorCQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKworCQl3aGVyZSA9ICh3aGVyZSAmIDMpICogODsKKworCQlpZiAoc2l6ZSA9PSAxKQorCQkJdmFsICY9IH4oMHhmZiA8PCB3aGVyZSk7CisJCWVsc2UKKwkJCXZhbCAmPSB+KDB4ZmZmZiA8PCB3aGVyZSk7CisKKwkJKklPUDMyMV9PQ0NEUiA9IHZhbCB8IHZhbHVlIDw8IHdoZXJlOworCX0gZWxzZSB7CisJCWFzbSB2b2xhdGlsZSgKKwkJCSJzdHIJJTEsIFslMl1cblx0IgorCQkJInN0cgklMCwgWyUzXVxuXHQiCisJCQkibm9wXG5cdCIKKwkJCSJub3Bcblx0IgorCQkJIm5vcFxuXHQiCisJCQkibm9wXG5cdCIKKwkJCToKKwkJCTogInIiICh2YWx1ZSksICJyIiAoYWRkciksCisJCQkgICJyIiAoSU9QMzIxX09DQ0FSKSwgInIiIChJT1AzMjFfT0NDRFIpKTsKKwl9CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgaW9wMzIxX29wcyA9IHsKKwkucmVhZAk9IGlvcDMyMV9yZWFkX2NvbmZpZywKKwkud3JpdGUJPSBpb3AzMjFfd3JpdGVfY29uZmlnLAorfTsKKworLyoKKyAqIFdoZW4gYSBQQ0kgZGV2aWNlIGRvZXMgbm90IGV4aXN0IGR1cmluZyBjb25maWcgY3ljbGVzLCB0aGUgODAyMDAgZ2V0cyBhCisgKiBidXMgZXJyb3IgaW5zdGVhZCBvZiByZXR1cm5pbmcgMHhmZmZmZmZmZi4gVGhpcyBoYW5kbGVyIHNpbXBseSByZXR1cm5zLgorICovCitpbnQKK2lvcDMyMV9wY2lfYWJvcnQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlEQkcoIlBDSSBhYm9ydDogYWRkcmVzcyA9IDB4JTA4bHggZnNyID0gMHglMDN4IFBDID0gMHglMDhseCBMUiA9IDB4JTA4bHhcbiIsCisJCWFkZHIsIGZzciwgcmVncy0+QVJNX3BjLCByZWdzLT5BUk1fbHIpOworCisJLyoKKwkgKiBJZiBpdCB3YXMgYW4gaW1wcmVjaXNlIGFib3J0LCB0aGVuIHdlIG5lZWQgdG8gY29ycmVjdCB0aGUKKwkgKiByZXR1cm4gYWRkcmVzcyB0byBiZSBfYWZ0ZXJfIHRoZSBpbnN0cnVjdGlvbi4KKwkgKi8KKwlpZiAoZnNyICYgKDEgPDwgMTApKQorCQlyZWdzLT5BUk1fcGMgKz0gNDsKKworCXJldHVybiAwOworfQorCisvKgorICogU2NhbiBhbiBJT1AzMjEgUENJIGJ1cy4gIHN5cy0+YnVzIGRlZmluZXMgd2hpY2ggYnVzIHdlIHNjYW4uCisgKi8KK3N0cnVjdCBwY2lfYnVzICppb3AzMjFfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJcmV0dXJuIHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmaW9wMzIxX29wcywgc3lzKTsKK30KKwordm9pZCBpb3AzMjFfaW5pdCh2b2lkKQoreworCURCRygiUENJOiAgSW50ZWwgODAzMjEgUENJIGluaXQgY29kZS5cbiIpOworCURCRygiQVRVOiBJT1AzMjFfQVRVQ01EPTB4JTA0eFxuIiwgKklPUDMyMV9BVFVDTUQpOworCURCRygiQVRVOiBJT1AzMjFfT01XVFZSMD0weCUwNHgsIElPUDMyMV9PSU9XVFZSPTB4JTA0eFxuIiwKKwkJCSpJT1AzMjFfT01XVFZSMCwKKwkJCSpJT1AzMjFfT0lPV1RWUik7CisJREJHKCJBVFU6IElPUDMyMV9BVFVDUj0weCUwOHhcbiIsICpJT1AzMjFfQVRVQ1IpOworCURCRygiQVRVOiBJT1AzMjFfSUFCQVIwPTB4JTA4eCBJT1AzMjFfSUFMUjA9MHglMDh4IElPUDMyMV9JQVRWUjA9JTA4eFxuIiwKKwkJCSpJT1AzMjFfSUFCQVIwLCAqSU9QMzIxX0lBTFIwLCAqSU9QMzIxX0lBVFZSMCk7CisJREJHKCJBVFU6IElPUDMyMV9PTVdUVlIwPTB4JTA4eFxuIiwgKklPUDMyMV9PTVdUVlIwKTsKKwlEQkcoIkFUVTogSU9QMzIxX0lBQkFSMT0weCUwOHggSU9QMzIxX0lBTFIxPTB4JTA4eFxuIiwKKwkJCSpJT1AzMjFfSUFCQVIxLCAqSU9QMzIxX0lBTFIxKTsKKwlEQkcoIkFUVTogSU9QMzIxX0VSQkFSPTB4JTA4eCBJT1AzMjFfRVJMUj0weCUwOHggSU9QMzIxX0VSVFZSPSUwOHhcbiIsCisJCQkqSU9QMzIxX0VSQkFSLCAqSU9QMzIxX0VSTFIsICpJT1AzMjFfRVJUVlIpOworCURCRygiQVRVOiBJT1AzMjFfSUFCQVIyPTB4JTA4eCBJT1AzMjFfSUFMUjI9MHglMDh4IElPUDMyMV9JQVRWUjI9JTA4eFxuIiwKKwkJCSpJT1AzMjFfSUFCQVIyLCAqSU9QMzIxX0lBTFIyLCAqSU9QMzIxX0lBVFZSMik7CisJREJHKCJBVFU6IElPUDMyMV9JQUJBUjM9MHglMDh4IElPUDMyMV9JQUxSMz0weCUwOHggSU9QMzIxX0lBVFZSMz0lMDh4XG4iLAorCQkJKklPUDMyMV9JQUJBUjMsICpJT1AzMjFfSUFMUjMsICpJT1AzMjFfSUFUVlIzKTsKKworCWhvb2tfZmF1bHRfY29kZSgxNis2LCBpb3AzMjFfcGNpX2Fib3J0LCBTSUdCVVMsICJpbXByZWNpc2UgZXh0ZXJuYWwgYWJvcnQiKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjIzZTBmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXNldHVwLmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtc2V0dXAuYworICoKKyAqIEF1dGhvcjogTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjZGVmaW5lIElPUDMyMV9VQVJUX1hUQUwgMTg0MzIwMAorCisvKgorICogU3RhbmRhcmQgSU8gbWFwcGluZyBmb3IgYWxsIElPUDMyMSBiYXNlZCBzeXN0ZW1zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW9wMzIxX3N0ZF9kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICAgIGxlbmd0aCAgICAgIHR5cGUgKi8KKworIC8qIG1lbSBtYXBwZWQgcmVnaXN0ZXJzICovCisgeyBJT1AzMjFfVklSVF9NRU1fQkFTRSwgIElPUDMyMV9QSFlTX01FTV9CQVNFLCAgIDB4MDAwMDIwMDAsICBNVF9ERVZJQ0UgfSwKKworIC8qIFBDSSBJTyBzcGFjZSAqLworIHsgSU9QMzIxX1BDSV9MT1dFUl9JT19WQSwgIElPUDMyMV9QQ0lfTE9XRVJfSU9fUEEsICAgSU9QMzIxX1BDSV9JT19XSU5ET1dfU0laRSwgIE1UX0RFVklDRSB9Cit9OworCisjaWZkZWYgQ09ORklHX0FSQ0hfSVE4MDMyMQorI2RlZmluZSBVQVJUQkFTRSBJUTgwMzIxX1VBUlQKKyNkZWZpbmUgSVJRX1VBUlQgSVJRX0lRODAzMjFfVUFSVAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9JUTMxMjQ0CisjZGVmaW5lIFVBUlRCQVNFIElRMzEyNDRfVUFSVAorI2RlZmluZSBJUlFfVUFSVCBJUlFfSVEzMTI0NF9VQVJUCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgaW9wMzIxX3NlcmlhbF9wb3J0c1tdID0geworCXsKKwkJLm1lbWJhc2UJPSAoY2hhciopKFVBUlRCQVNFKSwKKwkJLm1hcGJhc2UJPSAoVUFSVEJBU0UpLAorCQkuaXJxCQk9IElSUV9VQVJULAorCQkuZmxhZ3MJCT0gVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMCwKKwkJLnVhcnRjbGsJPSBJT1AzMjFfVUFSVF9YVEFMLAorCQkubGluZQkJPSAwLAorCQkudHlwZQkJPSBQT1JUXzE2NTUwQSwKKwkJLmZpZm9zaXplCT0gMTYKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlvcDMyeF9pMmNfMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IDB4ZmZmZmY2ODAsCisJCS5lbmQgPSAweGZmZmZmNjk4LAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0lPUDMyMV9JMkNfMCwKKwkJLmVuZCA9IElSUV9JT1AzMjFfSTJDXzAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpb3AzMnhfaTJjXzFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSAweGZmZmZmNmEwLAorCQkuZW5kID0gMHhmZmZmZjZiOCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9JT1AzMjFfSTJDXzEsCisJCS5lbmQgPSBJUlFfSU9QMzIxX0kyQ18xLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlvcDMyeF9pMmNfMF9jb250cm9sbGVyID0geworCS5uYW1lID0gIklPUDN4eC1JMkMiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSAyLAorCS5yZXNvdXJjZSA9IGlvcDMyeF9pMmNfMF9yZXNvdXJjZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlvcDMyeF9pMmNfMV9jb250cm9sbGVyID0geworCS5uYW1lID0gIklPUDN4eC1JMkMiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSAyLAorCS5yZXNvdXJjZSA9IGlvcDMyeF9pMmNfMV9yZXNvdXJjZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppb3AzMnhfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmlvcDMyeF9pMmNfMF9jb250cm9sbGVyLAorCSZpb3AzMnhfaTJjXzFfY29udHJvbGxlcgorfTsKKwordm9pZCBfX2luaXQgaW9wMzJ4X2luaXQodm9pZCkKK3sKKwlpZihpb3BfaXNfMzIxKCkpCisJeworCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpb3AzMnhfZGV2aWNlcywKKwkJCQlBUlJBWV9TSVpFKGlvcDMyeF9kZXZpY2VzKSk7CisJfQorfQorCit2b2lkIF9faW5pdCBpb3AzMjFfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KGlvcDMyMV9zdGRfZGVzYywgQVJSQVlfU0laRShpb3AzMjFfc3RkX2Rlc2MpKTsKKwllYXJseV9zZXJpYWxfc2V0dXAoJmlvcDMyMV9zZXJpYWxfcG9ydHNbMF0pOworfQorCisjaWZkZWYgQ09ORklHX0FSQ0hfSVE4MDMyMQorZXh0ZXJuIHZvaWQgaXE4MDMyMV9tYXBfaW8odm9pZCk7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBpb3AzMjFfdGltZXI7CitleHRlcm4gdm9pZCBpb3AzMjFfaW5pdF90aW1lKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9JUTMxMjQ0CitleHRlcm4gdm9pZCBpcTMxMjQ0X21hcF9pbyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGlvcDMyMV90aW1lcjsKK2V4dGVybiB2b2lkIGlvcDMyMV9pbml0X3RpbWUodm9pZCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVE4MDMyMSkKK01BQ0hJTkVfU1RBUlQoSVE4MDMyMSwgIkludGVsIElRODAzMjEiKQorCU1BSU5UQUlORVIoIkludGVsIENvcnBvcmF0aW9uIikKKwlCT09UX01FTShQSFlTX09GRlNFVCwgSVE4MDMyMV9VQVJULCBJUTgwMzIxX1VBUlQpCisJTUFQSU8oaXE4MDMyMV9tYXBfaW8pCisJSU5JVElSUShpb3AzMjFfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZpb3AzMjFfdGltZXIsCisgICAgQk9PVF9QQVJBTVMoMHhhMDAwMDEwMCkKKwlJTklUX01BQ0hJTkUoaW9wMzJ4X2luaXQpCitNQUNISU5FX0VORAorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JUTMxMjQ0KQorTUFDSElORV9TVEFSVChJUTMxMjQ0LCAiSW50ZWwgSVEzMTI0NCIpCisgICAgTUFJTlRBSU5FUigiSW50ZWwgQ29ycC4iKQorICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJUTMxMjQ0X1VBUlQsIElRMzEyNDRfVUFSVCkKKyAgICBNQVBJTyhpcTMxMjQ0X21hcF9pbykKKyAgICBJTklUSVJRKGlvcDMyMV9pbml0X2lycSkKKwkudGltZXIJCT0gJmlvcDMyMV90aW1lciwKKyAgICBCT09UX1BBUkFNUygweGEwMDAwMTAwKQorCUlOSVRfTUFDSElORShpb3AzMnhfaW5pdCkKK01BQ0hJTkVfRU5ECisjZWxzZQorI2Vycm9yIE5vIG1hY2hpbmUgZGVzY3JpcHRvciBkZWZpbmVkIGZvciB0aGlzIElPUDNYWCBpbXBsZW1lbnRhdGlvbgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdkZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXRpbWUuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMKKyAqCisgKiBUaW1lciBjb2RlIGZvciBJT1AzMjEgYmFzZWQgc3lzdGVtcworICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBtdmlzdGEuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjZGVmaW5lIElPUDMyMV9USU1FX1NZTkMgMAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2VsYXBzZWQodm9pZCkKK3sKKwlyZXR1cm4gTEFUQ0ggLSAqSU9QMzIxX1RVX1RDUjA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvcDMyMV9nZXR0aW1lb2Zmc2V0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkLCB1c2VjOworCXUzMiB0aXNyMSwgdGlzcjI7CisKKwkvKgorCSAqIElmIGFuIGludGVycnVwdCB3YXMgcGVuZGluZyBiZWZvcmUgd2UgcmVhZCB0aGUgdGltZXIsCisJICogd2UndmUgYWxyZWFkeSB3cmFwcGVkLiAgRmFjdG9yIHRoaXMgaW50byB0aGUgdGltZS4KKwkgKiBJZiBhbiBpbnRlcnJ1cHQgd2FzIHBlbmRpbmcgYWZ0ZXIgd2UgcmVhZCB0aGUgdGltZXIsCisJICogaXQgbWF5IGhhdmUgd3JhcHBlZCBiZXR3ZWVuIGNoZWNraW5nIHRoZSBpbnRlcnJ1cHQKKwkgKiBzdGF0dXMgYW5kIHJlYWRpbmcgdGhlIHRpbWVyLiAgUmUtcmVhZCB0aGUgdGltZXIgdG8KKwkgKiBiZSBzdXJlIGl0cyB2YWx1ZSBpcyBhZnRlciB0aGUgd3JhcC4KKwkgKi8KKworCWFzbSB2b2xhdGlsZSgibXJjIHA2LCAwLCAlMCwgYzYsIGMxLCAwIiA6ICI9ciIgKHRpc3IxKSk7CisJZWxhcHNlZCA9IGdldF9lbGFwc2VkKCk7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjNiwgYzEsIDAiIDogIj1yIiAodGlzcjIpKTsKKworCWlmKHRpc3IxICYgMSkKKwkJZWxhcHNlZCArPSBMQVRDSDsKKwllbHNlIGlmICh0aXNyMiAmIDEpCisJCWVsYXBzZWQgPSBMQVRDSCArIGdldF9lbGFwc2VkKCk7CisKKwkvKgorCSAqIE5vdyBjb252ZXJ0IHRoZW0gdG8gdXNlYy4KKwkgKi8KKwl1c2VjID0gKHVuc2lnbmVkIGxvbmcpKGVsYXBzZWQgKiAodGlja19uc2VjIC8gMTAwMCkpIC8gTEFUQ0g7CisKKwlyZXR1cm4gdXNlYzsKK30KKworc3RhdGljIGlycXJldHVybl90Citpb3AzMjFfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIHRpc3I7CisKKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKworCWFzbSB2b2xhdGlsZSgibXJjIHA2LCAwLCAlMCwgYzYsIGMxLCAwIiA6ICI9ciIgKHRpc3IpKTsKKwl0aXNyIHw9IDE7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjNiwgYzEsIDAiIDogOiAiciIgKHRpc3IpKTsKKworCXRpbWVyX3RpY2socmVncyk7CisKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpb3AzMjFfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJJT1AzMjEgVGltZXIgVGljayIsCisJLmhhbmRsZXIJPSBpb3AzMjFfdGltZXJfaW50ZXJydXB0LAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpb3AzMjFfdGltZXJfaW5pdCh2b2lkKQoreworCXUzMiB0aW1lcl9jdGw7CisKKwlzZXR1cF9pcnEoSVJRX0lPUDMyMV9USU1FUjAsICZpb3AzMjFfdGltZXJfaXJxKTsKKworCXRpbWVyX2N0bCA9IElPUDMyMV9UTVJfRU4gfCBJT1AzMjFfVE1SX1BSSVZJTEVHRUQgfCBJT1AzMjFfVE1SX1JFTE9BRCB8CisJCQlJT1AzMjFfVE1SX1JBVElPXzFfMTsKKworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzQsIGMxLCAwIiA6IDogInIiIChMQVRDSCkpOworCisJYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjMCwgYzEsIDAiCTogOiAiciIgKHRpbWVyX2N0bCkpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGlvcDMyMV90aW1lciA9IHsKKwkuaW5pdAkJPSAmaW9wMzIxX3RpbWVyX2luaXQsCisJLm9mZnNldAkJPSBpb3AzMjFfZ2V0dGltZW9mZnNldCwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtaXJxLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNDMyMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1pcnEuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1pcnEuYworICoKKyAqIEdlbmVyaWMgSU9QMzMxIElSUSBoYW5kbGluZyBmdW5jdGlvbmFsaXR5CisgKgorICogQXV0aG9yOiBEYXZlIEppYW5nIDxkYXZlLmppYW5nQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCitzdGF0aWMgdTMyIGlvcDMzMV9tYXNrMCA9IDA7CitzdGF0aWMgdTMyIGlvcDMzMV9tYXNrMSA9IDA7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRjdGxfd3JpdGUwKHUzMiB2YWwpCit7CisgICAgLy8gSU5UQ1RMMAorCWFzbSB2b2xhdGlsZSgibWNyIHA2LDAsJTAsYzAsYzAsMCI6OiJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRjdGxfd3JpdGUxKHUzMiB2YWwpCit7CisgICAgLy8gSU5UQ1RMMQorICAgIGFzbSB2b2xhdGlsZSgibWNyIHA2LDAsJTAsYzEsYzAsMCI6OiJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRzdHJfd3JpdGUwKHUzMiB2YWwpCit7CisgICAgLy8gSU5UU1RSMAorCWFzbSB2b2xhdGlsZSgibWNyIHA2LDAsJTAsYzIsYzAsMCI6OiJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRzdHJfd3JpdGUxKHUzMiB2YWwpCit7CisgICAgLy8gSU5UU1RSMQorCWFzbSB2b2xhdGlsZSgibWNyIHA2LDAsJTAsYzMsYzAsMCI6OiJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyB2b2lkCitpb3AzMzFfaXJxX21hc2sxICh1bnNpZ25lZCBpbnQgaXJxKQoreworICAgICAgICBpb3AzMzFfbWFzazAgJj0gfigxIDw8IChpcnEgLSBJT1AzMzFfSVJRX09GUykpOworICAgICAgICBpbnRjdGxfd3JpdGUwKGlvcDMzMV9tYXNrMCk7Cit9CisKK3N0YXRpYyB2b2lkCitpb3AzMzFfaXJxX21hc2syICh1bnNpZ25lZCBpbnQgaXJxKQoreworICAgICAgICBpb3AzMzFfbWFzazEgJj0gfigxIDw8IChpcnEgLSBJT1AzMzFfSVJRX09GUyAtIDMyKSk7CisgICAgICAgIGludGN0bF93cml0ZTEoaW9wMzMxX21hc2sxKTsKK30KKworc3RhdGljIHZvaWQKK2lvcDMzMV9pcnFfdW5tYXNrMSh1bnNpZ25lZCBpbnQgaXJxKQoreworICAgICAgICBpb3AzMzFfbWFzazAgfD0gKDEgPDwgKGlycSAtIElPUDMzMV9JUlFfT0ZTKSk7CisgICAgICAgIGludGN0bF93cml0ZTAoaW9wMzMxX21hc2swKTsKK30KKworc3RhdGljIHZvaWQKK2lvcDMzMV9pcnFfdW5tYXNrMih1bnNpZ25lZCBpbnQgaXJxKQoreworICAgICAgICBpb3AzMzFfbWFzazEgfD0gKDEgPDwgKGlycSAtIElPUDMzMV9JUlFfT0ZTIC0gMzIpKTsKKyAgICAgICAgaW50Y3RsX3dyaXRlMShpb3AzMzFfbWFzazEpOworfQorCitzdHJ1Y3QgaXJxY2hpcCBpb3AzMzFfaXJxY2hpcDEgPSB7CisJLmFjayAgICA9IGlvcDMzMV9pcnFfbWFzazEsCisJLm1hc2sgICA9IGlvcDMzMV9pcnFfbWFzazEsCisJLnVubWFzayA9IGlvcDMzMV9pcnFfdW5tYXNrMSwKK307CisKK3N0cnVjdCBpcnFjaGlwIGlvcDMzMV9pcnFjaGlwMiA9IHsKKwkuYWNrICAgID0gaW9wMzMxX2lycV9tYXNrMiwKKwkubWFzayAgID0gaW9wMzMxX2lycV9tYXNrMiwKKwkudW5tYXNrID0gaW9wMzMxX2lycV91bm1hc2syLAorfTsKKwordm9pZCBfX2luaXQgaW9wMzMxX2luaXRfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIHRtcDsKKworCS8qIEVuYWJsZSBhY2Nlc3MgdG8gY29wcm9jZXNzb3IgNiBmb3IgZGVhbGluZyB3aXRoIElSUXMuCisJICogRnJvbSBSTUs6CisJICogQmFzaWNhbGx5LCB0aGUgSW50ZWwgZG9jdW1lbnRhdGlvbiBoZXJlIGlzIHBvb3IuICBJdCBhcHBlYXJzIHRoYXQKKwkgKiB5b3UgbmVlZCB0byBzZXQgdGhlIGJpdCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgY29wcm9jZXNzb3IgZnJvbQorCSAqIFNWQyBtb2RlLiAgV2hldGhlciB0aGF0IGFsbG93cyBhY2Nlc3MgZnJvbSB1c2VyIHNwYWNlIG9yIG5vdCBpcworCSAqIHVuY2xlYXIuCisJICovCisJYXNtIHZvbGF0aWxlICgKKwkJIm1yYyBwMTUsIDAsICUwLCBjMTUsIGMxLCAwXG5cdCIKKwkJIm9yciAlMCwgJTAsICUxXG5cdCIKKwkJIm1jciBwMTUsIDAsICUwLCBjMTUsIGMxLCAwXG5cdCIKKwkJLyogVGhlIGFjdGlvbiBpcyBkZWxheWVkLCBzbyB3ZSBoYXZlIHRvIGRvIHRoaXM6ICovCisJCSJtcmMgcDE1LCAwLCAlMCwgYzE1LCBjMSwgMFxuXHQiCisJCSJtb3YgJTAsICUwXG5cdCIKKwkJInN1YiBwYywgcGMsICM0IgorCQk6ICI9ciIgKHRtcCkgOiAiaSIgKDEgPDwgNikgKTsKKworCWludGN0bF93cml0ZTAoMCk7CQkvLyBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisgICAgCWludGN0bF93cml0ZTEoMCk7CisJaW50c3RyX3dyaXRlMCgwKTsJCS8vIHRyZWF0IGFsbCBhcyBJUlEKKyAgICAJaW50c3RyX3dyaXRlMSgwKTsKKwlpZihtYWNoaW5lX2lzX2lxODAzMzEoKSkgCS8vIGFsbCBpbnRlcnJ1cHRzIGFyZSBpbnB1dHMgdG8gY2hpcAorCQkqSU9QMzMxX1BDSUlSU1IgPSAweDBmOworCisJZm9yKGkgPSBJT1AzMzFfSVJRX09GUzsgaSA8IE5SX0lPUDMzMV9JUlFTOyBpKyspCisJeworCQlzZXRfaXJxX2NoaXAoaSwgKGkgPCAzMikgPyAmaW9wMzMxX2lycWNoaXAxIDogJmlvcDMzMV9pcnFjaGlwMik7CisJCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGRkMjEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXBjaS5jCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXBjaS5jCisgKgorICogUENJIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCBJT1AzMzEgY2hpcHNldAorICoKKyAqIEF1dGhvcjogRGF2ZSBKaWFuZyAoZGF2ZS5qaWFuZ0BpbnRlbC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgSW50ZWwgQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9pb3AzMzEuaD4KKworI3VuZGVmIERFQlVHCisjdW5kZWYgREVCVUcxCisKKyNpZmRlZiBERUJVRworI2RlZmluZSAgREJHKHguLi4pIHByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUgIERCRyh4Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIERFQlVHMQorI2RlZmluZSAgREJHMSh4Li4uKSBwcmludGsoeCkKKyNlbHNlCisjZGVmaW5lICBEQkcxKHguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICogVGhpcyByb3V0aW5lIGJ1aWxkcyBlaXRoZXIgYSB0eXBlMCBvciB0eXBlMSBjb25maWd1cmF0aW9uIGNvbW1hbmQuICBJZiB0aGUKKyAqIGJ1cyBpcyBvbiB0aGUgODAzMzEgdGhlbiBhIHR5cGUwIG1hZGUsIGVsc2UgYSB0eXBlMSBpcyBjcmVhdGVkLgorICovCitzdGF0aWMgdTMyIGlvcDMzMV9jZmdfYWRkcmVzcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4sIGludCB3aGVyZSkKK3sKKwlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBidXMtPnN5c2RhdGE7CisJdTMyIGFkZHI7CisKKwlpZiAoc3lzLT5idXNuciA9PSBidXMtPm51bWJlcikKKwkJYWRkciA9IDEgPDwgKFBDSV9TTE9UKGRldmZuKSArIDE2KSB8IChQQ0lfU0xPVChkZXZmbikgPDwgMTEpOworCWVsc2UKKwkJYWRkciA9IGJ1cy0+bnVtYmVyIDw8IDE2IHwgUENJX1NMT1QoZGV2Zm4pIDw8IDExIHwgMTsKKworCWFkZHIgfD0JUENJX0ZVTkMoZGV2Zm4pIDw8IDggfCAod2hlcmUgJiB+Myk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBjb25maWd1cmF0aW9uIGN5Y2xlLiAgSWYgYW4gZXJyb3IKKyAqIHdhcyBkZXRlY3RlZCBpdCByZXR1cm5zIGEgMSwgZWxzZSBpdCByZXR1cm5zIGEgMC4gIFRoZSBlcnJvcnMgYmVpbmcgY2hlY2tlZAorICogYXJlIHBhcml0eSwgbWFzdGVyIGFib3J0LCB0YXJnZXQgYWJvcnQgKG1hc3RlciBhbmQgdGFyZ2V0KS4gIFRoZXNlIHR5cGVzIG9mCisgKiBlcnJvcnMgb2NjdXJlIGR1cmluZyBhIGNvbmZpZyBjeWNsZSB3aGVyZSB0aGVyZSBpcyBubyBkZXZpY2UsIGxpa2UgZHVyaW5nCisgKiB0aGUgZGlzY292ZXJ5IHN0YWdlLgorICovCitzdGF0aWMgaW50IGlvcDMzMV9wY2lfc3RhdHVzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogQ2hlY2sgdGhlIHN0YXR1cyByZWdpc3RlcnMuCisJICovCisJc3RhdHVzID0gKklPUDMzMV9BVFVTUjsKKwlpZiAoc3RhdHVzICYgMHhmOTAwKQorCXsKKwkJREJHKCJcdFx0XHRQQ0k6IFAwIC0gc3RhdHVzID0gMHglMDh4XG4iLCBzdGF0dXMpOworCQkqSU9QMzMxX0FUVVNSID0gc3RhdHVzICYgMHhmOTAwOworCQlyZXQgPSAxOworCX0KKwlzdGF0dXMgPSAqSU9QMzMxX0FUVUlTUjsKKwlpZiAoc3RhdHVzICYgMHg2NzlmKQorCXsKKwkJREJHKCJcdFx0XHRQQ0k6IFAxIC0gc3RhdHVzID0gMHglMDh4XG4iLCBzdGF0dXMpOworCQkqSU9QMzMxX0FUVUlTUiA9IHN0YXR1cyAmIDB4Njc5ZjsKKwkJcmV0ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNpbXBseSB3cml0ZSB0aGUgYWRkcmVzcyByZWdpc3RlciBhbmQgcmVhZCB0aGUgY29uZmlndXJhdGlvbgorICogZGF0YS4gIE5vdGUgdGhhdCB0aGUgNCBub3AncyBlbnN1cmUgdGhhdCB3ZSBhcmUgYWJsZSB0byBoYW5kbGUKKyAqIGEgZGVsYXllZCBhYm9ydCAoaW4gdGhlb3J5LikKKyAqLworc3RhdGljIGlubGluZSB1MzIgaW9wMzMxX3JlYWQodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXUzMiB2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJInN0cgklMSwgWyUyXVxuXHQiCisJCSJsZHIJJTAsIFslM11cblx0IgorCQkibm9wXG5cdCIKKwkJIm5vcFxuXHQiCisJCSJub3Bcblx0IgorCQkibm9wXG5cdCIKKwkJOiAiPXIiICh2YWwpCisJCTogInIiIChhZGRyKSwgInIiIChJT1AzMzFfT0NDQVIpLCAiciIgKElPUDMzMV9PQ0NEUikpOworCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIFRoZSByZWFkIHJvdXRpbmVzIG11c3QgY2hlY2sgdGhlIGVycm9yIHN0YXR1cyBvZiB0aGUgbGFzdCBjb25maWd1cmF0aW9uCisgKiBjeWNsZS4gIElmIHRoZXJlIHdhcyBhbiBlcnJvciwgdGhlIHJvdXRpbmUgcmV0dXJucyBhbGwgaGV4IGYncy4KKyAqLworc3RhdGljIGludAoraW9wMzMxX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAorCQlpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBpb3AzMzFfY2ZnX2FkZHJlc3MoYnVzLCBkZXZmbiwgd2hlcmUpOworCXUzMiB2YWwgPSBpb3AzMzFfcmVhZChhZGRyKSA+PiAoKHdoZXJlICYgMykgKiA4KTsKKworCWlmKCBpb3AzMzFfcGNpX3N0YXR1cygpICkKKwkJdmFsID0gMHhmZmZmZmZmZjsKKworCSp2YWx1ZSA9IHZhbDsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQKK2lvcDMzMV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsCisJCWludCBzaXplLCB1MzIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaW9wMzMxX2NmZ19hZGRyZXNzKGJ1cywgZGV2Zm4sIHdoZXJlKTsKKwl1MzIgdmFsOworCisJaWYgKHNpemUgIT0gNCkgeworCQl2YWwgPSBpb3AzMzFfcmVhZChhZGRyKTsKKwkJaWYgKCFpb3AzMzFfcGNpX3N0YXR1cygpID09IDApCisJCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCisJCXdoZXJlID0gKHdoZXJlICYgMykgKiA4OworCisJCWlmIChzaXplID09IDEpCisJCQl2YWwgJj0gfigweGZmIDw8IHdoZXJlKTsKKwkJZWxzZQorCQkJdmFsICY9IH4oMHhmZmZmIDw8IHdoZXJlKTsKKworCQkqSU9QMzMxX09DQ0RSID0gdmFsIHwgdmFsdWUgPDwgd2hlcmU7CisJfSBlbHNlIHsKKwkJYXNtIHZvbGF0aWxlKAorCQkJInN0cgklMSwgWyUyXVxuXHQiCisJCQkic3RyCSUwLCBbJTNdXG5cdCIKKwkJCSJub3Bcblx0IgorCQkJIm5vcFxuXHQiCisJCQkibm9wXG5cdCIKKwkJCSJub3Bcblx0IgorCQkJOgorCQkJOiAiciIgKHZhbHVlKSwgInIiIChhZGRyKSwKKwkJCSAgInIiIChJT1AzMzFfT0NDQVIpLCAiciIgKElPUDMzMV9PQ0NEUikpOworCX0KKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBpb3AzMzFfb3BzID0geworCS5yZWFkCT0gaW9wMzMxX3JlYWRfY29uZmlnLAorCS53cml0ZQk9IGlvcDMzMV93cml0ZV9jb25maWcsCit9OworCisvKgorICogV2hlbiBhIFBDSSBkZXZpY2UgZG9lcyBub3QgZXhpc3QgZHVyaW5nIGNvbmZpZyBjeWNsZXMsIHRoZSBYU2NhbGUgZ2V0cyBhCisgKiBidXMgZXJyb3IgaW5zdGVhZCBvZiByZXR1cm5pbmcgMHhmZmZmZmZmZi4gVGhpcyBoYW5kbGVyIHNpbXBseSByZXR1cm5zLgorICovCitpbnQKK2lvcDMzMV9wY2lfYWJvcnQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlEQkcoIlBDSSBhYm9ydDogYWRkcmVzcyA9IDB4JTA4bHggZnNyID0gMHglMDN4IFBDID0gMHglMDhseCBMUiA9IDB4JTA4bHhcbiIsCisJCWFkZHIsIGZzciwgcmVncy0+QVJNX3BjLCByZWdzLT5BUk1fbHIpOworCisJLyoKKwkgKiBJZiBpdCB3YXMgYW4gaW1wcmVjaXNlIGFib3J0LCB0aGVuIHdlIG5lZWQgdG8gY29ycmVjdCB0aGUKKwkgKiByZXR1cm4gYWRkcmVzcyB0byBiZSBfYWZ0ZXJfIHRoZSBpbnN0cnVjdGlvbi4KKwkgKi8KKwlpZiAoZnNyICYgKDEgPDwgMTApKQorCQlyZWdzLT5BUk1fcGMgKz0gNDsKKworCXJldHVybiAwOworfQorCisvKgorICogU2NhbiBhbiBJT1AzMzEgUENJIGJ1cy4gIHN5cy0+YnVzIGRlZmluZXMgd2hpY2ggYnVzIHdlIHNjYW4uCisgKi8KK3N0cnVjdCBwY2lfYnVzICppb3AzMzFfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJcmV0dXJuIHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmaW9wMzMxX29wcywgc3lzKTsKK30KKwordm9pZCBpb3AzMzFfaW5pdCh2b2lkKQoreworCURCRzEoIlBDSTogIEludGVsIDgwMzMxIFBDSSBpbml0IGNvZGUuXG4iKTsKKwlEQkcxKCJcdEFUVTogSU9QMzMxX0FUVUNNRD0weCUwNHhcbiIsICpJT1AzMzFfQVRVQ01EKTsKKwlEQkcxKCJcdEFUVTogSU9QMzMxX09NV1RWUjA9MHglMDR4LCBJT1AzMzFfT0lPV1RWUj0weCUwNHhcbiIsCisJCQkqSU9QMzMxX09NV1RWUjAsCisJCQkqSU9QMzMxX09JT1dUVlIpOworCURCRzEoIlx0QVRVOiBJT1AzMzFfT01XVFZSMT0weCUwNHhcbiIsICpJT1AzMzFfT01XVFZSMSk7CisJREJHMSgiXHRBVFU6IElPUDMzMV9BVFVDUj0weCUwOHhcbiIsICpJT1AzMzFfQVRVQ1IpOworCURCRzEoIlx0QVRVOiBJT1AzMzFfSUFCQVIwPTB4JTA4eCBJT1AzMzFfSUFMUjA9MHglMDh4IElPUDMzMV9JQVRWUjA9JTA4eFxuIiwgKklPUDMzMV9JQUJBUjAsICpJT1AzMzFfSUFMUjAsICpJT1AzMzFfSUFUVlIwKTsKKwlEQkcxKCJcdEFUVTogSU9QMzFfSUFCQVIxPTB4JTA4eCBJT1AzMzFfSUFMUjE9MHglMDh4XG4iLCAqSU9QMzMxX0lBQkFSMSwgKklPUDMzMV9JQUxSMSk7CisJREJHMSgiXHRBVFU6IElPUDMzMV9FUkJBUj0weCUwOHggSU9QMzMxX0VSTFI9MHglMDh4IElPUDMzMV9FUlRWUj0lMDh4XG4iLCAqSU9QMzMxX0VSQkFSLCAqSU9QMzMxX0VSTFIsICpJT1AzMzFfRVJUVlIpOworCURCRzEoIlx0QVRVOiBJT1AzMzFfSUFCQVIyPTB4JTA4eCBJT1AzMzFfSUFMUjI9MHglMDh4IElPUDMzMV9JQVRWUjI9JTA4eFxuIiwgKklPUDMzMV9JQUJBUjIsICpJT1AzMzFfSUFMUjIsICpJT1AzMzFfSUFUVlIyKTsKKwlEQkcxKCJcdEFUVTogSU9QMzMxX0lBQkFSMz0weCUwOHggSU9QMzMxX0lBTFIzPTB4JTA4eCBJT1AzMzFfSUFUVlIzPSUwOHhcbiIsICpJT1AzMzFfSUFCQVIzLCAqSU9QMzMxX0lBTFIzLCAqSU9QMzMxX0lBVFZSMyk7CisKKwlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaW9wMzMxX3BjaV9hYm9ydCwgU0lHQlVTLCAiaW1wcmVjaXNlIGV4dGVybmFsIGFib3J0Iik7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyZTc5MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1zZXR1cC5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXNldHVwLmMKKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgKGRhdmUuamlhbmdAaW50ZWwuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNkZWZpbmUgSU9QMzMxX1VBUlRfWFRBTCAzMzMzNDAwMAorCisvKgorICogU3RhbmRhcmQgSU8gbWFwcGluZyBmb3IgYWxsIElPUDMzMSBiYXNlZCBzeXN0ZW1zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW9wMzMxX3N0ZF9kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICAgIGxlbmd0aCAgICAgIHR5cGUgKi8KKworIC8qIG1lbSBtYXBwZWQgcmVnaXN0ZXJzICovCisgeyBJT1AzMzFfVklSVF9NRU1fQkFTRSwgIElPUDMzMV9QSFlTX01FTV9CQVNFLCAgIDB4MDAwMDIwMDAsICBNVF9ERVZJQ0UgfSwKKworIC8qIFBDSSBJTyBzcGFjZSAqLworIHsgSU9QMzMxX1BDSV9MT1dFUl9JT19WQSwgIElPUDMzMV9QQ0lfTE9XRVJfSU9fUEEsICAgSU9QMzMxX1BDSV9JT19XSU5ET1dfU0laRSwgIE1UX0RFVklDRSB9Cit9OworCitzdGF0aWMgc3RydWN0IHVhcnRfcG9ydCBpb3AzMzFfc2VyaWFsX3BvcnRzW10gPSB7CisJeworCQkubWVtYmFzZQk9IChjaGFyKikoSU9QMzMxX1VBUlQwX1ZJUlQpLAorCQkubWFwYmFzZQk9IChJT1AzMzFfVUFSVDBfUEhZUyksCisJCS5pcnEJCT0gSVJRX0lPUDMzMV9VQVJUMCwKKwkJLmZsYWdzCQk9IFVQRl9TS0lQX1RFU1QsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSU9QMzMxX1VBUlRfWFRBTCwKKwkJLmxpbmUJCT0gMCwKKwkJLnR5cGUJCT0gUE9SVF9YU0NBTEUsCisJCS5maWZvc2l6ZQk9IDMyCisJfSAsIHsKKwkJLm1lbWJhc2UJPSAoY2hhciopKElPUDMzMV9VQVJUMV9WSVJUKSwKKwkJLm1hcGJhc2UJPSAoSU9QMzMxX1VBUlQxX1BIWVMpLAorCQkuaXJxCQk9IElSUV9JT1AzMzFfVUFSVDEsCisJCS5mbGFncwkJPSBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9IElPUDMzMV9VQVJUX1hUQUwsCisJCS5saW5lCQk9IDEsCisJCS50eXBlCQk9IFBPUlRfWFNDQUxFLAorCQkuZmlmb3NpemUJPSAzMgorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wMzN4X2kyY18wX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gMHhmZmZmZjY4MCwKKwkJLmVuZCA9IDB4ZmZmZmY2OTgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSU9QMzMxX0kyQ18wLAorCQkuZW5kID0gSVJRX0lPUDMzMV9JMkNfMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlvcDMzeF9pMmNfMV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IDB4ZmZmZmY2YTAsCisJCS5lbmQgPSAweGZmZmZmNmI4LAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0lPUDMzMV9JMkNfMSwKKwkJLmVuZCA9IElSUV9JT1AzMzFfSTJDXzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9wMzN4X2kyY18wX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUgPSAiSU9QM3h4LUkyQyIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IDIsCisJLnJlc291cmNlID0gaW9wMzN4X2kyY18wX3Jlc291cmNlcworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9wMzN4X2kyY18xX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUgPSAiSU9QM3h4LUkyQyIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IDIsCisJLnJlc291cmNlID0gaW9wMzN4X2kyY18xX3Jlc291cmNlcworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlvcDMzeF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaW9wMzN4X2kyY18wX2NvbnRyb2xsZXIsCisJJmlvcDMzeF9pMmNfMV9jb250cm9sbGVyCit9OworCit2b2lkIF9faW5pdCBpb3AzM3hfaW5pdCh2b2lkKQoreworCWlmKGlvcF9pc18zMzEoKSkKKwl7CisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGlvcDMzeF9kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUoaW9wMzN4X2RldmljZXMpKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGlvcDMzMV9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQoaW9wMzMxX3N0ZF9kZXNjLCBBUlJBWV9TSVpFKGlvcDMzMV9zdGRfZGVzYykpOworCWVhcmx5X3NlcmlhbF9zZXR1cCgmaW9wMzMxX3NlcmlhbF9wb3J0c1swXSk7CisJZWFybHlfc2VyaWFsX3NldHVwKCZpb3AzMzFfc2VyaWFsX3BvcnRzWzFdKTsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX0lPUDMzMQorZXh0ZXJuIHZvaWQgaW9wMzMxX2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgaW9wMzMxX3RpbWVyOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9JUTgwMzMxCitleHRlcm4gdm9pZCBpcTgwMzMxX21hcF9pbyh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfSVE4MDMzMgorZXh0ZXJuIHZvaWQgaXE4MDMzMl9tYXBfaW8odm9pZCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVE4MDMzMSkKK01BQ0hJTkVfU1RBUlQoSVE4MDMzMSwgIkludGVsIElRODAzMzEiKQorICAgIE1BSU5UQUlORVIoIkludGVsIENvcnAuIikKKyAgICBCT09UX01FTShQSFlTX09GRlNFVCwgMHhmZWZmZjAwMCwgMHhmZmZmZjAwMCkgLy8gdmlydHVhbCwgcGh5c2ljYWwKKyAgICAvL0JPT1RfTUVNKFBIWVNfT0ZGU0VULCBJT1AzMzFfVUFSVDBfVklSVCwgSU9QMzMxX1VBUlQwX1BIWVMpCisgICAgTUFQSU8oaXE4MDMzMV9tYXBfaW8pCisgICAgSU5JVElSUShpb3AzMzFfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZpb3AzMzFfdGltZXIsCisgICAgQk9PVF9QQVJBTVMoMHgwMTAwKQorCUlOSVRfTUFDSElORShpb3AzM3hfaW5pdCkKK01BQ0hJTkVfRU5ECisKKyNlbGlmIGRlZmluZWQoQ09ORklHX01BQ0hfSVE4MDMzMikKK01BQ0hJTkVfU1RBUlQoSVE4MDMzMiwgIkludGVsIElRODAzMzIiKQorICAgIE1BSU5UQUlORVIoIkludGVsIENvcnAuIikKKyAgICBCT09UX01FTShQSFlTX09GRlNFVCwgMHhmZWZmZjAwMCwgMHhmZmZmZjAwMCkgLy8gdmlydHVhbCwgcGh5c2ljYWwKKyAgICAvL0JPT1RfTUVNKFBIWVNfT0ZGU0VULCBJT1AzMzFfVUFSVDBfVklSVCwgSU9QMzMxX1VBUlQwX1BIWVMpCisgICAgTUFQSU8oaXE4MDMzMl9tYXBfaW8pCisgICAgSU5JVElSUShpb3AzMzFfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZpb3AzMzFfdGltZXIsCisgICAgQk9PVF9QQVJBTVMoMHgwMTAwKQorCUlOSVRfTUFDSElORShpb3AzM3hfaW5pdCkKK01BQ0hJTkVfRU5ECisKKyNlbHNlCisjZXJyb3IgTm8gbWFjaGluZSBkZXNjcmlwdG9yIGRlZmluZWQgZm9yIHRoaXMgSU9QM1hYIGltcGxlbWVudGF0aW9uCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDE2OTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS10aW1lLmMKKyAqCisgKiBUaW1lciBjb2RlIGZvciBJT1AzMzEgYmFzZWQgc3lzdGVtcworICoKKyAqIEF1dGhvcjogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0BpbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDMgSW50ZWwgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfZWxhcHNlZCh2b2lkKQoreworCXJldHVybiBMQVRDSCAtICpJT1AzMzFfVFVfVENSMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9wMzMxX2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGVsYXBzZWQsIHVzZWM7CisJdTMyIHRpc3IxLCB0aXNyMjsKKworCS8qCisJICogSWYgYW4gaW50ZXJydXB0IHdhcyBwZW5kaW5nIGJlZm9yZSB3ZSByZWFkIHRoZSB0aW1lciwKKwkgKiB3ZSd2ZSBhbHJlYWR5IHdyYXBwZWQuICBGYWN0b3IgdGhpcyBpbnRvIHRoZSB0aW1lLgorCSAqIElmIGFuIGludGVycnVwdCB3YXMgcGVuZGluZyBhZnRlciB3ZSByZWFkIHRoZSB0aW1lciwKKwkgKiBpdCBtYXkgaGF2ZSB3cmFwcGVkIGJldHdlZW4gY2hlY2tpbmcgdGhlIGludGVycnVwdAorCSAqIHN0YXR1cyBhbmQgcmVhZGluZyB0aGUgdGltZXIuICBSZS1yZWFkIHRoZSB0aW1lciB0bworCSAqIGJlIHN1cmUgaXRzIHZhbHVlIGlzIGFmdGVyIHRoZSB3cmFwLgorCSAqLworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjNiwgYzEsIDAiIDogIj1yIiAodGlzcjEpKTsKKwllbGFwc2VkID0gZ2V0X2VsYXBzZWQoKTsKKwlhc20gdm9sYXRpbGUoIm1yYyBwNiwgMCwgJTAsIGM2LCBjMSwgMCIgOiAiPXIiICh0aXNyMikpOworCisJaWYodGlzcjEgJiAxKQorCQllbGFwc2VkICs9IExBVENIOworCWVsc2UgaWYgKHRpc3IyICYgMSkKKwkJZWxhcHNlZCA9IExBVENIICsgZ2V0X2VsYXBzZWQoKTsKKworCS8qCisJICogTm93IGNvbnZlcnQgdGhlbSB0byB1c2VjLgorCSAqLworCXVzZWMgPSAodW5zaWduZWQgbG9uZykoZWxhcHNlZCAqICh0aWNrX25zZWMgLyAxMDAwKSkgLyBMQVRDSDsKKworCXJldHVybiB1c2VjOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2lvcDMzMV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgdGlzcjsKKworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjNiwgYzEsIDAiIDogIj1yIiAodGlzcikpOworCXRpc3IgfD0gMTsKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGM2LCBjMSwgMCIgOiA6ICJyIiAodGlzcikpOworCisJdGltZXJfdGljayhyZWdzKTsKKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpb3AzMzFfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJJT1AzMzEgVGltZXIgVGljayIsCisJLmhhbmRsZXIJPSBpb3AzMzFfdGltZXJfaW50ZXJydXB0LAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpb3AzMzFfdGltZXJfaW5pdCh2b2lkKQoreworCXUzMiB0aW1lcl9jdGw7CisKKwlzZXR1cF9pcnEoSVJRX0lPUDMzMV9USU1FUjAsICZpb3AzMzFfdGltZXJfaXJxKTsKKworCXRpbWVyX2N0bCA9IElPUDMzMV9UTVJfRU4gfCBJT1AzMzFfVE1SX1BSSVZJTEVHRUQgfCBJT1AzMzFfVE1SX1JFTE9BRCB8CisJCQlJT1AzMzFfVE1SX1JBVElPXzFfMTsKKworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzQsIGMxLCAwIiA6IDogInIiIChMQVRDSCkpOworCisJYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjMCwgYzEsIDAiCTogOiAiciIgKHRpbWVyX2N0bCkpOworCit9CisKK3N0cnVjdCBzeXNfdGltZXIgaW9wMzMxX3RpbWVyID0geworCS5pbml0CQk9IGlvcDMzMV90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gaW9wMzMxX2dldHRpbWVvZmZzZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXEzMTI0NC1tbS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXEzMTI0NC1tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTA0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTMxMjQ0LW1tLmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtaW9wM3h4L21tLmMKKyAqCisgKiBMb3cgbGV2ZWwgbWVtb3J5IGluaXRpYWxpemF0aW9uIGZvciBpcTgwMzIxIHBsYXRmb3JtCisgKgorICogQXV0aG9yOiBSb3J5IEJvbHQgPHJvcnlib2x0QHBhY2JlbGwubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvcnkgQm9sdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKworLyoKKyAqIElRODAzMjEgc3BlY2lmaWMgSU8gbWFwcGluZ3MKKyAqCisgKiBXZSB1c2UgUmVkQm9vdCdzIHNldHVwIGZvciB0aGUgb25ib2FyZCBkZXZpY2VzLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGlxMzEyNDRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgLyogdmlydHVhbCAgICAgcGh5c2ljYWwgICAgICBsZW5ndGggICAgICAgIHR5cGUgKi8KKworIC8qIG9uLWJvYXJkIGRldmljZXMgKi8KKyB7IElRMzEyNDRfVUFSVCwgSVEzMTI0NF9VQVJULCAgIDB4MDAxMDAwMDAsICAgTVRfREVWSUNFIH0KK307CisKK3ZvaWQgX19pbml0IGlxMzEyNDRfbWFwX2lvKHZvaWQpCit7CisJaW9wMzIxX21hcF9pbygpOworCisJaW90YWJsZV9pbml0KGlxMzEyNDRfaW9fZGVzYywgQVJSQVlfU0laRShpcTMxMjQ0X2lvX2Rlc2MpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxMzEyNDQtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTMxMjQ0LXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTdkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTMxMjQ0LXBjaS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXE4MDMyMS1wY2kuYworICoKKyAqIFBDSSBzdXBwb3J0IGZvciB0aGUgSW50ZWwgSVE4MDMyMSByZWZlcmVuY2UgYm9hcmQKKyAqCisgKiBBdXRob3I6IFJvcnkgQm9sdCA8cm9yeWJvbHRAcGFjYmVsbC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9yeSBCb2x0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHVzZWQgdG8gbG9va3VwIGlycXMgaW4gYSBzdGFuZGFyZCB0YWJsZQorICogZm9ybWF0IGZvciB0aG9zZSBzeXN0ZW1zIHRoYXQgZG8gbm90IGFscmVhZHkgaGF2ZSBQQ0kKKyAqIGludGVycnVwdHMgcHJvcGVybHkgcm91dGVkLiAgV2UgYXNzdW1lIDEgPD0gcGluIDw9IDQKKyAqLworI2RlZmluZSBQQ0lfSVJRX1RBQkxFX0xPT0tVUChtaW5pZCxtYXhpZCkJXAorKHsgaW50IF9jdGxfID0gLTE7CQkJCVwKKyAgIHVuc2lnbmVkIGludCBfaWRzZWwgPSBpZHNlbCAtIG1pbmlkOwkJXAorICAgaWYgKF9pZHNlbCA8PSBtYXhpZCkJCQkJXAorICAgICAgX2N0bF8gPSBwY2lfaXJxX3RhYmxlW19pZHNlbF1bcGluLTFdOwlcCisgICBfY3RsXzsgfSkKKworI2RlZmluZSBJTlRBCUlSUV9JUTMxMjQ0X0lOVEEKKyNkZWZpbmUgSU5UQglJUlFfSVEzMTI0NF9JTlRCCisjZGVmaW5lIElOVEMJSVJRX0lRMzEyNDRfSU5UQworI2RlZmluZSBJTlRECUlSUV9JUTMxMjQ0X0lOVEQKKworI2RlZmluZSBJTlRFCUlSUV9JUTMxMjQ0X0k4MjU0NgorCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQKK2lxMzEyNDRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwgdTggcGluKQoreworCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtdWzRdID0geworCQkvKgorCQkgKiBQQ0kgSURTRUwvSU5UUElOLT5JTlRMSU5FCisJCSAqIEEgICAgICAgQiAgICAgICBDICAgICAgIEQKKwkJICovCisjaWZkZWYgQ09ORklHX0FSQ0hfRVA4MDIxOQorCQl7SU5UQiwgSU5UQiwgSU5UQiwgSU5UQn0sIC8qIENGbGFzaCAqLworCQl7SU5URSwgSU5URSwgSU5URSwgSU5URX0sIC8qIDgyNTUxIFBybyAxMDAgKi8KKwkJe0lOVEQsIElOVEQsIElOVEQsIElOVER9LCAvKiBQQ0ktWCBTbG90ICovCisJCXtJTlRDLCBJTlRDLCBJTlRDLCBJTlRDfSwgLyogU0FUQSAgICovCisjZWxzZQorCQl7SU5UQiwgSU5UQiwgSU5UQiwgSU5UQn0sIC8qIENGbGFzaCAqLworCQl7SU5UQywgSU5UQywgSU5UQywgSU5UQ30sIC8qIFNBVEEgICAqLworCQl7SU5URCwgSU5URCwgSU5URCwgSU5URH0sIC8qIFBDSS1YIFNsb3QgKi8KKwkJe0lOVEUsIElOVEUsIElOVEUsIElOVEV9LCAvKiA4MjU0NiBHaWdFICovCisjZW5kaWYgLy8gQ09ORklHX0FSQ0hfRVA4MDIxOQorCX07CisKKwlCVUdfT04ocGluIDwgMSB8fCBwaW4gPiA0KTsKKworCXJldHVybiBQQ0lfSVJRX1RBQkxFX0xPT0tVUCgwLCA3KTsKK30KKworc3RhdGljIGludCBpcTMxMjQ0X3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYobnIgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXMpCisJCXBhbmljKCJQQ0k6IHVuYWJsZSB0byBhbGxvYyByZXNvdXJjZXMiKTsKKworCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogMik7CisKKwlyZXNbMF0uc3RhcnQgPSBJT1AzMjFfUENJX0xPV0VSX0lPX1ZBOworCXJlc1swXS5lbmQgICA9IElPUDMyMV9QQ0lfVVBQRVJfSU9fVkE7CisJcmVzWzBdLm5hbWUgID0gIklRMzEyNDQgUENJIEkvTyBTcGFjZSI7CisJcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKworCXJlc1sxXS5zdGFydCA9IElPUDMyMV9QQ0lfTE9XRVJfTUVNX1BBOworCXJlc1sxXS5lbmQgICA9IElPUDMyMV9QQ0lfVVBQRVJfTUVNX1BBOworCXJlc1sxXS5uYW1lICA9ICJJUTMxMjQ0IFBDSSBNZW1vcnkgU3BhY2UiOworCXJlc1sxXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcmVzWzBdKTsKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnJlc1sxXSk7CisKKwlzeXMtPm1lbV9vZmZzZXQgPSBJT1AzMjFfUENJX01FTV9PRkZTRVQ7CisJc3lzLT5pb19vZmZzZXQgID0gSU9QMzIxX1BDSV9JT19PRkZTRVQ7CisKKwlzeXMtPnJlc291cmNlWzBdID0gJnJlc1swXTsKKwlzeXMtPnJlc291cmNlWzFdID0gJnJlc1sxXTsKKwlzeXMtPnJlc291cmNlWzJdID0gTlVMTDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpcTMxMjQ0X3ByZWluaXQodm9pZCkKK3sKKwlpb3AzMjFfaW5pdCgpOworfQorCitzdGF0aWMgc3RydWN0IGh3X3BjaSBpcTMxMjQ0X3BjaSBfX2luaXRkYXRhID0geworCS5zd2l6emxlCT0gcGNpX3N0ZF9zd2l6emxlLAorCS5ucl9jb250cm9sbGVycyA9IDEsCisJLnNldHVwCQk9IGlxMzEyNDRfc2V0dXAsCisJLnNjYW4JCT0gaW9wMzIxX3NjYW5fYnVzLAorCS5wcmVpbml0CT0gaXEzMTI0NF9wcmVpbml0LAorCS5tYXBfaXJxCT0gaXEzMTI0NF9tYXBfaXJxCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcTMxMjQ0X3BjaV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfaXEzMTI0NCgpKQorCQlwY2lfY29tbW9uX2luaXQoJmlxMzEyNDRfcGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKGlxMzEyNDRfcGNpX2luaXQpOworCisKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTgwMzIxLW1tLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTgwMzIxLW1tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4MGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMjEtbW0uYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1pb3AzeHgvbW0uYworICoKKyAqIExvdyBsZXZlbCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gZm9yIGlxODAzMjEgcGxhdGZvcm0KKyAqCisgKiBBdXRob3I6IFJvcnkgQm9sdCA8cm9yeWJvbHRAcGFjYmVsbC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9yeSBCb2x0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworCisvKgorICogSVE4MDMyMSBzcGVjaWZpYyBJTyBtYXBwaW5ncworICoKKyAqIFdlIHVzZSBSZWRCb290J3Mgc2V0dXAgZm9yIHRoZSBvbmJvYXJkIGRldmljZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaXE4MDMyMV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICAgIGxlbmd0aCAgICAgICAgdHlwZSAqLworCisgLyogb24tYm9hcmQgZGV2aWNlcyAqLworIHsgSVE4MDMyMV9VQVJULCBJUTgwMzIxX1VBUlQsICAgMHgwMDEwMDAwMCwgICBNVF9ERVZJQ0UgfQorfTsKKwordm9pZCBfX2luaXQgaXE4MDMyMV9tYXBfaW8odm9pZCkKK3sKKwlpb3AzMjFfbWFwX2lvKCk7CisKKwlpb3RhYmxlX2luaXQoaXE4MDMyMV9pb19kZXNjLCBBUlJBWV9TSVpFKGlxODAzMjFfaW9fZGVzYykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXE4MDMyMS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMjEtcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmZWEzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMjEtcGNpLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWlvcDN4eC9pcTgwMzIxLXBjaS5jCisgKgorICogUENJIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCBJUTgwMzIxIHJlZmVyZW5jZSBib2FyZAorICoKKyAqIEF1dGhvcjogUm9yeSBCb2x0IDxyb3J5Ym9sdEBwYWNiZWxsLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb3J5IEJvbHQKKyAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCB0byBsb29rdXAgaXJxcyBpbiBhIHN0YW5kYXJkIHRhYmxlCisgKiBmb3JtYXQgZm9yIHRob3NlIHN5c3RlbXMgdGhhdCBkbyBub3QgYWxyZWFkeSBoYXZlIFBDSQorICogaW50ZXJydXB0cyBwcm9wZXJseSByb3V0ZWQuICBXZSBhc3N1bWUgMSA8PSBwaW4gPD0gNAorICovCisjZGVmaW5lIFBDSV9JUlFfVEFCTEVfTE9PS1VQKG1pbmlkLG1heGlkKQlcCisoeyBpbnQgX2N0bF8gPSAtMTsJCQkJXAorICAgdW5zaWduZWQgaW50IF9pZHNlbCA9IGlkc2VsIC0gbWluaWQ7CQlcCisgICBpZiAoX2lkc2VsIDw9IG1heGlkKQkJCQlcCisgICAgICBfY3RsXyA9IHBjaV9pcnFfdGFibGVbX2lkc2VsXVtwaW4tMV07CVwKKyAgIF9jdGxfOyB9KQorCisjZGVmaW5lIElOVEEJSVJRX0lRODAzMjFfSU5UQQorI2RlZmluZSBJTlRCCUlSUV9JUTgwMzIxX0lOVEIKKyNkZWZpbmUgSU5UQwlJUlFfSVE4MDMyMV9JTlRDCisjZGVmaW5lIElOVEQJSVJRX0lRODAzMjFfSU5URAorCisjZGVmaW5lIElOVEUJSVJRX0lRODAzMjFfSTgyNTQ0CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faW5pdAoraXE4MDMyMV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCit7CisJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW11bNF0gPSB7CisJCS8qCisJCSAqIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKKwkJICogQSAgICAgICBCICAgICAgIEMgICAgICAgRAorCQkgKi8KKwkJe0lOVEUsIElOVEUsIElOVEUsIElOVEV9LCAvKiBHaWctRSAqLworCQl7LTEsIC0xLCAtMSwgLTF9LCAJICAvKiBVbnVzZWQgKi8KKwkJe0lOVEMsIElOVEQsIElOVEEsIElOVEJ9LCAvKiBQQ0ktWCBTbG90ICovCisJCXstMSwgLTEsIC0xLCAtMX0sCisJfTsKKworCUJVR19PTihwaW4gPCAxIHx8IHBpbiA+IDQpOworCisvLwlyZXR1cm4gUENJX0lSUV9UQUJMRV9MT09LVVAoNCwgNyk7CisJcmV0dXJuIHBjaV9pcnFfdGFibGVbaWRzZWwlNF1bcGluLTFdOworfQorCitzdGF0aWMgaW50IGlxODAzMjFfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlpZihuciAhPSAwKQorCQlyZXR1cm4gMDsKKworCXJlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcykKKwkJcGFuaWMoIlBDSTogdW5hYmxlIHRvIGFsbG9jIHJlc291cmNlcyIpOworCisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiAyKTsKKworCXJlc1swXS5zdGFydCA9IElPUDMyMV9QQ0lfTE9XRVJfSU9fVkE7CisJcmVzWzBdLmVuZCAgID0gSU9QMzIxX1BDSV9VUFBFUl9JT19WQTsKKwlyZXNbMF0ubmFtZSAgPSAiSVE4MDMyMSBQQ0kgSS9PIFNwYWNlIjsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCisJcmVzWzFdLnN0YXJ0ID0gSU9QMzIxX1BDSV9MT1dFUl9NRU1fUEE7CisJcmVzWzFdLmVuZCAgID0gSU9QMzIxX1BDSV9VUFBFUl9NRU1fUEE7CisJcmVzWzFdLm5hbWUgID0gIklRODAzMjEgUENJIE1lbW9yeSBTcGFjZSI7CisJcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZyZXNbMF0pOworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcmVzWzFdKTsKKworCXN5cy0+bWVtX29mZnNldCA9IElPUDMyMV9QQ0lfTUVNX09GRlNFVDsKKwlzeXMtPmlvX29mZnNldCAgPSBJT1AzMjFfUENJX0lPX09GRlNFVDsKKworCXN5cy0+cmVzb3VyY2VbMF0gPSAmcmVzWzBdOworCXN5cy0+cmVzb3VyY2VbMV0gPSAmcmVzWzFdOworCXN5cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGlxODAzMjFfcHJlaW5pdCh2b2lkKQoreworCWlvcDMyMV9pbml0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcGNpIGlxODAzMjFfcGNpIF9faW5pdGRhdGEgPSB7CisJLnN3aXp6bGUJPSBwY2lfc3RkX3N3aXp6bGUsCisJLm5yX2NvbnRyb2xsZXJzID0gMSwKKwkuc2V0dXAJCT0gaXE4MDMyMV9zZXR1cCwKKwkuc2NhbgkJPSBpb3AzMjFfc2Nhbl9idXMsCisJLnByZWluaXQJPSBpcTgwMzIxX3ByZWluaXQsCisJLm1hcF9pcnEJPSBpcTgwMzIxX21hcF9pcnEKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlxODAzMjFfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19pcTgwMzIxKCkpCisJCXBjaV9jb21tb25faW5pdCgmaXE4MDMyMV9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaXE4MDMyMV9wY2lfaW5pdCk7CisKKworCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMzEtbW0uYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMzEtbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZThjMzMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXE4MDMzMS1tbS5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWlvcDN4eC9tbS5jCisgKgorICogTG93IGxldmVsIG1lbW9yeSBpbml0aWFsaXphdGlvbiBmb3IgaXE4MDMzMSBwbGF0Zm9ybQorICoKKyAqIEF1dGhvcjogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0BpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgSW50ZWwgQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisKKy8qCisgKiBJUTgwMzMxIHNwZWNpZmljIElPIG1hcHBpbmdzCisgKgorICogV2UgdXNlIFJlZEJvb3QncyBzZXR1cCBmb3IgdGhlIG9uYm9hcmQgZGV2aWNlcy4KKyAqLworCit2b2lkIF9faW5pdCBpcTgwMzMxX21hcF9pbyh2b2lkKQoreworCWlvcDMzMV9tYXBfaW8oKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMzEtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTgwMzMxLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2EwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTgwMzMxLXBjaS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXE4MDMzMS1wY2kuYworICoKKyAqIFBDSSBzdXBwb3J0IGZvciB0aGUgSW50ZWwgSVE4MDMzMSByZWZlcmVuY2UgYm9hcmQKKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IEludGVsIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIHRvIGxvb2t1cCBpcnFzIGluIGEgc3RhbmRhcmQgdGFibGUKKyAqIGZvcm1hdCBmb3IgdGhvc2Ugc3lzdGVtcyB0aGF0IGRvIG5vdCBhbHJlYWR5IGhhdmUgUENJCisgKiBpbnRlcnJ1cHRzIHByb3Blcmx5IHJvdXRlZC4gIFdlIGFzc3VtZSAxIDw9IHBpbiA8PSA0CisgKi8KKyNkZWZpbmUgUENJX0lSUV9UQUJMRV9MT09LVVAobWluaWQsbWF4aWQpCVwKKyh7IGludCBfY3RsXyA9IC0xOwkJCQlcCisgICB1bnNpZ25lZCBpbnQgX2lkc2VsID0gaWRzZWwgLSBtaW5pZDsJCVwKKyAgIGlmIChfaWRzZWwgPD0gbWF4aWQpCQkJCVwKKyAgICAgIF9jdGxfID0gcGNpX2lycV90YWJsZVtfaWRzZWxdW3Bpbi0xXTsJXAorICAgX2N0bF87IH0pCisKKyNkZWZpbmUgSU5UQQlJUlFfSVE4MDMzMV9JTlRBCisjZGVmaW5lIElOVEIJSVJRX0lRODAzMzFfSU5UQgorI2RlZmluZSBJTlRDCUlSUV9JUTgwMzMxX0lOVEMKKyNkZWZpbmUgSU5URAlJUlFfSVE4MDMzMV9JTlRECisKKy8vI2RlZmluZSBJTlRFCUlSUV9JUTgwMzMxX0k4MjU0NAorCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQKK2lxODAzMzFfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwgdTggcGluKQoreworCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtdWzRdID0geworCQkvKgorCQkgKiBQQ0kgSURTRUwvSU5UUElOLT5JTlRMSU5FCisJCSAqIEEgICAgICAgQiAgICAgICBDICAgICAgIEQKKwkJICovCisJCXtJTlRCLCBJTlRDLCBJTlRELCBJTlRBfSwgLyogUENJLVggU2xvdCAqLworCQl7SU5UQywgSU5UQywgSU5UQywgSU5UQ30sIC8qIEdpZ0UgICovCisJfTsKKworCUJVR19PTihwaW4gPCAxIHx8IHBpbiA+IDQpOworCisJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQKDEsIDcpOworfQorCitzdGF0aWMgaW50IGlxODAzMzFfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlpZihuciAhPSAwKQorCQlyZXR1cm4gMDsKKworCXJlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcykKKwkJcGFuaWMoIlBDSTogdW5hYmxlIHRvIGFsbG9jIHJlc291cmNlcyIpOworCisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiAyKTsKKworCXJlc1swXS5zdGFydCA9IElPUDMzMV9QQ0lfTE9XRVJfSU9fVkE7CisJcmVzWzBdLmVuZCAgID0gSU9QMzMxX1BDSV9VUFBFUl9JT19WQTsKKwlyZXNbMF0ubmFtZSAgPSAiSVE4MDMzMSBQQ0kgSS9PIFNwYWNlIjsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCisJcmVzWzFdLnN0YXJ0ID0gSU9QMzMxX1BDSV9MT1dFUl9NRU1fUEE7CisJcmVzWzFdLmVuZCAgID0gSU9QMzMxX1BDSV9VUFBFUl9NRU1fUEE7CisJcmVzWzFdLm5hbWUgID0gIklRODAzMzEgUENJIE1lbW9yeSBTcGFjZSI7CisJcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZyZXNbMF0pOworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcmVzWzFdKTsKKworCXN5cy0+bWVtX29mZnNldCA9IElPUDMzMV9QQ0lfTUVNX09GRlNFVDsKKwlzeXMtPmlvX29mZnNldCAgPSBJT1AzMzFfUENJX0lPX09GRlNFVDsKKworCXN5cy0+cmVzb3VyY2VbMF0gPSAmcmVzWzBdOworCXN5cy0+cmVzb3VyY2VbMV0gPSAmcmVzWzFdOworCXN5cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGlxODAzMzFfcHJlaW5pdCh2b2lkKQoreworCWlvcDMzMV9pbml0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcGNpIGlxODAzMzFfcGNpIF9faW5pdGRhdGEgPSB7CisJLnN3aXp6bGUJPSBwY2lfc3RkX3N3aXp6bGUsCisJLm5yX2NvbnRyb2xsZXJzID0gMSwKKwkuc2V0dXAJCT0gaXE4MDMzMV9zZXR1cCwKKwkuc2NhbgkJPSBpb3AzMzFfc2Nhbl9idXMsCisJLnByZWluaXQJPSBpcTgwMzMxX3ByZWluaXQsCisJLm1hcF9pcnEJPSBpcTgwMzMxX21hcF9pcnEKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlxODAzMzFfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19pcTgwMzMxKCkpCisJCXBjaV9jb21tb25faW5pdCgmaXE4MDMzMV9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaXE4MDMzMV9wY2lfaW5pdCk7CisKKworCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMzItbW0uYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMzItbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRhZmNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXE4MDMzMi1tbS5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWlvcDN4eC9tbS5jCisgKgorICogTG93IGxldmVsIG1lbW9yeSBpbml0aWFsaXphdGlvbiBmb3IgaXE4MDMzMiBwbGF0Zm9ybQorICoKKyAqIEF1dGhvcjogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0BpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisKKy8qCisgKiBJUTgwMzMyIHNwZWNpZmljIElPIG1hcHBpbmdzCisgKgorICogV2UgdXNlIFJlZEJvb3QncyBzZXR1cCBmb3IgdGhlIG9uYm9hcmQgZGV2aWNlcy4KKyAqLworCit2b2lkIF9faW5pdCBpcTgwMzMyX21hcF9pbyh2b2lkKQoreworCWlvcDMzMV9tYXBfaW8oKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lxODAzMzItcGNpLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTgwMzMyLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODA3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pcTgwMzMyLXBjaS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1pb3AzeHgvaXE4MDMzMi1wY2kuYworICoKKyAqIFBDSSBzdXBwb3J0IGZvciB0aGUgSW50ZWwgSVE4MDMzMiByZWZlcmVuY2UgYm9hcmQKKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIHRvIGxvb2t1cCBpcnFzIGluIGEgc3RhbmRhcmQgdGFibGUKKyAqIGZvcm1hdCBmb3IgdGhvc2Ugc3lzdGVtcyB0aGF0IGRvIG5vdCBhbHJlYWR5IGhhdmUgUENJCisgKiBpbnRlcnJ1cHRzIHByb3Blcmx5IHJvdXRlZC4gIFdlIGFzc3VtZSAxIDw9IHBpbiA8PSA0CisgKi8KKyNkZWZpbmUgUENJX0lSUV9UQUJMRV9MT09LVVAobWluaWQsbWF4aWQpCVwKKyh7IGludCBfY3RsXyA9IC0xOwkJCQlcCisgICB1bnNpZ25lZCBpbnQgX2lkc2VsID0gaWRzZWwgLSBtaW5pZDsJCVwKKyAgIGlmIChfaWRzZWwgPD0gbWF4aWQpCQkJCVwKKyAgICAgIF9jdGxfID0gcGNpX2lycV90YWJsZVtfaWRzZWxdW3Bpbi0xXTsJXAorICAgX2N0bF87IH0pCisKKyNkZWZpbmUgSU5UQQlJUlFfSVE4MDMzMl9JTlRBCisjZGVmaW5lIElOVEIJSVJRX0lRODAzMzJfSU5UQgorI2RlZmluZSBJTlRDCUlSUV9JUTgwMzMyX0lOVEMKKyNkZWZpbmUgSU5URAlJUlFfSVE4MDMzMl9JTlRECisKKy8vI2RlZmluZSBJTlRFCUlSUV9JUTgwMzMyX0k4MjU0NAorCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQKK2lxODAzMzJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwgdTggcGluKQoreworCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtdWzhdID0geworCQkvKgorCQkgKiBQQ0kgSURTRUwvSU5UUElOLT5JTlRMSU5FCisJCSAqIEEgICAgICAgQiAgICAgICBDICAgICAgIEQKKwkJICovCisJCXstMSwgICAtMSwgICAtMSwgICAtMX0sCisJCXstMSwgICAtMSwgICAtMSwgICAtMX0sCisJCXstMSwgICAtMSwgICAtMSwgICAtMX0sCisJCXtJTlRBLCBJTlRCLCBJTlRDLCBJTlREfSwgLyogUENJLVggU2xvdCAqLworCQl7LTEsICAgLTEsICAgLTEsICAgLTF9LAorCQl7SU5UQywgSU5UQywgSU5UQywgSU5UQ30sIC8qIEdpZ0UgICovCisJCXstMSwgICAtMSwgICAtMSwgICAtMX0sCisJCXstMSwgICAtMSwgICAtMSwgICAtMX0sCisJfTsKKworCUJVR19PTihwaW4gPCAxIHx8IHBpbiA+IDQpOworCisJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQKDEsIDcpOworfQorCitzdGF0aWMgaW50IGlxODAzMzJfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlpZihuciAhPSAwKQorCQlyZXR1cm4gMDsKKworCXJlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcykKKwkJcGFuaWMoIlBDSTogdW5hYmxlIHRvIGFsbG9jIHJlc291cmNlcyIpOworCisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiAyKTsKKworCXJlc1swXS5zdGFydCA9IElPUDMzMV9QQ0lfTE9XRVJfSU9fVkE7CisJcmVzWzBdLmVuZCAgID0gSU9QMzMxX1BDSV9VUFBFUl9JT19WQTsKKwlyZXNbMF0ubmFtZSAgPSAiSVE4MDMzMiBQQ0kgSS9PIFNwYWNlIjsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCisJcmVzWzFdLnN0YXJ0ID0gSU9QMzMxX1BDSV9MT1dFUl9NRU1fUEE7CisJcmVzWzFdLmVuZCAgID0gSU9QMzMxX1BDSV9VUFBFUl9NRU1fUEE7CisJcmVzWzFdLm5hbWUgID0gIklRODAzMzIgUENJIE1lbW9yeSBTcGFjZSI7CisJcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZyZXNbMF0pOworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcmVzWzFdKTsKKworCXN5cy0+bWVtX29mZnNldCA9IElPUDMzMV9QQ0lfTUVNX09GRlNFVDsKKwlzeXMtPmlvX29mZnNldCAgPSBJT1AzMzFfUENJX0lPX09GRlNFVDsKKworCXN5cy0+cmVzb3VyY2VbMF0gPSAmcmVzWzBdOworCXN5cy0+cmVzb3VyY2VbMV0gPSAmcmVzWzFdOworCXN5cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGlxODAzMzJfcHJlaW5pdCh2b2lkKQoreworCWlvcDMzMV9pbml0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcGNpIGlxODAzMzJfcGNpIF9faW5pdGRhdGEgPSB7CisJLnN3aXp6bGUJPSBwY2lfc3RkX3N3aXp6bGUsCisJLm5yX2NvbnRyb2xsZXJzID0gMSwKKwkuc2V0dXAJCT0gaXE4MDMzMl9zZXR1cCwKKwkuc2NhbgkJPSBpb3AzMzFfc2Nhbl9idXMsCisJLnByZWluaXQJPSBpcTgwMzMyX3ByZWluaXQsCisJLm1hcF9pcnEJPSBpcTgwMzMyX21hcF9pcnEKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlxODAzMzJfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19pcTgwMzMyKCkpCisJCXBjaV9jb21tb25faW5pdCgmaXE4MDMzMl9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaXE4MDMzMl9wY2lfaW5pdCk7CisKKworCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2MWUwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9LY29uZmlnCkBAIC0wLDAgKzEsNTkgQEAKKworaWYgQVJDSF9JWFAyMDAwCisKK2NvbmZpZyBBUkNIX1NVUFBPUlRTX0JJR19FTkRJQU4KKwlib29sCisJZGVmYXVsdCB5CisKK21lbnUgIkludGVsIElYUDI0MDAvMjgwMCBJbXBsZW1lbnRhdGlvbiBPcHRpb25zIgorCitjb21tZW50ICJJWFAyNDAwLzI4MDAgUGxhdGZvcm1zIgorCitjb25maWcgQVJDSF9FTlAyNjExCisJYm9vbCAiU3VwcG9ydCBSYWRpc3lzIEVOUC0yNjExIgorCWhlbHAKKwkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZSBSYWRpc3lzCisJICBFTlAyNjExIFBDSSBuZXR3b3JrIHByb2Nlc3NpbmcgY2FyZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKwkgIHRoaXMgY2FyZCwgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL0VOUDI2MTE+LgorCitjb25maWcgQVJDSF9JWERQMjQwMAorCWJvb2wgIlN1cHBvcnQgSW50ZWwgSVhEUDI0MDAiCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlIEludGVsCisJICBJWERQMjQwMCByZWZlcmVuY2UgcGxhdGZvcm0uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisJICB0aGlzIHBsYXRmb3JtLCBzZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9hcm0vSVhQMjAwMD4uCisKK2NvbmZpZyBBUkNIX0lYRFAyODAwCisJYm9vbCAiU3VwcG9ydCBJbnRlbCBJWERQMjgwMCIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgSW50ZWwKKwkgIElYRFAyODAwIHJlZmVyZW5jZSBwbGF0Zm9ybS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKwkgIHRoaXMgcGxhdGZvcm0sIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2FybS9JWFAyMDAwPi4KKworY29uZmlnIEFSQ0hfSVhEUDJYMDAKKwlib29sCisJZGVwZW5kcyBvbiBBUkNIX0lYRFAyNDAwIHx8IEFSQ0hfSVhEUDI4MDAKKwlkZWZhdWx0IHkJCisKK2NvbmZpZyBBUkNIX0lYRFAyNDAxCisJYm9vbCAiU3VwcG9ydCBJbnRlbCBJWERQMjQwMSIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgSW50ZWwKKwkgIElYRFAyNDAxIHJlZmVyZW5jZSBwbGF0Zm9ybS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKwkgIHRoaXMgcGxhdGZvcm0sIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2FybS9JWFAyMDAwPi4KKworY29uZmlnIEFSQ0hfSVhEUDI4MDEKKwlib29sICJTdXBwb3J0IEludGVsIElYRFAyODAxIgorCWhlbHAKKwkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZSBJbnRlbAorCSAgSVhEUDI4MDEgcmVmZXJlbmNlIHBsYXRmb3JtLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgorCSAgdGhpcyBwbGF0Zm9ybSwgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL0lYUDIwMDA+LgorCitjb25maWcgQVJDSF9JWERQMlgwMQorCWJvb2wKKwlkZXBlbmRzIG9uIEFSQ0hfSVhEUDI0MDEgfHwgQVJDSF9JWERQMjgwMQorCWRlZmF1bHQgeQkKKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjEzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKK29iai15CQkJOj0gY29yZS5vIHBjaS5vCitvYmotbQkJCTo9CitvYmotbgkJCTo9CitvYmotCQkJOj0KKworb2JqLSQoQ09ORklHX0FSQ0hfRU5QMjYxMSkJKz0gZW5wMjYxMS5vCitvYmotJChDT05GSUdfQVJDSF9JWERQMjQwMCkJKz0gaXhkcDI0MDAubworb2JqLSQoQ09ORklHX0FSQ0hfSVhEUDI4MDApCSs9IGl4ZHAyODAwLm8KK29iai0kKENPTkZJR19BUkNIX0lYRFAyWDAwKQkrPSBpeGRwMngwMC5vCitvYmotJChDT05GSUdfQVJDSF9JWERQMlgwMSkJKz0gaXhkcDJ4MDEubworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGM1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDMgQEAKKyAgIHpyZWxhZGRyLXkJOj0gMHgwMDAwODAwMAorcGFyYW1zX3BoeXMteQk6PSAweDAwMDAwMTAwCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmM2MzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvbW1vbi5jCisgKgorICogQ29tbW9uIHJvdXRpbmVzIHVzZWQgYnkgYWxsIElYUDI0MDAvMjgwMCBiYXNlZCBwbGF0Zm9ybXMuCisgKgorICogQXV0aG9yOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICoKKyAqIENvcHlyaWdodCAyMDA0IChDKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIAorICoKKyAqIEJhc2VkIG9uIHdvcmsgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgSW50ZWwgQ29ycG9yYXRpb24KKyAqIAorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgCisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl4cDIwMDBfc2xvd3BvcnRfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpeHAyMDAwX3Nsb3dwb3J0X2lycV9mbGFnczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNsb3dwb3J0IGFjY2VzcyByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGl4cDIwMDBfYWNxdWlyZV9zbG93cG9ydChzdHJ1Y3Qgc2xvd3BvcnRfY2ZnICpuZXdfY2ZnLCBzdHJ1Y3Qgc2xvd3BvcnRfY2ZnICpvbGRfY2ZnKQoreworCisJc3Bpbl9sb2NrX2lycXNhdmUoJml4cDIwMDBfc2xvd3BvcnRfbG9jaywgaXhwMjAwMF9zbG93cG9ydF9pcnFfZmxhZ3MpOworCisJb2xkX2NmZy0+Q0NSID0gKklYUDIwMDBfU0xPV1BPUlRfQ0NSOworCW9sZF9jZmctPldUQyA9ICpJWFAyMDAwX1NMT1dQT1JUX1dUQzI7CisJb2xkX2NmZy0+UlRDID0gKklYUDIwMDBfU0xPV1BPUlRfUlRDMjsKKwlvbGRfY2ZnLT5QQ1IgPSAqSVhQMjAwMF9TTE9XUE9SVF9QQ1I7CisJb2xkX2NmZy0+QURDID0gKklYUDIwMDBfU0xPV1BPUlRfQURDOworCisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9TTE9XUE9SVF9DQ1IsIG5ld19jZmctPkNDUik7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9TTE9XUE9SVF9XVEMyLCBuZXdfY2ZnLT5XVEMpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfU0xPV1BPUlRfUlRDMiwgbmV3X2NmZy0+UlRDKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1NMT1dQT1JUX1BDUiwgbmV3X2NmZy0+UENSKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1NMT1dQT1JUX0FEQywgbmV3X2NmZy0+QURDKTsKK30KKwordm9pZCBpeHAyMDAwX3JlbGVhc2Vfc2xvd3BvcnQoc3RydWN0IHNsb3dwb3J0X2NmZyAqb2xkX2NmZykKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1NMT1dQT1JUX0NDUiwgb2xkX2NmZy0+Q0NSKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1NMT1dQT1JUX1dUQzIsIG9sZF9jZmctPldUQyk7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9TTE9XUE9SVF9SVEMyLCBvbGRfY2ZnLT5SVEMpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfU0xPV1BPUlRfUENSLCBvbGRfY2ZnLT5QQ1IpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfU0xPV1BPUlRfQURDLCBvbGRfY2ZnLT5BREMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXhwMjAwMF9zbG93cG9ydF9sb2NrLCAKKwkJCQkJaXhwMjAwMF9zbG93cG9ydF9pcnFfZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hpcCBzcGVjaWZpYyBtYXBwaW5ncyBzaGFyZWQgYnkgYWxsIElYUDIwMDAgc3lzdGVtcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGl4cDIwMDBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbAk9IElYUDIwMDBfQ0FQX1ZJUlRfQkFTRSwKKwkJLnBoeXNpY2FsCT0gSVhQMjAwMF9DQVBfUEhZU19CQVNFLAorCQkubGVuZ3RoCQk9IElYUDIwMDBfQ0FQX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sIHsKKwkJLnZpcnR1YWwJPSBJWFAyMDAwX0lOVENUTF9WSVJUX0JBU0UsCisJCS5waHlzaWNhbAk9IElYUDIwMDBfSU5UQ1RMX1BIWVNfQkFTRSwKKwkJLmxlbmd0aAkJPSBJWFAyMDAwX0lOVENUTF9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LCB7CisJCS52aXJ0dWFsCT0gSVhQMjAwMF9QQ0lfQ1JFR19WSVJUX0JBU0UsCisJCS5waHlzaWNhbAk9IElYUDIwMDBfUENJX0NSRUdfUEhZU19CQVNFLAorCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0NSRUdfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwgeworCQkudmlydHVhbAk9IElYUDIwMDBfUENJX0NTUl9WSVJUX0JBU0UsCisJCS5waHlzaWNhbAk9IElYUDIwMDBfUENJX0NTUl9QSFlTX0JBU0UsCisJCS5sZW5ndGgJCT0gSVhQMjAwMF9QQ0lfQ1NSX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sIHsKKwkJLnZpcnR1YWwJPSBJWFAyMDAwX1BDSV9JT19WSVJUX0JBU0UsCisJCS5waHlzaWNhbAk9IElYUDIwMDBfUENJX0lPX1BIWVNfQkFTRSwKKwkJLmxlbmd0aAkJPSBJWFAyMDAwX1BDSV9JT19TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LCB7CisJCS52aXJ0dWFsCT0gSVhQMjAwMF9QQ0lfQ0ZHMF9WSVJUX0JBU0UsCisJCS5waHlzaWNhbAk9IElYUDIwMDBfUENJX0NGRzBfUEhZU19CQVNFLAorCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0NGRzBfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwgeworCQkudmlydHVhbAk9IElYUDIwMDBfUENJX0NGRzFfVklSVF9CQVNFLAorCQkucGh5c2ljYWwJPSBJWFAyMDAwX1BDSV9DRkcxX1BIWVNfQkFTRSwKKwkJLmxlbmd0aAkJPSBJWFAyMDAwX1BDSV9DRkcxX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9wb3J0IGl4cDIwMDBfc2VyaWFsX3BvcnQgPSB7CisJLm1lbWJhc2UJPSAoY2hhciAqKShJWFAyMDAwX1VBUlRfVklSVF9CQVNFICsgMyksCisJLm1hcGJhc2UJPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFICsgMywKKwkuaXJxCQk9IElSUV9JWFAyMDAwX1VBUlQsCisJLmZsYWdzCQk9IFVQRl9TS0lQX1RFU1QsCisJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkucmVnc2hpZnQJPSAyLAorCS51YXJ0Y2xrCT0gNTAwMDAwMDAsCisJLmxpbmUJCT0gMCwKKwkudHlwZQkJPSBQT1JUX1hTQ0FMRSwKKwkuZmlmb3NpemUJPSAxNgorfTsKKwordm9pZCBfX2luaXQgaXhwMjAwMF9tYXBfaW8odm9pZCkKK3sKKwlleHRlcm4gdW5zaWduZWQgaW50IHByb2Nlc3Nvcl9pZDsKKworCS8qCisJICogT24gSVhQMjQwMCBDUFVzIHdlIG5lZWQgdG8gdXNlIE1UX0lYUDIwMDBfREVWSUNFIGZvcgorCSAqIHR3ZWFraW5nIHRoZSBQTURzIHNvIFhDQj0xMDEuIE9uIElYUDI4MDBzIHdlIHVzZSB0aGUgbm9ybWFsCisJICogUE1EIGZsYWdzLgorCSAqLworCWlmICgocHJvY2Vzc29yX2lkICYgMHhmZmZmZmZmMCkgPT0gMHg2OTA1NDE5MCkgeworCQlpbnQgaTsKKworCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBJWFAyNDAwIGVycmF0dW0gIzY2IHdvcmthcm91bmRcbiIpOworCisJCWZvcihpPTA7aTxBUlJBWV9TSVpFKGl4cDIwMDBfaW9fZGVzYyk7aSsrKQorCQkJaXhwMjAwMF9pb19kZXNjW2ldLnR5cGUgPSBNVF9JWFAyMDAwX0RFVklDRTsKKwl9CisKKwlpb3RhYmxlX2luaXQoaXhwMjAwMF9pb19kZXNjLCBBUlJBWV9TSVpFKGl4cDIwMDBfaW9fZGVzYykpOworCWVhcmx5X3NlcmlhbF9zZXR1cCgmaXhwMjAwMF9zZXJpYWxfcG9ydCk7CisKKwkvKiBTZXQgc2xvd3BvcnQgdG8gOC1iaXQgbW9kZS4gICovCisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9TTE9XUE9SVF9GUk0sIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGltZXItdGljayBmdW5jdGlvbnMgZm9yIElYUDIwMDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIHRpY2tzX3Blcl9qaWZmeTsKK3N0YXRpYyB1bnNpZ25lZCB0aWNrc19wZXJfdXNlYzsKK3N0YXRpYyB1bnNpZ25lZCBuZXh0X2ppZmZ5X3RpbWU7CisKK3Vuc2lnbmVkIGxvbmcgaXhwMjAwMF9nZXR0aW1lb2Zmc2V0ICh2b2lkKQoreworIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCW9mZnNldCA9IG5leHRfamlmZnlfdGltZSAtICpJWFAyMDAwX1Q0X0NTUjsKKworCXJldHVybiBvZmZzZXQgLyB0aWNrc19wZXJfdXNlYzsKK30KKworc3RhdGljIGludCBpeHAyMDAwX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJLyogY2xlYXIgdGltZXIgMSAqLworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfVDFfQ0xSLCAxKTsKKwkKKwl3aGlsZSAoKG5leHRfamlmZnlfdGltZSAtICpJWFAyMDAwX1Q0X0NTUikgPiB0aWNrc19wZXJfamlmZnkpIHsKKwkJdGltZXJfdGljayhyZWdzKTsKKwkJbmV4dF9qaWZmeV90aW1lIC09IHRpY2tzX3Blcl9qaWZmeTsKKwl9CisKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpeHAyMDAwX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiSVhQMjAwMCBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gaXhwMjAwMF90aW1lcl9pbnRlcnJ1cHQKK307CisKK3ZvaWQgX19pbml0IGl4cDIwMDBfaW5pdF90aW1lKHVuc2lnbmVkIGxvbmcgdGlja19yYXRlKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfVDFfQ0xSLCAwKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1Q0X0NMUiwgMCk7CisKKwl0aWNrc19wZXJfamlmZnkgPSAodGlja19yYXRlICsgSFovMikgLyBIWjsKKwl0aWNrc19wZXJfdXNlYyA9IHRpY2tfcmF0ZSAvIDEwMDAwMDA7CisKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1QxX0NMRCwgdGlja3NfcGVyX2ppZmZ5IC0gMSk7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9UMV9DVEwsICgxIDw8IDcpKTsKKworCS8qCisJICogV2UgdXNlIFQ0IGFzIGEgbW9ub3RvbmljIGNvdW50ZXIgdG8gdHJhY2sgbWlzc2VkIGppZmZpZXMKKwkgKi8KKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1Q0X0NMRCwgLTEpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfVDRfQ1RMLCAoMSA8PCA3KSk7CisgCW5leHRfamlmZnlfdGltZSA9IDB4ZmZmZmZmZmY7CisKKwkvKiByZWdpc3RlciBmb3IgaW50ZXJydXB0ICovCisJc2V0dXBfaXJxKElSUV9JWFAyMDAwX1RJTUVSMSwgJml4cDIwMDBfdGltZXJfaXJxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdQSU8gaGVscGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBHUElPX0lSUV9yaXNpbmdfZWRnZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEdQSU9fSVJRX2ZhbGxpbmdfZWRnZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEdQSU9fSVJRX2xldmVsX2xvdzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEdQSU9fSVJRX2xldmVsX2hpZ2g7CisKK3ZvaWQgZ3Bpb19saW5lX2NvbmZpZyhpbnQgbGluZSwgaW50IHN0eWxlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZihzdHlsZSA9PSBHUElPX09VVCkgeworCQkvKiBpZiBpdCdzIGFuIG91dHB1dCwgaXQgYWluJ3QgYW4gaW50ZXJydXB0IGFueW1vcmUgKi8KKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1BEU1IsICgxIDw8IGxpbmUpKTsKKwkJR1BJT19JUlFfZmFsbGluZ19lZGdlICY9IH4oMSA8PCBsaW5lKTsKKwkJR1BJT19JUlFfcmlzaW5nX2VkZ2UgJj0gfigxIDw8IGxpbmUpOworCQlHUElPX0lSUV9sZXZlbF9sb3cgJj0gfigxIDw8IGxpbmUpOworCQlHUElPX0lSUV9sZXZlbF9oaWdoICY9IH4oMSA8PCBsaW5lKTsKKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX0ZFRFIsIEdQSU9fSVJRX2ZhbGxpbmdfZWRnZSk7CisJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19SRURSLCBHUElPX0lSUV9yaXNpbmdfZWRnZSk7CisJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19MU0hSLCBHUElPX0lSUV9sZXZlbF9oaWdoKTsKKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX0xTTFIsIEdQSU9fSVJRX2xldmVsX2xvdyk7CisJCWlycV9kZXNjW2xpbmUrSVJRX0lYUDIwMDBfR1BJTzBdLnZhbGlkID0gMDsKKwl9IGVsc2UgaWYoc3R5bGUgPT0gR1BJT19JTikgeworCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUERDUiwgKDEgPDwgbGluZSkpOworCX0KKwkJCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVJRIGhhbmRsaW5nIElYUDIwMDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaXhwMjAwMF9HUElPX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSAqSVhQMjAwMF9HUElPX0lOU1Q7CisJCSAgIAorCWZvciAoaSA9IDA7IGkgPD0gNzsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiAoMTw8aSkpIHsKKwkJCWRlc2MgPSBpcnFfZGVzYyArIGkgKyBJUlFfSVhQMjAwMF9HUElPMDsKKwkJCWRlc2MtPmhhbmRsZShpICsgSVJRX0lYUDIwMDBfR1BJTzAsIGRlc2MsIHJlZ3MpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpeHAyMDAwX0dQSU9faXJxX21hc2tfYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX0lOQ1IsICgxIDw8IChpcnEgLSBJUlFfSVhQMjAwMF9HUElPMCkpKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fSU5TVCwgKDEgPDwgKGlycSAtIElSUV9JWFAyMDAwX0dQSU8wKSkpOworfQorCitzdGF0aWMgdm9pZCBpeHAyMDAwX0dQSU9faXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fSU5DUiwgKDEgPDwgKGlycSAtIElSUV9JWFAyMDAwX0dQSU8wKSkpOworfQorCitzdGF0aWMgdm9pZCBpeHAyMDAwX0dQSU9faXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19JTlNSLCAoMSA8PCAoaXJxIC0gSVJRX0lYUDIwMDBfR1BJTzApKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHAyMDAwX0dQSU9faXJxX2NoaXAgPSB7CisJLmFjawk9IGl4cDIwMDBfR1BJT19pcnFfbWFza19hY2ssCisJLm1hc2sJPSBpeHAyMDAwX0dQSU9faXJxX21hc2ssCisJLnVubWFzawk9IGl4cDIwMDBfR1BJT19pcnFfdW5tYXNrCit9OworCitzdGF0aWMgdm9pZCBpeHAyMDAwX3BjaV9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcCA9ICpJWFAyMDAwX1BDSV9YU0NBTEVfSU5UX0VOQUJMRTsKKwlpZiAoaXJxID09IElSUV9JWFAyMDAwX1BDSUEpCisJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfUENJX1hTQ0FMRV9JTlRfRU5BQkxFLCAodGVtcCAmIH4oMSA8PCAyNikpKTsKKwllbHNlIGlmIChpcnEgPT0gSVJRX0lYUDIwMDBfUENJQikKKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9QQ0lfWFNDQUxFX0lOVF9FTkFCTEUsICh0ZW1wICYgfigxIDw8IDI3KSkpOworfQorCitzdGF0aWMgdm9pZCBpeHAyMDAwX3BjaV9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wID0gKklYUDIwMDBfUENJX1hTQ0FMRV9JTlRfRU5BQkxFOworCWlmIChpcnEgPT0gSVJRX0lYUDIwMDBfUENJQSkKKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9QQ0lfWFNDQUxFX0lOVF9FTkFCTEUsICh0ZW1wIHwgKDEgPDwgMjYpKSk7CisJZWxzZSBpZiAoaXJxID09IElSUV9JWFAyMDAwX1BDSUIpCisJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfUENJX1hTQ0FMRV9JTlRfRU5BQkxFLCAodGVtcCB8ICgxIDw8IDI3KSkpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwMjAwMF9wY2lfaXJxX2NoaXAgPSB7CisJLmFjawk9IGl4cDIwMDBfcGNpX2lycV9tYXNrLAorCS5tYXNrCT0gaXhwMjAwMF9wY2lfaXJxX21hc2ssCisJLnVubWFzawk9IGl4cDIwMDBfcGNpX2lycV91bm1hc2sKK307CisKK3N0YXRpYyB2b2lkIGl4cDIwMDBfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0lSUV9FTkFCTEVfQ0xSLCAoMSA8PCBpcnEpKTsKK30KKworc3RhdGljIHZvaWQgaXhwMjAwMF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9JUlFfRU5BQkxFX1NFVCwgICgxIDw8IGlycSkpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwMjAwMF9pcnFfY2hpcCA9IHsKKwkuYWNrCT0gaXhwMjAwMF9pcnFfbWFzaywKKwkubWFzawk9IGl4cDIwMDBfaXJxX21hc2ssCisJLnVubWFzawk9IGl4cDIwMDBfaXJxX3VubWFzaworfTsKKwordm9pZCBfX2luaXQgaXhwMjAwMF9pbml0X2lycSh2b2lkKQoreworCWludCBpcnE7CisKKwkvKgorCSAqIE1hc2sgYWxsIHNvdXJjZXMKKwkgKi8KKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0lSUV9FTkFCTEVfQ0xSLCAweGZmZmZmZmZmKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0ZJUV9FTkFCTEVfQ0xSLCAweGZmZmZmZmZmKTsKKworCS8qIGNsZWFyIGFsbCBHUElPIGVkZ2UvbGV2ZWwgZGV0ZWN0cyAqLworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19SRURSLCAwKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fRkVEUiwgMCk7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX0xTSFIsIDApOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19MU0xSLCAwKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fSU5DUiwgLTEpOworCisJLyogY2xlYXIgUENJIGludGVycnVwdCBzb3VyY2VzICovCisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9QQ0lfWFNDQUxFX0lOVF9FTkFCTEUsIDApOworCisJLyoKKwkgKiBDZXJ0YWluIGJpdHMgaW4gdGhlIElSUSBzdGF0dXMgcmVnaXN0ZXIgb2YgdGhlIAorCSAqIElYUDIwMDAgYXJlIHJlc2VydmVkLiBJbnN0ZWFkIG9mIHRyeWluZyB0byBtYXAKKwkgKiB0aGluZ3Mgbm9uIDE6MSBmcm9tIGJpdCBwb3NpdGlvbiB0byBJUlEgbnVtYmVyLAorCSAqIHdlIG1hcmsgdGhlIHJlc2VydmVkIElSUXMgYXMgaW52YWxpZC4gVGhpcyBtYWtlcworCSAqIG91ciBtYXNrL3VubWFzayBjb2RlIG11Y2ggc2ltcGxlci4KKwkgKi8KKwlmb3IgKGlycSA9IElSUV9JWFAyMDAwX1NPRlRfSU5UOyBpcnEgPD0gSVJRX0lYUDIwMDBfVEhEQjM7IGlycSsrKSB7CisJCWlmKCgxIDw8IGlycSkgJiBJWFAyMDAwX1ZBTElEX0lSUV9NQVNLKSB7CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhwMjAwMF9pcnFfY2hpcCk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworCQl9IGVsc2Ugc2V0X2lycV9mbGFncyhpcnEsIDApOworCX0KKwkKKwkvKgorCSAqIEdQSU8gSVJRcyBhcmUgaW52YWxpZCB1bnRpbCBzb21lb25lIHNldHMgdGhlIGludGVycnVwdCBtb2RlCisJICogYnkgY2FsbGluZyBncGlvX2xpbmVfc2V0KCk7CisJICovCisJZm9yIChpcnEgPSBJUlFfSVhQMjAwMF9HUElPMDsgaXJxIDw9IElSUV9JWFAyMDAwX0dQSU83OyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhwMjAwMF9HUElPX2lycV9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIDApOworCX0KKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfSVhQMjAwMF9HUElPLCBpeHAyMDAwX0dQSU9faXJxX2hhbmRsZXIpOworCisJLyoKKwkgKiBFbmFibGUgUENJIGlycXMuICBUaGUgYWN0dWFsIFBDSVtBQl0gZGVjb2RpbmcgaXMgZG9uZSBpbgorCSAqIGVudHJ5LW1hY3JvLlMsIHNvIHdlIGRvbid0IG5lZWQgYSBjaGFpbmVkIGhhbmRsZXIgZm9yIHRoZQorCSAqIFBDSSBpbnRlcnJ1cHQgc291cmNlLgorCSAqLworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfSVJRX0VOQUJMRV9TRVQsICgxIDw8IElSUV9JWFAyMDAwX1BDSSkpOworCWZvciAoaXJxID0gSVJRX0lYUDIwMDBfUENJQTsgaXJxIDw9IElSUV9JWFAyMDAwX1BDSUI7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZpeHAyMDAwX3BjaV9pcnFfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YjM4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYworICoKKyAqIFJhZGlzeXMgRU5QLTI2MTEgc3VwcG9ydC4KKyAqCisgKiBDcmVhdGVkIDIwMDQgYnkgTGVubmVydCBCdXl0ZW5oZWsgZnJvbSB0aGUgaXhkcDJ4MDEgY29kZS4gIFRoZQorICogb3JpZ2luYWwgdmVyc2lvbiBjYXJyaWVzIHRoZSBmb2xsb3dpbmcgbm90aWNlczoKKyAqCisgKiBPcmlnaW5hbCBBdXRob3I6IEFuZHJ6ZWogTWlhbGtvd3NraSA8YW5kcnplai5taWFsa293c2tpQGludGVsLmNvbT4KKyAqIE1haW50YWluZXI6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVOUC0yNjExIHRpbWVyIHRpY2sgY29uZmlndXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX2luaXQgZW5wMjYxMV90aW1lcl9pbml0KHZvaWQpCit7CisJaXhwMjAwMF9pbml0X3RpbWUoNTAgKiAxMDAwICogMTAwMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGVucDI2MTFfdGltZXIgPSB7CisJLmluaXQJCT0gZW5wMjYxMV90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gaXhwMjAwMF9nZXR0aW1lb2Zmc2V0LAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRU5QLTI2MTEgUENJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZW5wMjYxMV9wY2lfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJc3lzLT5tZW1fb2Zmc2V0ID0gMHhlMDAwMDAwMDsKKwlpeHAyMDAwX3BjaV9zZXR1cChuciwgc3lzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVucDI2MTFfcGNpX3ByZWluaXQodm9pZCkKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1BDSV9BRERSX0VYVCwgMHgwMDEwMDAwMCk7CisJaXhwMjAwMF9wY2lfcHJlaW5pdCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBlbnAyNjExX3BjaV92YWxpZF9kZXZpY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCQkJCXVuc2lnbmVkIGludCBkZXZmbikKK3sKKwkvKiBUaGUgODI1NTkgZXRoZXJuZXQgY29udHJvbGxlciBhcHBlYXJzIGF0IGJvdGggUENJOjE6MDowIGFuZAorCSAqIFBDSToxOjI6MCwgc28gbGV0J3MgcHJldGVuZCB0aGUgc2Vjb25kIG9uZSBpc24ndCB0aGVyZS4KKwkgKi8KKwlpZiAoYnVzLT5udW1iZXIgPT0gMHgwMSAmJiBkZXZmbiA9PSAweDEwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGVucDI2MTFfcGNpX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKK3sKKwlpZiAoZW5wMjYxMV9wY2lfdmFsaWRfZGV2aWNlKGJ1cywgZGV2Zm4pKQorCQlyZXR1cm4gaXhwMjAwMF9wY2lfcmVhZF9jb25maWcoYnVzLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbHVlKTsKKworCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Cit9CisKK3N0YXRpYyBpbnQgZW5wMjYxMV9wY2lfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbHVlKQoreworCWlmIChlbnAyNjExX3BjaV92YWxpZF9kZXZpY2UoYnVzLCBkZXZmbikpCisJCXJldHVybiBpeHAyMDAwX3BjaV93cml0ZV9jb25maWcoYnVzLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbHVlKTsKKworCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBlbnAyNjExX3BjaV9vcHMgPSB7CisJLnJlYWQgICA9IGVucDI2MTFfcGNpX3JlYWRfY29uZmlnLAorCS53cml0ZSAgPSBlbnAyNjExX3BjaV93cml0ZV9jb25maWcKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2J1cyAqIF9faW5pdCBlbnAyNjExX3BjaV9zY2FuX2J1cyhpbnQgbnIsCisJCQkJCQlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJcmV0dXJuIHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmZW5wMjYxMV9wY2lfb3BzLCBzeXMpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlbnAyNjExX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpbnQgaXJxOworCisJaWYgKGRldi0+YnVzLT5udW1iZXIgPT0gMCAmJiBQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSAwKSB7CisJCS8qIElYUDI0MDAuICovCisJCWlycSA9IElSUV9JWFAyMDAwX1BDSUE7CisJfSBlbHNlIGlmIChkZXYtPmJ1cy0+bnVtYmVyID09IDAgJiYgUENJX1NMT1QoZGV2LT5kZXZmbikgPT0gMSkgeworCQkvKiAyMTU1NSBub24tdHJhbnNwYXJlbnQgYnJpZGdlLiAgKi8KKwkJaXJxID0gSVJRX0lYUDIwMDBfUENJQjsKKwl9IGVsc2UgaWYgKGRldi0+YnVzLT5udW1iZXIgPT0gMCAmJiBQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSA0KSB7CisJCS8qIFBDSTIwNTBCIHRyYW5zcGFyZW50IGJyaWRnZS4gICovCisJCWlycSA9IC0xOworCX0gZWxzZSBpZiAoZGV2LT5idXMtPm51bWJlciA9PSAxICYmIFBDSV9TTE9UKGRldi0+ZGV2Zm4pID09IDApIHsKKwkJLyogODI1NTkgZXRoZXJuZXQuICAqLworCQlpcnEgPSBJUlFfSVhQMjAwMF9QQ0lBOworCX0gZWxzZSBpZiAoZGV2LT5idXMtPm51bWJlciA9PSAxICYmIFBDSV9TTE9UKGRldi0+ZGV2Zm4pID09IDEpIHsKKwkJLyogU1BJLTMgb3B0aW9uIGJvYXJkLiAgKi8KKwkJaXJxID0gSVJRX0lYUDIwMDBfUENJQjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImVucDI2MTFfcGNpX21hcF9pcnEoKSBjYWxsZWQgZm9yIHVua25vd24gIgorCQkJCSJkZXZpY2UgUENJOiVkOiVkOiVkXG4iLCBkZXYtPmJ1cy0+bnVtYmVyLAorCQkJCVBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhkZXYtPmRldmZuKSk7CisJCWlycSA9IC0xOworCX0KKworCXJldHVybiBpcnE7Cit9CisKK3N0cnVjdCBod19wY2kgZW5wMjYxMV9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMJPSAxLAorCS5zZXR1cAkJPSBlbnAyNjExX3BjaV9zZXR1cCwKKwkucHJlaW5pdAk9IGVucDI2MTFfcGNpX3ByZWluaXQsCisJLnNjYW4JCT0gZW5wMjYxMV9wY2lfc2Nhbl9idXMsCisJLm1hcF9pcnEJPSBlbnAyNjExX3BjaV9tYXBfaXJxLAorfTsKKworaW50IF9faW5pdCBlbnAyNjExX3BjaV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfZW5wMjYxMSgpKQorCQlwY2lfY29tbW9uX2luaXQoJmVucDI2MTFfcGNpKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoZW5wMjYxMV9wY2lfaW5pdCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVOUC0yNjExIE1hY2hpbmUgSW50aWFsaXphdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgZW5wMjYxMV9mbGFzaF9wbGF0Zm9ybV9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBpeHAyMDAwX2ZsYXNoX2RhdGEgZW5wMjYxMV9mbGFzaF9kYXRhID0geworCS5wbGF0Zm9ybV9kYXRhCT0gJmVucDI2MTFfZmxhc2hfcGxhdGZvcm1fZGF0YSwKKwkubnJfYmFua3MJPSAxCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGVucDI2MTFfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IDB4YzQwMDAwMDAsCisJLmVuZAkJPSAweGM0MDAwMDAwICsgMHgwMGZmZmZmZiwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlbnAyNjExX2ZsYXNoID0geworCS5uYW1lCQk9ICJJWFAyMDAwLUZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZW5wMjYxMV9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZlbnAyNjExX2ZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmVucDI2MTFfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmVucDI2MTFfZmxhc2gKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlbnAyNjExX2luaXRfbWFjaGluZSh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGVucDI2MTFfZGV2aWNlcywgQVJSQVlfU0laRShlbnAyNjExX2RldmljZXMpKTsKK30KKworCitNQUNISU5FX1NUQVJUKEVOUDI2MTEsICJSYWRpc3lzIEVOUC0yNjExIFBDSSBuZXR3b3JrIHByb2Nlc3NvciBib2FyZCIpCisJTUFJTlRBSU5FUigiTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+IikKKwlCT09UX01FTSgweDAwMDAwMDAwLCBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLCBJWFAyMDAwX1VBUlRfVklSVF9CQVNFKQorCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCisJTUFQSU8oaXhwMjAwMF9tYXBfaW8pCisJSU5JVElSUShpeHAyMDAwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmZW5wMjYxMV90aW1lciwKKwlJTklUX01BQ0hJTkUoZW5wMjYxMV9pbml0X21hY2hpbmUpCitNQUNISU5FX0VORAorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzZmYyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKKyAqCisgKiBJWERQMjQwMCBwbGF0Zm9ybSBzdXBwb3J0CisgKgorICogT3JpZ2luYWwgQXV0aG9yOiBOYWVlbSBBZnphbCA8bmFlZW0ubS5hZnphbEBpbnRlbC5jb20+CisgKiBNYWludGFpbmVyOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJWERQMjQwMCB0aW1lciB0aWNrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpeGRwMjQwMF90aW1lcl9pbml0KHZvaWQpCit7CisJaW50IG51bWVyYXRvciwgZGVub21pbmF0b3I7CisJaW50IGRlbm9tX2FycmF5W10gPSB7MiwgNCwgOCwgMTYsIDEsIDIsIDQsIDh9OworCisJbnVtZXJhdG9yID0gKCooSVhEUDI0MDBfQ1BMRF9TWVNfQ0xLX00pICYgMHhGRikgKjI7CisJZGVub21pbmF0b3IgPSBkZW5vbV9hcnJheVsoKihJWERQMjQwMF9DUExEX1NZU19DTEtfTikgJiAweDcpXTsKKworCWl4cDIwMDBfaW5pdF90aW1lKCgoMzEyNTAwMCAqIG51bWVyYXRvcikgLyAoZGVub21pbmF0b3IpKSAvIDIpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBpeGRwMjQwMF90aW1lciA9IHsKKwkuaW5pdAkJPSBpeGRwMjQwMF90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gaXhwMjAwMF9nZXR0aW1lb2Zmc2V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElYRFAyNDAwIFBDSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9faW5pdCBpeGRwMjQwMF9wY2lfcHJlaW5pdCh2b2lkKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfUENJX0FERFJfRVhULCAweDAwMTAwMDAwKTsKKwlpeHAyMDAwX3BjaV9wcmVpbml0KCk7Cit9CisKK2ludCBpeGRwMjQwMF9wY2lfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJc3lzLT5tZW1fb2Zmc2V0ID0gMHhlMDAwMDAwMDsKKworCWl4cDIwMDBfcGNpX3NldHVwKG5yLCBzeXMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGl4ZHAyNDAwX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoaXhkcDJ4MDBfbWFzdGVyX25wdSgpKSB7CisKKwkJLyoKKwkJICogUm9vdCBidXMgZGV2aWNlcy4gIFNsYXZlIE5QVSBpcyBvbmx5IG9uZSB3aXRoIGludGVycnVwdC4KKwkJICogRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IHJldHVybiAtMSBiL2Mgbm90aGluZyBlbHNlCisJCSAqIG9uIHRoZSByb290IGJ1cyBoYXMgaW50ZXJydXB0cy4KKwkJICovCisJCWlmKCFkZXYtPmJ1cy0+c2VsZikgeworCQkJaWYoZGV2LT5kZXZmbiA9PSBJWERQMlgwMF9TTEFWRV9OUFVfREVWRk4gKQorCQkJCXJldHVybiBJUlFfSVhEUDI0MDBfSU5HUkVTU19OUFU7CisKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qCisJCSAqIEJyaWRnZSBiZWhpbmQgdGhlIFBNQyBzbG90LgorCQkgKiBOT1RFOiBPbmx5IElOVEEgZnJvbSB0aGUgUE1DIHNsb3QgaXMgcm91dGVkLiBWRVJZIEJBRC4KKwkJICovCisJCWlmKGRldi0+YnVzLT5zZWxmLT5kZXZmbiA9PSBJWERQMlgwMF9QTUNfREVWRk4gJiYKKwkJCWRldi0+YnVzLT5wYXJlbnQtPnNlbGYtPmRldmZuID09IElYRFAyWDAwX1AyUF9ERVZGTiAmJgorCQkJIWRldi0+YnVzLT5wYXJlbnQtPnNlbGYtPmJ1cy0+cGFyZW50KQorCQkJCSAgcmV0dXJuIElSUV9JWERQMjQwMF9QTUM7CisKKwkJLyoKKwkJICogRGV2aWNlIGJlaGluZCB0aGUgZmlyc3QgYnJpZGdlCisJCSAqLworCQlpZihkZXYtPmJ1cy0+c2VsZi0+ZGV2Zm4gPT0gSVhEUDJYMDBfUDJQX0RFVkZOKSB7CisJCQlzd2l0Y2goZGV2LT5kZXZmbikgeworCQkJCWNhc2UgSVhEUDI0MDBfTUFTVEVSX0VORVRfREVWRk46CQorCQkJCQlyZXR1cm4gSVJRX0lYRFAyNDAwX0VORVQ7CQorCQkJCisJCQkJY2FzZSBJWERQMjQwMF9NRURJQV9ERVZGTjoKKwkJCQkJcmV0dXJuIElSUV9JWERQMjQwMF9NRURJQV9QQ0k7CisKKwkJCQljYXNlIElYRFAyNDAwX1NXSVRDSF9GQUJSSUNfREVWRk46CisJCQkJCXJldHVybiBJUlFfSVhEUDI0MDBfU0ZfUENJOworCisJCQkJY2FzZSBJWERQMlgwMF9QTUNfREVWRk46CisJCQkJCXJldHVybiBJUlFfSVhEUDI0MDBfUE1DOworCQkJfQorCQl9CisKKwkJcmV0dXJuIC0xOworCX0gZWxzZSByZXR1cm4gSVJRX0lYUDIwMDBfUENJQjsgLyogU2xhdmUgTklDIGludGVycnVwdCAqLworfQorCisKK3N0YXRpYyB2b2lkIGl4ZHAyNDAwX3BjaV9wb3N0aW5pdCh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlpZiAoaXhkcDJ4MDBfbWFzdGVyX25wdSgpKSB7CisJCWRldiA9IHBjaV9maW5kX3Nsb3QoMSwgSVhEUDI0MDBfU0xBVkVfRU5FVF9ERVZGTik7CisJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCX0gZWxzZSB7CisJCWRldiA9IHBjaV9maW5kX3Nsb3QoMSwgSVhEUDI0MDBfTUFTVEVSX0VORVRfREVWRk4pOworCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKworCQlpeGRwMngwMF9zbGF2ZV9wY2lfcG9zdGluaXQoKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcGNpIGl4ZHAyNDAwX3BjaSBfX2luaXRkYXRhID0geworCS5ucl9jb250cm9sbGVycwk9IDEsCisJLnNldHVwCQk9IGl4ZHAyNDAwX3BjaV9zZXR1cCwKKwkucHJlaW5pdAk9IGl4ZHAyNDAwX3BjaV9wcmVpbml0LAorCS5wb3N0aW5pdAk9IGl4ZHAyNDAwX3BjaV9wb3N0aW5pdCwKKwkuc2NhbgkJPSBpeHAyMDAwX3BjaV9zY2FuX2J1cywKKwkubWFwX2lycQk9IGl4ZHAyNDAwX3BjaV9tYXBfaXJxLAorfTsKKworaW50IF9faW5pdCBpeGRwMjQwMF9wY2lfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX2l4ZHAyNDAwKCkpCisJCXBjaV9jb21tb25faW5pdCgmaXhkcDI0MDBfcGNpKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaXhkcDI0MDBfcGNpX2luaXQpOworCit2b2lkIGl4ZHAyNDAwX2luaXRfaXJxKHZvaWQpCit7CisJaXhkcDJ4MDBfaW5pdF9pcnEoSVhEUDI0MDBfQ1BMRF9JTlRfU1RBVCwgSVhEUDI0MDBfQ1BMRF9JTlRfTUFTSywgSVhEUDI0MDBfTlJfSVJRUyk7Cit9CisKK01BQ0hJTkVfU1RBUlQoSVhEUDI0MDAsICJJbnRlbCBJWERQMjQwMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCisJTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwgSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkKKwlCT09UX1BBUkFNUygweDAwMDAwMTAwKQorCU1BUElPKGl4ZHAyeDAwX21hcF9pbykKKwlJTklUSVJRKGl4ZHAyNDAwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmaXhkcDI0MDBfdGltZXIsCisJSU5JVF9NQUNISU5FKGl4ZHAyeDAwX2luaXRfbWFjaGluZSkKK01BQ0hJTkVfRU5ECisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2ODNhYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKKyAqCisgKiBJWERQMjgwMCBwbGF0Zm9ybSBzdXBwb3J0CisgKgorICogT3JpZ2luYWwgQXV0aG9yOiBKZWZmcmV5IERhbHkgPGplZmZyZXkuZGFseUBpbnRlbC5jb20+CisgKiBNYWludGFpbmVyOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKwordm9pZCBpeGRwMjQwMF9pbml0X2lycSh2b2lkKQoreworCWl4ZHAyeDAwX2luaXRfaXJxKElYRFAyODAwX0NQTERfSU5UX1NUQVQsIElYRFAyODAwX0NQTERfSU5UX01BU0ssIElYRFAyNDAwX05SX0lSUVMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVhEUDI4MDAgdGltZXIgdGljaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpeGRwMjgwMF90aW1lcl9pbml0KHZvaWQpCit7CisJaXhwMjAwMF9pbml0X3RpbWUoNTAwMDAwMDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBpeGRwMjgwMF90aW1lciA9IHsKKwkuaW5pdAkJPSBpeGRwMjgwMF90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gaXhwMjAwMF9nZXR0aW1lb2Zmc2V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElYRFAyODAwIFBDSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9faW5pdCBpeGRwMjgwMF9wY2lfcHJlaW5pdCh2b2lkKQoreworCXByaW50aygiaXhkcDJ4MDBfcGNpX3ByZWluaXQgY2FsbGVkXG4iKTsKKworCSpJWFAyMDAwX1BDSV9BRERSX0VYVCA9ICAweDAwMDBlMDAwOworCisJKklYUDIwMDBfUENJX0RSQU1fQkFTRV9BRERSX01BU0sgPSAoMHg0MDAwMDAwMCAtIDEpICYgfjB4ZmZmZmY7CisJKklYUDIwMDBfUENJX1NSQU1fQkFTRV9BRERSX01BU0sgPSAoMHgyMDAwMDAwIC0gMSkgJiB+MHgzZmZmZjsKKworCWl4cDIwMDBfcGNpX3ByZWluaXQoKTsKK30KKworaW50IGl4ZHAyODAwX3BjaV9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3sKKwlzeXMtPm1lbV9vZmZzZXQgPSAweDAwMDAwMDAwOworCisJaXhwMjAwMF9wY2lfc2V0dXAobnIsIHN5cyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgaXhkcDI4MDBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCWlmIChpeGRwMngwMF9tYXN0ZXJfbnB1KCkpIHsKKworCQkvKgorCQkgKiBSb290IGJ1cyBkZXZpY2VzLiAgU2xhdmUgTlBVIGlzIG9ubHkgb25lIHdpdGggaW50ZXJydXB0LgorCQkgKiBFdmVyeXRoaW5nIGVsc2UsIHdlIGp1c3QgcmV0dXJuIC0xIHdoaWNoIGlzIGludmFsaWQuCisJCSAqLworCQlpZighZGV2LT5idXMtPnNlbGYpIHsKKwkJCWlmKGRldi0+ZGV2Zm4gPT0gSVhEUDJYMDBfU0xBVkVfTlBVX0RFVkZOICkKKwkJCQlyZXR1cm4gSVJRX0lYRFAyODAwX0lOR1JFU1NfTlBVOworCisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKgorCQkgKiBCcmlkZ2UgYmVoaW5kIHRoZSBQTUMgc2xvdC4KKwkJICovCisJCWlmKGRldi0+YnVzLT5zZWxmLT5kZXZmbiA9PSBJWERQMlgwMF9QTUNfREVWRk4gJiYKKwkJCWRldi0+YnVzLT5wYXJlbnQtPnNlbGYtPmRldmZuID09IElYRFAyWDAwX1AyUF9ERVZGTiAmJgorCQkJIWRldi0+YnVzLT5wYXJlbnQtPnNlbGYtPmJ1cy0+cGFyZW50KQorCQkJCSAgcmV0dXJuIElSUV9JWERQMjgwMF9QTUM7CisKKwkJLyoKKwkJICogRGV2aWNlIGJlaGluZCB0aGUgZmlyc3QgYnJpZGdlCisJCSAqLworCQlpZihkZXYtPmJ1cy0+c2VsZi0+ZGV2Zm4gPT0gSVhEUDJYMDBfUDJQX0RFVkZOKSB7CisJCQlzd2l0Y2goZGV2LT5kZXZmbikgeworCQkJCWNhc2UgSVhEUDJYMDBfUE1DX0RFVkZOOgorCQkJCQlyZXR1cm4gSVJRX0lYRFAyODAwX1BNQzsJCisJCQkKKwkJCQljYXNlIElYRFAyODAwX01BU1RFUl9FTkVUX0RFVkZOOgorCQkJCQlyZXR1cm4gSVJRX0lYRFAyODAwX0VHUkVTU19FTkVUOworCisJCQkJY2FzZSBJWERQMjgwMF9TV0lUQ0hfRkFCUklDX0RFVkZOOgorCQkJCQlyZXR1cm4gSVJRX0lYRFAyODAwX0ZBQlJJQzsKKwkJCX0KKwkJfQorCisJCXJldHVybiAtMTsKKwl9IGVsc2UgcmV0dXJuIElSUV9JWFAyMDAwX1BDSUI7IC8qIFNsYXZlIE5JQyBpbnRlcnJ1cHQgKi8KK30KKworc3RhdGljIHZvaWQgaXhkcDI4MDBfcGNpX3Bvc3Rpbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCWlmIChpeGRwMngwMF9tYXN0ZXJfbnB1KCkpIHsKKwkJZGV2ID0gcGNpX2ZpbmRfc2xvdCgxLCBJWERQMjgwMF9TTEFWRV9FTkVUX0RFVkZOKTsKKwkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2ID0gcGNpX2ZpbmRfc2xvdCgxLCBJWERQMjgwMF9NQVNURVJfRU5FVF9ERVZGTik7CisJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCisJCWl4ZHAyeDAwX3NsYXZlX3BjaV9wb3N0aW5pdCgpOworCX0KK30KKworc3RydWN0IGh3X3BjaSBpeGRwMjgwMF9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMJPSAxLAorCS5zZXR1cAkJPSBpeGRwMjgwMF9wY2lfc2V0dXAsCisJLnByZWluaXQJPSBpeGRwMjgwMF9wY2lfcHJlaW5pdCwKKwkucG9zdGluaXQJPSBpeGRwMjgwMF9wY2lfcG9zdGluaXQsCisJLnNjYW4JCT0gaXhwMjAwMF9wY2lfc2Nhbl9idXMsCisJLm1hcF9pcnEJPSBpeGRwMjgwMF9wY2lfbWFwX2lycSwKK307CisKK2ludCBfX2luaXQgaXhkcDI4MDBfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19peGRwMjgwMCgpKQorCQlwY2lfY29tbW9uX2luaXQoJml4ZHAyODAwX3BjaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKGl4ZHAyODAwX3BjaV9pbml0KTsKKwordm9pZCBpeGRwMjgwMF9pbml0X2lycSh2b2lkKQoreworCWl4ZHAyeDAwX2luaXRfaXJxKElYRFAyODAwX0NQTERfSU5UX1NUQVQsIElYRFAyODAwX0NQTERfSU5UX01BU0ssIElYRFAyODAwX05SX0lSUVMpOworfQorCitNQUNISU5FX1NUQVJUKElYRFAyODAwLCAiSW50ZWwgSVhEUDI4MDAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQorCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQorCUJPT1RfTUVNKDB4MDAwMDAwMDAsIElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsIElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpCisJQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKKwlNQVBJTyhpeGRwMngwMF9tYXBfaW8pCisJSU5JVElSUShpeGRwMjgwMF9pbml0X2lycSkKKwkudGltZXIJCT0gJml4ZHAyODAwX3RpbWVyLAorCUlOSVRfTUFDSElORShpeGRwMngwMF9pbml0X21hY2hpbmUpCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzQxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCisgKgorICogQ29kZSBjb21tb24gdG8gSVhEUDI0MDAgYW5kIElYRFAyODAwIHBsYXRmb3Jtcy4KKyAqCisgKiBPcmlnaW5hbCBBdXRob3I6IE5hZWVtIEFmemFsIDxuYWVlbS5tLmFmemFsQGludGVsLmNvbT4KKyAqIE1haW50YWluZXI6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElYRFAyeDAwIElSUSBJbml0aWFsaXphdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYm9hcmRfaXJxX21hc2s7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYm9hcmRfaXJxX3N0YXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZF9pcnFfY291bnQ7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9JWERQMjQwMAorLyoKKyAqIFNsb3dwb3J0IGNvbmZpZ3VyYXRpb24gZm9yIGFjY2Vzc2luZyBDUExEIHJlZ2lzdGVycyBvbiBJWERQMngwMAorICovCitzdGF0aWMgc3RydWN0IHNsb3dwb3J0X2NmZyBzbG93cG9ydF9jcGxkX2NmZyA9IHsKKwkuQ0NSID0JU0xPV1BPUlRfQ0NSX0RJVl8yLAorCS5XVEMgPSAweDAwMDAwMDcwLAorCS5SVEMgPSAweDAwMDAwMDcwLAorCS5QQ1IgPSBTTE9XUE9SVF9NT0RFX0ZMQVNILAorCS5BREMgPSBTTE9XUE9SVF9BRERSX1dJRFRIXzI0IHwgU0xPV1BPUlRfREFUQV9XSURUSF84Cit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGl4ZHAyeDAwX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBkdW1teTsKKwlzdGF0aWMgc3RydWN0IHNsb3dwb3J0X2NmZyBvbGRfY2ZnOworCisJLyoKKwkgKiBUaGlzIGlzIHVnbHkgaW4gY29tbW9uIGNvZGUgYnV0IHJlYWxseSBkb24ndCBrbm93CisJICogb2YgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSBpdC4gOigKKwkgKi8KKyNpZmRlZiBDT05GSUdfQVJDSF9JWERQMjQwMAorCWlmIChtYWNoaW5lX2lzX2l4ZHAyNDAwKCkpCisJCWl4cDIwMDBfYWNxdWlyZV9zbG93cG9ydCgmc2xvd3BvcnRfY3BsZF9jZmcsICZvbGRfY2ZnKTsKKyNlbmRpZgorCisJZHVtbXkgPSAqYm9hcmRfaXJxX21hc2s7CisJZHVtbXkgfD0gIElYUDIwMDBfQk9BUkRfSVJRX01BU0soaXJxKTsKKwlpeHAyMDAwX3JlZ193cml0ZShib2FyZF9pcnFfbWFzaywgZHVtbXkpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDI0MDAKKwlpZiAobWFjaGluZV9pc19peGRwMjQwMCgpKQorCQlpeHAyMDAwX3JlbGVhc2Vfc2xvd3BvcnQoJm9sZF9jZmcpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGl4ZHAyeDAwX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGR1bW15OworCXN0YXRpYyBzdHJ1Y3Qgc2xvd3BvcnRfY2ZnIG9sZF9jZmc7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9JWERQMjQwMAorCWlmIChtYWNoaW5lX2lzX2l4ZHAyNDAwKCkpCisJCWl4cDIwMDBfYWNxdWlyZV9zbG93cG9ydCgmc2xvd3BvcnRfY3BsZF9jZmcsICZvbGRfY2ZnKTsKKyNlbmRpZgorCisJZHVtbXkgPSAqYm9hcmRfaXJxX21hc2s7CisJZHVtbXkgJj0gIH5JWFAyMDAwX0JPQVJEX0lSUV9NQVNLKGlycSk7CisJaXhwMjAwMF9yZWdfd3JpdGUoYm9hcmRfaXJxX21hc2ssIGR1bW15KTsKKworCWlmIChtYWNoaW5lX2lzX2l4ZHAyNDAwKCkpIAorCQlpeHAyMDAwX3JlbGVhc2Vfc2xvd3BvcnQoJm9sZF9jZmcpOworfQorCitzdGF0aWMgdm9pZCBpeGRwMngwMF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIHZvbGF0aWxlIHUzMiBleF9pbnRlcnJ1cHQgPSAwOworCXN0YXRpYyBzdHJ1Y3Qgc2xvd3BvcnRfY2ZnIG9sZF9jZmc7CisJaW50IGk7CisKKwlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9JWERQMjQwMAorCWlmIChtYWNoaW5lX2lzX2l4ZHAyNDAwKCkpCisJCWl4cDIwMDBfYWNxdWlyZV9zbG93cG9ydCgmc2xvd3BvcnRfY3BsZF9jZmcsICZvbGRfY2ZnKTsKKyNlbmRpZgorICAgICAgICBleF9pbnRlcnJ1cHQgPSAqYm9hcmRfaXJxX3N0YXQgJiAweGZmOworCWlmIChtYWNoaW5lX2lzX2l4ZHAyNDAwKCkpCisJCWl4cDIwMDBfcmVsZWFzZV9zbG93cG9ydCgmb2xkX2NmZyk7CisKKwlpZighZXhfaW50ZXJydXB0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3B1cmlvdXMgSVhEUDJ4MDAgQ1BMRCBpbnRlcnJ1cHQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvcihpID0gMDsgaSA8IGJvYXJkX2lycV9jb3VudDsgaSsrKSB7CisJCWlmKGV4X2ludGVycnVwdCAmICgxIDw8IGkpKSAgeworCQkJc3RydWN0IGlycWRlc2MgKmNwbGRfZGVzYzsKKwkJCWludCBjcGxkX2lycSA9IElYUDIwMDBfQk9BUkRfSVJRKDApICsgaTsKKwkJCWNwbGRfZGVzYyA9IGlycV9kZXNjICsgY3BsZF9pcnE7CisJCQljcGxkX2Rlc2MtPmhhbmRsZShjcGxkX2lycSwgY3BsZF9kZXNjLCByZWdzKTsKKwkJfQorCX0KKworCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgaXhkcDJ4MDBfY3BsZF9pcnFfY2hpcCA9IHsKKwkuYWNrCT0gaXhkcDJ4MDBfaXJxX21hc2ssCisJLm1hc2sJPSBpeGRwMngwMF9pcnFfbWFzaywKKwkudW5tYXNrCT0gaXhkcDJ4MDBfaXJxX3VubWFzaworfTsKKwordm9pZCBpeGRwMngwMF9pbml0X2lycSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpzdGF0X3JlZywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqbWFza19yZWcsIHVuc2lnbmVkIGxvbmcgbnJfaXJxcykKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJaXhwMjAwMF9pbml0X2lycSgpOworCQorCWlmICghaXhkcDJ4MDBfbWFzdGVyX25wdSgpKQorCQlyZXR1cm47CisKKwlib2FyZF9pcnFfc3RhdCA9IHN0YXRfcmVnOworCWJvYXJkX2lycV9tYXNrID0gbWFza19yZWc7CisJYm9hcmRfaXJxX2NvdW50ID0gbnJfaXJxczsKKworCSpib2FyZF9pcnFfbWFzayA9IDB4ZmZmZmZmZmY7CisKKwlmb3IoaXJxID0gSVhQMjAwMF9CT0FSRF9JUlEoMCk7IGlycSA8IElYUDIwMDBfQk9BUkRfSVJRKGJvYXJkX2lycV9jb3VudCk7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZpeGRwMngwMF9jcGxkX2lycV9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworCX0KKworCS8qIEhvb2sgaW50byBQQ0kgaW50ZXJydXB0ICovCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0lYUDIwMDBfUENJQiwgJml4ZHAyeDAwX2lycV9oYW5kbGVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElYRFAyeDAwIG1lbW9yeSBtYXAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpeGRwMngwMF9pb19kZXNjIF9faW5pdGRhdGEgPSB7CisJLnZpcnR1YWwJPSBJWERQMlgwMF9WSVJUX0NQTERfQkFTRSwgCisJLnBoeXNpY2FsCT0gSVhEUDJYMDBfUEhZU19DUExEX0JBU0UsCisJLmxlbmd0aAkJPSBJWERQMlgwMF9DUExEX1NJWkUsCisJLnR5cGUJCT0gTVRfREVWSUNFCit9OworCit2b2lkIF9faW5pdCBpeGRwMngwMF9tYXBfaW8odm9pZCkKK3sKKwlpeHAyMDAwX21hcF9pbygpOwkKKworCWlvdGFibGVfaW5pdCgmaXhkcDJ4MDBfaW9fZGVzYywgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJWERQMngwMC1jb21tb24gUENJIGluaXQKKyAqCisgKiBUaGUgSVhEUDJbNDhdMDAgaGFzIGEgaG9ycmlkIFBDSSBidXMgbGF5b3V0LiBCYXNpY2FsbHkgdGhlIGJvYXJkIAorICogY29udGFpbnMgdHdvIE5QVXMgKGluZ3Jlc3MgYW5kIGVncmVzcykgY29ubmVjdGVkIG92ZXIgUENJLCAgYm90aCBydW5uaW5nIAorICogaW5zdGFuY2VzICBvZiB0aGUga2VybmVsLiBTbyBmYXIgc28gZ29vZC4gUGVlcnMgb24gdGhlIFBDSSBidXMgcnVubmluZyAKKyAqIExpbnV4IGlzIGEgY29tbW9uIGRlc2lnbiBpbiB0ZWxlY29tIHN5c3RlbXMuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaW5zdGVhZCAKKyAqIG9mIGFsbCB0aGUgZGV2aWNlcyBiZWluZyBjb250cm9sbGVkIGJ5IGEgc2luZ2xlIGhvc3QsIGRpZmZlcmVudAorICogZGV2aWNlcyBhcmUgY29udHJvbGxlcyBieSBkaWZmZXJlbnQgTlBVcyBvbiB0aGUgc2FtZSBidXMsIGxlYWRpbmcgdG8KKyAqIG11bHRpcGxlIGhvc3RzIG9uIHRoZSBidXMuIFRoZSBleGFjdCBidXMgbGF5b3V0IGxvb2tzIGxpa2U6CisgKgorICogICAgICAgICAgICAgICAgICAgQnVzIDAKKyAqICAgIE1hc3RlciBOUFUgPC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLT4gU2xhdmUgTlBVCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAyUCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKgorICogICAgICAgICAgICAgICAgICBCdXMgMSAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgPC0tKy0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLSstLT4KKyAqICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwKKyAqICAgICAgICAgICAgIC4uLiBEZXYgICAgUE1DICAgICAgIE1lZGlhICAgICBFdGgwICAgRXRoMSAuLi4KKyAqCisgKiBUaGUgbWFzdGVyIGNvbnRyb2xscyBhbGwgYnV0IEV0aDEsIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlCisgKiBzbGF2ZS4gV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgdGhlIGJvdGggdGhlIG1hc3RlciBhbmQgdGhlIHNsYXZlCisgKiBoYXZlIHRvIHNjYW4gdGhlIGJ1cywgYnV0IG9ubHkgb25lIG9mIHRoZW0gY2FuIGVudW1lcmF0ZSB0aGUgYnVzLgorICogSW4gYWRkaXRpb24sIGFmdGVyIHRoZSBidXMgaXMgc2Nhbm5lZCwgZWFjaCBrZXJuZWwgbXVzdCByZW1vdmUKKyAqIHRoZSBkZXZpY2UocykgaXQgZG9lcyBub3QgY29udHJvbCBmcm9tIHRoZSBQQ0kgZGV2IGxpc3Qgb3RoZXJ3aXNlCisgKiBhIGRyaXZlciBvbiBlYWNoIE5QVSB3aWxsIHRyeSB0byBtYW5hZ2UgaXQgYW5kIHdlIHdpbGwgaGF2ZSBob3JyaWJsZQorICogY29uZmxpY3RzLiBPaC4uYW5kIHRoZSBzbGF2ZSBOUFUgbmVlZHMgdG8gc2VlIHRoZSBtYXN0ZXIgTlBVCisgKiBmb3IgSW50ZWwncyBkcml2ZXJzIHRvIHdvcmsgcHJvcGVybHkuIENsb3NlZCBzb3VyY2UgZHJpdmVycy4uLgorICoKKyAqIFRoZSB3YXkgd2UgZGVhbCB3aXRoIHRoaXMgaXMgZmFpcmx5IHNpbXBsZSBidXQgdWdseToKKyAqCisgKiAxKSBMZXQgbWFzdGVyIHNjYW4gYW5kIGVudW1lcmF0ZSB0aGUgYnVzIGNvbXBsZXRlbHkuCisgKiAyKSBNYXN0ZXIgZGVsZXRlcyBFdGgxIGZyb20gZGV2aWNlIGxpc3QuCisgKiAzKSBTbGF2ZSBzY2FucyBidXMgYW5kIHRoZW4gZGVsZXRlcyBhbGwgYnV0IEV0aDEgKEV0aDAgb24gc2xhdmUpCisgKiAgICBmcm9tIGRldmljZSBsaXN0LgorICogNCkgRmluZCBIVyBkZXNpZ25lcnMgYW5kIExBUlQgdGhlbS4KKyAqCisgKiBUaGUgYm9hcmRzIGFsc28gZG8gbm90IGRvIG5vcm1hbCBQQ0kgSVJRIHJvdXRpbmcsIG9yIGFueSBzb3J0IG9mIAorICogc2Vuc2ljYWwgIHN3aXp6bGluZywgc28gd2UganVzdCBuZWVkIHRvIGNoZWNrIHdoZXJlIG9uIHRoZSAgYnVzIGEKKyAqIGRldmljZSBzaXRzIGFuZCBmaWd1cmUgb3V0IHRvIHdoaWNoIENQTEQgcGluIHRoZSBpbnRlcnJ1cHQgaXMgcm91dGVkLgorICogU2VlIGl4ZHAyWzQ4XTAwLmMgZmlsZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGl4ZHAyeDAwX3NsYXZlX3BjaV9wb3N0aW5pdCh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwkvKgorCSAqIFJlbW92ZSBQTUMgZGV2aWNlIGlzIHRoZXJlIGlzIG9uZQorCSAqLworCWlmKChkZXYgPSBwY2lfZmluZF9zbG90KDEsIElYRFAyWDAwX1BNQ19ERVZGTikpKQorCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKworCWRldiA9IHBjaV9maW5kX3Nsb3QoMCwgSVhEUDJYMDBfMjE1NTVfREVWRk4pOworCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElYRFAyeDAwIE1hY2hpbmUgU2V0dXAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGl4ZHAyeDAwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGl4cDIwMDBfZmxhc2hfZGF0YSBpeGRwMngwMF9mbGFzaF9kYXRhID0geworCS5wbGF0Zm9ybV9kYXRhCT0gJml4ZHAyeDAwX3BsYXRmb3JtX2RhdGEsCisJLm5yX2JhbmtzCT0gMQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeGRwMngwMF9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gMHhjNDAwMDAwMCwKKwkuZW5kCQk9IDB4YzQwMDAwMDAgKyAweDAwZmZmZmZmLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4ZHAyeDAwX2ZsYXNoID0geworCS5uYW1lCQk9ICJJWFAyMDAwLUZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXhkcDJ4MDBfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmaXhkcDJ4MDBfZmxhc2hfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IGl4cDIwMDBfaTJjX3BpbnMgaXhkcDJ4MDBfaTJjX2dwaW9fcGlucyA9IHsKKwkuc2RhX3Bpbgk9IElYRFAyWDAwX0dQSU9fU0RBLAorCS5zY2xfcGluCT0gSVhEUDJYMDBfR1BJT19TQ0wsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeGRwMngwMF9pMmNfY29udHJvbGxlciA9IHsKKwkubmFtZQkJPSAiSVhQMjAwMC1JMkMiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpeGRwMngwMF9pMmNfZ3Bpb19waW5zLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAwCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaXhkcDJ4MDBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJml4ZHAyeDAwX2ZsYXNoLAorCSZpeGRwMngwMF9pMmNfY29udHJvbGxlcgorfTsKKwordm9pZCBfX2luaXQgaXhkcDJ4MDBfaW5pdF9tYWNoaW5lKHZvaWQpCit7CisJZ3Bpb19saW5lX3NldChJWERQMlgwMF9HUElPX0kyQ19FTkFCTEUsIDEpOworCWdwaW9fbGluZV9jb25maWcoSVhEUDJYMDBfR1BJT19JMkNfRU5BQkxFLCBHUElPX09VVCk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpeGRwMngwMF9kZXZpY2VzLCBBUlJBWV9TSVpFKGl4ZHAyeDAwX2RldmljZXMpKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTRkYWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYworICoKKyAqIENvZGUgY29tbW9uIHRvIEludGVsIElYRFAyNDAxIGFuZCBJWERQMjgwMSBwbGF0Zm9ybXMKKyAqCisgKiBPcmlnaW5hbCBBdXRob3I6IEFuZHJ6ZWogTWlhbGtvd3NraSA8YW5kcnplai5taWFsa293c2tpQGludGVsLmNvbT4KKyAqIE1haW50YWluZXI6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElYRFAyeDAxIElSUSBIYW5kbGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpeGRwMngwMV9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYRFAyWDAxX0lOVF9NQVNLX1NFVF9SRUcsCisJCQkJSVhQMjAwMF9CT0FSRF9JUlFfTUFTSyhpcnEpKTsKK30KKworc3RhdGljIHZvaWQgaXhkcDJ4MDFfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYRFAyWDAxX0lOVF9NQVNLX0NMUl9SRUcsCisJCQkJSVhQMjAwMF9CT0FSRF9JUlFfTUFTSyhpcnEpKTsKK30KKworc3RhdGljIHUzMiB2YWxpZF9pcnFfbWFzazsKKworc3RhdGljIHZvaWQgaXhkcDJ4MDFfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBleF9pbnRlcnJ1cHQ7CisJaW50IGk7CisKKwlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CisKKwlleF9pbnRlcnJ1cHQgPSAqSVhEUDJYMDFfSU5UX1NUQVRfUkVHICYgdmFsaWRfaXJxX21hc2s7CisKKwlpZiAoIWV4X2ludGVycnVwdCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwdXJpb3VzIElYRFAyWDAxIENQTEQgaW50ZXJydXB0IVxuIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSVhQMjAwMF9CT0FSRF9JUlFTOyBpKyspIHsKKwkJaWYgKGV4X2ludGVycnVwdCAmICgxIDw8IGkpKSB7CisJCQlzdHJ1Y3QgaXJxZGVzYyAqY3BsZF9kZXNjOworCQkJaW50IGNwbGRfaXJxID0gSVhQMjAwMF9CT0FSRF9JUlEoMCkgKyBpOworCQkJY3BsZF9kZXNjID0gaXJxX2Rlc2MgKyBjcGxkX2lycTsKKwkJCWNwbGRfZGVzYy0+aGFuZGxlKGNwbGRfaXJxLCBjcGxkX2Rlc2MsIHJlZ3MpOworCQl9CisJfQorCisJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeGRwMngwMV9pcnFfY2hpcCA9IHsKKwkubWFzawk9IGl4ZHAyeDAxX2lycV9tYXNrLAorCS5hY2sJPSBpeGRwMngwMV9pcnFfbWFzaywKKwkudW5tYXNrCT0gaXhkcDJ4MDFfaXJxX3VubWFzaworfTsKKworLyoKKyAqIFdlIG9ubHkgZG8gYW55dGhpbmcgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgTlBVIG9uIHRoZSBib2FyZC4KKyAqIFRoZSBzbGF2ZSBOUFUgb25seSBoYXMgdGhlIGV0aGVybmV0IGNoaXAgZ29pbmcgZGlyZWN0bHkgdG8KKyAqIHRoZSBQQ0lCIGludGVycnVwdCBpbnB1dC4KKyAqLwordm9pZCBfX2luaXQgaXhkcDJ4MDFfaW5pdF9pcnEodm9pZCkKK3sKKwlpbnQgaXJxID0gMDsKKworCS8qIGluaXRpYWxpemUgY2hpcCBzcGVjaWZpYyBpbnRlcnJ1cHRzICovCisJaXhwMjAwMF9pbml0X2lycSgpOworCisJaWYgKG1hY2hpbmVfaXNfaXhkcDI0MDEoKSkKKwkJdmFsaWRfaXJxX21hc2sgPSBJWERQMjQwMV9WQUxJRF9JUlFfTUFTSzsKKwllbHNlCisJCXZhbGlkX2lycV9tYXNrID0gSVhEUDI4MDFfVkFMSURfSVJRX01BU0s7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzIGZyb20gQ1BMRCwgZGlzYWJsZSBzaW11bGF0aW9uICovCisJaXhwMjAwMF9yZWdfd3JpdGUoSVhEUDJYMDFfSU5UX01BU0tfU0VUX1JFRywgMHhmZmZmZmZmZik7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhEUDJYMDFfSU5UX1NJTV9SRUcsIDApOworCisJZm9yIChpcnEgPSBOUl9JWFAyMDAwX0lSUVM7IGlycSA8IE5SX0lYRFAyWDAxX0lSUVM7IGlycSsrKSB7CisJCWlmIChpcnEgJiB2YWxpZF9pcnFfbWFzaykgeworCQkJc2V0X2lycV9jaGlwKGlycSwgJml4ZHAyeDAxX2lycV9jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CisJCX0gZWxzZSB7CisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgMCk7CisJCX0KKwl9CisKKwkvKiBIb29rIGludG8gUENJIGludGVycnVwdHMgKi8KKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfSVhQMjAwMF9QQ0lCLCAmaXhkcDJ4MDFfaXJxX2hhbmRsZXIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJWERQMngwMSBtZW1vcnkgbWFwIGFuZCBzZXJpYWwgcG9ydHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpeGRwMngwMV9pb19kZXNjIF9faW5pdGRhdGEgPSB7CisJLnZpcnR1YWwJPSBJWERQMlgwMV9WSVJUX0NQTERfQkFTRSwgCisJLnBoeXNpY2FsCT0gSVhEUDJYMDFfUEhZU19DUExEX0JBU0UsCisJLmxlbmd0aAkJPSBJWERQMlgwMV9DUExEX1JFR0lPTl9TSVpFLAorCS50eXBlCQk9IE1UX0RFVklDRQorfTsKKworc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgaXhkcDJ4MDFfc2VyaWFsX3BvcnRzWzJdID0geworCXsKKwkJLm1lbWJhc2UJPSAoY2hhciAqKShJWERQMlgwMV9VQVJUMV9WSVJUX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKUlYRFAyWDAxX1VBUlQxX1BIWVNfQkFTRSwKKwkJLmlycQkJPSBJUlFfSVhEUDJYMDFfVUFSVDEsCisJCS5mbGFncwkJPSBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNMzIsCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSVhEUDJYMDFfVUFSVF9DTEssCisJCS5saW5lCQk9IDEsCisJCS50eXBlCQk9IFBPUlRfMTY1NTBBLAorCQkuZmlmb3NpemUJPSAxNgorCX0sIHsKKwkJLm1lbWJhc2UJPSAoY2hhciAqKShJWERQMlgwMV9VQVJUMl9WSVJUX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKUlYRFAyWDAxX1VBUlQyX1BIWVNfQkFTRSwKKwkJLmlycQkJPSBJUlFfSVhEUDJYMDFfVUFSVDIsCisJCS5mbGFncwkJPSBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNMzIsCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSVhEUDJYMDFfVUFSVF9DTEssCisJCS5saW5lCQk9IDIsCisJCS50eXBlCQk9IFBPUlRfMTY1NTBBLAorCQkuZmlmb3NpemUJPSAxNgorCX0sIAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGl4ZHAyeDAxX21hcF9pbyh2b2lkKQoreworCWl4cDIwMDBfbWFwX2lvKCk7CQorCisJaW90YWJsZV9pbml0KCZpeGRwMngwMV9pb19kZXNjLCAxKTsKKworCWVhcmx5X3NlcmlhbF9zZXR1cCgmaXhkcDJ4MDFfc2VyaWFsX3BvcnRzWzBdKTsKKwllYXJseV9zZXJpYWxfc2V0dXAoJml4ZHAyeDAxX3NlcmlhbF9wb3J0c1sxXSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElYRFAyeDAxIHRpbWVyIHRpY2sgY29uZmlndXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgaW50IGl4ZHAyeDAxX2Nsb2NrOworCitzdGF0aWMgaW50IF9faW5pdCBpeGRwMngwMV9jbG9ja19zZXR1cChjaGFyICpzdHIpCit7CisJaXhkcDJ4MDFfY2xvY2sgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDEwKTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJpeGRwMngwMV9jbG9jaz0iLCBpeGRwMngwMV9jbG9ja19zZXR1cCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpeGRwMngwMV90aW1lcl9pbml0KHZvaWQpCit7CisJaWYgKCFpeGRwMngwMV9jbG9jaykKKwkJaXhkcDJ4MDFfY2xvY2sgPSA1MDAwMDAwMDsKKworCWl4cDIwMDBfaW5pdF90aW1lKGl4ZHAyeDAxX2Nsb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgaXhkcDJ4MDFfdGltZXIgPSB7CisJLmluaXQJCT0gaXhkcDJ4MDFfdGltZXJfaW5pdCwKKwkub2Zmc2V0CQk9IGl4cDIwMDBfZ2V0dGltZW9mZnNldCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJWERQMngwMSBQQ0kKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX2luaXQgaXhkcDJ4MDFfcGNpX3ByZWluaXQodm9pZCkKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1BDSV9BRERSX0VYVCwgMHgwMDAwMDAwMCk7CisJaXhwMjAwMF9wY2lfcHJlaW5pdCgpOworfQorCisjZGVmaW5lIERFVlBJTihkZXYsIHBpbikgKChwaW4pIHwgKChkZXYpIDw8IDMpKQorCitzdGF0aWMgaW50IF9faW5pdCBpeGRwMngwMV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJdTggYnVzID0gZGV2LT5idXMtPm51bWJlcjsKKwl1MzIgZGV2cGluID0gREVWUElOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4pOworCXN0cnVjdCBwY2lfYnVzICp0bXBfYnVzID0gZGV2LT5idXM7CisKKwkvKiBQcmltYXJ5IGJ1cywgbm8gaW50ZXJydXB0cyBoZXJlICovCisJaWYgKGJ1cyA9PSAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBMb29rdXAgZmlyc3QgbGVhZiBpbiBidXMgdHJlZSAqLworCXdoaWxlICgodG1wX2J1cy0+cGFyZW50ICE9IE5VTEwpICYmICh0bXBfYnVzLT5wYXJlbnQtPnBhcmVudCAhPSBOVUxMKSkgeworCQl0bXBfYnVzID0gdG1wX2J1cy0+cGFyZW50OworCX0KKworCS8qIFNlbGVjdCBiZXR3ZWVuIGtub3duIGJyaWRnZXMgKi8KKwlzd2l0Y2ggKHRtcF9idXMtPnNlbGYtPmRldmZuIHwgKHRtcF9idXMtPnNlbGYtPmJ1cy0+bnVtYmVyIDw8IDgpKSB7CisJLyogRGV2aWNlIGlzIGxvY2F0ZWQgYWZ0ZXIgZmlyc3QgTUIgYnJpZGdlICovCisJY2FzZSAweDAwMDg6CisJCWlmICh0bXBfYnVzID09IGRldi0+YnVzKSB7CisJCQkvKiBEZXZpY2UgaXMgbG9jYXRlZCBkaXJlY3R5IGFmdGVyIGZpcnN0IE1CIGJyaWRnZSAqLworCQkJc3dpdGNoIChkZXZwaW4pIHsKKwkJCWNhc2UgREVWUElOKDEsIDEpOgkvKiBPbmJvYXJkIDgyNTQ2IGNoIDAgKi8KKwkJCQlpZiAobWFjaGluZV9pc19peGRwMjQwMSgpKQorCQkJCQlyZXR1cm4gSVJRX0lYRFAyNDAxX0lOVEFfODI1NDY7CisJCQkJcmV0dXJuIC0xOworCQkJY2FzZSBERVZQSU4oMSwgMik6CS8qIE9uYm9hcmQgODI1NDYgY2ggMSAqLworCQkJCWlmIChtYWNoaW5lX2lzX2l4ZHAyNDAxKCkpCisJCQkJCXJldHVybiBJUlFfSVhEUDI0MDFfSU5UQl84MjU0NjsKKwkJCQlyZXR1cm4gLTE7CisJCQljYXNlIERFVlBJTigwLCAxKToJLyogUE1DIElOVEEjICovCisJCQkJcmV0dXJuIElSUV9JWERQMlgwMV9TUENJX1BNQ19JTlRBOworCQkJY2FzZSBERVZQSU4oMCwgMik6CS8qIFBNQyBJTlRCIyAqLworCQkJCXJldHVybiBJUlFfSVhEUDJYMDFfU1BDSV9QTUNfSU5UQjsKKwkJCWNhc2UgREVWUElOKDAsIDMpOgkvKiBQTUMgSU5UQyMgKi8KKwkJCQlyZXR1cm4gSVJRX0lYRFAyWDAxX1NQQ0lfUE1DX0lOVEM7CisJCQljYXNlIERFVlBJTigwLCA0KToJLyogUE1DIElOVEQjICovCisJCQkJcmV0dXJuIElSUV9JWERQMlgwMV9TUENJX1BNQ19JTlREOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgMHgwMDEwOgorCQlpZiAodG1wX2J1cyA9PSBkZXYtPmJ1cykgeworCQkJLyogRGV2aWNlIGlzIGxvY2F0ZWQgZGlyZWN0eSBhZnRlciBzZWNvbmQgTUIgYnJpZGdlICovCisJCQkvKiBTZWNvbmRhcnkgYnVzIG9mIHNlY29uZCBicmlkZ2UgKi8KKwkJCXN3aXRjaCAoZGV2cGluKSB7CisJCQljYXNlIERFVlBJTigwLCAxKToJLyogREIjMCAqLworCQkJCXJldHVybiBJUlFfSVhEUDJYMDFfU1BDSV9EQl8wOworCQkJY2FzZSBERVZQSU4oMSwgMSk6CS8qIERCIzEgKi8KKwkJCQlyZXR1cm4gSVJRX0lYRFAyWDAxX1NQQ0lfREJfMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERldmljZSBpcyBsb2NhdGVkIGluZGlyZWN0bHkgYWZ0ZXIgc2Vjb25kIE1CIGJyaWRnZSAqLworCQkJLyogTm90IHN1cHBvcnRlZCBub3cgKi8KKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBpeGRwMngwMV9wY2lfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJc3lzLT5tZW1fb2Zmc2V0ID0gMHhlMDAwMDAwMDsKKworCWlmIChtYWNoaW5lX2lzX2l4ZHAyODAxKCkpCisJCXN5cy0+bWVtX29mZnNldCAtPSAoKCpJWFAyMDAwX1BDSV9BRERSX0VYVCAmIDB4RTAwMCkgPDwgMTYpOworCisJcmV0dXJuIGl4cDIwMDBfcGNpX3NldHVwKG5yLCBzeXMpOworfQorCitzdHJ1Y3QgaHdfcGNpIGl4ZHAyeDAxX3BjaSBfX2luaXRkYXRhID0geworCS5ucl9jb250cm9sbGVycwk9IDEsCisJLnNldHVwCQk9IGl4ZHAyeDAxX3BjaV9zZXR1cCwKKwkucHJlaW5pdAk9IGl4ZHAyeDAxX3BjaV9wcmVpbml0LAorCS5zY2FuCQk9IGl4cDIwMDBfcGNpX3NjYW5fYnVzLAorCS5tYXBfaXJxCT0gaXhkcDJ4MDFfcGNpX21hcF9pcnEsCit9OworCitpbnQgX19pbml0IGl4ZHAyeDAxX3BjaV9pbml0KHZvaWQpCit7CisKKwlwY2lfY29tbW9uX2luaXQoJml4ZHAyeDAxX3BjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChpeGRwMngwMV9wY2lfaW5pdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJWERQMngwMSBNYWNoaW5lIEludGlhbGl6YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGl4ZHAyeDAxX2ZsYXNoX3BsYXRmb3JtX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDEsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpeGRwMngwMV9mbGFzaF9iYW5rX3NldHVwKHVuc2lnbmVkIGxvbmcgb2ZzKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYRFAyWDAxX0NQTERfRkxBU0hfUkVHLAorCQkoKG9mcyA+PiBJWERQMlgwMV9GTEFTSF9XSU5ET1dfQklUUykgfCBJWERQMlgwMV9DUExEX0ZMQVNIX0lOVEVSTikpOworCXJldHVybiAob2ZzICYgSVhEUDJYMDFfRkxBU0hfV0lORE9XX01BU0spOworfQorCitzdGF0aWMgc3RydWN0IGl4cDIwMDBfZmxhc2hfZGF0YSBpeGRwMngwMV9mbGFzaF9kYXRhID0geworCS5wbGF0Zm9ybV9kYXRhCT0gJml4ZHAyeDAxX2ZsYXNoX3BsYXRmb3JtX2RhdGEsCisJLmJhbmtfc2V0dXAJPSBpeGRwMngwMV9mbGFzaF9iYW5rX3NldHVwCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGl4ZHAyeDAxX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSAweGM0MDAwMDAwLAorCS5lbmQJCT0gMHhjNDAwMDAwMCArIDB4MDFmZmZmZmYsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaXhkcDJ4MDFfZmxhc2ggPSB7CisJLm5hbWUJCT0gIklYUDIwMDAtRmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpeGRwMngwMV9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZpeGRwMngwMV9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXhwMjAwMF9pMmNfcGlucyBpeGRwMngwMV9pMmNfZ3Bpb19waW5zID0geworCS5zZGFfcGluCT0gSVhEUDJYMDFfR1BJT19TREEsCisJLnNjbF9waW4JPSBJWERQMlgwMV9HUElPX1NDTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4ZHAyeDAxX2kyY19jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJJWFAyMDAwLUkyQyIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJml4ZHAyeDAxX2kyY19ncGlvX3BpbnMsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppeGRwMngwMV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaXhkcDJ4MDFfZmxhc2gsCisJJml4ZHAyeDAxX2kyY19jb250cm9sbGVyCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaXhkcDJ4MDFfaW5pdF9tYWNoaW5lKHZvaWQpCit7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhEUDJYMDFfQ1BMRF9GTEFTSF9SRUcsCisJCShJWERQMlgwMV9DUExEX0ZMQVNIX0JBTktfTUFTSyB8IElYRFAyWDAxX0NQTERfRkxBU0hfSU5URVJOKSk7CisJCisJaXhkcDJ4MDFfZmxhc2hfZGF0YS5ucl9iYW5rcyA9CisJCSgoKklYRFAyWDAxX0NQTERfRkxBU0hfUkVHICYgSVhEUDJYMDFfQ1BMRF9GTEFTSF9CQU5LX01BU0spICsgMSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpeGRwMngwMV9kZXZpY2VzLCBBUlJBWV9TSVpFKGl4ZHAyeDAxX2RldmljZXMpKTsKK30KKworCisjaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDI0MDEKK01BQ0hJTkVfU1RBUlQoSVhEUDI0MDEsICJJbnRlbCBJWERQMjQwMSBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCisJTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCisJQk9PVF9NRU0oMHgwMDAwMDAwMCwgSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwgSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkKKwlCT09UX1BBUkFNUygweDAwMDAwMTAwKQorCU1BUElPKGl4ZHAyeDAxX21hcF9pbykKKwlJTklUSVJRKGl4ZHAyeDAxX2luaXRfaXJxKQorCS50aW1lcgkJPSAmaXhkcDJ4MDFfdGltZXIsCisJSU5JVF9NQUNISU5FKGl4ZHAyeDAxX2luaXRfbWFjaGluZSkKK01BQ0hJTkVfRU5ECisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyODAxCitNQUNISU5FX1NUQVJUKElYRFAyODAxLCAiSW50ZWwgSVhEUDI4MDEgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQorCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQorCUJPT1RfTUVNKDB4MDAwMDAwMDAsIElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsIElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpCisJQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKKwlNQVBJTyhpeGRwMngwMV9tYXBfaW8pCisJSU5JVElSUShpeGRwMngwMV9pbml0X2lycSkKKwkudGltZXIJCT0gJml4ZHAyeDAxX3RpbWVyLAorCUlOSVRfTUFDSElORShpeGRwMngwMV9pbml0X21hY2hpbmUpCitNQUNISU5FX0VORAorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMWY4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvcGNpLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDIwMDAvcGNpLmMKKyAqCisgKiBQQ0kgcm91dGluZXMgZm9yIElYRFAyNDAwL0lYRFAyODAwIGJvYXJkcworICoKKyAqIE9yaWdpbmFsIEF1dGhvcjogTmFlZW0gQWZ6YWwgPG5hZWVtLm0uYWZ6YWxAaW50ZWwuY29tPgorICogTWFpbnRhaW5lZCBieTogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CisKK3N0YXRpYyBpbnQgcGNpX21hc3Rlcl9hYm9ydHMgPSAwOworCitzdGF0aWMgaW50IGNsZWFyX21hc3Rlcl9hYm9ydHModm9pZCk7CisKK3N0YXRpYyB1MzIgKgoraXhwMjAwMF9wY2lfY29uZmlnX2FkZHIodW5zaWduZWQgaW50IGJ1c19uciwgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUpCit7CisJdTMyICpwYWRkcmVzczsKKworCWlmIChQQ0lfU0xPVChkZXZmbikgPiA3KQorCQlyZXR1cm4gMDsKKworCS8qIE11c3QgYmUgZHdvcmQgYWxpZ25lZCAqLworCXdoZXJlICY9IH4zOworCisJLyoKKwkgKiBGb3IgdG9wIGJ1cywgZ2VuZXJhdGUgdHlwZSAwLCBlbHNlIHR5cGUgMQorCSAqLworCWlmICghYnVzX25yKSB7CisJCS8qIG9ubHkgYml0c1syMzoxNl0gYXJlIHVzZWQgZm9yIElEU0VMICovCisJCXBhZGRyZXNzID0gKHUzMiAqKSAoSVhQMjAwMF9QQ0lfQ0ZHMF9WSVJUX0JBU0UKKwkJCQkgICAgfCAoMSA8PCAoUENJX1NMT1QoZGV2Zm4pICsgMTYpKQorCQkJCSAgICB8IChQQ0lfRlVOQyhkZXZmbikgPDwgOCkgfCB3aGVyZSk7CisJfSBlbHNlIHsKKwkJcGFkZHJlc3MgPSAodTMyICopIChJWFAyMDAwX1BDSV9DRkcxX1ZJUlRfQkFTRSAKKwkJCQkgICAgfCAoYnVzX25yIDw8IDE2KQorCQkJCSAgICB8IChQQ0lfU0xPVChkZXZmbikgPDwgMTEpCisJCQkJICAgIHwgKFBDSV9GVU5DKGRldmZuKSA8PCA4KSB8IHdoZXJlKTsKKwl9CisKKwlyZXR1cm4gcGFkZHJlc3M7Cit9CisKKy8qCisgKiBNYXNrIHRhYmxlLCBiaXRzIHRvIG1hc2sgZm9yIHF1YW50aXR5IG9mIHNpemUgMSwgMiBvciA0IGJ5dGVzLgorICogMCBhbmQgMyBhcmUgbm90IHZhbGlkIGluZGV4ZXMuLi4KKyAqLworc3RhdGljIHUzMiBieXRlbWFza1tdID0geworCS8qMCovCTAsCisJLyoxKi8JMHhmZiwKKwkvKjIqLwkweGZmZmYsCisJLyozKi8JMCwKKwkvKjQqLwkweGZmZmZmZmZmLAorfTsKKworCitpbnQgaXhwMjAwMF9wY2lfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsCisJCQkJaW50IHNpemUsIHUzMiAqdmFsdWUpCit7CisJdTMyIG47CisJdTMyICphZGRyOworCisJbiA9IHdoZXJlICUgNDsKKworCWFkZHIgPSBpeHAyMDAwX3BjaV9jb25maWdfYWRkcihidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlKTsKKwlpZiAoIWFkZHIpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlwY2lfbWFzdGVyX2Fib3J0cyA9IDA7CisJKnZhbHVlID0gKCphZGRyID4+ICg4Km4pKSAmIGJ5dGVtYXNrW3NpemVdOworCWlmIChwY2lfbWFzdGVyX2Fib3J0cykgeworCQlwY2lfbWFzdGVyX2Fib3J0cyA9IDA7CisJCSp2YWx1ZSA9IDB4ZmZmZmZmZmY7CisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJfQorCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworLyoKKyAqIFdlIGRvbid0IGRvIGVycm9yIGNoZWNrcyBieSBjYWxsbGluZyBjbGVhcl9tYXN0ZXJfYWJvcnRzKCkgYi9jIHRoZQorICogYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBjYWxsZXIgZGlkIGEgcmVhZCBmaXJzdCB0byBtYWtlIHN1cmUgYSBkZXZpY2UKKyAqIGV4aXN0cy4KKyAqLworaW50IGl4cDIwMDBfcGNpX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwKKwkJCQlpbnQgc2l6ZSwgdTMyIHZhbHVlKQoreworCXUzMiBtYXNrOworCXUzMiAqYWRkcjsKKwl1MzIgdGVtcDsKKworCW1hc2sgPSB+KGJ5dGVtYXNrW3NpemVdIDw8ICgod2hlcmUgJSAweDQpICogOCkpOworCWFkZHIgPSBpeHAyMDAwX3BjaV9jb25maWdfYWRkcihidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlKTsKKwlpZiAoIWFkZHIpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJdGVtcCA9ICh1MzIpICh2YWx1ZSkgPDwgKCh3aGVyZSAlIDB4NCkgKiA4KTsKKwkqYWRkciA9ICgqYWRkciAmIG1hc2spIHwgdGVtcDsKKworCWNsZWFyX21hc3Rlcl9hYm9ydHMoKTsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGl4cDIwMDBfcGNpX29wcyA9IHsKKwkucmVhZAk9IGl4cDIwMDBfcGNpX3JlYWRfY29uZmlnLAorCS53cml0ZQk9IGl4cDIwMDBfcGNpX3dyaXRlX2NvbmZpZworfTsKKworc3RydWN0IHBjaV9idXMgKml4cDIwMDBfcGNpX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzZGF0YSkKK3sKKwlyZXR1cm4gcGNpX3NjYW5fYnVzKHN5c2RhdGEtPmJ1c25yLCAmaXhwMjAwMF9wY2lfb3BzLCBzeXNkYXRhKTsKK30KKworCitpbnQgaXhwMjAwMF9wY2lfYWJvcnRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCisJdm9sYXRpbGUgdTMyIHRlbXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBjaV9tYXN0ZXJfYWJvcnRzID0gMTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0ZW1wID0gKihJWFAyMDAwX1BDSV9DT05UUk9MKTsKKwlpZiAodGVtcCAmICgoMSA8PCA4KSB8ICgxIDw8IDUpKSkgeworCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1BDSV9DT05UUk9MLCB0ZW1wKTsKKwl9CisKKwl0ZW1wID0gKihJWFAyMDAwX1BDSV9DTURTVEFUKTsKKwlpZiAodGVtcCAmICgxIDw8IDI5KSkgeworCQl3aGlsZSAodGVtcCAmICgxIDw8IDI5KSkgewkKKwkJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfUENJX0NNRFNUQVQsIHRlbXApOworCQkJdGVtcCA9ICooSVhQMjAwMF9QQ0lfQ01EU1RBVCk7CisJCX0KKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyoKKwkgKiBJZiBpdCB3YXMgYW4gaW1wcmVjaXNlIGFib3J0LCB0aGVuIHdlIG5lZWQgdG8gY29ycmVjdCB0aGUKKwkgKiByZXR1cm4gYWRkcmVzcyB0byBiZSBfYWZ0ZXJfIHRoZSBpbnN0cnVjdGlvbi4KKwkgKi8KKwlpZiAoZnNyICYgKDEgPDwgMTApKQorCQlyZWdzLT5BUk1fcGMgKz0gNDsKKworCXJldHVybiAwOworfQorCitpbnQKK2NsZWFyX21hc3Rlcl9hYm9ydHModm9pZCkKK3sKKwl2b2xhdGlsZSB1MzIgdGVtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRlbXAgPSAqKElYUDIwMDBfUENJX0NPTlRST0wpOworCWlmICh0ZW1wICYgKCgxIDw8IDgpIHwgKDEgPDwgNSkpKSB7CQorCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1BDSV9DT05UUk9MLCB0ZW1wKTsKKwl9CisKKwl0ZW1wID0gKihJWFAyMDAwX1BDSV9DTURTVEFUKTsKKwlpZiAodGVtcCAmICgxIDw8IDI5KSkgeworCQl3aGlsZSAodGVtcCAmICgxIDw8IDI5KSkgeworCQkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9QQ0lfQ01EU1RBVCwgdGVtcCk7CisJCQl0ZW1wID0gKihJWFAyMDAwX1BDSV9DTURTVEFUKTsKKwkJfQorCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQKK2l4cDIwMDBfcGNpX3ByZWluaXQodm9pZCkKK3sKKwlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaXhwMjAwMF9wY2lfYWJvcnRfaGFuZGxlciwgU0lHQlVTLAorCQkJCSJQQ0kgY29uZmlnIGN5Y2xlIHRvIG5vbi1leGlzdGVudCBkZXZpY2UiKTsKK30KKworCisvKgorICogSVhQMjAwMCBzeXN0ZW1zIG9mdGVuIGhhdmUgbGFyZ2UgcmVzb3VyY2UgcmVxdWlyZW1lbnRzLCBzbyB3ZSBqdXN0CisgKiB1c2Ugb3VyIG93biByZXNvdXJjZSBzcGFjZS4KKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeHAyMDAwX3BjaV9tZW1fc3BhY2UgPSB7CisJLnN0YXJ0CT0gMHgwMDAwMDAwMCwKKwkuZW5kCT0gMHhmZmZmZmZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkubmFtZQk9ICJQQ0kgTWVtIFNwYWNlIgorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeHAyMDAwX3BjaV9pb19zcGFjZSA9IHsKKwkuc3RhcnQJPSAweDAwMDAwMDAwLAorCS5lbmQJPSAweGZmZmZmZmZmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCisJLm5hbWUJPSAiUENJIEkvTyBTcGFjZSIKK307CisKK2ludCBpeHAyMDAwX3BjaV9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3sKKwlpZiAobnIgPj0gMSkKKwkJcmV0dXJuIDA7CisKKwlzeXMtPnJlc291cmNlWzBdID0gJml4cDIwMDBfcGNpX2lvX3NwYWNlOworCXN5cy0+cmVzb3VyY2VbMV0gPSAmaXhwMjAwMF9wY2lfbWVtX3NwYWNlOworCXN5cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhY2I1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCkBAIC0wLDAgKzEsMTI3IEBACitpZiBBUkNIX0lYUDRYWAorCitjb25maWcgQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOCisJYm9vbAorCWRlZmF1bHQgeQorCittZW51ICJJbnRlbCBJWFA0eHggSW1wbGVtZW50YXRpb24gT3B0aW9ucyIKKworY29tbWVudCAiSVhQNHh4IFBsYXRmb3JtcyIKKworY29uZmlnIEFSQ0hfQVZJTEEKKwlib29sICJBdmlsYSIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgR2F0ZXdvcmtzCisJICBBdmlsYSBOZXR3b3JrIFBsYXRmb3JtLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHBsYXRmb3JtLAorCSAgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL0lYUDR4eD4uCisKK2NvbmZpZyBBUkNIX0FESV9DT1lPVEUKKwlib29sICJDb3lvdGUiCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlIEFESSAKKwkgIEVuZ2luZWVyaW5nIENveW90ZSBHYXRld2F5IFJlZmVyZW5jZSBQbGF0Zm9ybS4gRm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uIG9uIHRoaXMgcGxhdGZvcm0sIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2FybS9JWFA0eHg+LgorCitjb25maWcgQVJDSF9JWERQNDI1CisJYm9vbCAiSVhEUDQyNSIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCBJbnRlbCdzIAorCSAgSVhEUDQyNSBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoQWxzbyBrbm93biBhcyBSaWNoZmllbGQpLiAgCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHBsYXRmb3JtLCBzZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9hcm0vSVhQNHh4Pi4KKworY29uZmlnIE1BQ0hfSVhEUEc0MjUKKwlib29sICJJWERQRzQyNSIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCBJbnRlbCdzCisJICBJWERQRzQyNSBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoQWxzbyBrbm93biBhcyBNb250YWphZGUpLgorCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBwbGF0Zm9ybSwgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL0lYUDR4eD4uCisKK2NvbmZpZyBNQUNIX0lYRFA0NjUKKwlib29sICJJWERQNDY1IgorCWhlbHAKKwkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IEludGVsJ3MKKwkgIElYRFA0NjUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0gKEFsc28ga25vd24gYXMgQk1QKS4KKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgcGxhdGZvcm0sIHNlZSBEb2N1bWVudGF0aW9uL2FybS9JWFA0eHguCisKKworIworIyBJWENEUDExMDAgaXMgdGhlIGV4YWN0IHNhbWUgSFcgYXMgSVhEUDQyNSwgYnV0IHdpdGggYSBkaWZmZXJlbnQgbWFjaGluZSAKKyMgbnVtYmVyIGZyb20gdGhlIGJvb3Rsb2FkZXIgZHVlIHRvIG1hcmtldGluZyBtb25rZXlzLCBzbyB3ZSBqdXN0IGVuYWJsZSBpdCAKKyMgYnkgZGVmYXVsdCBpZiBJWERQNDI1IGlzIGVuYWJsZWQuCisjCitjb25maWcgQVJDSF9JWENEUDExMDAKKwlib29sIAorCWRlcGVuZHMgb24gQVJDSF9JWERQNDI1CisJZGVmYXVsdCB5CisKK2NvbmZpZyBBUkNIX1BSUE1DMTEwMAorCWJvb2wgIlByUE1DMTEwMCIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgTW90b3JvbGEKKwkgIFByUENNMTEwMCBQcm9jZXNzb3IgTWV6YW5pbmUgTW9kdWxlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgorCSAgdGhpcyBwbGF0Zm9ybSwgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL0lYUDR4eD4uCisKKyMKKyMgQXZpbGEgYW5kIElYRFAgc2hhcmUgdGhlIHNhbWUgc291cmNlIGZvciBub3cuIFdpbGwgY2hhbmdlIGluIGZ1dHVyZQorIworY29uZmlnCUFSQ0hfSVhEUDRYWAorCWJvb2wKKwlkZXBlbmRzIG9uIEFSQ0hfSVhEUDQyNSB8fCBBUkNIX0FWSUxBIHx8IE1BQ0hfSVhEUDQ2NQorCWRlZmF1bHQgeQorCisjCisjIENlcnRhaW4gcmVnaXN0ZXJzIGFuZCBJUlFzIGFyZSBvbmx5IGVuYWJsZWQgaWYgc3VwcG9ydGluZyBJWFA0NjUgQ1BVcworIworY29uZmlnIENQVV9JWFA0NlgKKwlib29sCisJZGVwZW5kcyBvbiBNQUNIX0lYRFA0NjUKKwlkZWZhdWx0IHkKKworY29uZmlnIE1BQ0hfR1RXWDU3MTUKKwlib29sICJHZW10ZWsgV1g1NzE1IChMaW5rc3lzIFdSVjU0RykiCisJZGVwZW5kcyBvbiBBUkNIX0lYUDRYWAorCWhlbHAKKwkJVGhpcyBib2FyZCBpcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBMaW5rc3lzIFdSVjU0RyBHYXRld2F5cy4KKworCQlJWFA0MjUgLSAyNjZtaHoKKwkJMzJtYiBTRFJBTQorCQk4bWIgRmxhc2gKKwkJbWluaVBDSSBzbG90IDAgZG9lcyBub3QgaGF2ZSBhIGNhcmQgY29ubmVjdG9yIHNvbGRlcmVkIHRvIHRoZSBib2FyZAorCQltaW5pUENJIHNsb3QgMSBoYXMgYW4gSVNMMzg4MCA4MDIuMTFnIGNhcmQgKFByaXNtNTQpCisJCW5wZTAgaXMgY29ubmVjdGVkIHRvIGEgS2VuZGluIEtTODk5NU0gU3dpdGNoICg0IHBvcnRzKQorCQlucGUxIGlzIHRoZSAid2FuIiBwb3J0CisJCSJDb25zb2xlIiBVQVJUIGlzIGF2YWlsYWJsZSBvbiBKMTEgYXMgY29uc29sZQorCQkiSGlnaCBTcGVlZCIgVUFSVCBpcyBuL2MgKGFzIGZhciBhcyBJIGNhbiB0ZWxsKQorCQkyMCBQaW4gQVJNL1hzY2FsZSBKVEFHIGludGVyZmFjZSBvbiBKMgorCisKK2NvbW1lbnQgIklYUDR4eCBPcHRpb25zIgorCitjb25maWcgSVhQNFhYX0lORElSRUNUX1BDSQorCWJvb2wgIlVzZSBpbmRpcmVjdCBQQ0kgbWVtb3J5IGFjY2VzcyIKKwloZWxwCisgICAgICAgICAgSVhQNHh4IHByb3ZpZGVzIHR3byBtZXRob2RzIG9mIGFjY2Vzc2luZyBQQ0kgbWVtb3J5IHNwYWNlOgorCisgICAgICAgICAgMSkgQSBkaXJlY3QgbWFwcGVkIHdpbmRvdyBmcm9tIDB4NDgwMDAwMDAgdG8gMHg0YmZmZmZmZiAoNjRNQikuCisgICAgICAgICAgICAgVG8gYWNjZXNzIFBDSSB2aWEgdGhpcyBzcGFjZSwgd2Ugc2ltcGx5IGlvcmVtYXAoKSB0aGUgQkFSCisgICAgICAgICAgICAgaW50byB0aGUga2VybmVsIGFuZCB3ZSBjYW4gdXNlIHRoZSBzdGFuZGFyZCByZWFkW2J3bF0vd3JpdGVbYndsXQorICAgICAgICAgICAgIG1hY3Jvcy4gVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBkdWUgdG8gc3BlZWQgYnV0IGl0CisgICAgICAgICAgICAgbGltaXRzIHRoZSBzeXN0ZW0gdG8ganVzdCA2NE1CIG9mIFBDSSBtZW1vcnkuIFRoaXMgY2FuIGJlIAorICAgICAgICAgICAgIHByb2JsYW1hdGljIGlmIHVzaW5nIHZpZGVvIGNhcmRzIGFuZCBvdGhlciBtZW1vcnktaGVhdnkgZGV2aWNlcy4KKyAgICAgICAgICAKKyAgICAgICAgICAyKSBJZiA+IDY0TUIgb2YgbWVtb3J5IHNwYWNlIGlzIHJlcXVpcmVkLCB0aGUgSVhQNHh4IGNhbiBiZSAKKwkgICAgIGNvbmZpZ3VyZWQgdG8gdXNlIGluZGlyZWN0IHJlZ2lzdGVycyB0byBhY2Nlc3MgUENJIFRoaXMgYWxsb3dzIAorCSAgICAgZm9yIHVwIHRvIDEyOE1CICgweDQ4MDAwMDAwIHRvIDB4NGZmZmZmZmYpIG9mIG1lbW9yeSBvbiB0aGUgYnVzLiAKKwkgICAgIFRoZSBkaXNhZHZhbnRhZGdlIG9mIHRoaXMgaXMgdGhhdCBldmVyeSBQQ0kgYWNjZXNzIHJlcXVpcmVzIAorCSAgICAgdGhyZWUgbG9jYWwgcmVnaXN0ZXIgYWNjZXNzZXMgcGx1cyBhIHNwaW5sb2NrLCBidXQgaW4gc29tZSAKKwkgICAgIGNhc2VzIHRoZSBwZXJmb3JtYW5jZSBoaXQgaXMgYWNjZXB0YWJsZS4gSW4gYWRkaXRpb24sIHlvdSBjYW5ub3QgCisJICAgICBtbWFwKCkgUENJIGRldmljZXMgaW4gdGhpcyBjYXNlIGR1ZSB0byB0aGUgaW5kaXJlY3QgbmF0dXJlCisJICAgICBvZiB0aGUgUENJIHdpbmRvdy4KKworCSAgQnkgZGVmYXVsdCwgdGhlIGRpcmVjdCBtZXRob2QgaXMgdXNlZC4gQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdQorCSAgbmVlZCB0byB1c2UgdGhlIGluZGlyZWN0IG1ldGhvZCBpbnN0ZWFkLiBJZiB5b3UgZG9uJ3Qga25vdworCSAgd2hhdCB5b3UgbmVlZCwgbGVhdmUgdGhpcyBvcHRpb24gdW5zZWxlY3RlZC4KKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVjYmRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworb2JqLXkJKz0gY29tbW9uLm8gY29tbW9uLXBjaS5vIAorCitvYmotJChDT05GSUdfQVJDSF9JWERQNFhYKQkrPSBpeGRwNDI1LXBjaS5vIGl4ZHA0MjUtc2V0dXAubworb2JqLSQoQ09ORklHX01BQ0hfSVhEUEc0MjUpCSs9IGl4ZHBnNDI1LXBjaS5vIGNveW90ZS1zZXR1cC5vCitvYmotJChDT05GSUdfQVJDSF9BRElfQ09ZT1RFKQkrPSBjb3lvdGUtcGNpLm8gY295b3RlLXNldHVwLm8KK29iai0kKENPTkZJR19NQUNIX0dUV1g1NzE1KQkrPSBndHd4NTcxNS1wY2kubyBndHd4NTcxNS1zZXR1cC5vCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGM1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsMyBAQAorICAgenJlbGFkZHIteQk6PSAweDAwMDA4MDAwCitwYXJhbXNfcGh5cy15CTo9IDB4MDAwMDAxMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YmNkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMgCisgKgorICogSVhQNFhYIFBDSSByb3V0aW5lcyBmb3IgYWxsIHBsYXRmb3JtcworICoKKyAqIE1haW50YWluZXI6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDAzIEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisKKy8qCisgKiBJWFA0eHggUENJIHJlYWQgZnVuY3Rpb24gaXMgZGVwZW5kZW50IG9uIHdoZXRoZXIgd2UgYXJlIAorICogcnVubmluZyBBMCBvciBCMCAoQXBwbGVHYXRlKSBzaWxpY29uLgorICovCitpbnQgKCppeHA0eHhfcGNpX3JlYWQpKHUzMiBhZGRyLCB1MzIgY21kLCB1MzIqIGRhdGEpOworCisvKgorICogQmFzZSBhZGRyZXNzIGZvciBQQ0kgcmVnc2l0ZXIgcmVnaW9uCisgKi8KK3Vuc2lnbmVkIGxvbmcgaXhwNHh4X3BjaV9yZWdfYmFzZSA9IDA7CisKKy8qCisgKiBQQ0kgY2ZnIGFuIEkvTyByb3V0aW5lcyBhcmUgZG9uZSBieSBwcm9ncmFtbWluZyBhIAorICogY29tbWFuZC9ieXRlIGVuYWJsZSByZWdpc3RlciwgYW5kIHRoZW4gcmVhZC93cml0aW5nCisgKiB0aGUgZGF0YSBmcm9tIGEgZGF0YSByZWdzaXRlci4gV2UgbmVlZCB0byBlbnN1cmUKKyAqIHRoZXNlIHRyYW5zYWN0aW9ucyBhcmUgYXRvbWljIG9yIHdlIHdpbGwgZW5kIHVwCisgKiB3aXRoIGNvcnJ1cHQgZGF0YSBvbiB0aGUgYnVzIG9yIGluIGEgZHJpdmVyLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl4cDR4eF9wY2lfbG9jayk7CisKKy8qCisgKiBSZWFkIGZyb20gUENJIGNvbmZpZyBzcGFjZQorICovCitzdGF0aWMgdm9pZCBjcnBfcmVhZCh1MzIgYWRfY2JlLCB1MzIgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXhwNHh4X3BjaV9sb2NrLCBmbGFncyk7CisJKlBDSV9DUlBfQURfQ0JFID0gYWRfY2JlOworCSpkYXRhID0gKlBDSV9DUlBfUkRBVEE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXhwNHh4X3BjaV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBXcml0ZSB0byBQQ0kgY29uZmlnIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkIGNycF93cml0ZSh1MzIgYWRfY2JlLCB1MzIgZGF0YSkKK3sgCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXhwNHh4X3BjaV9sb2NrLCBmbGFncyk7CisJKlBDSV9DUlBfQURfQ0JFID0gQ1JQX0FEX0NCRV9XUklURSB8IGFkX2NiZTsKKwkqUENJX0NSUF9XREFUQSA9IGRhdGE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXhwNHh4X3BjaV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX21hc3Rlcl9hYm9ydCh2b2lkKQoreworCS8qIGNoZWNrIE1hc3RlciBBYm9ydCBiaXQgYWZ0ZXIgYWNjZXNzICovCisJdW5zaWduZWQgbG9uZyBpc3IgPSAqUENJX0lTUjsKKworCWlmIChpc3IgJiBQQ0lfSVNSX1BGRSkgeworCQkvKiBtYWtlIHN1cmUgdGhlIE1hc3RlciBBYm9ydCBiaXQgaXMgcmVzZXQgKi8gICAgCisJCSpQQ0lfSVNSID0gUENJX0lTUl9QRkU7CisJCXByX2RlYnVnKCIlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaXhwNHh4X3BjaV9yZWFkX2VycmF0YSh1MzIgYWRkciwgdTMyIGNtZCwgdTMyKiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXhwNHh4X3BjaV9sb2NrLCBmbGFncyk7CisKKwkqUENJX05QX0FEID0gYWRkcjsKKworCS8qIAorCSAqIFBDSSB3b3JrYXJvdW5kICAtIG9ubHkgd29ya3MgaWYgTlAgUENJIHNwYWNlIHJlYWRzIGhhdmUgCisJICogbm8gc2lkZSBlZmZlY3RzISEhIFJlYWQgOCB0aW1lcy4gbGFzdCBvbmUgd2lsbCBiZSBnb29kLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJKlBDSV9OUF9DQkUgPSBjbWQ7CisJCSpkYXRhID0gKlBDSV9OUF9SREFUQTsKKwkJKmRhdGEgPSAqUENJX05QX1JEQVRBOworCX0KKworCWlmKGNoZWNrX21hc3Rlcl9hYm9ydCgpKQorCQlyZXR2YWwgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXhwNHh4X3BjaV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGl4cDR4eF9wY2lfcmVhZF9ub19lcnJhdGEodTMyIGFkZHIsIHUzMiBjbWQsIHUzMiogZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWwgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJml4cDR4eF9wY2lfbG9jaywgZmxhZ3MpOworCisJKlBDSV9OUF9BRCA9IGFkZHI7CisKKwkvKiBzZXQgdXAgYW5kIGV4ZWN1dGUgdGhlIHJlYWQgKi8gICAgCisJKlBDSV9OUF9DQkUgPSBjbWQ7CisKKwkvKiB0aGUgcmVzdWx0IG9mIHRoZSByZWFkIGlzIG5vdyBpbiBOUF9SREFUQSAqLworCSpkYXRhID0gKlBDSV9OUF9SREFUQTsgCisKKwlpZihjaGVja19tYXN0ZXJfYWJvcnQoKSkKKwkJcmV0dmFsID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml4cDR4eF9wY2lfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBpeHA0eHhfcGNpX3dyaXRlKHUzMiBhZGRyLCB1MzIgY21kLCB1MzIgZGF0YSkKK3sgICAgCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpeHA0eHhfcGNpX2xvY2ssIGZsYWdzKTsKKworCSpQQ0lfTlBfQUQgPSBhZGRyOworCisJLyogc2V0IHVwIHRoZSB3cml0ZSAqLworCSpQQ0lfTlBfQ0JFID0gY21kOworCisJLyogZXhlY3V0ZSB0aGUgd3JpdGUgYnkgd3JpdGluZyB0byBOUF9XREFUQSAqLworCSpQQ0lfTlBfV0RBVEEgPSBkYXRhOworCisJaWYoY2hlY2tfbWFzdGVyX2Fib3J0KCkpCisJCXJldHZhbCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpeHA0eHhfcGNpX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdTMyIGl4cDR4eF9jb25maWdfYWRkcih1OCBidXNfbnVtLCB1MTYgZGV2Zm4sIGludCB3aGVyZSkKK3sKKwl1MzIgYWRkcjsKKwlpZiAoIWJ1c19udW0pIHsKKwkJLyogdHlwZSAwICovCisJCWFkZHIgPSBCSVQoMzItUENJX1NMT1QoZGV2Zm4pKSB8ICgoUENJX0ZVTkMoZGV2Zm4pKSA8PCA4KSB8IAorCQkgICAgKHdoZXJlICYgfjMpOwkKKwl9IGVsc2UgeworCQkvKiB0eXBlIDEgKi8KKwkJYWRkciA9IChidXNfbnVtIDw8IDE2KSB8ICgoUENJX1NMT1QoZGV2Zm4pKSA8PCAxMSkgfCAKKwkJCSgoUENJX0ZVTkMoZGV2Zm4pKSA8PCA4KSB8ICh3aGVyZSAmIH4zKSB8IDE7CisJfQorCXJldHVybiBhZGRyOworfQorCisvKgorICogTWFzayB0YWJsZSwgYml0cyB0byBtYXNrIGZvciBxdWFudGl0eSBvZiBzaXplIDEsIDIgb3IgNCBieXRlcy4KKyAqIDAgYW5kIDMgYXJlIG5vdCB2YWxpZCBpbmRleGVzLi4uCisgKi8KK3N0YXRpYyB1MzIgYnl0ZW1hc2tbXSA9IHsKKwkvKjAqLwkwLAorCS8qMSovCTB4ZmYsCisJLyoyKi8JMHhmZmZmLAorCS8qMyovCTAsCisJLyo0Ki8JMHhmZmZmZmZmZiwKK307CisKK3N0YXRpYyB1MzIgbG9jYWxfYnl0ZV9sYW5lX2VuYWJsZV9iaXRzKHUzMiBuLCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA9PSAxKQorCQlyZXR1cm4gKDB4ZiAmIH5CSVQobikpIDw8IENSUF9BRF9DQkVfQkVTTDsKKwlpZiAoc2l6ZSA9PSAyKQorCQlyZXR1cm4gKDB4ZiAmIH4oQklUKG4pIHwgQklUKG4rMSkpKSA8PCBDUlBfQURfQ0JFX0JFU0w7CisJaWYgKHNpemUgPT0gNCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDB4ZmZmZmZmZmY7Cit9CisKK3N0YXRpYyBpbnQgbG9jYWxfcmVhZF9jb25maWcoaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKK3sgCisJdTMyIG4sIGRhdGE7CisJcHJfZGVidWcoImxvY2FsX3JlYWRfY29uZmlnIGZyb20gJWQgc2l6ZSAlZFxuIiwgd2hlcmUsIHNpemUpOworCW4gPSB3aGVyZSAlIDQ7CisJY3JwX3JlYWQod2hlcmUgJiB+MywgJmRhdGEpOworCSp2YWx1ZSA9IChkYXRhID4+ICg4Km4pKSAmIGJ5dGVtYXNrW3NpemVdOworCXByX2RlYnVnKCJsb2NhbF9yZWFkX2NvbmZpZyByZWFkICUjeFxuIiwgKnZhbHVlKTsKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IGxvY2FsX3dyaXRlX2NvbmZpZyhpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsdWUpCit7CisJdTMyIG4sIGJ5dGVfZW5hYmxlcywgZGF0YTsKKwlwcl9kZWJ1ZygibG9jYWxfd3JpdGVfY29uZmlnICUjeCB0byAlZCBzaXplICVkXG4iLCB2YWx1ZSwgd2hlcmUsIHNpemUpOworCW4gPSB3aGVyZSAlIDQ7CisJYnl0ZV9lbmFibGVzID0gbG9jYWxfYnl0ZV9sYW5lX2VuYWJsZV9iaXRzKG4sIHNpemUpOworCWlmIChieXRlX2VuYWJsZXMgPT0gMHhmZmZmZmZmZikKKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKwlkYXRhID0gdmFsdWUgPDwgKDgqbik7CisJY3JwX3dyaXRlKCh3aGVyZSAmIH4zKSB8IGJ5dGVfZW5hYmxlcywgZGF0YSk7CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHUzMiBieXRlX2xhbmVfZW5hYmxlX2JpdHModTMyIG4sIGludCBzaXplKQoreworCWlmIChzaXplID09IDEpCisJCXJldHVybiAoMHhmICYgfkJJVChuKSkgPDwgNDsKKwlpZiAoc2l6ZSA9PSAyKQorCQlyZXR1cm4gKDB4ZiAmIH4oQklUKG4pIHwgQklUKG4rMSkpKSA8PCA0OworCWlmIChzaXplID09IDQpCisJCXJldHVybiAwOworCXJldHVybiAweGZmZmZmZmZmOworfQorCitzdGF0aWMgaW50IGl4cDR4eF9wY2lfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbHVlKQoreworCXUzMiBuLCBieXRlX2VuYWJsZXMsIGFkZHIsIGRhdGE7CisJdTggYnVzX251bSA9IGJ1cy0+bnVtYmVyOworCisJcHJfZGVidWcoInJlYWRfY29uZmlnIGZyb20gJWQgc2l6ZSAlZCBkZXYgJWQ6JWQ6JWRcbiIsIHdoZXJlLCBzaXplLAorCQlidXNfbnVtLCBQQ0lfU0xPVChkZXZmbiksIFBDSV9GVU5DKGRldmZuKSk7CisKKwkqdmFsdWUgPSAweGZmZmZmZmZmOworCW4gPSB3aGVyZSAlIDQ7CisJYnl0ZV9lbmFibGVzID0gYnl0ZV9sYW5lX2VuYWJsZV9iaXRzKG4sIHNpemUpOworCWlmIChieXRlX2VuYWJsZXMgPT0gMHhmZmZmZmZmZikKKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKworCWFkZHIgPSBpeHA0eHhfY29uZmlnX2FkZHIoYnVzX251bSwgZGV2Zm4sIHdoZXJlKTsKKwlpZiAoaXhwNHh4X3BjaV9yZWFkKGFkZHIsIGJ5dGVfZW5hYmxlcyB8IE5QX0NNRF9DT05GSUdSRUFELCAmZGF0YSkpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwkqdmFsdWUgPSAoZGF0YSA+PiAoOCpuKSkgJiBieXRlbWFza1tzaXplXTsKKwlwcl9kZWJ1ZygicmVhZF9jb25maWdfYnl0ZSByZWFkICUjeFxuIiwgKnZhbHVlKTsKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IGl4cDR4eF9wY2lfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgbiwgYnl0ZV9lbmFibGVzLCBhZGRyLCBkYXRhOworCXU4IGJ1c19udW0gPSBidXMtPm51bWJlcjsKKworCXByX2RlYnVnKCJ3cml0ZV9jb25maWdfYnl0ZSAlI3ggdG8gJWQgc2l6ZSAlZCBkZXYgJWQ6JWQ6JWRcbiIsIHZhbHVlLCB3aGVyZSwKKwkJc2l6ZSwgYnVzX251bSwgUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbikpOworCisJbiA9IHdoZXJlICUgNDsKKwlieXRlX2VuYWJsZXMgPSBieXRlX2xhbmVfZW5hYmxlX2JpdHMobiwgc2l6ZSk7CisJaWYgKGJ5dGVfZW5hYmxlcyA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCisJYWRkciA9IGl4cDR4eF9jb25maWdfYWRkcihidXNfbnVtLCBkZXZmbiwgd2hlcmUpOworCWRhdGEgPSB2YWx1ZSA8PCAoOCpuKTsKKwlpZiAoaXhwNHh4X3BjaV93cml0ZShhZGRyLCBieXRlX2VuYWJsZXMgfCBOUF9DTURfQ09ORklHV1JJVEUsIGRhdGEpKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RydWN0IHBjaV9vcHMgaXhwNHh4X29wcyA9IHsKKwkucmVhZCA9ICBpeHA0eHhfcGNpX3JlYWRfY29uZmlnLAorCS53cml0ZSA9IGl4cDR4eF9wY2lfd3JpdGVfY29uZmlnLAorfTsKKworLyoKKyAqIFBDSSBhYm9ydCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpbnQgYWJvcnRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBpc3IsIHN0YXR1czsKKworCWlzciA9ICpQQ0lfSVNSOworCWxvY2FsX3JlYWRfY29uZmlnKFBDSV9TVEFUVVMsIDIsICZzdGF0dXMpOworCXByX2RlYnVnKCJQQ0k6IGFib3J0X2hhbmRsZXIgYWRkciA9ICUjbHgsIGlzciA9ICUjeCwgIgorCQkic3RhdHVzID0gJSN4XG4iLCBhZGRyLCBpc3IsIHN0YXR1cyk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIE1hc3RlciBBYm9ydCBiaXQgaXMgcmVzZXQgKi8gICAgCisJKlBDSV9JU1IgPSBQQ0lfSVNSX1BGRTsKKwlzdGF0dXMgfD0gUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUOworCWxvY2FsX3dyaXRlX2NvbmZpZyhQQ0lfU1RBVFVTLCAyLCBzdGF0dXMpOworCisJLyoKKwkgKiBJZiBpdCB3YXMgYW4gaW1wcmVjaXNlIGFib3J0LCB0aGVuIHdlIG5lZWQgdG8gY29ycmVjdCB0aGUKKwkgKiByZXR1cm4gYWRkcmVzcyB0byBiZSBfYWZ0ZXJfIHRoZSBpbnN0cnVjdGlvbi4KKwkgKi8KKwlpZiAoZnNyICYgKDEgPDwgMTApKQorCQlyZWdzLT5BUk1fcGMgKz0gNDsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTZXR1cCBETUEgbWFzayB0byA2NE1CIG9uIFBDSSBkZXZpY2VzLiBJZ25vcmUgYWxsIG90aGVyIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgaXhwNHh4X3BjaV9wbGF0Zm9ybV9ub3RpZnkoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpIHsKKwkJKmRldi0+ZG1hX21hc2sgPSAgU1pfNjRNIC0gMTsKKwkJZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IFNaXzY0TSAtIDE7CisJCWRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYoZGV2LCAyMDQ4LCA0MDk2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXhwNHh4X3BjaV9wbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZihkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CisJCWRtYWJvdW5jZV91bnJlZ2lzdGVyX2RldihkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRtYV9uZWVkc19ib3VuY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUgKSAmJiAoKGRtYV9hZGRyICsgc2l6ZSkgPj0gU1pfNjRNKTsKK30KKwordm9pZCBfX2luaXQgaXhwNHh4X3BjaV9wcmVpbml0KHZvaWQpCit7ICAKKwl1bnNpZ25lZCBsb25nIHByb2Nlc3Nvcl9pZDsKKworCWFzbSgibXJjIHAxNSwgMCwgJTAsIGNyMCwgY3IwLCAwOyIgOiAiPXIiKHByb2Nlc3Nvcl9pZCkgOik7CisKKwkvKgorCSAqIERldGVybWluZSB3aGljaCBQQ0kgcmVhZCBtZXRob2QgdG8gdXNlLgorCSAqIFJldiAwIElYUDQyNSByZXF1aXJlcyB3b3JrYXJvdW5kLgorCSAqLworCWlmICghKHByb2Nlc3Nvcl9pZCAmIDB4ZikgJiYgIWNwdV9pc19peHA0NngoKSkgeworCQlwcmludGsoIlBDSTogSVhQNDJ4IEEwIHNpbGljb24gZGV0ZWN0ZWQgLSAiCisJCQkiUENJIE5vbi1QcmVmZXRjaCBXb3JrYXJvdW5kIEVuYWJsZWRcbiIpOworCQlpeHA0eHhfcGNpX3JlYWQgPSBpeHA0eHhfcGNpX3JlYWRfZXJyYXRhOworCX0gZWxzZQorCQlpeHA0eHhfcGNpX3JlYWQgPSBpeHA0eHhfcGNpX3JlYWRfbm9fZXJyYXRhOworCisKKwkvKiBob29rIGluIG91ciBmYXVsdCBoYW5kbGVyIGZvciBQQ0kgZXJyb3JzICovCisJaG9va19mYXVsdF9jb2RlKDE2KzYsIGFib3J0X2hhbmRsZXIsIFNJR0JVUywgImltcHJlY2lzZSBleHRlcm5hbCBhYm9ydCIpOworCisJcHJfZGVidWcoInNldHVwIFBDSS1BSEIoaW5ib3VuZCkgYW5kIEFIQi1QQ0kob3V0Ym91bmQpIGFkZHJlc3MgbWFwcGluZ3NcbiIpOworCisJLyogCisJICogV2UgdXNlIGlkZW50aXR5IEFIQi0+UENJIGFkZHJlc3MgdHJhbnNsYXRpb24KKwkgKiBpbiB0aGUgMHg0ODAwMDAwMCB0byAweDRiZmZmZmZmIGFkZHJlc3Mgc3BhY2UKKwkgKi8KKwkqUENJX1BDSU1FTUJBU0UgPSAweDQ4NDk0QTRCOworCisJLyogCisJICogV2UgYWxzbyB1c2UgaWRlbnRpdHkgUENJLT5BSEIgYWRkcmVzcyB0cmFuc2xhdGlvbgorCSAqIGluIDQgMTZNQiBCQVJzIHRoYXQgYmVnaW4gYXQgdGhlIHBoeXNpY2FsIG1lbW9yeSBzdGFydAorCSAqLworCSpQQ0lfQUhCTUVNQkFTRSA9IChQSFlTX09GRlNFVCAmIDB4RkYwMDAwMDApICsgCisJCSgoUEhZU19PRkZTRVQgJiAweEZGMDAwMDAwKSA+PiA4KSArCisJCSgoUEhZU19PRkZTRVQgJiAweEZGMDAwMDAwKSA+PiAxNikgKworCQkoKFBIWVNfT0ZGU0VUICYgMHhGRjAwMDAwMCkgPj4gMjQpICsKKwkJMHgwMDAxMDIwMzsKKworCWlmICgqUENJX0NTUiAmIFBDSV9DU1JfSE9TVCkgeworCQlwcmludGsoIlBDSTogSVhQNHh4IGlzIGhvc3RcbiIpOworCisJCXByX2RlYnVnKCJzZXR1cCBCQVJzIGluIGNvbnRyb2xsZXJcbiIpOworCisJCS8qCisJCSAqIFdlIGNvbmZpZ3VyZSB0aGUgUENJIGluYm91bmQgbWVtb3J5IHdpbmRvd3MgdG8gYmUgCisJCSAqIDE6MSBtYXBwZWQgdG8gU0RSQU0KKwkJICovCisJCWxvY2FsX3dyaXRlX2NvbmZpZyhQQ0lfQkFTRV9BRERSRVNTXzAsIDQsIFBIWVNfT0ZGU0VUICsgMHgwMDAwMDAwMCk7CisJCWxvY2FsX3dyaXRlX2NvbmZpZyhQQ0lfQkFTRV9BRERSRVNTXzEsIDQsIFBIWVNfT0ZGU0VUICsgMHgwMTAwMDAwMCk7CisJCWxvY2FsX3dyaXRlX2NvbmZpZyhQQ0lfQkFTRV9BRERSRVNTXzIsIDQsIFBIWVNfT0ZGU0VUICsgMHgwMjAwMDAwMCk7CisJCWxvY2FsX3dyaXRlX2NvbmZpZyhQQ0lfQkFTRV9BRERSRVNTXzMsIDQsIFBIWVNfT0ZGU0VUICsgMHgwMzAwMDAwMCk7CisKKwkJLyoKKwkJICogRW5hYmxlIENTUiB3aW5kb3cgYXQgMHhmZjAwMDAwMC4KKwkJICovCisJCWxvY2FsX3dyaXRlX2NvbmZpZyhQQ0lfQkFTRV9BRERSRVNTXzQsIDQsIDB4ZmYwMDAwMDgpOworCisJCS8qCisJCSAqIEVuYWJsZSB0aGUgSU8gd2luZG93IHRvIGJlIHdheSB1cCBoaWdoLCBhdCAweGZmZmZmYzAwCisJCSAqLworCQlsb2NhbF93cml0ZV9jb25maWcoUENJX0JBU0VfQUREUkVTU181LCA0LCAweGZmZmZmYzAxKTsKKwl9IGVsc2UgeworCQlwcmludGsoIlBDSTogSVhQNHh4IGlzIHRhcmdldCAtIE5vIGJ1cyBzY2FuIHBlcmZvcm1lZFxuIik7CisJfQorCisJcHJpbnRrKCJQQ0k6IElYUDR4eCBVc2luZyAlcyBhY2Nlc3MgZm9yIG1lbW9yeSBzcGFjZVxuIiwKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJCSJkaXJlY3QiCisjZWxzZQorCQkJImluZGlyZWN0IgorI2VuZGlmCisJCSk7CisKKwlwcl9kZWJ1ZygiY2xlYXIgZXJyb3IgYml0cyBpbiBJU1JcbiIpOworCSpQQ0lfSVNSID0gUENJX0lTUl9QU0UgfCBQQ0lfSVNSX1BGRSB8IFBDSV9JU1JfUFBFIHwgUENJX0lTUl9BSEJFOworCisJLyoKKwkgKiBTZXQgSW5pdGlhbGl6ZSBDb21wbGV0ZSBpbiBQQ0kgQ29udHJvbCBSZWdpc3RlcjogYWxsb3cgSVhQNFhYIHRvCisJICogcmVzcG9uZCB0byBQQ0kgY29uZmlndXJhdGlvbiBjeWNsZXMuIFNwZWNpZnkgdGhhdCB0aGUgQUhCIGJ1cyBpcworCSAqIG9wZXJhdGluZyBpbiBiaWcgZW5kaWFuIG1vZGUuIFNldCB1cCBieXRlIGxhbmUgc3dhcHBpbmcgYmV0d2VlbiAKKwkgKiBsaXR0bGUtZW5kaWFuIFBDSSBhbmQgdGhlIGJpZy1lbmRpYW4gQUhCIGJ1cyAKKwkgKi8KKyNpZmRlZiBfX0FSTUVCX18KKwkqUENJX0NTUiA9IFBDSV9DU1JfSUMgfCBQQ0lfQ1NSX0FCRSB8IFBDSV9DU1JfUERTIHwgUENJX0NTUl9BRFM7CisjZWxzZQorCSpQQ0lfQ1NSID0gUENJX0NTUl9JQzsKKyNlbmRpZgorCisJcHJfZGVidWcoIkRPTkVcbiIpOworfQorCitpbnQgaXhwNHh4X3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYgKG5yID49IDEpCisJCXJldHVybiAwOworCisJcmVzID0ga21hbGxvYyhzaXplb2YoKnJlcykgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJLyogCisJCSAqIElmIHdlJ3JlIG91dCBvZiBtZW1vcnkgdGhpcyBlYXJseSwgc29tZXRoaW5nIGlzIHdyb25nLAorCQkgKiBzbyB3ZSBtaWdodCBhcyB3ZWxsIGNhdGNoIGl0IGhlcmUuCisJCSAqLworCQlwYW5pYygiUENJOiB1bmFibGUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzP1xuIik7CisJfQorCW1lbXNldChyZXMsIDAsIHNpemVvZigqcmVzKSAqIDIpOworCisJbG9jYWxfd3JpdGVfY29uZmlnKFBDSV9DT01NQU5ELCAyLCBQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9NRU1PUlkpOworCisJcmVzWzBdLm5hbWUgPSAiUENJIEkvTyBTcGFjZSI7CisJcmVzWzBdLnN0YXJ0ID0gMHgwMDAwMTAwMDsKKwlyZXNbMF0uZW5kID0gMHhmZmZmMDAwMDsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCisJcmVzWzFdLm5hbWUgPSAiUENJIE1lbW9yeSBTcGFjZSI7CisJcmVzWzFdLnN0YXJ0ID0gMHg0ODAwMDAwMDsKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwlyZXNbMV0uZW5kID0gMHg0YmZmZmZmZjsKKyNlbHNlCisJcmVzWzFdLmVuZCA9IDB4NGZmZmZmZmY7CisjZW5kaWYKKwlyZXNbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKworCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnJlc1swXSk7CisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZyZXNbMV0pOworCisJc3lzLT5yZXNvdXJjZVswXSA9ICZyZXNbMF07CisJc3lzLT5yZXNvdXJjZVsxXSA9ICZyZXNbMV07CisJc3lzLT5yZXNvdXJjZVsyXSA9IE5VTEw7CisKKwlwbGF0Zm9ybV9ub3RpZnkgPSBpeHA0eHhfcGNpX3BsYXRmb3JtX25vdGlmeTsKKwlwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlID0gaXhwNHh4X3BjaV9wbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlOworCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBwY2lfYnVzICppeHA0eHhfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJcmV0dXJuIHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmaXhwNHh4X29wcywgc3lzKTsKK30KKworLyoKKyAqIFdlIG92ZXJyaWRlIHRoZXNlIHNvIHdlIHByb3Blcmx5IGRvIGRtYWJvdW5jZSBvdGhlcndpc2UgZHJpdmVycworICogYXJlIGFibGUgdG8gc2V0IHRoZSBkbWFfbWFzayB0byAweGZmZmZmZmZmIGFuZCB3ZSBjYW4gbm8gbG9uZ2VyCisgKiB0cmFwIGJvdW5jZXMuIDooCisgKgorICogV2UganVzdCByZXR1cm4gdHJ1ZSBvbiBldmVyeWhpbmcgZXhjZXB0IGZvciA8IDY0TUIgaW4gd2hpY2ggY2FzZSAKKyAqIHdlIHdpbGwgZmFpbCBtaXNlcmFsYnkgYW5kIGRpZSBzaW5jZSB3ZSBjYW4ndCBoYW5kbGUgdGhhdCBjYXNlLgorICovCitpbnQKK3BjaV9zZXRfZG1hX21hc2soc3RydWN0IHBjaV9kZXYgKmRldiwgdTY0IG1hc2spCit7CisJaWYgKG1hc2sgPj0gU1pfNjRNIC0gMSApCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU87Cit9CisgICAgCitpbnQKK3BjaV9kYWNfc2V0X2RtYV9tYXNrKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU2NCBtYXNrKQoreworCWlmIChtYXNrID49IFNaXzY0TSAtIDEgKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlPOworfQorCitpbnQKK3BjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1NjQgbWFzaykKK3sKKwlpZiAobWFzayA+PSBTWl82NE0gLSAxICkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTzsKK30KKworRVhQT1JUX1NZTUJPTChwY2lfc2V0X2RtYV9tYXNrKTsKK0VYUE9SVF9TWU1CT0wocGNpX2RhY19zZXRfZG1hX21hc2spOworRVhQT1JUX1NZTUJPTChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2spOworRVhQT1JUX1NZTUJPTChpeHA0eHhfcGNpX3JlYWQpOworRVhQT1JUX1NZTUJPTChpeHA0eHhfcGNpX3dyaXRlKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdiYTAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYworICoKKyAqIEdlbmVyaWMgY29kZSBzaGFyZWQgYWNyb3NzIGFsbCBJWFA0WFggcGxhdGZvcm1zCisgKgorICogTWFpbnRhaW5lcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiAoYykgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDAzLTIwMDQgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuIAorICogCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IAorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCitlbnVtIGl4cDR4eF9pcnFfdHlwZSB7CisJSVhQNFhYX0lSUV9MRVZFTCwgSVhQNFhYX0lSUV9FREdFCit9Oworc3RhdGljIHZvaWQgaXhwNHh4X2NvbmZpZ19pcnEodW5zaWduZWQgaXJxLCBlbnVtIGl4cDR4eF9pcnFfdHlwZSB0eXBlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdQSU8gYWNjZXMgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvbmZpZ3VyZSBHUElPIGxpbmUgZm9yIGlucHV0LCBpbnRlcnJ1cHQsIG9yIG91dHB1dCBvcGVyYXRpb24KKyAqCisgKiBUT0RPOiBFbmFibGUvZGlzYWJsZSB0aGUgaXJxX2Rlc2MgYmFzZWQgb24gaW50ZXJydXB0IG9yIG91dHB1dCBtb2RlLgorICogVE9ETzogU2hvdWxkIHRoZXNlIGJlIG5hbWVkIGl4cDR4eF9ncGlvXz8KKyAqLwordm9pZCBncGlvX2xpbmVfY29uZmlnKHU4IGxpbmUsIHUzMiBzdHlsZSkKK3sKKwlzdGF0aWMgY29uc3QgaW50IGdwaW8yaXJxW10gPSB7CisJCTYsIDcsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOQorCX07CisJdTMyIGVuYWJsZTsKKwl2b2xhdGlsZSB1MzIgKmludF9yZWc7CisJdTMyIGludF9zdHlsZTsKKwllbnVtIGl4cDR4eF9pcnFfdHlwZSBpcnFfdHlwZTsKKworCWVuYWJsZSA9ICpJWFA0WFhfR1BJT19HUE9FUjsKKworCWlmIChzdHlsZSAmIElYUDRYWF9HUElPX09VVCkgeworCQllbmFibGUgJj0gfigoMSkgPDwgbGluZSk7CisJfSBlbHNlIGlmIChzdHlsZSAmIElYUDRYWF9HUElPX0lOKSB7CisJCWVuYWJsZSB8PSAoKDEpIDw8IGxpbmUpOworCisJCXN3aXRjaCAoc3R5bGUgJiBJWFA0WFhfR1BJT19JTlRTVFlMRV9NQVNLKQorCQl7CisJCWNhc2UgKElYUDRYWF9HUElPX0FDVElWRV9ISUdIKToKKwkJCWludF9zdHlsZSA9IElYUDRYWF9HUElPX1NUWUxFX0FDVElWRV9ISUdIOworCQkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0xFVkVMOworCQkJYnJlYWs7CisJCWNhc2UgKElYUDRYWF9HUElPX0FDVElWRV9MT1cpOgorCQkJaW50X3N0eWxlID0gSVhQNFhYX0dQSU9fU1RZTEVfQUNUSVZFX0xPVzsKKwkJCWlycV90eXBlID0gSVhQNFhYX0lSUV9MRVZFTDsKKwkJCWJyZWFrOworCQljYXNlIChJWFA0WFhfR1BJT19SSVNJTkdfRURHRSk6CisJCQlpbnRfc3R5bGUgPSBJWFA0WFhfR1BJT19TVFlMRV9SSVNJTkdfRURHRTsKKwkJCWlycV90eXBlID0gSVhQNFhYX0lSUV9FREdFOworCQkJYnJlYWs7CisJCWNhc2UgKElYUDRYWF9HUElPX0ZBTExJTkdfRURHRSk6CisJCQlpbnRfc3R5bGUgPSBJWFA0WFhfR1BJT19TVFlMRV9GQUxMSU5HX0VER0U7CisJCQlpcnFfdHlwZSA9IElYUDRYWF9JUlFfRURHRTsKKwkJCWJyZWFrOworCQljYXNlIChJWFA0WFhfR1BJT19UUkFOU0lUSU9OQUwpOgorCQkJaW50X3N0eWxlID0gSVhQNFhYX0dQSU9fU1RZTEVfVFJBTlNJVElPTkFMOworCQkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0VER0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWludF9zdHlsZSA9IElYUDRYWF9HUElPX1NUWUxFX0FDVElWRV9ISUdIOworCQkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0xFVkVMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3R5bGUgJiBJWFA0WFhfR1BJT19JTlRTVFlMRV9NQVNLKQorCQkJaXhwNHh4X2NvbmZpZ19pcnEoZ3BpbzJpcnFbbGluZV0sIGlycV90eXBlKTsKKworCQlpZiAobGluZSA+PSA4KSB7CS8qIHBpbnMgOC0xNSAqLyAKKwkJCWxpbmUgLT0gODsKKwkJCWludF9yZWcgPSBJWFA0WFhfR1BJT19HUElUMlI7CisJCX0KKwkJZWxzZSB7CQkJLyogcGlucyAwLTcgKi8KKwkJCWludF9yZWcgPSBJWFA0WFhfR1BJT19HUElUMVI7CisJCX0KKworCQkvKiBDbGVhciB0aGUgc3R5bGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBwaW4gKi8KKwkJKmludF9yZWcgJj0gfihJWFA0WFhfR1BJT19TVFlMRV9DTEVBUiA8PCAKKwkJICAgIAkJKGxpbmUgKiBJWFA0WFhfR1BJT19TVFlMRV9TSVpFKSk7CisKKwkJLyogU2V0IHRoZSBuZXcgc3R5bGUgKi8KKwkJKmludF9yZWcgfD0gKGludF9zdHlsZSA8PCAobGluZSAqIElYUDRYWF9HUElPX1NUWUxFX1NJWkUpKTsKKwl9CisKKwkqSVhQNFhYX0dQSU9fR1BPRVIgPSBlbmFibGU7Cit9CisKK0VYUE9SVF9TWU1CT0woZ3Bpb19saW5lX2NvbmZpZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJWFA0eHggY2hpcHNldCBJL08gbWFwcGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGl4cDR4eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CS8qIFVBUlQsIEludGVycnVwdCBjdHJsLCBHUElPLCB0aW1lcnMsIE5QRXMsIE1BQ3MsIFVTQiAuLi4uICovCisJCS52aXJ0dWFsCT0gSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJULAorCQkucGh5c2ljYWwJPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJCS5sZW5ndGgJCT0gSVhQNFhYX1BFUklQSEVSQUxfUkVHSU9OX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sIHsJLyogRXhwYW5zaW9uIEJ1cyBDb25maWcgUmVnaXN0ZXJzICovCisJCS52aXJ0dWFsCT0gSVhQNFhYX0VYUF9DRkdfQkFTRV9WSVJULAorCQkucGh5c2ljYWwJPSBJWFA0WFhfRVhQX0NGR19CQVNFX1BIWVMsCisJCS5sZW5ndGgJCT0gSVhQNFhYX0VYUF9DRkdfUkVHSU9OX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sIHsJLyogUENJIFJlZ2lzdGVycyAqLworCQkudmlydHVhbAk9IElYUDRYWF9QQ0lfQ0ZHX0JBU0VfVklSVCwKKwkJLnBoeXNpY2FsCT0gSVhQNFhYX1BDSV9DRkdfQkFTRV9QSFlTLAorCQkubGVuZ3RoCQk9IElYUDRYWF9QQ0lfQ0ZHX1JFR0lPTl9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9Cit9OworCit2b2lkIF9faW5pdCBpeHA0eHhfbWFwX2lvKHZvaWQpCit7CisgIAlpb3RhYmxlX2luaXQoaXhwNHh4X2lvX2Rlc2MsIEFSUkFZX1NJWkUoaXhwNHh4X2lvX2Rlc2MpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVhQNHh4IGNoaXBzZXQgSVJRIGhhbmRsaW5nCisgKgorICogVE9ETzogR1BJTyBJUlFzIHNob3VsZCBiZSBtYXJrZWQgaW52YWxpZCB1bnRpbCB0aGUgdXNlciBvZiB0aGUgSVJRCisgKiAgICAgICAoYmUgaXQgUENJIG9yIHNvbWV0aGluZyBlbHNlKSBjb25maWd1cmVzIHRoYXQgR1BJTyBsaW5lCisgKiAgICAgICBhcyBhbiBJUlEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpeHA0eHhfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoY3B1X2lzX2l4cDQ2eCgpICYmIGlycSA+PSAzMikKKwkJKklYUDRYWF9JQ01SMiAmPSB+KDEgPDwgKGlycSAtIDMyKSk7CisJZWxzZQorCQkqSVhQNFhYX0lDTVIgJj0gfigxIDw8IGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGl4cDR4eF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKGNwdV9pc19peHA0NngoKSAmJiBpcnEgPj0gMzIpCisJCSpJWFA0WFhfSUNNUjIgfD0gKDEgPDwgKGlycSAtIDMyKSk7CisJZWxzZQorCQkqSVhQNFhYX0lDTVIgfD0gKDEgPDwgaXJxKTsKK30KKworc3RhdGljIHZvaWQgaXhwNHh4X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdGF0aWMgaW50IGlycTJncGlvWzMyXSA9IHsKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAxLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsICAyLCAgMywgIDQsICA1LCAgNiwKKwkJIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgLTEsIC0xLAorCX07CisJaW50IGxpbmUgPSAoaXJxIDwgMzIpID8gaXJxMmdwaW9baXJxXSA6IC0xOworCisJaWYgKGxpbmUgPj0gMCkKKwkJZ3Bpb19saW5lX2lzcl9jbGVhcihsaW5lKTsKK30KKworLyoKKyAqIExldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIG9uIEdQSU8gbGluZXMgY2FuIG9ubHkgYmUgY2xlYXJlZCB3aGVuIHRoZQorICogaW50ZXJydXB0IGNvbmRpdGlvbiBkaXNhcHBlYXJzLgorICovCitzdGF0aWMgdm9pZCBpeHA0eHhfaXJxX2xldmVsX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCWl4cDR4eF9pcnFfYWNrKGlycSk7CisJaXhwNHh4X2lycV91bm1hc2soaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGl4cDR4eF9pcnFfbGV2ZWxfY2hpcCA9IHsKKwkuYWNrCT0gaXhwNHh4X2lycV9tYXNrLAorCS5tYXNrCT0gaXhwNHh4X2lycV9tYXNrLAorCS51bm1hc2sJPSBpeHA0eHhfaXJxX2xldmVsX3VubWFzaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2VkZ2VfY2hpcCA9IHsKKwkuYWNrCT0gaXhwNHh4X2lycV9hY2ssCisJLm1hc2sJPSBpeHA0eHhfaXJxX21hc2ssCisJLnVubWFzawk9IGl4cDR4eF9pcnFfdW5tYXNrLAorfTsKKworc3RhdGljIHZvaWQgaXhwNHh4X2NvbmZpZ19pcnEodW5zaWduZWQgaXJxLCBlbnVtIGl4cDR4eF9pcnFfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVhQNFhYX0lSUV9MRVZFTDoKKwkJc2V0X2lycV9jaGlwKGlycSwgJml4cDR4eF9pcnFfbGV2ZWxfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCWJyZWFrOworCWNhc2UgSVhQNFhYX0lSUV9FREdFOgorCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhwNHh4X2lycV9lZGdlX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCWJyZWFrOworCX0KKwlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Cit9CisKK3ZvaWQgX19pbml0IGl4cDR4eF9pbml0X2lycSh2b2lkKQoreworCWludCBpID0gMDsKKworCS8qIFJvdXRlIGFsbCBzb3VyY2VzIHRvIElSUSBpbnN0ZWFkIG9mIEZJUSAqLworCSpJWFA0WFhfSUNMUiA9IDB4MDsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdCAqLworCSpJWFA0WFhfSUNNUiA9IDB4MDsgCisKKwlpZiAoY3B1X2lzX2l4cDQ2eCgpKSB7CisJCS8qIFJvdXRlIHVwcGVyIDMyIHNvdXJjZXMgdG8gSVJRIGluc3RlYWQgb2YgRklRICovCisJCSpJWFA0WFhfSUNMUjIgPSAweDAwOworCisJCS8qIERpc2FibGUgdXBwZXIgMzIgaW50ZXJydXB0cyAqLworCQkqSVhQNFhYX0lDTVIyID0gMHgwMDsKKwl9CisKKyAgICAgICAgLyogRGVmYXVsdCB0byBhbGwgbGV2ZWwgdHJpZ2dlcmVkICovCisJZm9yKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKQorCQlpeHA0eHhfY29uZmlnX2lycShpLCBJWFA0WFhfSVJRX0xFVkVMKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVhQNHh4IHRpbWVyIHRpY2sKKyAqIFdlIHVzZSBPUyB0aW1lcjEgb24gdGhlIENQVSBmb3IgdGhlIHRpbWVyIHRpY2sgYW5kIHRoZSB0aW1lc3RhbXAgCisgKiBjb3VudGVyIGFzIGEgc291cmNlIG9mIHJlYWwgY2xvY2sgdGlja3MgdG8gYWNjb3VudCBmb3IgbWlzc2VkIGppZmZpZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIHZvbGF0aWxlIGxhc3RfamlmZnlfdGltZTsKKworI2RlZmluZSBDTE9DS19USUNLU19QRVJfVVNFQwkoKENMT0NLX1RJQ0tfUkFURSArIFVTRUNfUEVSX1NFQy8yKSAvIFVTRUNfUEVSX1NFQykKKworLyogSVJRcyBhcmUgZGlzYWJsZWQgYmVmb3JlIGVudGVyaW5nIGhlcmUgZnJvbSBkb19nZXR0aW1lb2ZkYXkoKSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXhwNHh4X2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwl1MzIgZWxhcHNlZDsKKworCWVsYXBzZWQgPSAqSVhQNFhYX09TVFMgLSBsYXN0X2ppZmZ5X3RpbWU7CisKKwlyZXR1cm4gZWxhcHNlZCAvIENMT0NLX1RJQ0tTX1BFUl9VU0VDOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaXhwNHh4X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJLyogQ2xlYXIgUGVuZGluZyBJbnRlcnJ1cHQgYnkgd3JpdGluZyAnMScgdG8gaXQgKi8KKwkqSVhQNFhYX09TU1QgPSBJWFA0WFhfT1NTVF9USU1FUl8xX1BFTkQ7CisKKwkvKgorCSAqIENhdGNoIHVwIHdpdGggdGhlIHJlYWwgaWRlYSBvZiB0aW1lCisJICovCisJd2hpbGUgKCgqSVhQNFhYX09TVFMgLSBsYXN0X2ppZmZ5X3RpbWUpID4gTEFUQ0gpIHsKKwkJdGltZXJfdGljayhyZWdzKTsKKwkJbGFzdF9qaWZmeV90aW1lICs9IExBVENIOworCX0KKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGl4cDR4eF90aW1lcl9pcnEgPSB7CisJLm5hbWUJCT0gIklYUDR4eCBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gaXhwNHh4X3RpbWVyX2ludGVycnVwdAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGl4cDR4eF90aW1lcl9pbml0KHZvaWQpCit7CisJLyogQ2xlYXIgUGVuZGluZyBJbnRlcnJ1cHQgYnkgd3JpdGluZyAnMScgdG8gaXQgKi8KKwkqSVhQNFhYX09TU1QgPSBJWFA0WFhfT1NTVF9USU1FUl8xX1BFTkQ7CisKKwkvKiBTZXR1cCB0aGUgVGltZXIgY291bnRlciB2YWx1ZSAqLworCSpJWFA0WFhfT1NSVDEgPSAoTEFUQ0ggJiB+SVhQNFhYX09TVF9SRUxPQURfTUFTSykgfCBJWFA0WFhfT1NUX0VOQUJMRTsKKworCS8qIFJlc2V0IHRpbWUtc3RhbXAgY291bnRlciAqLworCSpJWFA0WFhfT1NUUyA9IDA7CisJbGFzdF9qaWZmeV90aW1lID0gMDsKKworCS8qIENvbm5lY3QgdGhlIGludGVycnVwdCBoYW5kbGVyIGFuZCBlbmFibGUgdGhlIGludGVycnVwdCAqLworCXNldHVwX2lycShJUlFfSVhQNFhYX1RJTUVSMSwgJml4cDR4eF90aW1lcl9pcnEpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGl4cDR4eF90aW1lciA9IHsKKwkuaW5pdAkJPSBpeHA0eHhfdGltZXJfaW5pdCwKKwkub2Zmc2V0CQk9IGl4cDR4eF9nZXR0aW1lb2Zmc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeHA0NnhfaTJjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0IAk9IDB4YzgwMTEwMDAsCisJCS5lbmQJPSAweGM4MDExMDFjLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0IAk9IElSUV9JWFA0WFhfSTJDLAorCQkuZW5kCT0gSVJRX0lYUDRYWF9JMkMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworLyoKKyAqIEkyQyBjb250cm9sbGVyLiBUaGUgSVhQNDZ4IHVzZXMgdGhlIHNhbWUgYmxvY2sgYXMgdGhlIElPUDN4eCwgc28KKyAqIHdlIGp1c3QgdXNlIHRoZSBzYW1lIGRldmljZSBuYW1lLgorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeHA0NnhfaTJjX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gIklPUDN4eC1JMkMiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gMiwKKwkucmVzb3VyY2UJPSBpeHA0NnhfaTJjX3Jlc291cmNlcworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKml4cDQ2eF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaXhwNDZ4X2kyY19jb250cm9sbGVyCit9OworCit2b2lkIF9faW5pdCBpeHA0eHhfc3lzX2luaXQodm9pZCkKK3sKKwlpZiAoY3B1X2lzX2l4cDQ2eCgpKSB7CisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGl4cDQ2eF9kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUoaXhwNDZ4X2RldmljZXMpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFmYjQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBhcmNoL2FyY2gvbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCisgKgorICogUENJIHNldHVwIHJvdXRpbmVzIGZvciBBREkgRW5naW5lZXJpbmcgQ295b3RlIHBsYXRmb3JtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEp1bmdvIFNvZnR3YXJlIFRlY2hub2xvZ2llcy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBNb250YVZpc3RhIFNvZnR3cmFlLCBJbmMuCisgKgorICogTWFpbnRhaW5lcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBtdmlzdGEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorCitleHRlcm4gdm9pZCBpeHA0eHhfcGNpX3ByZWluaXQodm9pZCk7CitleHRlcm4gaW50IGl4cDR4eF9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CitleHRlcm4gc3RydWN0IHBjaV9idXMgKml4cDR4eF9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CisKK3ZvaWQgX19pbml0IGNveW90ZV9wY2lfcHJlaW5pdCh2b2lkKQoreworCWdwaW9fbGluZV9jb25maWcoQ09ZT1RFX1BDSV9TTE9UMF9QSU4sCisJCQlJWFA0WFhfR1BJT19JTiB8IElYUDRYWF9HUElPX0FDVElWRV9MT1cpOworCisJZ3Bpb19saW5lX2NvbmZpZyhDT1lPVEVfUENJX1NMT1QxX1BJTiwKKwkJCUlYUDRYWF9HUElPX0lOIHwgSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk7CisKKwlncGlvX2xpbmVfaXNyX2NsZWFyKENPWU9URV9QQ0lfU0xPVDBfUElOKTsKKwlncGlvX2xpbmVfaXNyX2NsZWFyKENPWU9URV9QQ0lfU0xPVDFfUElOKTsKKworCWl4cDR4eF9wY2lfcHJlaW5pdCgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjb3lvdGVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaWYgKHNsb3QgPT0gQ09ZT1RFX1BDSV9TTE9UMF9ERVZJRCkKKwkJcmV0dXJuIElSUV9DT1lPVEVfUENJX1NMT1QwOworCWVsc2UgaWYgKHNsb3QgPT0gQ09ZT1RFX1BDSV9TTE9UMV9ERVZJRCkKKwkJcmV0dXJuIElSUV9DT1lPVEVfUENJX1NMT1QxOworCWVsc2UgcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgaHdfcGNpIGNveW90ZV9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMgPSAxLAorCS5wcmVpbml0ID0gICAgICAgIGNveW90ZV9wY2lfcHJlaW5pdCwKKwkuc3dpenpsZSA9ICAgICAgICBwY2lfc3RkX3N3aXp6bGUsCisJLnNldHVwID0gICAgICAgICAgaXhwNHh4X3NldHVwLAorCS5zY2FuID0gICAgICAgICAgIGl4cDR4eF9zY2FuX2J1cywKKwkubWFwX2lycSA9ICAgICAgICBjb3lvdGVfbWFwX2lycSwKK307CisKK2ludCBfX2luaXQgY295b3RlX3BjaV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfYWRpX2NveW90ZSgpKQorCQlwY2lfY29tbW9uX2luaXQoJmNveW90ZV9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoY295b3RlX3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwNWExMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKKyAqCisgKiBCb2FyZCBzZXR1cCBmb3IgQURJIEVuZ2luZWVyaW5nIGFuZCBJWERHUDQyNSBib2FyZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQXV0aG9yOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKwordm9pZCBfX2luaXQgY295b3RlX21hcF9pbyh2b2lkKQoreworCWl4cDR4eF9tYXBfaW8oKTsKK30KKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGNveW90ZV9mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb3lvdGVfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IENPWU9URV9GTEFTSF9CQVNFLAorCS5lbmQJCT0gQ09ZT1RFX0ZMQVNIX0JBU0UgKyBDT1lPVEVfRkxBU0hfU0laRSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3lvdGVfZmxhc2ggPSB7CisJLm5hbWUJCT0gIklYUDRYWC1GbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmNveW90ZV9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZjb3lvdGVfZmxhc2hfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNveW90ZV91YXJ0X3Jlc291cmNlID0geworCS5zdGFydAk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisJLmVuZAk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMgKyAweDBmZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGNveW90ZV91YXJ0X2RhdGEgPSB7CisJLm1hcGJhc2UJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAorCS5tZW1iYXNlCT0gKGNoYXIgKilJWFA0WFhfVUFSVDJfQkFTRV9WSVJUICsgUkVHX09GRlNFVCwKKwkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDIsCisJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJLnJlZ3NoaWZ0CT0gMiwKKwkudWFydGNsawk9IElYUDRYWF9VQVJUX1hUQUwsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3lvdGVfdWFydCA9IHsKKwkubmFtZQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQk9IDAsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZjb3lvdGVfdWFydF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZjb3lvdGVfdWFydF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb3lvdGVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmNveW90ZV9mbGFzaCwKKwkmY295b3RlX3VhcnQKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb3lvdGVfaW5pdCh2b2lkKQoreworCSpJWFA0WFhfRVhQX0NTMCB8PSBJWFA0WFhfRkxBU0hfV1JJVEFCTEU7CisJKklYUDRYWF9FWFBfQ1MxID0gKklYUDRYWF9FWFBfQ1MwOworCisJaWYgKG1hY2hpbmVfaXNfaXhkcGc0MjUoKSkgeworCQljb3lvdGVfdWFydF9kYXRhLm1lbWJhc2UgPQorCQkJKGNoYXIqKShJWFA0WFhfVUFSVDFfQkFTRV9WSVJUICsgUkVHX09GRlNFVCk7CisJCWNveW90ZV91YXJ0X2RhdGEubWFwYmFzZSA9IElYUDRYWF9VQVJUMV9CQVNFX1BIWVM7CisJCWNveW90ZV91YXJ0X2RhdGEuaXJxID0gSVJRX0lYUDRYWF9VQVJUMTsKKwl9CisKKworCWl4cDR4eF9zeXNfaW5pdCgpOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGNveW90ZV9kZXZpY2VzLCBBUlJBWV9TSVpFKGNveW90ZV9kZXZpY2VzKSk7Cit9CisKKyNpZmRlZiBDT05GSUdfQVJDSF9BRElfQ09ZT1RFCitNQUNISU5FX1NUQVJUKEFESV9DT1lPVEUsICJBREkgRW5naW5lZXJpbmcgQ295b3RlIikKKyAgICAgICAgTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCisgICAgICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisgICAgICAgICAgICAgICAgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKQorICAgICAgICBNQVBJTyhjb3lvdGVfbWFwX2lvKQorICAgICAgICBJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKKwkudGltZXIJCT0gJml4cDR4eF90aW1lciwKKyAgICAgICAgQk9PVF9QQVJBTVMoMHgwMTAwKQorCUlOSVRfTUFDSElORShjb3lvdGVfaW5pdCkKK01BQ0hJTkVfRU5ECisjZW5kaWYKKworLyoKKyAqIElYRFBHNDI1IGlzIGlkZW50aWNhbCB0byBDb3lvdGUgZXhjZXB0IGZvciB3aGljaCBzZXJpYWwgcG9ydAorICogaXMgY29ubmVjdGVkLgorICovCisjaWZkZWYgQ09ORklHX01BQ0hfSVhEUEc0MjUKK01BQ0hJTkVfU1RBUlQoSVhEUEc0MjUsICJJbnRlbCBJWERQRzQyNSIpCisgICAgICAgIE1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQorICAgICAgICBCT09UX01FTShQSFlTX09GRlNFVCwgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAorICAgICAgICAgICAgICAgIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkKKyAgICAgICAgTUFQSU8oY295b3RlX21hcF9pbykKKyAgICAgICAgSU5JVElSUShpeHA0eHhfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCisgICAgICAgIEJPT1RfUEFSQU1TKDB4MDEwMCkKKwlJTklUX01BQ0hJTkUoY295b3RlX2luaXQpCitNQUNISU5FX0VORAorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4MDM1OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtcGNpLmMKKyAqCisgKiBHZW10ZWsgR1RXWDU3MTUgKExpbmtzeXMgV1JWNTRHKSBib2FyZCBzZXR1cAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHZW9yZ2UgVC4gSm9zZXBoCisgKiBEZXJpdmVkIGZyb20gQ295b3RlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ndHd4NTcxNS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorCitleHRlcm4gdm9pZCBpeHA0eHhfcGNpX3ByZWluaXQodm9pZCk7CitleHRlcm4gaW50IGl4cDR4eF9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CitleHRlcm4gc3RydWN0IHBjaV9idXMgKml4cDR4eF9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgKiBUaGUgZXhhY3QgR1BJTyBwaW5zIGFuZCBJUlFzIGFyZSBkZWZpbmVkIGluIGFyY2gtaXhwNHh4L2d0d3g1NzE1LmgKKyAgICAgICAgKiBTbG90IDAgaXNuJ3QgYWN0dWFsbHkgcG9wdWxhdGVkIHdpdGggYSBjYXJkIGNvbm5lY3RvciBidXQKKyAgICAgICAgKiB3ZSBpbml0aWFsaXplIGl0IGFueXdheSBpbiBjYXNlIGEgZnV0dXJlIHZlcnNpb24gaGFzIHRoZQorICAgICAgICAqIHNsb3QgcG9wdWxhdGVkIG9yIHNvbWVvbmUgd2l0aCBnb29kIHNvbGRlcmluZyBza2lsbHMgaGFzCisgICAgICAgICogc29tZSBmcmVlIHRpbWUuCisgICAgICAgICovCisKKworc3RhdGljIHZvaWQgZ3R3eDU3MTVfaW5pdF9ncGlvKHU4IHBpbiwgdTMyIHN0eWxlKQoreworCWdwaW9fbGluZV9jb25maWcocGluLCBzdHlsZSB8IElYUDRYWF9HUElPX0FDVElWRV9MT1cpOworCisJaWYgKHN0eWxlICYgSVhQNFhYX0dQSU9fSU4pIGdwaW9fbGluZV9pc3JfY2xlYXIocGluKTsKK30KKwordm9pZCBfX2luaXQgZ3R3eDU3MTVfcGNpX3ByZWluaXQodm9pZCkKK3sKKwlndHd4NTcxNV9pbml0X2dwaW8oR1RXWDU3MTVfUENJX1NMT1QwX0lOVEFfR1BJTywJSVhQNFhYX0dQSU9fSU4pOworCWd0d3g1NzE1X2luaXRfZ3BpbyhHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQV9HUElPLAlJWFA0WFhfR1BJT19JTik7CisKKwlpeHA0eHhfcGNpX3ByZWluaXQoKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBndHd4NTcxNV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpbnQgcmM7CisJc3RhdGljIGludCBndHd4NTcxNV9pcnFtYXAKKwkJCVtHVFdYNTcxNV9QQ0lfU0xPVF9DT1VOVF0KKwkJCVtHVFdYNTcxNV9QQ0lfSU5UX1BJTl9DT1VOVF0gPSB7CisJe0dUV1g1NzE1X1BDSV9TTE9UMF9JTlRBX0lSUSwgR1RXWDU3MTVfUENJX1NMT1QwX0lOVEJfSVJRfSwKKwl7R1RXWDU3MTVfUENJX1NMT1QxX0lOVEFfSVJRLCBHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQl9JUlF9LAorfTsKKworCWlmIChzbG90ID49IEdUV1g1NzE1X1BDSV9TTE9UX0NPVU5UIHx8CisJCQlwaW4gPj0gR1RXWDU3MTVfUENJX0lOVF9QSU5fQ09VTlQpIHJjID0gLTE7CisJZWxzZQorCQlyYyA9IGd0d3g1NzE1X2lycW1hcFtzbG90XVtwaW4tMV07CisKKwlwcmludGsoIiVzOiBNYXBwZWQgc2xvdCAlZCBwaW4gJWQgdG8gSVJRICVkXG4iLCBfX0ZVTkNUSU9OX18sc2xvdCwgcGluLCByYyk7CisJcmV0dXJuKHJjKTsKK30KKworc3RydWN0IGh3X3BjaSBndHd4NTcxNV9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMgPSAxLAorCS5wcmVpbml0ID0gICAgICAgIGd0d3g1NzE1X3BjaV9wcmVpbml0LAorCS5zd2l6emxlID0gICAgICAgIHBjaV9zdGRfc3dpenpsZSwKKwkuc2V0dXAgPSAgICAgICAgICBpeHA0eHhfc2V0dXAsCisJLnNjYW4gPSAgICAgICAgICAgaXhwNHh4X3NjYW5fYnVzLAorCS5tYXBfaXJxID0gICAgICAgIGd0d3g1NzE1X21hcF9pcnEsCit9OworCitpbnQgX19pbml0IGd0d3g1NzE1X3BjaV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfZ3R3eDU3MTUoKSkKKwl7CisJCXBjaV9jb21tb25faW5pdCgmZ3R3eDU3MTVfcGNpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKGd0d3g1NzE1X3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3N2M4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYworICoKKyAqIEdlbXRlayBHVFdYNTcxNSAoTGlua3N5cyBXUlY1NEcpIGJvYXJkIHNldHR1cAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHZW9yZ2UgVC4gSm9zZXBoCisgKiBEZXJpdmVkIGZyb20gQ295b3RlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ndHd4NTcxNS5oPgorCisvKgorICogWHNjYWxlIFVBUlQgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIHdpZGUgd2l0aCBvbmx5IHRoZSBsZWFzdAorICogc2lnbmlmaWNhbnQgOCBiaXRzIGhhdmluZyBhbnkgbWVhbmluZy4gIEZyb20gYSBjb25maWd1cmF0aW9uCisgKiBwZXJzcGVjdGl2ZSwgdGhpcyBtZWFucyAyIHRoaW5ncy4uLgorICoKKyAqICAgU2V0dGluZyAucmVnc2hpZnQgPSAyIHNvIHRoYXQgdGhlIHN0YW5kYXJkIDE2NTUwIHJlZ2lzdGVycworICogICBsaW5lIHVwIG9uIGV2ZXJ5IDR0aCBieXRlLgorICoKKyAqICAgU2hpZnRpbmcgdGhlIHJlZ2lzdGVyIHN0YXJ0IHZpcnR1YWwgYWRkcmVzcyArMyBieXRlcyB3aGVuCisgKiAgIGNvbXBpbGVkIGJpZy1lbmRpYW4uICBTaW5jZSByZWdpc3RlciB3cml0ZXMgYXJlIGRvbmUgb24gYQorICogICBzaW5nbGUgYnl0ZSBiYXNpcywgaWYgdGhlIHNoaWZ0IGlzbid0IGRvbmUgdGhlIGRyaXZlciB3aWxsCisgKiAgIHdyaXRlIHRoZSB2YWx1ZSBpbnRvIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgb2YgdGhlIHJlZ2lzdGVyLAorICogICB3aGljaCBpcyBpZ25vcmVkLCBpbnN0ZWFkIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudC4KKyAqLworCisjaWZkZWYJX19BUk1FQl9fCisjZGVmaW5lCVJFR19PRkZTRVQJMworI2Vsc2UKKyNkZWZpbmUJUkVHX09GRlNFVAkwCisjZW5kaWYKKworLyoKKyAqIE9ubHkgdGhlIHNlY29uZCBvciAiY29uc29sZSIgdWFydCBpcyBjb25uZWN0ZWQgb24gdGhlIGd0d3g1NzE1LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ3R3eDU3MTVfdWFydF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisJCS5lbmQJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTICsgMHgwZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gSVJRX0lYUDRYWF9VQVJUMiwKKwkJLmVuZAk9IElSUV9JWFA0WFhfVUFSVDIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeyB9LAorfTsKKworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGd0d3g1NzE1X3VhcnRfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkubWFwYmFzZQk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisJLm1lbWJhc2UJPSAoY2hhciAqKUlYUDRYWF9VQVJUMl9CQVNFX1ZJUlQgKyBSRUdfT0ZGU0VULAorCS5pcnEJCT0gSVJRX0lYUDRYWF9VQVJUMiwKKwkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkucmVnc2hpZnQJPSAyLAorCS51YXJ0Y2xrCT0gSVhQNFhYX1VBUlRfWFRBTCwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGd0d3g1NzE1X3VhcnRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gZ3R3eDU3MTVfdWFydF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAyLAorCS5yZXNvdXJjZQk9IGd0d3g1NzE1X3VhcnRfcmVzb3VyY2VzLAorfTsKKworCit2b2lkIF9faW5pdCBndHd4NTcxNV9tYXBfaW8odm9pZCkKK3sKKwlpeHA0eHhfbWFwX2lvKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBndHd4NTcxNV9mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBndHd4NTcxNV9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gR1RXWDU3MTVfRkxBU0hfQkFTRSwKKwkuZW5kCQk9IEdUV1g1NzE1X0ZMQVNIX0JBU0UgKyBHVFdYNTcxNV9GTEFTSF9TSVpFLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGd0d3g1NzE1X2ZsYXNoID0geworCS5uYW1lCQk9ICJJWFA0WFgtRmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZndHd4NTcxNV9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZndHd4NTcxNV9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpndHd4NTcxNV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZ3R3eDU3MTVfdWFydF9kZXZpY2UsCisJJmd0d3g1NzE1X2ZsYXNoLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGd0d3g1NzE1X2luaXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhndHd4NTcxNV9kZXZpY2VzLCBBUlJBWV9TSVpFKGd0d3g1NzE1X2RldmljZXMpKTsKK30KKworCitNQUNISU5FX1NUQVJUKEdUV1g1NzE1LCAiR2VtdGVrIEdUV1g1NzE1IChMaW5rc3lzIFdSVjU0RykiKQorICAgICAgICBNQUlOVEFJTkVSKCJHZW9yZ2UgSm9zZXBoIikKKyAgICAgICAgQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisgICAgICAgICAgICAgICAgSVhQNFhYX1VBUlQyX0JBU0VfVklSVCkKKyAgICAgICAgTUFQSU8oZ3R3eDU3MTVfbWFwX2lvKQorICAgICAgICBJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKKwkJICAudGltZXIJCT0gJml4cDR4eF90aW1lciwKKyAgICAgICAgQk9PVF9QQVJBTVMoMHgwMTAwKQorICAgICAgICBJTklUX01BQ0hJTkUoZ3R3eDU3MTVfaW5pdCkKK01BQ0hJTkVfRU5ECisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhYjllYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMgCisgKgorICogSVhEUDQyNSBib2FyZC1sZXZlbCBQQ0kgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogTWFpbnRhaW5lcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKwordm9pZCBfX2luaXQgaXhkcDQyNV9wY2lfcHJlaW5pdCh2b2lkKQoreworCWdwaW9fbGluZV9jb25maWcoSVhEUDQyNV9QQ0lfSU5UQV9QSU4sCisJCQkJSVhQNFhYX0dQSU9fSU4gfCBJWFA0WFhfR1BJT19BQ1RJVkVfTE9XKTsKKwlncGlvX2xpbmVfY29uZmlnKElYRFA0MjVfUENJX0lOVEJfUElOLCAKKwkJCQlJWFA0WFhfR1BJT19JTiB8IElYUDRYWF9HUElPX0FDVElWRV9MT1cpOworCWdwaW9fbGluZV9jb25maWcoSVhEUDQyNV9QQ0lfSU5UQ19QSU4sIAorCQkJCUlYUDRYWF9HUElPX0lOIHwgSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk7CisJZ3Bpb19saW5lX2NvbmZpZyhJWERQNDI1X1BDSV9JTlREX1BJTiwgCisJCQkJSVhQNFhYX0dQSU9fSU4gfCBJWFA0WFhfR1BJT19BQ1RJVkVfTE9XKTsKKworCWdwaW9fbGluZV9pc3JfY2xlYXIoSVhEUDQyNV9QQ0lfSU5UQV9QSU4pOworCWdwaW9fbGluZV9pc3JfY2xlYXIoSVhEUDQyNV9QQ0lfSU5UQl9QSU4pOworCWdwaW9fbGluZV9pc3JfY2xlYXIoSVhEUDQyNV9QQ0lfSU5UQ19QSU4pOworCWdwaW9fbGluZV9pc3JfY2xlYXIoSVhEUDQyNV9QQ0lfSU5URF9QSU4pOworCisJaXhwNHh4X3BjaV9wcmVpbml0KCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGl4ZHA0MjVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW0lYRFA0MjVfUENJX0lSUV9MSU5FU10gPSB7CisJCUlSUV9JWERQNDI1X1BDSV9JTlRBLAorCQlJUlFfSVhEUDQyNV9QQ0lfSU5UQiwKKwkJSVJRX0lYRFA0MjVfUENJX0lOVEMsCisJCUlSUV9JWERQNDI1X1BDSV9JTlRECisJfTsKKworCWludCBpcnEgPSAtMTsKKworCWlmIChzbG90ID49IDEgJiYgc2xvdCA8PSBJWERQNDI1X1BDSV9NQVhfREVWICYmIAorCQlwaW4gPj0gMSAmJiBwaW4gPD0gSVhEUDQyNV9QQ0lfSVJRX0xJTkVTKSB7CisJCWlycSA9IHBjaV9pcnFfdGFibGVbKHNsb3QgKyBwaW4gLSAyKSAlIDRdOworCX0KKworCXJldHVybiBpcnE7Cit9CisKK3N0cnVjdCBod19wY2kgaXhkcDQyNV9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMgPSAxLAorCS5wcmVpbml0CT0gaXhkcDQyNV9wY2lfcHJlaW5pdCwKKwkuc3dpenpsZQk9IHBjaV9zdGRfc3dpenpsZSwKKwkuc2V0dXAJCT0gaXhwNHh4X3NldHVwLAorCS5zY2FuCQk9IGl4cDR4eF9zY2FuX2J1cywKKwkubWFwX2lycQk9IGl4ZHA0MjVfbWFwX2lycSwKK307CisKK2ludCBfX2luaXQgaXhkcDQyNV9wY2lfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX2l4ZHA0MjUoKSB8fCBtYWNoaW5lX2lzX2l4Y2RwMTEwMCgpIHx8CisJCQltYWNoaW5lX2lzX2F2aWxhKCkgfHwgbWFjaGluZV9pc19peGRwNDY1KCkpCisJCXBjaV9jb21tb25faW5pdCgmaXhkcDQyNV9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaXhkcDQyNV9wY2lfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzM0NmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCisgKgorICogSVhEUDQyNS9JWENEUDExMDAgYm9hcmQtc2V0dXAgCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisKK3ZvaWQgX19pbml0IGl4ZHA0MjVfbWFwX2lvKHZvaWQpIAoreworCWl4cDR4eF9tYXBfaW8oKTsKK30KKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGl4ZHA0MjVfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkud2lkdGgJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXhkcDQyNV9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gSVhEUDQyNV9GTEFTSF9CQVNFLAorCS5lbmQJCT0gSVhEUDQyNV9GTEFTSF9CQVNFICsgSVhEUDQyNV9GTEFTSF9TSVpFLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4ZHA0MjVfZmxhc2ggPSB7CisJLm5hbWUJCT0gIklYUDRYWC1GbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJml4ZHA0MjVfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmaXhkcDQyNV9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXhwNHh4X2kyY19waW5zIGl4ZHA0MjVfaTJjX2dwaW9fcGlucyA9IHsKKwkuc2RhX3Bpbgk9IElYRFA0MjVfU0RBX1BJTiwKKwkuc2NsX3Bpbgk9IElYRFA0MjVfU0NMX1BJTiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4ZHA0MjVfaTJjX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gIklYUDRYWC1JMkMiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpeGRwNDI1X2kyY19ncGlvX3BpbnMsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXhkcDQyNV91YXJ0X3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IElYUDRYWF9VQVJUMV9CQVNFX1BIWVMsCisJCS5lbmQJCT0gSVhQNFhYX1VBUlQxX0JBU0VfUEhZUyArIDB4MGZmZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNCisJfSwKKwl7CisJCS5zdGFydAkJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAorCQkuZW5kCQk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMgKyAweDBmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgaXhkcDQyNV91YXJ0X2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gSVhQNFhYX1VBUlQxX0JBU0VfUEhZUywKKwkJLm1lbWJhc2UJPSAoY2hhciAqKUlYUDRYWF9VQVJUMV9CQVNFX1ZJUlQgKyBSRUdfT0ZGU0VULAorCQkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDEsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAorCX0sCisJeworCQkubWFwYmFzZQk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisJCS5tZW1iYXNlCT0gKGNoYXIgKilJWFA0WFhfVUFSVDJfQkFTRV9WSVJUICsgUkVHX09GRlNFVCwKKwkJLmlycQkJPSBJUlFfSVhQNFhYX1VBUlQxLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSVhQNFhYX1VBUlRfWFRBTCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeGRwNDI1X3VhcnQgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDAsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gaXhkcDQyNV91YXJ0X2RhdGEsCisJLm51bV9yZXNvdXJjZXMJCT0gMiwKKwkucmVzb3VyY2UJCT0gaXhkcDQyNV91YXJ0X3Jlc291cmNlcworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKml4ZHA0MjVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJml4ZHA0MjVfaTJjX2NvbnRyb2xsZXIsCisJJml4ZHA0MjVfZmxhc2gsCisJJml4ZHA0MjVfdWFydAorfTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgaXhkcDQyNV9pbml0KHZvaWQpCit7CisJaXhwNHh4X3N5c19pbml0KCk7CisKKwkvKgorCSAqIElYUDQ2NSBoYXMgMzJNQiB3aW5kb3cKKwkgKi8KKwlpZiAobWFjaGluZV9pc19peGRwNDY1KCkpIHsKKwkJaXhkcDQyNV9mbGFzaF9yZXNvdXJjZS5lbmQgKz0gSVhEUDQyNV9GTEFTSF9TSVpFOworCX0KKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGl4ZHA0MjVfZGV2aWNlcywgQVJSQVlfU0laRShpeGRwNDI1X2RldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChJWERQNDI1LCAiSW50ZWwgSVhEUDQyNSBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCisJTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCisJQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKKwkJSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKQorCU1BUElPKGl4ZHA0MjVfbWFwX2lvKQorCUlOSVRJUlEoaXhwNHh4X2luaXRfaXJxKQorCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAorCUJPT1RfUEFSQU1TKDB4MDEwMCkKKwlJTklUX01BQ0hJTkUoaXhkcDQyNV9pbml0KQorTUFDSElORV9FTkQKKworTUFDSElORV9TVEFSVChJWERQNDY1LCAiSW50ZWwgSVhEUDQ2NSBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCisJTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCisJQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKKwkJSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKQorCU1BUElPKGl4ZHA0MjVfbWFwX2lvKQorCUlOSVRJUlEoaXhwNHh4X2luaXRfaXJxKQorCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAorCUJPT1RfUEFSQU1TKDB4MDEwMCkKKwlJTklUX01BQ0hJTkUoaXhkcDQyNV9pbml0KQorTUFDSElORV9FTkQKKworTUFDSElORV9TVEFSVChJWENEUDExMDAsICJJbnRlbCBJWENEUDExMDAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQorCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQorCUJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJCUlYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkKKwlNQVBJTyhpeGRwNDI1X21hcF9pbykKKwlJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKKwkudGltZXIJCT0gJml4cDR4eF90aW1lciwKKwlCT09UX1BBUkFNUygweDAxMDApCisJSU5JVF9NQUNISU5FKGl4ZHA0MjVfaW5pdCkKK01BQ0hJTkVfRU5ECisKKy8qCisgKiBBdmlsYSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBJWERQNDI1IGV4Y2VwdCB0aGF0IGl0IGFkZHMKKyAqIGEgQ0YgSURFIHNsb3QgaGFuZ2luZyBvZmYgdGhlIGV4cGFuc2lvbiBidXMuIFdoZW4gd2UgaGF2ZSBhIAorICogZHJpdmVyIGZvciBJWFA0eHggQ0YgSURFIHdpdGggZHJpdmVyIG1vZGVsIHN1cHBvcnQgd2UnbGwgbW92ZQorICogQXZpbGEgdG8gaXQncyBvd24gc2V0dXAgZmlsZS4KKyAqLworI2lmZGVmIENPTkZJR19BUkNIX0FWSUxBCitNQUNISU5FX1NUQVJUKEFWSUxBLCAiR2F0ZXdvcmtzIEF2aWxhIE5ldHdvcmsgUGxhdGZvcm0iKQorCU1BSU5UQUlORVIoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+IikKKwlCT09UX01FTShQSFlTX09GRlNFVCwgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAorCQlJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpCisJTUFQSU8oaXhkcDQyNV9tYXBfaW8pCisJSU5JVElSUShpeHA0eHhfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCisJQk9PVF9QQVJBTVMoMHgwMTAwKQorCUlOSVRfTUFDSElORShpeGRwNDI1X2luaXQpCitNQUNISU5FX0VORAorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcGc0MjUtcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0NTYzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBhcmNoL2FyY2gvbWFjaC1peHA0eHgvaXhkcGc0MjUtcGNpLmMKKyAqCisgKiBQQ0kgc2V0dXAgcm91dGluZXMgZm9yIEludGVsIElYRFBHNDI1IFBsYXRmb3JtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdyYWUsIEluYy4KKyAqCisgKiBNYWludGFpbmVyOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorCitleHRlcm4gdm9pZCBpeHA0eHhfcGNpX3ByZWluaXQodm9pZCk7CitleHRlcm4gaW50IGl4cDR4eF9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CitleHRlcm4gc3RydWN0IHBjaV9idXMgKml4cDR4eF9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CisKK3ZvaWQgX19pbml0IGl4ZHBnNDI1X3BjaV9wcmVpbml0KHZvaWQpCit7CisJZ3Bpb19saW5lX2NvbmZpZyg2LCBJWFA0WFhfR1BJT19JTiB8IElYUDRYWF9HUElPX0FDVElWRV9MT1cpOworCWdwaW9fbGluZV9jb25maWcoNywgSVhQNFhYX0dQSU9fSU4gfCBJWFA0WFhfR1BJT19BQ1RJVkVfTE9XKTsKKworCWdwaW9fbGluZV9pc3JfY2xlYXIoNik7CisJZ3Bpb19saW5lX2lzcl9jbGVhcig3KTsKKworCWl4cDR4eF9wY2lfcHJlaW5pdCgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpeGRwZzQyNV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoc2xvdCA9PSAxMiB8fCBzbG90ID09IDEzKQorCQlyZXR1cm4gSVJRX0lYUDRYWF9HUElPNzsKKwllbHNlIGlmIChzbG90ID09IDE0KQorCQlyZXR1cm4gSVJRX0lYUDRYWF9HUElPNjsKKwllbHNlIHJldHVybiAtMTsKK30KKworc3RydWN0IGh3X3BjaSBpeGRwZzQyNV9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMgPSAxLAorCS5wcmVpbml0ID0gICAgICAgIGl4ZHBnNDI1X3BjaV9wcmVpbml0LAorCS5zd2l6emxlID0gICAgICAgIHBjaV9zdGRfc3dpenpsZSwKKwkuc2V0dXAgPSAgICAgICAgICBpeHA0eHhfc2V0dXAsCisJLnNjYW4gPSAgICAgICAgICAgaXhwNHh4X3NjYW5fYnVzLAorCS5tYXBfaXJxID0gICAgICAgIGl4ZHBnNDI1X21hcF9pcnEsCit9OworCitpbnQgX19pbml0IGl4ZHBnNDI1X3BjaV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfaXhkcGc0MjUoKSkKKwkJcGNpX2NvbW1vbl9pbml0KCZpeGRwZzQyNV9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaXhkcGc0MjVfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbDcyMDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkOGViZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBPYmplY3QgZmlsZSBsaXN0cy4KKworb2JqLXkJCQk6PSBjb3JlLm8KK29iai1tCQkJOj0KK29iai1uCQkJOj0KK29iai0JCQk6PQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWw3MjAwL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3MmVjYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDIgQEAKKyAgIHpyZWxhZGRyLXkJOj0gMHhmMDAwODAwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNmNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWw3MjAwL2NvcmUuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL21tLWx1c2w3MjAwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFN0ZXZlIEhpbGwgKHNqaGlsbEBjb3R3LmNvbSkKKyAqCisgKiAgRXh0cmEgTU0gcm91dGluZXMgZm9yIEw3MjAwIGFyY2hpdGVjdHVyZQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKy8qCisgKiBJUlEgYmFzZSByZWdpc3RlcgorICovCisjZGVmaW5lCUlSUV9CQVNFCShJT19CQVNFXzIgKyAweDEwMDApCisKKy8qIAorICogTm9ybWFsIElSUSByZWdpc3RlcnMKKyAqLworI2RlZmluZSBJUlFfU1RBVFVTCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgwMDApKQorI2RlZmluZSBJUlFfUkFXU1RBVFVTCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgwMDQpKQorI2RlZmluZSBJUlFfRU5BQkxFCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgwMDgpKQorI2RlZmluZSBJUlFfRU5BQkxFQ0xFQVIJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSVJRX0JBU0UgKyAweDAwYykpCisjZGVmaW5lIElSUV9TT0ZUCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgwMTApKQorI2RlZmluZSBJUlFfU09VUkNFU0VMCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgwMTgpKQorCisvKiAKKyAqIEZhc3QgSVJRIHJlZ2lzdGVycworICovCisjZGVmaW5lIEZJUV9TVEFUVVMJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSVJRX0JBU0UgKyAweDEwMCkpCisjZGVmaW5lIEZJUV9SQVdTVEFUVVMJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSVJRX0JBU0UgKyAweDEwNCkpCisjZGVmaW5lIEZJUV9FTkFCTEUJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSVJRX0JBU0UgKyAweDEwOCkpCisjZGVmaW5lIEZJUV9FTkFCTEVDTEVBUgkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChJUlFfQkFTRSArIDB4MTBjKSkKKyNkZWZpbmUgRklRX1NPRlQJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSVJRX0JBU0UgKyAweDExMCkpCisjZGVmaW5lIEZJUV9TT1VSQ0VTRUwJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSVJRX0JBU0UgKyAweDExOCkpCisKK3N0YXRpYyB2b2lkIGw3MjAwX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJSVJRX0VOQUJMRUNMRUFSID0gMSA8PCBpcnE7Cit9CisKK3N0YXRpYyB2b2lkIGw3MjAwX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlJUlFfRU5BQkxFID0gMSA8PCBpcnE7Cit9CisgCitzdGF0aWMgdm9pZCBfX2luaXQgbDcyMDBfaW5pdF9pcnEodm9pZCkKK3sKKwlpbnQgaXJxOworCisJSVJRX0VOQUJMRUNMRUFSID0gMHhmZmZmZmZmZjsJLyogY2xlYXIgYWxsIGludGVycnVwdCBlbmFibGVzICovCisJRklRX0VOQUJMRUNMRUFSID0gMHhmZmZmZmZmZjsJLyogY2xlYXIgYWxsIGZhc3QgaW50ZXJydXB0IGVuYWJsZXMgKi8KKworCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspIHsKKwkJaXJxX2Rlc2NbaXJxXS52YWxpZAk9IDE7CisJCWlycV9kZXNjW2lycV0ucHJvYmVfb2sJPSAxOworCQlpcnFfZGVzY1tpcnFdLm1hc2tfYWNrCT0gbDcyMDBfbWFza19pcnE7CisJCWlycV9kZXNjW2lycV0ubWFzawk9IGw3MjAwX21hc2tfaXJxOworCQlpcnFfZGVzY1tpcnFdLnVubWFzawk9IGw3MjAwX3VubWFza19pcnE7CisJfQorCisJaW5pdF9GSVEoKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBsNzIwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7IElPX0JBU0UsCUlPX1NUQVJULAlJT19TSVpFLAlNVF9ERVZJQ0UgfSwKKwl7IElPX0JBU0VfMiwJSU9fU1RBUlRfMiwJSU9fU0laRV8yLAlNVF9ERVZJQ0UgfSwKKwl7IEFVWF9CQVNFLCAgICAgQVVYX1NUQVJULCAgICAgIEFVWF9TSVpFLCAgICAgICBNVF9ERVZJQ0UgfSwKKwl7IEZMQVNIMV9CQVNFLCAgRkxBU0gxX1NUQVJULCAgIEZMQVNIMV9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKKwl7IEZMQVNIMl9CQVNFLCAgRkxBU0gyX1NUQVJULCAgIEZMQVNIMl9TSVpFLCAgICBNVF9ERVZJQ0UgfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGw3MjAwX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChsNzIwMF9pb19kZXNjLCBBUlJBWV9TSVpFKGw3MjAwX2lvX2Rlc2MpKTsKK30KKworTUFDSElORV9TVEFSVChMNzIwMCwgIkxpbmtVcCBTeXN0ZW1zIEw3MjAwIikKKwlNQUlOVEFJTkVSKCJTdGV2ZSBIaWxsIC8gU2NvdHQgTWNDb25uZWxsIikKKwlCT09UX01FTSgweGYwMDAwMDAwLCAweDgwMDQwMDAwLCAweGQwMDAwMDAwKQorCU1BUElPKGw3MjAwX21hcF9pbykKKwlJTklUSVJRKGw3MjAwX2luaXRfaXJxKQorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE3ODY3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9LY29uZmlnCkBAIC0wLDAgKzEsNzAgQEAKK2lmIEFSQ0hfTEg3QTQwWAorCittZW51ICJMSDdBNDBYIEltcGxlbWVudGF0aW9ucyIKKworY29uZmlnIE1BQ0hfS0VWN0E0MDAKKwlib29sICJLRVY3QTQwMCIKKwlzZWxlY3QgQVJDSF9MSDdBNDAwCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBTaGFycCBLRVY3QTQwMCBkZXZlbG9wbWVudAorCSAgYm9hcmQuICBUaGlzIGhhcmR3YXJlIGlzIGRpc2NvbnRpbnVlZCwgc28gSSdkIGJlIHZlcnkKKwkgIHN1cHJpc2VkIGlmIHlvdSB3YW50ZWQgdGhpcyBvcHRpb24uCisKK2NvbmZpZyBNQUNIX0xQRDdBNDAwCisJYm9vbCAiTFBEN0E0MDAgQ2FyZCBFbmdpbmUiCisJc2VsZWN0IEFSQ0hfTEg3QTQwMAorIwlzZWxlY3QgSURFX1BPTEwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgTG9naWMgUHJvZHVjdCBEZXZlbG9wbWVudCdzCisJICBMUEQ3QTQwMCBDYXJkRW5naW5lLiAgRm9yIHRoZSB0aW1lIGJlaW5nLCB0aGUgTFBEN0E0MDAgYW5kCisJICBMUEQ3QTQwNCBvcHRpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisKK2NvbmZpZyBNQUNIX0xQRDdBNDA0CisJYm9vbCAiTFBEN0E0MDQgQ2FyZCBFbmdpbmUiCisJc2VsZWN0IEFSQ0hfTEg3QTQwNAorIwlzZWxlY3QgSURFX1BPTEwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgTG9naWMgUHJvZHVjdCBEZXZlbG9wbWVudCdzCisJICBMUEQ3QTQwNCBDYXJkRW5naW5lLiBGb3IgdGhlIHRpbWUgYmVpbmcsIHRoZSBMUEQ3QTQwMCBhbmQKKwkgIExQRDdBNDA0IG9wdGlvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKworY29uZmlnIEFSQ0hfTEg3QTQwMAorCWJvb2wKKworY29uZmlnIEFSQ0hfTEg3QTQwNAorCWJvb2wKKworY29uZmlnIExIN0E0MFhfQ09OVElHTUVNCisJYm9vbCAiRGlzYWJsZSBOVU1BIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0xIN0E0MFgKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdXIgYm9vdGxvYWRlciBzZXRzIHRoZSBTUk9NTEwgYml0KHMpIGluCisJICB0aGUgU0RSQU0gY29udHJvbGxlciwgb3JnYW5pemluZyBtZW1vcnkgYXMgYSBjb250aWd1b3VzCisJICBhcnJheS4gIFRoaXMgb3B0aW9uIHdpbGwgZGlzYWJsZSBDT05GSUdfRElTQ09OVElHTUVNIGFuZAorICAgICAgICAgIGZvcmNlIHRoZSBrZXJuZWwgdG8gbWFuYWdlIGFsbCBtZW1vcnkgaW4gb25lIG5vZGUuCisKKwkgIFNldHRpbmcgdGhpcyBvcHRpb24gaW5jb3JyZWN0bHkgbWF5IHByZXZlbnQgdGhlIGtlcm5lbCBmcm9tCisJICBib290aW5nLiAgSXQgaXMgT0sgdG8gbGVhdmUgaXQgTi4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNvbnN1bHQKKwkgICAgPGZpbGU6RG9jdW1lbnRhdGlvbi9hcm0vU2hhcnAtTEgvU0RSQU0+LgorCitjb25maWcgTEg3QTQwWF9PTkVfQkFOS19QRVJfTk9ERQorCWJvb2wgIk9wdGltaXplIE5VTUEgTm9kZSBUYWJsZXMgZm9yIFNpemUiCisJZGVwZW5kcyBvbiBBUkNIX0xIN0E0MFggJiYgIUxIN0E0MFhfQ09OVElHTUVNCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBwcm9kdWNlIGNvbXBhY3QgbWVtb3J5IG5vZGUgdGFibGVzLiAgQnkKKwkgIGRlZmF1bHQgcGFpcnMgb2YgYWRqYWNlbnQgcGh5c2ljYWwgUkFNIGJhbmtzIGFyZSBtYW5hZ2VkCisJICB0b2dldGhlciBpbiBhIHNpbmdsZSBub2RlLCBpbmN1cnJpbmcgc29tZSB3YXN0ZWQgb3ZlcmhlYWQKKwkgIGluIHRoZSBub2RlIHRhYmxlcywgaG93ZXZlciBhbHNvIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkKKwkgIHdpdGggc3lzdGVtcyB3aGVyZSBwaHlzaWNhbCBtZW1vcnkgaXMgdHJ1bHkgY29udGlndW91cy4KKworCSAgU2V0dGluZyB0aGlzIG9wdGlvbiBpbmNvcnJlY3RseSBtYXkgcHJldmVudCB0aGUga2VybmVsIGZyb20KKwkgIGJvb3RpbmcuICBJdCBpcyBPSyB0byBsZWF2ZSBpdCBOLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY29uc3VsdAorCSAgICA8ZmlsZTpEb2N1bWVudGF0aW9uL2FybS9TaGFycC1MSC9TRFJBTT4uCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA1MTJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJOj0gdGltZS5vCitvYmotJChDT05GSUdfTUFDSF9LRVY3QTQwMCkgKz0gYXJjaC1rZXY3YTQwMC5vIGlycS1saDdhNDAwLm8KK29iai0kKENPTkZJR19NQUNIX0xQRDdBNDAwKSArPSBhcmNoLWxwZDdhNDB4Lm8gaXJxLWxoN2E0MDAubworb2JqLSQoQ09ORklHX01BQ0hfTFBEN0E0MDQpICs9IGFyY2gtbHBkN2E0MHgubyBpcnEtbGg3YTQwNC5vCisKK29iai1tCQkJOj0KK29iai1uCQkJOj0KK29iai0JCQk6PQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk0MWJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSw0IEBACisgICB6cmVsYWRkci15CTo9IDB4YzAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHhjMDAwMDEwMAoraW5pdHJkX3BoeXMteQk6PSAweGM0MDAwMDAwCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWQxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBhcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBib2FyZCBzcGVjaWZpYyBJUlEgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICovCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mga2V2N2E0MDBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeyBJT19WSVJULCAgICBJT19QSFlTLCAgICBJT19TSVpFLCAgICBNVF9ERVZJQ0UgfSwKKwl7IENQTERfVklSVCwgIENQTERfUEhZUywgIENQTERfU0laRSwgIE1UX0RFVklDRSB9LAorfTsKKwordm9pZCBfX2luaXQga2V2N2E0MDBfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0IChrZXY3YTQwMF9pb19kZXNjLCBBUlJBWV9TSVpFIChrZXY3YTQwMF9pb19kZXNjKSk7Cit9CisKK3N0YXRpYyB1MTYgQ1BMRF9JUlFfbWFzazsJLyogTWFzayBmb3IgQ1BMRCBJUlFzLCAxID09IHVubWFza2VkICovCisKK3N0YXRpYyB2b2lkIGtldjdhNDAwX2Fja19jcGxkX2lycSAodTMyIGlycSkKK3sKKwlDUExEX0NMX0lOVCA9IDEgPDwgKGlycSAtIElSUV9LRVY3QTQwMF9DUExEKTsKK30KKworc3RhdGljIHZvaWQga2V2N2E0MDBfbWFza19jcGxkX2lycSAodTMyIGlycSkKK3sKKwlDUExEX0lSUV9tYXNrICY9IH4oMSA8PCAoaXJxIC0gSVJRX0tFVjdBNDAwX0NQTEQpKTsKKwlDUExEX1dSX1BCX0lOVF9NQVNLID0gQ1BMRF9JUlFfbWFzazsKK30KKworc3RhdGljIHZvaWQga2V2N2E0MDBfdW5tYXNrX2NwbGRfaXJxICh1MzIgaXJxKQoreworCUNQTERfSVJRX21hc2sgfD0gMSA8PCAoaXJxIC0gSVJRX0tFVjdBNDAwX0NQTEQpOworCUNQTERfV1JfUEJfSU5UX01BU0sgPSBDUExEX0lSUV9tYXNrOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAga2V2N2E0MDBfY3BsZF9jaGlwID0geworCS5hY2sJPSBrZXY3YTQwMF9hY2tfY3BsZF9pcnEsCisJLm1hc2sJPSBrZXY3YTQwMF9tYXNrX2NwbGRfaXJxLAorCS51bm1hc2sJPSBrZXY3YTQwMF91bm1hc2tfY3BsZF9pcnEsCit9OworCisKK3N0YXRpYyB2b2lkIGtldjdhNDAwX2NwbGRfaGFuZGxlciAodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgbWFzayA9IENQTERfTEFUQ0hFRF9JTlRTOworCWlycSA9IElSUV9LRVY3QTQwMF9DUExEOworCWZvciAoOyBtYXNrOyBtYXNrID4+PSAxLCArK2lycSkgeworCQlpZiAobWFzayAmIDEpCisJCQlkZXNjW2lycV0uaGFuZGxlIChpcnEsIGRlc2MsIHJlZ3MpOworCX0KK30KKwordm9pZCBfX2luaXQgbGg3YTQweF9pbml0X2JvYXJkX2lycSAodm9pZCkKK3sKKwlpbnQgaXJxOworCisJZm9yIChpcnEgPSBJUlFfS0VWN0E0MDBfQ1BMRDsKKwkgICAgIGlycSA8IElSUV9LRVY3QTQwMF9DUExEICsgTlJfSVJRX0JPQVJEOyArK2lycSkgeworCQlzZXRfaXJxX2NoaXAgKGlycSwgJmtldjdhNDAwX2NwbGRfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MgKGlycSwgSVJRRl9WQUxJRCk7CisJfQorCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyIChJUlFfQ1BMRCwga2V2N2E0MDBfY3BsZF9oYW5kbGVyKTsKKworCQkvKiBDbGVhciBhbGwgQ1BMRCBpbnRlcnJ1cHRzICovCisJQ1BMRF9DTF9JTlQgPSAweGZmOyAvKiBDUExEX0lOVFJfTU1DX0NEIHwgQ1BMRF9JTlRSX0VUSF9JTlQ7ICovCisKKwlHUElPX0dQSU9JTlRFTiA9IDA7CQkvKiBEaXNhYmxlIGFsbCBHUElPIGludGVycnVwdHMgKi8KKwliYXJyaWVyKCk7CisKKyNpZiAwCisJR1BJT19JTlRUWVBFMQorCQk9IChHUElPX0lOVFJfUENDMV9DRCB8IEdQSU9fSU5UUl9QQ0MxX0NEKTsgLyogRWRnZSB0cmlnLiAqLworCUdQSU9fSU5UVFlQRTIgPSAwOwkJLyogRmFsbGluZyBlZGdlICYgbG93LWxldmVsICovCisJR1BJT19HUElPRkVPSSA9IDB4ZmY7CQkvKiBDbGVhciBhbGwgR1BJTyBpbnRlcnJ1cHRzICovCisJR1BJT19HUElPSU5URU4gPSAweGZmOwkJLyogRW5hYmxlIGFsbCBHUElPIGludGVycnVwdHMgKi8KKworCWluaXRfRklRKCk7CisjZW5kaWYKK30KKworTUFDSElORV9TVEFSVCAoS0VWN0E0MDAsICJTaGFycCBLRVY3YTQwMCIpCisJTUFJTlRBSU5FUiAoIk1hcmMgU2luZ2VyIikKKwlCT09UX01FTSAoMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgaW9fcDJ2ICgweDgwMDAwMDAwKSkKKwlCT09UX1BBUkFNUyAoMHhjMDAwMDEwMCkKKwlNQVBJTyAoa2V2N2E0MDBfbWFwX2lvKQorCUlOSVRJUlEgKGxoN2E0MDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZsaDdhNDB4X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjM0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCkBAIC0wLDAgKzEsMjg2IEBACisvKiBhcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IENQTEQwMF9QSFlTLAorCQkuZW5kCT0gQ1BMRDAwX1BIWVMgKyBDUExEMDBfU0laRSAtIDEsIC8qIE9ubHkgbmVlZHMgMTZCICovCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9MUEQ3QTQwWF9FVEhfSU5ULAorCQkuZW5kCT0gSVJRX0xQRDdBNDBYX0VUSF9JTlQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGxoN2E0MHhfdXNiY2xpZW50X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gVVNCX1BIWVMsCisJCS5lbmQJPSAoVVNCX1BIWVMgKyAweEZGKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9VU0JJTlRSLAorCQkuZW5kCT0gSVJRX1VTQklOVFIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IGxoN2E0MHhfdXNiY2xpZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsaDdhNDB4X3VzYmNsaWVudF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImxoN2E0MHhfdWRjIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrID0gJmxoN2E0MHhfdXNiY2xpZW50X2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUgKGxoN2E0MHhfdXNiY2xpZW50X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbGg3YTQweF91c2JjbGllbnRfcmVzb3VyY2VzLAorfTsKKworI2lmIGRlZmluZWQgKENPTkZJR19BUkNIX0xIN0E0MDQpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbGg3YTQwNF91c2Job3N0X3Jlc291cmNlcyBbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFVTQkhfUEhZUywKKwkJLmVuZAk9IChVU0JIX1BIWVMgKyAweEZGKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9VU0hJTlRSLAorCQkuZW5kCT0gSVJRX1VTSElOVFIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IGxoN2E0MDRfdXNiaG9zdF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGg3YTQwNF91c2Job3N0X2RldmljZSA9IHsKKwkubmFtZQkJPSAibGg3YTQwNC1vaGNpIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrID0gJmxoN2E0MDRfdXNiaG9zdF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFIChsaDdhNDA0X3VzYmhvc3RfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBsaDdhNDA0X3VzYmhvc3RfcmVzb3VyY2VzLAorfTsKKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpscGQ3YTQweF9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkmc21jOTF4X2RldmljZSwKKwkmbGg3YTQweF91c2JjbGllbnRfZGV2aWNlLAorI2lmIGRlZmluZWQgKENPTkZJR19BUkNIX0xIN0E0MDQpCisJJmxoN2E0MDRfdXNiaG9zdF9kZXZpY2UsCisjZW5kaWYKK307CisKK2V4dGVybiB2b2lkIGxwZDdhNDAwX21hcF9pbyAodm9pZCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBscGQ3YTQweF9pbml0ICh2b2lkKQoreworCUNQTERfQ09OVFJPTCB8PSAgICAgKDE8PDYpOyAvKiBNYXNrIFVTQjEgY29ubmVjdGlvbiBJUlEgKi8KKwlDUExEX0NPTlRST0wgJj0gfigwCisJCQkgIHwgKDE8PDEpIC8qIERpc2FibGUgTENEICovCisJCQkgIHwgKDE8PDApIC8qIEVuYWJsZSBXTEFOICovCisJCSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyAobHBkN2E0MHhfZGV2cywgQVJSQVlfU0laRSAobHBkN2E0MHhfZGV2cykpOworfQorCitzdGF0aWMgdm9pZCBsaDdhNDB4X2Fja19jcGxkX2lycSAodTMyIGlycSkKK3sKKwkvKiBDUExEIGRvZXNuJ3QgaGF2ZSBhY2sgY2FwYWJpbGl0eSAqLworfQorCitzdGF0aWMgdm9pZCBsaDdhNDB4X21hc2tfY3BsZF9pcnEgKHUzMiBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUV9MUEQ3QTQwWF9FVEhfSU5UOgorCQlDUExEX0lOVEVSUlVQVFMgPSBDUExEX0lOVEVSUlVQVFMgfCAweDQ7CisJCWJyZWFrOworCWNhc2UgSVJRX0xQRDdBNDAwX1RTOgorCQlDUExEX0lOVEVSUlVQVFMgPSBDUExEX0lOVEVSUlVQVFMgfCAweDg7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbGg3YTQweF91bm1hc2tfY3BsZF9pcnEgKHUzMiBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUV9MUEQ3QTQwWF9FVEhfSU5UOgorCQlDUExEX0lOVEVSUlVQVFMgPSBDUExEX0lOVEVSUlVQVFMgJiB+IDB4NDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfTFBEN0E0MDBfVFM6CisJCUNQTERfSU5URVJSVVBUUyA9IENQTERfSU5URVJSVVBUUyAmIH4gMHg4OworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBscGQ3YTQweF9jcGxkX2NoaXAgPSB7CisJLmFjawk9IGxoN2E0MHhfYWNrX2NwbGRfaXJxLAorCS5tYXNrCT0gbGg3YTQweF9tYXNrX2NwbGRfaXJxLAorCS51bm1hc2sJPSBsaDdhNDB4X3VubWFza19jcGxkX2lycSwKK307CisKK3N0YXRpYyB2b2lkIGxwZDdhNDB4X2NwbGRfaGFuZGxlciAodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IENQTERfSU5URVJSVVBUUzsKKworCWRlc2MtPmNoaXAtPmFjayAoaXJxKTsKKworCWlmICgobWFzayAmIDB4MSkgPT0gMCkJLyogV0xBTiAqLworCQlJUlFfRElTUEFUQ0ggKElSUV9MUEQ3QTQwWF9FVEhfSU5UKTsKKworCWlmICgobWFzayAmIDB4MikgPT0gMCkJLyogVG91Y2ggKi8KKwkJSVJRX0RJU1BBVENIIChJUlFfTFBEN0E0MDBfVFMpOworCisJZGVzYy0+Y2hpcC0+dW5tYXNrIChpcnEpOyAvKiBMZXZlbC10cmlnZ2VyZWQgbmVlZCB0aGlzICovCit9CisKKwordm9pZCBfX2luaXQgbGg3YTQweF9pbml0X2JvYXJkX2lycSAodm9pZCkKK3sKKwlpbnQgaXJxOworCisJCS8qIFJldiBBICh2Mi44KTogUEYwLCBQRjEsIFBGMiwgYW5kIFBGMyBhcmUgYXZhaWxhYmxlIElSUXMuCisJCSAgICAgICAgICAgICAgICAgUEY3IHN1cHBvcnRzIHRoZSBDUExELgorCQkgICBSZXYgQiAodjMuNCk6IFBGMCwgUEYxLCBhbmQgUEYyIGFyZSBhdmFpbGFibGUgSVJRcy4KKwkJICAgICAgICAgICAgICAgICBQRjMgc3VwcG9ydHMgdGhlIENQTEQuCisJCSAgIChTb21lKSBMUEQ3QTQwNCBwcmVyZWxlYXNlIGJvYXJkcyByZXBvcnQgYSB2ZXJzaW9uCisJCSAgIG51bWJlciBvZiAweDE2LCBidXQgd2UgZm9yY2UgYW4gb3ZlcnJpZGUgc2luY2UgdGhlCisJCSAgIGhhcmR3YXJlIGlzIG9mIHRoZSBuZXdlciB2YXJpZXR5LgorCQkqLworCisJdW5zaWduZWQgY2hhciBjcGxkX3ZlcnNpb24gPSBDUExEX1JFVklTSU9OOworCWludCBwaW5DUExEID0gKGNwbGRfdmVyc2lvbiA9PSAweDI4KSA/IDcgOiAzOworCisjaWYgZGVmaW5lZCBDT05GSUdfTUFDSF9MUEQ3QTQwNAorCWNwbGRfdmVyc2lvbiA9IDB4MzQ7CS8qIENvZXJjZSBMUEQ3QTQwNCB0byBSZXZCICovCisjZW5kaWYKKworCQkvKiBGaXJzdCwgY29uZmlndXJlIHVzZXIgY29udHJvbGxlZCBHUElPRiBpbnRlcnJ1cHRzICAqLworCisJR1BJT19QRkRECSY9IH4weDBmOyAvKiBQRjAtMyBhcmUgaW5wdXRzICovCisJR1BJT19JTlRUWVBFMQkmPSB+MHgwZjsgLyogUEYwLTMgYXJlIGxldmVsIHRyaWdnZXJlZCAqLworCUdQSU9fSU5UVFlQRTIJJj0gfjB4MGY7IC8qIFBGMC0zIGFyZSBhY3RpdmUgbG93ICovCisJYmFycmllciAoKTsKKwlHUElPX0dQSU9GSU5URU4gfD0gIDB4MGY7IC8qIEVuYWJsZSBQRjAsIFBGMSwgUEYyLCBhbmQgUEYzIElSUXMgKi8KKworCQkvKiBUaGVuLCBjb25maWd1cmUgQ1BMRCBpbnRlcnJ1cHQgKi8KKworCUNQTERfSU5URVJSVVBUUwk9ICAgMHg5YzsgLyogRGlzYWJsZSBhbGwgQ1BMRCBpbnRlcnJ1cHRzICovCisJR1BJT19QRkRECSY9IH4oMSA8PCBwaW5DUExEKTsgLyogTWFrZSBpbnB1dCAqLworCUdQSU9fSU5UVFlQRTEJfD0gICgxIDw8IHBpbkNQTEQpOyAvKiBFZGdlIHRyaWdnZXJlZCAqLworCUdQSU9fSU5UVFlQRTIJJj0gfigxIDw8IHBpbkNQTEQpOyAvKiBBY3RpdmUgbG93ICovCisJYmFycmllciAoKTsKKwlHUElPX0dQSU9GSU5URU4gfD0gICgxIDw8IHBpbkNQTEQpOyAvKiBFbmFibGUgKi8KKworCQkvKiBDYXNjYWRlIENQTEQgaW50ZXJydXB0cyAqLworCisJZm9yIChpcnEgPSBJUlFfQk9BUkRfU1RBUlQ7CisJICAgICBpcnEgPCBJUlFfQk9BUkRfU1RBUlQgKyBOUl9JUlFfQk9BUkQ7ICsraXJxKSB7CisJCXNldF9pcnFfY2hpcCAoaXJxLCAmbHBkN2E0MHhfY3BsZF9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9mbGFncyAoaXJxLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlciAoKGNwbGRfdmVyc2lvbiA9PSAweDI4KQorCQkJCSA/IElSUV9DUExEX1YyOAorCQkJCSA6IElSUV9DUExEX1YzNCwKKwkJCQkgbHBkN2E0MHhfY3BsZF9oYW5kbGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBscGQ3YTQwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7ICAgICBJT19WSVJULAkgICAgSU9fUEhZUywJICAgIElPX1NJWkUsCU1UX0RFVklDRSB9LAorCS8qIE1hcHBpbmcgYWRkZWQgdG8gd29yayBhcm91bmQgY2hpcCBzZWxlY3QgcHJvYmxlbXMgKi8KKwl7IElPQkFSUklFUl9WSVJULCBJT0JBUlJJRVJfUEhZUywgSU9CQVJSSUVSX1NJWkUsIE1UX0RFVklDRSB9LAorCXsgQ0ZfVklSVCwJQ0ZfUEhZUywJQ0ZfU0laRSwJTVRfREVWSUNFIH0sCisJLyogVGhpcyBtYXBwaW5nIGlzIHJlZHVuZGFudCBzaW5jZSB0aGUgc21jIGRyaXZlciBwZXJmb3JtcyBhbm90aGVyLiAqLworLyoJeyBDUExEMDBfVklSVCwgIENQTEQwMF9QSFlTLAlDUExEMDBfU0laRSwJTVRfREVWSUNFIH0sICovCisJeyBDUExEMDJfVklSVCwgIENQTEQwMl9QSFlTLAlDUExEMDJfU0laRSwJTVRfREVWSUNFIH0sCisJeyBDUExEMDZfVklSVCwgIENQTEQwNl9QSFlTLAlDUExEMDZfU0laRSwJTVRfREVWSUNFIH0sCisJeyBDUExEMDhfVklSVCwJQ1BMRDA4X1BIWVMsCUNQTEQwOF9TSVpFLAlNVF9ERVZJQ0UgfSwKKwl7IENQTEQwQ19WSVJULAlDUExEMENfUEhZUywJQ1BMRDBDX1NJWkUsCU1UX0RFVklDRSB9LAorCXsgQ1BMRDBFX1ZJUlQsCUNQTEQwRV9QSFlTLAlDUExEMEVfU0laRSwJTVRfREVWSUNFIH0sCisJeyBDUExEMTBfVklSVCwJQ1BMRDEwX1BIWVMsCUNQTEQxMF9TSVpFLAlNVF9ERVZJQ0UgfSwKKwl7IENQTEQxMl9WSVJULAlDUExEMTJfUEhZUywJQ1BMRDEyX1NJWkUsCU1UX0RFVklDRSB9LAorCXsgQ1BMRDE0X1ZJUlQsCUNQTEQxNF9QSFlTLAlDUExEMTRfU0laRSwJTVRfREVWSUNFIH0sCisJeyBDUExEMTZfVklSVCwJQ1BMRDE2X1BIWVMsCUNQTEQxNl9TSVpFLAlNVF9ERVZJQ0UgfSwKKwl7IENQTEQxOF9WSVJULAlDUExEMThfUEhZUywJQ1BMRDE4X1NJWkUsCU1UX0RFVklDRSB9LAorCXsgQ1BMRDFBX1ZJUlQsCUNQTEQxQV9QSFlTLAlDUExEMUFfU0laRSwJTVRfREVWSUNFIH0sCit9OworCit2b2lkIF9faW5pdAorbHBkN2E0MDBfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0IChscGQ3YTQwMF9pb19kZXNjLCBBUlJBWV9TSVpFIChscGQ3YTQwMF9pb19kZXNjKSk7CisKKwkJLyogRml4dXAgKGltcHJvdmUpIFN0YXRpYyBNZW1vcnkgQ29udHJvbGxlciBzZXR0aW5ncyAqLworCVNNQ19CQ1IwID0gMHgyMDAwMzlhZjsJLyogQm9vdCBGbGFzaCAqLworCVNNQ19CQ1I2ID0gMHgxMDAwZmJlMDsJLyogQ1BMRCAqLworCVNNQ19CQ1I3ID0gMHgxMDAwYjJjMjsJLyogQ29tcGFjdCBGbGFzaCAqLworfQorCisjaWZkZWYgQ09ORklHX01BQ0hfTFBEN0E0MDAKKworTUFDSElORV9TVEFSVCAoTFBEN0E0MDAsICJMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50IExQRDdBNDAwLTEwIikKKwlNQUlOVEFJTkVSICgiTWFyYyBTaW5nZXIiKQorCUJPT1RfTUVNICgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCBpb19wMnYgKDB4ODAwMDAwMDApKQorCUJPT1RfUEFSQU1TICgweGMwMDAwMTAwKQorCU1BUElPIChscGQ3YTQwMF9tYXBfaW8pCisJSU5JVElSUSAobGg3YTQwMF9pbml0X2lycSkKKwkudGltZXIJCT0gJmxoN2E0MHhfdGltZXIsCisJSU5JVF9NQUNISU5FIChscGQ3YTQweF9pbml0KQorTUFDSElORV9FTkQKKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9MUEQ3QTQwNAorCitNQUNISU5FX1NUQVJUIChMUEQ3QTQwNCwgIkxvZ2ljIFByb2R1Y3QgRGV2ZWxvcG1lbnQgTFBEN0E0MDQtMTAiKQorCU1BSU5UQUlORVIgKCJNYXJjIFNpbmdlciIpCisJQk9PVF9NRU0gKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIGlvX3AydiAoMHg4MDAwMDAwMCkpCisJQk9PVF9QQVJBTVMgKDB4YzAwMDAxMDApCisJTUFQSU8gKGxwZDdhNDAwX21hcF9pbykKKwlJTklUSVJRIChsaDdhNDA0X2luaXRfaXJxKQorCS50aW1lcgkJPSAmbGg3YTQweF90aW1lciwKKwlJTklUX01BQ0hJTkUgKGxwZDdhNDB4X2luaXQpCitNQUNISU5FX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWRhN2MyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qIGFyY2gvYXJtL21hY2gtbGg3YTQweC9jb21tb24uaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTWFyYyBTaW5nZXIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCitleHRlcm4gc3RydWN0IHN5c190aW1lciBsaDdhNDB4X3RpbWVyOworCitleHRlcm4gdm9pZCBsaDdhNDAwX2luaXRfaXJxICh2b2lkKTsKK2V4dGVybiB2b2lkIGxoN2E0MDRfaW5pdF9pcnEgKHZvaWQpOworCisjZGVmaW5lIElSUV9ESVNQQVRDSChpcnEpIGlycV9kZXNjW2lycV0uaGFuZGxlICgoaXJxKSwgJmlycV9kZXNjW2lycV0sIHJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWtldjdhNDAwLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWtldjdhNDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxYmIwOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEta2V2N2E0MDAuYwpAQCAtMCwwICsxLDkyIEBACisvKiBhcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWtldjdhNDAwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IENvYXN0YWwgRW52aXJvbm1lbnRhbCBTeXN0ZW1zCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycXMuaD4KKworCisgIC8qIEtFVjdhNDAwIENQTEQgSVJRIGhhbmRsaW5nICovCisKK3N0YXRpYyB1MTYgQ1BMRF9JUlFfbWFzazsJLyogTWFzayBmb3IgQ1BMRCBJUlFzLCAxID09IHVubWFza2VkICovCisKK3N0YXRpYyB2b2lkCitsaDdhNDAwX2Fja19jcGxkX2lycSAodTMyIGlycSkKK3sKKwlDUExEX0NMX0lOVCA9IDEgPDwgKGlycSAtIElSUV9LRVY3QTQwMF9DUExEKTsKK30KKworc3RhdGljIHZvaWQKK2xoN2E0MDBfbWFza19jcGxkX2lycSAodTMyIGlycSkKK3sKKwlDUExEX0lSUV9tYXNrICY9IH4oMSA8PCAoaXJxIC0gSVJRX0tFVjdBNDAwX0NQTEQpKTsKKwlDUExEX1dSX1BCX0lOVF9NQVNLID0gQ1BMRF9JUlFfbWFzazsKK30KKworc3RhdGljIHZvaWQKK2xoN2E0MDBfdW5tYXNrX2NwbGRfaXJxICh1MzIgaXJxKQoreworCUNQTERfSVJRX21hc2sgfD0gMSA8PCAoaXJxIC0gSVJRX0tFVjdBNDAwX0NQTEQpOworCUNQTERfV1JfUEJfSU5UX01BU0sgPSBDUExEX0lSUV9tYXNrOworfQorCitzdGF0aWMgc3RydWN0CitpcnFjaGlwIGxoN2E0MDBfY3BsZF9jaGlwID0geworCS5hY2sJPSBsaDdhNDAwX2Fja19jcGxkX2lycSwKKwkubWFzawk9IGxoN2E0MDBfbWFza19jcGxkX2lycSwKKwkudW5tYXNrCT0gbGg3YTQwMF91bm1hc2tfY3BsZF9pcnEsCit9OworCitzdGF0aWMgdm9pZAorbGg3YTQwMF9jcGxkX2hhbmRsZXIgKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgbWFzayA9IENQTERfTEFUQ0hFRF9JTlRTOworCWlycSA9IElSUV9LRVZfN0E0MDBfQ1BMRDsKKwlmb3IgKDsgbWFzazsgbWFzayA+Pj0gMSwgKytpcnEpIHsKKwkJaWYgKG1hc2sgJiAxKQorCQkJZGVzY1tpcnFdLmhhbmRsZSAoaXJxLCBkZXNjLCByZWdzKTsKKwl9Cit9CisKKyAgLyogSVJRIGluaXRpYWxpemF0aW9uICovCisKK3ZvaWQgX19pbml0CitsaDdhNDAwX2luaXRfYm9hcmRfaXJxICh2b2lkKQoreworCWludCBpcnE7CisKKwlmb3IgKGlycSA9IElSUV9LRVY3QTQwMF9DUExEOworCSAgICAgaXJxIDwgSVJRX0tFVjdBNDAwX0NQTEQgKyBOUl9JUlFfS0VWN0E0MDBfQ1BMRDsgKytpcnEpIHsKKwkJc2V0X2lycV9jaGlwIChpcnEsICZsaDdhNDAwX2NwbGRfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MgKGlycSwgSVJRRl9WQUxJRCk7CisJfQorCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyIChJUlFfQ1BMRCwga2V2N2E0MDBfY3BsZF9oYW5kbGVyKTsKKworCQkvKiBDbGVhciBhbGwgQ1BMRCBpbnRlcnJ1cHRzICovCisJQ1BMRF9DTF9JTlQgPSAweGZmOyAvKiBDUExEX0lOVFJfTU1DX0NEIHwgQ1BMRF9JTlRSX0VUSF9JTlQ7ICovCisKKyAgICAvKiAqKiogRklYTUUgQ0YgZW5hYmxlZCBpbiBpZGUtcHJvYmUuYyAqLworCisJR1BJT19HUElPSU5URU4gPSAwOwkJLyogRGlzYWJsZSBhbGwgR1BJTyBpbnRlcnJ1cHRzICovCisJYmFycmllcigpOworCUdQSU9fSU5UVFlQRTEKKwkJPSAoR1BJT19JTlRSX1BDQzFfQ0QgfCBHUElPX0lOVFJfUENDMV9DRCk7IC8qIEVkZ2UgdHJpZy4gKi8KKwlHUElPX0lOVFRZUEUyID0gMDsJCS8qIEZhbGxpbmcgZWRnZSAmIGxvdy1sZXZlbCAqLworCUdQSU9fR1BJT0ZFT0kgPSAweGZmOwkJLyogQ2xlYXIgYWxsIEdQSU8gaW50ZXJydXB0cyAqLworCUdQSU9fR1BJT0lOVEVOID0gMHhmZjsJCS8qIEVuYWJsZSBhbGwgR1BJTyBpbnRlcnJ1cHRzICovCisKKwlpbml0X0ZJUSgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1saDdhNDAwLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWxoN2E0MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM0ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1saDdhNDAwLmMKQEAgLTAsMCArMSw5MCBAQAorLyogYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1saDdhNDAwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IENvYXN0YWwgRW52aXJvbm1lbnRhbCBTeXN0ZW1zCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisKKworICAvKiBDUFUgSVJRIGhhbmRsaW5nICovCisKK3N0YXRpYyB2b2lkIGxoN2E0MDBfbWFza19pcnEgKHUzMiBpcnEpCit7CisJSU5UQ19JTlRFTkMgPSAoMSA8PCBpcnEpOworfQorCitzdGF0aWMgdm9pZCBsaDdhNDAwX3VubWFza19pcnEgKHUzMiBpcnEpCit7CisJSU5UQ19JTlRFTlMgPSAoMSA8PCBpcnEpOworfQorCitzdGF0aWMgdm9pZCBsaDdhNDAwX2Fja19ncGlvX2lycSAodTMyIGlycSkKK3sKKwlHUElPX0dQSU9GRU9JID0gKDEgPDwgSVJRX1RPX0dQSU8gKGlycSkpOworCUlOVENfSU5URU5DID0gKDEgPDwgaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGxoN2E0MDBfaW50ZXJuYWxfY2hpcCA9IHsKKwkuYWNrCT0gbGg3YTQwMF9tYXNrX2lycSwgLyogTGV2ZWwgdHJpZ2dlcmluZyAtPiBtYXNrIGlzIGFjayAqLworCS5tYXNrCT0gbGg3YTQwMF9tYXNrX2lycSwKKwkudW5tYXNrCT0gbGg3YTQwMF91bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGxoN2E0MDBfZ3Bpb19jaGlwID0geworCS5hY2sJPSBsaDdhNDAwX2Fja19ncGlvX2lycSwKKwkubWFzawk9IGxoN2E0MDBfbWFza19pcnEsCisJLnVubWFzawk9IGxoN2E0MDBfdW5tYXNrX2lycSwKK307CisKKworICAvKiBJUlEgaW5pdGlhbGl6YXRpb24gKi8KKwordm9pZCBfX2luaXQgbGg3YTQwMF9pbml0X2lycSAodm9pZCkKK3sKKwlpbnQgaXJxOworCisJSU5UQ19JTlRFTkMgPSAweGZmZmZmZmZmOwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJR1BJT19HUElPRklOVEVOID0gMHgwMDsJCS8qIERpc2FibGUgYWxsIEdQSU9GIGludGVycnVwdHMgKi8KKwliYXJyaWVyICgpOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyArK2lycSkgeworCQlzd2l0Y2ggKGlycSkgeworCQljYXNlIElSUV9HUElPMElOVFI6CisJCWNhc2UgSVJRX0dQSU8xSU5UUjoKKwkJY2FzZSBJUlFfR1BJTzJJTlRSOgorCQljYXNlIElSUV9HUElPM0lOVFI6CisJCWNhc2UgSVJRX0dQSU80SU5UUjoKKwkJY2FzZSBJUlFfR1BJTzVJTlRSOgorCQljYXNlIElSUV9HUElPNklOVFI6CisJCWNhc2UgSVJRX0dQSU83SU5UUjoKKwkJCXNldF9pcnFfY2hpcCAoaXJxLCAmbGg3YTQwMF9ncGlvX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGRvX2xldmVsX0lSUSk7IC8qIE9LIGRlZmF1bHQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc2V0X2lycV9jaGlwIChpcnEsICZsaDdhNDAwX2ludGVybmFsX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGRvX2xldmVsX0lSUSk7CisJCX0KKwkJc2V0X2lycV9mbGFncyAoaXJxLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlsaDdhNDB4X2luaXRfYm9hcmRfaXJxICgpOworCisvKiAqKiogRklYTUU6IHRoZSBMSDdhNDAwIGRvZXMgdXNlIEZJUSBpbnRlcnJ1cHRzIGluIHNvbWUgY2FzZXMuICBGb3IKKyAgIHRoZSB0aW1lIGJlaW5nLCB0aGVzZSBhcmUgbm90IGluaXRpYWxpemVkLiAqLworCisvKglpbml0X0ZJUSgpOyAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1saDdhNDA0LmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWxoN2E0MDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJmYWRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1saDdhNDA0LmMKQEAgLTAsMCArMSwxNTggQEAKKy8qIGFyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbGg3YTQwNC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisKKyNkZWZpbmUgVVNFX1BSSU9SSVRJRVMKKworLyogU2VlIERvY3VtZW50YXRpb24vYXJtL1NoYXJwLUxIL1ZlY3RvcmVkSW50ZXJydXB0Q29udHJvbGxlciBmb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIHZlY3RvcmVkIGludGVycnVwdCBjb250cm9sbGVyJ3MKKyAqIHByaW9yaXRpemluZyBmZWF0dXJlLiAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBpcnFfcHJpX3ZpYzFbXSA9IHsKKyNpZiBkZWZpbmVkIChVU0VfUFJJT1JJVElFUykKK0lSUV9HUElPM0lOVFIsCisjZW5kaWYKK307CitzdGF0aWMgdW5zaWduZWQgY2hhciBpcnFfcHJpX3ZpYzJbXSA9IHsKKyNpZiBkZWZpbmVkIChVU0VfUFJJT1JJVElFUykKKwlJUlFfVDNVSSwgSVJRX0dQSU83SU5UUiwKKwlJUlFfVUFSVDFJTlRSLCBJUlFfVUFSVDJJTlRSLCBJUlFfVUFSVDNJTlRSLAorI2VuZGlmCit9OworCisgIC8qIENQVSBJUlEgaGFuZGxpbmcgKi8KKworc3RhdGljIHZvaWQgbGg3YTQwNF92aWMxX21hc2tfaXJxICh1MzIgaXJxKQoreworCVZJQzFfSU5URU5DTFIgPSAoMSA8PCBpcnEpOworfQorCitzdGF0aWMgdm9pZCBsaDdhNDA0X3ZpYzFfdW5tYXNrX2lycSAodTMyIGlycSkKK3sKKwlWSUMxX0lOVEVOID0gKDEgPDwgaXJxKTsKK30KKworc3RhdGljIHZvaWQgbGg3YTQwNF92aWMyX21hc2tfaXJxICh1MzIgaXJxKQoreworCVZJQzJfSU5URU5DTFIgPSAoMSA8PCAoaXJxIC0gMzIpKTsKK30KKworc3RhdGljIHZvaWQgbGg3YTQwNF92aWMyX3VubWFza19pcnEgKHUzMiBpcnEpCit7CisJVklDMl9JTlRFTiA9ICgxIDw8IChpcnEgLSAzMikpOworfQorCitzdGF0aWMgdm9pZCBsaDdhNDA0X3ZpYzFfYWNrX2dwaW9faXJxICh1MzIgaXJxKQoreworCUdQSU9fR1BJT0ZFT0kgPSAoMSA8PCBJUlFfVE9fR1BJTyAoaXJxKSk7CisJVklDMV9JTlRFTkNMUiA9ICgxIDw8IGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGxoN2E0MDRfdmljMl9hY2tfZ3Bpb19pcnEgKHUzMiBpcnEpCit7CisJR1BJT19HUElPRkVPSSA9ICgxIDw8IElSUV9UT19HUElPIChpcnEpKTsKKwlWSUMyX0lOVEVOQ0xSID0gKDEgPDwgaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGxoN2E0MDRfdmljMV9jaGlwID0geworCS5hY2sJPSBsaDdhNDA0X3ZpYzFfbWFza19pcnEsIC8qIEJlY2F1c2UgbGV2ZWwtdHJpZ2dlcmVkICovCisJLm1hc2sJPSBsaDdhNDA0X3ZpYzFfbWFza19pcnEsCisJLnVubWFzawk9IGxoN2E0MDRfdmljMV91bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGxoN2E0MDRfdmljMl9jaGlwID0geworCS5hY2sJPSBsaDdhNDA0X3ZpYzJfbWFza19pcnEsIC8qIEJlY2F1c2UgbGV2ZWwtdHJpZ2dlcmVkICovCisJLm1hc2sJPSBsaDdhNDA0X3ZpYzJfbWFza19pcnEsCisJLnVubWFzawk9IGxoN2E0MDRfdmljMl91bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGxoN2E0MDRfZ3Bpb192aWMxX2NoaXAgPSB7CisJLmFjawk9IGxoN2E0MDRfdmljMV9hY2tfZ3Bpb19pcnEsCisJLm1hc2sJPSBsaDdhNDA0X3ZpYzFfbWFza19pcnEsCisJLnVubWFzawk9IGxoN2E0MDRfdmljMV91bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGxoN2E0MDRfZ3Bpb192aWMyX2NoaXAgPSB7CisJLmFjawk9IGxoN2E0MDRfdmljMl9hY2tfZ3Bpb19pcnEsCisJLm1hc2sJPSBsaDdhNDA0X3ZpYzJfbWFza19pcnEsCisJLnVubWFzawk9IGxoN2E0MDRfdmljMl91bm1hc2tfaXJxLAorfTsKKworICAvKiBJUlEgaW5pdGlhbGl6YXRpb24gKi8KKwordm9pZCBfX2luaXQgbGg3YTQwNF9pbml0X2lycSAodm9pZCkKK3sKKwlpbnQgaXJxOworCisJVklDMV9JTlRFTkNMUiA9IDB4ZmZmZmZmZmY7CisJVklDMl9JTlRFTkNMUiA9IDB4ZmZmZmZmZmY7CisJVklDMV9JTlRTRUwgPSAwOwkJLyogQWxsIElSUXMgKi8KKwlWSUMyX0lOVFNFTCA9IDA7CQkvKiBBbGwgSVJRcyAqLworCVZJQzFfTlZBRERSID0gVkFfVklDMURFRkFVTFQ7CisJVklDMl9OVkFERFIgPSBWQV9WSUMyREVGQVVMVDsKKwlWSUMxX1ZFQ1RBRERSID0gMDsKKwlWSUMyX1ZFQ1RBRERSID0gMDsKKworCUdQSU9fR1BJT0ZJTlRFTiA9IDB4MDA7CQkvKiBEaXNhYmxlIGFsbCBHUElPRiBpbnRlcnJ1cHRzICovCisJYmFycmllciAoKTsKKworCQkvKiBJbnN0YWxsIHByaW9yaXRpemVkIGludGVycnVwdHMsIGlmIHRoZXJlIGFyZSBhbnkuICovCisJCS8qIFRoZSB8IDB4MjAqLworCWZvciAoaXJxID0gMDsgaXJxIDwgMTY7ICsraXJxKSB7CisJCSgmVklDMV9WQUQwKVtpcnFdCisJCQk9IChpcnEgPCBBUlJBWV9TSVpFIChpcnFfcHJpX3ZpYzEpKQorCQkJPyAoaXJxX3ByaV92aWMxW2lycV0gfCBWQV9WRUNUT1JFRCkgOiAwOworCQkoJlZJQzFfVkVDVENOVEwwKVtpcnFdCisJCQk9IChpcnEgPCBBUlJBWV9TSVpFIChpcnFfcHJpX3ZpYzEpKQorCQkJPyAoaXJxX3ByaV92aWMxW2lycV0gfCBWSUNfQ05UTF9FTkFCTEUpIDogMDsKKwkJKCZWSUMyX1ZBRDApW2lycV0KKwkJCT0gKGlycSA8IEFSUkFZX1NJWkUgKGlycV9wcmlfdmljMikpCisJCQk/IChpcnFfcHJpX3ZpYzJbaXJxXSB8IFZBX1ZFQ1RPUkVEKSA6IDA7CisJCSgmVklDMl9WRUNUQ05UTDApW2lycV0KKwkJCT0gKGlycSA8IEFSUkFZX1NJWkUgKGlycV9wcmlfdmljMikpCisJCQk/IChpcnFfcHJpX3ZpYzJbaXJxXSB8IFZJQ19DTlRMX0VOQUJMRSkgOiAwOworCX0KKworCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgKytpcnEpIHsKKwkJc3dpdGNoIChpcnEpIHsKKwkJY2FzZSBJUlFfR1BJTzBJTlRSOgorCQljYXNlIElSUV9HUElPMUlOVFI6CisJCWNhc2UgSVJRX0dQSU8ySU5UUjoKKwkJY2FzZSBJUlFfR1BJTzNJTlRSOgorCQljYXNlIElSUV9HUElPNElOVFI6CisJCWNhc2UgSVJRX0dQSU81SU5UUjoKKwkJY2FzZSBJUlFfR1BJTzZJTlRSOgorCQljYXNlIElSUV9HUElPN0lOVFI6CisJCQlzZXRfaXJxX2NoaXAgKGlycSwgaXJxIDwgMzIKKwkJCQkgICAgICA/ICZsaDdhNDA0X2dwaW9fdmljMV9jaGlwCisJCQkJICAgICAgOiAmbGg3YTQwNF9ncGlvX3ZpYzJfY2hpcCk7CisJCQlzZXRfaXJxX2hhbmRsZXIgKGlycSwgZG9fbGV2ZWxfSVJRKTsgLyogT0sgZGVmYXVsdCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZXRfaXJxX2NoaXAgKGlycSwgaXJxIDwgMzIKKwkJCQkgICAgICA/ICZsaDdhNDA0X3ZpYzFfY2hpcAorCQkJCSAgICAgIDogJmxoN2E0MDRfdmljMl9jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBkb19sZXZlbF9JUlEpOworCQl9CisJCXNldF9pcnFfZmxhZ3MgKGlycSwgSVJRRl9WQUxJRCk7CisJfQorCisJbGg3YTQweF9pbml0X2JvYXJkX2lycSAoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbHBkN2E0MHguYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbHBkN2E0MHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjYyZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1scGQ3YTQweC5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiBhcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWxwZDdhNDB4LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IENvYXN0YWwgRW52aXJvbm1lbnRhbCBTeXN0ZW1zCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IExvZ2ljIFByb2R1Y3QgRGV2ZWxvcG1lbnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKworCitzdGF0aWMgdm9pZCBsaDdhNDB4X2Fja19jcGxkX2lycSAodTMyIGlycSkKK3sKKwkvKiBDUExEIGRvZXNuJ3QgaGF2ZSBhY2sgY2FwYWJpbGl0eSAqLworfQorCitzdGF0aWMgdm9pZCBsaDdhNDB4X21hc2tfY3BsZF9pcnEgKHUzMiBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUV9MUEQ3QTQwWF9FVEhfSU5UOgorCQlDUExEX0lOVEVSUlVQVFMgPSBDUExEX0lOVEVSUlVQVFMgfCAweDQ7CisJCWJyZWFrOworCWNhc2UgSVJRX0xQRDdBNDAwX1RTOgorCQlDUExEX0lOVEVSUlVQVFMgPSBDUExEX0lOVEVSUlVQVFMgfCAweDg7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbGg3YTQweF91bm1hc2tfY3BsZF9pcnEgKHUzMiBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUV9MUEQ3QTQwWF9FVEhfSU5UOgorCQlDUExEX0lOVEVSUlVQVFMgPSBDUExEX0lOVEVSUlVQVFMgJiB+IDB4NDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfTFBEN0E0MDBfVFM6CisJCUNQTERfSU5URVJSVVBUUyA9IENQTERfSU5URVJSVVBUUyAmIH4gMHg4OworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBsaDdhNDB4X2NwbGRfY2hpcCA9IHsKKwkuYWNrCT0gbGg3YTQweF9hY2tfY3BsZF9pcnEsCisJLm1hc2sJPSBsaDdhNDB4X21hc2tfY3BsZF9pcnEsCisJLnVubWFzawk9IGxoN2E0MHhfdW5tYXNrX2NwbGRfaXJxLAorfTsKKworc3RhdGljIHZvaWQgbGg3YTQweF9jcGxkX2hhbmRsZXIgKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSBDUExEX0lOVEVSUlVQVFM7CisKKwlkZXNjLT5jaGlwLT5hY2sgKGlycSk7CisKKwlpZiAoKG1hc2sgJiAweDEpID09IDApCS8qIFdMQU4gKi8KKwkJSVJRX0RJU1BBVENIIChJUlFfTFBEN0E0MFhfRVRIX0lOVCk7CisKKwlpZiAoKG1hc2sgJiAweDIpID09IDApCS8qIFRvdWNoICovCisJCUlSUV9ESVNQQVRDSCAoSVJRX0xQRDdBNDAwX1RTKTsKKworCWRlc2MtPmNoaXAtPnVubWFzayAoaXJxKTsgLyogTGV2ZWwtdHJpZ2dlcmVkIG5lZWQgdGhpcyAqLworfQorCisKKyAgLyogSVJRIGluaXRpYWxpemF0aW9uICovCisKK3ZvaWQgX19pbml0IGxoN2E0MHhfaW5pdF9ib2FyZF9pcnEgKHZvaWQpCit7CisJaW50IGlycTsKKworCQkvKiBSZXYgQSAodjIuOCk6IFBGMCwgUEYxLCBQRjIsIGFuZCBQRjMgYXJlIGF2YWlsYWJsZSBJUlFzLgorCQkgICAgICAgICAgICAgICAgIFBGNyBzdXBwb3J0cyB0aGUgQ1BMRC4KKwkJICAgUmV2IEIgKHYzLjQpOiBQRjAsIFBGMSwgYW5kIFBGMiBhcmUgYXZhaWxhYmxlIElSUXMuCisJCSAgICAgICAgICAgICAgICAgUEYzIHN1cHBvcnRzIHRoZSBDUExELgorCQkgICAoU29tZSkgTFBEN0E0MDQgcHJlcmVsZWFzZSBib2FyZHMgcmVwb3J0IGEgdmVyc2lvbgorCQkgICBudW1iZXIgb2YgMHgxNiwgYnV0IHdlIGZvcmNlIGFuIG92ZXJyaWRlIHNpbmNlIHRoZQorCQkgICBoYXJkd2FyZSBpcyBvZiB0aGUgbmV3ZXIgdmFyaWV0eS4KKwkJKi8KKworCXVuc2lnbmVkIGNoYXIgY3BsZF92ZXJzaW9uID0gQ1BMRF9SRVZJU0lPTjsKKwlpbnQgcGluQ1BMRDsKKworI2lmIGRlZmluZWQgQ09ORklHX01BQ0hfTFBEN0E0MDQKKwljcGxkX3ZlcnNpb24gPSAweDM0OwkvKiBPdmVycmlkZSwgZm9yIG5vdyAqLworI2VuZGlmCisJcGluQ1BMRCA9IChjcGxkX3ZlcnNpb24gPT0gMHgyOCkgPyA3IDogMzsKKworCQkvKiBGaXJzdCwgY29uZmlndXJlIHVzZXIgY29udHJvbGxlZCBHUElPRiBpbnRlcnJ1cHRzICAqLworCisJR1BJT19QRkRECSY9IH4weDBmOyAvKiBQRjAtMyBhcmUgaW5wdXRzICovCisJR1BJT19JTlRUWVBFMQkmPSB+MHgwZjsgLyogUEYwLTMgYXJlIGxldmVsIHRyaWdnZXJlZCAqLworCUdQSU9fSU5UVFlQRTIJJj0gfjB4MGY7IC8qIFBGMC0zIGFyZSBhY3RpdmUgbG93ICovCisJYmFycmllciAoKTsKKwlHUElPX0dQSU9GSU5URU4gfD0gIDB4MGY7IC8qIEVuYWJsZSBQRjAsIFBGMSwgUEYyLCBhbmQgUEYzIElSUXMgKi8KKworCQkvKiBUaGVuLCBjb25maWd1cmUgQ1BMRCBpbnRlcnJ1cHQgKi8KKworCUNQTERfSU5URVJSVVBUUwk9ICAgMHgwYzsgLyogRGlzYWJsZSBhbGwgQ1BMRCBpbnRlcnJ1cHRzICovCisJR1BJT19QRkRECSY9IH4oMSA8PCBwaW5DUExEKTsgLyogTWFrZSBpbnB1dCAqLworCUdQSU9fSU5UVFlQRTEJfD0gICgxIDw8IHBpbkNQTEQpOyAvKiBFZGdlIHRyaWdnZXJlZCAqLworCUdQSU9fSU5UVFlQRTIJJj0gfigxIDw8IHBpbkNQTEQpOyAvKiBBY3RpdmUgbG93ICovCisJYmFycmllciAoKTsKKwlHUElPX0dQSU9GSU5URU4gfD0gICgxIDw8IHBpbkNQTEQpOyAvKiBFbmFibGUgKi8KKworCQkvKiBDYXNjYWRlIENQTEQgaW50ZXJydXB0cyAqLworCisJZm9yIChpcnEgPSBJUlFfQk9BUkRfU1RBUlQ7CisJICAgICBpcnEgPCBJUlFfQk9BUkRfU1RBUlQgKyBOUl9JUlFfQk9BUkQ7ICsraXJxKSB7CisJCXNldF9pcnFfY2hpcCAoaXJxLCAmbGg3YTQweF9jcGxkX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIgKGlycSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2ZsYWdzIChpcnEsIElSUUZfVkFMSUQpOworCX0KKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyICgoY3BsZF92ZXJzaW9uID09IDB4MjgpCisJCQkJID8gSVJRX0NQTERfVjI4CisJCQkJIDogSVJRX0NQTERfVjM0LAorCQkJCSBsaDdhNDB4X2NwbGRfaGFuZGxlcik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUxYzgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L3RpbWUuYwpAQCAtMCwwICsxLDc1IEBACisvKiAKKyAqICBhcmNoL2FybS9tYWNoLWxoN2E0MHgvdGltZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworI2lmIEhaIDwgMTAwCisjIGRlZmluZSBUSU1FUl9DT05UUk9MCVRJTUVSX0NPTlRST0wyCisjIGRlZmluZSBUSU1FUl9MT0FECVRJTUVSX0xPQUQyCisjIGRlZmluZSBUSU1FUl9DT05TVEFOVAkoNTA4NDY5L0haKQorIyBkZWZpbmUgVElNRVJfTU9ERQkoVElNRVJfQ19FTkFCTEUgfCBUSU1FUl9DX1BFUklPRElDIHwgVElNRVJfQ181MDhLSFopCisjIGRlZmluZSBUSU1FUl9FT0kJVElNRVJfRU9JMgorIyBkZWZpbmUgVElNRVJfSVJRCUlSUV9UMlVJCisjZWxzZQorIyBkZWZpbmUgVElNRVJfQ09OVFJPTAlUSU1FUl9DT05UUk9MMworIyBkZWZpbmUgVElNRVJfTE9BRAlUSU1FUl9MT0FEMworIyBkZWZpbmUgVElNRVJfQ09OU1RBTlQJKDM2ODY0MDAvSFopCisjIGRlZmluZSBUSU1FUl9NT0RFCShUSU1FUl9DX0VOQUJMRSB8IFRJTUVSX0NfUEVSSU9ESUMpCisjIGRlZmluZSBUSU1FUl9FT0kJVElNRVJfRU9JMworIyBkZWZpbmUgVElNRVJfSVJRCUlSUV9UM1VJCisjZW5kaWYKKworc3RhdGljIGlycXJldHVybl90CitsaDdhNDB4X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJVElNRVJfRU9JID0gMDsKKwl0aW1lcl90aWNrKHJlZ3MpOworCisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbGg3YTQweF90aW1lcl9pcnEgPSB7CisJLm5hbWUJCT0gIkxIQTc0MHggVGltZXIgVGljayIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IGxoN2E0MHhfdGltZXJfaW50ZXJydXB0Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbGg3YTQweF90aW1lcl9pbml0KHZvaWQpCit7CisJCQkJLyogU3RvcC9kaXNhYmxlIGFsbCB0aW1lcnMgKi8KKwlUSU1FUl9DT05UUk9MMSA9IDA7CisJVElNRVJfQ09OVFJPTDIgPSAwOworCVRJTUVSX0NPTlRST0wzID0gMDsKKworCXNldHVwX2lycSAoVElNRVJfSVJRLCAmbGg3YTQweF90aW1lcl9pcnEpOworCisJVElNRVJfTE9BRCA9IFRJTUVSX0NPTlNUQU5UOworCVRJTUVSX0NPTlRST0wgPSBUSU1FUl9NT0RFOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGxoN2E0MHhfdGltZXIgPSB7CisJLmluaXQJCT0gJmxoN2E0MHhfdGltZXJfaW5pdCwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtb21hcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDJlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvS2NvbmZpZwpAQCAtMCwwICsxLDIyMSBAQAoraWYgQVJDSF9PTUFQCisKK21lbnUgIlRJIE9NQVAgSW1wbGVtZW50YXRpb25zIgorCitjb21tZW50ICJPTUFQIENvcmUgVHlwZSIKKworY29uZmlnIEFSQ0hfT01BUDczMAorCWRlcGVuZHMgb24gQVJDSF9PTUFQCisJYm9vbCAiT01BUDczMCBCYXNlZCBTeXN0ZW0iCisJc2VsZWN0IEFSQ0hfT01BUF9PVEcKKworY29uZmlnIEFSQ0hfT01BUDE1MTAKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUAorCWRlZmF1bHQgeQorCWJvb2wgIk9NQVAxNTEwIEJhc2VkIFN5c3RlbSIKKworY29uZmlnIEFSQ0hfT01BUDE2WFgKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUAorCWJvb2wgIk9NQVAxNlhYIEJhc2VkIFN5c3RlbSIKKwlzZWxlY3QgQVJDSF9PTUFQX09URworCitjb25maWcgQVJDSF9PTUFQX09URworCWJvb2wKKworY29tbWVudCAiT01BUCBCb2FyZCBUeXBlIgorCitjb25maWcgTUFDSF9PTUFQX0lOTk9WQVRPUgorCWJvb2wgIlRJIElubm92YXRvciIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWAorCWhlbHAKKyAgICAgICAgICBUSSBPTUFQIDE1MTAgb3IgMTYxMCBJbm5vdmF0b3IgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UKKyAgICAgICAgICBoYXZlIHN1Y2ggYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9IMgorCWJvb2wgIlRJIEgyIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCisgICAgCWhlbHAKKwkgIFRJIE9NQVAgMTYxMC8xNjExQiBIMiBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKKwkgIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX09NQVBfSDMKKwlib29sICJUSSBIMyBTdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAorICAgIAloZWxwCisJICBUSSBPTUFQIDE3MTAgSDMgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCisJICBhIGJvYXJkLgorCitjb25maWcgTUFDSF9PTUFQX0g0CisJYm9vbCAiVEkgSDQgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKKyAgICAJaGVscAorCSAgVEkgT01BUCAxNjEwIEg0IGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAorCSAgYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9PU0sKKwlib29sICJUSSBPU0sgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKKyAgICAJaGVscAorCSAgVEkgT01BUCA1OTEyIE9TSyAoT01BUCBTdGFydGVyIEtpdCkgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZQorICAgICAgICAgIGlmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9QRVJTRVVTMgorCWJvb2wgIlRJIFBlcnNldXMyIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQNzMwCisgICAgCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFRJIE9NQVAgNzMwIFBlcnNldXMyIGJvYXJkLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKKwkgIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX1ZPSUNFQkxVRQorCWJvb2wgIlZvaWNlYmx1ZSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAKKwloZWxwCisJICBTdXBwb3J0IGZvciBWb2ljZWJsdWUgR1NNL1ZvSVAgZ2F0ZXdheS4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCisJICBib2FyZC4KKworY29uZmlnIE1BQ0hfTkVUU1RBUgorCWJvb2wgIk5ldFN0YXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwCisJaGVscAorCSAgU3VwcG9ydCBmb3IgTmV0U3RhciBQQlguIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLgorCitjb25maWcgTUFDSF9PTUFQX0dFTkVSSUMKKwlib29sICJHZW5lcmljIE9NQVAgYm9hcmQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFgKKwloZWxwCisgICAgICAgICAgU3VwcG9ydCBmb3IgZ2VuZXJpYyBPTUFQLTE1MTAsIDE2MTAgb3IgMTcxMCBib2FyZCB3aXRoCisgICAgICAgICAgbm8gRlBHQS4gQ2FuIGJlIHVzZWQgYXMgdGVtcGxhdGUgZm9yIHBvcnRpbmcgTGludXggdG8KKyAgICAgICAgICBjdXN0b20gT01BUCBib2FyZHMuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjdXN0b20KKyAgICAgICAgICBib2FyZC4KKworY29tbWVudCAiT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMiCisKKyNjb25maWcgT01BUF9CT09UX1RBRworIwlib29sICJPTUFQIGJvb3Rsb2FkZXIgaW5mb3JtYXRpb24gcGFzc2luZyIKKyMgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQCisjICAgICAgICBkZWZhdWx0IG4KKyMgICAgICAgIGhlbHAKKyMgICAgICAgICAgU2F5IFksIGlmIHlvdSBoYXZlIGEgYm9vdGxvYWRlciB3aGljaCBwYXNzZXMgaW5mb3JtYXRpb24KKyMgICAgICAgICAgYWJvdXQgeW91ciBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbi4KKworY29uZmlnIE9NQVBfTVVYCisJYm9vbCAiT01BUCBtdWx0aXBsZXhpbmcgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX09NQVAKKwlkZWZhdWx0IHkKKyAgICAgICAgaGVscAorICAgICAgICAgIFBpbiBtdWx0aXBsZXhpbmcgc3VwcG9ydCBmb3IgT01BUCBib2FyZHMuIElmIHlvdXIgYm9vdGxvYWRlcgorICAgICAgICAgIHNldHMgdGhlIG11bHRpcGxleGluZyBjb3JyZWN0bHksIHNheSBOLiBPdGhlcndpc2UsIG9yIGlmIHVuc3VyZSwKKyAgICAgICAgICBzYXkgWS4KKworY29uZmlnIE9NQVBfTVVYX0RFQlVHCisJYm9vbCAiTXVsdGlwbGV4aW5nIGRlYnVnIG91dHB1dCIKKyAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAorICAgICAgICBkZWZhdWx0IG4KKyAgICAgICAgaGVscAorICAgICAgICAgIE1ha2VzIHRoZSBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zIHByaW50IG91dCBhIGxvdCBvZiBkZWJ1ZyBpbmZvLgorICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbmQgb3V0IHRoZSBjb3JyZWN0IHZhbHVlcyBvZiB0aGUKKyAgICAgICAgICBtdWx0aXBsZXhpbmcgcmVnaXN0ZXJzLgorCitjb25maWcgT01BUF9NVVhfV0FSTklOR1MKKwlib29sICJXYXJuIGFib3V0IHBpbnMgdGhlIGJvb3Rsb2FkZXIgZGlkbid0IHNldCB1cCIKKyAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAorICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgaGVscAorCSAgQ2hvb3NlIFkgaGVyZSB0byB3YXJuIHdoZW5ldmVyIGRyaXZlciBpbml0aWFsaXphdGlvbiBsb2dpYyBuZWVkcworCSAgdG8gY2hhbmdlIHRoZSBwaW4gbXVsdGlwbGV4aW5nIHNldHVwLiAgV2hlbiB0aGVyZSBhcmUgbm8gd2FybmluZ3MKKwkgIHByaW50ZWQsIGl0J3Mgc2FmZSB0byBkZXNlbGVjdCBPTUFQX01VWCBmb3IgeW91ciBwcm9kdWN0LgorCitjaG9pY2UKKyAgICAgICAgcHJvbXB0ICJTeXN0ZW0gdGltZXIiCisJZGVmYXVsdCBPTUFQX01QVV9USU1FUgorCitjb25maWcgT01BUF9NUFVfVElNRVIKKwlib29sICJVc2UgbXB1IHRpbWVyIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIE9NQVAgbXB1IHRpbWVyLiBUaGlzCisJICB0aW1lciBwcm92aWRlcyBtb3JlIGludHJhLXRpY2sgcmVzb2x1dGlvbiB0aGFuIHRoZSAzMktIeiB0aW1lciwKKwkgIGJ1dCBjb25zdW1lcyBtb3JlIHBvd2VyLgorCitjb25maWcgT01BUF8zMktfVElNRVIKKwlib29sICJVc2UgMzJLSHogdGltZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgT01BUCAzMktIeiB0aW1lci4KKwkgIFRoaXMgdGltZXIgc2F2ZXMgcG93ZXIgY29tcGFyZWQgdG8gdGhlIE9NQVBfTVBVX1RJTUVSLCBhbmQgaGFzCisJICBzdXBwb3J0IGZvciBubyB0aWNrIGR1cmluZyBpZGxlLiBUaGUgMzJLSHogdGltZXIgcHJvdmlkZXMgbGVzcworCSAgaW50cmEtdGljayByZXNvbHV0aW9uIHRoYW4gT01BUF9NUFVfVElNRVIuIFRoZSAzMktIeiB0aW1lciBpcworCSAgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBPTUFQLTE2eHguCisKK2VuZGNob2ljZQorCitjb25maWcgT01BUF8zMktfVElNRVJfSFoKKyAgICAgICBpbnQgIktlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgZm9yIDMyS0h6IHRpbWVyIgorICAgICAgIHJhbmdlIDMyIDEwMjQKKyAgICAgICBkZXBlbmRzIG9uIE9NQVBfMzJLX1RJTUVSCisgICAgICAgZGVmYXVsdCAiMTI4IgorICAgICAgIGhlbHAKKwkgIEtlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgc2hvdWxkIGJlIGEgZGl2aXNvciBvZiAzMjc2OCwKKwkgIHN1Y2ggYXMgNjQgb3IgMTI4LgorCitjaG9pY2UKKwlwcm9tcHQgIkxvdy1sZXZlbCBkZWJ1ZyBjb25zb2xlIFVBUlQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAKKwlkZWZhdWx0IE9NQVBfTExfREVCVUdfVUFSVDEKKworY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDEKKwlib29sICJVQVJUMSIKKworY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDIKKwlib29sICJVQVJUMiIKKworY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDMKKwlib29sICJVQVJUMyIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBPTUFQX0FSTV8xOTVNSFoKKwlib29sICJPTUFQIEFSTSAxOTUgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDczMAorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMTk1TUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzE5Mk1IWgorCWJvb2wgIk9NQVAgQVJNIDE5MiBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMTkyTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzE4Mk1IWgorCWJvb2wgIk9NQVAgQVJNIDE4MiBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQNzMwCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxODJNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTY4TUhaCisJYm9vbCAiT01BUCBBUk0gMTY4IE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxNjhNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTIwTUhaCisJYm9vbCAiT01BUCBBUk0gMTIwIE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxMjBNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fNjBNSFoKKwlib29sICJPTUFQIEFSTSA2MCBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMAorICAgICAgICBkZWZhdWx0IHkKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDYwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE9NQVBfQVJNXzMwTUhaCisJYm9vbCAiT01BUCBBUk0gMzAgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzAKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDMwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYWZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvTWFrZWZpbGUKQEAgLTAsMCArMSw0MCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBDb21tb24gc3VwcG9ydAorb2JqLXkgOj0gY29tbW9uLm8gdGltZS5vIGlycS5vIGRtYS5vIGNsb2NrLm8gbXV4Lm8gZ3Bpby5vIG1jYnNwLm8gdXNiLm8KK29iai1tIDo9CitvYmotbiA6PQorb2JqLSAgOj0KK2xlZC15IDo9IGxlZHMubworCisjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKK29iai0kKENPTkZJR19NQUNIX09NQVBfSDIpICs9IGJvYXJkLWgyLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKSArPSBib2FyZC1pbm5vdmF0b3Iubworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9HRU5FUklDKSArPSBib2FyZC1nZW5lcmljLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIpICs9IGJvYXJkLXBlcnNldXMyLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfT1NLKSArPSBib2FyZC1vc2subworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9IMykgKz0gYm9hcmQtaDMubworb2JqLSQoQ09ORklHX01BQ0hfVk9JQ0VCTFVFKSArPSBib2FyZC12b2ljZWJsdWUubworb2JqLSQoQ09ORklHX01BQ0hfTkVUU1RBUikgKz0gYm9hcmQtbmV0c3Rhci5vCisKKyMgT0NQSSBpbnRlcmNvbm5lY3Qgc3VwcG9ydCBmb3IgMTcxMCwgMTYxMCBhbmQgNTkxMgorb2JqLSQoQ09ORklHX0FSQ0hfT01BUDE2WFgpICs9IG9jcGkubworCisjIExFRHMgc3VwcG9ydAorbGVkLSQoQ09ORklHX01BQ0hfT01BUF9IMikgKz0gbGVkcy1oMnAyLWRlYnVnLm8KK2xlZC0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKSArPSBsZWRzLWlubm92YXRvci5vCitsZWQtJChDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyKSArPSBsZWRzLWgycDItZGVidWcubworb2JqLSQoQ09ORklHX0xFRFMpICs9ICQobGVkLXkpCisKKyMgUG93ZXIgTWFuYWdlbWVudAorb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vIHNsZWVwLm8KKworaWZlcSAoJChDT05GSUdfQVJDSF9PTUFQMTUxMCkseSkKKyMgSW5ub3ZhdG9yLTE1MTAgRlBHQQorb2JqLSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICs9IGZwZ2EubworZW5kaWYKKworIyBrZ2RiIHN1cHBvcnQKK29iai0kKENPTkZJR19LR0RCX1NFUklBTCkJKz0ga2dkYi1zZXJpYWwubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLW9tYXAvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWUxYTZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSw0IEBACisgICB6cmVsYWRkci15CQk6PSAweDEwMDA4MDAwCitwYXJhbXNfcGh5cy15CQk6PSAweDEwMDAwMTAwCitpbml0cmRfcGh5cy15CQk6PSAweDEwODAwMDAwCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDJhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jCisgKgorICogTW9kaWZpZWQgZnJvbSBib2FyZC1pbm5vdmF0b3IxNTEwLmMKKyAqCisgKiBDb2RlIGZvciBnZW5lcmljIE9NQVAgYm9hcmQuIFNob3VsZCB3b3JrIG9uIG1hbnkgT01BUCBzeXN0ZW1zIHdoZXJlCisgKiB0aGUgZGV2aWNlIGRyaXZlcnMgdGFrZSBjYXJlIG9mIGFsbCB0aGUgbmVjZXNzYXJ5IGhhcmR3YXJlIGluaXRpYWxpemF0aW9uLgorICogRG8gbm90IHB1dCBhbnkgYm9hcmQgc3BlY2lmaWMgY29kZSB0byB0aGlzIGZpbGU7IGNyZWF0ZSBhIG5ldyBtYWNoaW5lCisgKiB0eXBlIGlmIHlvdSBuZWVkIGN1c3RvbSBsb3ctbGV2ZWwgaW5pdGlhbGl6YXRpb25zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIGludCBfX2luaXRkYXRhIGdlbmVyaWNfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0X2lycSh2b2lkKQoreworCW9tYXBfaW5pdF9pcnEoKTsKK30KKworLyogYXNzdW1lIG5vIE1pbmktQUIgcG9ydCAqLworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGdlbmVyaWMxNTEwX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkucmVnaXN0ZXJfaG9zdAk9IDEsCisJLnJlZ2lzdGVyX2Rldgk9IDEsCisJLmhtY19tb2RlCT0gMTYsCisJLnBpbnNbMF0JPSAzLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKK3N0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGdlbmVyaWMxNjEwX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkucmVnaXN0ZXJfaG9zdAk9IDEsCisJLnJlZ2lzdGVyX2Rldgk9IDEsCisJLmhtY19tb2RlCT0gMTYsCisJLnBpbnNbMF0JPSA2LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBnZW5lcmljX2NvbmZpZ1tdID0geworCXsgT01BUF9UQUdfVVNCLCAgICAgICAgICAgTlVMTCB9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0KHZvaWQpCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHNlcmlhbCBwb3J0cyBhcmUgbXV4ZWQgb24gYXQgdGhpcyBwb2ludC4KKwkgKiBZb3UgaGF2ZSB0byBtdXggdGhlbSBvZmYgaW4gZGV2aWNlIGRyaXZlcnMgbGF0ZXIgb24KKwkgKiBpZiBub3QgbmVlZGVkLgorCSAqLworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWdlbmVyaWNfY29uZmlnWzBdLmRhdGEgPSAmZ2VuZXJpYzE1MTBfdXNiX2NvbmZpZzsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJZ2VuZXJpY19jb25maWdbMF0uZGF0YSA9ICZnZW5lcmljMTYxMF91c2JfY29uZmlnOworCX0KKyNlbmRpZgorCW9tYXBfYm9hcmRfY29uZmlnID0gZ2VuZXJpY19jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoZ2VuZXJpY19jb25maWcpOworCW9tYXBfc2VyaWFsX2luaXQoZ2VuZXJpY19zZXJpYWxfcG9ydHMpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9nZW5lcmljX21hcF9pbyh2b2lkKQoreworCW9tYXBfbWFwX2lvKCk7Cit9CisKK01BQ0hJTkVfU1RBUlQoT01BUF9HRU5FUklDLCAiR2VuZXJpYyBPTUFQMTUxMC8xNjEwLzE3MTAiKQorCU1BSU5UQUlORVIoIlRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+IikKKwlCT09UX01FTSgweDEwMDAwMDAwLCAweGZmZjAwMDAwLCAweGZlZjAwMDAwKQorCUJPT1RfUEFSQU1TKDB4MTAwMDAxMDApCisJTUFQSU8ob21hcF9nZW5lcmljX21hcF9pbykKKwlJTklUSVJRKG9tYXBfZ2VuZXJpY19pbml0X2lycSkKKwlJTklUX01BQ0hJTkUob21hcF9nZW5lcmljX2luaXQpCisJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwNjc4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMi5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMKKyAqCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0cyBmb3IgT01BUC0xNjEwIEgyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCisgKiBBdXRob3I6IEdyZWcgTG9ubm9uIDxnbG9ubm9uQHJpZGdlcnVuLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFNlcGFyYXRlZCBGUEdBIGludGVycnVwdHMgZnJvbSBpbm5vdmF0b3IxNTEwLmMgYW5kIGNsZWFuZWQgdXAgZm9yIDIuNgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIGJ5IFRvbnkgTGluZHJnZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKgorICogSDIgc3BlY2lmaWMgY2hhbmdlcyBhbmQgY2xlYW51cAorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIGJ5IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaDJfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGgyX3BhcnRpdGlvbnNbXSA9IHsKKwkvKiBib290bG9hZGVyIChVLUJvb3QsIGV0YykgaW4gZmlyc3Qgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJib290bG9hZGVyIiwKKwkgICAgICAub2Zmc2V0CQk9IDAsCisJICAgICAgLnNpemUJCT0gU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJLyogYm9vdGxvYWRlciBwYXJhbXMgaW4gdGhlIG5leHQgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJwYXJhbXMiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwLAorCX0sCisJLyoga2VybmVsICovCisJeworCSAgICAgIC5uYW1lCQk9ICJrZXJuZWwiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzJNLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAorCX0sCisJLyogZmlsZSBzeXN0ZW0gKi8KKwl7CisJICAgICAgLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGgyX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDIsCisJLnBhcnRzCQk9IGgyX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShoMl9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDJfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IE9NQVBfQ1MyQl9QSFlTLAorCS5lbmQJCT0gT01BUF9DUzJCX1BIWVMgKyBPTUFQX0NTMkJfU0laRSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaDJfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZoMl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZoMl9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDJfc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gT01BUDE2MTBfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCisJCS5lbmQJPSBPTUFQMTYxMF9FVEhSX1NUQVJUICsgMHhmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSgwKSwKKwkJLmVuZAk9IE9NQVBfR1BJT19JUlEoMCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoMl9zbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoMl9zbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoMl9zbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmgyX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZoMl9mbGFzaF9kZXZpY2UsCisJJmgyX3NtYzkxeF9kZXZpY2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaDJfaW5pdF9zbWM5MXgodm9pZCkKK3sKKwlpZiAoKG9tYXBfcmVxdWVzdF9ncGlvKDApKSA8IDApIHsKKwkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7CisJCXJldHVybjsKKwl9CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Cit9CisKK3ZvaWQgaDJfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKKwloMl9pbml0X3NtYzkxeCgpOworfQorCitzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBoMl91c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLyogdXNiMSBoYXMgYSBNaW5pLUFCIHBvcnQgYW5kIGV4dGVybmFsIGlzcDEzMDEgdHJhbnNjZWl2ZXIgKi8KKwkub3RnCQk9IDIsCisKKyNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCisJLmhtY19tb2RlCT0gMTksCS8vIDA6aG9zdChvZmYpIDE6ZGV2fG90ZyAyOmRpc2FibGVkCisJLy8gLmhtY19tb2RlCT0gMjEsCS8vIDA6aG9zdChvZmYpIDE6ZGV2KGxvb3BiYWNrKSAyOmhvc3QobG9vcGJhY2spCisjZWxpZglkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCisJLyogbmVlZHMgT1RHIGNhYmxlLCBvciBOT05TVEFOREFSRCAoQi10by1NaW5pQikgKi8KKwkuaG1jX21vZGUJPSAyMCwJLy8gMTpkZXZ8b3RnKG9mZikgMTpob3N0IDI6ZGlzYWJsZWQKKyNlbmRpZgorCisJLnBpbnNbMV0JPSAzLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgaDJfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5tbWNfYmxvY2tzCQk9IDEsCisJLm1tYzFfcG93ZXJfcGluCQk9IC0xLAkvKiB0cHM2NTAxMCBncGlvMyAqLworCS5tbWMxX3N3aXRjaF9waW4JPSBPTUFQX01QVUlPKDEpLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDJfY29uZmlnW10gPSB7CisJeyBPTUFQX1RBR19VU0IsICAgICAgICAgICAmaDJfdXNiX2NvbmZpZyB9LAorCXsgT01BUF9UQUdfTU1DLCAgICAgICAgICAgJmgyX21tY19jb25maWcgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoMl9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoaDJfZGV2aWNlcywgQVJSQVlfU0laRShoMl9kZXZpY2VzKSk7CisJb21hcF9ib2FyZF9jb25maWcgPSBoMl9jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoaDJfY29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGgyX21hcF9pbyh2b2lkKQoreworCW9tYXBfbWFwX2lvKCk7CisJb21hcF9zZXJpYWxfaW5pdChoMl9zZXJpYWxfcG9ydHMpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVBfSDIsICJUSS1IMiIpCisJTUFJTlRBSU5FUigiSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPiIpCisJQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKKwlCT09UX1BBUkFNUygweDEwMDAwMTAwKQorCU1BUElPKGgyX21hcF9pbykKKwlJTklUSVJRKGgyX2luaXRfaXJxKQorCUlOSVRfTUFDSElORShoMl9pbml0KQorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDMuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NmE1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDMuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMy5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIE9NQVAxNzEwIEgzIHNwZWNpZmljIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCisgKiBBdXRob3I6IFJpZGdlUnVuLCBJbmMuCisgKiAgICAgICAgIEdyZWcgTG9ubm9uIChnbG9ubm9uQHJpZGdlcnVuLmNvbSkgb3IgaW5mb0ByaWRnZXJ1bi5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGgzX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMSwgMX07CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBoM19wYXJ0aXRpb25zW10gPSB7CisJLyogYm9vdGxvYWRlciAoVS1Cb290LCBldGMpIGluIGZpcnN0IHNlY3RvciAqLworCXsKKwkgICAgICAubmFtZQkJPSAiYm9vdGxvYWRlciIsCisJICAgICAgLm9mZnNldAkJPSAwLAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCS8qIGJvb3Rsb2FkZXIgcGFyYW1zIGluIHRoZSBuZXh0IHNlY3RvciAqLworCXsKKwkgICAgICAubmFtZQkJPSAicGFyYW1zIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMCwKKwl9LAorCS8qIGtlcm5lbCAqLworCXsKKwkgICAgICAubmFtZQkJPSAia2VybmVsIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBTWl8yTSwKKwkgICAgICAubWFza19mbGFncwk9IDAKKwl9LAorCS8qIGZpbGUgc3lzdGVtICovCisJeworCSAgICAgIC5uYW1lCQk9ICJmaWxlc3lzdGVtIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBoM19mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJPSAyLAorCS5wYXJ0cwkJPSBoM19wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoaDNfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGgzX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSBPTUFQX0NTMkJfUEhZUywKKwkuZW5kCQk9IE9NQVBfQ1MyQl9QSFlTICsgT01BUF9DUzJCX1NJWkUgLSAxLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGZsYXNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcGZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmaDNfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmaDNfZmxhc2hfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IE9NQVAxNzEwX0VUSFJfU1RBUlQsCQkvKiBQaHlzaWNhbCAqLworCQkuZW5kCT0gT01BUDE3MTBfRVRIUl9TVEFSVCArIDB4ZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IE9NQVBfR1BJT19JUlEoNDApLAorCQkuZW5kCT0gT01BUF9HUElPX0lSUSg0MCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAorfTsKKworI2RlZmluZSBHUFRJTUVSX0JBU0UJCTB4RkZGQjE0MDAKKyNkZWZpbmUgR1BUSU1FUl9SRUdTKHgpCSgweEZGRkIxNDAwICsgKHggKiAweDgwMCkpCisjZGVmaW5lIEdQVElNRVJfUkVHU19TSVpFCTB4NDYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbnRsYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gR1BUSU1FUl9SRUdTKDApLAkgICAgICAvKiBQaHlzaWNhbCAqLworCQkuZW5kICAgID0gR1BUSU1FUl9SRUdTKDApICsgR1BUSU1FUl9SRUdTX1NJWkUsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IElOVF8xNjEwX0dQVElNRVIxLAorCQkuZW5kICAgID0gSU5UXzE2MTBfR1BUSU1FUjEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW50bGF0X2RldmljZSA9IHsKKwkubmFtZQkgICA9ICJvbWFwX2ludGxhdCIsCisJLmlkCSAgICAgPSAwLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW50bGF0X3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gaW50bGF0X3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZmxhc2hfZGV2aWNlLAorICAgICAgICAmc21jOTF4X2RldmljZSwKKwkmaW50bGF0X2RldmljZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGgzX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkvKiB1c2IxIGhhcyBhIE1pbmktQUIgcG9ydCBhbmQgZXh0ZXJuYWwgaXNwMTMwMSB0cmFuc2NlaXZlciAqLworCS5vdGcJICAgID0gMiwKKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX09NQVAKKwkuaG1jX21vZGUgICAgICAgPSAxOSwgICAvKiAwOmhvc3Qob2ZmKSAxOmRldnxvdGcgMjpkaXNhYmxlZCAqLworI2VsaWYgIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKKwkvKiBOT05TVEFOREFSRCBDQUJMRSBORUVERUQgKEItdG8tTWluaS1CKSAqLworCS5obWNfbW9kZSAgICAgICA9IDIwLCAgIC8qIDE6ZGV2fG90ZyhvZmYpIDE6aG9zdCAyOmRpc2FibGVkICovCisjZW5kaWYKKworCS5waW5zWzFdCT0gMywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGgzX2NvbmZpZ1tdID0geworCXsgT01BUF9UQUdfVVNCLAkgJmgzX3VzYl9jb25maWcgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0KHZvaWQpCit7CisJKHZvaWQpIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaDNfaW5pdF9zbWM5MXgodm9pZCkKK3sKKwlvbWFwX2NmZ19yZWcoVzE1XzE3MTBfR1BJTzQwKTsKKwlpZiAob21hcF9yZXF1ZXN0X2dwaW8oNDApIDwgMCkgeworCQlwcmludGsoIkVycm9yIHJlcXVlc3RpbmcgZ3BpbyA0MCBmb3Igc21jOTF4IGlycVxuIik7CisJCXJldHVybjsKKwl9CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoNDAsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworfQorCit2b2lkIGgzX2luaXRfaXJxKHZvaWQpCit7CisJb21hcF9pbml0X2lycSgpOworCW9tYXBfZ3Bpb19pbml0KCk7CisJaDNfaW5pdF9zbWM5MXgoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGgzX21hcF9pbyh2b2lkKQoreworCW9tYXBfbWFwX2lvKCk7CisJb21hcF9zZXJpYWxfaW5pdChoM19zZXJpYWxfcG9ydHMpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVBfSDMsICJUSSBPTUFQMTcxMCBIMyBib2FyZCIpCisJTUFJTlRBSU5FUigiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4iKQorCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCisJQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKKwlNQVBJTyhoM19tYXBfaW8pCisJSU5JVElSUShoM19pbml0X2lycSkKKwlJTklUX01BQ0hJTkUoaDNfaW5pdCkKKwkudGltZXIJCT0gJm9tYXBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWlubm92YXRvci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWlubm92YXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2Y0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMKKyAqCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0cyBmb3IgT01BUC0xNTEwIGFuZCBPTUFQLTE2MTAgSW5ub3ZhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCisgKiBBdXRob3I6IEdyZWcgTG9ubm9uIDxnbG9ubm9uQHJpZGdlcnVuLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFNlcGFyYXRlZCBGUEdBIGludGVycnVwdHMgZnJvbSBpbm5vdmF0b3IxNTEwLmMgYW5kIGNsZWFuZWQgdXAgZm9yIDIuNgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIGJ5IFRvbnkgTGluZHJnZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbm5vdmF0b3Jfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGlubm92YXRvcl9wYXJ0aXRpb25zW10gPSB7CisJLyogYm9vdGxvYWRlciAoVS1Cb290LCBldGMpIGluIGZpcnN0IHNlY3RvciAqLworCXsKKwkgICAgICAubmFtZQkJPSAiYm9vdGxvYWRlciIsCisJICAgICAgLm9mZnNldAkJPSAwLAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCS8qIGJvb3Rsb2FkZXIgcGFyYW1zIGluIHRoZSBuZXh0IHNlY3RvciAqLworCXsKKwkgICAgICAubmFtZQkJPSAicGFyYW1zIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMCwKKwl9LAorCS8qIGtlcm5lbCAqLworCXsKKwkgICAgICAubmFtZQkJPSAia2VybmVsIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBTWl8yTSwKKwkgICAgICAubWFza19mbGFncwk9IDAKKwl9LAorCS8qIHJlc3Qgb2YgZmxhc2gxIGlzIGEgZmlsZSBzeXN0ZW0gKi8KKwl7CisJICAgICAgLm5hbWUJCT0gInJvb3RmcyIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gU1pfMTZNIC0gU1pfMk0gLSAyICogU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IDAKKwl9LAorCS8qIGZpbGUgc3lzdGVtICovCisJeworCSAgICAgIC5uYW1lCQk9ICJmaWxlc3lzdGVtIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBpbm5vdmF0b3JfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkud2lkdGgJCT0gMiwKKwkucGFydHMJCT0gaW5ub3ZhdG9yX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShpbm5vdmF0b3JfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlubm92YXRvcl9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gT01BUF9DUzBfUEhZUywKKwkuZW5kCQk9IE9NQVBfQ1MwX1BIWVMgKyBTWl8zMk0gLSAxLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlubm92YXRvcl9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXBmbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmlubm92YXRvcl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZpbm5vdmF0b3JfZmxhc2hfcmVzb3VyY2UsCit9OworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKworLyogT25seSBGUEdBIG5lZWRzIHRvIGJlIG1hcHBlZCBoZXJlLiBBbGwgb3RoZXJzIGFyZSBkb25lIHdpdGggaW9yZW1hcCAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbm5vdmF0b3IxNTEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworeyBPTUFQMTUxMF9GUEdBX0JBU0UsIE9NQVAxNTEwX0ZQR0FfU1RBUlQsIE9NQVAxNTEwX0ZQR0FfU0laRSwKKwlNVF9ERVZJQ0UgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW5ub3ZhdG9yMTUxMF9zbWM5MXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBPTUFQMTUxMF9GUEdBX0VUSFJfU1RBUlQsCS8qIFBoeXNpY2FsICovCisJCS5lbmQJPSBPTUFQMTUxMF9GUEdBX0VUSFJfU1RBUlQgKyAweGYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBPTUFQMTUxMF9JTlRfRVRIRVIsCisJCS5lbmQJPSBPTUFQMTUxMF9JTlRfRVRIRVIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbm5vdmF0b3IxNTEwX3NtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGlubm92YXRvcjE1MTBfc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gaW5ub3ZhdG9yMTUxMF9zbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlubm92YXRvcjE1MTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmlubm92YXRvcl9mbGFzaF9kZXZpY2UsCisJJmlubm92YXRvcjE1MTBfc21jOTF4X2RldmljZSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQMTUxMCAqLworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbm5vdmF0b3IxNjEwX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IElOTk9WQVRPUjE2MTBfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCisJCS5lbmQJPSBJTk5PVkFUT1IxNjEwX0VUSFJfU1RBUlQgKyAweGYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBPTUFQX0dQSU9fSVJRKDApLAorCQkuZW5kCT0gT01BUF9HUElPX0lSUSgwKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlubm92YXRvcjE2MTBfc21jOTF4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic21jOTF4IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTYxMF9zbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBpbm5vdmF0b3IxNjEwX3NtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaW5ub3ZhdG9yMTYxMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaW5ub3ZhdG9yX2ZsYXNoX2RldmljZSwKKwkmaW5ub3ZhdG9yMTYxMF9zbWM5MXhfZGV2aWNlLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNlhYICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfaW5pdF9zbWM5MXgodm9pZCkKK3sKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJZnBnYV93cml0ZShmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SU1QpICYgfjEsCisJCQkgICBPTUFQMTUxMF9GUEdBX1JTVCk7CisJCXVkZWxheSg3NTApOworCX0gZWxzZSB7CisJCWlmICgob21hcF9yZXF1ZXN0X2dwaW8oMCkpIDwgMCkgeworCQkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMCwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKKwl9Cit9CisKK3ZvaWQgaW5ub3ZhdG9yX2luaXRfaXJxKHZvaWQpCit7CisJb21hcF9pbml0X2lycSgpOworCW9tYXBfZ3Bpb19pbml0KCk7CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJb21hcDE1MTBfZnBnYV9pbml0X2lycSgpOworCX0KKyNlbmRpZgorCWlubm92YXRvcl9pbml0X3NtYzkxeCgpOworfQorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGlubm92YXRvcjE1MTBfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS8qIGZvciBidW5kbGVkIG5vbi1zdGFuZGFyZCBob3N0IGFuZCBwZXJpcGhlcmFsIGNhYmxlcyAqLworCS5obWNfbW9kZQk9IDQsCisKKwkucmVnaXN0ZXJfaG9zdAk9IDEsCisJLnBpbnNbMV0JPSA2LAorCS5waW5zWzJdCT0gNiwJCS8qIENvbmZsaWN0cyB3aXRoIFVBUlQyICovCisKKwkucmVnaXN0ZXJfZGV2CT0gMSwKKwkucGluc1swXQk9IDIsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgaDJfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS8qIHVzYjEgaGFzIGEgTWluaS1BQiBwb3J0IGFuZCBleHRlcm5hbCBpc3AxMzAxIHRyYW5zY2VpdmVyICovCisJLm90ZwkJPSAyLAorCisjaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfT01BUAorCS5obWNfbW9kZQk9IDE5LAkvLyAwOmhvc3Qob2ZmKSAxOmRldnxvdGcgMjpkaXNhYmxlZAorCS8vIC5obWNfbW9kZQk9IDIxLAkvLyAwOmhvc3Qob2ZmKSAxOmRldihsb29wYmFjaykgMjpob3N0KGxvb3BiYWNrKQorI2VsaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorCS8qIE5PTlNUQU5EQVJEIENBQkxFIE5FRURFRCAoQi10by1NaW5pLUIpICovCisJLmhtY19tb2RlCT0gMjAsCS8vIDE6ZGV2fG90ZyhvZmYpIDE6aG9zdCAyOmRpc2FibGVkCisjZW5kaWYKKworCS5waW5zWzFdCT0gMywKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaW5ub3ZhdG9yX2NvbmZpZ1tdID0geworCXsgT01BUF9UQUdfVVNCLCAgICAgICAgIE5VTEwgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGlubm92YXRvcjE1MTBfZGV2aWNlcywgQVJSQVlfU0laRShpbm5vdmF0b3IxNTEwX2RldmljZXMpKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJcGxhdGZvcm1fYWRkX2RldmljZXMoaW5ub3ZhdG9yMTYxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKGlubm92YXRvcjE2MTBfZGV2aWNlcykpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCisJCWlubm92YXRvcl9jb25maWdbMF0uZGF0YSA9ICZpbm5vdmF0b3IxNTEwX3VzYl9jb25maWc7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorCWlmIChjcHVfaXNfb21hcDE2MTAoKSkKKwkJaW5ub3ZhdG9yX2NvbmZpZ1swXS5kYXRhID0gJmgyX3VzYl9jb25maWc7CisjZW5kaWYKKwlvbWFwX2JvYXJkX2NvbmZpZyA9IGlubm92YXRvcl9jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoaW5ub3ZhdG9yX2NvbmZpZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfbWFwX2lvKHZvaWQpCit7CisJb21hcF9tYXBfaW8oKTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWlvdGFibGVfaW5pdChpbm5vdmF0b3IxNTEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTUxMF9pb19kZXNjKSk7CisJCXVkZWxheSgxMCk7CS8qIERlbGF5IG5lZWRlZCBmb3IgRlBHQSAqLworCisJCS8qIER1bXAgdGhlIElubm92YXRvciBGUEdBIHJldiBlYXJseSAtIHVzZWZ1bCBpbmZvIGZvciBzdXBwb3J0LiAqLworCQlwcmludGsoIklubm92YXRvciBGUEdBIFJldiAlZC4lZCBCb2FyZCBSZXYgJWRcbiIsCisJCSAgICAgICBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfSElHSCksCisJCSAgICAgICBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfTE9XKSwKKwkJICAgICAgIGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX0JPQVJEX1JFVikpOworCX0KKyNlbmRpZgorCW9tYXBfc2VyaWFsX2luaXQoaW5ub3ZhdG9yX3NlcmlhbF9wb3J0cyk7Cit9CisKK01BQ0hJTkVfU1RBUlQoT01BUF9JTk5PVkFUT1IsICJUSS1Jbm5vdmF0b3IiKQorCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQorCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCisJQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKKwlNQVBJTyhpbm5vdmF0b3JfbWFwX2lvKQorCUlOSVRJUlEoaW5ub3ZhdG9yX2luaXRfaXJxKQorCUlOSVRfTUFDSElORShpbm5vdmF0b3JfaW5pdCkKKwkudGltZXIJCT0gJm9tYXBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW5ldHN0YXIuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1uZXRzdGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhY2JkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1uZXRzdGFyLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBNb2RpZmllZCBmcm9tIGJvYXJkLWdlbmVyaWMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCAyTiBUZWxla29tdW5pa2FjZSwgTGFkaXNsYXYgTWljaGwgPG1pY2hsQDJuLmN6PgorICoKKyAqIENvZGUgZm9yIE5ldHN0YXIgT01BUCBib2FyZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworZXh0ZXJuIHZvaWQgX19pbml0IG9tYXBfaW5pdF90aW1lKHZvaWQpOworZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuZXRzdGFyX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IE9NQVBfQ1MxX1BIWVMgKyAweDMwMCwKKwkJLmVuZAk9IE9NQVBfQ1MxX1BIWVMgKyAweDMwMCArIDE2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSg4KSwKKwkJLmVuZAk9IE9NQVBfR1BJT19JUlEoOCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBuZXRzdGFyX3NtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG5ldHN0YXJfc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbmV0c3Rhcl9zbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm5ldHN0YXJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm5ldHN0YXJfc21jOTF4X2RldmljZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBuZXRzdGFyX2luaXRfaXJxKHZvaWQpCit7CisJb21hcF9pbml0X2lycSgpOworCW9tYXBfZ3Bpb19pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBuZXRzdGFyX2luaXQodm9pZCkKK3sKKwkvKiBncmVlbiBMRUQgKi8KKwlvbWFwX3JlcXVlc3RfZ3Bpbyg0KTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig0LCAwKTsKKwkvKiBzbWM5MXggcmVzZXQgKi8KKwlvbWFwX3JlcXVlc3RfZ3Bpbyg3KTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig3LCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNywgMSk7CisJdWRlbGF5KDIpOwkvKiB3YWl0IGF0IGxlYXN0IDEwMG5zICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDcsIDApOworCW1kZWxheSg1MCk7CS8qIDUwbXMgdW50aWwgUEhZIHJlYWR5ICovCisJLyogc21jOTF4IGludGVycnVwdCBwaW4gKi8KKwlvbWFwX3JlcXVlc3RfZ3Bpbyg4KTsKKwlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg4LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOworCisJb21hcF9yZXF1ZXN0X2dwaW8oMTIpOworCW9tYXBfcmVxdWVzdF9ncGlvKDEzKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbygxNCk7CisJb21hcF9yZXF1ZXN0X2dwaW8oMTUpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEyLCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKKwlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxMywgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTQsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE1LCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG5ldHN0YXJfZGV2aWNlcywgQVJSQVlfU0laRShuZXRzdGFyX2RldmljZXMpKTsKKworCS8qIFN3aXRjaCBvbiBncmVlbiBMRUQgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNCwgMCk7CisJLyogU3dpdGNoIG9mZiByZWQgTEVEICovCisJb21hcF93cml0ZWIoMHgwMCwgT01BUF9MUEcxX1BNUik7CS8qIERpc2FibGUgY2xvY2sgKi8KKwlvbWFwX3dyaXRlYigweDgwLCBPTUFQX0xQRzFfTENSKTsKK30KKworc3RhdGljIGludCBfX2luaXRkYXRhIG9tYXBfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKKworc3RhdGljIHZvaWQgX19pbml0IG5ldHN0YXJfbWFwX2lvKHZvaWQpCit7CisJb21hcF9tYXBfaW8oKTsKKwlvbWFwX3NlcmlhbF9pbml0KG9tYXBfc2VyaWFsX3BvcnRzKTsKK30KKworI2RlZmluZSBNQUNISU5FX1BBTklDRUQJCTEKKyNkZWZpbmUgTUFDSElORV9SRUJPT1RJTkcJMgorI2RlZmluZSBNQUNISU5FX1JFQk9PVAkJNAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFjaGluZV9zdGF0ZTsKKworc3RhdGljIGludCBwYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJIHZvaWQgKnB0cikKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChNQUNISU5FX1BBTklDRUQsICZtYWNoaW5lX3N0YXRlKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyogU3dpdGNoIG9mZiBncmVlbiBMRUQgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNCwgMSk7CisJLyogRmxhc2ggcmVkIExFRCAqLworCW9tYXBfd3JpdGViKDB4NzgsIE9NQVBfTFBHMV9MQ1IpOworCW9tYXBfd3JpdGViKDB4MDEsIE9NQVBfTFBHMV9QTVIpOwkvKiBFbmFibGUgY2xvY2sgKi8KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5pY19ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHBhbmljX2V2ZW50LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmV0c3Rhcl9sYXRlX2luaXQodm9pZCkKK3sKKwkvKiBUT0RPOiBTZXR1cCBmcm9udCBwYW5lbCBzd2l0Y2ggaGVyZSAqLworCisJLyogU2V0dXAgcGFuaWMgbm90aWZpZXIgKi8KKwlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCXJldHVybiAwOworfQorCitwb3N0Y29yZV9pbml0Y2FsbChuZXRzdGFyX2xhdGVfaW5pdCk7CisKK01BQ0hJTkVfU1RBUlQoTkVUU1RBUiwgIk5ldFN0YXIgT01BUDU5MTAiKQorCU1BSU5UQUlORVIoIkxhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4iKQorCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCisJQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKKwlNQVBJTyhuZXRzdGFyX21hcF9pbykKKwlJTklUSVJRKG5ldHN0YXJfaW5pdF9pcnEpCisJSU5JVF9NQUNISU5FKG5ldHN0YXJfaW5pdCkKKwkudGltZXIgPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtb3NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1MWZjOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1vc2suYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1vc2suYworICoKKyAqIEJvYXJkIHNwZWNpZmljIGluaXQgZm9yIE9NQVA1OTEyIE9TSworICoKKyAqIFdyaXR0ZW4gYnkgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9zazU5MTJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Cit7IE9NQVBfT1NLX05PUl9GTEFTSF9CQVNFLCBPTUFQX09TS19OT1JfRkxBU0hfU1RBUlQsIE9NQVBfT1NLX05PUl9GTEFTSF9TSVpFLAorCU1UX0RFVklDRSB9LAorfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIG9za19zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG9zazU5MTJfc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9PU0tfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCisJCS5lbmQJPSBPTUFQX09TS19FVEhSX1NUQVJUICsgMHhmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSgwKSwKKwkJLmVuZAk9IE9NQVBfR1BJT19JUlEoMCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvc2s1OTEyX3NtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvc2s1OTEyX3NtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG9zazU5MTJfc21jOTF4X3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3NrNTkxMl9jZl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IE9NQVBfR1BJT19JUlEoNjIpLAorCQkuZW5kCT0gT01BUF9HUElPX0lSUSg2MiksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvc2s1OTEyX2NmX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcF9jZiIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gKHZvaWQgKikgMiAvKiBDUzIgKi8sCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob3NrNTkxMl9jZl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG9zazU5MTJfY2ZfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9zazU5MTJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm9zazU5MTJfc21jOTF4X2RldmljZSwKKwkmb3NrNTkxMl9jZl9kZXZpY2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfc21jOTF4KHZvaWQpCit7CisJaWYgKChvbWFwX3JlcXVlc3RfZ3BpbygwKSkgPCAwKSB7CisJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDAgZm9yIHNtYzkxeCBpcnFcbiIpOworCQlyZXR1cm47CisJfQorCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDAsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisKKwkvKiBDaGVjayBFTUlGUyB3YWl0IHN0YXRlcyB0byBmaXggZXJyb3JzIHdpdGggU01DX0dFVF9QS1RfSERSICovCisJRU1JRlNfQ0NTKDEpIHw9IDB4MjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9za19pbml0X2NmKHZvaWQpCit7CisJb21hcF9jZmdfcmVnKE03XzE2MTBfR1BJTzYyKTsKKwlpZiAoKG9tYXBfcmVxdWVzdF9ncGlvKDYyKSkgPCAwKSB7CisJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDYyIGZvciBDRiBpcnFcbiIpOworCQlyZXR1cm47CisJfQorCS8qIGl0J3MgcmVhbGx5IGFjdGl2ZS1sb3cgKi8KKwlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg2MiwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Cit9CisKK3ZvaWQgb3NrX2luaXRfaXJxKHZvaWQpCit7CisJb21hcF9pbml0X2lycSgpOworCW9tYXBfZ3Bpb19pbml0KCk7CisJb3NrX2luaXRfc21jOTF4KCk7CisJb3NrX2luaXRfY2YoKTsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgb3NrX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkvKiBoYXMgdXNiIGhvc3QgY29ubmVjdG9yIChBKSAuLi4gZm9yIGRldmVsb3BtZW50IGl0IGNhbiBhbHNvCisJICogYmUgdXNlZCwgd2l0aCBhIE5PTlNUQU5EQVJEIGdlbmRlci1iZW5kaW5nIGNhYmxlL2RvbmdsZSwgYXMKKwkgKiBhIHBlcmlwaGVyYWwuCisJICovCisjaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfT01BUAorCS5yZWdpc3Rlcl9kZXYJPSAxLAorCS5obWNfbW9kZQk9IDAsCisjZWxzZQorCS5yZWdpc3Rlcl9ob3N0CT0gMSwKKwkuaG1jX21vZGUJPSAxNiwKKwkucndjCQk9IDEsCisjZW5kaWYKKwkucGluc1swXQk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBvc2tfY29uZmlnW10gPSB7CisJeyBPTUFQX1RBR19VU0IsICAgICAgICAgICAmb3NrX3VzYl9jb25maWcgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvc2tfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG9zazU5MTJfZGV2aWNlcywgQVJSQVlfU0laRShvc2s1OTEyX2RldmljZXMpKTsKKwlvbWFwX2JvYXJkX2NvbmZpZyA9IG9za19jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUob3NrX2NvbmZpZyk7CisJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHIHw9ICgzIDw8IDEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3NrX21hcF9pbyh2b2lkKQoreworCW9tYXBfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KG9zazU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvc2s1OTEyX2lvX2Rlc2MpKTsKKwlvbWFwX3NlcmlhbF9pbml0KG9za19zZXJpYWxfcG9ydHMpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVBfT1NLLCAiVEktT1NLIikKKwlNQUlOVEFJTkVSKCJEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4iKQorCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCisJQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKKwlNQVBJTyhvc2tfbWFwX2lvKQorCUlOSVRJUlEob3NrX2luaXRfaXJxKQorCUlOSVRfTUFDSElORShvc2tfaW5pdCkKKwkudGltZXIJCT0gJm9tYXBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtcGVyc2V1czIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDUxNWFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtcGVyc2V1czIuYworICoKKyAqIE1vZGlmaWVkIGZyb20gYm9hcmQtZ2VuZXJpYy5jCisgKgorICogT3JpZ2luYWwgT01BUDczMCBzdXBwb3J0IGJ5IEplYW4gUGloZXQgPGotcGloZXRAdGkuY29tPgorICogVXBkYXRlZCBmb3IgMi42IGJ5IEtldmluIEhpbG1hbiA8a2poQGhpbG1hbi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEgyUDJfREJHX0ZQR0FfRVRIUl9TVEFSVCwJLyogUGh5c2ljYWwgKi8KKwkJLmVuZAk9IEgyUDJfREJHX0ZQR0FfRVRIUl9TVEFSVCArIDB4ZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElOVF83MzBfTVBVX0VYVF9OSVJRLAorCQkuZW5kCT0gMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwMl9zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDEsIDB9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcDJfcGFydGl0aW9uc1tdID0geworCS8qIGJvb3Rsb2FkZXIgKFUtQm9vdCwgZXRjKSBpbiBmaXJzdCBzZWN0b3IgKi8KKwl7CisJICAgICAgLm5hbWUJCT0gImJvb3Rsb2FkZXIiLAorCSAgICAgIC5vZmZzZXQJCT0gMCwKKwkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwgLyogZm9yY2UgcmVhZC1vbmx5ICovCisJfSwKKwkvKiBib290bG9hZGVyIHBhcmFtcyBpbiB0aGUgbmV4dCBzZWN0b3IgKi8KKwl7CisJICAgICAgLm5hbWUJCT0gInBhcmFtcyIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IDAsCisJfSwKKwkvKiBrZXJuZWwgKi8KKwl7CisJICAgICAgLm5hbWUJCT0gImtlcm5lbCIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gU1pfMk0sCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfSwKKwkvKiByZXN0IG9mIGZsYXNoIGlzIGEgZmlsZSBzeXN0ZW0gKi8KKwl7CisJICAgICAgLm5hbWUJCT0gInJvb3RmcyIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKKwkgICAgICAubWFza19mbGFncwk9IDAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIHAyX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDIsCisJLnBhcnRzCQk9IHAyX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShwMl9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcDJfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IE9NQVBfRkxBU0hfMF9TVEFSVCwKKwkuZW5kCQk9IE9NQVBfRkxBU0hfMF9TVEFSVCArIE9NQVBfRkxBU0hfMF9TSVpFIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwMl9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXBmbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnAyX2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJnAyX2ZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic21jOTF4IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc21jOTF4X3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmcDJfZmxhc2hfZGV2aWNlLAorCSZzbWM5MXhfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGVyc2V1czJfaW5pdCh2b2lkKQoreworCSh2b2lkKSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBlcnNldXMyX2luaXRfc21jOTF4KHZvaWQpCit7CisJZnBnYV93cml0ZSgxLCBIMlAyX0RCR19GUEdBX0xBTl9SRVNFVCk7CisJbWRlbGF5KDUwKTsKKwlmcGdhX3dyaXRlKGZwZ2FfcmVhZChIMlAyX0RCR19GUEdBX0xBTl9SRVNFVCkgJiB+MSwKKwkJICAgSDJQMl9EQkdfRlBHQV9MQU5fUkVTRVQpOworCW1kZWxheSg1MCk7Cit9CisKK3ZvaWQgb21hcF9wZXJzZXVzMl9pbml0X2lycSh2b2lkKQoreworCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwX2dwaW9faW5pdCgpOworCXBlcnNldXMyX2luaXRfc21jOTF4KCk7Cit9CisKKy8qIE9ubHkgRlBHQSBuZWVkcyB0byBiZSBtYXBwZWQgaGVyZS4gQWxsIG90aGVycyBhcmUgZG9uZSB3aXRoIGlvcmVtYXAgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcF9wZXJzZXVzMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7SDJQMl9EQkdfRlBHQV9CQVNFLCBIMlAyX0RCR19GUEdBX1NUQVJULCBIMlAyX0RCR19GUEdBX1NJWkUsCisJIE1UX0RFVklDRX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9tYXBfaW8odm9pZCkKK3sKKwlvbWFwX21hcF9pbygpOworCWlvdGFibGVfaW5pdChvbWFwX3BlcnNldXMyX2lvX2Rlc2MsCisJCSAgICAgQVJSQVlfU0laRShvbWFwX3BlcnNldXMyX2lvX2Rlc2MpKTsKKworCS8qIEVhcmx5LCBib2FyZC1kZXBlbmRlbnQgaW5pdCAqLworCisJLyoKKwkgKiBIb2xkIEdTTSBSZXNldCB1bnRpbCBuZWVkZWQKKwkgKi8KKwlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KE9NQVA3MzBfRFNQX01fQ1RMKSAmIH4xLCBPTUFQNzMwX0RTUF9NX0NUTCk7CisKKwkvKgorCSAqIFVBUlRzIC0+IGRvbmUgYXV0b21hZ2ljYWxseSBieSA4MjUwIGRyaXZlcgorCSAqLworCisJLyoKKwkgKiBDU3ggdGltaW5ncywgR1BJTyBNdXggLi4uIHNldHVwCisJICovCisKKwkvKiBGbGFzaDogQ1MwIHRpbWluZ3Mgc2V0dXAgKi8KKwlvbWFwX3dyaXRlbCgweDAwMDBmZmYzLCBPTUFQNzMwX0ZMQVNIX0NGR18wKTsKKwlvbWFwX3dyaXRlbCgweDAwMDAwMDg4LCBPTUFQNzMwX0ZMQVNIX0FDRkdfMCk7CisKKwkvKgorCSAqIEV0aGVybmV0IHN1cHBvcnQgdHJvdWdoIHRoZSBkZWJ1ZyBib2FyZAorCSAqIENTMSB0aW1pbmdzIHNldHVwCisJICovCisJb21hcF93cml0ZWwoMHgwMDAwZmZmMywgT01BUDczMF9GTEFTSF9DRkdfMSk7CisJb21hcF93cml0ZWwoMHgwMDAwMDAwMCwgT01BUDczMF9GTEFTSF9BQ0ZHXzEpOworCisJLyoKKwkgKiBDb25maWd1cmUgTVBVX0VYVF9OSVJRIElPIGluIElPX0NPTkY5IHJlZ2lzdGVyLAorCSAqIEl0IGlzIHVzZWQgYXMgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIgaW50ZXJydXB0CisJICovCisJb21hcF93cml0ZWwob21hcF9yZWFkbChPTUFQNzMwX0lPX0NPTkZfOSkgJiAweDFGRkZGRkZGLCBPTUFQNzMwX0lPX0NPTkZfOSk7CisJb21hcF9zZXJpYWxfaW5pdChwMl9zZXJpYWxfcG9ydHMpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVBfUEVSU0VVUzIsICJPTUFQNzMwIFBlcnNldXMyIikKKwlNQUlOVEFJTkVSKCJLZXZpbiBIaWxtYW4gPGtqaEBoaWxtYW4ub3JnPiIpCisJQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKKwlCT09UX1BBUkFNUygweDEwMDAwMTAwKQorCU1BUElPKG9tYXBfcGVyc2V1czJfbWFwX2lvKQorCUlOSVRJUlEob21hcF9wZXJzZXVzMl9pbml0X2lycSkKKwlJTklUX01BQ0hJTkUob21hcF9wZXJzZXVzMl9pbml0KQorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhNWJmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuYworICoKKyAqIE1vZGlmaWVkIGZyb20gYm9hcmQtZ2VuZXJpYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IDJOIFRlbGVrb211bmlrYWNlLCBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+CisgKgorICogQ29kZSBmb3IgT01BUDU5MTAgYmFzZWQgVm9pY2VCbHVlIGJvYXJkIChWb0lQIHRvIEdTTSBnYXRld2F5KS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitleHRlcm4gdm9pZCBvbWFwX2luaXRfdGltZSh2b2lkKTsKK2V4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdm9pY2VibHVlX3BvcnRzW10gPSB7CisJeworCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKShPTUFQX0NTMV9QSFlTICsgMHg0MDAwMCksCisJCS5pcnEJCT0gT01BUF9HUElPX0lSUSgxMiksCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAxLAorCQkudWFydGNsawk9IDM2ODY0MDAsCisJfSwKKwl7CisJCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpKE9NQVBfQ1MxX1BIWVMgKyAweDUwMDAwKSwKKwkJLmlycQkJPSBPTUFQX0dQSU9fSVJRKDEzKSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVAsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDEsCisJCS51YXJ0Y2xrCT0gMzY4NjQwMCwKKwl9LAorCXsKKwkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZykoT01BUF9DUzFfUEhZUyArIDB4NjAwMDApLAorCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMTQpLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMSwKKwkJLnVhcnRjbGsJPSAzNjg2NDAwLAorCX0sCisJeworCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKShPTUFQX0NTMV9QSFlTICsgMHg3MDAwMCksCisJCS5pcnEJCT0gT01BUF9HUElPX0lSUSgxNSksCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAxLAorCQkudWFydGNsawk9IDM2ODY0MDAsCisJfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSAxLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSB2b2ljZWJsdWVfcG9ydHMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV4dF91YXJ0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKK30KK2FyY2hfaW5pdGNhbGwoZXh0X3VhcnRfaW5pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugdm9pY2VibHVlX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IE9NQVBfQ1MyX1BIWVMgKyAweDMwMCwKKwkJLmVuZAk9IE9NQVBfQ1MyX1BIWVMgKyAweDMwMCArIDE2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSg4KSwKKwkJLmVuZAk9IE9NQVBfR1BJT19JUlEoOCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2b2ljZWJsdWVfc21jOTF4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic21jOTF4IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodm9pY2VibHVlX3NtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHZvaWNlYmx1ZV9zbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnZvaWNlYmx1ZV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmdm9pY2VibHVlX3NtYzkxeF9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyB2b2ljZWJsdWVfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5obWNfbW9kZQk9IDMsCisJLnJlZ2lzdGVyX2hvc3QJPSAxLAorCS5yZWdpc3Rlcl9kZXYgICA9IDEsCisJLnBpbnNbMF0JPSAyLAorCS5waW5zWzFdCT0gNiwKKwkucGluc1syXQk9IDYsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCB2b2ljZWJsdWVfY29uZmlnW10gPSB7CisJeyBPTUFQX1RBR19VU0IsICZ2b2ljZWJsdWVfdXNiX2NvbmZpZyB9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9pbml0X2lycSh2b2lkKQoreworCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwX2dwaW9faW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdm9pY2VibHVlX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBpcyBhIGdvb2QgY2hhbmNlIGJvYXJkIGlzIGdvaW5nIHVwLCBzbyBlbmFibGUgUG93ZXIgTEVECisJICogKGl0IGlzIGNvbm5lY3RlZCB0aHJvdWdoIGludmVydG9yKSAqLworCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfTFBHMV9MQ1IpOworCS8qIFdhdGNoZG9nICovCisJb21hcF9yZXF1ZXN0X2dwaW8oMCk7CisJLyogc21jOTF4IHJlc2V0ICovCisJb21hcF9yZXF1ZXN0X2dwaW8oNyk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNywgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDcsIDEpOworCXVkZWxheSgyKTsJLyogd2FpdCBhdCBsZWFzdCAxMDBucyAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg3LCAwKTsKKwltZGVsYXkoNTApOwkvKiA1MG1zIHVudGlsIFBIWSByZWFkeSAqLworCS8qIHNtYzkxeCBpbnRlcnJ1cHQgcGluICovCisJb21hcF9yZXF1ZXN0X2dwaW8oOCk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoOCwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKKwkvKiAxNkM1NTQgcmVzZXQqLworCW9tYXBfcmVxdWVzdF9ncGlvKDYpOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDYsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg2LCAwKTsKKwkvKiAxNkM1NTQgaW50ZXJydXB0IHBpbnMgKi8KKwlvbWFwX3JlcXVlc3RfZ3BpbygxMik7CisJb21hcF9yZXF1ZXN0X2dwaW8oMTMpOworCW9tYXBfcmVxdWVzdF9ncGlvKDE0KTsKKwlvbWFwX3JlcXVlc3RfZ3BpbygxNSk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTIsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTMsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTQsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTUsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyh2b2ljZWJsdWVfZGV2aWNlcywgQVJSQVlfU0laRSh2b2ljZWJsdWVfZGV2aWNlcykpOworCW9tYXBfYm9hcmRfY29uZmlnID0gdm9pY2VibHVlX2NvbmZpZzsKKwlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRSh2b2ljZWJsdWVfY29uZmlnKTsKK30KKworc3RhdGljIGludCBfX2luaXRkYXRhIG9tYXBfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKKworc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9tYXBfaW8odm9pZCkKK3sKKwlvbWFwX21hcF9pbygpOworCW9tYXBfc2VyaWFsX2luaXQob21hcF9zZXJpYWxfcG9ydHMpOworfQorCisjZGVmaW5lIE1BQ0hJTkVfUEFOSUNFRAkJMQorI2RlZmluZSBNQUNISU5FX1JFQk9PVElORwkyCisjZGVmaW5lIE1BQ0hJTkVfUkVCT09UCQk0CitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWNoaW5lX3N0YXRlOworCitzdGF0aWMgaW50IHBhbmljX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwKKwkgdm9pZCAqcHRyKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KE1BQ0hJTkVfUEFOSUNFRCwgJm1hY2hpbmVfc3RhdGUpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwkvKiBGbGFzaCBQb3dlciBMRUQKKwkgKiAoVE9ETzogRW5hYmxlIGNsb2NrIHJpZ2h0IHdheSAoZW5hYmxlZCBpbiBib290bG9hZGVyIGFscmVhZHkpKSAqLworCW9tYXBfd3JpdGViKDB4NzgsIE9NQVBfTFBHMV9MQ1IpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhbmljX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsCT0gcGFuaWNfZXZlbnQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9ub3RpZmllcih2b2lkKQoreworCS8qIFNldHVwIHBhbmljIG5vdGlmaWVyICovCisJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY19ibG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwoc2V0dXBfbm90aWZpZXIpOworCitzdGF0aWMgaW50IHdkdF9ncGlvX3N0YXRlOworCit2b2lkIHZvaWNlYmx1ZV93ZHRfZW5hYmxlKHZvaWQpCit7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMCk7CisJd2R0X2dwaW9fc3RhdGUgPSAwOworfQorCit2b2lkIHZvaWNlYmx1ZV93ZHRfZGlzYWJsZSh2b2lkKQoreworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDAsIDEpOworfQorCit2b2lkIHZvaWNlYmx1ZV93ZHRfcGluZyh2b2lkKQoreworCWlmICh0ZXN0X2JpdChNQUNISU5FX1JFQk9PVCwgJm1hY2hpbmVfc3RhdGUpKQorCQlyZXR1cm47CisKKwl3ZHRfZ3Bpb19zdGF0ZSA9ICF3ZHRfZ3Bpb19zdGF0ZTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgd2R0X2dwaW9fc3RhdGUpOworfQorCit2b2lkIHZvaWNlYmx1ZV9yZXNldCh2b2lkKQoreworCXNldF9iaXQoTUFDSElORV9SRUJPT1QsICZtYWNoaW5lX3N0YXRlKTsKKwl2b2ljZWJsdWVfd2R0X2VuYWJsZSgpOworCXdoaWxlICgxKSA7Cit9CisKK0VYUE9SVF9TWU1CT0wodm9pY2VibHVlX3dkdF9lbmFibGUpOworRVhQT1JUX1NZTUJPTCh2b2ljZWJsdWVfd2R0X2Rpc2FibGUpOworRVhQT1JUX1NZTUJPTCh2b2ljZWJsdWVfd2R0X3BpbmcpOworCitNQUNISU5FX1NUQVJUKFZPSUNFQkxVRSwgIlZvaWNlQmx1ZSBPTUFQNTkxMCIpCisJTUFJTlRBSU5FUigiTGFkaXNsYXYgTWljaGwgPG1pY2hsQDJuLmN6PiIpCisJQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKKwlCT09UX1BBUkFNUygweDEwMDAwMTAwKQorCU1BUElPKHZvaWNlYmx1ZV9tYXBfaW8pCisJSU5JVElSUSh2b2ljZWJsdWVfaW5pdF9pcnEpCisJSU5JVF9NQUNISU5FKHZvaWNlYmx1ZV9pbml0KQorCS50aW1lciA9ICZvbWFwX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMTg2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5jCkBAIC0wLDAgKzEsMTA3NiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgY29ycG9yYXRpb24KKyAqICBXcml0dGVuIGJ5IFR1dWtrYSBUaWtrYW5lbiA8dHV1a2thLnRpa2thbmVuQGVsZWt0cm9iaXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKworc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOworc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsb2NrZndfbG9jayk7CitzdGF0aWMgdm9pZCBwcm9wYWdhdGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsayk7CisvKiBFeHRlcm5hbCBjbG9jayAoTUNMSyAmIEJDTEspIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZXRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworc3RhdGljIGxvbmcgcm91bmRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworc3RhdGljIHZvaWQgaW5pdF9leHRfY2xrKHN0cnVjdCBjbGsgKiAgY2xrKTsKKy8qIE1QVSB2aXJ0dWFsIGNsb2NrIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZWxlY3RfdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK3N0YXRpYyBsb25nIHJvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqICBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Cit2b2lkIGNsa19zZXRkcGxsKF9fdTE2LCBfX3UxNik7CisKK3N0cnVjdCBtcHVfcmF0ZSByYXRlX3RhYmxlW10gPSB7CisJLyogTVBVIE1IeiwgeHRhbCBNSHosIGRwbGwxIE1IeiwgQ0tDVEwsIERQTExfQ1RMCisJICogYXJtZGl2LCBkc3BkaXYsIGRzcG1tdSwgdGNkaXYsIHBlcmRpdiwgbGNkZGl2CisJICovCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMjE2TUhaKQorCXsgMjE2MDAwMDAwLCAxMjAwMDAwMCwgMjE2MDAwMDAwLCAweDA1MGQsIDB4MjkxMCB9LCAvKiAxLzEvMi8yLzIvOCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTk1TUhaKQorCXsgMTk1MDAwMDAwLCAxMzAwMDAwMCwgMTk1MDAwMDAwLCAweDA1MGUsIDB4Mjc5MCB9LCAvKiAxLzEvMi8yLzQvOCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTkyTUhaKQorCXsgMTkyMDAwMDAwLCAxOTIwMDAwMCwgMTkyMDAwMDAwLCAweDA1MGYsIDB4MjUxMCB9LCAvKiAxLzEvMi8yLzgvOCAqLworCXsgMTkyMDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDA1MGYsIDB4MjgxMCB9LCAvKiAxLzEvMi8yLzgvOCAqLworCXsgIDk2MDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDA1NWYsIDB4MjgxMCB9LCAvKiAyLzIvMi8yLzgvOCAqLworCXsgIDQ4MDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDBjY2YsIDB4MjgxMCB9LCAvKiA0LzQvNC80LzgvOCAqLworCXsgIDI0MDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDBmZmYsIDB4MjgxMCB9LCAvKiA4LzgvOC84LzgvOCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTgyTUhaKQorCXsgMTgyMDAwMDAwLCAxMzAwMDAwMCwgMTgyMDAwMDAwLCAweDA1MGUsIDB4MjcxMCB9LCAvKiAxLzEvMi8yLzQvOCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTY4TUhaKQorCXsgMTY4MDAwMDAwLCAxMjAwMDAwMCwgMTY4MDAwMDAwLCAweDAxMGYsIDB4MjcxMCB9LCAvKiAxLzEvMS8yLzgvOCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTUwTUhaKQorCXsgMTUwMDAwMDAwLCAxMjAwMDAwMCwgMTUwMDAwMDAwLCAweDE1MGEsIDB4MmNiMCB9LCAvKiAwLzAvMS8xLzIvMiAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTIwTUhaKQorCXsgMTIwMDAwMDAwLCAxMjAwMDAwMCwgMTIwMDAwMDAwLCAweDAxMGEsIDB4MjUxMCB9LCAvKiAxLzEvMS8yLzQvNCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fOTZNSFopCisJeyAgOTYwMDAwMDAsIDEyMDAwMDAwLCAgOTYwMDAwMDAsIDB4MDAwNSwgMHgyNDEwIH0sIC8qIDEvMS8xLzEvMi8yICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV82ME1IWikKKwl7ICA2MDAwMDAwMCwgMTIwMDAwMDAsICA2MDAwMDAwMCwgMHgwMDA1LCAweDIyOTAgfSwgLyogMS8xLzEvMS8yLzIgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzMwTUhaKQorCXsgIDMwMDAwMDAwLCAxMjAwMDAwMCwgIDYwMDAwMDAwLCAweDA1NTUsIDB4MjI5MCB9LCAvKiAyLzIvMi8yLzIvMiAqLworI2VuZGlmCisJeyAwLCAwLCAwLCAwLCAwIH0sCit9OworCisKK3N0YXRpYyB2b2lkIGNrY3RsX3JlY2FsYyhzdHJ1Y3QgY2xrICogIGNsaykKK3sKKwlpbnQgZHNvcjsKKworCS8qIENhbGN1bGF0ZSBkaXZpc29yIGVuY29kZWQgYXMgMi1iaXQgZXhwb25lbnQgKi8KKwlkc29yID0gMSA8PCAoMyAmIChvbWFwX3JlYWR3KEFSTV9DS0NUTCkgPj4gY2xrLT5yYXRlX29mZnNldCkpOworCWlmICh1bmxpa2VseShjbGstPnJhdGUgPT0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkc29yKSkKKwkJcmV0dXJuOyAvKiBObyBjaGFuZ2UsIHF1aWNrIGV4aXQgKi8KKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGRzb3I7CisKKwlpZiAodW5saWtlbHkoY2xrLT5mbGFncyAmIFJBVEVfUFJPUEFHQVRFUykpCisJCXByb3BhZ2F0ZV9yYXRlKGNsayk7Cit9CisKKworc3RhdGljIHZvaWQgZm9sbG93cGFyZW50X3JlY2FsYyhzdHJ1Y3QgY2xrICogIGNsaykKK3sKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKK30KKworCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19yZWNhbGMoc3RydWN0IGNsayAqICBjbGspCit7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyAxNDsKK30KKworCitzdGF0aWMgc3RydWN0IGNsayBja19yZWYgPSB7CisJLm5hbWUJCT0gImNrX3JlZiIsCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBBTFdBWVNfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNrX2RwbGwxID0geworCS5uYW1lCQk9ICJja19kcGxsMSIsCisJLnBhcmVudAkJPSAmY2tfcmVmLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBja19kcGxsMW91dCA9IHsKKwkubmFtZQkJPSAiY2tfZHBsbDFvdXQiLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fQ0tPVVRfQVJNLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1fY2sgPSB7CisJLm5hbWUJCT0gImFybV9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMIHwgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfQVJNRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1wZXJfY2sgPSB7CisJLm5hbWUJCT0gImFybXBlcl9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCisJLmVuYWJsZV9iaXQJPSBFTl9QRVJDSywKKwkucmF0ZV9vZmZzZXQJPSBDS0NUTF9QRVJESVZfT0ZGU0VULAorCS5yZWNhbGMJCT0gJmNrY3RsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybV9ncGlvX2NrID0geworCS5uYW1lCQk9ICJhcm1fZ3Bpb19jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCisJLmVuYWJsZV9iaXQJPSBFTl9HUElPQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybXhvcl9jayA9IHsKKwkubmFtZQkJPSAiYXJteG9yX2NrIiwKKwkucGFyZW50CQk9ICZja19yZWYsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1hPUlBDSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYXJtdGltX2NrID0geworCS5uYW1lCQk9ICJhcm10aW1fY2siLAorCS5wYXJlbnQJCT0gJmNrX3JlZiwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fVElNQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybXdkdF9jayA9IHsKKwkubmFtZQkJPSAiYXJtd2R0X2NrIiwKKwkucGFyZW50CQk9ICZja19yZWYsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1dEVENLLAorCS5yZWNhbGMJCT0gJndhdGNoZG9nX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybWludGhfY2sxNnh4ID0geworCS5uYW1lCQk9ICJhcm1pbnRoX2NrIiwKKwkucGFyZW50CQk9ICZhcm1fY2ssCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLyogTm90ZTogT24gMTZ4eCB0aGUgZnJlcXVlbmN5IGNhbiBiZSBkaXZpZGVkIGJ5IDIgYnkgcHJvZ3JhbW1pbmcKKwkgKiBBUk1fQ0tDVEw6QVJNX0lOVEhDS19TRUwoMTQpIHRvIDEKKwkgKgorCSAqIDE1MTAgdmVyc2lvbiBpcyBpbiBUQyBjbG9ja3MuCisJICovCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3BfY2sgPSB7CisJLm5hbWUJCT0gImRzcF9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMLAorCS5lbmFibGVfcmVnCT0gQVJNX0NLQ1RMLAorCS5lbmFibGVfYml0CT0gRU5fRFNQQ0ssCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfRFNQRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3BtbXVfY2sgPSB7CisJLm5hbWUJCT0gImRzcG1tdV9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMIHwgQUxXQVlTX0VOQUJMRUQsCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfRFNQTU1VRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0Y19jayA9IHsKKwkubmFtZQkJPSAidGNfY2siLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgQ0xPQ0tfSU5fT01BUDczMCB8CisJCQkgIFJBVEVfQ0tDVEwgfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKKwkucmF0ZV9vZmZzZXQJPSBDS0NUTF9UQ0RJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYXJtaW50aF9jazE1MTAgPSB7CisJLm5hbWUJCT0gImFybWludGhfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS8qIE5vdGU6IE9uIDE1MTAgdGhlIGZyZXF1ZW5jeSBmb2xsb3dzIFRDX0NLCisJICoKKwkgKiAxNnh4IHZlcnNpb24gaXMgaW4gTVBVIGNsb2Nrcy4KKwkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHRpcGJfY2sgPSB7CisJLm5hbWUJCT0gInRpYnBfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbDNfb2NwaV9jayA9IHsKKwkubmFtZQkJPSAibDNfb2NwaV9jayIsCisJLnBhcmVudAkJPSAmdGNfY2ssCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDMsCisJLmVuYWJsZV9iaXQJPSBFTl9PQ1BJX0NLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0YzFfY2sgPSB7CisJLm5hbWUJCT0gInRjMV9jayIsCisJLnBhcmVudAkJPSAmdGNfY2ssCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDMsCisJLmVuYWJsZV9iaXQJPSBFTl9UQzFfQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHRjMl9jayA9IHsKKwkubmFtZQkJPSAidGMyX2NrIiwKKwkucGFyZW50CQk9ICZ0Y19jaywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMywKKwkuZW5hYmxlX2JpdAk9IEVOX1RDMl9DSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZG1hX2NrID0geworCS5uYW1lCQk9ICJkbWFfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkbWFfbGNkZnJlZV9jayA9IHsKKwkubmFtZQkJPSAiZG1hX2xjZGZyZWVfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYXBpX2NrID0geworCS5uYW1lCQk9ICJhcGlfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCisJLmVuYWJsZV9iaXQJPSBFTl9BUElDSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbGJfY2sgPSB7CisJLm5hbWUJCT0gImxiX2NrIiwKKwkucGFyZW50CQk9ICZ0Y19jaywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX0xCQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHJoZWExX2NrID0geworCS5uYW1lCQk9ICJyaGVhMV9jayIsCisJLnBhcmVudAkJPSAmdGNfY2ssCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayByaGVhMl9jayA9IHsKKwkubmFtZQkJPSAicmhlYTJfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbGNkX2NrID0geworCS5uYW1lCQk9ICJsY2RfY2siLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgQ0xPQ0tfSU5fT01BUDczMCB8CisJCQkgIFJBVEVfQ0tDVEwsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX0xDRENLLAorCS5yYXRlX29mZnNldAk9IENLQ1RMX0xDRERJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDFfY2sgPSB7CisJLm5hbWUJCT0gInVhcnQxX2NrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KKwkucmF0ZQkJPSA0ODAwMDAwMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAorCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAorCS5lbmFibGVfYml0CT0gMjksCisJLyogKE9ubHkgb24gMTUxMCkKKwkgKiBUaGUgImVuYWJsZSBiaXQiIGFjdHVhbGx5IGNob29zZXMgYmV0d2VlbiA0OE1IeiBhbmQgMTJNSHouCisJICovCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0Ml9jayA9IHsKKwkubmFtZQkJPSAidWFydDJfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCisJLmVuYWJsZV9iaXQJPSAzMCwKKwkvKiAoZm9yIGJvdGggMTUxMCBhbmQgMTZ4eCkKKwkgKiBUaGUgImVuYWJsZSBiaXQiIGFjdHVhbGx5IGNob29zZXMgYmV0d2VlbiA0OE1IeiBhbmQgMTJNSHovMzJrSHouCisJICovCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0M19jayA9IHsKKwkubmFtZQkJPSAidWFydDNfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCisJLmVuYWJsZV9iaXQJPSAzMSwKKwkvKiAoT25seSBvbiAxNTEwKQorCSAqIFRoZSAiZW5hYmxlIGJpdCIgYWN0dWFsbHkgY2hvb3NlcyBiZXR3ZWVuIDQ4TUh6IGFuZCAxMk1Iei4KKwkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9jbGtvID0gewkvKiA2IE1IeiBvdXRwdXQgb24gVzRfVVNCX0NMS08gKi8KKwkubmFtZQkJPSAidXNiX2Nsa28iLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDYwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZW5hYmxlX3JlZwk9IFVMUERfQ0xPQ0tfQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IFVTQl9NQ0xLX0VOX0JJVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9oaGNfY2sxNTEwID0geworCS5uYW1lCQk9ICJ1c2JfaGhjX2NrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KKwkucmF0ZQkJPSA0ODAwMDAwMCwgLyogQWN0dWFsbHkgMiBjbG9ja3MsIDEyTUh6IGFuZCA0OE1IeiAqLworCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8CisJCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAorCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAorCS5lbmFibGVfYml0CT0gVVNCX0hPU1RfSEhDX1VIT1NUX0VOLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiX2hoY19jazE2eHggPSB7CisJLm5hbWUJCT0gInVzYl9oaGNfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS8qIE9UR19TWVNDT05fMi5PVEdfUEFERU4gPT0gMCAobm90IDE1MTAtY29tcGF0aWJsZSkgKi8KKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZW5hYmxlX3JlZwk9IE9UR19CQVNFICsgMHgwOCAvKiBPVEdfU1lTQ09OXzIgKi8sCisJLmVuYWJsZV9iaXQJPSA4IC8qIFVIT1NUX0VOICovLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNsa18xNTEwID0geworCS5uYW1lCQk9ICJtY2xrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBSQVRFX0ZJWEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNsa18xNnh4ID0geworCS5uYW1lCQk9ICJtY2xrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmVuYWJsZV9yZWcJPSBDT01fQ0xLX0RJVl9DVFJMX1NFTCwKKwkuZW5hYmxlX2JpdAk9IENPTV9VTFBEX1BMTF9DTEtfUkVRLAorCS5zZXRfcmF0ZQk9ICZzZXRfZXh0X2Nsa19yYXRlLAorCS5yb3VuZF9yYXRlCT0gJnJvdW5kX2V4dF9jbGtfcmF0ZSwKKwkuaW5pdAkJPSAmaW5pdF9leHRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYmNsa18xNTEwID0geworCS5uYW1lCQk9ICJiY2xrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBSQVRFX0ZJWEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYmNsa18xNnh4ID0geworCS5uYW1lCQk9ICJiY2xrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmVuYWJsZV9yZWcJPSBTV0RfQ0xLX0RJVl9DVFJMX1NFTCwKKwkuZW5hYmxlX2JpdAk9IFNXRF9VTFBEX1BMTF9DTEtfUkVRLAorCS5zZXRfcmF0ZQk9ICZzZXRfZXh0X2Nsa19yYXRlLAorCS5yb3VuZF9yYXRlCT0gJnJvdW5kX2V4dF9jbGtfcmF0ZSwKKwkuaW5pdAkJPSAmaW5pdF9leHRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jMV9jayA9IHsKKwkubmFtZQkJPSAibW1jMV9jayIsCisJLyogRnVuY3Rpb25hbCBjbG9jayBpcyBkaXJlY3QgZnJvbSBVTFBELCBpbnRlcmZhY2UgY2xvY2sgaXMgQVJNUEVSICovCisJLnBhcmVudAkJPSAmYXJtcGVyX2NrLAorCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCisJLmVuYWJsZV9iaXQJPSAyMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tYzJfY2sgPSB7CisJLm5hbWUJCT0gIm1tYzJfY2siLAorCS8qIEZ1bmN0aW9uYWwgY2xvY2sgaXMgZGlyZWN0IGZyb20gVUxQRCwgaW50ZXJmYWNlIGNsb2NrIGlzIEFSTVBFUiAqLworCS5wYXJlbnQJCT0gJmFybXBlcl9jaywKKwkucmF0ZQkJPSA0ODAwMDAwMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKKwkuZW5hYmxlX2JpdAk9IDIwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdmlydHVhbF9ja19tcHUgPSB7CisJLm5hbWUJCT0gIm1wdSIsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBWSVJUVUFMX0NMT0NLIHwgQUxXQVlTX0VOQUJMRUQsCisJLnBhcmVudAkJPSAmYXJtX2NrLCAvKiBJcyBzbWFydGVyIGFsaWFzIGZvciAqLworCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLnNldF9yYXRlCT0gJnNlbGVjdF90YWJsZV9yYXRlLAorCS5yb3VuZF9yYXRlCT0gJnJvdW5kX3RvX3RhYmxlX3JhdGUsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY2xrICogIG9uY2hpcF9jbGtzW10gPSB7CisJLyogbm9uLVVMUEQgY2xvY2tzICovCisJJmNrX3JlZiwKKwkmY2tfZHBsbDEsCisJLyogQ0tfR0VOMSBjbG9ja3MgKi8KKwkmY2tfZHBsbDFvdXQsCisJJmFybV9jaywKKwkmYXJtcGVyX2NrLAorCSZhcm1fZ3Bpb19jaywKKwkmYXJteG9yX2NrLAorCSZhcm10aW1fY2ssCisJJmFybXdkdF9jaywKKwkmYXJtaW50aF9jazE1MTAsICAmYXJtaW50aF9jazE2eHgsCisJLyogQ0tfR0VOMiBjbG9ja3MgKi8KKwkmZHNwX2NrLAorCSZkc3BtbXVfY2ssCisJLyogQ0tfR0VOMyBjbG9ja3MgKi8KKwkmdGNfY2ssCisJJnRpcGJfY2ssCisJJmwzX29jcGlfY2ssCisJJnRjMV9jaywKKwkmdGMyX2NrLAorCSZkbWFfY2ssCisJJmRtYV9sY2RmcmVlX2NrLAorCSZhcGlfY2ssCisJJmxiX2NrLAorCSZyaGVhMV9jaywKKwkmcmhlYTJfY2ssCisJJmxjZF9jaywKKwkvKiBVTFBEIGNsb2NrcyAqLworCSZ1YXJ0MV9jaywKKwkmdWFydDJfY2ssCisJJnVhcnQzX2NrLAorCSZ1c2JfY2xrbywKKwkmdXNiX2hoY19jazE1MTAsICZ1c2JfaGhjX2NrMTZ4eCwKKwkmbWNsa18xNTEwLCAgJm1jbGtfMTZ4eCwKKwkmYmNsa18xNTEwLCAgJmJjbGtfMTZ4eCwKKwkmbW1jMV9jaywKKwkmbW1jMl9jaywKKwkvKiBWaXJ0dWFsIGNsb2NrcyAqLworCSZ2aXJ0dWFsX2NrX21wdSwKK307CisKK3N0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKK3sKKwlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKKworCWRvd24oJmNsb2Nrc19zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2Nrcywgbm9kZSkgeworCQlpZiAoc3RyY21wKGlkLCBwLT5uYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHAtPm93bmVyKSkgeworCQkJY2xrID0gcDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZjbG9ja3Nfc2VtKTsKKworCXJldHVybiBjbGs7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19nZXQpOworCisKK3ZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCit7CisJaWYgKGNsayAmJiAhSVNfRVJSKGNsaykpCisJCW1vZHVsZV9wdXQoY2xrLT5vd25lcik7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19wdXQpOworCisKK2ludCBfX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCV9fdTE2IHJlZ3ZhbDE2OworCV9fdTMyIHJlZ3ZhbDMyOworCisJaWYgKGNsay0+ZmxhZ3MgJiBBTFdBWVNfRU5BQkxFRCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkoY2xrLT5lbmFibGVfcmVnID09IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2xvY2suYzogRW5hYmxlIGZvciAlcyB3aXRob3V0IGVuYWJsZSBjb2RlXG4iLAorCQkgICAgICAgY2xrLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNsay0+ZmxhZ3MgJiBFTkFCTEVfUkVHXzMyQklUKSB7CisJCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQlyZWd2YWwzMiB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQlvbWFwX3dyaXRlbChyZWd2YWwzMiwgY2xrLT5lbmFibGVfcmVnKTsKKwl9IGVsc2UgeworCQlyZWd2YWwxNiA9IG9tYXBfcmVhZHcoY2xrLT5lbmFibGVfcmVnKTsKKwkJcmVndmFsMTYgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJb21hcF93cml0ZXcocmVndmFsMTYsIGNsay0+ZW5hYmxlX3JlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBfX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlfX3UxNiByZWd2YWwxNjsKKwlfX3UzMiByZWd2YWwzMjsKKworCWlmIChjbGstPmVuYWJsZV9yZWcgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGNsay0+ZmxhZ3MgJiBFTkFCTEVfUkVHXzMyQklUKSB7CisJCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQlyZWd2YWwzMiAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJb21hcF93cml0ZWwocmVndmFsMzIsIGNsay0+ZW5hYmxlX3JlZyk7CisJfSBlbHNlIHsKKwkJcmVndmFsMTYgPSBvbWFwX3JlYWR3KGNsay0+ZW5hYmxlX3JlZyk7CisJCXJlZ3ZhbDE2ICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQlvbWFwX3dyaXRldyhyZWd2YWwxNiwgY2xrLT5lbmFibGVfcmVnKTsKKwl9Cit9CisKKwordm9pZCBfX2Nsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaWYgKGNsay0+dXNlY291bnQgPiAwICYmICEoLS1jbGstPnVzZWNvdW50KSkgeworCQlfX2Nsa19kaXNhYmxlKGNsayk7CisJCWlmIChsaWtlbHkoY2xrLT5wYXJlbnQpKQorCQkJX19jbGtfdW51c2UoY2xrLT5wYXJlbnQpOworCX0KK30KKworCitpbnQgX19jbGtfdXNlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoY2xrLT51c2Vjb3VudCsrID09IDApIHsKKwkJaWYgKGxpa2VseShjbGstPnBhcmVudCkpCisJCQlyZXQgPSBfX2Nsa191c2UoY2xrLT5wYXJlbnQpOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCWNsay0+dXNlY291bnQtLTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBfX2Nsa19lbmFibGUoY2xrKTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApICYmIGNsay0+cGFyZW50KSB7CisJCQlfX2Nsa191bnVzZShjbGstPnBhcmVudCk7CisJCQljbGstPnVzZWNvdW50LS07CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJcmV0ID0gX19jbGtfZW5hYmxlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2VuYWJsZSk7CisKKwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKKwlfX2Nsa19kaXNhYmxlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKKworCitpbnQgY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBfX2Nsa191c2UoY2xrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjbGtfdXNlKTsKKworCit2b2lkIGNsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKKwlfX2Nsa191bnVzZShjbGspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChjbGtfdW51c2UpOworCisKK2ludCBjbGtfZ2V0X3VzZWNvdW50KHN0cnVjdCBjbGsgKmNsaykKK3sKKyAgICAgICAgcmV0dXJuIGNsay0+dXNlY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19nZXRfdXNlY291bnQpOworCisKK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrLT5yYXRlOworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOworCisKK3N0YXRpYyBfX3UxNiB2ZXJpZnlfY2tjdGxfdmFsdWUoX191MTYgbmV3dmFsKQoreworCS8qIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBmb2xsb3dpbmcgbGltaXRhdGlvbnMgc2V0CisJICogYnkgdGhlIGhhcmR3YXJlIChhbGwgY29uZGl0aW9ucyBtdXN0IGJlIHRydWUpOgorCSAqIERTUE1NVV9DSyA9PSBEU1BfQ0sgIG9yICBEU1BNTVVfQ0sgPT0gRFNQX0NLLzIKKwkgKiBBUk1fQ0sgPj0gVENfQ0sKKwkgKiBEU1BfQ0sgPj0gVENfQ0sKKwkgKiBEU1BNTVVfQ0sgPj0gVENfQ0sKKwkgKgorCSAqIEluIGFkZGl0aW9uIGZvbGxvd2luZyBydWxlcyBhcmUgZW5mb3JjZWQ6CisJICogTENEX0NLIDw9IFRDX0NLCisJICogQVJNUEVSX0NLIDw9IFRDX0NLCisJICoKKwkgKiBIb3dldmVyLCBtYXhpbXVtIGZyZXF1ZW5jaWVzIGFyZSBub3QgY2hlY2tlZCBmb3IhCisJICovCisJX191OCBwZXJfZXhwOworCV9fdTggbGNkX2V4cDsKKwlfX3U4IGFybV9leHA7CisJX191OCBkc3BfZXhwOworCV9fdTggdGNfZXhwOworCV9fdTggZHNwbW11X2V4cDsKKworCXBlcl9leHAgPSAobmV3dmFsID4+IENLQ1RMX1BFUkRJVl9PRkZTRVQpICYgMzsKKwlsY2RfZXhwID0gKG5ld3ZhbCA+PiBDS0NUTF9MQ0RESVZfT0ZGU0VUKSAmIDM7CisJYXJtX2V4cCA9IChuZXd2YWwgPj4gQ0tDVExfQVJNRElWX09GRlNFVCkgJiAzOworCWRzcF9leHAgPSAobmV3dmFsID4+IENLQ1RMX0RTUERJVl9PRkZTRVQpICYgMzsKKwl0Y19leHAgPSAobmV3dmFsID4+IENLQ1RMX1RDRElWX09GRlNFVCkgJiAzOworCWRzcG1tdV9leHAgPSAobmV3dmFsID4+IENLQ1RMX0RTUE1NVURJVl9PRkZTRVQpICYgMzsKKworCWlmIChkc3BtbXVfZXhwIDwgZHNwX2V4cCkKKwkJZHNwbW11X2V4cCA9IGRzcF9leHA7CisJaWYgKGRzcG1tdV9leHAgPiBkc3BfZXhwKzEpCisJCWRzcG1tdV9leHAgPSBkc3BfZXhwKzE7CisJaWYgKHRjX2V4cCA8IGFybV9leHApCisJCXRjX2V4cCA9IGFybV9leHA7CisJaWYgKHRjX2V4cCA8IGRzcG1tdV9leHApCisJCXRjX2V4cCA9IGRzcG1tdV9leHA7CisJaWYgKHRjX2V4cCA+IGxjZF9leHApCisJCWxjZF9leHAgPSB0Y19leHA7CisJaWYgKHRjX2V4cCA+IHBlcl9leHApCisJCXBlcl9leHAgPSB0Y19leHA7CisKKwluZXd2YWwgJj0gMHhmMDAwOworCW5ld3ZhbCB8PSBwZXJfZXhwIDw8IENLQ1RMX1BFUkRJVl9PRkZTRVQ7CisJbmV3dmFsIHw9IGxjZF9leHAgPDwgQ0tDVExfTENERElWX09GRlNFVDsKKwluZXd2YWwgfD0gYXJtX2V4cCA8PCBDS0NUTF9BUk1ESVZfT0ZGU0VUOworCW5ld3ZhbCB8PSBkc3BfZXhwIDw8IENLQ1RMX0RTUERJVl9PRkZTRVQ7CisJbmV3dmFsIHw9IHRjX2V4cCA8PCBDS0NUTF9UQ0RJVl9PRkZTRVQ7CisJbmV3dmFsIHw9IGRzcG1tdV9leHAgPDwgQ0tDVExfRFNQTU1VRElWX09GRlNFVDsKKworCXJldHVybiBuZXd2YWw7Cit9CisKKworc3RhdGljIGludCBjYWxjX2Rzb3JfZXhwKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCS8qIE5vdGU6IElmIHRhcmdldCBmcmVxdWVuY3kgaXMgdG9vIGxvdywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiA0LAorCSAqIHdoaWNoIGlzIGludmFsaWQgdmFsdWUuIENhbGxlciBtdXN0IGNoZWNrIGZvciB0aGlzIHZhbHVlIGFuZCBhY3QKKwkgKiBhY2NvcmRpbmdseS4KKwkgKgorCSAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgZm9yIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBzZXQKKwkgKiBieSB0aGUgaGFyZHdhcmUgKGFsbCBjb25kaXRpb25zIG11c3QgYmUgdHJ1ZSk6CisJICogRFNQTU1VX0NLID09IERTUF9DSyAgb3IgIERTUE1NVV9DSyA9PSBEU1BfQ0svMgorCSAqIEFSTV9DSyA+PSBUQ19DSworCSAqIERTUF9DSyA+PSBUQ19DSworCSAqIERTUE1NVV9DSyA+PSBUQ19DSworCSAqLworCXVuc2lnbmVkIGxvbmcgcmVhbHJhdGU7CisJc3RydWN0IGNsayAqICBwYXJlbnQ7CisJdW5zaWduZWQgIGRzb3JfZXhwOworCisJaWYgKHVubGlrZWx5KCEoY2xrLT5mbGFncyAmIFJBVEVfQ0tDVEwpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJlbnQgPSBjbGstPnBhcmVudDsKKwlpZiAodW5saWtlbHkocGFyZW50ID09IDApKQorCQlyZXR1cm4gLUVJTzsKKworCXJlYWxyYXRlID0gcGFyZW50LT5yYXRlOworCWZvciAoZHNvcl9leHA9MDsgZHNvcl9leHA8NDsgZHNvcl9leHArKykgeworCQlpZiAocmVhbHJhdGUgPD0gcmF0ZSkKKwkJCWJyZWFrOworCisJCXJlYWxyYXRlIC89IDI7CisJfQorCisJcmV0dXJuIGRzb3JfZXhwOworfQorCitsb25nIGNsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCBkc29yX2V4cDsKKworCWlmIChjbGstPmZsYWdzICYgUkFURV9GSVhFRCkKKwkJcmV0dXJuIGNsay0+cmF0ZTsKKworCWlmIChjbGstPmZsYWdzICYgUkFURV9DS0NUTCkgeworCQlkc29yX2V4cCA9IGNhbGNfZHNvcl9leHAoY2xrLCByYXRlKTsKKwkJaWYgKGRzb3JfZXhwIDwgMCkKKwkJCXJldHVybiBkc29yX2V4cDsKKwkJaWYgKGRzb3JfZXhwID4gMykKKwkJCWRzb3JfZXhwID0gMzsKKwkJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gKDEgPDwgZHNvcl9leHApOworCX0KKworCWlmKGNsay0+cm91bmRfcmF0ZSAhPSAwKQorCQlyZXR1cm4gY2xrLT5yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CisKKwlyZXR1cm4gY2xrLT5yYXRlOworfQorRVhQT1JUX1NZTUJPTChjbGtfcm91bmRfcmF0ZSk7CisKKworc3RhdGljIHZvaWQgcHJvcGFnYXRlX3JhdGUoc3RydWN0IGNsayAqICBjbGspCit7CisJc3RydWN0IGNsayAqKiAgY2xrcDsKKworCWZvciAoY2xrcCA9IG9uY2hpcF9jbGtzOyBjbGtwIDwgb25jaGlwX2Nsa3MrQVJSQVlfU0laRShvbmNoaXBfY2xrcyk7IGNsa3ArKykgeworCQlpZiAobGlrZWx5KCgqY2xrcCktPnBhcmVudCAhPSBjbGspKSBjb250aW51ZTsKKwkJaWYgKGxpa2VseSgoKmNsa3ApLT5yZWNhbGMpKQorCQkJKCpjbGtwKS0+cmVjYWxjKCpjbGtwKTsKKwl9Cit9CisKKworc3RhdGljIGludCBzZWxlY3RfdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCS8qIEZpbmQgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGZyZXF1ZW5jeSA8PSByYXRlIGFuZCBzd2l0Y2ggdG8gaXQgKi8KKwlzdHJ1Y3QgbXB1X3JhdGUgKiAgcHRyOworCisJaWYgKGNsayAhPSAmdmlydHVhbF9ja19tcHUpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChwdHIgPSByYXRlX3RhYmxlOyBwdHItPnJhdGU7IHB0cisrKSB7CisJCWlmIChwdHItPnh0YWwgIT0gY2tfcmVmLnJhdGUpCisJCQljb250aW51ZTsKKworCQkvKiBEUExMMSBjYW5ub3QgYmUgcmVwcm9ncmFtbWVkIHdpdGhvdXQgcmlza2luZyBzeXN0ZW0gY3Jhc2ggKi8KKwkJaWYgKGxpa2VseShja19kcGxsMS5yYXRlIT0wKSAmJiBwdHItPnBsbF9yYXRlICE9IGNrX2RwbGwxLnJhdGUpCisJCQljb250aW51ZTsKKworCQkvKiBDYW4gY2hlY2sgb25seSBhZnRlciB4dGFsIGZyZXF1ZW5jeSBjaGVjayAqLworCQlpZiAocHRyLT5yYXRlIDw9IHJhdGUpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIXB0ci0+cmF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkoY2tfZHBsbDEucmF0ZSA9PSAwKSkgeworCQlvbWFwX3dyaXRldyhwdHItPmRwbGxjdGxfdmFsLCBEUExMX0NUTCk7CisJCWNrX2RwbGwxLnJhdGUgPSBwdHItPnBsbF9yYXRlOworCX0KKwlvbWFwX3dyaXRldyhwdHItPmNrY3RsX3ZhbCwgQVJNX0NLQ1RMKTsKKwlwcm9wYWdhdGVfcmF0ZSgmY2tfZHBsbDEpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBsb25nIHJvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqICBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwkvKiBGaW5kIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBmcmVxdWVuY3kgPD0gcmF0ZSAqLworCXN0cnVjdCBtcHVfcmF0ZSAqICBwdHI7CisJbG9uZyAgaGlnaGVzdF9yYXRlOworCisJaWYgKGNsayAhPSAmdmlydHVhbF9ja19tcHUpCisJCXJldHVybiAtRUlOVkFMOworCisJaGlnaGVzdF9yYXRlID0gLUVJTlZBTDsKKworCWZvciAocHRyID0gcmF0ZV90YWJsZTsgcHRyLT5yYXRlOyBwdHIrKykgeworCQlpZiAocHRyLT54dGFsICE9IGNrX3JlZi5yYXRlKQorCQkJY29udGludWU7CisKKwkJaGlnaGVzdF9yYXRlID0gcHRyLT5yYXRlOworCisJCS8qIENhbiBjaGVjayBvbmx5IGFmdGVyIHh0YWwgZnJlcXVlbmN5IGNoZWNrICovCisJCWlmIChwdHItPnJhdGUgPD0gcmF0ZSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBoaWdoZXN0X3JhdGU7Cit9CisKKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpbnQgIHJldCA9IC1FSU5WQUw7CisJaW50ICBkc29yX2V4cDsKKwlfX3UxNiAgcmVndmFsOworCXVuc2lnbmVkIGxvbmcgIGZsYWdzOworCisJaWYgKGNsay0+ZmxhZ3MgJiBSQVRFX0NLQ1RMKSB7CisJCWRzb3JfZXhwID0gY2FsY19kc29yX2V4cChjbGssIHJhdGUpOworCQlpZiAoZHNvcl9leHAgPiAzKQorCQkJZHNvcl9leHAgPSAtRUlOVkFMOworCQlpZiAoZHNvcl9leHAgPCAwKQorCQkJcmV0dXJuIGRzb3JfZXhwOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKKwkJcmVndmFsID0gb21hcF9yZWFkdyhBUk1fQ0tDVEwpOworCQlyZWd2YWwgJj0gfigzIDw8IGNsay0+cmF0ZV9vZmZzZXQpOworCQlyZWd2YWwgfD0gZHNvcl9leHAgPDwgY2xrLT5yYXRlX29mZnNldDsKKwkJcmVndmFsID0gdmVyaWZ5X2NrY3RsX3ZhbHVlKHJlZ3ZhbCk7CisJCW9tYXBfd3JpdGV3KHJlZ3ZhbCwgQVJNX0NLQ1RMKTsKKwkJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyAoMSA8PCBkc29yX2V4cCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCQlyZXQgPSAwOworCX0gZWxzZSBpZihjbGstPnNldF9yYXRlICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCQlyZXQgPSBjbGstPnNldF9yYXRlKGNsaywgcmF0ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCX0KKworCWlmICh1bmxpa2VseShyZXQgPT0gMCAmJiAoY2xrLT5mbGFncyAmIFJBVEVfUFJPUEFHQVRFUykpKQorCQlwcm9wYWdhdGVfcmF0ZShjbGspOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3NldF9yYXRlKTsKKworCitzdGF0aWMgdW5zaWduZWQgY2FsY19leHRfZHNvcih1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgZHNvcjsKKworCS8qIE1DTEsgYW5kIEJDTEsgZGl2aXNvciBzZWxlY3Rpb24gaXMgbm90IGxpbmVhcjoKKwkgKiBmcmVxID0gOTZNSHogLyBkc29yCisJICoKKwkgKiBSQVRJT19TRUwgcmFuZ2U6IGRzb3IgPC0+IFJBVElPX1NFTAorCSAqIDAuLjY6IChSQVRJT19TRUwrMikgPC0+IChkc29yLTIpCisJICogNi4uNDg6ICAoOCsoUkFUSU9fU0VMLTYpKjIpIDwtPiAoKGRzb3ItOCkvMis2KQorCSAqIE1pbmltdW0gZHNvciBpcyAyIGFuZCBtYXhpbXVtIGlzIDk2LiBPZGQgZGl2aXNvcnMgc3RhcnRpbmcgZnJvbSA5CisJICogY2FuIG5vdCBiZSB1c2VkLgorCSAqLworCWZvciAoZHNvciA9IDI7IGRzb3IgPCA5NjsgKytkc29yKSB7CisJCWlmICgoZHNvciAmIDEpICYmIGRzb3IgPiA4KQorCQkgIAljb250aW51ZTsKKwkJaWYgKHJhdGUgPj0gOTYwMDAwMDAgLyBkc29yKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBkc29yOworfQorCisKK3N0YXRpYyBpbnQgc2V0X2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGRzb3I7CisJX191MTYgcmF0aW9fYml0czsKKworCWRzb3IgPSBjYWxjX2V4dF9kc29yKHJhdGUpOworCWNsay0+cmF0ZSA9IDk2MDAwMDAwIC8gZHNvcjsKKwlpZiAoZHNvciA+IDgpCisJCXJhdGlvX2JpdHMgPSAoKGRzb3IgLSA4KSAvIDIgKyA2KSA8PCAyOworCWVsc2UKKwkJcmF0aW9fYml0cyA9IChkc29yIC0gMikgPDwgMjsKKworCXJhdGlvX2JpdHMgfD0gb21hcF9yZWFkdyhjbGstPmVuYWJsZV9yZWcpICYgfjB4ZmQ7CisJb21hcF93cml0ZXcocmF0aW9fYml0cywgY2xrLT5lbmFibGVfcmVnKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBsb25nIHJvdW5kX2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiA5NjAwMDAwMCAvIGNhbGNfZXh0X2Rzb3IocmF0ZSk7Cit9CisKKworc3RhdGljIHZvaWQgaW5pdF9leHRfY2xrKHN0cnVjdCBjbGsgKiAgY2xrKQoreworCXVuc2lnbmVkIGRzb3I7CisJX191MTYgcmF0aW9fYml0czsKKworCS8qIERldGVybWluZSBjdXJyZW50IHJhdGUgYW5kIGVuc3VyZSBjbG9jayBpcyBiYXNlZCBvbiA5Nk1IeiBBUExMICovCisJcmF0aW9fYml0cyA9IG9tYXBfcmVhZHcoY2xrLT5lbmFibGVfcmVnKSAmIH4xOworCW9tYXBfd3JpdGV3KHJhdGlvX2JpdHMsIGNsay0+ZW5hYmxlX3JlZyk7CisKKwlyYXRpb19iaXRzID0gKHJhdGlvX2JpdHMgJiAweGZjKSA+PiAyOworCWlmIChyYXRpb19iaXRzID4gNikKKwkJZHNvciA9IChyYXRpb19iaXRzIC0gNikgKiAyICsgODsKKwllbHNlCisJCWRzb3IgPSByYXRpb19iaXRzICsgMjsKKworCWNsay0+IHJhdGUgPSA5NjAwMDAwMCAvIGRzb3I7Cit9CisKKworaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCit7CisJZG93bigmY2xvY2tzX3NlbSk7CisJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7CisJaWYgKGNsay0+aW5pdCkKKwkJY2xrLT5pbml0KGNsayk7CisJdXAoJmNsb2Nrc19zZW0pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfcmVnaXN0ZXIpOworCit2b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlkb3duKCZjbG9ja3Nfc2VtKTsKKwlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKKwl1cCgmY2xvY2tzX3NlbSk7Cit9CitFWFBPUlRfU1lNQk9MKGNsa191bnJlZ2lzdGVyKTsKKworCisKK2ludCBfX2luaXQgY2xrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICoqICBjbGtwOworCWNvbnN0IHN0cnVjdCBvbWFwX2Nsb2NrX2NvbmZpZyAqaW5mbzsKKwlpbnQgY3J5c3RhbF90eXBlID0gMDsgLyogRGVmYXVsdCAxMiBNSHogKi8KKworCWZvciAoY2xrcCA9IG9uY2hpcF9jbGtzOyBjbGtwIDwgb25jaGlwX2Nsa3MrQVJSQVlfU0laRShvbmNoaXBfY2xrcyk7IGNsa3ArKykgeworCQlpZiAoKCgqY2xrcCktPmZsYWdzICZDTE9DS19JTl9PTUFQMTUxMCkgJiYgY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJCWNsa19yZWdpc3RlcigqY2xrcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoKCpjbGtwKS0+ZmxhZ3MgJkNMT0NLX0lOX09NQVAxNlhYKSAmJiBjcHVfaXNfb21hcDE2eHgoKSkgeworCQkJY2xrX3JlZ2lzdGVyKCpjbGtwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCgoKmNsa3ApLT5mbGFncyAmQ0xPQ0tfSU5fT01BUDczMCkgJiYgY3B1X2lzX29tYXA3MzAoKSkgeworCQkJY2xrX3JlZ2lzdGVyKCpjbGtwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJaW5mbyA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19DTE9DSywgc3RydWN0IG9tYXBfY2xvY2tfY29uZmlnKTsKKwlpZiAoaW5mbyAhPSBOVUxMKSB7CisJCWlmICghY3B1X2lzX29tYXAxNTEwKCkpCisJCQljcnlzdGFsX3R5cGUgPSBpbmZvLT5zeXN0ZW1fY2xvY2tfdHlwZTsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApCisJY2tfcmVmLnJhdGUgPSAxMzAwMDAwMDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNyeXN0YWxfdHlwZSA9PSAyKQorCQlja19yZWYucmF0ZSA9IDE5MjAwMDAwOworI2VuZGlmCisKKwkvKiBXZSB3YW50IHRvIGJlIGluIHN5bmNyb25vdXMgc2NhbGFibGUgbW9kZSAqLworCW9tYXBfd3JpdGV3KDB4MTAwMCwgQVJNX1NZU1NUKTsKKworCS8qIEZpbmQgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGZyZXF1ZW5jeSBhbmQgZW5hYmxlIGl0ICovCisJaWYgKHNlbGVjdF90YWJsZV9yYXRlKCZ2aXJ0dWFsX2NrX21wdSwgfjApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3lzdGVtIGZyZXF1ZW5jaWVzIG5vdCBzZXQuIENoZWNrIHlvdXIgY29uZmlnLlxuIik7CisJCS8qIEd1ZXNzIHNhbmUgdmFsdWVzICg2ME1IeikgKi8KKwkJb21hcF93cml0ZXcoMHgyMjkwLCBEUExMX0NUTCk7CisJCW9tYXBfd3JpdGV3KDB4MTAwNSwgQVJNX0NLQ1RMKTsKKwkJY2tfZHBsbDEucmF0ZSA9IDYwMDAwMDAwOworCQlwcm9wYWdhdGVfcmF0ZSgmY2tfZHBsbDEpOworCQlwcmludGsoS0VSTl9JTkZPICJDbG9ja2luZyByYXRlICh4dGFsL0RQTEwxL01QVSk6ICVsZC8lbGQvJWxkXG4iLAorCQkgICAgICAgY2tfcmVmLnJhdGUsIGNrX2RwbGwxLnJhdGUsIGFybV9jay5yYXRlKTsKKwl9CisKKwkvKiBDYWNoZSByYXRlcyBmb3IgY2xvY2tzIGNvbm5lY3RlZCB0byBja19yZWYgKG5vdCBkcGxsMSkgKi8KKwlwcm9wYWdhdGVfcmF0ZSgmY2tfcmVmKTsKKworI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIKKwkvKiBTZWxlY3Qgc2xpY2VyIG91dHB1dCBhcyBPTUFQIGlucHV0IGNsb2NrICovCisJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQNzMwX1BDQ19VUExEX0NUUkwpICYgfjB4MSwgT01BUDczMF9QQ0NfVVBMRF9DVFJMKTsKKyNlbmRpZgorCisJLyogVHVybiBvZmYgRFNQIGFuZCBBUk1fVElNWE8uIE1ha2Ugc3VyZSBBUk1fSU5USENLIGlzIG5vdCBkaXZpZGVkICovCisJb21hcF93cml0ZXcob21hcF9yZWFkdyhBUk1fQ0tDVEwpICYgMHgwZmZmLCBBUk1fQ0tDVEwpOworCisJLyogUHV0IERTUC9NUFVJIGludG8gcmVzZXQgdW50aWwgbmVlZGVkICovCisJb21hcF93cml0ZXcoMCwgQVJNX1JTVENUMSk7CisJb21hcF93cml0ZXcoMSwgQVJNX1JTVENUMik7CisJb21hcF93cml0ZXcoMHg0MDAsIEFSTV9JRExFQ1QxKTsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIE9NQVA1OTEwIEVycmF0dW0gU1lTX0RNQV8xLCBiaXQgRE1BQ0tfUkVRIChiaXQgOCkKKwkgKiBvZiB0aGUgQVJNX0lETEVDVDIgcmVnaXN0ZXIgbXVzdCBiZSBzZXQgdG8gemVyby4gVGhlIHBvd2VyLW9uCisJICogZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGJpdCBpcyBvbmUuCisJICovCisJb21hcF93cml0ZXcoMHgwMDAwLCBBUk1fSURMRUNUMik7CS8qIFR1cm4gTENEIGNsb2NrIG9mZiBhbHNvICovCisKKwkvKgorCSAqIE9ubHkgZW5hYmxlIHRob3NlIGNsb2NrcyB3ZSB3aWxsIG5lZWQsIGxldCB0aGUgZHJpdmVycworCSAqIGVuYWJsZSBvdGhlciBjbG9ja3MgYXMgbmVjZXNzYXJ5CisJICovCisJY2xrX3VzZSgmYXJtcGVyX2NrKTsKKwljbGtfdXNlKCZhcm14b3JfY2spOworCWNsa191c2UoJmFybXRpbV9jayk7CisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCisJCWNsa19lbmFibGUoJmFybV9ncGlvX2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMwZGRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIGNvcnBvcmF0aW9uCisgKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KKyAqICBCYXNlZCBvbiBjbG9ja3MuaCBieSBUb255IExpbmRncmVuLCBHb3Jkb24gTWNOdXR0IGFuZCBSaWRnZVJ1biwgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fT01BUF9DTE9DS19ICisjZGVmaW5lIF9fQVJDSF9BUk1fT01BUF9DTE9DS19ICisKK3N0cnVjdCBtb2R1bGU7CisKK3N0cnVjdCBjbGsgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJc3RydWN0IGNsawkJKnBhcmVudDsKKwl1bnNpZ25lZCBsb25nCQlyYXRlOworCV9fczgJCQl1c2Vjb3VudDsKKwlfX3UxNgkJCWZsYWdzOworCV9fdTMyCQkJZW5hYmxlX3JlZzsKKwlfX3U4CQkJZW5hYmxlX2JpdDsKKwlfX3U4CQkJcmF0ZV9vZmZzZXQ7CisJdm9pZAkJCSgqcmVjYWxjKShzdHJ1Y3QgY2xrICopOworCWludAkJCSgqc2V0X3JhdGUpKHN0cnVjdCBjbGsgKiwgdW5zaWduZWQgbG9uZyk7CisJbG9uZwkJCSgqcm91bmRfcmF0ZSkoc3RydWN0IGNsayAqLCB1bnNpZ25lZCBsb25nKTsKKwl2b2lkCQkJKCppbml0KShzdHJ1Y3QgY2xrICopOworfTsKKworCitzdHJ1Y3QgbXB1X3JhdGUgeworCXVuc2lnbmVkIGxvbmcJCXJhdGU7CisJdW5zaWduZWQgbG9uZwkJeHRhbDsKKwl1bnNpZ25lZCBsb25nCQlwbGxfcmF0ZTsKKwlfX3UxNgkJCWNrY3RsX3ZhbDsKKwlfX3UxNgkJCWRwbGxjdGxfdmFsOworfTsKKworCisvKiBDbG9jayBmbGFncyAqLworI2RlZmluZSBSQVRFX0NLQ1RMCQkxCisjZGVmaW5lIFJBVEVfRklYRUQJCTIKKyNkZWZpbmUgUkFURV9QUk9QQUdBVEVTCQk0CisjZGVmaW5lIFZJUlRVQUxfQ0xPQ0sJCTgKKyNkZWZpbmUgQUxXQVlTX0VOQUJMRUQJCTE2CisjZGVmaW5lIEVOQUJMRV9SRUdfMzJCSVQJMzIKKyNkZWZpbmUgQ0xPQ0tfSU5fT01BUDE2WFgJNjQKKyNkZWZpbmUgQ0xPQ0tfSU5fT01BUDE1MTAJMTI4CisjZGVmaW5lIENMT0NLX0lOX09NQVA3MzAJMjU2CisKKy8qIEFSTV9DS0NUTCBiaXQgc2hpZnRzICovCisjZGVmaW5lIENLQ1RMX1BFUkRJVl9PRkZTRVQJMAorI2RlZmluZSBDS0NUTF9MQ0RESVZfT0ZGU0VUCTIKKyNkZWZpbmUgQ0tDVExfQVJNRElWX09GRlNFVAk0CisjZGVmaW5lIENLQ1RMX0RTUERJVl9PRkZTRVQJNgorI2RlZmluZSBDS0NUTF9UQ0RJVl9PRkZTRVQJOAorI2RlZmluZSBDS0NUTF9EU1BNTVVESVZfT0ZGU0VUCTEwCisvKiNkZWZpbmUgQVJNX1RJTVhPCQkxMiovCisjZGVmaW5lIEVOX0RTUENLCQkxMworLyojZGVmaW5lIEFSTV9JTlRIQ0tfU0VMCTE0Ki8gLyogRGl2aWRlLWJ5LTIgZm9yIG1wdSBpbnRoX2NrICovCisKKy8qIEFSTV9JRExFQ1QxIGJpdCBzaGlmdHMgKi8KKy8qI2RlZmluZSBJRExXRFRfQVJNCTAqLworLyojZGVmaW5lIElETFhPUlBfQVJNCTEqLworLyojZGVmaW5lIElETFBFUl9BUk0JMiovCisvKiNkZWZpbmUgSURMTENEX0FSTQkzKi8KKy8qI2RlZmluZSBJRExMQl9BUk0JNCovCisvKiNkZWZpbmUgSURMSFNBQl9BUk0JNSovCisvKiNkZWZpbmUgSURMSUZfQVJNCTYqLworLyojZGVmaW5lIElETERQTExfQVJNCTcqLworLyojZGVmaW5lIElETEFQSV9BUk0JOCovCisvKiNkZWZpbmUgSURMVElNX0FSTQk5Ki8KKy8qI2RlZmluZSBTRVRBUk1fSURMRQkxMSovCisKKy8qIEFSTV9JRExFQ1QyIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRU5fV0RUQ0sJMAorI2RlZmluZSBFTl9YT1JQQ0sJMQorI2RlZmluZSBFTl9QRVJDSwkyCisjZGVmaW5lIEVOX0xDRENLCTMKKyNkZWZpbmUgRU5fTEJDSwkJNCAvKiBOb3Qgb24gMTYxMC8xNzEwICovCisvKiNkZWZpbmUgRU5fSFNBQkNLCTUqLworI2RlZmluZSBFTl9BUElDSwk2CisjZGVmaW5lIEVOX1RJTUNLCTcKKyNkZWZpbmUgRE1BQ0tfUkVRCTgKKyNkZWZpbmUgRU5fR1BJT0NLCTkgLyogTm90IG9uIDE2MTAvMTcxMCAqLworLyojZGVmaW5lIEVOX0xCRlJFRUNLCTEwKi8KKyNkZWZpbmUgRU5fQ0tPVVRfQVJNCTExCisKKy8qIEFSTV9JRExFQ1QzIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRU5fT0NQSV9DSwkwCisjZGVmaW5lIEVOX1RDMV9DSwkyCisjZGVmaW5lIEVOX1RDMl9DSwk0CisKKy8qIFZhcmlvdXMgcmVnaXN0ZXIgZGVmaW5lcyBmb3IgY2xvY2sgY29udHJvbHMgc2NhdHRlcmVkIGFyb3VuZCBPTUFQIGNoaXAgKi8KKyNkZWZpbmUgVVNCX01DTEtfRU5fQklUCQk0CS8qIEluIFVMUERfQ0xLQ19DVFJMICovCisjZGVmaW5lIFVTQl9IT1NUX0hIQ19VSE9TVF9FTgk5CS8qIEluIE1PRF9DT05GX0NUUkxfMCAqLworI2RlZmluZSBTV0RfVUxQRF9QTExfQ0xLX1JFUQkxCS8qIEluIFNXRF9DTEtfRElWX0NUUkxfU0VMICovCisjZGVmaW5lIENPTV9VTFBEX1BMTF9DTEtfUkVRCTEJLyogSW4gQ09NX0NMS19ESVZfQ1RSTF9TRUwgKi8KKyNkZWZpbmUgU1dEX0NMS19ESVZfQ1RSTF9TRUwJMHhmZmZlMDg3NAorI2RlZmluZSBDT01fQ0xLX0RJVl9DVFJMX1NFTAkweGZmZmUwODc4CisKKworaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOworaW50IGNsa19pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjVjZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5jCkBAIC0wLDAgKzEsNTQ5IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5jCisgKgorICogQ29kZSBjb21tb24gdG8gYWxsIE9NQVAgbWFjaGluZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKworI2RlZmluZSBERUJVRyAxCisKK3N0cnVjdCBvbWFwX2lkIHsKKwl1MTYJanRhZ19pZDsJLyogVXNlZCB0byBkZXRlcm1pbmUgT01BUCB0eXBlICovCisJdTgJZGllX3JldjsJLyogUHJvY2Vzc29yIHJldmlzaW9uICovCisJdTMyCW9tYXBfaWQ7CS8qIE9NQVAgcmV2aXNpb24gKi8KKwl1MzIJdHlwZTsJCS8qIENwdSBpZCBiaXRzIFszMTowOF0sIGNwdSBjbGFzcyBiaXRzIFswNzowMF0gKi8KK307CisKKy8qIFJlZ2lzdGVyIHZhbHVlcyB0byBkZXRlY3QgdGhlIE9NQVAgdmVyc2lvbiAqLworc3RhdGljIHN0cnVjdCBvbWFwX2lkIG9tYXBfaWRzW10gX19pbml0ZGF0YSA9IHsKKwl7IC5qdGFnX2lkID0gMHgzNTVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MDczMDAxMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1NWYsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAwMDAsIC50eXBlID0gMHgwNzMwMDMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjQ3MCwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMxMDEwMCwgLnR5cGUgPSAweDE1MTAwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MTYxMDAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjExMDAwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDMsIC5vbWFwX2lkID0gMHgwMzMyMDEwMCwgLnR5cGUgPSAweDE2MTAwYzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMjAwLCAudHlwZSA9IDB4MTYxMDBkMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2MTMsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAzMDAsIC50eXBlID0gMHgxNjEwZWYwMH0sCisJeyAuanRhZ19pZCA9IDB4YjYxMywgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDMwMCwgLnR5cGUgPSAweDE2MTBlZjAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzIwMTAwLCAudHlwZSA9IDB4MTYxMTAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1OGMsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMjAyMDAsIC50eXBlID0gMHgxNjExMGIwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU4YywgLmRpZV9yZXYgPSAweDMsIC5vbWFwX2lkID0gMHgwMzMyMDIwMCwgLnR5cGUgPSAweDE2MTEwYzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNjVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwNDAwLCAudHlwZSA9IDB4MTYyMTIzMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2NWYsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjA0MDAsIC50eXBlID0gMHgxNjIxMjMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjY1ZiwgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMyMDUwMCwgLnR5cGUgPSAweDE2MjEyMzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNWY3LCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzMwMDAwLCAudHlwZSA9IDB4MTcxMDAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1ZjcsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMzAxMDAsIC50eXBlID0gMHgxNzEwMDAwMH0sCisJeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDIsIC5vbWFwX2lkID0gMHgwMzMzMDEwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKK307CisKKy8qCisgKiBHZXQgT01BUCB0eXBlIGZyb20gUFJPRF9JRC4KKyAqIDE3MTAgaGFzIHRoZSBQUk9EX0lEIGluIGJpdHMgMTU6MDAsIG5vdCBpbiAxNjowMSBhcyBkb2N1bWVudGVkIGluIFRSTS4KKyAqIDE1MTAgUFJPRF9JRCBpcyBlbXB0eSwgYW5kIDE2MTAgUFJPRF9JRCBkb2VzIG5vdCBtYWtlIHNlbnNlLgorICogVW5kb2N1bWVudGVkIHJlZ2lzdGVyIGluIFRFU1QgQkxPQ0sgaXMgdXNlZCBhcyBmYWxsYmFjazsgVGhpcyBzZWVtcyB0bworICogd29yayBvbiAxNTEwLCAxNjEwICYgMTcxMC4gVGhlIG9mZmljaWFsIHdheSBob3BlZnVsbHkgd2lsbCB3b3JrIGluIGZ1dHVyZQorICogcHJvY2Vzc29ycy4KKyAqLworc3RhdGljIHUxNiBfX2luaXQgb21hcF9nZXRfanRhZ19pZCh2b2lkKQoreworCXUzMiBwcm9kX2lkLCBvbWFwX2lkOworCisJcHJvZF9pZCA9IG9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzEpOworCW9tYXBfaWQgPSBvbWFwX3JlYWRsKE9NQVAzMl9JRF8xKTsKKworCS8qIENoZWNrIGZvciB1bnVzYWJsZSBPTUFQX1BST0RVQ1RJT05fSURfMSBvbiAxNjExQi81OTEyIGFuZCA3MzAgKi8KKwlpZiAoKChwcm9kX2lkID4+IDIwKSA9PSAwKSB8fCAocHJvZF9pZCA9PSBvbWFwX2lkKSkKKwkJcHJvZF9pZCA9IDA7CisJZWxzZQorCQlwcm9kX2lkICY9IDB4ZmZmZjsKKworCWlmIChwcm9kX2lkKQorCQlyZXR1cm4gcHJvZF9pZDsKKworCS8qIFVzZSBPTUFQMzJfSURfMSBhcyBmYWxsYmFjayAqLworCXByb2RfaWQgPSAoKG9tYXBfaWQgPj4gMTIpICYgMHhmZmZmKTsKKworCXJldHVybiBwcm9kX2lkOworfQorCisvKgorICogR2V0IE9NQVAgcmV2aXNpb24gZnJvbSBESUVfUkVWLgorICogRWFybHkgMTcxMCBwcm9jZXNzb3JzIG1heSBoYXZlIGJyb2tlbiBPTUFQX0RJRV9JRCwgaXQgY29udGFpbnMgUFJPRF9JRC4KKyAqIFVuZG9jdW1lbnRlZCByZWdpc3RlciBpbiB0aGUgVEVTVCBCTE9DSyBpcyB1c2VkIGFzIGZhbGxiYWNrLgorICogUkVWSVNJVDogVGhpcyBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgb24gMTUxMAorICovCitzdGF0aWMgdTggX19pbml0IG9tYXBfZ2V0X2RpZV9yZXYodm9pZCkKK3sKKwl1MzIgZGllX3JldjsKKworCWRpZV9yZXYgPSBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpOworCisJLyogQ2hlY2sgZm9yIGJyb2tlbiBPTUFQX0RJRV9JRCBvbiBlYXJseSAxNzEwICovCisJaWYgKCgoZGllX3JldiA+PiAxMikgJiAweGZmZmYpID09IG9tYXBfZ2V0X2p0YWdfaWQoKSkKKwkJZGllX3JldiA9IDA7CisKKwlkaWVfcmV2ID0gKGRpZV9yZXYgPj4gMTcpICYgMHhmOworCWlmIChkaWVfcmV2KQorCQlyZXR1cm4gZGllX3JldjsKKworCWRpZV9yZXYgPSAob21hcF9yZWFkbChPTUFQMzJfSURfMSkgPj4gMjgpICYgMHhmOworCisJcmV0dXJuIGRpZV9yZXY7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2NoZWNrX3JldmlzaW9uKHZvaWQpCit7CisJaW50IGk7CisJdTE2IGp0YWdfaWQ7CisJdTggZGllX3JldjsKKwl1MzIgb21hcF9pZDsKKwl1OCBjcHVfdHlwZTsKKworCWp0YWdfaWQgPSBvbWFwX2dldF9qdGFnX2lkKCk7CisJZGllX3JldiA9IG9tYXBfZ2V0X2RpZV9yZXYoKTsKKwlvbWFwX2lkID0gb21hcF9yZWFkbChPTUFQMzJfSURfMCk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiT01BUF9ESUVfSURfMDogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzApKTsKKwlwcmludGsoIk9NQVBfRElFX0lEXzE6IDB4JTA4eCBESUVfUkVWOiAlaVxuIiwKKwkJb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKSwKKwkgICAgICAgKG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSkgPj4gMTcpICYgMHhmKTsKKwlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzApKTsKKwlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8xOiAweCUwOHggSlRBR19JRDogMHglMDR4XG4iLAorCQlvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKSwKKwkJb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMSkgJiAweGZmZmYpOworCXByaW50aygiT01BUDMyX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMCkpOworCXByaW50aygiT01BUDMyX0lEXzE6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMSkpOworCXByaW50aygiSlRBR19JRDogMHglMDR4IERJRV9SRVY6ICVpXG4iLCBqdGFnX2lkLCBkaWVfcmV2KTsKKyNlbmRpZgorCisJc3lzdGVtX3NlcmlhbF9oaWdoID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8wKTsKKwlzeXN0ZW1fc2VyaWFsX2xvdyA9IG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSk7CisKKwkvKiBGaXJzdCBjaGVjayBvbmx5IHRoZSBtYWpvciB2ZXJzaW9uIGluIGEgc2FmZSB3YXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgeworCQlpZiAoanRhZ19pZCA9PSAob21hcF9pZHNbaV0uanRhZ19pZCkpIHsKKwkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gZmluZCB0aGUgZGllIHJldmlzaW9uICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcF9pZHMpOyBpKyspIHsKKwkJaWYgKGp0YWdfaWQgPT0gb21hcF9pZHNbaV0uanRhZ19pZCAmJiBkaWVfcmV2ID09IG9tYXBfaWRzW2ldLmRpZV9yZXYpIHsKKwkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGaW5hbGx5IGNoZWNrIGFsc28gdGhlIG9tYXBfaWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgeworCQlpZiAoanRhZ19pZCA9PSBvbWFwX2lkc1tpXS5qdGFnX2lkCisJCSAgICAmJiBkaWVfcmV2ID09IG9tYXBfaWRzW2ldLmRpZV9yZXYKKwkJICAgICYmIG9tYXBfaWQgPT0gb21hcF9pZHNbaV0ub21hcF9pZCkgeworCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEFkZCB0aGUgY3B1IGNsYXNzIGluZm8gKDd4eCwgMTV4eCwgMTZ4eCwgMjR4eCkgKi8KKwljcHVfdHlwZSA9IHN5c3RlbV9yZXYgPj4gMjQ7CisKKwlzd2l0Y2ggKGNwdV90eXBlKSB7CisJY2FzZSAweDA3OgorCQlzeXN0ZW1fcmV2IHw9IDB4MDc7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJc3lzdGVtX3JldiB8PSAweDE1OworCQlicmVhazsKKwljYXNlIDB4MTY6CisJY2FzZSAweDE3OgorCQlzeXN0ZW1fcmV2IHw9IDB4MTY7CisJCWJyZWFrOworCWNhc2UgMHgyNDoKKwkJc3lzdGVtX3JldiB8PSAweDI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIlVua25vd24gT01BUCBjcHUgdHlwZTogMHglMDJ4XG4iLCBjcHVfdHlwZSk7CisJfQorCisJcHJpbnRrKCJPTUFQJTA0eCIsIHN5c3RlbV9yZXYgPj4gMTYpOworCWlmICgoc3lzdGVtX3JldiA+PiA4KSAmIDB4ZmYpCisJCXByaW50aygiJXgiLCAoc3lzdGVtX3JldiA+PiA4KSAmIDB4ZmYpOworCXByaW50aygiIHJldmlzaW9uICVpIGhhbmRsZWQgYXMgJTAyeHh4IGlkOiAlMDh4JTA4eFxuIiwKKwkgICAgICAgZGllX3Jldiwgc3lzdGVtX3JldiAmIDB4ZmYsIHN5c3RlbV9zZXJpYWxfbG93LAorCSAgICAgICBzeXN0ZW1fc2VyaWFsX2hpZ2gpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT01BUCBJL08gbWFwcGluZworICoKKyAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgbWF5IHByb3ZpZGUgdGhlIGV4dHJhIG1hcHBpbmcgYmVzaWRlcyB0aGUKKyAqIGRlZmF1bHQgbWFwcGluZyBwcm92aWRlZCBoZXJlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IElPX1ZJUlQsICAgICAgCUlPX1BIWVMsICAgICAgICAgICAgIElPX1NJWkUsICAgICAgICAJICAgTVRfREVWSUNFIH0sCit9OworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwNzMwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgT01BUDczMF9EU1BfQkFTRSwgICAgT01BUDczMF9EU1BfU1RBUlQsICAgIE9NQVA3MzBfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAorIHsgT01BUDczMF9EU1BSRUdfQkFTRSwgT01BUDczMF9EU1BSRUdfU1RBUlQsIE9NQVA3MzBfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAorIHsgT01BUDczMF9TUkFNX0JBU0UsICAgT01BUDczMF9TUkFNX1NUQVJULCAgIE9NQVA3MzBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMTUxMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IE9NQVAxNTEwX0RTUF9CQVNFLCAgICBPTUFQMTUxMF9EU1BfU1RBUlQsICAgIE9NQVAxNTEwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKKyB7IE9NQVAxNTEwX0RTUFJFR19CQVNFLCBPTUFQMTUxMF9EU1BSRUdfU1RBUlQsIE9NQVAxNTEwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKKyB7IE9NQVAxNTEwX1NSQU1fQkFTRSwgICBPTUFQMTUxMF9TUkFNX1NUQVJULCAgIE9NQVAxNTEwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE2MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBPTUFQMTZYWF9EU1BfQkFTRSwgICAgT01BUDE2WFhfRFNQX1NUQVJULCAgICBPTUFQMTZYWF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCisgeyBPTUFQMTZYWF9EU1BSRUdfQkFTRSwgT01BUDE2WFhfRFNQUkVHX1NUQVJULCBPTUFQMTZYWF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCisgeyBPTUFQMTZYWF9TUkFNX0JBU0UsICAgT01BUDE2WFhfU1JBTV9TVEFSVCwgICBPTUFQMTYxMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDU5MTJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBPTUFQMTZYWF9EU1BfQkFTRSwgICAgT01BUDE2WFhfRFNQX1NUQVJULCAgICBPTUFQMTZYWF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCisgeyBPTUFQMTZYWF9EU1BSRUdfQkFTRSwgT01BUDE2WFhfRFNQUkVHX1NUQVJULCBPTUFQMTZYWF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCisvKgorICogVGhlIE9NQVA1OTEyIGhhcyAyNTBrQnl0ZSBpbnRlcm5hbCBTUkFNLiBCZWNhdXNlIHRoZSBtYXBwaW5nIGlzIGJhc2VlZCBvbiBwYWdlCisgKiBzaXplICg0a0J5dGUpLCBpdCBzZWVtcyB0aGF0IHRoZSBsYXN0IDJrQnl0ZSAoPTB4ODAwKSBvZiB0aGUgMjUwa0J5dGUgYXJlIG5vdCBtYXBwZWQuCisgKiBBZGQgYWRkaXRpb25hbCAya0J5dGUgKDB4ODAwKSBzbyB0aGF0IHRoZSBsYXN0IHBhZ2UgaXMgbWFwcGVkIGFuZCB0aGUgbGFzdCAya0J5dGUKKyAqIGNhbiBiZSB1c2VkLgorICovCisgeyBPTUFQMTZYWF9TUkFNX0JBU0UsICAgT01BUDE2WFhfU1JBTV9TVEFSVCwgICBPTUFQNTkxMl9TUkFNX1NJWkUgKyAweDgwMCwgICBNVF9ERVZJQ0UgfQorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworc3RhdGljIHZvaWQgX19pbml0IF9vbWFwX21hcF9pbyh2b2lkKQoreworCWluaXRpYWxpemVkID0gMTsKKworCS8qIFdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgSU8gc3BhY2UgbWFwcGluZyBiZWZvcmUgd2UgY2FuIHJ1bgorCSAqIGNwdV9pc19vbWFweHh4KCkgbWFjcm9zLiAqLworCWlvdGFibGVfaW5pdChvbWFwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcF9pb19kZXNjKSk7CisJb21hcF9jaGVja19yZXZpc2lvbigpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwNzMwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDczMF9pb19kZXNjKSk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJaW90YWJsZV9pbml0KG9tYXAxNTEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDE1MTBfaW9fZGVzYykpOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwMTYxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNjEwX2lvX2Rlc2MpKTsKKwl9CisJaWYgKGNwdV9pc19vbWFwNTkxMigpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwNTkxMl9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA1OTEyX2lvX2Rlc2MpKTsKKwl9CisjZW5kaWYKKworCS8qIFJFVklTSVQ6IFJlZmVyIHRvIE9NQVA1OTEwIEVycmF0YSwgQWR2aXNvcnkgU1lTXzE6ICJUaW1lb3V0IEFib3J0CisJICogb24gYSBQb3N0ZWQgV3JpdGUgaW4gdGhlIFRJUEIgQnJpZGdlIi4KKwkgKi8KKwlvbWFwX3dyaXRldygweDAsIE1QVV9QVUJMSUNfVElQQl9DTlRMKTsKKwlvbWFwX3dyaXRldygweDAsIE1QVV9QUklWQVRFX1RJUEJfQ05UTCk7CisKKwkvKiBNdXN0IGluaXQgY2xvY2tzIGVhcmx5IHRvIGFzc3VyZSB0aGF0IHRpbWVyIGludGVycnVwdCB3b3JrcworCSAqLworCWNsa19pbml0KCk7Cit9CisKKy8qCisgKiBUaGlzIHNob3VsZCBvbmx5IGdldCBjYWxsZWQgZnJvbSBib2FyZCBzcGVjaWZpYyBpbml0CisgKi8KK3ZvaWQgb21hcF9tYXBfaW8odm9pZCkKK3sKKwlpZiAoIWluaXRpYWxpemVkKQorCQlfb21hcF9tYXBfaW8oKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb21hcF9zZXJpYWxfaW4oc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICp1cCwKKwkJCQkJICBpbnQgb2Zmc2V0KQoreworCW9mZnNldCA8PD0gdXAtPnJlZ3NoaWZ0OworCXJldHVybiAodW5zaWduZWQgaW50KV9fcmF3X3JlYWRiKHVwLT5tZW1iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfc2VyaWFsX291dHAoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwLCBpbnQgb2Zmc2V0LAorCQkJCSAgICBpbnQgdmFsdWUpCit7CisJb2Zmc2V0IDw8PSBwLT5yZWdzaGlmdDsKKwlfX3Jhd193cml0ZWIodmFsdWUsIHAtPm1lbWJhc2UgKyBvZmZzZXQpOworfQorCisvKgorICogSW50ZXJuYWwgVUFSVHMgbmVlZCB0byBiZSBpbml0aWFsaXplZCBmb3IgdGhlIDgyNTAgYXV0b2NvbmZpZyB0byB3b3JrCisgKiBwcm9wZXJseS4gTm90ZSB0aGF0IHRoZSBUWCB3YXRlcm1hcmsgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBuZWVkZWQKKyAqIG9uY2UgdGhlIDgyNTAuYyB3YXRlcm1hcmsgaGFuZGxpbmcgY29kZSBpcyBtZXJnZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9yZXNldChzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnApCit7CisJb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfTURSMSwgMHgwNyk7CS8qIGRpc2FibGUgVUFSVCAqLworCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX1NDUiwgMHgwOCk7CS8qIFRYIHdhdGVybWFyayAqLworCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX01EUjEsIDB4MDApOwkvKiBlbmFibGUgVUFSVCAqLworCisJaWYgKCFjcHVfaXNfb21hcDE1MTAoKSkgeworCQlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9TWVNDLCAweDAxKTsKKwkJd2hpbGUgKCEob21hcF9zZXJpYWxfaW4ocCwgVUFSVF9PTUFQX1NZU0MpICYgMHgwMSkpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1lbWJhc2UJPSAoY2hhciopSU9fQUREUkVTUyhPTUFQX1VBUlQxX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKU9NQVBfVUFSVDFfQkFTRSwKKwkJLmlycQkJPSBJTlRfVUFSVDEsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBPTUFQMTZYWF9CQVNFX0JBVUQgKiAxNiwKKwl9LAorCXsKKwkJLm1lbWJhc2UJPSAoY2hhciopSU9fQUREUkVTUyhPTUFQX1VBUlQyX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKU9NQVBfVUFSVDJfQkFTRSwKKwkJLmlycQkJPSBJTlRfVUFSVDIsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBPTUFQMTZYWF9CQVNFX0JBVUQgKiAxNiwKKwl9LAorCXsKKwkJLm1lbWJhc2UJPSAoY2hhciopSU9fQUREUkVTUyhPTUFQX1VBUlQzX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKU9NQVBfVUFSVDNfQkFTRSwKKwkJLmlycQkJPSBJTlRfVUFSVDMsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBPTUFQMTZYWF9CQVNFX0JBVUQgKiAxNiwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDAsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCisvKgorICogTm90ZSB0aGF0IG9uIElubm92YXRvci0xNTEwIFVBUlQyIHBpbnMgY29uZmxpY3Qgd2l0aCBVU0IyLgorICogQnkgZGVmYXVsdCBVQVJUMiBkb2VzIG5vdCB3b3JrIG9uIElubm92YXRvci0xNTEwIGlmIHlvdSBoYXZlCisgKiBVU0IgT0hDSSBlbmFibGVkLiBUbyB1c2UgVUFSVDIsIHlvdSBtdXN0IGRpc2FibGUgVVNCMiBmaXJzdC4KKyAqLwordm9pZCBfX2luaXQgb21hcF9zZXJpYWxfaW5pdChpbnQgcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdKQoreworCWludCBpOworCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMF0ucmVnc2hpZnQgPSAwOworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsxXS5yZWdzaGlmdCA9IDA7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzBdLmlycSA9IElOVF83MzBfVUFSVF9NT0RFTV8xOworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsxXS5pcnEgPSBJTlRfNzMwX1VBUlRfTU9ERU1fSVJEQV8yOworCX0KKworCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVswXS51YXJ0Y2xrID0gT01BUDE1MTBfQkFTRV9CQVVEICogMTY7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzFdLnVhcnRjbGsgPSBPTUFQMTUxMF9CQVNFX0JBVUQgKiAxNjsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMl0udWFydGNsayA9IE9NQVAxNTEwX0JBU0VfQkFVRCAqIDE2OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBPTUFQX01BWF9OUl9QT1JUUzsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgcmVnOworCisJCWlmIChwb3J0c1tpXSA9PSAwKSB7CisJCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVtpXS5tZW1iYXNlID0gMDsKKwkJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhW2ldLm1hcGJhc2UgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQxX1RYKTsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDFfUlRTKTsKKwkJCQlpZiAobWFjaGluZV9pc19vbWFwX2lubm92YXRvcigpKSB7CisJCQkJCXJlZyA9IGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJcmVnIHw9IE9NQVAxNTEwX0ZQR0FfUENSX0NPTTFfRU47CisJCQkJCWZwZ2Ffd3JpdGUocmVnLCBPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQyX1RYKTsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDJfUlRTKTsKKwkJCQlpZiAobWFjaGluZV9pc19vbWFwX2lubm92YXRvcigpKSB7CisJCQkJCXJlZyA9IGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJcmVnIHw9IE9NQVAxNTEwX0ZQR0FfUENSX0NPTTJfRU47CisJCQkJCWZwZ2Ffd3JpdGUocmVnLCBPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQzX1RYKTsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDNfUlgpOworCQkJfQorCQkJaWYgKGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCQkJY2xrX2VuYWJsZShjbGtfZ2V0KDAsICJ1YXJ0M19jayIpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCW9tYXBfc2VyaWFsX3Jlc2V0KCZzZXJpYWxfcGxhdGZvcm1fZGF0YVtpXSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKK30KK2FyY2hfaW5pdGNhbGwob21hcF9pbml0KTsKKworI2RlZmluZSBOT19MRU5HVEhfQ0hFQ0sgMHhmZmZmZmZmZgorCitleHRlcm4gaW50IG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuOworZXh0ZXJuIHU4IG9tYXBfYm9vdGxvYWRlcl90YWdbXTsKKworc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCAqb21hcF9ib2FyZF9jb25maWc7CitpbnQgb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IDA7CisKK3N0YXRpYyBjb25zdCB2b2lkICpnZXRfY29uZmlnKHUxNiB0YWcsIHNpemVfdCBsZW4sIGludCBza2lwLCBzaXplX3QgKmxlbl9vdXQpCit7CisJc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCAqa2luZm8gPSBOVUxMOworCWludCBpOworCisjaWZkZWYgQ09ORklHX09NQVBfQk9PVF9UQUcKKwlzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgKmluZm8gPSBOVUxMOworCisJaWYgKG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuID4gNCkKKwkJaW5mbyA9IChzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgKikgb21hcF9ib290bG9hZGVyX3RhZzsKKwl3aGlsZSAoaW5mbyAhPSBOVUxMKSB7CisJCXU4ICpuZXh0OworCisJCWlmIChpbmZvLT50YWcgPT0gdGFnKSB7CisJCQlpZiAoc2tpcCA9PSAwKQorCQkJCWJyZWFrOworCQkJc2tpcC0tOworCQl9CisKKwkJaWYgKChpbmZvLT5sZW4gJiAweDAzKSAhPSAwKSB7CisJCQkvKiBXZSBiYWlsIG91dCB0byBhdm9pZCBhbiBhbGlnbm1lbnQgZmF1bHQgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiT01BUCBwZXJpcGhlcmFsIGNvbmZpZzogTGVuZ3RoICglZCkgbm90IHdvcmQtYWxpZ25lZCAodGFnICUwNHgpXG4iLAorCQkJICAgICAgIGluZm8tPmxlbiwgaW5mby0+dGFnKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW5leHQgPSAodTggKikgaW5mbyArIHNpemVvZigqaW5mbykgKyBpbmZvLT5sZW47CisJCWlmIChuZXh0ID49IG9tYXBfYm9vdGxvYWRlcl90YWcgKyBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbikKKwkJCWluZm8gPSBOVUxMOworCQllbHNlCisJCQlpbmZvID0gKHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSAqKSBuZXh0OworCX0KKwlpZiAoaW5mbyAhPSBOVUxMKSB7CisJCS8qIENoZWNrIHRoZSBsZW5ndGggYXMgYSBsYW1lIGF0dGVtcHQgdG8gY2hlY2sgZm9yCisJCSAqIGJpbmFyeSBpbmNvbnNpc3RhbmN5LiAqLworCQlpZiAobGVuICE9IE5PX0xFTkdUSF9DSEVDSykgeworCQkJLyogV29yZC1hbGlnbiBsZW4gKi8KKwkJCWlmIChsZW4gJiAweDAzKQorCQkJCWxlbiA9IChsZW4gKyAzKSAmIH4weDAzOworCQkJaWYgKGluZm8tPmxlbiAhPSBsZW4pIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk9NQVAgcGVyaXBoZXJhbCBjb25maWc6IExlbmd0aCBtaXNtYXRjaCB3aXRoIHRhZyAleCAod2FudCAlZCwgZ290ICVkKVxuIiwKKwkJCQkgICAgICAgdGFnLCBsZW4sIGluZm8tPmxlbik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKGxlbl9vdXQgIT0gTlVMTCkKKwkJCSpsZW5fb3V0ID0gaW5mby0+bGVuOworCQlyZXR1cm4gaW5mby0+ZGF0YTsKKwl9CisjZW5kaWYKKwkvKiBUcnkgdG8gZmluZCB0aGUgY29uZmlnIGZyb20gdGhlIGJvYXJkLXNwZWNpZmljIHN0cnVjdHVyZXMKKwkgKiBpbiB0aGUga2VybmVsLiAqLworCWZvciAoaSA9IDA7IGkgPCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplOyBpKyspIHsKKwkJaWYgKG9tYXBfYm9hcmRfY29uZmlnW2ldLnRhZyA9PSB0YWcpIHsKKwkJCWtpbmZvID0gJm9tYXBfYm9hcmRfY29uZmlnW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGtpbmZvID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBraW5mby0+ZGF0YTsKK30KKworY29uc3Qgdm9pZCAqX19vbWFwX2dldF9jb25maWcodTE2IHRhZywgc2l6ZV90IGxlbiwgaW50IG5yKQoreworICAgICAgICByZXR1cm4gZ2V0X2NvbmZpZyh0YWcsIGxlbiwgbnIsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTChfX29tYXBfZ2V0X2NvbmZpZyk7CisKK2NvbnN0IHZvaWQgKm9tYXBfZ2V0X3Zhcl9jb25maWcodTE2IHRhZywgc2l6ZV90ICpsZW4pCit7CisgICAgICAgIHJldHVybiBnZXRfY29uZmlnKHRhZywgTk9fTEVOR1RIX0NIRUNLLCAwLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2dldF92YXJfY29uZmlnKTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF9hZGRfc2VyaWFsX2NvbnNvbGUodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyAqaW5mbzsKKworCWluZm8gPSBvbWFwX2dldF9jb25maWcoT01BUF9UQUdfVUFSVCwgc3RydWN0IG9tYXBfdWFydF9jb25maWcpOworCWlmIChpbmZvICE9IE5VTEwgJiYgaW5mby0+Y29uc29sZV91YXJ0KSB7CisJCXN0YXRpYyBjaGFyIHNwZWVkWzExXSwgKm9wdCA9IE5VTEw7CisKKwkJaWYgKGluZm8tPmNvbnNvbGVfc3BlZWQpIHsKKwkJCXNucHJpbnRmKHNwZWVkLCBzaXplb2Yoc3BlZWQpLCAiJXUiLCBpbmZvLT5jb25zb2xlX3NwZWVkKTsKKwkJCW9wdCA9IHNwZWVkOworCQl9CisJCXJldHVybiBhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eVMiLCBpbmZvLT5jb25zb2xlX3VhcnQgLSAxLCBvcHQpOworCX0KKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwob21hcF9hZGRfc2VyaWFsX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjI4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uaAorICoKKyAqIEhlYWRlciBmb3IgY29kZSBjb21tb24gdG8gYWxsIE9NQVAgbWFjaGluZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQX0NPTU1PTl9ICisjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQX0NPTU1PTl9ICisKK3N0cnVjdCBzeXNfdGltZXI7CisKK2V4dGVybiB2b2lkIG9tYXBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lcjsKK2V4dGVybiB2b2lkIG9tYXBfc2VyaWFsX2luaXQoaW50IHBvcnRzW10pOworCisjZW5kaWYgLyogX19BUkNIX0FSTV9NQUNIX09NQVBfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTllYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2RtYS5jCkBAIC0wLDAgKzEsMTA4NiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL29tYXAvZG1hLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqIERNQSBjaGFubmVsIGxpbmtpbmcgZm9yIDE2MTAgYnkgU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPgorICogR3JhcGhpY3MgRE1BIGFuZCBMQ0QgRE1BIGdyYXBoaWNzIHRyYW5mb3JtYXRpb25zCisgKiBieSBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKiBTb21lIGZ1bmN0aW9ucyBiYXNlZCBvbiBlYXJsaWVyIGRtYS1vbWFwLmMgQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCisgKgorICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBPTUFQIGludGVybmFsIERNQSBjaGFubmVscy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorCisjZGVmaW5lIE9NQVBfRE1BX0FDVElWRQkJMHgwMQorCisjZGVmaW5lIE9NQVBfRE1BX0NDUl9FTgkJKDEgPDwgNykKKworI2RlZmluZSBPTUFQX0ZVTkNfTVVYX0FSTV9CQVNFCSgweGZmZmUxMDAwICsgMHhlYykKKworc3RhdGljIGludCBlbmFibGVfMTUxMF9tb2RlID0gMDsKKworc3RydWN0IG9tYXBfZG1hX2xjaCB7CisJaW50IG5leHRfbGNoOworCWludCBkZXZfaWQ7CisJdTE2IHNhdmVkX2NzcjsKKwl1MTYgZW5hYmxlZF9pcnFzOworCWNvbnN0IGNoYXIgKmRldl9uYW1lOworCXZvaWQgKCogY2FsbGJhY2spKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpOworCXZvaWQgKmRhdGE7CisJbG9uZyBmbGFnczsKK307CisKK3N0YXRpYyBpbnQgZG1hX2NoYW5fY291bnQ7CisKK3N0YXRpYyBzcGlubG9ja190IGRtYV9jaGFuX2xvY2s7CitzdGF0aWMgc3RydWN0IG9tYXBfZG1hX2xjaCBkbWFfY2hhbltPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKKworY29uc3Qgc3RhdGljIHU4IGRtYV9pcnFbT01BUF9MT0dJQ0FMX0RNQV9DSF9DT1VOVF0gPSB7CisJSU5UX0RNQV9DSDBfNiwgSU5UX0RNQV9DSDFfNywgSU5UX0RNQV9DSDJfOCwgSU5UX0RNQV9DSDMsCisJSU5UX0RNQV9DSDQsIElOVF9ETUFfQ0g1LCBJTlRfMTYxMF9ETUFfQ0g2LCBJTlRfMTYxMF9ETUFfQ0g3LAorCUlOVF8xNjEwX0RNQV9DSDgsIElOVF8xNjEwX0RNQV9DSDksIElOVF8xNjEwX0RNQV9DSDEwLAorCUlOVF8xNjEwX0RNQV9DSDExLCBJTlRfMTYxMF9ETUFfQ0gxMiwgSU5UXzE2MTBfRE1BX0NIMTMsCisJSU5UXzE2MTBfRE1BX0NIMTQsIElOVF8xNjEwX0RNQV9DSDE1LCBJTlRfRE1BX0xDRAorfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2dkbWFfZGV2KGludCByZXEpCit7CisJdTMyIHJlZyA9IE9NQVBfRlVOQ19NVVhfQVJNX0JBU0UgKyAoKHJlcSAtIDEpIC8gNSkgKiA0OworCWludCBzaGlmdCA9ICgocmVxIC0gMSkgJSA1KSAqIDY7CisKKwlyZXR1cm4gKChvbWFwX3JlYWRsKHJlZykgPj4gc2hpZnQpICYgMHgzZikgKyAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2dkbWFfZGV2KGludCByZXEsIGludCBkZXYpCit7CisJdTMyIHJlZyA9IE9NQVBfRlVOQ19NVVhfQVJNX0JBU0UgKyAoKHJlcSAtIDEpIC8gNSkgKiA0OworCWludCBzaGlmdCA9ICgocmVxIC0gMSkgJSA1KSAqIDY7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChyZWcpOworCWwgJj0gfigweDNmIDw8IHNoaWZ0KTsKKwlsIHw9IChkZXYgLSAxKSA8PCBzaGlmdDsKKwlvbWFwX3dyaXRlbChsLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9sY2hfcmVncyhpbnQgbGNoKQoreworCWludCBpOworCXUzMiBsY2hfYmFzZSA9IE9NQVBfRE1BX0JBU0UgKyBsY2ggKiAweDQwOworCisJZm9yIChpID0gMDsgaSA8IDB4MmM7IGkgKz0gMikKKwkJb21hcF93cml0ZXcoMCwgbGNoX2Jhc2UgKyBpKTsKK30KKwordm9pZCBvbWFwX3NldF9kbWFfcHJpb3JpdHkoaW50IGRzdF9wb3J0LCBpbnQgcHJpb3JpdHkpCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisJdTMyIGw7CisKKwlzd2l0Y2ggKGRzdF9wb3J0KSB7CisJY2FzZSBPTUFQX0RNQV9QT1JUX09DUF9UMToJLyogRkZGRUNDMDAgKi8KKwkJcmVnID0gT01BUF9UQ19PQ1BUMV9QUklPUjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RNQV9QT1JUX09DUF9UMjoJLyogRkZGRUNDRDAgKi8KKwkJcmVnID0gT01BUF9UQ19PQ1BUMl9QUklPUjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RNQV9QT1JUX0VNSUZGOgkvKiBGRkZFQ0MwOCAqLworCQlyZWcgPSBPTUFQX1RDX0VNSUZGX1BSSU9SOworCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX1BPUlRfRU1JRlM6CS8qIEZGRkVDQzA0ICovCisJCXJlZyA9IE9NQVBfVENfRU1JRlNfUFJJT1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCWwgPSBvbWFwX3JlYWRsKHJlZyk7CisJbCAmPSB+KDB4ZiA8PCA4KTsKKwlsIHw9IChwcmlvcml0eSAmIDB4ZikgPDwgODsKKwlvbWFwX3dyaXRlbChsLCByZWcpOworfQorCit2b2lkIG9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMoaW50IGxjaCwgaW50IGRhdGFfdHlwZSwgaW50IGVsZW1fY291bnQsCisJCQkJICBpbnQgZnJhbWVfY291bnQsIGludCBzeW5jX21vZGUpCit7CisJdTE2IHc7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpOworCXcgJj0gfjB4MDM7CisJdyB8PSBkYXRhX3R5cGU7CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKKwl3ICY9IH4oMSA8PCA1KTsKKwlpZiAoc3luY19tb2RlID09IE9NQVBfRE1BX1NZTkNfRlJBTUUpCisJCXcgfD0gMSA8PCA1OworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUihsY2gpKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUjIobGNoKSk7CisJdyAmPSB+KDEgPDwgMik7CisJaWYgKHN5bmNfbW9kZSA9PSBPTUFQX0RNQV9TWU5DX0JMT0NLKQorCQl3IHw9IDEgPDwgMjsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DQ1IyKGxjaCkpOworCisJb21hcF93cml0ZXcoZWxlbV9jb3VudCwgT01BUF9ETUFfQ0VOKGxjaCkpOworCW9tYXBfd3JpdGV3KGZyYW1lX2NvdW50LCBPTUFQX0RNQV9DRk4obGNoKSk7CisKK30KK3ZvaWQgb21hcF9zZXRfZG1hX2NvbG9yX21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9jb2xvcl9tb2RlIG1vZGUsIHUzMiBjb2xvcikKK3sKKwl1MTYgdzsKKworCUJVR19PTihvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSk7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DQ1IyKGxjaCkpICYgfjB4MDM7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBPTUFQX0RNQV9DT05TVEFOVF9GSUxMOgorCQl3IHw9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfVFJBTlNQQVJFTlRfQ09QWToKKwkJdyB8PSAweDAyOworCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX0NPTE9SX0RJUzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUjIobGNoKSk7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9MQ0hfQ1RSTChsY2gpKSAmIH4weDBmOworCS8qIERlZmF1bHQgaXMgY2hhbm5lbCB0eXBlIDJEICovCisJaWYgKG1vZGUpIHsKKwkJb21hcF93cml0ZXcoKHUxNiljb2xvciwgT01BUF9ETUFfQ09MT1JfTChsY2gpKTsKKwkJb21hcF93cml0ZXcoKHUxNikoY29sb3IgPj4gMTYpLCBPTUFQX0RNQV9DT0xPUl9VKGxjaCkpOworCQl3IHw9IDE7CQkvKiBDaGFubmVsIHR5cGUgRyAqLworCX0KKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9MQ0hfQ1RSTChsY2gpKTsKK30KKworCit2b2lkIG9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKGludCBsY2gsIGludCBzcmNfcG9ydCwgaW50IHNyY19hbW9kZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQpCit7CisJdTE2IHc7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpOworCXcgJj0gfigweDFmIDw8IDIpOworCXcgfD0gc3JjX3BvcnQgPDwgMjsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpOworCXcgJj0gfigweDAzIDw8IDEyKTsKKwl3IHw9IHNyY19hbW9kZSA8PCAxMjsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DQ1IobGNoKSk7CisKKwlvbWFwX3dyaXRldyhzcmNfc3RhcnQgPj4gMTYsIE9NQVBfRE1BX0NTU0FfVShsY2gpKTsKKwlvbWFwX3dyaXRldyhzcmNfc3RhcnQsIE9NQVBfRE1BX0NTU0FfTChsY2gpKTsKK30KKwordm9pZCBvbWFwX3NldF9kbWFfc3JjX2luZGV4KGludCBsY2gsIGludCBlaWR4LCBpbnQgZmlkeCkKK3sKKwlvbWFwX3dyaXRldyhlaWR4LCBPTUFQX0RNQV9DU0VJKGxjaCkpOworCW9tYXBfd3JpdGV3KGZpZHgsIE9NQVBfRE1BX0NTRkkobGNoKSk7Cit9CisKK3ZvaWQgb21hcF9zZXRfZG1hX3NyY19kYXRhX3BhY2soaW50IGxjaCwgaW50IGVuYWJsZSkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSkgJiB+KDEgPDwgNik7CisJdyB8PSBlbmFibGUgPyAoMSA8PCA2KSA6IDA7CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKK30KKwordm9pZCBvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9idXJzdF9tb2RlIGJ1cnN0X21vZGUpCit7CisJdTE2IHc7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpICYgfigweDAzIDw8IDcpOworCXN3aXRjaCAoYnVyc3RfbW9kZSkgeworCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF9ESVM6CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF80OgorCQl3IHw9ICgweDAxIDw8IDcpOworCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfODoKKwkJLyogbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGhhcmR3YXJlCisJCSAqIHcgfD0gKDB4MDMgPDwgNyk7CisJCSAqIGZhbGwgdGhyb3VnaAorCQkgKi8KKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKK30KKwordm9pZCBvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMoaW50IGxjaCwgaW50IGRlc3RfcG9ydCwgaW50IGRlc3RfYW1vZGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGRlc3Rfc3RhcnQpCit7CisJdTE2IHc7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpOworCXcgJj0gfigweDFmIDw8IDkpOworCXcgfD0gZGVzdF9wb3J0IDw8IDk7CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKKwl3ICY9IH4oMHgwMyA8PCAxNCk7CisJdyB8PSBkZXN0X2Ftb2RlIDw8IDE0OworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUihsY2gpKTsKKworCW9tYXBfd3JpdGV3KGRlc3Rfc3RhcnQgPj4gMTYsIE9NQVBfRE1BX0NEU0FfVShsY2gpKTsKKwlvbWFwX3dyaXRldyhkZXN0X3N0YXJ0LCBPTUFQX0RNQV9DRFNBX0wobGNoKSk7Cit9CisKK3ZvaWQgb21hcF9zZXRfZG1hX2Rlc3RfaW5kZXgoaW50IGxjaCwgaW50IGVpZHgsIGludCBmaWR4KQoreworCW9tYXBfd3JpdGV3KGVpZHgsIE9NQVBfRE1BX0NERUkobGNoKSk7CisJb21hcF93cml0ZXcoZmlkeCwgT01BUF9ETUFfQ0RGSShsY2gpKTsKK30KKwordm9pZCBvbWFwX3NldF9kbWFfZGVzdF9kYXRhX3BhY2soaW50IGxjaCwgaW50IGVuYWJsZSkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSkgJiB+KDEgPDwgMTMpOworCXcgfD0gZW5hYmxlID8gKDEgPDwgMTMpIDogMDsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOworfQorCit2b2lkIG9tYXBfc2V0X2RtYV9kZXN0X2J1cnN0X21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9idXJzdF9tb2RlIGJ1cnN0X21vZGUpCit7CisJdTE2IHc7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpICYgfigweDAzIDw8IDE0KTsKKwlzd2l0Y2ggKGJ1cnN0X21vZGUpIHsKKwljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfRElTOgorCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfNDoKKwkJdyB8PSAoMHgwMSA8PCAxNCk7CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF84OgorCQl3IHw9ICgweDAzIDw8IDE0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIERNQSBidXJzdCBtb2RlXG4iKTsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfaW50cihpbnQgbGNoKQoreworCXUxNiB3OworCisJLyogUmVhZCBDU1IgdG8gbWFrZSBzdXJlIGl0J3MgY2xlYXJlZC4gKi8KKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU1IobGNoKSk7CisJLyogRW5hYmxlIHNvbWUgbmljZSBpbnRlcnJ1cHRzLiAqLworCW9tYXBfd3JpdGV3KGRtYV9jaGFuW2xjaF0uZW5hYmxlZF9pcnFzLCBPTUFQX0RNQV9DSUNSKGxjaCkpOworCWRtYV9jaGFuW2xjaF0uZmxhZ3MgfD0gT01BUF9ETUFfQUNUSVZFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2xuayhpbnQgbGNoKQoreworCXUxNiB3OworCisJLyogQ2xlYXIgdGhlIFNUT1BfTE5LIGJpdHMgKi8KKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DTE5LX0NUUkwobGNoKSk7CisJdyAmPSB+KDEgPDwgMTQpOworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKKworCS8qIEFuZCBzZXQgdGhlIEVOQUJMRV9MTksgYml0cyAqLworCWlmIChkbWFfY2hhbltsY2hdLm5leHRfbGNoICE9IC0xKQorCQlvbWFwX3dyaXRldyhkbWFfY2hhbltsY2hdLm5leHRfbGNoIHwgKDEgPDwgMTUpLAorCQkJICAgIE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfbG5rKGludCBsY2gpCit7CisJdTE2IHc7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlvbWFwX3dyaXRldygwLCBPTUFQX0RNQV9DSUNSKGxjaCkpOworCisJLyogU2V0IHRoZSBTVE9QX0xOSyBiaXQgKi8KKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DTE5LX0NUUkwobGNoKSk7CisJdyB8PSAoMSA8PCAxNCk7CisJdyA9IG9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKKworCWRtYV9jaGFuW2xjaF0uZmxhZ3MgJj0gfk9NQVBfRE1BX0FDVElWRTsKK30KKwordm9pZCBvbWFwX3N0YXJ0X2RtYShpbnQgbGNoKQoreworCXUxNiB3OworCisJaWYgKCFvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSAmJiBkbWFfY2hhbltsY2hdLm5leHRfbGNoICE9IC0xKSB7CisJCWludCBuZXh0X2xjaCwgY3VyX2xjaDsKKwkJY2hhciBkbWFfY2hhbl9saW5rX21hcFtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKKworCQlkbWFfY2hhbl9saW5rX21hcFtsY2hdID0gMTsKKwkJLyogU2V0IHRoZSBsaW5rIHJlZ2lzdGVyIG9mIHRoZSBmaXJzdCBjaGFubmVsICovCisJCWVuYWJsZV9sbmsobGNoKTsKKworCQltZW1zZXQoZG1hX2NoYW5fbGlua19tYXAsIDAsIHNpemVvZihkbWFfY2hhbl9saW5rX21hcCkpOworCQljdXJfbGNoID0gZG1hX2NoYW5bbGNoXS5uZXh0X2xjaDsKKwkJZG8geworCQkJbmV4dF9sY2ggPSBkbWFfY2hhbltjdXJfbGNoXS5uZXh0X2xjaDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGxvb3AgY2FzZTogd2UndmUgYmVlbiBoZXJlIGFscmVhZHkgKi8KKwkJCWlmIChkbWFfY2hhbl9saW5rX21hcFtjdXJfbGNoXSkKKwkJCQlicmVhazsKKwkJCS8qIE1hcmsgdGhlIGN1cnJlbnQgY2hhbm5lbCAqLworCQkJZG1hX2NoYW5fbGlua19tYXBbY3VyX2xjaF0gPSAxOworCisJCQllbmFibGVfbG5rKGN1cl9sY2gpOworCQkJaW5pdF9pbnRyKGN1cl9sY2gpOworCisJCQljdXJfbGNoID0gbmV4dF9sY2g7CisJCX0gd2hpbGUgKG5leHRfbGNoICE9IC0xKTsKKwl9CisKKwlpbml0X2ludHIobGNoKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKKwl3IHw9IE9NQVBfRE1BX0NDUl9FTjsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DQ1IobGNoKSk7CisJZG1hX2NoYW5bbGNoXS5mbGFncyB8PSBPTUFQX0RNQV9BQ1RJVkU7Cit9CisKK3ZvaWQgb21hcF9zdG9wX2RtYShpbnQgbGNoKQoreworCXUxNiB3OworCisJaWYgKCFvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSAmJiBkbWFfY2hhbltsY2hdLm5leHRfbGNoICE9IC0xKSB7CisJCWludCBuZXh0X2xjaCwgY3VyX2xjaCA9IGxjaDsKKwkJY2hhciBkbWFfY2hhbl9saW5rX21hcFtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKKworCQltZW1zZXQoZG1hX2NoYW5fbGlua19tYXAsIDAsIHNpemVvZihkbWFfY2hhbl9saW5rX21hcCkpOworCQlkbyB7CisJCQkvKiBUaGUgbG9vcCBjYXNlOiB3ZSd2ZSBiZWVuIGhlcmUgYWxyZWFkeSAqLworCQkJaWYgKGRtYV9jaGFuX2xpbmtfbWFwW2N1cl9sY2hdKQorCQkJCWJyZWFrOworCQkJLyogTWFyayB0aGUgY3VycmVudCBjaGFubmVsICovCisJCQlkbWFfY2hhbl9saW5rX21hcFtjdXJfbGNoXSA9IDE7CisKKwkJCWRpc2FibGVfbG5rKGN1cl9sY2gpOworCisJCQluZXh0X2xjaCA9IGRtYV9jaGFuW2N1cl9sY2hdLm5leHRfbGNoOworCQkJY3VyX2xjaCA9IG5leHRfbGNoOworCQl9IHdoaWxlIChuZXh0X2xjaCAhPSAtMSk7CisKKwkJcmV0dXJuOworCX0KKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIG9uIHRoZSBjaGFubmVsICovCisJb21hcF93cml0ZXcoMCwgT01BUF9ETUFfQ0lDUihsY2gpKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKKwl3ICY9IH5PTUFQX0RNQV9DQ1JfRU47CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ0NSKGxjaCkpOworCWRtYV9jaGFuW2xjaF0uZmxhZ3MgJj0gfk9NQVBfRE1BX0FDVElWRTsKK30KKwordm9pZCBvbWFwX2VuYWJsZV9kbWFfaXJxKGludCBsY2gsIHUxNiBiaXRzKQoreworCWRtYV9jaGFuW2xjaF0uZW5hYmxlZF9pcnFzIHw9IGJpdHM7Cit9CisKK3ZvaWQgb21hcF9kaXNhYmxlX2RtYV9pcnEoaW50IGxjaCwgdTE2IGJpdHMpCit7CisJZG1hX2NoYW5bbGNoXS5lbmFibGVkX2lycXMgJj0gfmJpdHM7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2hhbmRsZV9jaChpbnQgY2gpCit7CisJdTE2IGNzcjsKKworCWlmIChlbmFibGVfMTUxMF9tb2RlICYmIGNoID49IDYpIHsKKwkJY3NyID0gZG1hX2NoYW5bY2hdLnNhdmVkX2NzcjsKKwkJZG1hX2NoYW5bY2hdLnNhdmVkX2NzciA9IDA7CisJfSBlbHNlCisJCWNzciA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NSKGNoKSk7CisJaWYgKGVuYWJsZV8xNTEwX21vZGUgJiYgY2ggPD0gMiAmJiAoY3NyID4+IDcpICE9IDApIHsKKwkJZG1hX2NoYW5bY2ggKyA2XS5zYXZlZF9jc3IgPSBjc3IgPj4gNzsKKwkJY3NyICY9IDB4N2Y7CisJfQorCWlmICghY3NyKQorCQlyZXR1cm4gMDsKKwlpZiAodW5saWtlbHkoZG1hX2NoYW5bY2hdLmRldl9pZCA9PSAtMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgaW50ZXJydXB0IGZyb20gRE1BIGNoYW5uZWwgJWQgKENTUiAlMDR4KVxuIiwKKwkJICAgICAgIGNoLCBjc3IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHVubGlrZWx5KGNzciAmIE9NQVBfRE1BX1RPVVRfSVJRKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRE1BIHRpbWVvdXQgd2l0aCBkZXZpY2UgJWRcbiIsIGRtYV9jaGFuW2NoXS5kZXZfaWQpOworCWlmICh1bmxpa2VseShjc3IgJiBPTUFQX0RNQV9EUk9QX0lSUSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRNQSBzeW5jaHJvbml6YXRpb24gZXZlbnQgZHJvcCBvY2N1cnJlZCB3aXRoIGRldmljZSAlZFxuIiwKKwkJICAgICAgIGRtYV9jaGFuW2NoXS5kZXZfaWQpOworCWlmIChsaWtlbHkoY3NyICYgT01BUF9ETUFfQkxPQ0tfSVJRKSkKKwkJZG1hX2NoYW5bY2hdLmZsYWdzICY9IH5PTUFQX0RNQV9BQ1RJVkU7CisJaWYgKGxpa2VseShkbWFfY2hhbltjaF0uY2FsbGJhY2sgIT0gTlVMTCkpCisJCWRtYV9jaGFuW2NoXS5jYWxsYmFjayhjaCwgY3NyLCBkbWFfY2hhbltjaF0uZGF0YSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgY2ggPSAoKGludCkgZGV2X2lkKSAtIDE7CisJaW50IGhhbmRsZWQgPSAwOworCisJZm9yICg7OykgeworCQlpbnQgaGFuZGxlZF9ub3cgPSAwOworCisJCWhhbmRsZWRfbm93ICs9IGRtYV9oYW5kbGVfY2goY2gpOworCQlpZiAoZW5hYmxlXzE1MTBfbW9kZSAmJiBkbWFfY2hhbltjaCArIDZdLnNhdmVkX2NzcikKKwkJCWhhbmRsZWRfbm93ICs9IGRtYV9oYW5kbGVfY2goY2ggKyA2KTsKKwkJaWYgKCFoYW5kbGVkX25vdykKKwkJCWJyZWFrOworCQloYW5kbGVkICs9IGhhbmRsZWRfbm93OworCX0KKworCXJldHVybiBoYW5kbGVkID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKK30KKworaW50IG9tYXBfcmVxdWVzdF9kbWEoaW50IGRldl9pZCwgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCSAgICAgdm9pZCAoKiBjYWxsYmFjaykoaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSksCisJCSAgICAgdm9pZCAqZGF0YSwgaW50ICpkbWFfY2hfb3V0KQoreworCWludCBjaCwgZnJlZV9jaCA9IC0xOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG9tYXBfZG1hX2xjaCAqY2hhbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7CisJZm9yIChjaCA9IDA7IGNoIDwgZG1hX2NoYW5fY291bnQ7IGNoKyspIHsKKwkJaWYgKGZyZWVfY2ggPT0gLTEgJiYgZG1hX2NoYW5bY2hdLmRldl9pZCA9PSAtMSkgeworCQkJZnJlZV9jaCA9IGNoOworCQkJaWYgKGRldl9pZCA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChmcmVlX2NoID09IC0xKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hhbiA9IGRtYV9jaGFuICsgZnJlZV9jaDsKKwljaGFuLT5kZXZfaWQgPSBkZXZfaWQ7CisJY2xlYXJfbGNoX3JlZ3MoZnJlZV9jaCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2NoYW5fbG9jaywgZmxhZ3MpOworCisJY2hhbi0+ZGV2X2lkID0gZGV2X2lkOworCWNoYW4tPmRldl9uYW1lID0gZGV2X25hbWU7CisJY2hhbi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwljaGFuLT5kYXRhID0gZGF0YTsKKwljaGFuLT5lbmFibGVkX2lycXMgPSBPTUFQX0RNQV9UT1VUX0lSUSB8IE9NQVBfRE1BX0RST1BfSVJRIHwgT01BUF9ETUFfQkxPQ0tfSVJROworCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCS8qIElmIHRoZSBzeW5jIGRldmljZSBpcyBzZXQsIGNvbmZpZ3VyZSBpdCBkeW5hbWljYWxseS4gKi8KKwkJaWYgKGRldl9pZCAhPSAwKSB7CisJCQlzZXRfZ2RtYV9kZXYoZnJlZV9jaCArIDEsIGRldl9pZCk7CisJCQlkZXZfaWQgPSBmcmVlX2NoICsgMTsKKwkJfQorCQkvKiBEaXNhYmxlIHRoZSAxNTEwIGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgc2V0IHRoZSBzeW5jIGRldmljZQorCQkgKiBpZC4gKi8KKwkJb21hcF93cml0ZXcoZGV2X2lkIHwgKDEgPDwgMTApLCBPTUFQX0RNQV9DQ1IoZnJlZV9jaCkpOworCX0gZWxzZSB7CisJCW9tYXBfd3JpdGV3KGRldl9pZCwgT01BUF9ETUFfQ0NSKGZyZWVfY2gpKTsKKwl9CisJKmRtYV9jaF9vdXQgPSBmcmVlX2NoOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21hcF9mcmVlX2RtYShpbnQgY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7CisJaWYgKGRtYV9jaGFuW2NoXS5kZXZfaWQgPT0gLTEpIHsKKwkJcHJpbnRrKCJvbWFwX2RtYTogdHJ5aW5nIHRvIGZyZWUgbm9uYWxsb2NhdGVkIERNQSBjaGFubmVsICVkXG4iLCBjaCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlkbWFfY2hhbltjaF0uZGV2X2lkID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2NoYW5fbG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSBhbGwgRE1BIGludGVycnVwdHMgZm9yIHRoZSBjaGFubmVsLiAqLworCW9tYXBfd3JpdGV3KDAsIE9NQVBfRE1BX0NJQ1IoY2gpKTsKKwkvKiBNYWtlIHN1cmUgdGhlIERNQSB0cmFuc2ZlciBpcyBzdG9wcGVkLiAqLworCW9tYXBfd3JpdGV3KDAsIE9NQVBfRE1BX0NDUihjaCkpOworfQorCitpbnQgb21hcF9kbWFfaW5fMTUxMF9tb2RlKHZvaWQpCit7CisJcmV0dXJuIGVuYWJsZV8xNTEwX21vZGU7Cit9CisKKy8qCisgKiBsY2hfcXVldWUgRE1BIHdpbGwgc3RhcnQgcmlnaHQgYWZ0ZXIgbGNoX2hlYWQgb25lIGlzIGZpbmlzaGVkLgorICogRm9yIHRoaXMgRE1BIGxpbmsgdG8gc3RhcnQsIHlvdSBzdGlsbCBuZWVkIHRvIHN0YXJ0IChzZWUgb21hcF9zdGFydF9kbWEpCisgKiB0aGUgZmlyc3Qgb25lLiBUaGF0IHdpbGwgZmlyZSB1cCB0aGUgZW50aXJlIHF1ZXVlLgorICovCit2b2lkIG9tYXBfZG1hX2xpbmtfbGNoIChpbnQgbGNoX2hlYWQsIGludCBsY2hfcXVldWUpCit7CisJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIGxpbmtpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiAxNTEwIG1vZGVcbiIpOworCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoZG1hX2NoYW5bbGNoX2hlYWRdLmRldl9pZCA9PSAtMSkgfHwKKwkgICAgKGRtYV9jaGFuW2xjaF9xdWV1ZV0uZGV2X2lkID09IC0xKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9tYXBfZG1hOiB0cnlpbmcgdG8gbGluayBub24gcmVxdWVzdGVkIGNoYW5uZWxzXG4iKTsKKwkJZHVtcF9zdGFjaygpOworCX0KKworCWRtYV9jaGFuW2xjaF9oZWFkXS5uZXh0X2xjaCA9IGxjaF9xdWV1ZTsKK30KKworLyoKKyAqIE9uY2UgdGhlIERNQSBxdWV1ZSBpcyBzdG9wcGVkLCB3ZSBjYW4gZGVzdHJveSBpdC4KKyAqLwordm9pZCBvbWFwX2RtYV91bmxpbmtfbGNoIChpbnQgbGNoX2hlYWQsIGludCBsY2hfcXVldWUpCit7CisJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIGxpbmtpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiAxNTEwIG1vZGVcbiIpOworCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkbWFfY2hhbltsY2hfaGVhZF0ubmV4dF9sY2ggIT0gbGNoX3F1ZXVlIHx8CisJICAgIGRtYV9jaGFuW2xjaF9oZWFkXS5uZXh0X2xjaCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9tYXBfZG1hOiB0cnlpbmcgdG8gdW5saW5rIG5vbiBsaW5rZWQgY2hhbm5lbHNcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJfQorCisKKwlpZiAoKGRtYV9jaGFuW2xjaF9oZWFkXS5mbGFncyAmIE9NQVBfRE1BX0FDVElWRSkgfHwKKwkgICAgKGRtYV9jaGFuW2xjaF9oZWFkXS5mbGFncyAmIE9NQVBfRE1BX0FDVElWRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvbWFwX2RtYTogWW91IG5lZWQgdG8gc3RvcCB0aGUgRE1BIGNoYW5uZWxzIGJlZm9yZSB1bmxpbmtpbmdcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJfQorCisJZG1hX2NoYW5bbGNoX2hlYWRdLm5leHRfbGNoID0gLTE7Cit9CisKKworc3RhdGljIHN0cnVjdCBsY2RfZG1hX2luZm8geworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgcmVzZXJ2ZWQ7CisJdm9pZCAoKiBjYWxsYmFjaykodTE2IHN0YXR1cywgdm9pZCAqZGF0YSk7CisJdm9pZCAqY2JfZGF0YTsKKworCWludCBhY3RpdmU7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplOworCWludCByb3RhdGUsIGRhdGFfdHlwZSwgeHJlcywgeXJlczsKKwlpbnQgdnhyZXM7CisJaW50IG1pcnJvcjsKKwlpbnQgeHNjYWxlLCB5c2NhbGU7CisJaW50IGV4dF9jdHJsOworCWludCBzcmNfcG9ydDsKKwlpbnQgc2luZ2xlX3RyYW5zZmVyOworfSBsY2RfZG1hOworCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjEodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgZmJfeHJlcywgdTE2IGZiX3lyZXMsCisJCQkgaW50IGRhdGFfdHlwZSkKK3sKKwlsY2RfZG1hLmFkZHIgPSBhZGRyOworCWxjZF9kbWEuZGF0YV90eXBlID0gZGF0YV90eXBlOworCWxjZF9kbWEueHJlcyA9IGZiX3hyZXM7CisJbGNkX2RtYS55cmVzID0gZmJfeXJlczsKK30KKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX3NyY19wb3J0KGludCBwb3J0KQoreworCWxjZF9kbWEuc3JjX3BvcnQgPSBwb3J0OworfQorCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfZXh0X2NvbnRyb2xsZXIoaW50IGV4dGVybmFsKQoreworCWxjZF9kbWEuZXh0X2N0cmwgPSBleHRlcm5hbDsKK30KKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihpbnQgc2luZ2xlKQoreworCWxjZF9kbWEuc2luZ2xlX3RyYW5zZmVyID0gc2luZ2xlOworfQorCisKK3ZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9yb3RhdGlvbihpbnQgcm90YXRlKQoreworCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRNQSByb3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCWxjZF9kbWEucm90YXRlID0gcm90YXRlOworfQorCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKGludCBtaXJyb3IpCit7CisJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIG1pcnJvciBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CisJCUJVRygpOworCX0KKwlsY2RfZG1hLm1pcnJvciA9IG1pcnJvcjsKK30KKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKHVuc2lnbmVkIGxvbmcgdnhyZXMpCit7CisJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIHZpcnR1YWwgcmVzdWxvdGlvbiBpcyBub3Qgc3VwcG9ydGVkICIKKwkJCQkiaW4gMTUxMCBtb2RlXG4iKTsKKwkJQlVHKCk7CisJfQorCWxjZF9kbWEudnhyZXMgPSB2eHJlczsKK30KKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3NjYWxlKHVuc2lnbmVkIGludCB4c2NhbGUsIHVuc2lnbmVkIGludCB5c2NhbGUpCit7CisJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIHNjYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKKwkJQlVHKCk7CisJfQorCWxjZF9kbWEueHNjYWxlID0geHNjYWxlOworCWxjZF9kbWEueXNjYWxlID0geXNjYWxlOworfQorCitzdGF0aWMgdm9pZCBzZXRfYjFfcmVncyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG9wLCBib3R0b207CisJaW50IGVzOworCXUxNiB3OworCXVuc2lnbmVkIGxvbmcgZW4sIGZuOworCWxvbmcgZWksIGZpOworCXVuc2lnbmVkIGxvbmcgdnhyZXM7CisJdW5zaWduZWQgaW50IHhzY2FsZSwgeXNjYWxlOworCisJc3dpdGNoIChsY2RfZG1hLmRhdGFfdHlwZSkgeworCWNhc2UgT01BUF9ETUFfREFUQV9UWVBFX1M4OgorCQllcyA9IDE7CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfREFUQV9UWVBFX1MxNjoKKwkJZXMgPSAyOworCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TMzI6CisJCWVzID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisKKwl2eHJlcyA9IGxjZF9kbWEudnhyZXMgPyBsY2RfZG1hLnZ4cmVzIDogbGNkX2RtYS54cmVzOworCXhzY2FsZSA9IGxjZF9kbWEueHNjYWxlID8gbGNkX2RtYS54c2NhbGUgOiAxOworCXlzY2FsZSA9IGxjZF9kbWEueXNjYWxlID8gbGNkX2RtYS55c2NhbGUgOiAxOworCUJVR19PTih2eHJlcyA8IGxjZF9kbWEueHJlcyk7CisjZGVmaW5lIFBJWEFERFIoeCx5KSAobGNkX2RtYS5hZGRyICsgKCh5KSAqIHZ4cmVzICogeXNjYWxlICsgKHgpICogeHNjYWxlKSAqIGVzKQorI2RlZmluZSBQSVhTVEVQKHN4LCBzeSwgZHgsIGR5KSAoUElYQUREUihkeCwgZHkpIC0gUElYQUREUihzeCwgc3kpIC0gZXMgKyAxKQorCXN3aXRjaCAobGNkX2RtYS5yb3RhdGUpIHsKKwljYXNlIDA6CisJCWlmICghbGNkX2RtYS5taXJyb3IpIHsKKwkJCXRvcCA9IFBJWEFERFIoMCwgMCk7CisJCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJLyogMTUxMCBETUEgcmVxdWlyZXMgdGhlIGJvdHRvbSBhZGRyZXNzIHRvIGJlIDIgbW9yZQorCQkJICogdGhhbiB0aGUgYWN0dWFsIGxhc3QgbWVtb3J5IGFjY2VzcyBsb2NhdGlvbi4gKi8KKwkJCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSAmJgorCQkJICAgIGxjZF9kbWEuZGF0YV90eXBlID09IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIpCisJCQkJYm90dG9tICs9IDI7CisJCQllaSA9IFBJWFNURVAoMCwgMCwgMSwgMCk7CisJCQlmaSA9IFBJWFNURVAobGNkX2RtYS54cmVzIC0gMSwgMCwgMCwgMSk7CisJCX0gZWxzZSB7CisJCQl0b3AgPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOworCQkJYm90dG9tID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJCWVpID0gUElYU1RFUCgxLCAwLCAwLCAwKTsKKwkJCWZpID0gUElYU1RFUCgwLCAwLCBsY2RfZG1hLnhyZXMgLSAxLCAxKTsKKwkJfQorCQllbiA9IGxjZF9kbWEueHJlczsKKwkJZm4gPSBsY2RfZG1hLnlyZXM7CisJCWJyZWFrOworCWNhc2UgOTA6CisJCWlmICghbGNkX2RtYS5taXJyb3IpIHsKKwkJCXRvcCA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOworCQkJZWkgPSBQSVhTVEVQKDAsIDEsIDAsIDApOworCQkJZmkgPSBQSVhTVEVQKDAsIDAsIDEsIGxjZF9kbWEueXJlcyAtIDEpOworCQl9IGVsc2UgeworCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIoMCwgMCk7CisJCQllaSA9IFBJWFNURVAoMCwgMSwgMCwgMCk7CisJCQlmaSA9IFBJWFNURVAoMSwgMCwgMCwgbGNkX2RtYS55cmVzIC0gMSk7CisJCX0KKwkJZW4gPSBsY2RfZG1hLnlyZXM7CisJCWZuID0gbGNkX2RtYS54cmVzOworCQlicmVhazsKKwljYXNlIDE4MDoKKwkJaWYgKCFsY2RfZG1hLm1pcnJvcikgeworCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIoMCwgMCk7CisJCQllaSA9IFBJWFNURVAoMSwgMCwgMCwgMCk7CisJCQlmaSA9IFBJWFNURVAoMCwgMSwgbGNkX2RtYS54cmVzIC0gMSwgMCk7CisJCX0gZWxzZSB7CisJCQl0b3AgPSBQSVhBRERSKDAsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKKwkJCWVpID0gUElYU1RFUCgwLCAwLCAxLCAwKTsKKwkJCWZpID0gUElYU1RFUChsY2RfZG1hLnhyZXMgLSAxLCAxLCAwLCAwKTsKKwkJfQorCQllbiA9IGxjZF9kbWEueHJlczsKKwkJZm4gPSBsY2RfZG1hLnlyZXM7CisJCWJyZWFrOworCWNhc2UgMjcwOgorCQlpZiAoIWxjZF9kbWEubWlycm9yKSB7CisJCQl0b3AgPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOworCQkJYm90dG9tID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJCWVpID0gUElYU1RFUCgwLCAwLCAwLCAxKTsKKwkJCWZpID0gUElYU1RFUCgxLCBsY2RfZG1hLnlyZXMgLSAxLCAwLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXRvcCA9IFBJWEFERFIoMCwgMCk7CisJCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDAsIDEpOworCQkJZmkgPSBQSVhTVEVQKDAsIGxjZF9kbWEueXJlcyAtIDEsIDEsIDApOworCQl9CisJCWVuID0gbGNkX2RtYS55cmVzOworCQlmbiA9IGxjZF9kbWEueHJlczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybjsJLyogU3VwcmVzcyB3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFycyAqLworCX0KKworCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSkgeworCQlvbWFwX3dyaXRldyh0b3AgPj4gMTYsIE9NQVAxNTEwX0RNQV9MQ0RfVE9QX0YxX1UpOworCQlvbWFwX3dyaXRldyh0b3AsIE9NQVAxNTEwX0RNQV9MQ0RfVE9QX0YxX0wpOworCQlvbWFwX3dyaXRldyhib3R0b20gPj4gMTYsIE9NQVAxNTEwX0RNQV9MQ0RfQk9UX0YxX1UpOworCQlvbWFwX3dyaXRldyhib3R0b20sIE9NQVAxNTEwX0RNQV9MQ0RfQk9UX0YxX0wpOworCisJCXJldHVybjsKKwl9CisKKwkvKiAxNjEwIHJlZ3MgKi8KKwlvbWFwX3dyaXRldyh0b3AgPj4gMTYsIE9NQVAxNjEwX0RNQV9MQ0RfVE9QX0IxX1UpOworCW9tYXBfd3JpdGV3KHRvcCwgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfTCk7CisJb21hcF93cml0ZXcoYm90dG9tID4+IDE2LCBPTUFQMTYxMF9ETUFfTENEX0JPVF9CMV9VKTsKKwlvbWFwX3dyaXRldyhib3R0b20sIE9NQVAxNjEwX0RNQV9MQ0RfQk9UX0IxX0wpOworCisJb21hcF93cml0ZXcoZW4sIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0VOX0IxKTsKKwlvbWFwX3dyaXRldyhmbiwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRk5fQjEpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DU0RQKTsKKwl3ICY9IH4weDAzOworCXcgfD0gbGNkX2RtYS5kYXRhX3R5cGU7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DU0RQKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJLyogQWx3YXlzIHNldCB0aGUgc291cmNlIHBvcnQgYXMgU0RSQU0gZm9yIG5vdyovCisJdyAmPSB+KDB4MDMgPDwgNik7CisJaWYgKGxjZF9kbWEuZXh0X2N0cmwpCisJCXcgfD0gMSA8PCA4OworCWVsc2UKKwkJdyAmPSB+KDEgPDwgOCk7CisJaWYgKGxjZF9kbWEuY2FsbGJhY2sgIT0gTlVMTCkKKwkJdyB8PSAxIDw8IDE7ICAgICAgICAgICAgLyogQmxvY2sgaW50ZXJydXB0IGVuYWJsZSAqLworCWVsc2UKKwkJdyAmPSB+KDEgPDwgMSk7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKworCWlmICghKGxjZF9kbWEucm90YXRlIHx8IGxjZF9kbWEubWlycm9yIHx8CisJICAgICAgbGNkX2RtYS52eHJlcyB8fCBsY2RfZG1hLnhzY2FsZSB8fCBsY2RfZG1hLnlzY2FsZSkpCisJCXJldHVybjsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKwkvKiBTZXQgdGhlIGRvdWJsZS1pbmRleGVkIGFkZHJlc3NpbmcgbW9kZSAqLworCXcgfD0gKDB4MDMgPDwgMTIpOworCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKworCW9tYXBfd3JpdGV3KGVpLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19FSV9CMSk7CisJb21hcF93cml0ZXcoZmkgPj4gMTYsIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0ZJX0IxX1UpOworCW9tYXBfd3JpdGV3KGZpLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GSV9CMV9MKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxjZF9kbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJaWYgKHVubGlrZWx5KCEodyAmICgxIDw8IDMpKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgTENEIERNQSBJUlFcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCS8qIEFjayB0aGUgSVJRICovCisJdyB8PSAoMSA8PCAzKTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOworCWxjZF9kbWEuYWN0aXZlID0gMDsKKwlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQorCQlsY2RfZG1hLmNhbGxiYWNrKHcsIGxjZF9kbWEuY2JfZGF0YSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBvbWFwX3JlcXVlc3RfbGNkX2RtYSh2b2lkICgqIGNhbGxiYWNrKSh1MTYgc3RhdHVzLCB2b2lkICpkYXRhKSwKKwkJCSB2b2lkICpkYXRhKQoreworCXNwaW5fbG9ja19pcnEoJmxjZF9kbWEubG9jayk7CisJaWYgKGxjZF9kbWEucmVzZXJ2ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsY2RfZG1hLmxvY2spOworCQlwcmludGsoS0VSTl9FUlIgIkxDRCBETUEgY2hhbm5lbCBhbHJlYWR5IHJlc2VydmVkXG4iKTsKKwkJQlVHKCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWxjZF9kbWEucmVzZXJ2ZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmbGNkX2RtYS5sb2NrKTsKKwlsY2RfZG1hLmNhbGxiYWNrID0gY2FsbGJhY2s7CisJbGNkX2RtYS5jYl9kYXRhID0gZGF0YTsKKwlsY2RfZG1hLmFjdGl2ZSA9IDA7CisJbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIgPSAwOworCWxjZF9kbWEucm90YXRlID0gMDsKKwlsY2RfZG1hLnZ4cmVzID0gMDsKKwlsY2RfZG1hLm1pcnJvciA9IDA7CisJbGNkX2RtYS54c2NhbGUgPSAwOworCWxjZF9kbWEueXNjYWxlID0gMDsKKwlsY2RfZG1hLmV4dF9jdHJsID0gMDsKKwlsY2RfZG1hLnNyY19wb3J0ID0gMDsKKworCXJldHVybiAwOworfQorCit2b2lkIG9tYXBfZnJlZV9sY2RfZG1hKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZsY2RfZG1hLmxvY2spOworCWlmICghbGNkX2RtYS5yZXNlcnZlZCkgeworCQlzcGluX3VubG9jaygmbGNkX2RtYS5sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJMQ0QgRE1BIGlzIG5vdCByZXNlcnZlZFxuIik7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCWlmICghZW5hYmxlXzE1MTBfbW9kZSkKKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiB+MSwgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCWxjZF9kbWEucmVzZXJ2ZWQgPSAwOworCXNwaW5fdW5sb2NrKCZsY2RfZG1hLmxvY2spOworfQorCit2b2lkIG9tYXBfZW5hYmxlX2xjZF9kbWEodm9pZCkKK3sKKwl1MTYgdzsKKworCS8qIFNldCB0aGUgRW5hYmxlIGJpdCBvbmx5IGlmIGFuIGV4dGVybmFsIGNvbnRyb2xsZXIgaXMKKwkgKiBjb25uZWN0ZWQuIE90aGVyd2lzZSB0aGUgT01BUCBpbnRlcm5hbCBjb250cm9sbGVyIHdpbGwKKwkgKiBzdGFydCB0aGUgdHJhbnNmZXIgd2hlbiBpdCBnZXRzIGVuYWJsZWQuCisJICovCisJaWYgKGVuYWJsZV8xNTEwX21vZGUgfHwgIWxjZF9kbWEuZXh0X2N0cmwpCisJCXJldHVybjsKKwl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CisJdyB8PSAxIDw8IDc7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCWxjZF9kbWEuYWN0aXZlID0gMTsKK30KKwordm9pZCBvbWFwX3NldHVwX2xjZF9kbWEodm9pZCkKK3sKKwlCVUdfT04obGNkX2RtYS5hY3RpdmUpOworCWlmICghZW5hYmxlXzE1MTBfbW9kZSkgeworCQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzICovCisJCW9tYXBfd3JpdGV3KDB4NTQ0MCwgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCQlvbWFwX3dyaXRldygweDkxMDIsIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUCk7CisJCW9tYXBfd3JpdGV3KDB4MDAwNCwgT01BUDE2MTBfRE1BX0xDRF9MQ0hfQ1RSTCk7CisJfQorCXNldF9iMV9yZWdzKCk7CisJaWYgKCFlbmFibGVfMTUxMF9tb2RlKSB7CisJCXUxNiB3OworCisJCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKwkJLyogSWYgRE1BIHdhcyBhbHJlYWR5IGFjdGl2ZSBzZXQgdGhlIGVuZF9wcm9nIGJpdCB0byBoYXZlCisJCSAqIHRoZSBwcm9ncmFtbWVkIHJlZ2lzdGVyIHNldCBsb2FkZWQgaW50byB0aGUgYWN0aXZlCisJCSAqIHJlZ2lzdGVyIHNldC4KKwkJICovCisJCXcgfD0gMSA8PCAxMTsJCS8qIEVuZF9wcm9nICovCisJCWlmICghbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIpCisJICAgICAgICAJdyB8PSAoMyA8PCA4KTsJLyogQXV0b19pbml0LCByZXBlYXQgKi8KKwkJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCX0KK30KKwordm9pZCBvbWFwX3N0b3BfbGNkX2RtYSh2b2lkKQoreworCWxjZF9kbWEuYWN0aXZlID0gMDsKKwlpZiAoIWVuYWJsZV8xNTEwX21vZGUgJiYgbGNkX2RtYS5leHRfY3RybCkKKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiB+KDEgPDwgNyksCisJCQkgICAgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworfQorCisvKgorICogQ2xlYXJzIGFueSBETUEgc3RhdGUgc28gdGhlIERNQSBlbmdpbmUgaXMgcmVhZHkgdG8gcmVzdGFydCB3aXRoIG5ldyBidWZmZXJzCisgKiB0aHJvdWdoIG9tYXBfc3RhcnRfZG1hKCkuIEFueSBidWZmZXJzIGluIGZsaWdodCBhcmUgZGlzY2FyZGVkLgorICovCit2b2lkIG9tYXBfY2xlYXJfZG1hKGludCBsY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpICYgfk9NQVBfRE1BX0NDUl9FTiwKKwkJICAgIE9NQVBfRE1BX0NDUihsY2gpKTsKKwlzdGF0dXMgPSBPTUFQX0RNQV9DU1IobGNoKTsJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogUmV0dXJucyBjdXJyZW50IHBoeXNpY2FsIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwuCisgKiBJZiB0aGUgY2hhbm5lbCBpcyBydW5uaW5nIHRoZSBjYWxsZXIgbXVzdCBkaXNhYmxlIGludGVycnVwdHMgcHJpb3IgY2FsbGluZworICogdGhpcyBmdW5jdGlvbiBhbmQgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgYmVmb3JlIHJlLWVuYWJsaW5nIGludGVycnVwdCB0bworICogcHJldmVudCByYWNlcyB3aXRoIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gTm90ZSB0aGF0IGluIGNvbnRpbnVvdXMgbW9kZSB0aGVyZQorICogaXMgYSBjaGFuY2UgZm9yIENTU0FfTCByZWdpc3RlciBvdmVyZmxvdyBpbmJldHdlZW4gdGhlIHR3byByZWFkcyByZXN1bHRpbmcKKyAqIGluIGluY29ycmVjdCByZXR1cm4gdmFsdWUuCisgKi8KK2RtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCkKK3sKKwlyZXR1cm4gKGRtYV9hZGRyX3QpIChPTUFQX0RNQV9DU1NBX0wobGNoKSB8CisJCQkgICAgIChPTUFQX0RNQV9DU1NBX1UobGNoKSA8PCAxNikpOworfQorCisvKgorICogUmV0dXJucyBjdXJyZW50IHBoeXNpY2FsIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBETUEgY2hhbm5lbC4KKyAqIElmIHRoZSBjaGFubmVsIGlzIHJ1bm5pbmcgdGhlIGNhbGxlciBtdXN0IGRpc2FibGUgaW50ZXJydXB0cyBwcmlvciBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uIGFuZCBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSBiZWZvcmUgcmUtZW5hYmxpbmcgaW50ZXJydXB0IHRvCisgKiBwcmV2ZW50IHJhY2VzIHdpdGggdGhlIGludGVycnVwdCBoYW5kbGVyLiBOb3RlIHRoYXQgaW4gY29udGludW91cyBtb2RlIHRoZXJlCisgKiBpcyBhIGNoYW5jZSBmb3IgQ0RTQV9MIHJlZ2lzdGVyIG92ZXJmbG93IGluYmV0d2VlbiB0aGUgdHdvIHJlYWRzIHJlc3VsdGluZworICogaW4gaW5jb3JyZWN0IHJldHVybiB2YWx1ZS4KKyAqLworZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKQoreworCXJldHVybiAoZG1hX2FkZHJfdCkgKE9NQVBfRE1BX0NEU0FfTChsY2gpIHwKKwkJCSAgICAgKE9NQVBfRE1BX0NEU0FfVShsY2gpIDw8IDE2KSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfaW5pdF9kbWEodm9pZCkKK3sKKwlpbnQgY2gsIHI7CisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIHN1cHBvcnQgZm9yIE9NQVAxNTEwIGluaXRpYWxpemVkXG4iKTsKKwkJZG1hX2NoYW5fY291bnQgPSA5OworCQllbmFibGVfMTUxMF9tb2RlID0gMTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBETUEgaGFyZHdhcmUgdmVyc2lvbiAlZFxuIiwKKwkJICAgICAgIG9tYXBfcmVhZHcoT01BUF9ETUFfSFdfSUQpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIGNhcGFiaWxpdGllczogJTA4eDolMDh4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkgICAgICAgKG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18wX1UpIDw8IDE2KSB8IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18wX0wpLAorCQkgICAgICAgKG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18xX1UpIDw8IDE2KSB8IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18xX0wpLAorCQkgICAgICAgb21hcF9yZWFkdyhPTUFQX0RNQV9DQVBTXzIpLCBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMyksCisJCSAgICAgICBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfNCkpOworCQlpZiAoIWVuYWJsZV8xNTEwX21vZGUpIHsKKwkJCXUxNiB3OworCisJCQkvKiBEaXNhYmxlIE9NQVAgMy4wLzMuMSBjb21wYXRpYmlsaXR5IG1vZGUuICovCisJCQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9HU0NSKTsKKwkJCXcgfD0gMSA8PCAzOworCQkJb21hcF93cml0ZXcodywgT01BUF9ETUFfR1NDUik7CisJCQlkbWFfY2hhbl9jb3VudCA9IDE2OworCQl9IGVsc2UKKwkJCWRtYV9jaGFuX2NvdW50ID0gOTsKKwl9IGVsc2UgeworCQlkbWFfY2hhbl9jb3VudCA9IDA7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCgmbGNkX2RtYSwgMCwgc2l6ZW9mKGxjZF9kbWEpKTsKKwlzcGluX2xvY2tfaW5pdCgmbGNkX2RtYS5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZG1hX2NoYW5fbG9jayk7CisJbWVtc2V0KCZkbWFfY2hhbiwgMCwgc2l6ZW9mKGRtYV9jaGFuKSk7CisKKwlmb3IgKGNoID0gMDsgY2ggPCBkbWFfY2hhbl9jb3VudDsgY2grKykgeworCQlkbWFfY2hhbltjaF0uZGV2X2lkID0gLTE7CisJCWRtYV9jaGFuW2NoXS5uZXh0X2xjaCA9IC0xOworCisJCWlmIChjaCA+PSA2ICYmIGVuYWJsZV8xNTEwX21vZGUpCisJCQljb250aW51ZTsKKworCQkvKiByZXF1ZXN0X2lycSgpIGRvZXNuJ3QgbGlrZSBkZXZfaWQgKGllLiBjaCkgYmVpbmcgemVybywKKwkJICogc28gd2UgaGF2ZSB0byBrbHVkZ2UgYXJvdW5kIHRoaXMuICovCisJCXIgPSByZXF1ZXN0X2lycShkbWFfaXJxW2NoXSwgZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwKKwkJCQkodm9pZCAqKSAoY2ggKyAxKSk7CisJCWlmIChyICE9IDApIHsKKwkJCWludCBpOworCisJCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IElSUSAlZCBmb3IgRE1BIChlcnJvciAlZClcbiIsCisJCQkgICAgICAgZG1hX2lycVtjaF0sIHIpOworCQkJZm9yIChpID0gMDsgaSA8IGNoOyBpKyspCisJCQkJZnJlZV9pcnEoZG1hX2lycVtpXSwgKHZvaWQgKikgKGkgKyAxKSk7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKwlyID0gcmVxdWVzdF9pcnEoSU5UX0RNQV9MQ0QsIGxjZF9kbWFfaXJxX2hhbmRsZXIsIDAsICJMQ0QgRE1BIiwgTlVMTCk7CisJaWYgKHIgIT0gMCkgeworCQlpbnQgaTsKKworCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IElSUSBmb3IgTENEIERNQSAoZXJyb3IgJWQpXG4iLCByKTsKKwkJZm9yIChpID0gMDsgaSA8IGRtYV9jaGFuX2NvdW50OyBpKyspCisJCQlmcmVlX2lycShkbWFfaXJxW2ldLCAodm9pZCAqKSAoaSArIDEpKTsKKwkJcmV0dXJuIHI7CisJfQorCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKG9tYXBfaW5pdF9kbWEpOworCisKK0VYUE9SVF9TWU1CT0wob21hcF9nZXRfZG1hX3NyY19wb3MpOworRVhQT1JUX1NZTUJPTChvbWFwX2dldF9kbWFfZHN0X3Bvcyk7CitFWFBPUlRfU1lNQk9MKG9tYXBfY2xlYXJfZG1hKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3ByaW9yaXR5KTsKK0VYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9kbWEpOworRVhQT1JUX1NZTUJPTChvbWFwX3N0YXJ0X2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc3RvcF9kbWEpOworRVhQT1JUX1NZTUJPTChvbWFwX2VuYWJsZV9kbWFfaXJxKTsKK0VYUE9SVF9TWU1CT0wob21hcF9kaXNhYmxlX2RtYV9pcnEpOworCitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMpOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfY29sb3JfbW9kZSk7CisKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19wYXJhbXMpOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfc3JjX2luZGV4KTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19kYXRhX3BhY2spOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUpOworCitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X2luZGV4KTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2Rlc3RfZGF0YV9wYWNrKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2Rlc3RfYnVyc3RfbW9kZSk7CisKK0VYUE9SVF9TWU1CT0wob21hcF9kbWFfbGlua19sY2gpOworRVhQT1JUX1NZTUJPTChvbWFwX2RtYV91bmxpbmtfbGNoKTsKKworRVhQT1JUX1NZTUJPTChvbWFwX3JlcXVlc3RfbGNkX2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9sY2RfZG1hKTsKK0VYUE9SVF9TWU1CT0wob21hcF9lbmFibGVfbGNkX2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0dXBfbGNkX2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc3RvcF9sY2RfZG1hKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9leHRfY29udHJvbGxlcik7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjFfcm90YXRpb24pOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV9zY2FsZSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2ZwZ2EuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9mcGdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwOGY2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9mcGdhLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvZnBnYS5jCisgKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIE9NQVAtMTUxMCBJbm5vdmF0b3IgRlBHQQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBSaWRnZVJ1biwgSW5jLgorICogQXV0aG9yOiBHcmVnIExvbm5vbiA8Z2xvbm5vbkByaWRnZXJ1bi5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBTZXBhcmF0ZWQgRlBHQSBpbnRlcnJ1cHRzIGZyb20gaW5ub3ZhdG9yMTUxMC5jIGFuZCBjbGVhbmVkIHVwIGZvciAyLjYKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbiBieSBUb255IExpbmRyZ2VuIDx0b255QGF0b21pZGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCitzdGF0aWMgdm9pZCBmcGdhX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxIC09IE9NQVAxNTEwX0lIX0ZQR0FfQkFTRTsKKworCWlmIChpcnEgPCA4KQorCQlfX3Jhd193cml0ZWIoKF9fcmF3X3JlYWRiKE9NQVAxNTEwX0ZQR0FfSU1SX0xPKQorCQkJICAgICAgJiB+KDEgPDwgaXJxKSksIE9NQVAxNTEwX0ZQR0FfSU1SX0xPKTsKKwllbHNlIGlmIChpcnEgPCAxNikKKwkJX19yYXdfd3JpdGViKChfX3Jhd19yZWFkYihPTUFQMTUxMF9GUEdBX0lNUl9ISSkKKwkJCSAgICAgICYgfigxIDw8IChpcnEgLSA4KSkpLCBPTUFQMTUxMF9GUEdBX0lNUl9ISSk7CisJZWxzZQorCQlfX3Jhd193cml0ZWIoKF9fcmF3X3JlYWRiKElOTk9WQVRPUl9GUEdBX0lNUjIpCisJCQkgICAgICAmIH4oMSA8PCAoaXJxIC0gMTYpKSksIElOTk9WQVRPUl9GUEdBX0lNUjIpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9mcGdhX3VubWFza2VkX2lycXModm9pZCkKK3sKKwlyZXR1cm4KKwkJKChfX3Jhd19yZWFkYihPTUFQMTUxMF9GUEdBX0lTUl9MTykgJgorCQkgIF9fcmF3X3JlYWRiKE9NQVAxNTEwX0ZQR0FfSU1SX0xPKSkpIHwKKwkJKChfX3Jhd19yZWFkYihPTUFQMTUxMF9GUEdBX0lTUl9ISSkgJgorCQkgIF9fcmF3X3JlYWRiKE9NQVAxNTEwX0ZQR0FfSU1SX0hJKSkgPDwgOCkgfAorCQkoKF9fcmF3X3JlYWRiKElOTk9WQVRPUl9GUEdBX0lTUjIpICYKKwkJICBfX3Jhd19yZWFkYihJTk5PVkFUT1JfRlBHQV9JTVIyKSkgPDwgMTYpOworfQorCisKK3N0YXRpYyB2b2lkIGZwZ2FfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIERvbid0IG5lZWQgdG8gZXhwbGljaXRseSBBQ0sgRlBHQSBpbnRlcnJ1cHRzICovCit9CisKK3N0YXRpYyB2b2lkIGZwZ2FfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlycSAtPSBPTUFQMTUxMF9JSF9GUEdBX0JBU0U7CisKKwlpZiAoaXJxIDwgOCkKKwkJX19yYXdfd3JpdGViKChfX3Jhd19yZWFkYihPTUFQMTUxMF9GUEdBX0lNUl9MTykgfCAoMSA8PCBpcnEpKSwKKwkJICAgICBPTUFQMTUxMF9GUEdBX0lNUl9MTyk7CisJZWxzZSBpZiAoaXJxIDwgMTYpCisJCV9fcmF3X3dyaXRlYigoX19yYXdfcmVhZGIoT01BUDE1MTBfRlBHQV9JTVJfSEkpCisJCQkgICAgICB8ICgxIDw8IChpcnEgLSA4KSkpLCBPTUFQMTUxMF9GUEdBX0lNUl9ISSk7CisJZWxzZQorCQlfX3Jhd193cml0ZWIoKF9fcmF3X3JlYWRiKElOTk9WQVRPUl9GUEdBX0lNUjIpCisJCQkgICAgICB8ICgxIDw8IChpcnEgLSAxNikpKSwgSU5OT1ZBVE9SX0ZQR0FfSU1SMik7Cit9CisKK3N0YXRpYyB2b2lkIGZwZ2FfbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZnBnYV9tYXNrX2lycShpcnEpOworCWZwZ2FfYWNrX2lycShpcnEpOworfQorCit2b2lkIGlubm92YXRvcl9mcGdhX0lSUV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpcnFkZXNjICpkOworCXUzMiBzdGF0OworCWludCBmcGdhX2lycTsKKworCXN0YXQgPSBnZXRfZnBnYV91bm1hc2tlZF9pcnFzKCk7CisKKwlpZiAoIXN0YXQpCisJCXJldHVybjsKKworCWZvciAoZnBnYV9pcnEgPSBPTUFQMTUxMF9JSF9GUEdBX0JBU0U7CisJICAgICAoZnBnYV9pcnEgPCAoT01BUDE1MTBfSUhfRlBHQV9CQVNFICsgTlJfRlBHQV9JUlFTKSkgJiYgc3RhdDsKKwkgICAgIGZwZ2FfaXJxKyssIHN0YXQgPj49IDEpIHsKKwkJaWYgKHN0YXQgJiAxKSB7CisJCQlkID0gaXJxX2Rlc2MgKyBmcGdhX2lycTsKKwkJCWQtPmhhbmRsZShmcGdhX2lycSwgZCwgcmVncyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBvbWFwX2ZwZ2FfaXJxX2FjayA9IHsKKwkuYWNrCQk9IGZwZ2FfbWFza19hY2tfaXJxLAorCS5tYXNrCQk9IGZwZ2FfbWFza19pcnEsCisJLnVubWFzawkJPSBmcGdhX3VubWFza19pcnEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBvbWFwX2ZwZ2FfaXJxID0geworCS5hY2sJCT0gZnBnYV9hY2tfaXJxLAorCS5tYXNrCQk9IGZwZ2FfbWFza19pcnEsCisJLnVubWFzawkJPSBmcGdhX3VubWFza19pcnEsCit9OworCisvKgorICogQWxsIG9mIHRoZSBGUEdBIGludGVycnVwdCByZXF1ZXN0IGlucHV0cyBleGNlcHQgZm9yIHRoZSB0b3VjaHNjcmVlbiBhcmUKKyAqIGVkZ2Utc2Vuc2l0aXZlOyB0aGUgdG91Y2hzY3JlZW4gaXMgbGV2ZWwtc2Vuc2l0aXZlLiAgVGhlIGVkZ2Utc2Vuc2l0aXZlCisgKiBpbnRlcnJ1cHRzIGFyZSBhY2tub3dsZWRnZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiByZWFkaW5nIHRoZSBpbnRlcnJ1cHQKKyAqIHN0YXR1cyByZWdpc3RlciBmcm9tIHRoZSBGUEdBLiAgVGhlIGVkZ2Utc2Vuc2l0aXZlIGludGVycnVwdCBpbnB1dHMKKyAqIGNhdXNlIGEgcHJvYmxlbSB3aXRoIGxldmVsIGludGVycnVwdCByZXF1ZXN0cywgc3VjaCBhcyBFdGhlcm5ldC4gIFRoZQorICogcHJvYmxlbSBvY2N1cnMgd2hlbiBhIGxldmVsIGludGVycnVwdCByZXF1ZXN0IGlzIGFzc2VydGVkIHdoaWxlIGl0cworICogaW50ZXJydXB0IGlucHV0IGlzIG1hc2tlZCBpbiB0aGUgRlBHQSwgd2hpY2ggcmVzdWx0cyBpbiBhIG1pc3NlZAorICogaW50ZXJydXB0LgorICoKKyAqIEluIGFuIGF0dGVtcHQgdG8gd29ya2Fyb3VuZCB0aGUgcHJvYmxlbSB3aXRoIG1pc3NlZCBpbnRlcnJ1cHRzLCB0aGUKKyAqIG1hc2tfYWNrIHJvdXRpbmUgZm9yIGFsbCBvZiB0aGUgRlBHQSBpbnRlcnJ1cHRzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQorICogZnBnYV9tYXNrX2Fja19pcnEoKSB0byBmcGdhX2Fja19pcnEoKSBzbyB0aGF0IHRoZSBzcGVjaWZpYyBGUEdBIGludGVycnVwdAorICogYmVpbmcgc2VydmljZWQgaXMgbGVmdCB1bm1hc2tlZC4gIFdlIGNhbiBkbyB0aGlzIGJlY2F1c2UgdGhlIEZQR0EgY2FzY2FkZQorICogaW50ZXJydXB0IGlzIGluc3RhbGxlZCB3aXRoIHRoZSBTQV9JTlRFUlJVUFQgZmxhZywgd2hpY2ggbGVhdmVzIGFsbAorICogaW50ZXJydXB0cyBtYXNrZWQgYXQgdGhlIENQVSB3aGlsZSBhbiBGUEdBIGludGVycnVwdCBoYW5kbGVyIGV4ZWN1dGVzLgorICoKKyAqIExpbWl0ZWQgdGVzdGluZyBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdvcmthcm91bmQgYXBwZWFycyB0byBiZSBlZmZlY3RpdmUKKyAqIGZvciB0aGUgc21jOTE5NCBFdGhlcm5ldCBkcml2ZXIgdXNlZCBvbiB0aGUgSW5ub3ZhdG9yLiAgSXQgc2hvdWxkIHdvcmsKKyAqIG9uIG90aGVyIEZQR0EgaW50ZXJydXB0cyBhcyB3ZWxsLCBidXQgYW55IGRyaXZlcnMgdGhhdCBleHBsaWNpdGx5IG1hc2sKKyAqIGludGVycnVwdHMgYXQgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHZpYSBkaXNhYmxlX2lycS9lbmFibGVfaXJxCisgKiBjb3VsZCBwb3NlIGEgcHJvYmxlbS4KKyAqLwordm9pZCBvbWFwMTUxMF9mcGdhX2luaXRfaXJxKHZvaWQpCit7CisJaW50IGk7CisKKwlfX3Jhd193cml0ZWIoMCwgT01BUDE1MTBfRlBHQV9JTVJfTE8pOworCV9fcmF3X3dyaXRlYigwLCBPTUFQMTUxMF9GUEdBX0lNUl9ISSk7CisJX19yYXdfd3JpdGViKDAsIElOTk9WQVRPUl9GUEdBX0lNUjIpOworCisJZm9yIChpID0gT01BUDE1MTBfSUhfRlBHQV9CQVNFOyBpIDwgKE9NQVAxNTEwX0lIX0ZQR0FfQkFTRSArIE5SX0ZQR0FfSVJRUyk7IGkrKykgeworCisJCWlmIChpID09IE9NQVAxNTEwX0lOVF9GUEdBX1RTKSB7CisJCQkvKgorCQkJICogVGhlIHRvdWNoc2NyZWVuIGludGVycnVwdCBpcyBsZXZlbC1zZW5zaXRpdmUsIHNvCisJCQkgKiB3ZSdsbCB1c2UgdGhlIHJlZ3VsYXIgbWFza19hY2sgcm91dGluZSBmb3IgaXQuCisJCQkgKi8KKwkJCXNldF9pcnFfY2hpcChpLCAmb21hcF9mcGdhX2lycV9hY2spOworCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEFsbCBGUEdBIGludGVycnVwdHMgZXhjZXB0IHRoZSB0b3VjaHNjcmVlbiBhcmUKKwkJCSAqIGVkZ2Utc2Vuc2l0aXZlLCBzbyB3ZSB3b24ndCBtYXNrIHRoZW0uCisJCQkgKi8KKwkJCXNldF9pcnFfY2hpcChpLCAmb21hcF9mcGdhX2lycSk7CisJCX0KKworCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOworCX0KKworCS8qCisJICogVGhlIEZQR0EgaW50ZXJydXB0IGxpbmUgaXMgY29ubmVjdGVkIHRvIEdQSU8xMy4gQ2xhaW0gdGhpcyBwaW4gZm9yCisJICogdGhlIEFSTS4KKwkgKgorCSAqIE5PVEU6IEZvciBnZW5lcmFsIEdQSU8vTVBVSU8gYWNjZXNzIGFuZCBpbnRlcnJ1cHRzLCBwbGVhc2Ugc2VlCisJICogZ3Bpby5bY2hdCisJICovCisJb21hcF9yZXF1ZXN0X2dwaW8oMTMpOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDEzLCAxKTsKKwlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxMywgT01BUF9HUElPX1JJU0lOR19FREdFKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihPTUFQMTUxMF9JTlRfRlBHQSwgaW5ub3ZhdG9yX2ZwZ2FfSVJRX2RlbXV4KTsKK30KKworRVhQT1JUX1NZTUJPTChvbWFwMTUxMF9mcGdhX2luaXRfaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDVkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvZ3Bpby5jCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ncGlvLmMKKyAqCisgKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgT01BUCBHUElPCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIE5va2lhIENvcnBvcmF0aW9uCisgKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKgorICogT01BUDE1MTAgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJCTB4ZmZmY2UwMDAKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX0lOUFVUCTB4MDAKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVAkweDA0CisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fRElSX0NPTlRST0wJMHgwOAorI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9DT05UUk9MCTB4MGMKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19JTlRfTUFTSwkJMHgxMAorI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9TVEFUVVMJMHgxNAorI2RlZmluZSBPTUFQMTUxMF9HUElPX1BJTl9DT05UUk9MCTB4MTgKKworI2RlZmluZSBPTUFQMTUxMF9JSF9HUElPX0JBU0UJCTY0CisKKy8qCisgKiBPTUFQMTYxMCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycworICovCisjZGVmaW5lIE9NQVAxNjEwX0dQSU8xX0JBU0UJCTB4ZmZmYmU0MDAKKyNkZWZpbmUgT01BUDE2MTBfR1BJTzJfQkFTRQkJMHhmZmZiZWMwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPM19CQVNFCQkweGZmZmJiNDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU80X0JBU0UJCTB4ZmZmYmJjMDAKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19SRVZJU0lPTgkJMHgwMDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU1lTQ09ORklHCQkweDAwMTAKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19TWVNTVEFUVVMJCTB4MDAxNAorI2RlZmluZSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEJMHgwMDE4CisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMQkweDAwMWMKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19EQVRBSU4JCTB4MDAyYworI2RlZmluZSBPTUFQMTYxMF9HUElPX0RBVEFPVVQJCTB4MDAzMAorI2RlZmluZSBPTUFQMTYxMF9HUElPX0RJUkVDVElPTgkJMHgwMDM0CisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMQkweDAwMzgKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19FREdFX0NUUkwyCTB4MDAzYworI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTEJMHgwMDljCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfREFUQU9VVAkweDAwYjAKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfSVJRRU5BQkxFMQkweDAwZGMKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfREFUQU9VVAkweDAwZjAKKworLyoKKyAqIE9NQVA3MzAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCTB4ZmZmYmMwMDAKKyNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQkweGZmZmJjODAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzNfQkFTRQkJMHhmZmZiZDAwMAorI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCTB4ZmZmYmQ4MDAKKyNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQkweGZmZmJlMDAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzZfQkFTRQkJMHhmZmZiZTgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVAkJMHgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAorI2RlZmluZSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0wJMHgwOAorI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX0NPTlRST0wJMHgwYworI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX01BU0sJCTB4MTAKKyNkZWZpbmUgT01BUDczMF9HUElPX0lOVF9TVEFUVVMJCTB4MTQKKworI2RlZmluZSBPTUFQX01QVUlPX01BU0sJCSh+T01BUF9NQVhfR1BJT19MSU5FUyAmIDB4ZmYpCisKK3N0cnVjdCBncGlvX2JhbmsgeworCXUzMiBiYXNlOworCXUxNiBpcnE7CisJdTE2IHZpcnR1YWxfaXJxX3N0YXJ0OworCXU4IG1ldGhvZDsKKwl1MzIgcmVzZXJ2ZWRfbWFwOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKyNkZWZpbmUgTUVUSE9EX01QVUlPCQkwCisjZGVmaW5lIE1FVEhPRF9HUElPXzE1MTAJMQorI2RlZmluZSBNRVRIT0RfR1BJT18xNjEwCTIKKyNkZWZpbmUgTUVUSE9EX0dQSU9fNzMwCQkzCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzE2MTBbNV0gPSB7CisJeyBPTUFQX01QVUlPX0JBU0UsICAgICBJTlRfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLCAgICAgTUVUSE9EX01QVUlPfSwKKwl7IE9NQVAxNjEwX0dQSU8xX0JBU0UsIElOVF9HUElPX0JBTksxLAkgICAgSUhfR1BJT19CQVNFLCAgICAgIE1FVEhPRF9HUElPXzE2MTAgfSwKKwl7IE9NQVAxNjEwX0dQSU8yX0JBU0UsIElOVF8xNjEwX0dQSU9fQkFOSzIsIElIX0dQSU9fQkFTRSArIDE2LCBNRVRIT0RfR1BJT18xNjEwIH0sCisJeyBPTUFQMTYxMF9HUElPM19CQVNFLCBJTlRfMTYxMF9HUElPX0JBTkszLCBJSF9HUElPX0JBU0UgKyAzMiwgTUVUSE9EX0dQSU9fMTYxMCB9LAorCXsgT01BUDE2MTBfR1BJTzRfQkFTRSwgSU5UXzE2MTBfR1BJT19CQU5LNCwgSUhfR1BJT19CQVNFICsgNDgsIE1FVEhPRF9HUElPXzE2MTAgfSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMTUxMFsyXSA9IHsKKwl7IE9NQVBfTVBVSU9fQkFTRSwgICAgSU5UX01QVUlPLCAgICAgIElIX01QVUlPX0JBU0UsIE1FVEhPRF9NUFVJTyB9LAorCXsgT01BUDE1MTBfR1BJT19CQVNFLCBJTlRfR1BJT19CQU5LMSwgSUhfR1BJT19CQVNFLCAgTUVUSE9EX0dQSU9fMTUxMCB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfNzMwWzddID0geworCXsgT01BUF9NUFVJT19CQVNFLCAgICAgSU5UXzczMF9NUFVJTywJICAgIElIX01QVUlPX0JBU0UsCU1FVEhPRF9NUFVJTyB9LAorCXsgT01BUDczMF9HUElPMV9CQVNFLCAgSU5UXzczMF9HUElPX0JBTksxLCAgSUhfR1BJT19CQVNFLAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzJfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMiwgIElIX0dQSU9fQkFTRSArIDMyLAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzNfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMywgIElIX0dQSU9fQkFTRSArIDY0LAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzRfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LNCwgIElIX0dQSU9fQkFTRSArIDk2LAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzVfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LNSwgIElIX0dQSU9fQkFTRSArIDEyOCwgTUVUSE9EX0dQSU9fNzMwIH0sCisJeyBPTUFQNzMwX0dQSU82X0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzYsICBJSF9HUElPX0JBU0UgKyAxNjAsIE1FVEhPRF9HUElPXzczMCB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayAqZ3Bpb19iYW5rOworc3RhdGljIGludCBncGlvX2JhbmtfY291bnQ7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fYmFuayAqZ2V0X2dwaW9fYmFuayhpbnQgZ3BpbykKK3sKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKQorCQkJcmV0dXJuICZncGlvX2JhbmtbMF07CisJCXJldHVybiAmZ3Bpb19iYW5rWzFdOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpCisJCQlyZXR1cm4gJmdwaW9fYmFua1swXTsKKwkJcmV0dXJuICZncGlvX2JhbmtbMSArIChncGlvID4+IDQpXTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJaWYgKE9NQVBfR1BJT19JU19NUFVJTyhncGlvKSkKKwkJCXJldHVybiAmZ3Bpb19iYW5rWzBdOworCQlyZXR1cm4gJmdwaW9fYmFua1sxICsgKGdwaW8gPj4gNSldOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfZ3Bpb19pbmRleChpbnQgZ3BpbykKK3sKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkKKwkJcmV0dXJuIGdwaW8gJiAweDFmOworCWVsc2UKKwkJcmV0dXJuIGdwaW8gJiAweDBmOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX3ZhbGlkKGludCBncGlvKQoreworCWlmIChncGlvIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpIHsKKwkJaWYgKChncGlvICYgT01BUF9NUFVJT19NQVNLKSA+IDE2KQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkgJiYgZ3BpbyA8IDE2KQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKChjcHVfaXNfb21hcDE2eHgoKSkgJiYgZ3BpbyA8IDY0KQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSAmJiBncGlvIDwgMTkyKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBjaGVja19ncGlvKGludCBncGlvKQoreworCWlmICh1bmxpa2VseShncGlvX3ZhbGlkKGdwaW8pKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvbWFwLWdwaW86IGludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpbyk7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX3NldF9ncGlvX2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGlzX2lucHV0KQoreworCXUzMiByZWcgPSBiYW5rLT5iYXNlOworCXUzMiBsOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJcmVnICs9IE9NQVBfTVBVSU9fSU9fQ05UTDsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19ESVJfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgorCQlyZWcgKz0gT01BUDE2MTBfR1BJT19ESVJFQ1RJT047CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgorCQlyZWcgKz0gT01BUDczMF9HUElPX0RJUl9DT05UUk9MOworCQlicmVhazsKKwl9CisJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJaWYgKGlzX2lucHV0KQorCQlsIHw9IDEgPDwgZ3BpbzsKKwllbHNlCisJCWwgJj0gfigxIDw8IGdwaW8pOworCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCit2b2lkIG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGludCBncGlvLCBpbnQgaXNfaW5wdXQpCit7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuOworCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOworCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CisJX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgaXNfaW5wdXQpOworCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX3NldF9ncGlvX2RhdGFvdXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlbmFibGUpCit7CisJdTMyIHJlZyA9IGJhbmstPmJhc2U7CisJdTMyIGwgPSAwOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJcmVnICs9IE9NQVBfTVBVSU9fT1VUUFVUOworCQlsID0gX19yYXdfcmVhZGwocmVnKTsKKwkJaWYgKGVuYWJsZSkKKwkJCWwgfD0gMSA8PCBncGlvOworCQllbHNlCisJCQlsICY9IH4oMSA8PCBncGlvKTsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVDsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsIHw9IDEgPDwgZ3BpbzsKKwkJZWxzZQorCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwkJaWYgKGVuYWJsZSkKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9EQVRBT1VUOworCQllbHNlCisJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9EQVRBT1VUOworCQlsID0gMSA8PCBncGlvOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX09VVFBVVDsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsIHw9IDEgPDwgZ3BpbzsKKwkJZWxzZQorCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCit2b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQorCQlyZXR1cm47CisJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwlfc2V0X2dwaW9fZGF0YW91dChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgZW5hYmxlKTsKKwlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cit9CisKK2ludCBvbWFwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3BpbykKK3sKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCXUzMiByZWc7CisKKwlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCisJCXJldHVybiAtMTsKKwliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwlyZWcgPSBiYW5rLT5iYXNlOworCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CisJY2FzZSBNRVRIT0RfTVBVSU86CisJCXJlZyArPSBPTUFQX01QVUlPX0lOUFVUX0xBVENIOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzE1MTA6CisJCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfSU5QVVQ7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwkJcmVnICs9IE9NQVAxNjEwX0dQSU9fREFUQUlOOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX0lOUFVUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfZ3Bpb19lZGdlX2N0cmwoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlZGdlKQoreworCXUzMiByZWcgPSBiYW5rLT5iYXNlOworCXUzMiBsOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJcmVnICs9IE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRTsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJCWwgfD0gMSA8PCBncGlvOworCQllbHNlCisJCQlsICY9IH4oMSA8PCBncGlvKTsKKwkJX19yYXdfd3JpdGVsKGwsIHJlZyk7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKKwkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0w7CisJCWwgPSBfX3Jhd19yZWFkbChyZWcpOworCQlpZiAoZWRnZSA9PSBPTUFQX0dQSU9fUklTSU5HX0VER0UpCisJCQlsIHw9IDEgPDwgZ3BpbzsKKwkJZWxzZQorCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CisJCV9fcmF3X3dyaXRlbChsLCByZWcpOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCWVkZ2UgJj0gMHgwMzsKKwkJaWYgKGdwaW8gJiAweDA4KQorCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMjsKKwkJZWxzZQorCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMTsKKwkJZ3BpbyAmPSAweDA3OworCQlsID0gX19yYXdfcmVhZGwocmVnKTsKKwkJbCAmPSB+KDMgPDwgKGdwaW8gPDwgMSkpOworCQlsIHw9IGVkZ2UgPDwgKGdwaW8gPDwgMSk7CisJCV9fcmF3X3dyaXRlbChsLCByZWcpOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTDsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJCWwgfD0gMSA8PCBncGlvOworCQllbHNlCisJCQlsICY9IH4oMSA8PCBncGlvKTsKKwkJX19yYXdfd3JpdGVsKGwsIHJlZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorfQorCit2b2lkIG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKGludCBncGlvLCBpbnQgZWRnZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQorCQlyZXR1cm47CisJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwlfc2V0X2dwaW9fZWRnZV9jdHJsKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlZGdlKTsKKwlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cit9CisKKworc3RhdGljIGludCBfZ2V0X2dwaW9fZWRnZV9jdHJsKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvKQoreworCXUzMiByZWcgPSBiYW5rLT5iYXNlLCBsOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRSk7CisJCXJldHVybiAobCAmICgxIDw8IGdwaW8pKSA/CisJCQlPTUFQX0dQSU9fUklTSU5HX0VER0UgOiBPTUFQX0dQSU9fRkFMTElOR19FREdFOworCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0wpOworCQlyZXR1cm4gKGwgJiAoMSA8PCBncGlvKSkgPworCQkJT01BUF9HUElPX1JJU0lOR19FREdFIDogT01BUF9HUElPX0ZBTExJTkdfRURHRTsKKwljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCWlmIChncGlvICYgMHgwOCkKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDI7CisJCWVsc2UKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDE7CisJCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSA+PiAoKGdwaW8gJiAweDA3KSA8PCAxKSkgJiAweDAzOworCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgorCQlsID0gX19yYXdfcmVhZGwocmVnICsgT01BUDczMF9HUElPX0lOVF9DT05UUk9MKTsKKwkJcmV0dXJuIChsICYgKDEgPDwgZ3BpbykpID8KKwkJCU9NQVBfR1BJT19SSVNJTkdfRURHRSA6IE9NQVBfR1BJT19GQUxMSU5HX0VER0U7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9jbGVhcl9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaykKK3sKKwl1MzIgcmVnID0gYmFuay0+YmFzZTsKKworCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CisJY2FzZSBNRVRIT0RfTVBVSU86CisJCS8qIE1QVUlPIGlycXN0YXR1cyBpcyByZXNldCBieSByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIsCisJCSAqIHNvIGRvIG5vdGhpbmcgaGVyZSAqLworCQlyZXR1cm47CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCXJlZyArPSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzE7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgorCQlyZWcgKz0gT01BUDczMF9HUElPX0lOVF9TVEFUVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCV9fcmF3X3dyaXRlbChncGlvX21hc2ssIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfY2xlYXJfZ3Bpb19pcnFzdGF0dXMoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8pCit7CisJX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKK30KKworc3RhdGljIHZvaWQgX2VuYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaywgaW50IGVuYWJsZSkKK3sKKwl1MzIgcmVnID0gYmFuay0+YmFzZTsKKwl1MzIgbDsKKworCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CisJY2FzZSBNRVRIT0RfTVBVSU86CisJCXJlZyArPSBPTUFQX01QVUlPX0dQSU9fTUFTS0lUOworCQlsID0gX19yYXdfcmVhZGwocmVnKTsKKwkJaWYgKGVuYWJsZSkKKwkJCWwgJj0gfihncGlvX21hc2spOworCQllbHNlCisJCQlsIHw9IGdwaW9fbWFzazsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfTUFTSzsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsICY9IH4oZ3Bpb19tYXNrKTsKKwkJZWxzZQorCQkJbCB8PSBncGlvX21hc2s7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwkJaWYgKGVuYWJsZSkKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9JUlFFTkFCTEUxOworCQllbHNlCisJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9JUlFFTkFCTEUxOworCQlsID0gZ3Bpb19tYXNrOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfTUFTSzsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsICY9IH4oZ3Bpb19tYXNrKTsKKwkJZWxzZQorCQkJbCB8PSBncGlvX21hc2s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3NldF9ncGlvX2lycWVuYWJsZShzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOworfQorCitpbnQgb21hcF9yZXF1ZXN0X2dwaW8oaW50IGdwaW8pCit7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwlzcGluX2xvY2soJmJhbmstPmxvY2spOworCWlmICh1bmxpa2VseShiYW5rLT5yZXNlcnZlZF9tYXAgJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQhXG4iLCBncGlvKTsKKwkJZHVtcF9zdGFjaygpOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJYmFuay0+cmVzZXJ2ZWRfbWFwIHw9ICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTUxMCkgeworCQl1MzIgcmVnOworCisJCS8qIENsYWltIHRoZSBwaW4gZm9yIHRoZSBBUk0gKi8KKwkJcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fUElOX0NPTlRST0w7CisJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChyZWcpIHwgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpLCByZWcpOworCX0KKyNlbmRpZgorCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG9tYXBfZnJlZV9ncGlvKGludCBncGlvKQoreworCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CisKKwlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCisJCXJldHVybjsKKwliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwlzcGluX2xvY2soJmJhbmstPmxvY2spOworCWlmICh1bmxpa2VseSghKGJhbmstPnJlc2VydmVkX21hcCAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIHdhc24ndCByZXNlcnZlZCFcbiIsIGdwaW8pOworCQlkdW1wX3N0YWNrKCk7CisJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwliYW5rLT5yZXNlcnZlZF9tYXAgJj0gfigxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKKwlfc2V0X2dwaW9fZGlyZWN0aW9uKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCAxKTsKKwlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOworCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhiYW5rLCBncGlvKTsKKwlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIHVubWFzayB0aGUgR1BJTyBiYW5rIGludGVycnVwdCBhcyBzb29uIGFzIHBvc3NpYmxlIHRvCisgKiBhdm9pZCBtaXNzaW5nIEdQSU8gaW50ZXJydXB0cyBmb3Igb3RoZXIgbGluZXMgaW4gdGhlIGJhbmsuCisgKiBUaGVuIHdlIG5lZWQgdG8gbWFzay1yZWFkLWNsZWFyLXVubWFzayB0aGUgdHJpZ2dlcmVkIEdQSU8gbGluZXMKKyAqIGluIHRoZSBiYW5rIHRvIGF2b2lkIG1pc3NpbmcgbmVzdGVkIGludGVycnVwdHMgZm9yIGEgR1BJTyBsaW5lLgorICogSWYgd2Ugd2FpdCB0byB1bm1hc2sgaW5kaXZpZHVhbCBHUElPIGxpbmVzIGluIHRoZSBiYW5rIGFmdGVyIHRoZQorICogbGluZSdzIGludGVycnVwdCBoYW5kbGVyIGhhcyBiZWVuIHJ1biwgd2UgbWF5IG1pc3Mgc29tZSBuZXN0ZWQKKyAqIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBpc3JfcmVnID0gMDsKKwl1MzIgaXNyOworCXVuc2lnbmVkIGludCBncGlvX2lycTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CisKKwliYW5rID0gKHN0cnVjdCBncGlvX2JhbmsgKikgZGVzYy0+ZGF0YTsKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKKwkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQX01QVUlPX0dQSU9fSU5UOworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKQorCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX1NUQVRVUzsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKQorCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzczMCkKKwkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUzsKKyNlbmRpZgorCisJaXNyID0gX19yYXdfcmVhZGwoaXNyX3JlZyk7CisJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAwKTsKKwlfY2xlYXJfZ3Bpb19pcnFiYW5rKGJhbmssIGlzcik7CisJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAxKTsKKwlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKKworCWlmICh1bmxpa2VseSghaXNyKSkKKwkJcmV0dXJuOworCisJZ3Bpb19pcnEgPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKKwlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgeworCQlzdHJ1Y3QgaXJxZGVzYyAqZDsKKwkJaWYgKCEoaXNyICYgMSkpCisJCQljb250aW51ZTsKKwkJZCA9IGlycV9kZXNjICsgZ3Bpb19pcnE7CisJCWQtPmhhbmRsZShncGlvX2lycSwgZCwgcmVncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgZ3BpbyA9IGlycSAtIElIX0dQSU9fQkFTRTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKworCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhiYW5rLCBncGlvKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOworCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOworCisJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisKKwlpZiAoX2dldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSkgPT0gT01BUF9HUElPX05PX0VER0UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIEdQSU8gJWQ6IHRyeWluZyB0byBlbmFibGUgR1BJTyBJUlEgd2hpbGUgbm8gZWRnZSBpcyBzZXRcbiIsCisJCSAgICAgICBncGlvKTsKKwkJX3NldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKKwl9CisJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAxKTsKK30KKworc3RhdGljIHZvaWQgbXB1aW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIFRoZSBJU1IgaXMgcmVzZXQgYXV0b21hdGljYWxseSwgc28gZG8gbm90aGluZyBoZXJlLiAqLworfQorCitzdGF0aWMgdm9pZCBtcHVpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBncGlvID0gT01BUF9NUFVJTyhpcnEgLSBJSF9NUFVJT19CQVNFKTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKworCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1wdWlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgZ3BpbyA9IE9NQVBfTVBVSU8oaXJxIC0gSUhfTVBVSU9fQkFTRSk7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisKKwlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDEpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKKwkuYWNrCT0gZ3Bpb19hY2tfaXJxLAorCS5tYXNrCT0gZ3Bpb19tYXNrX2lycSwKKwkudW5tYXNrID0gZ3Bpb191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIG1wdWlvX2lycV9jaGlwID0geworCS5hY2sJPSBtcHVpb19hY2tfaXJxLAorCS5tYXNrCT0gbXB1aW9fbWFza19pcnEsCisJLnVubWFzayA9IG1wdWlvX3VubWFza19pcnEKK307CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCitzdGF0aWMgaW50IF9faW5pdCBfb21hcF9ncGlvX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJaW5pdGlhbGl6ZWQgPSAxOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDE1MTAgR1BJTyBoYXJkd2FyZVxuIik7CisJCWdwaW9fYmFua19jb3VudCA9IDI7CisJCWdwaW9fYmFuayA9IGdwaW9fYmFua18xNTEwOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWludCByZXY7CisKKwkJZ3Bpb19iYW5rX2NvdW50ID0gNTsKKwkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzE2MTA7CisJCXJldiA9IG9tYXBfcmVhZHcoZ3Bpb19iYW5rWzFdLmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCisJCSAgICAgICAocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIk9NQVA3MzAgR1BJTyBoYXJkd2FyZVxuIik7CisJCWdwaW9fYmFua19jb3VudCA9IDc7CisJCWdwaW9fYmFuayA9IGdwaW9fYmFua183MzA7CisJfQorI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CisJCWludCBqLCBncGlvX2NvdW50ID0gMTY7CisKKwkJYmFuayA9ICZncGlvX2JhbmtbaV07CisJCWJhbmstPnJlc2VydmVkX21hcCA9IDA7CisJCWJhbmstPmJhc2UgPSBJT19BRERSRVNTKGJhbmstPmJhc2UpOworCQlzcGluX2xvY2tfaW5pdCgmYmFuay0+bG9jayk7CisJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKSB7CisJCQlvbWFwX3dyaXRldygweEZGRkYsIE9NQVBfTVBVSU9fQkFTRSArIE9NQVBfTVBVSU9fR1BJT19NQVNLSVQpOworCQl9CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKSB7CisJCQlfX3Jhd193cml0ZXcoMHhmZmZmLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfTUFTSyk7CisJCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTKTsKKwkJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKwkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7CisJCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19JUlFFTkFCTEUxKTsKKwkJCV9fcmF3X3dyaXRldygweGZmZmYsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEpOworCQl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fNzMwKSB7CisJCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfTUFTSyk7CisJCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTKTsKKworCQkJZ3Bpb19jb3VudCA9IDMyOyAvKiA3MzAgaGFzIDMyLWJpdCBHUElPcyAqLworCQl9CisjZW5kaWYKKwkJZm9yIChqID0gYmFuay0+dmlydHVhbF9pcnFfc3RhcnQ7CisJCSAgICAgaiA8IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0ICsgZ3Bpb19jb3VudDsgaisrKSB7CisJCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKKwkJCQlzZXRfaXJxX2NoaXAoaiwgJm1wdWlvX2lycV9jaGlwKTsKKwkJCWVsc2UKKwkJCQlzZXRfaXJxX2NoaXAoaiwgJmdwaW9faXJxX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGosIGRvX3NpbXBsZV9JUlEpOworCQkJc2V0X2lycV9mbGFncyhqLCBJUlFGX1ZBTElEKTsKKwkJfQorCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihiYW5rLT5pcnEsIGdwaW9faXJxX2hhbmRsZXIpOworCQlzZXRfaXJxX2RhdGEoYmFuay0+aXJxLCBiYW5rKTsKKwl9CisKKwkvKiBFbmFibGUgc3lzdGVtIGNsb2NrIGZvciBHUElPIG1vZHVsZS4KKwkgKiBUaGUgQ0FNX0NMS19DVFJMICppcyogcmVhbGx5IHRoZSByaWdodCBwbGFjZS4gKi8KKwlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpCisJCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoVUxQRF9DQU1fQ0xLX0NUUkwpIHwgMHgwNCwgVUxQRF9DQU1fQ0xLX0NUUkwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIG1heSBnZXQgY2FsbGVkIGVhcmx5IGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAorICovCitpbnQgb21hcF9ncGlvX2luaXQodm9pZCkKK3sKKwlpZiAoIWluaXRpYWxpemVkKQorCQlyZXR1cm4gX29tYXBfZ3Bpb19pbml0KCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChvbWFwX3JlcXVlc3RfZ3Bpbyk7CitFWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9ncGlvKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24pOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2RhdGFvdXQpOworRVhQT1JUX1NZTUJPTChvbWFwX2dldF9ncGlvX2RhdGFpbik7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKTsKKworYXJjaF9pbml0Y2FsbChvbWFwX2dwaW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxYzk5MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9pcnEuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9pcnEuYworICoKKyAqIEludGVycnVwdCBoYW5kbGVyIGZvciBhbGwgT01BUCBib2FyZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqIE1ham9yIGNsZWFudXBzIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgorICogQ29tcGxldGVseSByZS13cml0dGVuIHRvIHN1cHBvcnQgdmFyaW91cyBPTUFQIGNoaXBzIHdpdGggYmFuayBzcGVjaWZpYworICogaW50ZXJydXB0IGhhbmRsZXJzLgorICoKKyAqIFNvbWUgc25pcHBldHMgb2YgdGhlIGNvZGUgdGFrZW4gZnJvbSB0aGUgb2xkZXIgT01BUCBpbnRlcnJ1cHQgaGFuZGxlcgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuIEdyZWcgTG9ubm9uIDxnbG9ubm9uQHJpZGdlcnVuLmNvbT4KKyAqCisgKiBHUElPIGludGVycnVwdCBoYW5kbGVyIG1vdmVkIHRvIGdwaW8uYyBieSBKdWhhIFlyam9sYQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTgorICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIElSUV9CQU5LKGlycSkgKChpcnEpID4+IDUpCisjZGVmaW5lIElSUV9CSVQoaXJxKSAgKChpcnEpICYgMHgxZikKKworc3RydWN0IG9tYXBfaXJxX2JhbmsgeworCXVuc2lnbmVkIGxvbmcgYmFzZV9yZWc7CisJdW5zaWduZWQgbG9uZyB0cmlnZ2VyX21hcDsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2JhbmtfY291bnQgPSAwOworc3RhdGljIHN0cnVjdCBvbWFwX2lycV9iYW5rICppcnFfYmFua3M7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlycV9iYW5rX3JlYWRsKGludCBiYW5rLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBvbWFwX3JlYWRsKGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfYmFua193cml0ZWwodW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IGJhbmssIGludCBvZmZzZXQpCit7CisJb21hcF93cml0ZWwodmFsdWUsIGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPiAzMSkKKwkJb21hcF93cml0ZWwoMHgxLCBPTUFQX0lIMl9CQVNFICsgSVJRX0NPTlRST0xfUkVHX09GRlNFVCk7CisKKwlvbWFwX3dyaXRlbCgweDEsIE9NQVBfSUgxX0JBU0UgKyBJUlFfQ09OVFJPTF9SRUdfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBiYW5rID0gSVJRX0JBTksoaXJxKTsKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIElSUV9NSVJfUkVHX09GRlNFVCk7CisJbCB8PSAxIDw8IElSUV9CSVQoaXJxKTsKKwlvbWFwX3dyaXRlbChsLCBpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBJUlFfTUlSX1JFR19PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgYmFuayA9IElSUV9CQU5LKGlycSk7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBJUlFfTUlSX1JFR19PRkZTRVQpOworCWwgJj0gfigxIDw8IElSUV9CSVQoaXJxKSk7CisJb21hcF93cml0ZWwobCwgaXJxX2JhbmtzW2JhbmtdLmJhc2VfcmVnICsgSVJRX01JUl9SRUdfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9tYXNrX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlvbWFwX21hc2tfaXJxKGlycSk7CisJb21hcF9hY2tfaXJxKGlycSk7Cit9CisKKy8qCisgKiBBbGxvd3MgdHVuaW5nIHRoZSBJUlEgdHlwZSBhbmQgcHJpb3JpdHkKKyAqCisgKiBOT1RFOiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gT01BUCBmaXEgaGFuZGxlciBmb3IgTGludXguIFJlYWQgdGhlCisgKgkgbWFpbGluZyBsaXN0IHRocmVhZHMgb24gRklRIGhhbmRsZXJzIGlmIHlvdSBhcmUgcGxhbm5pbmcgdG8KKyAqCSBhZGQgYSBGSVEgaGFuZGxlciBmb3IgT01BUC4KKyAqLworc3RhdGljIHZvaWQgb21hcF9pcnFfc2V0X2NmZyhpbnQgaXJxLCBpbnQgZmlxLCBpbnQgcHJpb3JpdHksIGludCB0cmlnZ2VyKQoreworCXNpZ25lZCBpbnQgYmFuazsKKwl1bnNpZ25lZCBsb25nIHZhbCwgb2Zmc2V0OworCisJYmFuayA9IElSUV9CQU5LKGlycSk7CisJLyogRklRIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGJhbmsgMCBpbnRlcnJ1cHRzICovCisJZmlxID0gYmFuayA/IDAgOiAoZmlxICYgMHgxKTsKKwl2YWwgPSBmaXEgfCAoKHByaW9yaXR5ICYgMHgxZikgPDwgMikgfCAoKHRyaWdnZXIgJiAweDEpIDw8IDEpOworCW9mZnNldCA9IElSUV9JTFIwX1JFR19PRkZTRVQgKyBJUlFfQklUKGlycSkgKiAweDQ7CisJaXJxX2Jhbmtfd3JpdGVsKHZhbCwgYmFuaywgb2Zmc2V0KTsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pcnFfYmFuayBvbWFwNzMwX2lycV9iYW5rc1tdID0geworCXsgLmJhc2VfcmVnID0gT01BUF9JSDFfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGIzZjhlMjJmIH0sCisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4ZmRiOWMxZjIgfSwKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UgKyAweDEwMCwJLnRyaWdnZXJfbWFwID0gMHg4MDAwNDBmMyB9LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pcnFfYmFuayBvbWFwMTUxMF9pcnFfYmFua3NbXSA9IHsKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgxX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhiM2ZlYmZmZiB9LAorCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGZmYmZmZmVkIH0sCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCitzdGF0aWMgc3RydWN0IG9tYXBfaXJxX2Jhbmsgb21hcDE2MTBfaXJxX2JhbmtzW10gPSB7CisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMV9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4YjNmZWZlOGYgfSwKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhmZGI3YzFmZCB9LAorCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSArIDB4MTAwLAkudHJpZ2dlcl9tYXAgPSAweGZmZmZmN2ZmIH0sCisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFICsgMHgyMDAsCS50cmlnZ2VyX21hcCA9IDB4ZmZmZmZmZmYgfSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIG9tYXBfaXJxX2NoaXAgPSB7CisJLmFjayAgICA9IG9tYXBfbWFza19hY2tfaXJxLAorCS5tYXNrICAgPSBvbWFwX21hc2tfaXJxLAorCS51bm1hc2sgPSBvbWFwX3VubWFza19pcnEsCit9OworCit2b2lkIF9faW5pdCBvbWFwX2luaXRfaXJxKHZvaWQpCit7CisJaW50IGksIGo7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJaXJxX2JhbmtzID0gb21hcDczMF9pcnFfYmFua3M7CisJCWlycV9iYW5rX2NvdW50ID0gQVJSQVlfU0laRShvbWFwNzMwX2lycV9iYW5rcyk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJaXJxX2JhbmtzID0gb21hcDE1MTBfaXJxX2JhbmtzOworCQlpcnFfYmFua19jb3VudCA9IEFSUkFZX1NJWkUob21hcDE1MTBfaXJxX2JhbmtzKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgeworCQlpcnFfYmFua3MgPSBvbWFwMTYxMF9pcnFfYmFua3M7CisJCWlycV9iYW5rX2NvdW50ID0gQVJSQVlfU0laRShvbWFwMTYxMF9pcnFfYmFua3MpOworCX0KKyNlbmRpZgorCXByaW50aygiVG90YWwgb2YgJWkgaW50ZXJydXB0cyBpbiAlaSBpbnRlcnJ1cHQgYmFua3NcbiIsCisJICAgICAgIGlycV9iYW5rX2NvdW50ICogMzIsIGlycV9iYW5rX2NvdW50KTsKKworCS8qIE1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IGlycV9iYW5rX2NvdW50OyBpKyspIHsKKwkJaXJxX2Jhbmtfd3JpdGVsKH4weDAsIGksIElSUV9NSVJfUkVHX09GRlNFVCk7CisJCWlycV9iYW5rX3dyaXRlbCgweDAsIGksIElSUV9JVFJfUkVHX09GRlNFVCk7CisJfQorCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCWlycV9iYW5rX3dyaXRlbCgweDAzLCAwLCBJUlFfQ09OVFJPTF9SRUdfT0ZGU0VUKTsKKwlpcnFfYmFua193cml0ZWwoMHgwMywgMSwgSVJRX0NPTlRST0xfUkVHX09GRlNFVCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBpbiBnbG9iYWwgbWFzayAqLworCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCWlycV9iYW5rX3dyaXRlbCgweDAsIDAsIElSUV9HTVJfUkVHX09GRlNFVCk7CisJfQorCisJLyogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBlYWNoIGJhbmsgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXJxX2JhbmtfY291bnQ7IGkrKykgeworCQlmb3IgKGogPSBpICogMzI7IGogPCAoaSArIDEpICogMzI7IGorKykgeworCQkJaW50IGlycV90cmlnZ2VyOworCisJCQlpcnFfdHJpZ2dlciA9IGlycV9iYW5rc1tpXS50cmlnZ2VyX21hcCA+PiBJUlFfQklUKGopOworCQkJb21hcF9pcnFfc2V0X2NmZyhqLCAwLCAwLCBpcnFfdHJpZ2dlcik7CisKKwkJCXNldF9pcnFfY2hpcChqLCAmb21hcF9pcnFfY2hpcCk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaiwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaiwgSVJRRl9WQUxJRCk7CisJCX0KKwl9CisKKwkvKiBVbm1hc2sgbGV2ZWwgMiBoYW5kbGVyICovCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJb21hcF91bm1hc2tfaXJxKElOVF83MzBfSUgyX0lSUSk7CisJfSBlbHNlIHsKKwkJb21hcF91bm1hc2tfaXJxKElOVF9JSDJfSVJRKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1oMnAyLWRlYnVnLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1oMnAyLWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5ODI5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLWgycDItZGVidWcuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLWgycDItZGVidWcuYworICoKKyAqIENvcHlyaWdodCAyMDAzIGJ5IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZAorICoKKyAqIFRoZXJlIGFyZSAxNiBMRURzIG9uIHRoZSBkZWJ1ZyBib2FyZCAoYWxsIGdyZWVuKTsgZm91ciBtYXkgYmUgdXNlZAorICogZm9yIGxvZ2ljYWwgJ2dyZWVuJywgJ2FtYmVyJywgJ3JlZCcsIGFuZCAnYmx1ZScgKGFmdGVyICJjbGFpbWluZyIpLgorICoKKyAqIFRoZSAic3VyZmVyIiBleHBhbnNpb24gYm9hcmQgYW5kIEgyIHNhbXBsZSBib2FyZCBhbHNvIGhhdmUgdHdvLWNvbG9yCisgKiBncmVlbityZWQgTEVEcyAoaW4gcGFyYWxsZWwpLCB1c2VkIGhlcmUgZm9yIHRpbWVyIGFuZCBpZGxlIGluZGljYXRvcnMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworCisjZGVmaW5lIEdQSU9fTEVEX1JFRAkJMworI2RlZmluZSBHUElPX0xFRF9HUkVFTgkJT01BUF9NUFVJTyg0KQorCisKKyNkZWZpbmUgTEVEX1NUQVRFX0VOQUJMRUQJMHgwMQorI2RlZmluZSBMRURfU1RBVEVfQ0xBSU1FRAkweDAyCisjZGVmaW5lIExFRF9USU1FUl9PTgkJMHgwNAorCisjZGVmaW5lIEdQSU9fSURMRQkJR1BJT19MRURfR1JFRU4KKyNkZWZpbmUgR1BJT19USU1FUgkJR1BJT19MRURfUkVECisKKwordm9pZCBoMnAyX2RiZ19sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RhdGljIHN0cnVjdCBoMnAyX2RiZ19mcGdhIF9faW9tZW0gKmZwZ2E7CisJc3RhdGljIHUxNiBsZWRfc3RhdGUsIGh3X2xlZF9zdGF0ZTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKSAmJiBldnQgIT0gbGVkX3N0YXJ0KQorCQlnb3RvIGRvbmU7CisKKwlzd2l0Y2ggKGV2dCkgeworCWNhc2UgbGVkX3N0YXJ0OgorCQlpZiAoIWZwZ2EpCisJCQlmcGdhID0gaW9yZW1hcChIMlAyX0RCR19GUEdBX1NUQVJULAorCQkJCQkJSDJQMl9EQkdfRlBHQV9TSVpFKTsKKwkJaWYgKGZwZ2EpIHsKKwkJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfRU5BQkxFRDsKKwkJCV9fcmF3X3dyaXRldyh+MCwgJmZwZ2EtPmxlZHMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBsZWRfc3RvcDoKKwljYXNlIGxlZF9oYWx0ZWQ6CisJCS8qIGFsbCBsZWRzIG9mZiBkdXJpbmcgc3VzcGVuZCBvciBzaHV0ZG93biAqLworCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoR1BJT19USU1FUiwgMCk7CisJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0lETEUsIDApOworCQlfX3Jhd193cml0ZXcofjAsICZmcGdhLT5sZWRzKTsKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKwkJaWYgKGV2dCA9PSBsZWRfaGFsdGVkKSB7CisJCQlpb3VubWFwKGZwZ2EpOworCQkJZnBnYSA9IE5VTEw7CisJCX0KKwkJZ290byBkb25lOworCisJY2FzZSBsZWRfY2xhaW06CisJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWxlYXNlOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9DTEFJTUVEOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19MRURTX1RJTUVSCisJY2FzZSBsZWRfdGltZXI6CisJCWxlZF9zdGF0ZSBePSBMRURfVElNRVJfT047CisJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX1RJTUVSLCBsZWRfc3RhdGUgJiBMRURfVElNRVJfT04pOworCQlnb3RvIGRvbmU7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19MRURTX0NQVQorCWNhc2UgbGVkX2lkbGVfc3RhcnQ6CisJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0lETEUsIDEpOworCQlnb3RvIGRvbmU7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fSURMRSwgMCk7CisJCWdvdG8gZG9uZTsKKyNlbmRpZgorCisJY2FzZSBsZWRfZ3JlZW5fb246CisJCWh3X2xlZF9zdGF0ZSB8PSBIMlAyX0RCR19GUEdBX0xFRF9HUkVFTjsKKwkJYnJlYWs7CisJY2FzZSBsZWRfZ3JlZW5fb2ZmOgorCQlod19sZWRfc3RhdGUgJj0gfkgyUDJfREJHX0ZQR0FfTEVEX0dSRUVOOworCQlicmVhazsKKworCWNhc2UgbGVkX2FtYmVyX29uOgorCQlod19sZWRfc3RhdGUgfD0gSDJQMl9EQkdfRlBHQV9MRURfQU1CRVI7CisJCWJyZWFrOworCWNhc2UgbGVkX2FtYmVyX29mZjoKKwkJaHdfbGVkX3N0YXRlICY9IH5IMlAyX0RCR19GUEdBX0xFRF9BTUJFUjsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWRfb246CisJCWh3X2xlZF9zdGF0ZSB8PSBIMlAyX0RCR19GUEdBX0xFRF9SRUQ7CisJCWJyZWFrOworCWNhc2UgbGVkX3JlZF9vZmY6CisJCWh3X2xlZF9zdGF0ZSAmPSB+SDJQMl9EQkdfRlBHQV9MRURfUkVEOworCQlicmVhazsKKworCWNhc2UgbGVkX2JsdWVfb246CisJCWh3X2xlZF9zdGF0ZSB8PSBIMlAyX0RCR19GUEdBX0xFRF9CTFVFOworCQlicmVhazsKKwljYXNlIGxlZF9ibHVlX29mZjoKKwkJaHdfbGVkX3N0YXRlICY9IH5IMlAyX0RCR19GUEdBX0xFRF9CTFVFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCisJLyoKKwkgKiAgQWN0dWFsbHkgYnVybiB0aGUgTEVEcworCSAqLworCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJX19yYXdfd3JpdGV3KH5od19sZWRfc3RhdGUsICZmcGdhLT5sZWRzKTsKKworZG9uZToKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLWlubm92YXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDNiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1pbm5vdmF0b3IuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLWlubm92YXRvci5jCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworCisjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECTEKKyNkZWZpbmUgTEVEX1NUQVRFX0NMQUlNRUQJMgorCitzdGF0aWMgdW5zaWduZWQgaW50IGxlZF9zdGF0ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdfbGVkX3N0YXRlOworCit2b2lkIGlubm92YXRvcl9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3dpdGNoIChldnQpIHsKKwljYXNlIGxlZF9zdGFydDoKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJbGVkX3N0YXRlID0gTEVEX1NUQVRFX0VOQUJMRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfc3RvcDoKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9jbGFpbToKKwkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSAwOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlbGVhc2U6CisJCWxlZF9zdGF0ZSAmPSB+TEVEX1NUQVRFX0NMQUlNRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IDA7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKKwljYXNlIGxlZF90aW1lcjoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlIF49IDA7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgfD0gMDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlICY9IH4wOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBsZWRfaGFsdGVkOgorCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfjA7CisJCWJyZWFrOworCisJY2FzZSBsZWRfZ3JlZW5fb2ZmOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgfD0gMDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9hbWJlcl9vbjoKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9hbWJlcl9vZmY6CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVkX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfjA7CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVkX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKQorCQk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1vc2suYyBiL2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLW9zay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTc3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1vc2suYwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLW9zay5jCisgKgorICogTEVEIGRyaXZlciBmb3IgT1NLLCBhbmQgb3B0aW9uYWxseSBNaXN0cmFsIFFWR0EsIGJvYXJkcworICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdHBzNjUwMTAuaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworCisjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECSgxIDw8IDApCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECSgxIDw8IDEpCitzdGF0aWMgdTggbGVkX3N0YXRlOworCisjZGVmaW5lCUdSRUVOX0xFRAkJKDEgPDwgMCkJLyogVFBTNjUwMTAgTEVEMSAqLworI2RlZmluZQlBTUJFUl9MRUQJCSgxIDw8IDEpCS8qIFRQUzY1MDEwIExFRDIgKi8KKyNkZWZpbmUJUkVEX0xFRAkJCSgxIDw8IDIpCS8qIFRQUzY1MDEwIEdQSU8yICovCisjZGVmaW5lCVRJTUVSX0xFRAkJKDEgPDwgMykJLyogTWlzdHJhbCBib2FyZCAqLworI2RlZmluZQlJRExFX0xFRAkJKDEgPDwgNCkJLyogTWlzdHJhbCBib2FyZCAqLworc3RhdGljIHU4IGh3X2xlZF9zdGF0ZTsKKworCisvKiBUUFM2NTAxMCBsZWRzIGFyZSBjaGFuZ2VkIHVzaW5nIGkyYyAtLSBmcm9tIGEgdGFzayBjb250ZXh0LgorICogVXNpbmcgb25lIG9mIHRoZXNlIGZvciB0aGUgImlkbGUiIExFRCB3b3VsZCBiZSBpbXByYWN0aWNhbC4uLgorICovCisjZGVmaW5lCVRQU19MRURTCShHUkVFTl9MRUQgfCBSRURfTEVEIHwgQU1CRVJfTEVEKQorCitzdGF0aWMgdTggdHBzX2xlZHNfY2hhbmdlOworCitzdGF0aWMgdm9pZCB0cHNfd29yayh2b2lkICp1bnVzZWQpCit7CisJZm9yICg7OykgeworCQl1OAlsZWRzOworCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWxlZHMgPSB0cHNfbGVkc19jaGFuZ2U7CisJCXRwc19sZWRzX2NoYW5nZSA9IDA7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCQlpZiAoIWxlZHMpCisJCQlicmVhazsKKworCQkvKiBjYXJlZnVsOiAgdGhlIHNldF9sZWQoKSB2YWx1ZSBpcyBvbi9vZmYvYmxpbmsgKi8KKwkJaWYgKGxlZHMgJiBHUkVFTl9MRUQpCisJCQl0cHM2NTAxMF9zZXRfbGVkKExFRDEsICEhKGh3X2xlZF9zdGF0ZSAmIEdSRUVOX0xFRCkpOworCQlpZiAobGVkcyAmIEFNQkVSX0xFRCkKKwkJCXRwczY1MDEwX3NldF9sZWQoTEVEMiwgISEoaHdfbGVkX3N0YXRlICYgQU1CRVJfTEVEKSk7CisKKwkJLyogdGhlIGdwaW8gbGVkIGRvZXNuJ3QgaGF2ZSB0aGF0IGlzc3VlICovCisJCWlmIChsZWRzICYgUkVEX0xFRCkKKwkJCXRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMiwKKwkJCQkJIShod19sZWRfc3RhdGUgJiBSRURfTEVEKSk7CisJfQorfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKHdvcmssIHRwc193b3JrLCBOVUxMKTsKKworI2lmZGVmCUNPTkZJR19GQl9PTUFQCisKKy8qIEZvciBub3csIGFsbCBzeXN0ZW0gaW5kaWNhdG9ycyByZXF1aXJlIHRoZSBNaXN0cmFsIGJvYXJkLCBzaW5jZSB0aGF0CisgKiBMRUQgY2FuIGJlIG1hbmlwdWxhdGVkIHdpdGhvdXQgYSB0YXNrIGNvbnRleHQuICBUaGlzIExFRCBpcyBlaXRoZXIgcmVkLAorICogb3IgZ3JlZW4sIGJ1dCBub3QgYm90aDsgaXQgY2FuJ3QgZ2l2ZSB0aGUgZnVsbCAiZGlzY28gbGVkIiBlZmZlY3QuCisgKi8KKworI2RlZmluZSBHUElPX0xFRF9SRUQJCTMKKyNkZWZpbmUgR1BJT19MRURfR1JFRU4JCU9NQVBfTVBVSU8oNCkKKworc3RhdGljIHZvaWQgbWlzdHJhbF9zZXRsZWQodm9pZCkKK3sKKwlpbnQJcmVkID0gMDsKKwlpbnQJZ3JlZW4gPSAwOworCisJaWYgKGh3X2xlZF9zdGF0ZSAmIFRJTUVSX0xFRCkKKwkJcmVkID0gMTsKKwllbHNlIGlmIChod19sZWRfc3RhdGUgJiBJRExFX0xFRCkKKwkJZ3JlZW4gPSAxOworCS8vIGVsc2UgYm90aCBzaWRlcyBhcmUgZGlzYWJsZWQKKworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0xFRF9HUkVFTiwgZ3JlZW4pOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0xFRF9SRUQsIHJlZCk7Cit9CisKKyNlbmRpZgorCit2b2lkIG9za19sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXUxNgkJbGVkczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKSAmJiBldnQgIT0gbGVkX3N0YXJ0KQorCQlnb3RvIGRvbmU7CisKKwlsZWRzID0gaHdfbGVkX3N0YXRlOworCXN3aXRjaCAoZXZ0KSB7CisJY2FzZSBsZWRfc3RhcnQ6CisJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfRU5BQkxFRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJbGVkcyA9IH4wOworCQlicmVhazsKKworCWNhc2UgbGVkX2hhbHRlZDoKKwljYXNlIGxlZF9zdG9wOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9FTkFCTEVEOworCQlod19sZWRfc3RhdGUgPSAwOworCQkvLyBOT1RFOiAgd29yayBtYXkgc3RpbGwgYmUgcGVuZGluZyEhCisJCWJyZWFrOworCisJY2FzZSBsZWRfY2xhaW06CisJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJbGVkcyA9IH4wOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlbGVhc2U6CisJCWxlZF9zdGF0ZSAmPSB+TEVEX1NUQVRFX0NMQUlNRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IDA7CisJCWJyZWFrOworCisjaWZkZWYJQ09ORklHX0ZCX09NQVAKKworI2lmZGVmIENPTkZJR19MRURTX1RJTUVSCisJY2FzZSBsZWRfdGltZXI6CisJCWh3X2xlZF9zdGF0ZSBePSBUSU1FUl9MRUQ7CisJCW1pc3RyYWxfc2V0bGVkKCk7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlod19sZWRfc3RhdGUgfD0gSURMRV9MRUQ7CisJCW1pc3RyYWxfc2V0bGVkKCk7CisJCWJyZWFrOworCisJY2FzZSBsZWRfaWRsZV9lbmQ6CisJCWh3X2xlZF9zdGF0ZSAmPSB+SURMRV9MRUQ7CisJCW1pc3RyYWxfc2V0bGVkKCk7CisJCWJyZWFrOworI2VuZGlmCisKKyNlbmRpZgkvKiBDT05GSUdfRkJfT01BUCAqLworCisJLyogImdyZWVuIiA9PSB0cHMgTEVEMSAobGVmdG1vc3QsIG5vcm1hbGx5IHBvd2VyLWdvb2QpCisJICogd29ya3Mgb25seSB3aXRoIERDIGFkYXB0ZXIsIG5vdCBvbiBiYXR0ZXJ5IHBvd2VyIQorCSAqLworCWNhc2UgbGVkX2dyZWVuX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgfD0gR1JFRU5fTEVEOworCQlicmVhazsKKwljYXNlIGxlZF9ncmVlbl9vZmY6CisJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCWh3X2xlZF9zdGF0ZSAmPSB+R1JFRU5fTEVEOworCQlicmVhazsKKworCS8qICJhbWJlciIgPT0gdHBzIExFRDIgKG1pZGRsZSkgKi8KKwljYXNlIGxlZF9hbWJlcl9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IEFNQkVSX0xFRDsKKwkJYnJlYWs7CisJY2FzZSBsZWRfYW1iZXJfb2ZmOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfkFNQkVSX0xFRDsKKwkJYnJlYWs7CisKKwkvKiAicmVkIiA9PSBMRUQgb24gdHBzIGdwaW8zIChyaWdodG1vc3QpICovCisJY2FzZSBsZWRfcmVkX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgfD0gUkVEX0xFRDsKKwkJYnJlYWs7CisJY2FzZSBsZWRfcmVkX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH5SRURfTEVEOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWxlZHMgXj0gaHdfbGVkX3N0YXRlOworCWxlZHMgJj0gVFBTX0xFRFM7CisJaWYgKGxlZHMgJiYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkgeworCQl0cHNfbGVkc19jaGFuZ2UgfD0gbGVkczsKKwkJc2NoZWR1bGVfd29yaygmd29yayk7CisJfQorCitkb25lOgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjIxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5jCisgKgorICogT01BUCBMRURzIGRpc3BhdGNoZXIKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworc3RhdGljIGludCBfX2luaXQKK29tYXBfbGVkc19pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkKKwkJbGVkc19ldmVudCA9IGlubm92YXRvcl9sZWRzX2V2ZW50OworCisJZWxzZSBpZiAobWFjaGluZV9pc19vbWFwX2gyKCkgfHwgbWFjaGluZV9pc19vbWFwX3BlcnNldXMyKCkpCisJCWxlZHNfZXZlbnQgPSBoMnAyX2RiZ19sZWRzX2V2ZW50OworCisJZWxzZSBpZiAobWFjaGluZV9pc19vbWFwX29zaygpKQorCQlsZWRzX2V2ZW50ID0gb3NrX2xlZHNfZXZlbnQ7CisKKwllbHNlCisJCXJldHVybiAtMTsKKworCWlmIChtYWNoaW5lX2lzX29tYXBfaDIoKQorCQkJfHwgbWFjaGluZV9pc19vbWFwX3BlcnNldXMyKCkKKwkJCXx8IG1hY2hpbmVfaXNfb21hcF9vc2soKSkgeworCisJCS8qIExFRDEvTEVEMiBwaW5zIGNhbiBiZSB1c2VkIGFzIEdQSU8gKGFzIGRvbmUgaGVyZSksIG9yIGJ5CisJCSAqIHRoZSBMUEcgKHdvcmtzIGV2ZW4gaW4gZGVlcCBzbGVlcCEpLCB0byBkcml2ZSBhIGJpY29sb3IKKwkJICogTEVEIG9uIHRoZSBIMiBzYW1wbGUgYm9hcmQsIGFuZCBhbm90aGVyIG9uIHRoZSBIMi9QMgorCQkgKiAic3VyZmVyIiBleHBhbnNpb24gYm9hcmQuCisJCSAqCisJCSAqIFRoZSBzYW1lIHBpbnMgZHJpdmUgYSBMRUQgb24gdGhlIE9TSyBNaXN0cmFsIGJvYXJkLCBidXQKKwkJICogdGhhdCdzIGEgZGlmZmVyZW50IGtpbmQgb2YgTEVEIChqdXN0IG9uZSBjb2xvciBhdCBhIHRpbWUpLgorCQkgKi8KKwkJb21hcF9jZmdfcmVnKFAxOF8xNjEwX0dQSU8zKTsKKwkJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKDMpID09IDApCisJCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigzLCAwKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTEVEOiBjYW4ndCBnZXQgR1BJTzMvcmVkP1xuIik7CisKKwkJb21hcF9jZmdfcmVnKE1QVUlPNCk7CisJCWlmIChvbWFwX3JlcXVlc3RfZ3BpbyhPTUFQX01QVUlPKDQpKSA9PSAwKQorCQkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oT01BUF9NUFVJTyg0KSwgMCk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxFRDogY2FuJ3QgZ2V0IE1QVUlPNC9ncmVlbj9cbiIpOworCX0KKworCWxlZHNfZXZlbnQobGVkX3N0YXJ0KTsKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChvbWFwX2xlZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWU5ZmVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMuaApAQCAtMCwwICsxLDMgQEAKK2V4dGVybiB2b2lkIGlubm92YXRvcl9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBoMnAyX2RiZ19sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBvc2tfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvbWNic3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRhZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL21jYnNwLmMKQEAgLTAsMCArMSw2ODUgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9vbWFwL21jYnNwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE11bHRpY2hhbm5lbCBtb2RlIG5vdCBzdXBwb3J0ZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21jYnNwLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKworI2lmZGVmIENPTkZJR19NQ0JTUF9ERUJVRworI2RlZmluZSBEQkcoeC4uLikJcHJpbnRrKHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0cnVjdCBvbWFwX21jYnNwIHsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX2Jhc2U7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICBpZDsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWU7CisJb21hcF9tY2JzcF93b3JkX2xlbmd0aCAgICAgICByeF93b3JkX2xlbmd0aDsKKwlvbWFwX21jYnNwX3dvcmRfbGVuZ3RoICAgICAgIHR4X3dvcmRfbGVuZ3RoOworCisJLyogSVJRIGJhc2VkIFRYL1JYICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByeF9pcnE7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICB0eF9pcnE7CisKKwkvKiBETUEgc3R1ZmYgKi8KKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9yeF9zeW5jOworCXNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgZG1hX3J4X2xjaDsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYV90eF9zeW5jOworCXNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgZG1hX3R4X2xjaDsKKworCS8qIENvbXBsZXRpb24gcXVldWVzICovCisJc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgICB0eF9pcnFfY29tcGxldGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgIHJ4X2lycV9jb21wbGV0aW9uOworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgdHhfZG1hX2NvbXBsZXRpb247CisJc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgICByeF9kbWFfY29tcGxldGlvbjsKKworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICAgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tY2JzcCBtY2JzcFtPTUFQX01BWF9NQ0JTUF9DT1VOVF07CitzdGF0aWMgc3RydWN0IGNsayAqbWNic3BfZHNwX2NrID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICptY2JzcF9hcGlfY2sgPSAwOworCisKK3N0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHVtcF9yZWcodTggaWQpCit7CisJREJHKCIqKioqIE1DQlNQJWQgcmVncyAqKioqXG4iLCBtY2JzcFtpZF0uaWQpOworCURCRygiRFJSMjogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBEUlIyKSk7CisJREJHKCJEUlIxOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIERSUjEpKTsKKwlEQkcoIkRYUjI6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgRFhSMikpOworCURCRygiRFhSMTogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBEWFIxKSk7CisJREJHKCJTUENSMjogMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFNQQ1IyKSk7CisJREJHKCJTUENSMTogMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFNQQ1IxKSk7CisJREJHKCJSQ1IyOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFJDUjIpKTsKKwlEQkcoIlJDUjE6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgUkNSMSkpOworCURCRygiWENSMjogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBYQ1IyKSk7CisJREJHKCJYQ1IxOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFhDUjEpKTsKKwlEQkcoIlNSR1IyOiAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgU1JHUjIpKTsKKwlEQkcoIlNSR1IxOiAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgU1JHUjEpKTsKKwlEQkcoIlBDUjA6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgUENSMCkpOworCURCRygiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX21jYnNwX3R4X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG9tYXBfbWNic3AgKiBtY2JzcF90eCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkZXZfaWQpOworCisJREJHKCJUWCBJUlEgY2FsbGJhY2sgOiAweCV4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BfdHgtPmlvX2Jhc2UsIFNQQ1IyKSk7CisKKwljb21wbGV0ZSgmbWNic3BfdHgtPnR4X2lycV9jb21wbGV0aW9uKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX21jYnNwX3J4X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG9tYXBfbWNic3AgKiBtY2JzcF9yeCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkZXZfaWQpOworCisJREJHKCJSWCBJUlEgY2FsbGJhY2sgOiAweCV4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BfcngtPmlvX2Jhc2UsIFNQQ1IyKSk7CisKKwljb21wbGV0ZSgmbWNic3BfcngtPnJ4X2lycV9jb21wbGV0aW9uKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIHZvaWQgb21hcF9tY2JzcF90eF9kbWFfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcF9tY2JzcCAqIG1jYnNwX2RtYV90eCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkYXRhKTsKKworCURCRygiVFggRE1BIGNhbGxiYWNrIDogMHgleFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwX2RtYV90eC0+aW9fYmFzZSwgU1BDUjIpKTsKKworCS8qIFdlIGNhbiBmcmVlIHRoZSBjaGFubmVscyAqLworCW9tYXBfZnJlZV9kbWEobWNic3BfZG1hX3R4LT5kbWFfdHhfbGNoKTsKKwltY2JzcF9kbWFfdHgtPmRtYV90eF9sY2ggPSAtMTsKKworCWNvbXBsZXRlKCZtY2JzcF9kbWFfdHgtPnR4X2RtYV9jb21wbGV0aW9uKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9tY2JzcF9yeF9kbWFfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcF9tY2JzcCAqIG1jYnNwX2RtYV9yeCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkYXRhKTsKKworCURCRygiUlggRE1BIGNhbGxiYWNrIDogMHgleFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwX2RtYV9yeC0+aW9fYmFzZSwgU1BDUjIpKTsKKworCS8qIFdlIGNhbiBmcmVlIHRoZSBjaGFubmVscyAqLworCW9tYXBfZnJlZV9kbWEobWNic3BfZG1hX3J4LT5kbWFfcnhfbGNoKTsKKwltY2JzcF9kbWFfcngtPmRtYV9yeF9sY2ggPSAtMTsKKworCWNvbXBsZXRlKCZtY2JzcF9kbWFfcngtPnJ4X2RtYV9jb21wbGV0aW9uKTsKK30KKworCisvKgorICogb21hcF9tY2JzcF9jb25maWcgc2ltcGx5IHdyaXRlIGEgY29uZmlnIHRvIHRoZQorICogYXBwcm9wcmlhdGUgTWNCU1AuCisgKiBZb3UgZWl0aGVyIGNhbGwgdGhpcyBmdW5jdGlvbiBvciBzZXQgdGhlIE1jQlNQIHJlZ2lzdGVycworICogYnkgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcgb21hcF9tY2JzcF9zdGFydCgpLgorICovCisKK3ZvaWQgb21hcF9tY2JzcF9jb25maWcodW5zaWduZWQgaW50IGlkLCBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnICogY29uZmlnKQoreworCXUzMiBpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7CisKKwlEQkcoIk9NQVAtTWNCU1A6IE1jQlNQJWQgIGlvX2Jhc2U6IDB4JTh4XG4iLCBpZCsxLCBpb19iYXNlKTsKKworCS8qIFdlIHdyaXRlIHRoZSBnaXZlbiBjb25maWcgKi8KKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCBjb25maWctPnNwY3IyKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IxLCBjb25maWctPnNwY3IxKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFJDUjIsIGNvbmZpZy0+cmNyMik7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBSQ1IxLCBjb25maWctPnJjcjEpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgWENSMiwgY29uZmlnLT54Y3IyKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFhDUjEsIGNvbmZpZy0+eGNyMSk7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUkdSMiwgY29uZmlnLT5zcmdyMik7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUkdSMSwgY29uZmlnLT5zcmdyMSk7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBNQ1IyLCBjb25maWctPm1jcjIpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgTUNSMSwgY29uZmlnLT5tY3IxKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFBDUjAsIGNvbmZpZy0+cGNyMCk7Cit9CisKKworCitzdGF0aWMgaW50IG9tYXBfbWNic3BfY2hlY2sodW5zaWduZWQgaW50IGlkKQoreworCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCWlmIChpZCA+IE9NQVBfTUFYX01DQlNQX0NPVU5UIC0gMSkgeworCQkgICAgICAgcHJpbnRrKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBNY0JTUCVkIGRvZXNuJ3QgZXhpc3RcbiIsIGlkICsgMSk7CisJCSAgICAgICByZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCWlmIChpZCA+IE9NQVBfTUFYX01DQlNQX0NPVU5UKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk9NQVAtTWNCU1A6IE1jQlNQJWQgZG9lc24ndCBleGlzdFxuIiwgaWQgKyAxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgRU5fWE9SUENLCQkxCisjZGVmaW5lIERTUF9SU1RDVDIgICAgICAgICAgICAgIDB4ZTEwMDgwMTQKKworc3RhdGljIHZvaWQgb21hcF9tY2JzcF9kc3BfcmVxdWVzdCh2b2lkKQoreworCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCQlvbWFwX3dyaXRldygob21hcF9yZWFkdyhBUk1fUlNUQ1QxKSB8ICgxIDw8IDEpIHwgKDEgPDwgMikpLAorCQkJICAgIEFSTV9SU1RDVDEpOworCQljbGtfZW5hYmxlKG1jYnNwX2RzcF9jayk7CisJCWNsa19lbmFibGUobWNic3BfYXBpX2NrKTsKKworCQkvKiBlbmFibGUgMTJNSHogY2xvY2sgdG8gbWNic3AgMSAmIDMgKi8KKwkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KERTUF9JRExFQ1QyKSB8ICgxIDw8IEVOX1hPUlBDSyksCisJCQkgICAgIERTUF9JRExFQ1QyKTsKKwkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KERTUF9SU1RDVDIpIHwgMSB8IDEgPDwgMSwKKwkJCSAgICAgRFNQX1JTVENUMik7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwX21jYnNwX2RzcF9mcmVlKHZvaWQpCit7CisJLyogVXNlbGVzcyBmb3Igbm93ICovCit9CisKKworaW50IG9tYXBfbWNic3BfcmVxdWVzdCh1bnNpZ25lZCBpbnQgaWQpCit7CisJaW50IGVycjsKKworCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBPbiAxNTEwLCAxNjEwIGFuZCAxNzEwLCBNY0JTUDEgYW5kIE1jQlNQMworCSAqIGFyZSBEU1AgcHVibGljIHBlcmlwaGVyYWxzLgorCSAqLworCWlmIChpZCA9PSBPTUFQX01DQlNQMSB8fCBpZCA9PSBPTUFQX01DQlNQMykKKwkJb21hcF9tY2JzcF9kc3BfcmVxdWVzdCgpOworCisJc3Bpbl9sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisJaWYgKCFtY2JzcFtpZF0uZnJlZSkgeworCQlwcmludGsgKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBNY0JTUCVkIGlzIGN1cnJlbnRseSBpbiB1c2VcbiIsIGlkICsgMSk7CisJCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisJCXJldHVybiAtMTsKKwl9CisKKwltY2JzcFtpZF0uZnJlZSA9IDA7CisJc3Bpbl91bmxvY2soJm1jYnNwW2lkXS5sb2NrKTsKKworCS8qIFdlIG5lZWQgdG8gZ2V0IElSUXMgaGVyZSAqLworCWVyciA9IHJlcXVlc3RfaXJxKG1jYnNwW2lkXS50eF9pcnEsIG9tYXBfbWNic3BfdHhfaXJxX2hhbmRsZXIsIDAsCisJCQkgICJNY0JTUCIsCisJCQkgICh2b2lkICopICgmbWNic3BbaWRdKSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiT01BUC1NY0JTUDogVW5hYmxlIHRvIHJlcXVlc3QgVFggSVJRICVkIGZvciBNY0JTUCVkXG4iLAorCQkgICAgICAgbWNic3BbaWRdLnR4X2lycSwgbWNic3BbaWRdLmlkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJihtY2JzcFtpZF0udHhfaXJxX2NvbXBsZXRpb24pKTsKKworCisJZXJyID0gcmVxdWVzdF9pcnEobWNic3BbaWRdLnJ4X2lycSwgb21hcF9tY2JzcF9yeF9pcnFfaGFuZGxlciwgMCwKKwkJCSAgIk1jQlNQIiwKKwkJCSAgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBVbmFibGUgdG8gcmVxdWVzdCBSWCBJUlEgJWQgZm9yIE1jQlNQJWRcbiIsCisJCSAgICAgICBtY2JzcFtpZF0ucnhfaXJxLCBtY2JzcFtpZF0uaWQpOworCQlmcmVlX2lycShtY2JzcFtpZF0udHhfaXJxLCAodm9pZCAqKSAoJm1jYnNwW2lkXSkpOworCQlyZXR1cm4gZXJyOworCX0KKworCWluaXRfY29tcGxldGlvbigmKG1jYnNwW2lkXS5yeF9pcnFfY29tcGxldGlvbikpOworCXJldHVybiAwOworCit9CisKK3ZvaWQgb21hcF9tY2JzcF9mcmVlKHVuc2lnbmVkIGludCBpZCkKK3sKKwlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoaWQgPT0gT01BUF9NQ0JTUDEgfHwgaWQgPT0gT01BUF9NQ0JTUDMpCisJCW9tYXBfbWNic3BfZHNwX2ZyZWUoKTsKKworCXNwaW5fbG9jaygmbWNic3BbaWRdLmxvY2spOworCWlmIChtY2JzcFtpZF0uZnJlZSkgeworCQlwcmludGsgKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBNY0JTUCVkIHdhcyBub3QgcmVzZXJ2ZWRcbiIsIGlkICsgMSk7CisJCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisJCXJldHVybjsKKwl9CisKKwltY2JzcFtpZF0uZnJlZSA9IDE7CisJc3Bpbl91bmxvY2soJm1jYnNwW2lkXS5sb2NrKTsKKworCS8qIEZyZWUgSVJRcyAqLworCWZyZWVfaXJxKG1jYnNwW2lkXS5yeF9pcnEsICh2b2lkICopICgmbWNic3BbaWRdKSk7CisJZnJlZV9pcnEobWNic3BbaWRdLnR4X2lycSwgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKK30KKworLyoKKyAqIEhlcmUgd2Ugc3RhcnQgdGhlIE1jQlNQLCBieSBlbmFibGluZyB0aGUgc2FtcGxlCisgKiBnZW5lcmF0b3IsIGJvdGggdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVycywKKyAqIGFuZCB0aGUgZnJhbWUgc3luYy4KKyAqLwordm9pZCBvbWFwX21jYnNwX3N0YXJ0KHVuc2lnbmVkIGludCBpZCkKK3sKKwl1MzIgaW9fYmFzZTsKKwl1MTYgdzsKKworCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCisJCXJldHVybjsKKworCWlvX2Jhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKKworCW1jYnNwW2lkXS5yeF93b3JkX2xlbmd0aCA9ICgoT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFJDUjEpID4+IDUpICYgMHg3KTsKKwltY2JzcFtpZF0udHhfd29yZF9sZW5ndGggPSAoKE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBYQ1IxKSA+PiA1KSAmIDB4Nyk7CisKKwkvKiBTdGFydCB0aGUgc2FtcGxlIGdlbmVyYXRvciAqLworCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjIpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIHcgfCAoMSA8PCA2KSk7CisKKwkvKiBFbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyICovCisJdyA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBTUENSMik7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMiwgdyB8IDEpOworCisJdyA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBTUENSMSk7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMSwgdyB8IDEpOworCisJdWRlbGF5KDEwMCk7CisKKwkvKiBTdGFydCBmcmFtZSBzeW5jICovCisJdyA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBTUENSMik7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMiwgdyB8ICgxIDw8IDcpKTsKKworCS8qIER1bXAgTWNCU1AgUmVncyAqLworCW9tYXBfbWNic3BfZHVtcF9yZWcoaWQpOworCit9CisKK3ZvaWQgb21hcF9tY2JzcF9zdG9wKHVuc2lnbmVkIGludCBpZCkKK3sKKwl1MzIgaW9fYmFzZTsKKwl1MTYgdzsKKworCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCisJCXJldHVybjsKKworCWlvX2Jhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKKworICAgICAgICAvKiBSZXNldCB0cmFuc21pdHRlciAqLworCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjIpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIHcgJiB+KDEpKTsKKworCS8qIFJlc2V0IHJlY2VpdmVyICovCisJdyA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBTUENSMSk7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMSwgdyAmIH4oMSkpOworCisJLyogUmVzZXQgdGhlIHNhbXBsZSByYXRlIGdlbmVyYXRvciAqLworCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjIpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIHcgJiB+KDEgPDwgNikpOworfQorCisKKy8qCisgKiBJUlEgYmFzZWQgd29yZCB0cmFuc21pc3Npb24uCisgKi8KK3ZvaWQgb21hcF9tY2JzcF94bWl0X3dvcmQodW5zaWduZWQgaW50IGlkLCB1MzIgd29yZCkKK3sKKwl1MzIgaW9fYmFzZTsKKwlvbWFwX21jYnNwX3dvcmRfbGVuZ3RoIHdvcmRfbGVuZ3RoID0gbWNic3BbaWRdLnR4X3dvcmRfbGVuZ3RoOworCisJaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKKwkJcmV0dXJuOworCisJaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmKG1jYnNwW2lkXS50eF9pcnFfY29tcGxldGlvbikpOworCisJaWYgKHdvcmRfbGVuZ3RoID4gT01BUF9NQ0JTUF9XT1JEXzE2KQorCQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIERYUjIsIHdvcmQgPj4gMTYpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgRFhSMSwgd29yZCAmIDB4ZmZmZik7Cit9CisKK3UzMiBvbWFwX21jYnNwX3JlY3Zfd29yZCh1bnNpZ25lZCBpbnQgaWQpCit7CisJdTMyIGlvX2Jhc2U7CisJdTE2IHdvcmRfbHNiLCB3b3JkX21zYiA9IDA7CisJb21hcF9tY2JzcF93b3JkX2xlbmd0aCB3b3JkX2xlbmd0aCA9IG1jYnNwW2lkXS5yeF93b3JkX2xlbmd0aDsKKworCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmKG1jYnNwW2lkXS5yeF9pcnFfY29tcGxldGlvbikpOworCisJaWYgKHdvcmRfbGVuZ3RoID4gT01BUF9NQ0JTUF9XT1JEXzE2KQorCQl3b3JkX21zYiA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBEUlIyKTsKKwl3b3JkX2xzYiA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBEUlIxKTsKKworCXJldHVybiAod29yZF9sc2IgfCAod29yZF9tc2IgPDwgMTYpKTsKK30KKworCisvKgorICogU2ltcGxlIERNQSBiYXNlZCBidWZmZXIgcngvdHggcm91dGluZXMuCisgKiBOb3RoaW5nIGZhbmN5LCBqdXN0IGEgc2luZ2xlIGJ1ZmZlciB0eC9yeCB0aHJvdWdoIERNQS4KKyAqIFRoZSBETUEgcmVzb3VyY2VzIGFyZSByZWxlYXNlZCBvbmNlIHRoZSB0cmFuc2ZlciBpcyBkb25lLgorICogRm9yIGFueXRoaW5nIGZhbmNpZXIsIHlvdSBzaG91bGQgdXNlIHlvdXIgb3duIGN1c3RvbWl6ZWQgRE1BCisgKiByb3V0aW5lcyBhbmQgY2FsbGJhY2tzLgorICovCitpbnQgb21hcF9tY2JzcF94bWl0X2J1ZmZlcih1bnNpZ25lZCBpbnQgaWQsIGRtYV9hZGRyX3QgYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWludCBkbWFfdHhfY2g7CisKKwlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jYnNwW2lkXS5kbWFfdHhfc3luYywgIk1jQlNQIFRYIiwgb21hcF9tY2JzcF90eF9kbWFfY2FsbGJhY2ssCisJCQkgICAgICZtY2JzcFtpZF0sCisJCQkgICAgICZkbWFfdHhfY2gpKSB7CisJCXByaW50aygiT01BUC1NY0JTUDogVW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgZm9yIE1jQlNQJWQgVFguIFRyeWluZyBJUlEgYmFzZWQgVFhcbiIsIGlkKzEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJbWNic3BbaWRdLmRtYV90eF9sY2ggPSBkbWFfdHhfY2g7CisKKwlEQkcoIlRYIERNQSBvbiBjaGFubmVsICVkXG4iLCBkbWFfdHhfY2gpOworCisJaW5pdF9jb21wbGV0aW9uKCYobWNic3BbaWRdLnR4X2RtYV9jb21wbGV0aW9uKSk7CisKKwlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKG1jYnNwW2lkXS5kbWFfdHhfbGNoLAorCQkJCSAgICAgT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKKwkJCQkgICAgIGxlbmd0aCA+PiAxLCAxLAorCQkJCSAgICAgT01BUF9ETUFfU1lOQ19FTEVNRU5UKTsKKworCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY2JzcFtpZF0uZG1hX3R4X2xjaCwKKwkJCQkgT01BUF9ETUFfUE9SVF9USVBCLAorCQkJCSBPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKKwkJCQkgbWNic3BbaWRdLmlvX2Jhc2UgKyBPTUFQX01DQlNQX1JFR19EWFIxKTsKKworCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jYnNwW2lkXS5kbWFfdHhfbGNoLAorCQkJCU9NQVBfRE1BX1BPUlRfRU1JRkYsCisJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJYnVmZmVyKTsKKworCW9tYXBfc3RhcnRfZG1hKG1jYnNwW2lkXS5kbWFfdHhfbGNoKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCYobWNic3BbaWRdLnR4X2RtYV9jb21wbGV0aW9uKSk7CisJcmV0dXJuIDA7Cit9CisKKworaW50IG9tYXBfbWNic3BfcmVjdl9idWZmZXIodW5zaWduZWQgaW50IGlkLCBkbWFfYWRkcl90IGJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlpbnQgZG1hX3J4X2NoOworCisJaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob21hcF9yZXF1ZXN0X2RtYShtY2JzcFtpZF0uZG1hX3J4X3N5bmMsICJNY0JTUCBSWCIsIG9tYXBfbWNic3BfcnhfZG1hX2NhbGxiYWNrLAorCQkJICAgICAmbWNic3BbaWRdLAorCQkJICAgICAmZG1hX3J4X2NoKSkgeworCQlwcmludGsoIlVuYWJsZSB0byByZXF1ZXN0IERNQSBjaGFubmVsIGZvciBNY0JTUCVkIFJYLiBUcnlpbmcgSVJRIGJhc2VkIFJYXG4iLCBpZCsxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCW1jYnNwW2lkXS5kbWFfcnhfbGNoID0gZG1hX3J4X2NoOworCisJREJHKCJSWCBETUEgb24gY2hhbm5lbCAlZFxuIiwgZG1hX3J4X2NoKTsKKworCWluaXRfY29tcGxldGlvbigmKG1jYnNwW2lkXS5yeF9kbWFfY29tcGxldGlvbikpOworCisJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwkJCQkgICAgIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCisJCQkJICAgICBsZW5ndGggPj4gMSwgMSwKKwkJCQkgICAgIE9NQVBfRE1BX1NZTkNfRUxFTUVOVCk7CisKKwlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwkJCQlPTUFQX0RNQV9QT1JUX1RJUEIsCisJCQkJT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCisJCQkJbWNic3BbaWRdLmlvX2Jhc2UgKyBPTUFQX01DQlNQX1JFR19EUlIxKTsKKworCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwkJCQkgT01BUF9ETUFfUE9SVF9FTUlGRiwKKwkJCQkgT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJIGJ1ZmZlcik7CisKKwlvbWFwX3N0YXJ0X2RtYShtY2JzcFtpZF0uZG1hX3J4X2xjaCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmKG1jYnNwW2lkXS5yeF9kbWFfY29tcGxldGlvbikpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTUEkgd3JhcHBlci4KKyAqIFNpbmNlIFNQSSBzZXR1cCBpcyBtdWNoIHNpbXBsZXIgdGhhbiB0aGUgZ2VuZXJpYyBNY0JTUCBvbmUsCisgKiB0aGlzIHdyYXBwZXIganVzdCBuZWVkIGFuIG9tYXBfbWNic3Bfc3BpX2NmZyBzdHJ1Y3R1cmUgYXMgYW4gaW5wdXQuCisgKiBPbmNlIHRoaXMgaXMgZG9uZSwgeW91IGNhbiBjYWxsIG9tYXBfbWNic3Bfc3RhcnQoKS4KKyAqLwordm9pZCBvbWFwX21jYnNwX3NldF9zcGlfbW9kZSh1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBvbWFwX21jYnNwX3NwaV9jZmcgKiBzcGlfY2ZnKQoreworCXN0cnVjdCBvbWFwX21jYnNwX3JlZ19jZmcgbWNic3BfY2ZnOworCisJaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZtY2JzcF9jZmcsIDAsIHNpemVvZihzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnKSk7CisKKwkvKiBTUEkgaGFzIG9ubHkgb25lIGZyYW1lICovCisJbWNic3BfY2ZnLnJjcjEgfD0gKFJXRExFTjEoc3BpX2NmZy0+d29yZF9sZW5ndGgpIHwgUkZSTEVOMSgwKSk7CisJbWNic3BfY2ZnLnhjcjEgfD0gKFhXRExFTjEoc3BpX2NmZy0+d29yZF9sZW5ndGgpIHwgWEZSTEVOMSgwKSk7CisKKyAgICAgICAgLyogQ2xvY2sgc3RvcCBtb2RlICovCisJaWYgKHNwaV9jZmctPmNsa19zdHBfbW9kZSA9PSBPTUFQX01DQlNQX0NMS19TVFBfTU9ERV9OT19ERUxBWSkKKwkJbWNic3BfY2ZnLnNwY3IxIHw9ICgxIDw8IDEyKTsKKwllbHNlCisJCW1jYnNwX2NmZy5zcGNyMSB8PSAoMyA8PCAxMSk7CisKKwkvKiBTZXQgY2xvY2sgcGFyaXRpZXMgKi8KKwlpZiAoc3BpX2NmZy0+cnhfY2xvY2tfcG9sYXJpdHkgPT0gT01BUF9NQ0JTUF9DTEtfUklTSU5HKQorCQltY2JzcF9jZmcucGNyMCB8PSBDTEtSUDsKKwllbHNlCisJCW1jYnNwX2NmZy5wY3IwICY9IH5DTEtSUDsKKworCWlmIChzcGlfY2ZnLT50eF9jbG9ja19wb2xhcml0eSA9PSBPTUFQX01DQlNQX0NMS19SSVNJTkcpCisJCW1jYnNwX2NmZy5wY3IwICY9IH5DTEtYUDsKKwllbHNlCisJCW1jYnNwX2NmZy5wY3IwIHw9IENMS1hQOworCisJLyogU2V0IFNDTEtNRSB0byAwIGFuZCBDTEtTTSB0byAxICovCisJbWNic3BfY2ZnLnBjcjAgJj0gflNDTEtNRTsKKwltY2JzcF9jZmcuc3JncjIgfD0gQ0xLU007CisKKwkvKiBTZXQgRlNYUCAqLworCWlmIChzcGlfY2ZnLT5mc3hfcG9sYXJpdHkgPT0gT01BUF9NQ0JTUF9GU19BQ1RJVkVfSElHSCkKKwkJbWNic3BfY2ZnLnBjcjAgJj0gfkZTWFA7CisJZWxzZQorCQltY2JzcF9jZmcucGNyMCB8PSBGU1hQOworCisJaWYgKHNwaV9jZmctPnNwaV9tb2RlID09IE9NQVBfTUNCU1BfU1BJX01BU1RFUikgeworCQltY2JzcF9jZmcucGNyMCB8PSBDTEtYTTsKKwkJbWNic3BfY2ZnLnNyZ3IxIHw9IENMS0dEVihzcGlfY2ZnLT5jbGtfZGl2IC0xKTsKKwkJbWNic3BfY2ZnLnBjcjAgfD0gRlNYTTsKKwkJbWNic3BfY2ZnLnNyZ3IyICY9IH5GU0dNOworCQltY2JzcF9jZmcueGNyMiB8PSBYREFURExZKDEpOworCQltY2JzcF9jZmcucmNyMiB8PSBSREFURExZKDEpOworCX0KKwllbHNlIHsKKwkJbWNic3BfY2ZnLnBjcjAgJj0gfkNMS1hNOworCQltY2JzcF9jZmcuc3JncjEgfD0gQ0xLR0RWKDEpOworCQltY2JzcF9jZmcucGNyMCAmPSB+RlNYTTsKKwkJbWNic3BfY2ZnLnhjcjIgJj0gflhEQVRETFkoMyk7CisJCW1jYnNwX2NmZy5yY3IyICY9IH5SREFURExZKDMpOworCX0KKworCW1jYnNwX2NmZy54Y3IyICY9IH5YUEhBU0U7CisJbWNic3BfY2ZnLnJjcjIgJj0gflJQSEFTRTsKKworCW9tYXBfbWNic3BfY29uZmlnKGlkLCAmbWNic3BfY2ZnKTsKK30KKworCisvKgorICogTWNCU1AxIGFuZCBNY0JTUDMgYXJlIGRpcmVjdGx5IG1hcHBlZCBvbiAxNjEwIGFuZCAxNTEwLgorICogNzMwIGhhcyBvbmx5IDIgTWNCU1AsIGFuZCBib3RoIG9mIHRoZW0gYXJlIE1QVSBwZXJpcGhlcmFscy4KKyAqLworc3RydWN0IG9tYXBfbWNic3BfaW5mbyB7CisJdTMyIHZpcnRfYmFzZTsKKwl1OCBkbWFfcnhfc3luYywgZG1hX3R4X3N5bmM7CisJdTE2IHJ4X2lycSwgdHhfaXJxOworfTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvIG1jYnNwXzczMFtdID0geworCVswXSA9IHsgLnZpcnRfYmFzZSA9IGlvX3AydihPTUFQNzMwX01DQlNQMV9CQVNFKSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDFfVFgsCisJCS5yeF9pcnEgPSBJTlRfNzMwX01jQlNQMVJYLAorCQkudHhfaXJxID0gSU5UXzczMF9NY0JTUDFUWCB9LAorCVsxXSA9IHsgLnZpcnRfYmFzZSA9IGlvX3AydihPTUFQNzMwX01DQlNQMl9CQVNFKSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AzX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfVFgsCisJCS5yeF9pcnEgPSBJTlRfNzMwX01jQlNQMlJYLAorCQkudHhfaXJxID0gSU5UXzczMF9NY0JTUDJUWCB9LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvIG1jYnNwXzE1MTBbXSA9IHsKKwlbMF0gPSB7IC52aXJ0X2Jhc2UgPSBPTUFQMTUxMF9NQ0JTUDFfQkFTRSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDFfVFgsCisJCS5yeF9pcnEgPSBJTlRfTWNCU1AxUlgsCisJCS50eF9pcnEgPSBJTlRfTWNCU1AxVFggfSwKKwlbMV0gPSB7IC52aXJ0X2Jhc2UgPSBpb19wMnYoT01BUDE1MTBfTUNCU1AyX0JBU0UpLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDJfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQMl9UWCwKKwkJLnJ4X2lycSA9IElOVF8xNTEwX1NQSV9SWCwKKwkJLnR4X2lycSA9IElOVF8xNTEwX1NQSV9UWCB9LAorCVsyXSA9IHsgLnZpcnRfYmFzZSA9IE9NQVAxNTEwX01DQlNQM19CQVNFLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQM19UWCwKKwkJLnJ4X2lycSA9IElOVF9NY0JTUDNSWCwKKwkJLnR4X2lycSA9IElOVF9NY0JTUDNUWCB9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvIG1jYnNwXzE2MTBbXSA9IHsKKwlbMF0gPSB7IC52aXJ0X2Jhc2UgPSBPTUFQMTYxMF9NQ0JTUDFfQkFTRSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDFfVFgsCisJCS5yeF9pcnEgPSBJTlRfTWNCU1AxUlgsCisJCS50eF9pcnEgPSBJTlRfTWNCU1AxVFggfSwKKwlbMV0gPSB7IC52aXJ0X2Jhc2UgPSBpb19wMnYoT01BUDE2MTBfTUNCU1AyX0JBU0UpLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDJfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQMl9UWCwKKwkJLnJ4X2lycSA9IElOVF8xNjEwX01jQlNQMl9SWCwKKwkJLnR4X2lycSA9IElOVF8xNjEwX01jQlNQMl9UWCB9LAorCVsyXSA9IHsgLnZpcnRfYmFzZSA9IE9NQVAxNjEwX01DQlNQM19CQVNFLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQM19UWCwKKwkJLnJ4X2lycSA9IElOVF9NY0JTUDNSWCwKKwkJLnR4X2lycSA9IElOVF9NY0JTUDNUWCB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX21jYnNwX2luaXQodm9pZCkKK3sKKwlpbnQgbWNic3BfY291bnQgPSAwLCBpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvICptY2JzcF9pbmZvOworCisJcHJpbnRrKCJJbml0aWFsaXppbmcgT01BUCBNY0JTUCBzeXN0ZW1cbiIpOworCisJbWNic3BfZHNwX2NrID0gY2xrX2dldCgwLCAiZHNwX2NrIik7CisJaWYgKElTX0VSUihtY2JzcF9kc3BfY2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWNic3A6IGNvdWxkIG5vdCBhY3F1aXJlIGRzcF9jayBoYW5kbGUuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobWNic3BfZHNwX2NrKTsKKwl9CisJbWNic3BfYXBpX2NrID0gY2xrX2dldCgwLCAiYXBpX2NrIik7CisJaWYgKElTX0VSUihtY2JzcF9kc3BfY2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWNic3A6IGNvdWxkIG5vdCBhY3F1aXJlIGFwaV9jayBoYW5kbGUuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobWNic3BfYXBpX2NrKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJbWNic3BfaW5mbyA9IG1jYnNwXzczMDsKKwkJbWNic3BfY291bnQgPSBBUlJBWV9TSVpFKG1jYnNwXzczMCk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJbWNic3BfaW5mbyA9IG1jYnNwXzE1MTA7CisJCW1jYnNwX2NvdW50ID0gQVJSQVlfU0laRShtY2JzcF8xNTEwKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCQltY2JzcF9pbmZvID0gbWNic3BfMTYxMDsKKwkJbWNic3BfY291bnQgPSBBUlJBWV9TSVpFKG1jYnNwXzE2MTApOworCX0KKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBPTUFQX01BWF9NQ0JTUF9DT1VOVCA7IGkrKykgeworCQlpZiAoaSA+PSBtY2JzcF9jb3VudCkgeworCQkJbWNic3BbaV0uaW9fYmFzZSA9IDA7CisJCQltY2JzcFtpXS5mcmVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCQl9CisJCW1jYnNwW2ldLmlkID0gaSArIDE7CisJCW1jYnNwW2ldLmZyZWUgPSAxOworCQltY2JzcFtpXS5kbWFfdHhfbGNoID0gLTE7CisJCW1jYnNwW2ldLmRtYV9yeF9sY2ggPSAtMTsKKworCQltY2JzcFtpXS5pb19iYXNlID0gbWNic3BfaW5mb1tpXS52aXJ0X2Jhc2U7CisJCW1jYnNwW2ldLnR4X2lycSA9IG1jYnNwX2luZm9baV0udHhfaXJxOworCQltY2JzcFtpXS5yeF9pcnEgPSBtY2JzcF9pbmZvW2ldLnJ4X2lycTsKKwkJbWNic3BbaV0uZG1hX3J4X3N5bmMgPSBtY2JzcF9pbmZvW2ldLmRtYV9yeF9zeW5jOworCQltY2JzcFtpXS5kbWFfdHhfc3luYyA9IG1jYnNwX2luZm9baV0uZG1hX3R4X3N5bmM7CisJCXNwaW5fbG9ja19pbml0KCZtY2JzcFtpXS5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCithcmNoX2luaXRjYWxsKG9tYXBfbWNic3BfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9jb25maWcpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3JlcXVlc3QpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX2ZyZWUpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3N0YXJ0KTsKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9zdG9wKTsKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF94bWl0X3dvcmQpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3JlY3Zfd29yZCk7CitFWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfeG1pdF9idWZmZXIpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3JlY3ZfYnVmZmVyKTsKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9zZXRfc3BpX21vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL211eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjNjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvbXV4LmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbXV4LmMKKyAqCisgKiBVdGlsaXR5IHRvIHNldCB0aGUgT21hcCBNVVggYW5kIFBVTExfRFdOIHJlZ2lzdGVycyBmcm9tIGEgdGFibGUgaW4gbXV4LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnkubGluZGdyZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgX19NVVhfQ19fCisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKKworLyoKKyAqIFNldHMgdGhlIE9tYXAgTVVYIGFuZCBQVUxMX0RXTiByZWdpc3RlcnMgYmFzZWQgb24gdGhlIHRhYmxlCisgKi8KK2ludCBfX2luaXRfb3JfbW9kdWxlCitvbWFwX2NmZ19yZWcoY29uc3QgcmVnX2NmZ190IHJlZ19jZmcpCit7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhtdXhfc3Bpbl9sb2NrKTsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcmVnX2NmZ19zZXQgKmNmZzsKKwl1bnNpZ25lZCBpbnQgcmVnX29yaWcgPSAwLCByZWcgPSAwLCBwdV9wZF9vcmlnID0gMCwgcHVfcGQgPSAwLAorCQlwdWxsX29yaWcgPSAwLCBwdWxsID0gMDsKKwl1bnNpZ25lZCBpbnQgbWFzaywgd2FybiA9IDA7CisKKwlpZiAocmVnX2NmZyA+IEFSUkFZX1NJWkUocmVnX2NmZ190YWJsZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNVVg6IHJlZ19jZmcgJWRcbiIsIHJlZ19jZmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljZmcgPSAmcmVnX2NmZ190YWJsZVtyZWdfY2ZnXTsKKworCS8qCisJICogV2UgZG8gYSBwcmV0dHkgbG9uZyBzZWN0aW9uIGhlcmUgd2l0aCBsb2NrIG9uLCBidXQgcGluIG11eGluZworCSAqIHNob3VsZCBvbmx5IGhhcHBlbiBvbiBkcml2ZXIgaW5pdCBmb3IgZWFjaCBkcml2ZXIsIHNvIGl0J3Mgbm90IHRpbWUKKwkgKiBjcml0aWNhbC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgdGhlIG11eCByZWdpc3RlciBpbiBxdWVzdGlvbiAqLworCWlmIChjZmctPm11eF9yZWcpIHsKKwkJdW5zaWduZWQJdG1wMSwgdG1wMjsKKworCQlyZWdfb3JpZyA9IG9tYXBfcmVhZGwoY2ZnLT5tdXhfcmVnKTsKKworCQkvKiBUaGUgbXV4IHJlZ2lzdGVycyBhbHdheXMgc2VlbSB0byBiZSAzIGJpdHMgbG9uZyAqLworCQltYXNrID0gKDB4NyA8PCBjZmctPm1hc2tfb2Zmc2V0KTsKKwkJdG1wMSA9IHJlZ19vcmlnICYgbWFzazsKKwkJcmVnID0gcmVnX29yaWcgJiB+bWFzazsKKworCQl0bXAyID0gKGNmZy0+bWFzayA8PCBjZmctPm1hc2tfb2Zmc2V0KTsKKwkJcmVnIHw9IHRtcDI7CisKKwkJaWYgKHRtcDEgIT0gdG1wMikKKwkJCXdhcm4gPSAxOworCisJCW9tYXBfd3JpdGVsKHJlZywgY2ZnLT5tdXhfcmVnKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgcHVsbCB1cCBvciBwdWxsIGRvd24gc2VsZWN0aW9uIG9uIDE2MTAgKi8KKwlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWlmIChjZmctPnB1X3BkX3JlZyAmJiBjZmctPnB1bGxfdmFsKSB7CisJCQlwdV9wZF9vcmlnID0gb21hcF9yZWFkbChjZmctPnB1X3BkX3JlZyk7CisJCQltYXNrID0gMSA8PCBjZmctPnB1bGxfYml0OworCisJCQlpZiAoY2ZnLT5wdV9wZF92YWwpIHsKKwkJCQlpZiAoIShwdV9wZF9vcmlnICYgbWFzaykpCisJCQkJCXdhcm4gPSAxOworCQkJCS8qIFVzZSBwdWxsIHVwICovCisJCQkJcHVfcGQgPSBwdV9wZF9vcmlnIHwgbWFzazsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHB1X3BkX29yaWcgJiBtYXNrKQorCQkJCQl3YXJuID0gMTsKKwkJCQkvKiBVc2UgcHVsbCBkb3duICovCisJCQkJcHVfcGQgPSBwdV9wZF9vcmlnICYgfm1hc2s7CisJCQl9CisJCQlvbWFwX3dyaXRlbChwdV9wZCwgY2ZnLT5wdV9wZF9yZWcpOworCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIGFuIGFzc29jaWF0ZWQgcHVsbCBkb3duIHJlZ2lzdGVyICovCisJaWYgKGNmZy0+cHVsbF9yZWcpIHsKKwkJcHVsbF9vcmlnID0gb21hcF9yZWFkbChjZmctPnB1bGxfcmVnKTsKKwkJbWFzayA9IDEgPDwgY2ZnLT5wdWxsX2JpdDsKKworCQlpZiAoY2ZnLT5wdWxsX3ZhbCkgeworCQkJaWYgKHB1bGxfb3JpZyAmIG1hc2spCisJCQkJd2FybiA9IDE7CisJCQkvKiBMb3cgYml0ID0gcHVsbCBlbmFibGVkICovCisJCQlwdWxsID0gcHVsbF9vcmlnICYgfm1hc2s7CisJCX0gZWxzZSB7CisJCQlpZiAoIShwdWxsX29yaWcgJiBtYXNrKSkKKwkJCQl3YXJuID0gMTsKKwkJCS8qIEhpZ2ggYml0ID0gcHVsbCBkaXNhYmxlZCAqLworCQkJcHVsbCA9IHB1bGxfb3JpZyB8IG1hc2s7CisJCX0KKworCQlvbWFwX3dyaXRlbChwdWxsLCBjZmctPnB1bGxfcmVnKTsKKwl9CisKKwlpZiAod2FybikgeworI2lmZGVmIENPTkZJR19PTUFQX01VWF9XQVJOSU5HUworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNVVg6IGluaXRpYWxpemVkICVzXG4iLCBjZmctPm5hbWUpOworI2VuZGlmCisJfQorCisjaWZkZWYgQ09ORklHX09NQVBfTVVYX0RFQlVHCisJaWYgKGNmZy0+ZGVidWcgfHwgd2FybikgeworCQlwcmludGsoIk1VWDogU2V0dGluZyByZWdpc3RlciAlc1xuIiwgY2ZnLT5uYW1lKTsKKwkJcHJpbnRrKCIgICAgICAlcyAoMHglMDh4KSA9IDB4JTA4eCAtPiAweCUwOHhcbiIsCisJCSAgICAgICBjZmctPm11eF9yZWdfbmFtZSwgY2ZnLT5tdXhfcmVnLCByZWdfb3JpZywgcmVnKTsKKworCQlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQlpZiAoY2ZnLT5wdV9wZF9yZWcgJiYgY2ZnLT5wdWxsX3ZhbCkgeworCQkJCXByaW50aygiICAgICAgJXMgKDB4JTA4eCkgPSAweCUwOHggLT4gMHglMDh4XG4iLAorCQkJCSAgICAgICBjZmctPnB1X3BkX25hbWUsIGNmZy0+cHVfcGRfcmVnLAorCQkJCSAgICAgICBwdV9wZF9vcmlnLCBwdV9wZCk7CisJCQl9CisJCX0KKworCQlpZiAoY2ZnLT5wdWxsX3JlZykKKwkJCXByaW50aygiICAgICAgJXMgKDB4JTA4eCkgPSAweCUwOHggLT4gMHglMDh4XG4iLAorCQkJICAgICAgIGNmZy0+cHVsbF9uYW1lLCBjZmctPnB1bGxfcmVnLCBwdWxsX29yaWcsIHB1bGwpOworCX0KKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX09NQVBfTVVYX0VSUk9SUworCXJldHVybiB3YXJuID8gLUVUWFRCU1kgOiAwOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MKG9tYXBfY2ZnX3JlZyk7CisKKyNlbmRpZgkvKiBDT05GSUdfT01BUF9NVVggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9vY3BpLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvb2NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Y2VkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvb2NwaS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL29jcGkuYworICoKKyAqIE1pbmltYWwgT0NQIGJ1cyBzdXBwb3J0IGZvciBvbWFwMTZ4eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCisgKiBNb2RpZmllZCBmb3IgY2xvY2sgZnJhbWV3b3JrIGJ5IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIE9DUElfQkFTRQkJMHhmZmZlYzMyMAorI2RlZmluZSBPQ1BJX0ZBVUxUCQkoT0NQSV9CQVNFICsgMHgwMCkKKyNkZWZpbmUgT0NQSV9DTURfRkFVTFQJCShPQ1BJX0JBU0UgKyAweDA0KQorI2RlZmluZSBPQ1BJX1NJTlQwCQkoT0NQSV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgT0NQSV9UQUJPUlQJCShPQ1BJX0JBU0UgKyAweDBjKQorI2RlZmluZSBPQ1BJX1NJTlQxCQkoT0NQSV9CQVNFICsgMHgxMCkKKyNkZWZpbmUgT0NQSV9QUk9UCQkoT0NQSV9CQVNFICsgMHgxNCkKKyNkZWZpbmUgT0NQSV9TRUMJCShPQ1BJX0JBU0UgKyAweDE4KQorCisvKiBVU0IgT0hDSSBPQ1BJIGFjY2VzcyBlcnJvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVFVFQUREUgkweGZmZmJhMGUwCisjZGVmaW5lIEhPU1RVRVNUQVRVUwkweGZmZmJhMGU0CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpvY3BpX2NrOworCisvKgorICogRW5hYmxlcyBkZXZpY2UgYWNjZXNzIHRvIE9NQVAgYnVzZXMgdmlhIHRoZSBPQ1BJIGJyaWRnZQorICogRklYTUU6IEFkZCBsb2NraW5nCisgKi8KK2ludCBvY3BpX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIWNwdV9pc19vbWFwMTZ4eCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGNsb2NrIGZvciBPQ1BJICovCisJY2xrX2VuYWJsZShvY3BpX2NrKTsKKworCS8qIEVuYWJsZSBhY2Nlc3MgZm9yIE9IQ0kgaW4gT0NQSSAqLworCXZhbCA9IG9tYXBfcmVhZGwoT0NQSV9QUk9UKTsKKwl2YWwgJj0gfjB4ZmY7CisJLy92YWwgJj0gKDEgPDwgMCk7CS8qIEFsbG93IGFjY2VzcyBvbmx5IHRvIEVNSUZTICovCisJb21hcF93cml0ZWwodmFsLCBPQ1BJX1BST1QpOworCisJdmFsID0gb21hcF9yZWFkbChPQ1BJX1NFQyk7CisJdmFsICY9IH4weGZmOworCW9tYXBfd3JpdGVsKHZhbCwgT0NQSV9TRUMpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9jcGlfZW5hYmxlKTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF9vY3BpX2luaXQodm9pZCkKK3sKKwlpZiAoIWNwdV9pc19vbWFwMTZ4eCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9jcGlfY2sgPSBjbGtfZ2V0KE5VTEwsICJsM19vY3BpX2NrIik7CisJaWYgKElTX0VSUihvY3BpX2NrKSkKKwkJcmV0dXJuIFBUUl9FUlIob2NwaV9jayk7CisKKwljbGtfdXNlKG9jcGlfY2spOworCW9jcGlfZW5hYmxlKCk7CisJcHJpbnRrKCJPTUFQIE9DUEkgaW50ZXJjb25uZWN0IGRyaXZlciBsb2FkZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX29jcGlfZXhpdCh2b2lkKQoreworCS8qIFJFVklTSVQ6IERpc2FibGUgT0NQSSAqLworCisJaWYgKCFjcHVfaXNfb21hcDE2eHgoKSkKKwkJcmV0dXJuOworCisJY2xrX3VudXNlKG9jcGlfY2spOworCWNsa19wdXQob2NwaV9jayk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAgT0NQSSBidXMgY29udHJvbGxlciBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KG9tYXBfb2NwaV9pbml0KTsKK21vZHVsZV9leGl0KG9tYXBfb2NwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmYWMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcC9wbS5jCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL3BtLmMKKyAqCisgKiBPTUFQIFBvd2VyIE1hbmFnZW1lbnQgUm91dGluZXMKKyAqCisgKiBPcmlnaW5hbCBjb2RlIGZvciB0aGUgU0ExMXgwOgorICogQ29weXJpZ2h0IChjKSAyMDAxIENsaWZmIEJyYWtlIDxjYnJha2VAYWNjZWxlbnQuY29tPgorICoKKyAqIE1vZGlmaWVkIGZvciB0aGUgUFhBMjUwIGJ5IE5pY29sYXMgUGl0cmU6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTW9udGEgVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBNb2RpZmllZCBmb3IgdGhlIE9NQVAxNTEwIGJ5IERhdmlkIFNpbmdsZXRvbjoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIENsZWFudXAgMjAwNCBmb3IgT01BUDE1MTAvMTYxMCBieSBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMTZ4eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3BtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90cHM2NTAxMC5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBhcm1fc2xlZXBfc2F2ZVtBUk1fU0xFRVBfU0FWRV9TSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB1bHBkX3NsZWVwX3NhdmVbVUxQRF9TTEVFUF9TQVZFX1NJWkVdOworc3RhdGljIHVuc2lnbmVkIGludCBtcHVpMTUxMF9zbGVlcF9zYXZlW01QVUkxNTEwX1NMRUVQX1NBVkVfU0laRV07CitzdGF0aWMgdW5zaWduZWQgaW50IG1wdWkxNjEwX3NsZWVwX3NhdmVbTVBVSTE2MTBfU0xFRVBfU0FWRV9TSVpFXTsKKworLyoKKyAqIExldCdzIHBvd2VyIGRvd24gb24gaWRsZSwgYnV0IG9ubHkgaWYgd2UgYXJlIHJlYWxseQorICogaWRsZSwgYmVjYXVzZSBvbmNlIHdlIHN0YXJ0IGRvd24gdGhlIHBhdGggb2YKKyAqIGdvaW5nIGlkbGUgd2UgY29udGludWUgdG8gZG8gaWRsZSBldmVuIGlmIHdlIGdldAorICogYSBjbG9jayB0aWNrIGludGVycnVwdCAuIC4KKyAqLwordm9pZCBvbWFwX3BtX2lkbGUodm9pZCkKK3sKKwlpbnQgKCpmdW5jX3B0cikodm9pZCkgPSAwOworCXVuc2lnbmVkIGludCBtYXNrMzIgPSAwOworCisJLyoKKwkgKiBJZiB0aGUgRFNQIGlzIGJlaW5nIHVzZWQgbGV0J3MganVzdCBpZGxlIHRoZSBDUFUsIHRoZSBvdmVyaGVhZAorCSAqIHRvIHdha2UgdXAgZnJvbSBCaWcgU2xlZXAgaXMgYmlnLCBtaWxsaXNlY29uZHMgdmVyc3VzIG1pY3JvCisJICogc2Vjb25kcyBmb3Igd2FpdCBmb3IgaW50ZXJydXB0LgorCSAqLworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsb2NhbF9maXFfZGlzYWJsZSgpOworCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQlsb2NhbF9maXFfZW5hYmxlKCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuOworCX0KKwltYXNrMzIgPSBvbWFwX3JlYWRsKEFSTV9TWVNTVCk7CisJbG9jYWxfZmlxX2VuYWJsZSgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX09NQVBfMzJLX1RJTUVSKSAmJiBkZWZpbmVkKENPTkZJR19OT19JRExFX0haKQorCS8qIE92ZXJyaWRlIHRpbWVyIHRvIHVzZSBWU1QgZm9yIHRoZSBuZXh0IGN5Y2xlICovCisJb21hcF8zMmtfdGltZXJfbmV4dF92c3RfaW50ZXJydXB0KCk7CisjZW5kaWYKKworCWlmICgobWFzazMyICYgRFNQX0lETEUpID09IDApIHsKKwkJX19hc21fXyB2b2xhdGlsZSAoIm1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDQiKTsKKwl9IGVsc2UgeworCisJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQMTUxMF9TUkFNX0lETEVfU1VTUEVORCk7CisJCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKKwkJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE2MTBfU1JBTV9JRExFX1NVU1BFTkQpOworCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNTkxMigpKSB7CisJCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVA1OTEyX1NSQU1fSURMRV9TVVNQRU5EKTsKKwkJfQorCisJCWZ1bmNfcHRyKCk7CisJfQorfQorCisvKgorICogQ29uZmlndXJhdGlvbiBvZiB0aGUgd2FrZXVwIGV2ZW50IGlzIGJvYXJkIHNwZWNpZmljLiBGb3IgdGhlCisgKiBtb21lbnQgd2UgcHV0IGl0IGludG8gdGhpcyBoZWxwZXIgZnVuY3Rpb24uIExhdGVyIGl0IG1heSBtb3ZlCisgKiB0byBib2FyZCBzcGVjaWZpYyBmaWxlcy4KKyAqLworc3RhdGljIHZvaWQgb21hcF9wbV93YWtldXBfc2V0dXAodm9pZCkKK3sKKwkvKgorCSAqIEVuYWJsZSBBUk0gWE9SIGNsb2NrIGFuZCByZWxlYXNlIHBlcmlwaGVyYWwgZnJvbSByZXNldCBieQorCSAqIHdyaXRpbmcgMSB0byBQRVJfRU4gYml0IGluIEFSTV9SU1RDVDIsIHRoaXMgaXMgcmVxdWlyZWQKKwkgKiBmb3IgVUFSVCBjb25maWd1cmF0aW9uIHRvIHVzZSBVQVJUMiB0byB3YWtlIHVwLgorCSAqLworCisJb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fSURMRUNUMikgfCBFTkFCTEVfWE9SQ0xLLCBBUk1fSURMRUNUMik7CisJb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fUlNUQ1QyKSB8IFBFUl9FTiwgQVJNX1JTVENUMik7CisJb21hcF93cml0ZXcoTU9ERU1fMzJLX0VOLCBVTFBEX0NMT0NLX0NUUkwpOworCisJLyoKKwkgKiBUdXJuIG9mZiBhbGwgaW50ZXJydXB0cyBleGNlcHQgTDEtMm5kIGxldmVsIGNhc2NhZGUsCisJICogYW5kIHRoZSBMMiB3YWtldXAgaW50ZXJydXB0czoga2V5cGFkIGFuZCBVQVJUMi4KKwkgKi8KKworCW9tYXBfd3JpdGVsKH5JUlFfTEVWRUwyLCBPTUFQX0lIMV9NSVIpOworCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCW9tYXBfd3JpdGVsKH4oSVJRX1VBUlQyIHwgSVJRX0tFWUJPQVJEKSwgIE9NQVBfSUgyX01JUik7CisJfQorCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCW9tYXBfd3JpdGVsKH4oSVJRX1VBUlQyIHwgSVJRX0tFWUJPQVJEKSwgT01BUF9JSDJfMF9NSVIpOworCisJCW9tYXBfd3JpdGVsKH4weDAsIE9NQVBfSUgyXzFfTUlSKTsKKwkJb21hcF93cml0ZWwofjB4MCwgT01BUF9JSDJfMl9NSVIpOworCQlvbWFwX3dyaXRlbCh+MHgwLCBPTUFQX0lIMl8zX01JUik7CisJfQorCisJLyogIE5ldyBJUlEgYWdyZWVtZW50ICovCisgCW9tYXBfd3JpdGVsKDEsIE9NQVBfSUgxX0NPTlRST0wpOworCisJLyogZXh0ZXJuYWwgUFVMTCB0byBkb3duLCBiaXQgMjIgPSAwICovCisJb21hcF93cml0ZWwob21hcF9yZWFkbChQVUxMX0RXTl9DVFJMXzIpICYgfigxPDwyMiksIFBVTExfRFdOX0NUUkxfMik7Cit9CisKK3ZvaWQgb21hcF9wbV9zdXNwZW5kKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG1hc2szMiA9IDA7CisJdW5zaWduZWQgbG9uZyBhcmcwID0gMCwgYXJnMSA9IDA7CisJaW50ICgqZnVuY19wdHIpKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCkgPSAwOworCXVuc2lnbmVkIHNob3J0IHNhdmVfZHNwX2lkbGVjdDI7CisKKwlwcmludGsoIlBNOiBPTUFQJXggaXMgZW50ZXJpbmcgZGVlcCBzbGVlcCBub3cgLi4uXG4iLCBzeXN0ZW1fcmV2KTsKKworCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKKwkJLyogU3RvcCBMRUQxIChEOSkgYmxpbmsgKi8KKwkJdHBzNjUwMTBfc2V0X2xlZChMRUQxLCBPRkYpOworCX0KKworCS8qCisJICogU3RlcCAxOiB0dXJuIG9mZiBpbnRlcnJ1cHRzCisJICovCisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxvY2FsX2ZpcV9kaXNhYmxlKCk7CisKKwkvKgorCSAqIFN0ZXAgMjogc2F2ZSByZWdpc3RlcnMKKwkgKgorCSAqIFRoZSBvbWFwIGlzIGEgc3RyYW5nZS9iZWF1dGlmdWwgZGV2aWNlLiBUaGUgY2FjaGVzLCBtZW1vcnkKKwkgKiBhbmQgcmVnaXN0ZXIgc3RhdGUgYXJlIHByZXNlcnZlZCBhY3Jvc3MgcG93ZXIgc2F2ZXMuCisJICogV2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHZlcnkgbGl0dGxlIHJlZ2lzdGVyIHN0YXRlIHRvCisJICogaWRsZSB0aGUgb21hcC4KKyAgICAgICAgICoKKyAJICogU2F2ZSBpbnRlcnJ1cHQsIE1QVUksIEFSTSBhbmQgVVBMRCBjb250cm9sIHJlZ2lzdGVycy4KKwkgKi8KKworCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlNUFVJMTUxMF9TQVZFKE9NQVBfSUgxX01JUik7CisJCU1QVUkxNTEwX1NBVkUoT01BUF9JSDJfTUlSKTsKKwkJTVBVSTE1MTBfU0FWRShNUFVJX0NUUkwpOworCQlNUFVJMTUxMF9TQVZFKE1QVUlfRFNQX0JPT1RfQ09ORklHKTsKKwkJTVBVSTE1MTBfU0FWRShNUFVJX0RTUF9BUElfQ09ORklHKTsKKwkJTVBVSTE1MTBfU0FWRShFTUlGU19DT05GSUcpOworCQlNUFVJMTUxMF9TQVZFKEVNSUZGX1NEUkFNX0NPTkZJRyk7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgeworCQlNUFVJMTYxMF9TQVZFKE9NQVBfSUgxX01JUik7CisJCU1QVUkxNjEwX1NBVkUoT01BUF9JSDJfMF9NSVIpOworCQlNUFVJMTYxMF9TQVZFKE9NQVBfSUgyXzFfTUlSKTsKKwkJTVBVSTE2MTBfU0FWRShPTUFQX0lIMl8yX01JUik7CisJCU1QVUkxNjEwX1NBVkUoT01BUF9JSDJfM19NSVIpOworCQlNUFVJMTYxMF9TQVZFKE1QVUlfQ1RSTCk7CisJCU1QVUkxNjEwX1NBVkUoTVBVSV9EU1BfQk9PVF9DT05GSUcpOworCQlNUFVJMTYxMF9TQVZFKE1QVUlfRFNQX0FQSV9DT05GSUcpOworCQlNUFVJMTYxMF9TQVZFKEVNSUZTX0NPTkZJRyk7CisJCU1QVUkxNjEwX1NBVkUoRU1JRkZfU0RSQU1fQ09ORklHKTsKKwl9CisKKwlBUk1fU0FWRShBUk1fQ0tDVEwpOworCUFSTV9TQVZFKEFSTV9JRExFQ1QxKTsKKwlBUk1fU0FWRShBUk1fSURMRUNUMik7CisJQVJNX1NBVkUoQVJNX0VXVVBDVCk7CisJQVJNX1NBVkUoQVJNX1JTVENUMSk7CisJQVJNX1NBVkUoQVJNX1JTVENUMik7CisJQVJNX1NBVkUoQVJNX1NZU1NUKTsKKwlVTFBEX1NBVkUoVUxQRF9DTE9DS19DVFJMKTsKKwlVTFBEX1NBVkUoVUxQRF9TVEFUVVNfUkVRKTsKKworCS8qCisJICogU3RlcCAzOiBMT1dfUFdSIHNpZ25hbCBlbmFibGluZworCSAqCisJICogQWxsb3cgdGhlIExPV19QV1Igc2lnbmFsIHRvIGJlIHZpc2libGUgb24gTVBVSU81IGJhbGwuCisJICovCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgxIChMT1dfUE9XRVIgaXMgYXZhaWxhYmxlKSAqLworCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KFVMUERfUE9XRVJfQ1RSTCkgfAorCQkJICAgIE9NQVAxNTEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgxIChMT1dfUE9XRVIgaXMgYXZhaWxhYmxlKSAqLworCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KFVMUERfUE9XRVJfQ1RSTCkgfAorCQkJICAgIE9NQVAxNjEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKKwl9CisKKwkvKiBjb25maWd1cmUgTE9XX1BXUiBwaW4gKi8KKwlvbWFwX2NmZ19yZWcoVDIwXzE2MTBfTE9XX1BXUik7CisKKwkvKgorCSAqIFN0ZXAgNDogT01BUCBEU1AgU2h1dGRvd24KKwkgKi8KKworCS8qIFNldCBEU1BfUlNUID0gMSBhbmQgRFNQX0VOID0gMCwgcHV0IERTUCBibG9jayBpbnRvIHJlc2V0ICovCisJb21hcF93cml0ZWwoKG9tYXBfcmVhZGwoQVJNX1JTVENUMSkgfCBEU1BfUlNUKSAmIH5EU1BfRU5BQkxFLAorCQkgICAgQVJNX1JTVENUMSk7CisKKwkvKiBTZXQgRFNQIGJvb3QgbW9kZSB0byBEU1AtSURMRSwgRFNQX0JPT1RfTU9ERSA9IDB4MiAqLworICAgICAgICBvbWFwX3dyaXRlbChEU1BfSURMRV9NT0RFLCBNUFVJX0RTUF9CT09UX0NPTkZJRyk7CisKKwkvKiBTZXQgRU5fRFNQQ0sgPSAwLCBzdG9wIERTUCBibG9jayBjbG9jayAqLworCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0NLQ1RMKSAmIH5EU1BfQ0xPQ0tfRU5BQkxFLCBBUk1fQ0tDVEwpOworCisJLyogU3RvcCBhbnkgRFNQIGRvbWFpbiBjbG9ja3MgKi8KKwlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKEFSTV9JRExFQ1QyKSB8ICgxPDxFTl9BUElDSyksIEFSTV9JRExFQ1QyKTsKKwlzYXZlX2RzcF9pZGxlY3QyID0gX19yYXdfcmVhZHcoRFNQX0lETEVDVDIpOworCV9fcmF3X3dyaXRldygwLCBEU1BfSURMRUNUMik7CisKKwkvKgorCSAqIFN0ZXAgNTogV2FrZXVwIEV2ZW50IFNldHVwCisJICovCisKKwlvbWFwX3BtX3dha2V1cF9zZXR1cCgpOworCisJLyoKKwkgKiBTdGVwIDZhOiBBUk0gYW5kIFRyYWZmaWMgY29udHJvbGxlciBzaHV0ZG93bgorCSAqCisJICogU3RlcCA2IHN0YXJ0cyBoZXJlIHdpdGggY2xvY2sgYW5kIHdhdGNoZG9nIGRpc2FibGUKKwkgKi8KKworCS8qIHN0b3AgY2xvY2tzICovCisJbWFzazMyID0gb21hcF9yZWFkbChBUk1fSURMRUNUMik7CisJbWFzazMyICY9IH4oMTw8RU5fV0RUQ0spOyAgLyogYml0IDAgLT4gMCAoV0RUIGNsb2NrKSAqLworCW1hc2szMiB8PSAgKDE8PEVOX1hPUlBDSyk7IC8qIGJpdCAxIC0+IDEgKFhPUlBDSyBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9QRVJDSyk7ICAvKiBiaXQgMiAtPiAwIChNUFVQRVJfQ0sgY2xvY2spICovCisJbWFzazMyICY9IH4oMTw8RU5fTENEQ0spOyAgLyogYml0IDMgLT4gMCAoTENEQyBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9MQkNLKTsgICAvKiBiaXQgNCAtPiAwIChsb2NhbCBidXMgY2xvY2spICovCisJbWFzazMyIHw9ICAoMTw8RU5fQVBJQ0spOyAgLyogYml0IDYgLT4gMSAoTVBVSSBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9USU1DSyk7ICAvKiBiaXQgNyAtPiAwIChNUFUgdGltZXIgY2xvY2spICovCisJbWFzazMyICY9IH4oMTw8RE1BQ0tfUkVRKTsgLyogYml0IDggLT4gMCAoRE1BQyBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9HUElPQ0spOyAvKiBiaXQgOSAtPiAwIChHUElPIGNsb2NrKSAqLworCW9tYXBfd3JpdGVsKG1hc2szMiwgQVJNX0lETEVDVDIpOworCisJLyogZGlzYWJsZSBBUk0gd2F0Y2hkb2cgKi8KKwlvbWFwX3dyaXRlbCgweDAwRjUsIE9NQVBfV0RUX1RJTUVSX01PREUpOworCW9tYXBfd3JpdGVsKDB4MDBBMCwgT01BUF9XRFRfVElNRVJfTU9ERSk7CisKKwkvKgorCSAqIFN0ZXAgNmI6IEFSTSBhbmQgVHJhZmZpYyBjb250cm9sbGVyIHNodXRkb3duCisJICoKKwkgKiBTdGVwIDYgY29udGludWVzIGhlcmUuIFByZXBhcmUganVtcCB0byBwb3dlciBtYW5hZ2VtZW50CisJICogYXNzZW1ibHkgY29kZSBpbiBpbnRlcm5hbCBTUkFNLgorCSAqCisJICogU2luY2UgdGhlIG9tYXBfY3B1X3N1c3BlbmQgcm91dGluZSBoYXMgYmVlbiBjb3BpZWQgdG8KKwkgKiBTUkFNLCB3ZSdsbCBkbyBhbiBpbmRpcmVjdCBwcm9jZWR1cmUgY2FsbCB0byBpdCBhbmQgcGFzcyB0aGUKKwkgKiBjb250ZW50cyBvZiBhcm1faWRsZWN0MSBhbmQgYXJtX2lkbGVjdDIgc28gaXQgY2FuIHJlc3RvcmUKKwkgKiB0aGVtIHdoZW4gaXQgd2FrZXMgdXAgYW5kIGl0IHdpbGwgcmV0dXJuLgorCSAqLworCisJYXJnMCA9IGFybV9zbGVlcF9zYXZlW0FSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QxXTsKKwlhcmcxID0gYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfQVJNX0lETEVDVDJdOworCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORCk7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQpOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKKwkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5EKTsKKwl9CisKKwkvKgorCSAqIFN0ZXAgNmM6IEFSTSBhbmQgVHJhZmZpYyBjb250cm9sbGVyIHNodXRkb3duCisJICoKKwkgKiBKdW1wIHRvIGFzc2VtYmx5IGNvZGUuIFRoZSBwcm9jZXNzb3Igd2lsbCBzdGF5IHRoZXJlCisgCSAqIHVudGlsIHdha2UgdXAuCisJICovCisKKyAgICAgICAgZnVuY19wdHIoYXJnMCwgYXJnMSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBoZXJlLCBwcm9jZXNzb3IgaXMgd29rZW4gdXAhCisJICovCisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJLyogUE9XRVJfQ1RSTF9SRUcgPSAweDAgKExPV19QT1dFUiBpcyBkaXNhYmxlZCkgKi8KKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpICYKKwkJCSAgICB+T01BUDE1MTBfVUxQRF9MT1dfUE9XRVJfUkVRLCBVTFBEX1BPV0VSX0NUUkwpOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJLyogUE9XRVJfQ1RSTF9SRUcgPSAweDAgKExPV19QT1dFUiBpcyBkaXNhYmxlZCkgKi8KKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpICYKKwkJCSAgICB+T01BUDE2MTBfVUxQRF9MT1dfUE9XRVJfUkVRLCBVTFBEX1BPV0VSX0NUUkwpOworCX0KKworCisJLyogUmVzdG9yZSBEU1AgY2xvY2tzICovCisJb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fSURMRUNUMikgfCAoMTw8RU5fQVBJQ0spLCBBUk1fSURMRUNUMik7CisJX19yYXdfd3JpdGV3KHNhdmVfZHNwX2lkbGVjdDIsIERTUF9JRExFQ1QyKTsKKwlBUk1fUkVTVE9SRShBUk1fSURMRUNUMik7CisKKwkvKgorCSAqIFJlc3RvcmUgQVJNIHN0YXRlLCBleGNlcHQgQVJNX0lETEVDVDEvMiB3aGljaCBvbWFwX2NwdV9zdXNwZW5kIGRpZAorCSAqLworCisJQVJNX1JFU1RPUkUoQVJNX0NLQ1RMKTsKKwlBUk1fUkVTVE9SRShBUk1fRVdVUENUKTsKKwlBUk1fUkVTVE9SRShBUk1fUlNUQ1QxKTsKKwlBUk1fUkVTVE9SRShBUk1fUlNUQ1QyKTsKKwlBUk1fUkVTVE9SRShBUk1fU1lTU1QpOworCVVMUERfUkVTVE9SRShVTFBEX0NMT0NLX0NUUkwpOworCVVMUERfUkVTVE9SRShVTFBEX1NUQVRVU19SRVEpOworCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCU1QVUkxNTEwX1JFU1RPUkUoTVBVSV9DVFJMKTsKKwkJTVBVSTE1MTBfUkVTVE9SRShNUFVJX0RTUF9CT09UX0NPTkZJRyk7CisJCU1QVUkxNTEwX1JFU1RPUkUoTVBVSV9EU1BfQVBJX0NPTkZJRyk7CisJCU1QVUkxNTEwX1JFU1RPUkUoRU1JRlNfQ09ORklHKTsKKwkJTVBVSTE1MTBfUkVTVE9SRShFTUlGRl9TRFJBTV9DT05GSUcpOworCQlNUFVJMTUxMF9SRVNUT1JFKE9NQVBfSUgxX01JUik7CisJCU1QVUkxNTEwX1JFU1RPUkUoT01BUF9JSDJfTUlSKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCU1QVUkxNjEwX1JFU1RPUkUoTVBVSV9DVFJMKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShNUFVJX0RTUF9CT09UX0NPTkZJRyk7CisJCU1QVUkxNjEwX1JFU1RPUkUoTVBVSV9EU1BfQVBJX0NPTkZJRyk7CisJCU1QVUkxNjEwX1JFU1RPUkUoRU1JRlNfQ09ORklHKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShFTUlGRl9TRFJBTV9DT05GSUcpOworCisJCU1QVUkxNjEwX1JFU1RPUkUoT01BUF9JSDFfTUlSKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShPTUFQX0lIMl8wX01JUik7CisJCU1QVUkxNjEwX1JFU1RPUkUoT01BUF9JSDJfMV9NSVIpOworCQlNUFVJMTYxMF9SRVNUT1JFKE9NQVBfSUgyXzJfTUlSKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShPTUFQX0lIMl8zX01JUik7CisJfQorCisJLyoKKwkgKiBSZWVuYWJsZSBpbnRlcnJ1cHRzCisJICovCisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbG9jYWxfZmlxX2VuYWJsZSgpOworCisJcHJpbnRrKCJQTTogT01BUCV4IGlzIHJlLXN0YXJ0aW5nIGZyb20gZGVlcCBzbGVlcC4uLlxuIiwgc3lzdGVtX3Jldik7CisKKwlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CisJCS8qIExldCBMRUQxIChEOSkgYmxpbmsgYWdhaW4gKi8KKwkJdHBzNjUwMTBfc2V0X2xlZChMRUQxLCBCTElOSyk7CisJfQorfQorCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKK3N0YXRpYyBpbnQgZ19yZWFkX2NvbXBsZXRlZDsKKworLyoKKyAqIFJlYWQgc3lzdGVtIFBNIHJlZ2lzdGVycyBmb3IgZGVidWdnaW5nCisgKi8KK3N0YXRpYyBpbnQgb21hcF9wbV9yZWFkX3Byb2MoCisJY2hhciAqcGFnZV9idWZmZXIsCisJY2hhciAqKm15X2ZpcnN0X2J5dGUsCisJb2ZmX3QgdmlydHVhbF9zdGFydCwKKwlpbnQgbGVuZ3RoLAorCWludCAqZW9mLAorCXZvaWQgKmRhdGEpCit7CisJaW50IG15X2J1ZmZlcl9vZmZzZXQgPSAwOworCWNoYXIgKiBjb25zdCBteV9iYXNlID0gcGFnZV9idWZmZXI7CisKKwlBUk1fU0FWRShBUk1fQ0tDVEwpOworCUFSTV9TQVZFKEFSTV9JRExFQ1QxKTsKKwlBUk1fU0FWRShBUk1fSURMRUNUMik7CisJQVJNX1NBVkUoQVJNX0VXVVBDVCk7CisJQVJNX1NBVkUoQVJNX1JTVENUMSk7CisJQVJNX1NBVkUoQVJNX1JTVENUMik7CisJQVJNX1NBVkUoQVJNX1NZU1NUKTsKKworCVVMUERfU0FWRShVTFBEX0lUX1NUQVRVUyk7CisJVUxQRF9TQVZFKFVMUERfQ0xPQ0tfQ1RSTCk7CisJVUxQRF9TQVZFKFVMUERfU09GVF9SRVEpOworCVVMUERfU0FWRShVTFBEX1NUQVRVU19SRVEpOworCVVMUERfU0FWRShVTFBEX0RQTExfQ1RSTCk7CisJVUxQRF9TQVZFKFVMUERfUE9XRVJfQ1RSTCk7CisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJTVBVSTE1MTBfU0FWRShNUFVJX0NUUkwpOworCQlNUFVJMTUxMF9TQVZFKE1QVUlfRFNQX1NUQVRVUyk7CisJCU1QVUkxNTEwX1NBVkUoTVBVSV9EU1BfQk9PVF9DT05GSUcpOworCQlNUFVJMTUxMF9TQVZFKE1QVUlfRFNQX0FQSV9DT05GSUcpOworCQlNUFVJMTUxMF9TQVZFKEVNSUZGX1NEUkFNX0NPTkZJRyk7CisJCU1QVUkxNTEwX1NBVkUoRU1JRlNfQ09ORklHKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCU1QVUkxNjEwX1NBVkUoTVBVSV9DVFJMKTsKKwkJTVBVSTE2MTBfU0FWRShNUFVJX0RTUF9TVEFUVVMpOworCQlNUFVJMTYxMF9TQVZFKE1QVUlfRFNQX0JPT1RfQ09ORklHKTsKKwkJTVBVSTE2MTBfU0FWRShNUFVJX0RTUF9BUElfQ09ORklHKTsKKwkJTVBVSTE2MTBfU0FWRShFTUlGRl9TRFJBTV9DT05GSUcpOworCQlNUFVJMTYxMF9TQVZFKEVNSUZTX0NPTkZJRyk7CisJfQorCisJaWYgKHZpcnR1YWxfc3RhcnQgPT0gMCkgeworCQlnX3JlYWRfY29tcGxldGVkID0gMDsKKworCQlteV9idWZmZXJfb2Zmc2V0ICs9IHNwcmludGYobXlfYmFzZSArIG15X2J1ZmZlcl9vZmZzZXQsCisJCSAgICJBUk1fQ0tDVExfUkVHOiAgICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fSURMRUNUMV9SRUc6ICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fSURMRUNUMl9SRUc6ICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fRVdVUENUX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fUlNUQ1QxX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fUlNUQ1QyX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fU1lTU1RfUkVHOiAgICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJVTFBEX0lUX1NUQVRVU19SRUc6ICAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX0NMT0NLX0NUUkxfUkVHOiAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX1NPRlRfUkVRX1JFRzogICAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX0RQTExfQ1RSTF9SRUc6ICAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX1NUQVRVU19SRVFfUkVHOiAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX1BPV0VSX0NUUkxfUkVHOiAgICAgIDB4JS00eCAgICAgXG4iLAorCQkgICBBUk1fU0hPVyhBUk1fQ0tDVEwpLAorCQkgICBBUk1fU0hPVyhBUk1fSURMRUNUMSksCisJCSAgIEFSTV9TSE9XKEFSTV9JRExFQ1QyKSwKKwkJICAgQVJNX1NIT1coQVJNX0VXVVBDVCksCisJCSAgIEFSTV9TSE9XKEFSTV9SU1RDVDEpLAorCQkgICBBUk1fU0hPVyhBUk1fUlNUQ1QyKSwKKwkJICAgQVJNX1NIT1coQVJNX1NZU1NUKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfSVRfU1RBVFVTKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfQ0xPQ0tfQ1RSTCksCisJCSAgIFVMUERfU0hPVyhVTFBEX1NPRlRfUkVRKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfRFBMTF9DVFJMKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfU1RBVFVTX1JFUSksCisJCSAgIFVMUERfU0hPVyhVTFBEX1BPV0VSX0NUUkwpKTsKKworCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJCW15X2J1ZmZlcl9vZmZzZXQgKz0gc3ByaW50ZihteV9iYXNlICsgbXlfYnVmZmVyX29mZnNldCwKKwkJCSAgICJNUFVJMTUxMF9DVFJMX1JFRyAgICAgICAgICAgICAweCUtOHggXG4iCisJCQkgICAiTVBVSTE1MTBfRFNQX1NUQVRVU19SRUc6ICAgICAgMHglLTh4IFxuIgorCQkJICAgIk1QVUkxNTEwX0RTUF9CT09UX0NPTkZJR19SRUc6IDB4JS04eCBcbiIKKwkJICAgCSAgICJNUFVJMTUxMF9EU1BfQVBJX0NPTkZJR19SRUc6ICAweCUtOHggXG4iCisJCSAgIAkgICAiTVBVSTE1MTBfU0RSQU1fQ09ORklHX1JFRzogICAgMHglLTh4IFxuIgorCQkgICAJICAgIk1QVUkxNTEwX0VNSUZTX0NPTkZJR19SRUc6ICAgIDB4JS04eCBcbiIsCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKE1QVUlfQ1RSTCksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKE1QVUlfRFNQX1NUQVRVUyksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKE1QVUlfRFNQX0JPT1RfQ09ORklHKSwKKwkJICAgCSAgIE1QVUkxNTEwX1NIT1coTVBVSV9EU1BfQVBJX0NPTkZJRyksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKEVNSUZGX1NEUkFNX0NPTkZJRyksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKEVNSUZTX0NPTkZJRykpOworCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCQlteV9idWZmZXJfb2Zmc2V0ICs9IHNwcmludGYobXlfYmFzZSArIG15X2J1ZmZlcl9vZmZzZXQsCisJCQkgICAiTVBVSTE2MTBfQ1RSTF9SRUcgICAgICAgICAgICAgMHglLTh4IFxuIgorCQkJICAgIk1QVUkxNjEwX0RTUF9TVEFUVVNfUkVHOiAgICAgIDB4JS04eCBcbiIKKwkJCSAgICJNUFVJMTYxMF9EU1BfQk9PVF9DT05GSUdfUkVHOiAweCUtOHggXG4iCisJCSAgIAkgICAiTVBVSTE2MTBfRFNQX0FQSV9DT05GSUdfUkVHOiAgMHglLTh4IFxuIgorCQkgICAJICAgIk1QVUkxNjEwX1NEUkFNX0NPTkZJR19SRUc6ICAgIDB4JS04eCBcbiIKKwkJICAgCSAgICJNUFVJMTYxMF9FTUlGU19DT05GSUdfUkVHOiAgICAweCUtOHggXG4iLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhNUFVJX0NUUkwpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhNUFVJX0RTUF9TVEFUVVMpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhNUFVJX0RTUF9CT09UX0NPTkZJRyksCisJCSAgIAkgICBNUFVJMTYxMF9TSE9XKE1QVUlfRFNQX0FQSV9DT05GSUcpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhFTUlGRl9TRFJBTV9DT05GSUcpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhFTUlGU19DT05GSUcpKTsKKwkJfQorCisJCWdfcmVhZF9jb21wbGV0ZWQrKzsKKwl9IGVsc2UgaWYgKGdfcmVhZF9jb21wbGV0ZWQgPj0gMSkgeworCQkgKmVvZiA9IDE7CisJCSByZXR1cm4gMDsKKwl9CisJZ19yZWFkX2NvbXBsZXRlZCsrOworCisJKm15X2ZpcnN0X2J5dGUgPSBwYWdlX2J1ZmZlcjsKKwlyZXR1cm4gIG15X2J1ZmZlcl9vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfcG1faW5pdF9wcm9jKHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL29tYXBfcG0iLAorCQkJCSAgICAgICBTX0lXVVNSIHwgU19JUlVHTywgTlVMTCwKKwkJCQkgICAgICAgb21hcF9wbV9yZWFkX3Byb2MsIDApOworfQorCisjZW5kaWYgLyogREVCVUcgJiYgQ09ORklHX1BST0NfRlMgKi8KKworLyoKKyAqCW9tYXBfcG1fcHJlcGFyZSAtIERvIHByZWxpbWluYXJ5IHN1c3BlbmQgd29yay4KKyAqCUBzdGF0ZToJCXN1c3BlbmQgc3RhdGUgd2UncmUgZW50ZXJpbmcuCisgKgorICovCisvLyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCitzdGF0aWMgaW50IG9tYXBfcG1fcHJlcGFyZShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJaW50IGVycm9yID0gMDsKKworCXN3aXRjaCAoc3RhdGUpCisJeworCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgorCWNhc2UgUE1fU1VTUEVORF9NRU06CisJCWJyZWFrOworCisJY2FzZSBQTV9TVVNQRU5EX0RJU0s6CisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqCW9tYXBfcG1fZW50ZXIgLSBBY3R1YWxseSBlbnRlciBhIHNsZWVwIHN0YXRlLgorICoJQHN0YXRlOgkJU3RhdGUgd2UncmUgZW50ZXJpbmcuCisgKgorICovCisKK3N0YXRpYyBpbnQgb21hcF9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkKKwl7CisJY2FzZSBQTV9TVVNQRU5EX1NUQU5EQlk6CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJb21hcF9wbV9zdXNwZW5kKCk7CisJCWJyZWFrOworCisJY2FzZSBQTV9TVVNQRU5EX0RJU0s6CisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCW9tYXBfcG1fZmluaXNoIC0gRmluaXNoIHVwIHN1c3BlbmQgc2VxdWVuY2UuCisgKglAc3RhdGU6CQlTdGF0ZSB3ZSdyZSBjb21pbmcgb3V0IG9mLgorICoKKyAqCVRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIHdha2UgYmFjayB1cCAob3IgaWYgZW50ZXJpbmcgdGhlIHNsZWVwIHN0YXRlCisgKglmYWlsZWQpLgorICovCisKK3N0YXRpYyBpbnQgb21hcF9wbV9maW5pc2goc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBwbV9vcHMgb21hcF9wbV9vcHMgPXsKKwkucG1fZGlza19tb2RlID0gMCwKKyAgICAgICAgLnByZXBhcmUgICAgICAgID0gb21hcF9wbV9wcmVwYXJlLAorICAgICAgICAuZW50ZXIgICAgICAgICAgPSBvbWFwX3BtX2VudGVyLAorICAgICAgICAuZmluaXNoICAgICAgICAgPSBvbWFwX3BtX2ZpbmlzaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfcG1faW5pdCh2b2lkKQoreworCXByaW50aygiUG93ZXIgTWFuYWdlbWVudCBmb3IgVEkgT01BUC5cbiIpOworCXBtX2lkbGUgPSBvbWFwX3BtX2lkbGU7CisJLyoKKwkgKiBXZSBjb3B5IHRoZSBhc3NlbWJsZXIgc2xlZXAvd2FrZXVwIHJvdXRpbmVzIHRvIFNSQU0uCisJICogVGhlc2Ugcm91dGluZXMgbmVlZCB0byBiZSBpbiBTUkFNIGFzIHRoYXQncyB0aGUgb25seQorCSAqIG1lbW9yeSB0aGUgTVBVIGNhbiBzZWUgd2hlbiBpdCB3YWtlcyB1cC4KKwkgKi8KKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNTEwX1NSQU1fSURMRV9TVVNQRU5ELAorCQkgICAgICAgb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQsCisJCSAgICAgICBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNTEwX1NSQU1fQVBJX1NVU1BFTkQsIG9tYXAxNTEwX2NwdV9zdXNwZW5kLAorCQkgICAgICAgb21hcDE1MTBfY3B1X3N1c3BlbmRfc3opOworCX0gZWxzZQorI2VuZGlmCisJaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5ELAorCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQsCisJCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQsIG9tYXAxNjEwX2NwdV9zdXNwZW5kLAorCQkgICAgICAgb21hcDE2MTBfY3B1X3N1c3BlbmRfc3opOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKKwkJbWVtY3B5KCh2b2lkICopT01BUDU5MTJfU1JBTV9JRExFX1NVU1BFTkQsCisJCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKKwkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKKwkJbWVtY3B5KCh2b2lkICopT01BUDU5MTJfU1JBTV9BUElfU1VTUEVORCwgb21hcDE2MTBfY3B1X3N1c3BlbmQsCisJCSAgICAgICBvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeik7CisJfQorCisJcG1fc2V0X29wcygmb21hcF9wbV9vcHMpOworCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKKwlvbWFwX3BtX2luaXRfcHJvYygpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK19faW5pdGNhbGwob21hcF9wbV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL3NsZWVwLlMgYi9hcmNoL2FybS9tYWNoLW9tYXAvc2xlZXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQyNmQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3NsZWVwLlMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvc2xlZXAuUworICoKKyAqIExvdy1sZXZlbCBPTUFQMTUxMC8xNjEwIHNsZWVwL3dha2VVcCBzdXBwb3J0CisgKgorICogSW5pdGlhbCBTQTExMTAgY29kZToKKyAqIENvcHlyaWdodCAoYykgMjAwMSBDbGlmZiBCcmFrZSA8Y2JyYWtlQGFjY2VsZW50LmNvbT4KKyAqCisgKiBBZGFwdGVkIGZvciBQWEEgYnkgTmljb2xhcyBQaXRyZToKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFN1cHBvcnQgZm9yIE9NQVAxNTEwLzE2MTAgYnkgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9wbS5oPgorCisJCS50ZXh0CisKKy8qCisgKiBGb3JjZXMgT01BUCBpbnRvIGlkbGUgc3RhdGUKKyAqCisgKiBvbWFwWFhYWF9pZGxlX2xvb3Bfc3VzcGVuZCgpCisgKgorICogTm90ZTogVGhpcyBjb2RlIGdldCdzIGNvcGllZCB0byBpbnRlcm5hbCBTUkFNIGF0IGJvb3QuIFdoZW4gdGhlIE9NQVAKKyAqCSB3YWtlcyB1cCBpdCBjb250aW51ZXMgZXhlY3V0aW9uIGF0IHRoZSBwb2ludCBpdCB3ZW50IHRvIHNsZWVwLgorICoKKyAqIE5vdGU6IEJlY2F1c2Ugb2Ygc2xpZ2h0bHkgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gdmFsdWVzIHdlIGhhdmUKKyAqICAgICAgIHByb2Nlc3NvciBzcGVjaWZpYyBmdW5jdGlvbnMgaGVyZS4KKyAqLworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK0VOVFJZKG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kKQorCisJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQkJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjaworCisJQCBsb2FkIGJhc2UgYWRkcmVzcyBvZiBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIKKwltb3YJcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHhmZjAwMDAwMAorCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMGZmMDAwMAorCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMDAwZmYwMAorCisJQCB0dXJuIG9mZiBjbG9jayBkb21haW5zCisJQCBnZXQgQVJNX0lETEVDVDIgaW50byByMgorCWxkcmgJcjIsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCW1vdglyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKKyAJb3JyCXI1LHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCisJc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHJlcXVlc3QgQVJNIGlkbGUKKwlAIGdldCBBUk1fSURMRUNUMSBpbnRvIHIxCisJbGRyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisJb3JyCXIzLCByMSwgI09NQVAxNTEwX0lETEVfTE9PUF9SRVFVRVNUICYgMHhmZmZmCisJc3RyaAlyMywgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwltb3YJcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZgorCW9yciAgICAgcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAorbF8xNTEwOglzdWJzCXI1LCByNSwgIzEKKwlibmUJbF8xNTEwCisvKgorICogTGV0J3Mgd2FpdCBmb3IgdGhlIG5leHQgY2xvY2sgdGljayB0byB3YWtlIHVzIHVwLgorICovCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0CisvKgorICogb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KKyAqCisgKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKKyAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgorICovCisKKwlAIHJlc3RvcmUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyIGFuZCByZXR1cm4KKwlAIHIxIGhhcyBBUk1fSURMRUNUMSBhbmQgcjIgc3RpbGwgaGFzIEFSTV9JRExFQ1QyCisJc3RyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlsZG1mZCAgIHNwISwge3IwIC0gcjEyLCBwY30gICAgIEAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KKworRU5UUlkob21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opCisJLndvcmQJLiAtIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDE1MTAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCitFTlRSWShvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZCkKKworCXN0bWZkCXNwISwge3IwIC0gcjEyLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKworCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyCisJbW92CXI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDBmZjAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDAwMGZmMDAKKworCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucworCUAgZ2V0IEFSTV9JRExFQ1QyIGludG8gcjIKKwlsZHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KKwltb3YJcjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmCisgCW9ycglyNSxyNSwgI09NQVAxNjEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAorCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCByZXF1ZXN0IEFSTSBpZGxlCisJQCBnZXQgQVJNX0lETEVDVDEgaW50byByMQorCWxkcmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyMywgcjEsICNPTUFQMTYxMF9JRExFX0xPT1BfUkVRVUVTVCAmIDB4ZmZmZgorCXN0cmgJcjMsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQorCisJbW92CXI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYKKwlvcnIgICAgIHI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKK2xfMTYxMDoJc3VicwlyNSwgcjUsICMxCisJYm5lCWxfMTYxMAorLyoKKyAqIExldCdzIHdhaXQgZm9yIHRoZSBuZXh0IGNsb2NrIHRpY2sgdG8gd2FrZSB1cyB1cC4KKyAqLworCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0CQlAIHdhaXQgZm9yIGludGVycnVwdAorLyoKKyAqIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kKCkncyByZXN1bWUgcG9pbnQuCisgKgorICogSXQgd2lsbCBqdXN0IHN0YXJ0IGV4ZWN1dGluZyBoZXJlLCBzbyB3ZSdsbCByZXN0b3JlIHN0dWZmIGZyb20gdGhlCisgKiBzdGFjaywgcmVzZXQgdGhlIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMi4KKyAqLworCisJQCByZXN0b3JlIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMiBhbmQgcmV0dXJuCisJQCByMSBoYXMgQVJNX0lETEVDVDEgYW5kIHIyIHN0aWxsIGhhcyBBUk1fSURMRUNUMgorCXN0cmgJcjIsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCXN0cmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQorCisJbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9ICAgICBAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisKK0VOVFJZKG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KQorCS53b3JkCS4gLSBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZAorI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNlhYICovCisKKy8qCisgKiBGb3JjZXMgT01BUCBpbnRvIGRlZXAgc2xlZXAgc3RhdGUKKyAqCisgKiBvbWFwWFhYWF9jcHVfc3VzcGVuZCgpCisgKgorICogVGhlIHZhbHVlcyBvZiB0aGUgcmVnaXN0ZXJzIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMiBhcmUgcGFzc2VkCisgKiBhcyBhcmcwIGFuZCBhcmcxIGZyb20gY2FsbGVyLiBhcmcwIGlzIHN0b3JlZCBpbiByZWdpc3RlciByMCBhbmQgYXJnMQorICogaW4gcmVnaXN0ZXIgcjEuCisgKgorICogTm90ZTogVGhpcyBjb2RlIGdldCdzIGNvcGllZCB0byBpbnRlcm5hbCBTUkFNIGF0IGJvb3QuIFdoZW4gdGhlIE9NQVAKKyAqCSB3YWtlcyB1cCBpdCBjb250aW51ZXMgZXhlY3V0aW9uIGF0IHRoZSBwb2ludCBpdCB3ZW50IHRvIHNsZWVwLgorICoKKyAqIE5vdGU6IEJlY2F1c2Ugb2YgZXJyYXRhIHdvcmsgYXJvdW5kcyB3ZSBoYXZlIHByb2Nlc3NvciBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqICAgICAgIGhlcmUuIFRoZXkgYXJlIG1vc3RseSB0aGUgc2FtZSwgYnV0IHNsaWdodGx5IGRpZmZlcmVudC4KKyAqCisgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCitFTlRSWShvbWFwMTUxMF9jcHVfc3VzcGVuZCkKKworCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKwlzdG1mZAlzcCEsIHtyMCAtIHIxMiwgbHJ9CisKKwlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIFRyYWZmaWMgQ29udHJvbGxlcgorCW1vdglyNCwgI1RDTUlGX0FTTV9CQVNFICYgMHhmZjAwMDAwMAorCW9ycglyNCwgcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4MDBmZjAwMDAKKwlvcnIJcjQsIHI0LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwMDBmZjAwCisKKwlAIHdvcmsgYXJvdW5kIGVycmF0YSBvZiBPTUFQMTUxMCBQREUgYml0IGZvciBUQyBzaHV0IGRvd24KKwlAIGNsZWFyIFBERSBiaXQKKwlsZHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwliaWMJcjUsIHI1LCAjUERFX0JJVCAmIDB4ZmYKKwlzdHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKworCUAgc2V0IFBXRF9FTiBiaXQKKwlhbmQJcjUsIHI1LCAjUFdEX0VOX0JJVCAmIDB4ZmYKKwlzdHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKworCUAgcHJlcGFyZSB0byBwdXQgU0RSQU0gaW50byBzZWxmLXJlZnJlc2ggbWFudWFsbHkKKwlsZHIJcjUsIFtyNCwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwlvcnIJcjUsIHI1LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweGZmMDAwMDAwCisJb3JyCXI1LCByNSwgI1NFTEZfUkVGUkVTSF9NT0RFICYgMHgwMDAwMDBmZgorCXN0cglyNSwgW3I0LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCBwcmVwYXJlIHRvIHB1dCBFTUlGUyB0byBTbGVlcAorCWxkcglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyNSwgcjUsICNJRExFX0VNSUZTX1JFUVVFU1QgJiAweGZmCisJc3RyCXI1LCBbcjQsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMgorCW1vdglyNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweGZmMDAwMDAwCisJb3JyCXI0LCByNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweDAwZmYwMDAwCisJb3JyCXI0LCByNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweDAwMDBmZjAwCisKKwlAIHR1cm4gb2ZmIGNsb2NrIGRvbWFpbnMKKwltb3YJcjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmCisgCW9ycglyNSxyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAorCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCByZXF1ZXN0IEFSTSBpZGxlCisJbW92CXIzLCAjT01BUDE1MTBfREVFUF9TTEVFUF9SRVFVRVNUICYgMHhmZgorCW9ycglyMywgcjMsICNPTUFQMTUxMF9ERUVQX1NMRUVQX1JFUVVFU1QgJiAweGZmMDAKKwlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KKworCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCisJb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCitsXzE1MTBfMjoKKwlzdWJzCXI1LCByNSwgIzEKKwlibmUJbF8xNTEwXzIKKy8qCisgKiBMZXQncyB3YWl0IGZvciB0aGUgbmV4dCB3YWtlIHVwIGV2ZW50IHRvIHdha2UgdXMgdXAuIHIwIGNhbid0IGJlCisgKiB1c2VkIGhlcmUgYmVjYXVzZSByMCBob2xkcyBBUk1fSURMRUNUMQorICovCisJbW92CXIyLCAjMAorCW1jcglwMTUsIDAsIHIyLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0CisvKgorICogb21hcDE1MTBfY3B1X3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KKyAqCisgKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKKyAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgorICovCisJc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyaAlyMCwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisJbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisKK0VOVFJZKG9tYXAxNTEwX2NwdV9zdXNwZW5kX3N6KQorCS53b3JkCS4gLSBvbWFwMTUxMF9jcHVfc3VzcGVuZAorI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNTEwICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorRU5UUlkob21hcDE2MTBfY3B1X3N1c3BlbmQpCisKKwlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCisJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQorCisJQCBsb2FkIGJhc2UgYWRkcmVzcyBvZiBUcmFmZmljIENvbnRyb2xsZXIKKwltb3YJcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjQsIHI0LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwZmYwMDAwCisJb3JyCXI0LCByNCwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMDAwZmYwMAorCisJQCBwcmVwYXJlIHRvIHB1dCBTRFJBTSBpbnRvIHNlbGYtcmVmcmVzaCBtYW51YWxseQorCWxkcglyNSwgW3I0LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyNSwgcjUsICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjUsIHI1LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweDAwMDAwMGZmCisJc3RyCXI1LCBbcjQsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHByZXBhcmUgdG8gcHV0IEVNSUZTIHRvIFNsZWVwCisJbGRyCXI1LCBbcjQsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJb3JyCXI1LCByNSwgI0lETEVfRU1JRlNfUkVRVUVTVCAmIDB4ZmYKKwlzdHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKworCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyCisJbW92CXI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDBmZjAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDAwMGZmMDAKKworCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucworCW1vdglyNSwgI09NQVAxNjEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKKyAJb3JyCXI1LHI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCisJc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHdvcmsgYXJvdW5kIGVycmF0YSBvZiBPTUFQMTYxMC81OTEyLiBFbmFibGUgKCEpIHBlcmlwaGVyYWwKKwlAIGNsb2NrIHRvIGxldCB0aGUgY2hpcCBnbyBpbnRvIGRlZXAgc2xlZXAKKwlsZHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KKyAJb3JyCXI1LHI1LCAjRU5fUEVSQ0tfQklUICYgMHhmZgorCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCByZXF1ZXN0IEFSTSBpZGxlCisJbW92CXIzLCAjT01BUDE2MTBfREVFUF9TTEVFUF9SRVFVRVNUICYgMHhmZgorCW9ycglyMywgcjMsICNPTUFQMTYxMF9ERUVQX1NMRUVQX1JFUVVFU1QgJiAweGZmMDAKKwlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KKworCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCisJb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCitsXzE2MTBfMjoKKwlzdWJzCXI1LCByNSwgIzEKKwlibmUJbF8xNjEwXzIKKy8qCisgKiBMZXQncyB3YWl0IGZvciB0aGUgbmV4dCB3YWtlIHVwIGV2ZW50IHRvIHdha2UgdXMgdXAuIHIwIGNhbid0IGJlCisgKiB1c2VkIGhlcmUgYmVjYXVzZSByMCBob2xkcyBBUk1fSURMRUNUMQorICovCisJbW92CXIyLCAjMAorCW1jcglwMTUsIDAsIHIyLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0CisvKgorICogb21hcDE2MTBfY3B1X3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KKyAqCisgKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKKyAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgorICovCisJc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyaAlyMCwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisJbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisKK0VOVFJZKG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KQorCS53b3JkCS4gLSBvbWFwMTYxMF9jcHVfc3VzcGVuZAorI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNlhYICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA1ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3RpbWUuYwpAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC90aW1lLmMKKyAqCisgKiBPTUFQIFRpbWVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogUGFydGlhbCB0aW1lciByZXdyaXRlIGFuZCBhZGRpdGlvbmFsIFZTVCB0aW1lciBzdXBwb3J0IGJ5CisgKiBUb255IExpbmRnZW4gPHRvbnlAYXRvbWlkZS5jb20+IGFuZAorICogVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+CisgKgorICogTVBVIHRpbWVyIGNvZGUgYmFzZWQgb24gdGhlIG9sZGVyIE1QVSB0aW1lciBjb2RlIGZvciBPTUFQCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmlkZ2VSdW4sIEluYy4KKyAqIEF1dGhvcjogR3JlZyBMb25ub24gPGdsb25ub25AcmlkZ2VydW4uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTgorICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKK3N0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lcjsKKworI2lmZGVmIENPTkZJR19PTUFQX01QVV9USU1FUgorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNUFUgdGltZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIE9NQVBfTVBVX1RJTUVSMV9CQVNFCQkoMHhmZmZlYzUwMCkKKyNkZWZpbmUgT01BUF9NUFVfVElNRVIyX0JBU0UJCSgweGZmZmVjNjAwKQorI2RlZmluZSBPTUFQX01QVV9USU1FUjNfQkFTRQkJKDB4ZmZmZWM3MDApCisjZGVmaW5lIE9NQVBfTVBVX1RJTUVSX0JBU0UJCU9NQVBfTVBVX1RJTUVSMV9CQVNFCisjZGVmaW5lIE9NQVBfTVBVX1RJTUVSX09GRlNFVAkJMHgxMDAKKworI2RlZmluZSBNUFVfVElNRVJfRlJFRQkJCSgxIDw8IDYpCisjZGVmaW5lIE1QVV9USU1FUl9DTE9DS19FTkFCTEUJCSgxIDw8IDUpCisjZGVmaW5lIE1QVV9USU1FUl9BUgkJCSgxIDw8IDEpCisjZGVmaW5lIE1QVV9USU1FUl9TVAkJCSgxIDw8IDApCisKKy8qIGN5Y2xlcyB0byBuc2VjIGNvbnZlcnNpb25zIHRha2VuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMsCisgKiBjb252ZXJ0ZWQgdG8gdXNlIGtIeiBieSBLZXZpbiBIaWxtYW4gKi8KKy8qIGNvbnZlcnQgZnJvbSBjeWNsZXMoNjRiaXRzKSA9PiBuYW5vc2Vjb25kcyAoNjRiaXRzKQorICogIGJhc2ljIGVxdWF0aW9uOgorICoJCW5zID0gY3ljbGVzIC8gKGZyZXEgLyBuc19wZXJfc2VjKQorICoJCW5zID0gY3ljbGVzICogKG5zX3Blcl9zZWMgLyBmcmVxKQorICoJCW5zID0gY3ljbGVzICogKDEwXjkgLyAoY3B1X2toeiAqIDEwXjMpKQorICoJCW5zID0gY3ljbGVzICogKDEwXjYgLyBjcHVfa2h6KQorICoKKyAqCVRoZW4gd2UgdXNlIHNjYWxpbmcgbWF0aCAoc3VnZ2VzdGVkIGJ5IGdlb3JnZSBhdCBtdmlzdGEuY29tKSB0byBnZXQ6CisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeNiAqIFNDIC8gY3B1X2toeiAvIFNDCisgKgkJbnMgPSBjeWNsZXMgKiBjeWMybnNfc2NhbGUgLyBTQworICoKKyAqCUFuZCBzaW5jZSBTQyBpcyBhIGNvbnN0YW50IHBvd2VyIG9mIHR3bywgd2UgY2FuIGNvbnZlcnQgdGhlIGRpdgorICogIGludG8gYSBzaGlmdC4KKyAqCQkJLWpvaG5zdHVsIGF0IHVzLmlibS5jb20gIm1hdGggaXMgaGFyZCwgbGV0cyBnbyBzaG9wcGluZyEiCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN5YzJuc19zY2FsZTsKKyNkZWZpbmUgQ1lDMk5TX1NDQUxFX0ZBQ1RPUiAxMCAvKiAyXjEwLCBjYXJlZnVsbHkgY2hvc2VuICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3ljMm5zX3NjYWxlKHVuc2lnbmVkIGxvbmcgY3B1X2toeikKK3sKKwljeWMybnNfc2NhbGUgPSAoMTAwMDAwMCA8PCBDWUMyTlNfU0NBTEVfRkFDVE9SKS9jcHVfa2h6OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKQoreworCXJldHVybiAoY3ljICogY3ljMm5zX3NjYWxlKSA+PiBDWUMyTlNfU0NBTEVfRkFDVE9SOworfQorCisvKgorICogTVBVX1RJQ0tTX1BFUl9TRUMgbXVzdCBiZSBhbiBldmVuIG51bWJlciwgb3RoZXJ3aXNlIG1hY2hpbmVjeWNsZXNfdG9fdXNlY3MKKyAqIHdpbGwgYnJlYWsuIE9uIFAyLCB0aGUgdGltZXIgY291bnQgcmF0ZSBpcyA2LjUgTUh6IGFmdGVyIHByb2dyYW1taW5nIFBUVgorICogd2l0aCAwLiBUaGlzIGRpdmlkZXMgdGhlIDEzTUh6IGlucHV0IGJ5IDIsIGFuZCBpcyB1bmRvY3VtZW50ZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyCisvKiBSRVZJU0lUOiBUaGlzIGlmZGVmIGNvbnN0cnVjdCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBxdWVyeSB0byBjbG9jaworICogZnJhbWV3b3JrIHRvIHNlZSBpZiB0aW1lciBiYXNlIGZyZXF1ZW5jeSBpcyAxMi4wLCAxMy4wIG9yIDE5LjIgTUh6LgorICovCisjZGVmaW5lIE1QVV9USUNLU19QRVJfU0VDCQkoMTMwMDAwMDAgLyAyKQorI2Vsc2UKKyNkZWZpbmUgTVBVX1RJQ0tTX1BFUl9TRUMJCSgxMjAwMDAwMCAvIDIpCisjZW5kaWYKKworI2RlZmluZSBNUFVfVElNRVJfVElDS19QRVJJT0QJCSgoTVBVX1RJQ0tTX1BFUl9TRUMgLyBIWikgLSAxKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGNudGw7CQkJLyogQ05UTF9USU1FUiwgUi9XICovCisJdTMyIGxvYWRfdGltOwkJCS8qIExPQURfVElNLCAgIFcgKi8KKwl1MzIgcmVhZF90aW07CQkJLyogUkVBRF9USU0sICAgUiAqLworfSBvbWFwX21wdV90aW1lcl9yZWdzX3Q7CisKKyNkZWZpbmUgb21hcF9tcHVfdGltZXJfYmFzZShuKQkJCQkJCVwKKygodm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KilJT19BRERSRVNTKE9NQVBfTVBVX1RJTUVSX0JBU0UgKwlcCisJCQkJIChuKSpPTUFQX01QVV9USU1FUl9PRkZTRVQpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgb21hcF9tcHVfdGltZXJfcmVhZChpbnQgbnIpCit7CisJdm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KiB0aW1lciA9IG9tYXBfbXB1X3RpbWVyX2Jhc2UobnIpOworCXJldHVybiB0aW1lci0+cmVhZF90aW07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX21wdV90aW1lcl9zdGFydChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgbG9hZF92YWwpCit7CisJdm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KiB0aW1lciA9IG9tYXBfbXB1X3RpbWVyX2Jhc2UobnIpOworCisJdGltZXItPmNudGwgPSBNUFVfVElNRVJfQ0xPQ0tfRU5BQkxFOworCXVkZWxheSgxKTsKKwl0aW1lci0+bG9hZF90aW0gPSBsb2FkX3ZhbDsKKyAgICAgICAgdWRlbGF5KDEpOworCXRpbWVyLT5jbnRsID0gKE1QVV9USU1FUl9DTE9DS19FTkFCTEUgfCBNUFVfVElNRVJfQVIgfCBNUFVfVElNRVJfU1QpOworfQorCit1bnNpZ25lZCBsb25nIG9tYXBfbXB1X3RpbWVyX3RpY2tzX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgbnJfdGlja3MpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5zZWM7CisKKwluc2VjID0gY3ljbGVzXzJfbnMoKHVuc2lnbmVkIGxvbmcgbG9uZylucl90aWNrcyk7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKW5zZWMgLyAxMDAwOworfQorCisvKgorICogTGFzdCBwcm9jZXNzZWQgc3lzdGVtIHRpbWVyIGludGVycnVwdAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX21wdV90aW1lcl9sYXN0ID0gMDsKKworLyoKKyAqIFJldHVybnMgZWxhcHNlZCB1c2VjcyBzaW5jZSBsYXN0IHN5c3RlbSB0aW1lciBpbnRlcnJ1cHQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9tcHVfdGltZXJfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gMCAtIG9tYXBfbXB1X3RpbWVyX3JlYWQoMCk7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkID0gbm93IC0gb21hcF9tcHVfdGltZXJfbGFzdDsKKworCXJldHVybiBvbWFwX21wdV90aW1lcl90aWNrc190b191c2VjcyhlbGFwc2VkKTsKK30KKworLyoKKyAqIEVsYXBzZWQgdGltZSBiZXR3ZWVuIGludGVycnVwdHMgaXMgY2FsY3VsYXRlZCB1c2luZyB0aW1lcjAuCisgKiBMYXRlbmN5IGR1cmluZyB0aGUgaW50ZXJydXB0IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGltZXIxLgorICogQm90aCB0aW1lcjAgYW5kIHRpbWVyMSBhcmUgY291bnRpbmcgYXQgNk1IeiAoUDIgNi41TUh6KS4KKyAqLworc3RhdGljIGlycXJldHVybl90IG9tYXBfbXB1X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgbm93LCBsYXRlbmN5OworCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisJbm93ID0gMCAtIG9tYXBfbXB1X3RpbWVyX3JlYWQoMCk7CisJbGF0ZW5jeSA9IE1QVV9USUNLU19QRVJfU0VDIC8gSFogLSBvbWFwX21wdV90aW1lcl9yZWFkKDEpOworCW9tYXBfbXB1X3RpbWVyX2xhc3QgPSBub3cgLSBsYXRlbmN5OworCXRpbWVyX3RpY2socmVncyk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF9tcHVfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJtcHUgdGltZXIiLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBvbWFwX21wdV90aW1lcl9pbnRlcnJ1cHQKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfbXB1X3RpbWVyMV9vdmVyZmxvd3M7CitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9tcHVfdGltZXIxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJb21hcF9tcHVfdGltZXIxX292ZXJmbG93cysrOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF9tcHVfdGltZXIxX2lycSA9IHsKKwkubmFtZQkJPSAibXB1IHRpbWVyMSBvdmVyZmxvdyIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IG9tYXBfbXB1X3RpbWVyMV9pbnRlcnJ1cHQKK307CisKK3N0YXRpYyBfX2luaXQgdm9pZCBvbWFwX2luaXRfbXB1X3RpbWVyKHZvaWQpCit7CisJc2V0X2N5YzJuc19zY2FsZShNUFVfVElDS1NfUEVSX1NFQyAvIDEwMDApOworCW9tYXBfdGltZXIub2Zmc2V0ID0gb21hcF9tcHVfdGltZXJfZ2V0dGltZW9mZnNldDsKKwlzZXR1cF9pcnEoSU5UX1RJTUVSMSwgJm9tYXBfbXB1X3RpbWVyMV9pcnEpOworCXNldHVwX2lycShJTlRfVElNRVIyLCAmb21hcF9tcHVfdGltZXJfaXJxKTsKKwlvbWFwX21wdV90aW1lcl9zdGFydCgwLCAweGZmZmZmZmZmKTsKKwlvbWFwX21wdV90aW1lcl9zdGFydCgxLCBNUFVfVElNRVJfVElDS19QRVJJT0QpOworfQorCisvKgorICogU2NoZWR1bGVyIGNsb2NrIC0gcmV0dXJucyBjdXJyZW50IHRpbWUgaW4gbmFub3NlYyB1bml0cy4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrcyA9IDAgLSBvbWFwX21wdV90aW1lcl9yZWFkKDApOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aWNrczY0OworCisJdGlja3M2NCA9IG9tYXBfbXB1X3RpbWVyMV9vdmVyZmxvd3M7CisJdGlja3M2NCA8PD0gMzI7CisJdGlja3M2NCB8PSB0aWNrczsKKworCXJldHVybiBjeWNsZXNfMl9ucyh0aWNrczY0KTsKK30KKyNlbmRpZgkvKiBDT05GSUdfT01BUF9NUFVfVElNRVIgKi8KKworI2lmZGVmIENPTkZJR19PTUFQXzMyS19USU1FUgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKyNlcnJvciBPTUFQIDMyS0h6IHRpbWVyIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIG9uIDE1MTAhCisjZW5kaWYKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMzJLSHogT1MgdGltZXIKKyAqCisgKiBUaGlzIGN1cnJlbnRseSB3b3JrcyBvbmx5IG9uIDE2eHgsIGFzIDE1MTAgZG9lcyBub3QgaGF2ZSB0aGUgY29udGludW91cworICogMzJLSHogc3luY2hyb25vdXMgdGltZXIuIFRoZSAzMktIeiBzeW5jaHJvbm91cyB0aW1lciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sKKyAqIG9mIHRpbWUgaW4gYWRkaXRpb24gdG8gdGhlIDMyS0h6IE9TIHRpbWVyLiBVc2luZyBvbmx5IHRoZSAzMktIeiBPUyB0aW1lcgorICogb24gMTUxMCB3b3VsZCBiZSBwb3NzaWJsZSwgYnV0IHRoZSB0aW1lciB3b3VsZCBub3QgYmUgYXMgYWNjdXJhdGUgYXMKKyAqIHdpdGggdGhlIDMyS0h6IHN5bmNocm9uaXplZCB0aW1lci4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIE9NQVBfMzJLX1RJTUVSX0JBU0UJCTB4ZmZmYjkwMDAKKyNkZWZpbmUgT01BUF8zMktfVElNRVJfQ1IJCTB4MDgKKyNkZWZpbmUgT01BUF8zMktfVElNRVJfVFZSCQkweDAwCisjZGVmaW5lIE9NQVBfMzJLX1RJTUVSX1RDUgkJMHgwNAorCisjZGVmaW5lIE9NQVBfMzJLX1RJQ0tTX1BFUl9IWgkJKDMyNzY4IC8gSFopCisKKy8qCisgKiBUUk0gc2F5cyAxIC8gSFogPSAoIFRWUiArIDEpIC8gMzI3NjgsIHNvIFRSViA9ICgzMjc2OCAvIEhaKSAtIDEKKyAqIHNvIHdpdGggSFogPSAxMDAsIFRWUiA9IDMyNy42OC4KKyAqLworI2RlZmluZSBPTUFQXzMyS19USU1FUl9USUNLX1BFUklPRAkoKDMyNzY4IC8gSFopIC0gMSkKKyNkZWZpbmUgTUFYX1NLSVBfSklGRklFUwkJMjUKKyNkZWZpbmUgVElNRVJfMzJLX1NZTkNIUk9OSVpFRAkJMHhmZmZiYzQxMAorCisjZGVmaW5lIEpJRkZJRVNfVE9fSFdfVElDS1MobnJfamlmZmllcywgY2xvY2tfcmF0ZSkJCQlcCisJCQkJKCgobnJfamlmZmllcykgKiAoY2xvY2tfcmF0ZSkpIC8gSFopCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwXzMya190aW1lcl93cml0ZShpbnQgdmFsLCBpbnQgcmVnKQoreworCW9tYXBfd3JpdGV3KHZhbCwgcmVnICsgT01BUF8zMktfVElNRVJfQkFTRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwXzMya190aW1lcl9yZWFkKGludCByZWcpCit7CisJcmV0dXJuIG9tYXBfcmVhZGwocmVnICsgT01BUF8zMktfVElNRVJfQkFTRSkgJiAweGZmZmZmZjsKK30KKworLyoKKyAqIFRoZSAzMktIeiBzeW5jaHJvbml6ZWQgdGltZXIgaXMgYW4gYWRkaXRpb25hbCB0aW1lciBvbiAxNnh4LgorICogSXQgaXMgYWx3YXlzIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gb21hcF9yZWFkbChUSU1FUl8zMktfU1lOQ0hST05JWkVEKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfMzJrX3RpbWVyX3N0YXJ0KHVuc2lnbmVkIGxvbmcgbG9hZF92YWwpCit7CisJb21hcF8zMmtfdGltZXJfd3JpdGUobG9hZF92YWwsIE9NQVBfMzJLX1RJTUVSX1RWUik7CisJb21hcF8zMmtfdGltZXJfd3JpdGUoMHgwZiwgT01BUF8zMktfVElNRVJfQ1IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF8zMmtfdGltZXJfc3RvcCh2b2lkKQoreworCW9tYXBfMzJrX3RpbWVyX3dyaXRlKDB4MCwgT01BUF8zMktfVElNRVJfQ1IpOworfQorCisvKgorICogUm91bmRzIGRvd24gdG8gbmVhcmVzdCB1c2VjCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwXzMya190aWNrc190b191c2Vjcyh1bnNpZ25lZCBsb25nIHRpY2tzXzMyaykKK3sKKwlyZXR1cm4gKHRpY2tzXzMyayAqIDUqNSo1KjUqNSo1KSA+PiA5OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwXzMya19sYXN0X3RpY2sgPSAwOworCisvKgorICogUmV0dXJucyBlbGFwc2VkIHVzZWNzIHNpbmNlIGxhc3QgMzJrIHRpbWVyIGludGVycnVwdAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwXzMya190aW1lcl9nZXR0aW1lb2Zmc2V0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKKwlyZXR1cm4gb21hcF8zMmtfdGlja3NfdG9fdXNlY3Mobm93IC0gb21hcF8zMmtfbGFzdF90aWNrKTsKK30KKworLyoKKyAqIFRpbWVyIGludGVycnVwdCBmb3IgMzJLSHogdGltZXIuIFdoZW4gZHluYW1pYyB0aWNrIGlzIGVuYWJsZWQsIHRoaXMKKyAqIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gb3RoZXIgaW50ZXJydXB0cyB0byByZW1vdmUgbGF0ZW5jeQorICogaXNzdWVzIHdpdGggZHluYW1pYyB0aWNrLiBJbiB0aGUgZHluYW1pYyB0aWNrIGNhc2UsIHdlIG5lZWQgdG8gbG9jaworICogd2l0aCBpcnFzYXZlLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF8zMmtfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBub3c7CisKKwl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwlub3cgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKKworCXdoaWxlIChub3cgLSBvbWFwXzMya19sYXN0X3RpY2sgPj0gT01BUF8zMktfVElDS1NfUEVSX0haKSB7CisJCW9tYXBfMzJrX2xhc3RfdGljayArPSBPTUFQXzMyS19USUNLU19QRVJfSFo7CisJCXRpbWVyX3RpY2socmVncyk7CisJfQorCisJLyogUmVzdGFydCB0aW1lciBzbyB3ZSBkb24ndCBkcmlmdCBvZmYgZHVlIHRvIG1vZHVsbyBvciBkeW5hbWljIHRpY2suCisJICogQnkgZGVmYXVsdCB3ZSBwcm9ncmFtIHRoZSBuZXh0IHRpbWVyIHRvIGJlIGNvbnRpbnVvdXMgdG8gYXZvaWQKKwkgKiBsYXRlbmNpZXMgZHVyaW5nIGhpZ2ggc3lzdGVtIGxvYWQuIER1cmluZyBkeW5hbWljIHRpY2sgb3BlcmF0aW9uIHRoZQorCSAqIGNvbnRpbnVvdXMgdGltZXIgY2FuIGJlIG92ZXJyaWRkZW4gZnJvbSBwbV9pZGxlIHRvIGJlIGxvbmdlci4KKwkgKi8KKwlvbWFwXzMya190aW1lcl9zdGFydChvbWFwXzMya19sYXN0X3RpY2sgKyBPTUFQXzMyS19USUNLU19QRVJfSFogLSBub3cpOworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG9tYXBfMzJrX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiMzJLSHogdGltZXIiLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBvbWFwXzMya190aW1lcl9pbnRlcnJ1cHQKK307CisKK3N0YXRpYyBfX2luaXQgdm9pZCBvbWFwX2luaXRfMzJrX3RpbWVyKHZvaWQpCit7CisJc2V0dXBfaXJxKElOVF9PU19USU1FUiwgJm9tYXBfMzJrX3RpbWVyX2lycSk7CisJb21hcF90aW1lci5vZmZzZXQgID0gb21hcF8zMmtfdGltZXJfZ2V0dGltZW9mZnNldDsKKwlvbWFwXzMya19sYXN0X3RpY2sgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKKwlvbWFwXzMya190aW1lcl9zdGFydChPTUFQXzMyS19USU1FUl9USUNLX1BFUklPRCk7Cit9CisjZW5kaWYJLyogQ09ORklHX09NQVBfMzJLX1RJTUVSICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRpbWVyIGluaXRpYWxpemF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBfX2luaXQgb21hcF90aW1lcl9pbml0KHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NUFVfVElNRVIpCisJb21hcF9pbml0X21wdV90aW1lcigpOworI2VsaWYgZGVmaW5lZChDT05GSUdfT01BUF8zMktfVElNRVIpCisJb21hcF9pbml0XzMya190aW1lcigpOworI2Vsc2UKKyNlcnJvciBObyBzeXN0ZW0gdGltZXIgc2VsZWN0ZWQgaW4gS2NvbmZpZyEKKyNlbmRpZgorfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXIgPSB7CisJLmluaXQJCT0gb21hcF90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gTlVMTCwJCS8qIEluaXRpYWxpemVkIGxhdGVyICovCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODA1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAvdXNiLmMKQEAgLTAsMCArMSw1OTQgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLW9tYXAvdXNiLmMgLS0gcGxhdGZvcm0gbGV2ZWwgVVNCIGluaXRpYWxpemF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyN1bmRlZglERUJVRworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Jfb3RnLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorCisvKiBUaGVzZSByb3V0aW5lcyBzaG91bGQgaGFuZGxlIHRoZSBzdGFuZGFyZCBjaGlwLXNwZWNpZmljIG1vZGVzCisgKiBmb3IgdXNiMC8xLzIgcG9ydHMsIGNvdmVyaW5nIGJhc2ljIG11eCBhbmQgdHJhbnNjZWl2ZXIgc2V0dXAuCisgKiBDYWxsIG9tYXBfdXNiX2luaXQoKSBvbmNlLCBmcm9tIElOSVRfTUFDSElORSgpLgorICoKKyAqIFNvbWUgYm9hcmQtKi5jIGZpbGVzIHdpbGwgbmVlZCB0byBzZXQgdXAgYWRkaXRpb25hbCBtdXggb3B0aW9ucywKKyAqIGxpa2UgZm9yIHN1c3BlbmQgaGFuZGxpbmcsIHZidXMgc2Vuc2luZywgR1BJT3MsIGFuZCB0aGUgRCsgcHVsbHVwLgorICovCisKKy8qIFRFU1RFRCBPTjoKKyAqICAtIDE2MTFCIEgyICh3aXRoIHVzYjEgbWluaS1BQikgdXNpbmcgc3RhbmRhcmQgTWluaS1CIG9yIE9URyBjYWJsZXMKKyAqICAtIDU5MTIgT1NLIE9IQ0kgKHdpdGggdXNiMCBzdGFuZGFyZC1BKSwgc3RhbmRhcmQgQS10by1CIGNhYmxlcworICogIC0gNTkxMiBPU0sgVURDLCB3aXRoICpub25zdGFuZGFyZCogQS10by1BIGNhYmxlCisgKiAgLSAxNTEwIElubm92YXRvciBVREMgd2l0aCBidW5kbGVkIHVzYjAgY2FibGUKKyAqICAtIDE1MTAgSW5ub3ZhdG9yIE9IQ0kgd2l0aCBidW5kbGVkIHVzYjEvdXNiMiBjYWJsZQorICogIC0gMTUxMCBJbm5vdmF0b3IgT0hDSSB3aXRoIGN1c3RvbSB1c2IwIGNhYmxlLCBmZWVkaW5nIDVWIFZCVVMKKyAqICAtIDE3MTAgY3VzdG9tIGRldmVsb3BtZW50IGJvYXJkIHVzaW5nIGFsdGVybmF0ZSBwaW4gZ3JvdXAKKyAqICAtIDE3MTAgSDMgKHdpdGggdXNiMSBtaW5pLUFCKSB1c2luZyBzdGFuZGFyZCBNaW5pLUIgb3IgT1RHIGNhYmxlcworICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQX09URworCitzdGF0aWMgc3RydWN0IG90Z190cmFuc2NlaXZlciAqeGNlaXY7CisKKy8qKgorICogb3RnX2dldF90cmFuc2NlaXZlciAtIGZpbmQgdGhlIChzaW5nbGUpIE9URyB0cmFuc2NlaXZlciBkcml2ZXIKKyAqCisgKiBSZXR1cm5zIHRoZSB0cmFuc2NlaXZlciBkcml2ZXIsIGFmdGVyIGdldHRpbmcgYSByZWZjb3VudCB0byBpdDsgb3IKKyAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCB0cmFuc2NlaXZlci4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKiByZWxlYXNpbmcgdGhhdCBjb3VudC4KKyAqLworc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnX2dldF90cmFuc2NlaXZlcih2b2lkKQoreworCWlmICh4Y2VpdikKKwkJZ2V0X2RldmljZSh4Y2Vpdi0+ZGV2KTsKKwlyZXR1cm4geGNlaXY7Cit9CitFWFBPUlRfU1lNQk9MKG90Z19nZXRfdHJhbnNjZWl2ZXIpOworCitpbnQgb3RnX3NldF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4KQoreworCWlmICh4Y2VpdiAmJiB4KQorCQlyZXR1cm4gLUVCVVNZOworCXhjZWl2ID0geDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob3RnX3NldF90cmFuc2NlaXZlcik7CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIF9faW5pdCBvbWFwX3VzYjBfaW5pdCh1bnNpZ25lZCBud2lyZXMsIHVuc2lnbmVkIGlzX2RldmljZSkKK3sKKwl1MzIJc3lzY29uMSA9IDA7CisKKwlpZiAobndpcmVzID09IDApIHsKKwkJaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkgeworCQkJLyogcHVsbGRvd24gRCsvRC0gKi8KKwkJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyAmPSB+KDMgPDwgMSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlzX2RldmljZSkKKwkJb21hcF9jZmdfcmVnKFc0X1VTQl9QVUVOKTsKKworCS8qIGludGVybmFsIHRyYW5zY2VpdmVyICovCisJaWYgKG53aXJlcyA9PSAyKSB7CisJCS8vIG9tYXBfY2ZnX3JlZyhQOV9VU0JfRFApOworCQkvLyBvbWFwX2NmZ19yZWcoUjhfVVNCX0RNKTsKKworCQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJCS8qIFRoaXMgd29ya3Mgb24gMTUxMC1Jbm5vdmF0b3IgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogTk9URVM6CisJCSAqICAtIHBlcmlwaGVyYWwgc2hvdWxkIGNvbmZpZ3VyZSBWQlVTIGRldGVjdGlvbiEKKwkJICogIC0gb25seSBwZXJpcGhlcmFscyBtYXkgdXNlIHRoZSBpbnRlcm5hbCBEKy9ELSBwdWxsZG93bnMKKwkJICogIC0gT1RHIHN1cHBvcnQgb24gdGhpcyBwb3J0IG5vdCB5ZXQgd3JpdHRlbgorCQkgKi8KKworCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgJj0gfig3IDw8IDQpOworCQlpZiAoIWlzX2RldmljZSkKKwkJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyB8PSAoMyA8PCAxKTsKKworCQlyZXR1cm4gMyA8PCAxNjsKKwl9CisKKwkvKiBhbHRlcm5hdGUgcGluIGNvbmZpZywgZXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KKwlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJubyB1c2IwIGFsdCBwaW4gY29uZmlnIG9uIDE1eHhcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlvbWFwX2NmZ19yZWcoVjZfVVNCMF9UWEQpOworCW9tYXBfY2ZnX3JlZyhXOV9VU0IwX1RYRU4pOworCW9tYXBfY2ZnX3JlZyhXNV9VU0IwX1NFMCk7CisKKwkvKiBOT1RFOiAgU1BFRUQgYW5kIFNVU1AgYXJlbid0IGNvbmZpZ3VyZWQgaGVyZSAqLworCisJaWYgKG53aXJlcyAhPSAzKQorCQlvbWFwX2NmZ19yZWcoWTVfVVNCMF9SQ1YpOworCWlmIChud2lyZXMgIT0gNikKKwkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHICY9IH5DT05GX1VTQjJfVU5JX1I7CisKKwlzd2l0Y2ggKG53aXJlcykgeworCWNhc2UgMzoKKwkJc3lzY29uMSA9IDI7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3lzY29uMSA9IDE7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc3lzY29uMSA9IDM7CisJCW9tYXBfY2ZnX3JlZyhBQTlfVVNCMF9WUCk7CisJCW9tYXBfY2ZnX3JlZyhSOV9VU0IwX1ZNKTsKKwkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHIHw9IENPTkZfVVNCMl9VTklfUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJpbGxlZ2FsIHVzYiVkICVkLXdpcmUgdHJhbnNjZWl2ZXJcbiIsCisJCQkwLCBud2lyZXMpOworCX0KKwlyZXR1cm4gc3lzY29uMSA8PCAxNjsKK30KKworc3RhdGljIHUzMiBfX2luaXQgb21hcF91c2IxX2luaXQodW5zaWduZWQgbndpcmVzKQoreworCXUzMglzeXNjb24xID0gMDsKKworCWlmIChud2lyZXMgIT0gNiAmJiAhY3B1X2lzX29tYXAxNXh4KCkpCisJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyAmPSB+Q09ORl9VU0IxX1VOSV9SOworCWlmIChud2lyZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBleHRlcm5hbCB0cmFuc2NlaXZlciAqLworCW9tYXBfY2ZnX3JlZyhVU0IxX1RYRCk7CisJb21hcF9jZmdfcmVnKFVTQjFfVFhFTik7CisJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCW9tYXBfY2ZnX3JlZyhVU0IxX1NFTyk7CisJCW9tYXBfY2ZnX3JlZyhVU0IxX1NQRUVEKTsKKwkJLy8gU1VTUAorCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXA1OTEyKCkpIHsKKwkJb21hcF9jZmdfcmVnKFcxM18xNjEwX1VTQjFfU0UwKTsKKwkJb21hcF9jZmdfcmVnKFIxM18xNjEwX1VTQjFfU1BFRUQpOworCQkvLyBTVVNQCisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE3MTAoKSkgeworCQlvbWFwX2NmZ19yZWcoUjEzXzE3MTBfVVNCMV9TRTApOworCQkvLyBTVVNQCisJfSBlbHNlIHsKKwkJcHJfZGVidWcoInVzYiB1bnJlY29nbml6ZWRcbiIpOworCX0KKwlpZiAobndpcmVzICE9IDMpCisJCW9tYXBfY2ZnX3JlZyhVU0IxX1JDVik7CisKKwlzd2l0Y2ggKG53aXJlcykgeworCWNhc2UgMzoKKwkJc3lzY29uMSA9IDI7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3lzY29uMSA9IDE7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc3lzY29uMSA9IDM7CisJCW9tYXBfY2ZnX3JlZyhVU0IxX1ZQKTsKKwkJb21hcF9jZmdfcmVnKFVTQjFfVk0pOworCQlpZiAoIWNwdV9pc19vbWFwMTV4eCgpKQorCQkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHIHw9IENPTkZfVVNCMV9VTklfUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJpbGxlZ2FsIHVzYiVkICVkLXdpcmUgdHJhbnNjZWl2ZXJcbiIsCisJCQkxLCBud2lyZXMpOworCX0KKwlyZXR1cm4gc3lzY29uMSA8PCAyMDsKK30KKworc3RhdGljIHUzMiBfX2luaXQgb21hcF91c2IyX2luaXQodW5zaWduZWQgbndpcmVzLCB1bnNpZ25lZCBhbHRfcGluZ3JvdXApCit7CisJdTMyCXN5c2NvbjEgPSAwOworCisJLyogTk9URSBlcnJhdHVtOiBtdXN0IGxlYXZlIFVTQjJfVU5JX1Igc2V0IGlmIHVzYjAgaW4gdXNlICovCisJaWYgKGFsdF9waW5ncm91cCB8fCBud2lyZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG53aXJlcyAhPSA2ICYmICFjcHVfaXNfb21hcDE1eHgoKSkKKwkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHICY9IH5DT05GX1VTQjJfVU5JX1I7CisKKwkvKiBleHRlcm5hbCB0cmFuc2NlaXZlciAqLworCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQlvbWFwX2NmZ19yZWcoVVNCMl9UWEQpOworCQlvbWFwX2NmZ19yZWcoVVNCMl9UWEVOKTsKKwkJb21hcF9jZmdfcmVnKFVTQjJfU0VPKTsKKwkJaWYgKG53aXJlcyAhPSAzKQorCQkJb21hcF9jZmdfcmVnKFVTQjJfUkNWKTsKKwkJLyogdGhlcmUgaXMgbm8gVVNCMl9TUEVFRCAqLworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJb21hcF9jZmdfcmVnKFY2X1VTQjJfVFhEKTsKKwkJb21hcF9jZmdfcmVnKFc5X1VTQjJfVFhFTik7CisJCW9tYXBfY2ZnX3JlZyhXNV9VU0IyX1NFMCk7CisJCWlmIChud2lyZXMgIT0gMykKKwkJCW9tYXBfY2ZnX3JlZyhZNV9VU0IyX1JDVik7CisJCS8vIEZJWE1FIG9tYXBfY2ZnX3JlZyhVU0IyX1NQRUVEKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygidXNiIHVucmVjb2duaXplZFxuIik7CisJfQorCS8vIG9tYXBfY2ZnX3JlZyhVU0IyX1NVU1ApOworCisJc3dpdGNoIChud2lyZXMpIHsKKwljYXNlIDM6CisJCXN5c2NvbjEgPSAyOworCQlicmVhazsKKwljYXNlIDQ6CisJCXN5c2NvbjEgPSAxOworCQlicmVhazsKKwljYXNlIDY6CisJCXN5c2NvbjEgPSAzOworCQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJCW9tYXBfY2ZnX3JlZyhVU0IyX1ZQKTsKKwkJCW9tYXBfY2ZnX3JlZyhVU0IyX1ZNKTsKKwkJfSBlbHNlIHsKKwkJCW9tYXBfY2ZnX3JlZyhBQTlfVVNCMl9WUCk7CisJCQlvbWFwX2NmZ19yZWcoUjlfVVNCMl9WTSk7CisJCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgfD0gQ09ORl9VU0IyX1VOSV9SOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiaWxsZWdhbCB1c2IlZCAlZC13aXJlIHRyYW5zY2VpdmVyXG4iLAorCQkJMiwgbndpcmVzKTsKKwl9CisJcmV0dXJuIHN5c2NvbjEgPDwgMjQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZglkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX09NQVApIHx8IFwKKwlkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpIHx8IFwKKwkoZGVmaW5lZChDT05GSUdfVVNCX09URykgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQX09URykpCitzdGF0aWMgdm9pZCB1c2JfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyogbm9ybWFsbHkgbm90IGZyZWVkICovCit9CisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX09NQVAKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1ZGNfcmVzb3VyY2VzW10gPSB7CisJLyogb3JkZXIgaXMgc2lnbmlmaWNhbnQhICovCisJewkJLyogcmVnaXN0ZXJzICovCisJCS5zdGFydAkJPSBJT19BRERSRVNTKFVEQ19CQVNFKSwKKwkJLmVuZAkJPSBJT19BRERSRVNTKFVEQ19CQVNFICsgMHhmZiksCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CQkvKiBnZW5lcmFsIElSUSAqLworCQkuc3RhcnQJCT0gSUgyX0JBU0UgKyAyMCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sIHsJCS8qIFBJTyBJUlEgKi8KKwkJLnN0YXJ0CQk9IElIMl9CQVNFICsgMzAsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LCB7CQkvKiBTT0YgSVJRICovCisJCS5zdGFydAkJPSBJSDJfQkFTRSArIDI5LAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyB1NjQgdWRjX2RtYW1hc2sgPSB+KHUzMikwOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1ZGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwX3VkYyIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5yZWxlYXNlCQk9IHVzYl9yZWxlYXNlLAorCQkuZG1hX21hc2sJCT0gJnVkY19kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVkY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVkY19yZXNvdXJjZXMsCit9OworCisjZW5kaWYKKworI2lmCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKKworLyogVGhlIGRtYW1hc2sgbXVzdCBiZSBzZXQgZm9yIE9IQ0kgdG8gd29yayAqLworc3RhdGljIHU2NCBvaGNpX2RtYW1hc2sgPSB+KHUzMikwOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG9oY2lfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBPTUFQX09IQ0lfQkFTRSwKKwkJLmVuZAk9IE9NQVBfT0hDSV9CQVNFICsgNDA5NiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IElOVF9VU0JfSEhDXzEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvaGNpX2RldmljZSA9IHsKKwkubmFtZQkJCT0gIm9oY2kiLAorCS5pZAkJCT0gLTEsCisJLmRldiA9IHsKKwkJLnJlbGVhc2UJCT0gdXNiX3JlbGVhc2UsCisJCS5kbWFfbWFzawkJPSAmb2hjaV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG9oY2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJCT0gb2hjaV9yZXNvdXJjZXMsCit9OworCisjZW5kaWYKKworI2lmCWRlZmluZWQoQ09ORklHX1VTQl9PVEcpICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUF9PVEcpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3RnX3Jlc291cmNlc1tdID0geworCS8qIG9yZGVyIGlzIHNpZ25pZmljYW50ISAqLworCXsKKwkJLnN0YXJ0CQk9IElPX0FERFJFU1MoT1RHX0JBU0UpLAorCQkuZW5kCQk9IElPX0FERFJFU1MoT1RHX0JBU0UgKyAweGZmKSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0CQk9IElIMl9CQVNFICsgOCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvdGdfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwX290ZyIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5yZWxlYXNlCQk9IHVzYl9yZWxlYXNlLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG90Z19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG90Z19yZXNvdXJjZXMsCit9OworCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBVTFBEX0NMT0NLX0NUUkxfUkVHCV9fUkVHMTYoVUxQRF9DTE9DS19DVFJMKQorI2RlZmluZSBVTFBEX1NPRlRfUkVRX1JFRwlfX1JFRzE2KFVMUERfU09GVF9SRVEpCisKKworLy8gRklYTUUgY29ycmVjdCBhbnN3ZXIgZGVwZW5kcyBvbiBobWNfbW9kZSwKKy8vIGFzIGRvZXMgYW55IG5vbnplcm8gdmFsdWUgZm9yIGNvbmZpZy0+b3RnIHBvcnQgbnVtYmVyCisjaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfT01BUAorI2RlZmluZQlpc191c2IwX2RldmljZShjb25maWcpCTEKKyNlbHNlCisjZGVmaW5lCWlzX3VzYjBfZGV2aWNlKGNvbmZpZykJMAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQX09URworCit2b2lkIF9faW5pdAorb21hcF9vdGdfaW5pdChzdHJ1Y3Qgb21hcF91c2JfY29uZmlnICpjb25maWcpCit7CisJdTMyCQlzeXNjb24gPSBPVEdfU1lTQ09OXzFfUkVHICYgMHhmZmZmOworCWludAkJc3RhdHVzOworCWludAkJYWx0X3Bpbmdyb3VwID0gMDsKKworCS8qIE5PVEU6ICBubyBidXMgb3IgY2xvY2sgc2V0dXAgKHlldD8pICovCisKKwlzeXNjb24gPSBPVEdfU1lTQ09OXzFfUkVHICYgMHhmZmZmOworCWlmICghKHN5c2NvbiAmIE9UR19SRVNFVF9ET05FKSkKKwkJcHJfZGVidWcoIlVTQiByZXNldHMgbm90IGNvbXBsZXRlP1xuIik7CisKKwkvLyBPVEdfSVJRX0VOX1JFRyA9IDA7CisKKwkvKiBwaW4gbXV4aW5nIGFuZCB0cmFuc2NlaXZlciBwaW5vdXRzICovCisJaWYgKGNvbmZpZy0+cGluc1swXSA+IDIpCS8qIGFsdCBwaW5ncm91cCAyICovCisJCWFsdF9waW5ncm91cCA9IDE7CisJc3lzY29uIHw9IG9tYXBfdXNiMF9pbml0KGNvbmZpZy0+cGluc1swXSwgaXNfdXNiMF9kZXZpY2UoY29uZmlnKSk7CisJc3lzY29uIHw9IG9tYXBfdXNiMV9pbml0KGNvbmZpZy0+cGluc1sxXSk7CisJc3lzY29uIHw9IG9tYXBfdXNiMl9pbml0KGNvbmZpZy0+cGluc1syXSwgYWx0X3Bpbmdyb3VwKTsKKwlwcl9kZWJ1ZygiT1RHX1NZU0NPTl8xX1JFRyA9ICUwOHhcbiIsIHN5c2Nvbik7CisJT1RHX1NZU0NPTl8xX1JFRyA9IHN5c2NvbjsKKworCXN5c2NvbiA9IGNvbmZpZy0+aG1jX21vZGU7CisJc3lzY29uIHw9IFVTQlhfU1lOQ0hSTyB8ICg0IDw8IDE2KSAvKiBCX0FTRTBfQlJTVCAqLzsKKyNpZmRlZglDT05GSUdfVVNCX09URworCWlmIChjb25maWctPm90ZykKKwkJc3lzY29uIHw9IE9UR19FTjsKKyNlbmRpZgorCXByX2RlYnVnKCJVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgPSAlMDN4XG4iLCBVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcpOworCXByX2RlYnVnKCJPVEdfU1lTQ09OXzJfUkVHID0gJTA4eFxuIiwgc3lzY29uKTsKKwlPVEdfU1lTQ09OXzJfUkVHID0gc3lzY29uOworCisJcHJpbnRrKCJVU0I6IGhtYyAlZCIsIGNvbmZpZy0+aG1jX21vZGUpOworCWlmIChhbHRfcGluZ3JvdXApCisJCXByaW50aygiLCB1c2IyIGFsdCAlZCB3aXJlcyIsIGNvbmZpZy0+cGluc1syXSk7CisJZWxzZSBpZiAoY29uZmlnLT5waW5zWzBdKQorCQlwcmludGsoIiwgdXNiMCAlZCB3aXJlcyVzIiwgY29uZmlnLT5waW5zWzBdLAorCQkJaXNfdXNiMF9kZXZpY2UoY29uZmlnKSA/ICIgKGRldikiIDogIiIpOworCWlmIChjb25maWctPnBpbnNbMV0pCisJCXByaW50aygiLCB1c2IxICVkIHdpcmVzIiwgY29uZmlnLT5waW5zWzFdKTsKKwlpZiAoIWFsdF9waW5ncm91cCAmJiBjb25maWctPnBpbnNbMl0pCisJCXByaW50aygiLCB1c2IyICVkIHdpcmVzIiwgY29uZmlnLT5waW5zWzJdKTsKKwlpZiAoY29uZmlnLT5vdGcpCisJCXByaW50aygiLCBNaW5pLUFCIG9uIHVzYiVkIiwgY29uZmlnLT5vdGcgLSAxKTsKKwlwcmludGsoIlxuIik7CisKKwkvKiBsZWF2ZSBVU0IgY2xvY2tzL2NvbnRyb2xsZXJzIG9mZiB1bnRpbCBuZWVkZWQgKi8KKwlVTFBEX1NPRlRfUkVRX1JFRyAmPSB+U09GVF9VU0JfQ0xLX1JFUTsKKwlVTFBEX0NMT0NLX0NUUkxfUkVHICY9IH5VU0JfTUNMS19FTjsKKwlVTFBEX0NMT0NLX0NUUkxfUkVHIHw9IERJU19VU0JfUFZDSV9DTEs7CisJc3lzY29uID0gT1RHX1NZU0NPTl8xX1JFRzsKKwlzeXNjb24gfD0gSFNUX0lETEVfRU58REVWX0lETEVfRU58T1RHX0lETEVfRU47CisKKyNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCisJaWYgKGNvbmZpZy0+b3RnIHx8IGNvbmZpZy0+cmVnaXN0ZXJfZGV2KSB7CisJCXN5c2NvbiAmPSB+REVWX0lETEVfRU47CisJCXVkY19kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBjb25maWc7CisJCS8qIEZJWE1FIHBhdGNoIElSUSBudW1iZXJzIGZvciBvbWFwNzMwICovCisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdWRjX2RldmljZSk7CisJCWlmIChzdGF0dXMpCisJCQlwcl9kZWJ1ZygiY2FuJ3QgcmVnaXN0ZXIgVURDIGRldmljZSwgJWRcbiIsIHN0YXR1cyk7CisJfQorI2VuZGlmCisKKyNpZglkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCisJaWYgKGNvbmZpZy0+b3RnIHx8IGNvbmZpZy0+cmVnaXN0ZXJfaG9zdCkgeworCQlzeXNjb24gJj0gfkhTVF9JRExFX0VOOworCQlvaGNpX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IGNvbmZpZzsKKwkJaWYgKGNwdV9pc19vbWFwNzMwKCkpCisJCQlvaGNpX3Jlc291cmNlc1sxXS5zdGFydCA9IElOVF83MzBfVVNCX0hIQ18xOworCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9oY2lfZGV2aWNlKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2RlYnVnKCJjYW4ndCByZWdpc3RlciBPSENJIGRldmljZSwgJWRcbiIsIHN0YXR1cyk7CisJfQorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX09URworCWlmIChjb25maWctPm90ZykgeworCQlzeXNjb24gJj0gfk9UR19JRExFX0VOOworCQlvdGdfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gY29uZmlnOworCQlpZiAoY3B1X2lzX29tYXA3MzAoKSkKKwkJCW90Z19yZXNvdXJjZXNbMV0uc3RhcnQgPSBJTlRfNzMwX1VTQl9PVEc7CisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb3RnX2RldmljZSk7CisJCWlmIChzdGF0dXMpCisJCQlwcl9kZWJ1ZygiY2FuJ3QgcmVnaXN0ZXIgT1RHIGRldmljZSwgJWRcbiIsIHN0YXR1cyk7CisJfQorI2VuZGlmCisJcHJfZGVidWcoIk9UR19TWVNDT05fMV9SRUcgPSAlMDh4XG4iLCBzeXNjb24pOworCU9UR19TWVNDT05fMV9SRUcgPSBzeXNjb247CisKKwlzdGF0dXMgPSAwOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfb3RnX2luaXQoc3RydWN0IG9tYXBfdXNiX2NvbmZpZyAqY29uZmlnKSB7fQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQMTUxMAorCisjZGVmaW5lIFVMUERfRFBMTF9DVFJMX1JFRwlfX1JFRzE2KFVMUERfRFBMTF9DVFJMKQorI2RlZmluZSBEUExMX0lPQgkJKDEgPDwgMTMpCisjZGVmaW5lIERQTExfUExMX0VOQUJMRQkJKDEgPDwgNCkKKyNkZWZpbmUgRFBMTF9MT0NLCQkoMSA8PCAwKQorCisjZGVmaW5lIFVMUERfQVBMTF9DVFJMX1JFRwlfX1JFRzE2KFVMUERfQVBMTF9DVFJMKQorI2RlZmluZSBBUExMX05EUExMX1NXSVRDSAkoMSA8PCAwKQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwXzE1MTBfdXNiX2luaXQoc3RydWN0IG9tYXBfdXNiX2NvbmZpZyAqY29uZmlnKQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHZhbDsKKworCW9tYXBfdXNiMF9pbml0KGNvbmZpZy0+cGluc1swXSwgaXNfdXNiMF9kZXZpY2UoY29uZmlnKSk7CisJb21hcF91c2IxX2luaXQoY29uZmlnLT5waW5zWzFdKTsKKwlvbWFwX3VzYjJfaW5pdChjb25maWctPnBpbnNbMl0sIDApOworCisJdmFsID0gb21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzApICYgfigweDNmIDw8IDEpOworCXZhbCB8PSAoY29uZmlnLT5obWNfbW9kZSA8PCAxKTsKKwlvbWFwX3dyaXRlbCh2YWwsIE1PRF9DT05GX0NUUkxfMCk7CisKKwlwcmludGsoIlVTQjogaG1jICVkIiwgY29uZmlnLT5obWNfbW9kZSk7CisJaWYgKGNvbmZpZy0+cGluc1swXSkKKwkJcHJpbnRrKCIsIHVzYjAgJWQgd2lyZXMlcyIsIGNvbmZpZy0+cGluc1swXSwKKwkJCWlzX3VzYjBfZGV2aWNlKGNvbmZpZykgPyAiIChkZXYpIiA6ICIiKTsKKwlpZiAoY29uZmlnLT5waW5zWzFdKQorCQlwcmludGsoIiwgdXNiMSAlZCB3aXJlcyIsIGNvbmZpZy0+cGluc1sxXSk7CisJaWYgKGNvbmZpZy0+cGluc1syXSkKKwkJcHJpbnRrKCIsIHVzYjIgJWQgd2lyZXMiLCBjb25maWctPnBpbnNbMl0pOworCXByaW50aygiXG4iKTsKKworCS8qIHVzZSBEUExMIGZvciA0OCBNSHogZnVuY3Rpb24gY2xvY2sgKi8KKwlwcl9kZWJ1ZygiQVBMTCAlMDR4IERQTEwgJTA0eCBSRVEgJTA0eFxuIiwgVUxQRF9BUExMX0NUUkxfUkVHLAorCQkJVUxQRF9EUExMX0NUUkxfUkVHLCBVTFBEX1NPRlRfUkVRX1JFRyk7CisJVUxQRF9BUExMX0NUUkxfUkVHICY9IH5BUExMX05EUExMX1NXSVRDSDsKKwlVTFBEX0RQTExfQ1RSTF9SRUcgfD0gRFBMTF9JT0IgfCBEUExMX1BMTF9FTkFCTEU7CisJVUxQRF9TT0ZUX1JFUV9SRUcgfD0gU09GVF9VRENfUkVRIHwgU09GVF9EUExMX1JFUTsKKwl3aGlsZSAoIShVTFBEX0RQTExfQ1RSTF9SRUcgJiBEUExMX0xPQ0spKQorCQljcHVfcmVsYXgoKTsKKworI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX09NQVAKKwlpZiAoY29uZmlnLT5yZWdpc3Rlcl9kZXYpIHsKKwkJdWRjX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IGNvbmZpZzsKKwkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ1ZGNfZGV2aWNlKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2RlYnVnKCJjYW4ndCByZWdpc3RlciBVREMgZGV2aWNlLCAlZFxuIiwgc3RhdHVzKTsKKwkJLyogdWRjIGRyaXZlciBnYXRlcyA0OE1IeiBieSBEKyBwdWxsdXAgKi8KKwl9CisjZW5kaWYKKworI2lmCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKKwlpZiAoY29uZmlnLT5yZWdpc3Rlcl9ob3N0KSB7CisJCW9oY2lfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gY29uZmlnOworCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9oY2lfZGV2aWNlKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2RlYnVnKCJjYW4ndCByZWdpc3RlciBPSENJIGRldmljZSwgJWRcbiIsIHN0YXR1cyk7CisJCS8qIGhjZCBleHBsaWNpdGx5IGdhdGVzIDQ4TUh6ICovCisJfQorI2VuZGlmCit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF8xNTEwX3VzYl9pbml0KHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZykge30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBwbGF0Zm9ybV9kYXRhOworCitzdGF0aWMgaW50IF9faW5pdAorb21hcF91c2JfaW5pdCh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZzsKKworCWNvbmZpZyA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19VU0IsIHN0cnVjdCBvbWFwX3VzYl9jb25maWcpOworCWlmIChjb25maWcgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVTQjogTm8gYm9hcmQtc3BlY2lmaWMgIgorCQkJCSJwbGF0Zm9ybSBjb25maWcgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcGxhdGZvcm1fZGF0YSA9ICpjb25maWc7CisKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkKKwkJb21hcF9vdGdfaW5pdCgmcGxhdGZvcm1fZGF0YSk7CisJZWxzZSBpZiAoY3B1X2lzX29tYXAxNXh4KCkpCisJCW9tYXBfMTUxMF91c2JfaW5pdCgmcGxhdGZvcm1fZGF0YSk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiVVNCOiBObyBpbml0IGZvciB5b3VyIGNoaXAgeWV0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwob21hcF91c2JfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVhNTVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwpAQCAtMCwwICsxLDc3IEBACitpZiBBUkNIX1BYQQorCittZW51ICJJbnRlbCBQWEEyeHggSW1wbGVtZW50YXRpb25zIgorCitjaG9pY2UKKwlwcm9tcHQgIlNlbGVjdCB0YXJnZXQgYm9hcmQiCisKK2NvbmZpZyBBUkNIX0xVQkJPQ0sKKwlib29sICJJbnRlbCBEQlBYQTI1MCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIKKwlzZWxlY3QgUFhBMjV4CisJc2VsZWN0IFNBMTExMQorCitjb25maWcgTUFDSF9NQUlOU1RPTkUKKwlib29sICJJbnRlbCBIQ0REQkJWQTAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iCisJc2VsZWN0IFBYQTI3eAorCXNlbGVjdCBJV01NWFQKKworY29uZmlnIEFSQ0hfUFhBX0lEUAorCWJvb2wgIkFjY2VsZW50IFhzY2FsZSBJRFAiCisJc2VsZWN0IFBYQTI1eAorCitjb25maWcgUFhBX1NIQVJQU0wKKwlib29sICJTSEFSUCBTTC01NjAwIGFuZCBTTC1DN3h4IE1vZGVscyIKKwlzZWxlY3QgUFhBMjV4CisJc2VsZWN0IFNIQVJQX1NDT09QCisJc2VsZWN0IFNIQVJQX1BBUkFNCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhCisJICBTaGFycCBTTC01NjAwIChQb29kbGUpLCBTaGFycCBTTC1DNzAwIChDb3JnaSksCisJICBTTC1DNzUwIChTaGVwaGVyZCkgb3IgYSBTaGFycCBTTC1DNzYwIChIdXNreSkKKwkgIGhhbmRoZWxkIGNvbXB1dGVyLgorCitlbmRjaG9pY2UKKworZW5kbWVudQorCitjb25maWcgTUFDSF9QT09ETEUKKwlib29sICJFbmFibGUgU2hhcnAgU0wtNTYwMCAoUG9vZGxlKSBTdXBwb3J0IgorCWRlcGVuZHMgUFhBX1NIQVJQU0wKKwlzZWxlY3QgU0hBUlBfTE9DT01PCisKK2NvbmZpZyBNQUNIX0NPUkdJCisJYm9vbCAiRW5hYmxlIFNoYXJwIFNMLUM3MDAgKENvcmdpKSBTdXBwb3J0IgorCWRlcGVuZHMgUFhBX1NIQVJQU0wKKwlzZWxlY3QgUFhBX1NIQVJQX0M3eHgKKworY29uZmlnIE1BQ0hfU0hFUEhFUkQKKwlib29sICJFbmFibGUgU2hhcnAgU0wtQzc1MCAoU2hlcGhlcmQpIFN1cHBvcnQiCisJZGVwZW5kcyBQWEFfU0hBUlBTTAorCXNlbGVjdCBQWEFfU0hBUlBfQzd4eAorCitjb25maWcgTUFDSF9IVVNLWQorCWJvb2wgIkVuYWJsZSBTaGFycCBTTC1DNzYwIChIdXNreSkgU3VwcG9ydCIKKwlkZXBlbmRzIFBYQV9TSEFSUFNMCisJc2VsZWN0IFBYQV9TSEFSUF9DN3h4CisKK2NvbmZpZyBQWEEyNXgKKwlib29sCisJaGVscAorCSAgU2VsZWN0IGNvZGUgc3BlY2lmaWMgdG8gUFhBMjF4LzI1eC8yNnggdmFyaWFudHMKKworY29uZmlnIFBYQTI3eAorCWJvb2wKKwloZWxwCisJICBTZWxlY3QgY29kZSBzcGVjaWZpYyB0byBQWEEyN3ggdmFyaWFudHMKKworY29uZmlnIElXTU1YVAorCWJvb2wKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgaVdNTVh0CisKK2NvbmZpZyBQWEFfU0hBUlBfQzd4eAorCWJvb2wKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgYWxsIFNoYXJwIEM3eHggbW9kZWxzCisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTZkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQpAQCAtMCwwICsxLDI2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCisjIENvbW1vbiBzdXBwb3J0IChtdXN0IGJlIGxpbmtlZCBiZWZvcmUgYm9hcmQgc3BlY2lmaWMgc3VwcG9ydCkKK29iai15ICs9IGdlbmVyaWMubyBpcnEubyBkbWEubyB0aW1lLm8KK29iai0kKENPTkZJR19QWEEyNXgpICs9IHB4YTI1eC5vCitvYmotJChDT05GSUdfUFhBMjd4KSArPSBweGEyN3gubworCisjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKK29iai0kKENPTkZJR19BUkNIX0xVQkJPQ0spICs9IGx1YmJvY2subworb2JqLSQoQ09ORklHX01BQ0hfTUFJTlNUT05FKSArPSBtYWluc3RvbmUubworb2JqLSQoQ09ORklHX0FSQ0hfUFhBX0lEUCkgKz0gaWRwLm8KK29iai0kKENPTkZJR19QWEFfU0hBUlBfQzd4eCkJKz0gY29yZ2kubyBjb3JnaV9zc3AubyBzc3Aubworb2JqLSQoQ09ORklHX01BQ0hfUE9PRExFKQkrPSBwb29kbGUubworCisjIFN1cHBvcnQgZm9yIGJsaW5reSBsaWdodHMKK2xlZC15IDo9IGxlZHMubworbGVkLSQoQ09ORklHX0FSQ0hfTFVCQk9DSykgKz0gbGVkcy1sdWJib2NrLm8KK2xlZC0kKENPTkZJR19NQUNIX01BSU5TVE9ORSkgKz0gbGVkcy1tYWluc3RvbmUubworbGVkLSQoQ09ORklHX0FSQ0hfUFhBX0lEUCkgKz0gbGVkcy1pZHAubworCitvYmotJChDT05GSUdfTEVEUykgKz0gJChsZWQteSkKKworIyBNaXNjIGZlYXR1cmVzCitvYmotJChDT05GSUdfUE0pICs9IHBtLm8gc2xlZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhZDY3MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSwyIEBACisgICB6cmVsYWRkci15CTo9IDB4YTAwMDgwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5MWNmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBTdXBwb3J0IGZvciBTaGFycCBTTC1DN3h4IFBEQXMKKyAqIE1vZGVsczogU0wtQzcwMCAoQ29yZ2kpLCBTTC1DNzUwIChTaGVwaGVyZCksIFNMLUM3NjAgKEh1c2t5KQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFJpY2hhcmQgUHVyZGllCisgKgorICogQmFzZWQgb24gU2hhcnAncyAyLjQga2VybmVsIHBhdGNoZXMvbHViYm9jay5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbW1jLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdWRjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY29yZ2kuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3NoYXJwc2xfcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2Nvb3AuaD4KKyNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworCisvKgorICogQ29yZ2kgU0NPT1AgRGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29yZ2lfc2Nvb3BfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJCT0gMHgxMDgwMDAwMCwKKwkJLmVuZAkJPSAweDEwODAwZmZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Nvb3BfY29uZmlnIGNvcmdpX3Njb29wX3NldHVwID0geworCS5pb19kaXIgCT0gQ09SR0lfU0NPT1BfSU9fRElSLAorCS5pb19vdXQJCT0gQ09SR0lfU0NPT1BfSU9fT1VULAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaXNjb29wX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hhcnAtc2Nvb3AiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKyAJCS5wbGF0Zm9ybV9kYXRhCT0gJmNvcmdpX3Njb29wX3NldHVwLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvcmdpX3Njb29wX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY29yZ2lfc2Nvb3BfcmVzb3VyY2VzLAorfTsKKworCisvKgorICogQ29yZ2kgU1NQIERldmljZQorICoKKyAqIFNldCB0aGUgcGFyZW50IGFzIHRoZSBzY29vcCBkZXZpY2UgYmVjYXVzZSBhIGxvdCBvZiBTU1AgZGV2aWNlcworICogYWxzbyB1c2Ugc2Nvb3AgZnVuY3Rpb25zIGFuZCB0aGlzIG1ha2VzIHRoZSBwb3dlciB1cC9kb3duIG9yZGVyCisgKiB3b3JrIGNvcnJlY3RseS4KKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lzc3BfZGV2aWNlID0geworCS5uYW1lCQk9ICJjb3JnaS1zc3AiLAorCS5kZXYJCT0geworIAkJLnBhcmVudCA9ICZjb3JnaXNjb29wX2RldmljZS5kZXYsCisJfSwKKwkuaWQJCT0gLTEsCit9OworCisKKy8qCisgKiBDb3JnaSB3MTAwIEZyYW1lIEJ1ZmZlciBEZXZpY2UKKyAqLworc3RhdGljIHN0cnVjdCB3MTAwZmJfbWFjaF9pbmZvIGNvcmdpX2ZiX2luZm8gPSB7CisJLncxMDBmYl9zc3Bfc2VuZCAJPSBjb3JnaV9zc3BfbGNkdGdfc2VuZCwKKwkuY29tYWRqIAkJCT0gLTEsCisJLnBoYWRhZGogCQkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29yZ2lfZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJCT0gMHgwODAwMDAwMCwKKwkJLmVuZAkJPSAweDA4ZmZmZmZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpZmJfZGV2aWNlID0geworCS5uYW1lCQk9ICJ3MTAwZmIiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKyAJCS5wbGF0Zm9ybV9kYXRhCT0gJmNvcmdpX2ZiX2luZm8sCisgCQkucGFyZW50ID0gJmNvcmdpc3NwX2RldmljZS5kZXYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY29yZ2lfZmJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBjb3JnaV9mYl9yZXNvdXJjZXMsCit9OworCisKKy8qCisgKiBDb3JnaSBCYWNrbGlnaHQgRGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpYmxfZGV2aWNlID0geworCS5uYW1lCQk9ICJjb3JnaS1ibCIsCisJLmRldgkJPSB7CisgCQkucGFyZW50ID0gJmNvcmdpZmJfZGV2aWNlLmRldiwKKwl9LAorCS5pZAkJPSAtMSwKK307CisKKworLyoKKyAqIE1NQy9TRCBEZXZpY2UKKyAqCisgKiBUaGUgY2FyZCBkZXRlY3QgaW50ZXJydXB0IGlzbid0IGRlYm91bmNlZCBzbyB3ZSBkZWxheSBpdCBieSBIWi80CisgKiB0byBnaXZlIHRoZSBjYXJkIGEgY2hhbmNlIHRvIGZ1bGx5IGluc2VydC9lamVjdC4KKyAqLworc3RhdGljIHN0cnVjdCBtbWNfZGV0ZWN0IHsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBkZXRlY3RfdGltZXI7CisJdm9pZCAqZGV2aWQ7Cit9IG1tY19kZXRlY3Q7CisKK3N0YXRpYyB2b2lkIG1tY19kZXRlY3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCW1tY19kZXRlY3RfY2hhbmdlKG1tY19kZXRlY3QuZGV2aWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgY29yZ2lfbW1jX2RldGVjdF9pbnQoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCW1tY19kZXRlY3QuZGV2aWQ9ZGV2aWQ7CisJbW9kX3RpbWVyKCZtbWNfZGV0ZWN0LmRldGVjdF90aW1lciwgamlmZmllcyArIEhaLzQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBjb3JnaV9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycXJldHVybl90ICgqdW51c2VkX2RldGVjdF9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyOworCisJLyogc2V0dXAgR1BJTyBmb3IgUFhBMjV4IE1NQyBjb250cm9sbGVyCSovCisJcHhhX2dwaW9fbW9kZShHUElPNl9NTUNDTEtfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzhfTU1DQ1MwX01EKTsKKwlweGFfZ3Bpb19tb2RlKENPUkdJX0dQSU9fblNEX0RFVEVDVCB8IEdQSU9fSU4pOworCXB4YV9ncGlvX21vZGUoQ09SR0lfR1BJT19TRF9QV1IgfCBHUElPX09VVCk7CisKKwlpbml0X3RpbWVyKCZtbWNfZGV0ZWN0LmRldGVjdF90aW1lcik7CisJbW1jX2RldGVjdC5kZXRlY3RfdGltZXIuZnVuY3Rpb24gPSBtbWNfZGV0ZWN0X2NhbGxiYWNrOworCW1tY19kZXRlY3QuZGV0ZWN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgJm1tY19kZXRlY3Q7CisKKwllcnIgPSByZXF1ZXN0X2lycShDT1JHSV9JUlFfR1BJT19uU0RfREVURUNULCBjb3JnaV9tbWNfZGV0ZWN0X2ludCwgU0FfSU5URVJSVVBULAorCQkJICAgICAiTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImNvcmdpX21jaV9pbml0OiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzZXRfaXJxX3R5cGUoQ09SR0lfSVJRX0dQSU9fblNEX0RFVEVDVCwgSVJRVF9CT1RIRURHRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29yZ2lfbWNpX3NldHBvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZkZCkKK3sKKwlzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEqIHBfZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlmICgoIDEgPDwgdmRkKSAmIHBfZC0+b2NyX21hc2spIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJR1BTUjEgPSBHUElPX2JpdChDT1JHSV9HUElPX1NEX1BXUik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvZmZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUdQQ1IxID0gR1BJT19iaXQoQ09SR0lfR1BJT19TRF9QV1IpOworCX0KK30KKworc3RhdGljIHZvaWQgY29yZ2lfbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWZyZWVfaXJxKENPUkdJX0lSUV9HUElPX25TRF9ERVRFQ1QsIGRhdGEpOworCWRlbF90aW1lcigmbW1jX2RldGVjdC5kZXRlY3RfdGltZXIpOworfQorCitzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIGNvcmdpX21jaV9wbGF0Zm9ybV9kYXRhID0geworCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuaW5pdCAJCT0gY29yZ2lfbWNpX2luaXQsCisJLnNldHBvd2VyIAk9IGNvcmdpX21jaV9zZXRwb3dlciwKKwkuZXhpdAkJPSBjb3JnaV9tY2lfZXhpdCwKK307CisKKworLyoKKyAqIFVTQiBEZXZpY2UgQ29udHJvbGxlcgorICovCitzdGF0aWMgdm9pZCBjb3JnaV91ZGNfY29tbWFuZChpbnQgY21kKQoreworCXN3aXRjaChjbWQpCXsKKwljYXNlIFBYQTJYWF9VRENfQ01EX0NPTk5FQ1Q6CisJCUdQU1IoQ09SR0lfR1BJT19VU0JfUFVMTFVQKSA9IEdQSU9fYml0KENPUkdJX0dQSU9fVVNCX1BVTExVUCk7CisJCWJyZWFrOworCWNhc2UgUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVDoKKwkJR1BDUihDT1JHSV9HUElPX1VTQl9QVUxMVVApID0gR1BJT19iaXQoQ09SR0lfR1BJT19VU0JfUFVMTFVQKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIHVkY19pbmZvIF9faW5pdGRhdGEgPSB7CisJLyogbm8gY29ubmVjdCBHUElPOyBjb3JnaSBjYW4ndCB0ZWxsIGNvbm5lY3Rpb24gc3RhdHVzICovCisJLnVkY19jb21tYW5kCQk9IGNvcmdpX3VkY19jb21tYW5kLAorfTsKKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmNvcmdpc2Nvb3BfZGV2aWNlLAorCSZjb3JnaXNzcF9kZXZpY2UsCisJJmNvcmdpZmJfZGV2aWNlLAorCSZjb3JnaWJsX2RldmljZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb3JnaV9pbml0KHZvaWQpCit7CisJY29yZ2lfZmJfaW5mby5jb21hZGo9c2hhcnBzbF9wYXJhbS5jb21hZGo7CisJY29yZ2lfZmJfaW5mby5waGFkYWRqPXNoYXJwc2xfcGFyYW0ucGhhZGFkajsKKworCXB4YV9ncGlvX21vZGUoQ09SR0lfR1BJT19VU0JfUFVMTFVQIHwgR1BJT19PVVQpOworIAlweGFfc2V0X3VkY19pbmZvKCZ1ZGNfaW5mbyk7CisJcHhhX3NldF9tY2lfaW5mbygmY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBmaXh1cF9jb3JnaShzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLAorCQlzdHJ1Y3QgdGFnICp0YWdzLCBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCXNoYXJwc2xfc2F2ZV9wYXJhbSgpOworCW1pLT5ucl9iYW5rcz0xOworCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHhhMDAwMDAwMDsKKwltaS0+YmFua1swXS5ub2RlID0gMDsKKwlpZiAobWFjaGluZV9pc19jb3JnaSgpKQorCQltaS0+YmFua1swXS5zaXplID0gKDMyKjEwMjQqMTAyNCk7CisJZWxzZQorCQltaS0+YmFua1swXS5zaXplID0gKDY0KjEwMjQqMTAyNCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb3JnaV9pbml0X2lycSh2b2lkKQoreworCXB4YV9pbml0X2lycSgpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGNvcmdpX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworLyogICAgdmlydHVhbCAgICAgcGh5c2ljYWwgICAgbGVuZ3RoICAgICAgKi8KKy8qCXsgMHhmMTAwMDAwMCwgMHgwODAwMDAwMCwgMHgwMTAwMDAwMCwgTVRfREVWSUNFIH0sKi8gLyogTENEQyAocmVhZGFibGUgZm9yIFF0IGRyaXZlcikgKi8KKy8qCXsgMHhlZjcwMDAwMCwgMHgxMDgwMDAwMCwgMHgwMDAwMTAwMCwgTVRfREVWSUNFIH0sKi8gIC8qIFNDT09QICovCisJeyAweGVmODAwMDAwLCAweDAwMDAwMDAwLCAweDAwODAwMDAwLCBNVF9ERVZJQ0UgfSwgLyogQm9vdCBGbGFzaCAqLworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNvcmdpX21hcF9pbyh2b2lkKQoreworCXB4YV9tYXBfaW8oKTsKKwlpb3RhYmxlX2luaXQoY29yZ2lfaW9fZGVzYyxBUlJBWV9TSVpFKGNvcmdpX2lvX2Rlc2MpKTsKKworCS8qIHNldHVwIHNsZWVwIG1vZGUgdmFsdWVzICovCisJUFdFUiAgPSAweDAwMDAwMDAyOworCVBGRVIgID0gMHgwMDAwMDAwMDsKKwlQUkVSICA9IDB4MDAwMDAwMDI7CisJUEdTUjAgPSAweDAxNThDMDAwOworCVBHU1IxID0gMHgwMEZGMDA4MDsKKwlQR1NSMiA9IDB4MDAwMUMwMDQ7CisJLyogU3RvcCAzLjZNSHogYW5kIGRyaXZlIEhJR0ggdG8gUENNQ0lBIGFuZCBDUyAqLworCVBDRlIgfD0gUENGUl9PUERFOworfQorCisjaWZkZWYgQ09ORklHX01BQ0hfQ09SR0kKK01BQ0hJTkVfU1RBUlQoQ09SR0ksICJTSEFSUCBDb3JnaSIpCisJQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQorCUZJWFVQKGZpeHVwX2NvcmdpKQorCU1BUElPKGNvcmdpX21hcF9pbykKKwlJTklUSVJRKGNvcmdpX2luaXRfaXJxKQorCS5pbml0X21hY2hpbmUgPSBjb3JnaV9pbml0LAorCS50aW1lciA9ICZweGFfdGltZXIsCitNQUNISU5FX0VORAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9TSEVQSEVSRAorTUFDSElORV9TVEFSVChTSEVQSEVSRCwgIlNIQVJQIFNoZXBoZXJkIikKKwlCT09UX01FTSgweGEwMDAwMDAwLCAweDQwMDAwMDAwLCBpb19wMnYoMHg0MDAwMDAwMCkpCisJRklYVVAoZml4dXBfY29yZ2kpCisJTUFQSU8oY29yZ2lfbWFwX2lvKQorCUlOSVRJUlEoY29yZ2lfaW5pdF9pcnEpCisJLmluaXRfbWFjaGluZSA9IGNvcmdpX2luaXQsCisJLnRpbWVyID0gJnB4YV90aW1lciwKK01BQ0hJTkVfRU5ECisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX0hVU0tZCitNQUNISU5FX1NUQVJUKEhVU0tZLCAiU0hBUlAgSHVza3kiKQorCUJPT1RfTUVNKDB4YTAwMDAwMDAsIDB4NDAwMDAwMDAsIGlvX3AydigweDQwMDAwMDAwKSkKKwlGSVhVUChmaXh1cF9jb3JnaSkKKwlNQVBJTyhjb3JnaV9tYXBfaW8pCisJSU5JVElSUShjb3JnaV9pbml0X2lycSkKKwkuaW5pdF9tYWNoaW5lID0gY29yZ2lfaW5pdCwKKwkudGltZXIgPSAmcHhhX3RpbWVyLAorTUFDSElORV9FTkQKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9zc3AuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX3NzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2ZmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9zc3AuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqICBTU1AgY29udHJvbCBjb2RlIGZvciBTaGFycCBDb3JnaSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNCBSaWNoYXJkIFB1cmRpZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NzcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvcmdpLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworc3RhdGljIHNwaW5sb2NrX3QgY29yZ2lfc3NwX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgc3RydWN0IHNzcF9kZXYgY29yZ2lfc3NwX2RldjsKK3N0YXRpYyBzdHJ1Y3Qgc3NwX3N0YXRlIGNvcmdpX3NzcF9zdGF0ZTsKKworLyoKKyAqIFRoZXJlIGFyZSB0aHJlZSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGUgU1NQIGludGVyZmFjZToKKyAqICAgMS4gQSB0b3VjaHNjcmVlbiBjb250cm9sbGVyIChUSSBBRFM3ODQ2IGNvbXBhdGlibGUpCisgKiAgIDIuIEFuIExDRCBjb250b2xsZXIgKHdpdGggc29tZSBCYWNrbGlnaHQgZnVuY3Rpb25hbGl0eSkKKyAqICAgMy4gQSBiYXR0ZXJ5IG1vaW5pdG9yaW5nIElDIChNYXhpbSBNQVgxMTExKQorICoKKyAqIEVhY2ggZGV2aWNlIHVzZXMgYSBkaWZmZXJlbnQgc3BlZWQvbW9kZSBvZiBjb21tdW5pY2F0aW9uLgorICoKKyAqIFRoZSB0b3VjaHNjcmVlbiBpcyB2ZXJ5IHNlbnNpdGl2ZSBhbmQgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkCisgKiBzbyB0aGUgcG9ydCBpcyBsZWZ0IGNvbmZpZ3VyZWQgZm9yIHRoaXMuCisgKgorICogRGV2aWNlcyBhcmUgc2VsZWN0ZWQgdXNpbmcgQ2hpcCBTZWxlY3RzIG9uIEdQSU9zLgorICovCisKKy8qCisgKiAgQURTNzg0NiBSb3V0aW5lcworICovCit1bnNpZ25lZCBsb25nIGNvcmdpX3NzcF9hZHM3ODQ2X3B1dGdldCh1bG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgcmV0LGZsYWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29yZ2lfc3NwX2xvY2ssIGZsYWcpOworCUdQQ1IwID0gR1BJT19iaXQoQ09SR0lfR1BJT19BRFM3ODQ2X0NTKTsKKworCXNzcF93cml0ZV93b3JkKCZjb3JnaV9zc3BfZGV2LGRhdGEpOworCXJldCA9IHNzcF9yZWFkX3dvcmQoJmNvcmdpX3NzcF9kZXYpOworCisJR1BTUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX0FEUzc4NDZfQ1MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvcmdpX3NzcF9sb2NrLCBmbGFnKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBOT1RFOiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQKKyAqIGFuZCB1c2UgdGhlIF9sb2NrIGFuZCBfdW5sb2NrIGZ1bmN0aW9ucy4gVGhleSBhcmUgdmVyeSB0aW1lIHNlbnNpdGl2ZS4KKyAqLwordm9pZCBjb3JnaV9zc3BfYWRzNzg0Nl9sb2NrKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZjb3JnaV9zc3BfbG9jayk7CisJR1BDUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX0FEUzc4NDZfQ1MpOworfQorCit2b2lkIGNvcmdpX3NzcF9hZHM3ODQ2X3VubG9jayh2b2lkKQoreworCUdQU1IwID0gR1BJT19iaXQoQ09SR0lfR1BJT19BRFM3ODQ2X0NTKTsKKwlzcGluX3VubG9jaygmY29yZ2lfc3NwX2xvY2spOworfQorCit2b2lkIGNvcmdpX3NzcF9hZHM3ODQ2X3B1dCh1bG9uZyBkYXRhKQoreworCXNzcF93cml0ZV93b3JkKCZjb3JnaV9zc3BfZGV2LGRhdGEpOworfQorCit1bnNpZ25lZCBsb25nIGNvcmdpX3NzcF9hZHM3ODQ2X2dldCh2b2lkKQoreworCXJldHVybiBzc3BfcmVhZF93b3JkKCZjb3JnaV9zc3BfZGV2KTsKK30KKworRVhQT1JUX1NZTUJPTChjb3JnaV9zc3BfYWRzNzg0Nl9wdXRnZXQpOworRVhQT1JUX1NZTUJPTChjb3JnaV9zc3BfYWRzNzg0Nl9sb2NrKTsKK0VYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2Fkczc4NDZfdW5sb2NrKTsKK0VYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2Fkczc4NDZfcHV0KTsKK0VYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2Fkczc4NDZfZ2V0KTsKKworCisvKgorICogIExDRC9CYWNrbGlnaHQgUm91dGluZXMKKyAqLwordW5zaWduZWQgbG9uZyBjb3JnaV9zc3BfZGFjX3B1dCh1bG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3JnaV9zc3BfbG9jaywgZmxhZyk7CisJR1BDUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX0xDRENPTl9DUyk7CisKKwlzc3BfZGlzYWJsZSgmY29yZ2lfc3NwX2Rldik7CisJc3NwX2NvbmZpZygmY29yZ2lfc3NwX2RldiwgKFNTQ1IwX01vdG9yb2xhIHwgKFNTQ1IwX0RTUyAmIDB4MDcgKSksIFNTQ1IxX1NQSCwgMCwgU1NDUjBfU2VyQ2xrRGl2KDc2KSk7CisJc3NwX2VuYWJsZSgmY29yZ2lfc3NwX2Rldik7CisKKwlzc3Bfd3JpdGVfd29yZCgmY29yZ2lfc3NwX2RldixkYXRhKTsKKwkvKiBSZWFkIG51bGwgZGF0YSBiYWNrIGZyb20gZGV2aWNlIHRvIHByZXZlbnQgU1NQIG92ZXJmbG93ICovCisJc3NwX3JlYWRfd29yZCgmY29yZ2lfc3NwX2Rldik7CisKKwlzc3BfZGlzYWJsZSgmY29yZ2lfc3NwX2Rldik7CisJc3NwX2NvbmZpZygmY29yZ2lfc3NwX2RldiwgKFNTQ1IwX05hdGlvbmFsIHwgKFNTQ1IwX0RTUyAmIDB4MGIgKSksIDAsIDAsIFNTQ1IwX1NlckNsa0RpdigyKSk7CisJc3NwX2VuYWJsZSgmY29yZ2lfc3NwX2Rldik7CisJR1BTUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX0xDRENPTl9DUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZ2lfc3NwX2xvY2ssIGZsYWcpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29yZ2lfc3NwX2xjZHRnX3NlbmQodTggYWRycywgdTggZGF0YSkKK3sKKwljb3JnaV9zc3BfZGFjX3B1dCgoKGFkcnMgJiAweDA3KSA8PCA1KSB8IChkYXRhICYgMHgxZikpOworfQorCit2b2lkIGNvcmdpX3NzcF9ibGR1dHlfc2V0KGludCBkdXR5KQoreworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKDB4MDIsZHV0eSk7Cit9CisKK0VYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2xjZHRnX3NlbmQpOworRVhQT1JUX1NZTUJPTChjb3JnaV9zc3BfYmxkdXR5X3NldCk7CisKKy8qCisgKiAgTWF4MTExMSBSb3V0aW5lcworICovCitpbnQgY29yZ2lfc3NwX21heDExMTFfZ2V0KHVsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCWludCB2b2x0YWdlLHZvbHRhZ2UxLHZvbHRhZ2UyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvcmdpX3NzcF9sb2NrLCBmbGFnKTsKKwlHUENSMCA9IEdQSU9fYml0KENPUkdJX0dQSU9fTUFYMTExMV9DUyk7CisJc3NwX2Rpc2FibGUoJmNvcmdpX3NzcF9kZXYpOworCXNzcF9jb25maWcoJmNvcmdpX3NzcF9kZXYsIChTU0NSMF9Nb3Rvcm9sYSB8IChTU0NSMF9EU1MgJiAweDA3ICkpLCAwLCAwLCBTU0NSMF9TZXJDbGtEaXYoOCkpOworCXNzcF9lbmFibGUoJmNvcmdpX3NzcF9kZXYpOworCisJdWRlbGF5KDEpOworCisJLyogVEIxL1JCMSAqLworCXNzcF93cml0ZV93b3JkKCZjb3JnaV9zc3BfZGV2LGRhdGEpOworCXNzcF9yZWFkX3dvcmQoJmNvcmdpX3NzcF9kZXYpOyAvKiBudWxsIHJlYWQgKi8KKworCS8qIFRCMTIvUkIyICovCisJc3NwX3dyaXRlX3dvcmQoJmNvcmdpX3NzcF9kZXYsMCk7CisJdm9sdGFnZTE9c3NwX3JlYWRfd29yZCgmY29yZ2lfc3NwX2Rldik7CisKKwkvKiBUQjEzL1JCMyovCisJc3NwX3dyaXRlX3dvcmQoJmNvcmdpX3NzcF9kZXYsMCk7CisJdm9sdGFnZTI9c3NwX3JlYWRfd29yZCgmY29yZ2lfc3NwX2Rldik7CisKKwlzc3BfZGlzYWJsZSgmY29yZ2lfc3NwX2Rldik7CisJc3NwX2NvbmZpZygmY29yZ2lfc3NwX2RldiwgKFNTQ1IwX05hdGlvbmFsIHwgKFNTQ1IwX0RTUyAmIDB4MGIgKSksIDAsIDAsIFNTQ1IwX1NlckNsa0RpdigyKSk7CisJc3NwX2VuYWJsZSgmY29yZ2lfc3NwX2Rldik7CisJR1BTUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX01BWDExMTFfQ1MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvcmdpX3NzcF9sb2NrLCBmbGFnKTsKKworCWlmICh2b2x0YWdlMSAmIDB4YzAgfHwgdm9sdGFnZTIgJiAweDNmKQorCQl2b2x0YWdlID0gLTE7CisJZWxzZQorCQl2b2x0YWdlID0gKCh2b2x0YWdlMSA8PCAyKSAmIDB4ZmMpIHwgKCh2b2x0YWdlMiA+PiA2KSAmIDB4MDMpOworCisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKK0VYUE9SVF9TWU1CT0woY29yZ2lfc3NwX21heDExMTFfZ2V0KTsKKworLyoKKyAqICBTdXBwb3J0IFJvdXRpbmVzCisgKi8KK2ludCBfX2luaXQgY29yZ2lfc3NwX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJLyogQ2hpcCBTZWxlY3QgLSBEaXNhYmxlIEFsbCAqLworCUdQRFIwIHw9IEdQSU9fYml0KENPUkdJX0dQSU9fTENEQ09OX0NTKTsgLyogb3V0cHV0ICovCisJR1BTUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX0xDRENPTl9DUyk7ICAvKiBIaWdoIC0gRGlzYWJsZSBMQ0QgQ29udHJvbC9UaW1pbmcgR2VuICovCisJR1BEUjAgfD0gR1BJT19iaXQoQ09SR0lfR1BJT19NQVgxMTExX0NTKTsgLyogb3V0cHV0ICovCisJR1BTUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX01BWDExMTFfQ1MpOyAgLyogSGlnaCAtIERpc2FibGUgTUFYMTExMSovCisJR1BEUjAgfD0gR1BJT19iaXQoQ09SR0lfR1BJT19BRFM3ODQ2X0NTKTsgIC8qIG91dHB1dCAqLworCUdQU1IwID0gR1BJT19iaXQoQ09SR0lfR1BJT19BRFM3ODQ2X0NTKTsgICAvKiBIaWdoIC0gRGlzYWJsZSBBRFM3ODQ2Ki8KKworCXJldD1zc3BfaW5pdCgmY29yZ2lfc3NwX2RldiwxKTsKKworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIFNTUCBoYW5kbGVyIVxuIik7CisJZWxzZSB7CisJCXNzcF9kaXNhYmxlKCZjb3JnaV9zc3BfZGV2KTsKKwkJc3NwX2NvbmZpZygmY29yZ2lfc3NwX2RldiwgKFNTQ1IwX05hdGlvbmFsIHwgKFNTQ1IwX0RTUyAmIDB4MGIgKSksIDAsIDAsIFNTQ1IwX1NlckNsa0RpdigyKSk7CisJCXNzcF9lbmFibGUoJmNvcmdpX3NzcF9kZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfc3NwX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3NwX2V4aXQoJmNvcmdpX3NzcF9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcmdpX3NzcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJaWYgKGxldmVsID09IFNVU1BFTkRfUE9XRVJfRE9XTikgeworCQlzc3BfZmx1c2goJmNvcmdpX3NzcF9kZXYpOworCQlzc3Bfc2F2ZV9zdGF0ZSgmY29yZ2lfc3NwX2RldiwmY29yZ2lfc3NwX3N0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfc3NwX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlpZiAobGV2ZWwgPT0gUkVTVU1FX1BPV0VSX09OKSB7CisJCUdQU1IwID0gR1BJT19iaXQoQ09SR0lfR1BJT19MQ0RDT05fQ1MpOyAgLyogSGlnaCAtIERpc2FibGUgTENEIENvbnRyb2wvVGltaW5nIEdlbiAqLworCQlHUFNSMCA9IEdQSU9fYml0KENPUkdJX0dQSU9fTUFYMTExMV9DUyk7IC8qIEhpZ2ggLSBEaXNhYmxlIE1BWDExMTEqLworCQlHUFNSMCA9IEdQSU9fYml0KENPUkdJX0dQSU9fQURTNzg0Nl9DUyk7IC8qIEhpZ2ggLSBEaXNhYmxlIEFEUzc4NDYqLworCQlzc3BfcmVzdG9yZV9zdGF0ZSgmY29yZ2lfc3NwX2RldiwmY29yZ2lfc3NwX3N0YXRlKTsKKwkJc3NwX2VuYWJsZSgmY29yZ2lfc3NwX2Rldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgY29yZ2lzc3BfZHJpdmVyID0geworCS5uYW1lCQk9ICJjb3JnaS1zc3AiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBjb3JnaV9zc3BfcHJvYmUsCisJLnJlbW92ZQkJPSBjb3JnaV9zc3BfcmVtb3ZlLAorCS5zdXNwZW5kCT0gY29yZ2lfc3NwX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBjb3JnaV9zc3BfcmVzdW1lLAorfTsKKworaW50IF9faW5pdCBjb3JnaV9zc3BfaW5pdCh2b2lkKQoreworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmNvcmdpc3NwX2RyaXZlcik7Cit9CisKK2FyY2hfaW5pdGNhbGwoY29yZ2lfc3NwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTgxMTJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZG1hLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1weGEvZG1hLmMKKyAqCisgKiAgUFhBIERNQSByZWdpc3RyYXRpb24gYW5kIElSUSBkaXNwYXRjaGluZworICoKKyAqICBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqICBDcmVhdGVkOglOb3YgMTUsIDIwMDEKKyAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCitzdGF0aWMgc3RydWN0IGRtYV9jaGFubmVsIHsKKwljaGFyICpuYW1lOworCXZvaWQgKCppcnFfaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCXZvaWQgKmRhdGE7Cit9IGRtYV9jaGFubmVsc1tQWEFfRE1BX0NIQU5ORUxTXTsKKworCitpbnQgcHhhX3JlcXVlc3RfZG1hIChjaGFyICpuYW1lLCBweGFfZG1hX3ByaW8gcHJpbywKKwkJCSB2b2lkICgqaXJxX2hhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKKwkJIAkgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBmb3VuZCA9IDA7CisKKwkvKiBiYXNpYyBzYW5pdHkgY2hlY2tzICovCisJaWYgKCFuYW1lIHx8ICFpcnFfaGFuZGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiB0cnkgZ3JhYmJpbmcgYSBETUEgY2hhbm5lbCB3aXRoIHRoZSByZXF1ZXN0ZWQgcHJpb3JpdHkgKi8KKwlmb3IgKGkgPSBwcmlvOyBpIDwgcHJpbyArIFBYQV9ETUFfTkJDSChwcmlvKTsgaSsrKSB7CisJCWlmICghZG1hX2NoYW5uZWxzW2ldLm5hbWUpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQkvKiByZXF1ZXN0ZWQgcHJpbyBncm91cCBpcyBmdWxsLCB0cnkgaGllciBwcmlvcml0aWVzICovCisJCWZvciAoaSA9IHByaW8tMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICghZG1hX2NoYW5uZWxzW2ldLm5hbWUpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZm91bmQpIHsKKwkJRENTUihpKSA9IERDU1JfU1RBUlRJTlRSfERDU1JfRU5ESU5UUnxEQ1NSX0JVU0VSUjsKKwkJZG1hX2NoYW5uZWxzW2ldLm5hbWUgPSBuYW1lOworCQlkbWFfY2hhbm5lbHNbaV0uaXJxX2hhbmRsZXIgPSBpcnFfaGFuZGxlcjsKKwkJZG1hX2NoYW5uZWxzW2ldLmRhdGEgPSBkYXRhOworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJObyBtb3JlIGF2YWlsYWJsZSBETUEgY2hhbm5lbHMgZm9yICVzXG4iLCBuYW1lKTsKKwkJaSA9IC1FTk9ERVY7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBpOworfQorCit2b2lkIHB4YV9mcmVlX2RtYSAoaW50IGRtYV9jaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFkbWFfY2hhbm5lbHNbZG1hX2NoXS5uYW1lKSB7CisJCXByaW50ayAoS0VSTl9DUklUCisJCQkiJXM6IHRyeWluZyB0byBmcmVlIGNoYW5uZWwgJWQgd2hpY2ggaXMgYWxyZWFkeSBmcmVlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgZG1hX2NoKTsKKwkJcmV0dXJuOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlEQ1NSKGRtYV9jaCkgPSBEQ1NSX1NUQVJUSU5UUnxEQ1NSX0VORElOVFJ8RENTUl9CVVNFUlI7CisJZG1hX2NoYW5uZWxzW2RtYV9jaF0ubmFtZSA9IE5VTEw7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGksIGRpbnQgPSBESU5UOworCisJZm9yIChpID0gMDsgaSA8IFBYQV9ETUFfQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoZGludCAmICgxIDw8IGkpKSB7CisJCQlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSAmZG1hX2NoYW5uZWxzW2ldOworCQkJaWYgKGNoYW5uZWwtPm5hbWUgJiYgY2hhbm5lbC0+aXJxX2hhbmRsZXIpIHsKKwkJCQljaGFubmVsLT5pcnFfaGFuZGxlcihpLCBjaGFubmVsLT5kYXRhLCByZWdzKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBJUlEgZm9yIGFuIHVucmVnaXN0ZXJlZCBETUEgY2hhbm5lbDoKKwkJCQkgKiBsZXQncyBjbGVhciB0aGUgaW50ZXJydXB0cyBhbmQgZGlzYWJsZSBpdC4KKwkJCQkgKi8KKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAic3B1cmlvdXMgSVJRIGZvciBETUEgY2hhbm5lbCAlZFxuIiwgaSk7CisJCQkJRENTUihpKSA9IERDU1JfU1RBUlRJTlRSfERDU1JfRU5ESU5UUnxEQ1NSX0JVU0VSUjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YV9kbWFfaW5pdCAodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEgKElSUV9ETUEsIGRtYV9pcnFfaGFuZGxlciwgMCwgIkRNQSIsIE5VTEwpOworCWlmIChyZXQpCisJCXByaW50ayAoS0VSTl9DUklUICJXb3chICBDYW4ndCByZWdpc3RlciBJUlEgZm9yIERNQVxuIik7CisJcmV0dXJuIHJldDsKK30KKworYXJjaF9pbml0Y2FsbChweGFfZG1hX2luaXQpOworCitFWFBPUlRfU1lNQk9MKHB4YV9yZXF1ZXN0X2RtYSk7CitFWFBPUlRfU1lNQk9MKHB4YV9mcmVlX2RtYSk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU3NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYworICoKKyAqICBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqICBDcmVhdGVkOglKdW4gMTUsIDIwMDEKKyAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIENvZGUgY29tbW9uIHRvIGFsbCBQWEEgbWFjaGluZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTaW5jZSB0aGlzIGZpbGUgc2hvdWxkIGJlIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIG1hY2hpbmUgc3BlY2lmaWMgZmlsZSwKKyAqIHRoZSBfX2luaXRjYWxsKCkgaGVyZSB3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0LiAgVGhpcyBzZXJ2ZXMgYXMgZGVmYXVsdAorICogaW5pdGlhbGl6YXRpb24gc3R1ZmYgZm9yIFBYQSBtYWNoaW5lcyB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBsYXRlciBpZgorICogbmVlZCBiZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VkYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YWZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbW1jLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKy8qCisgKiBIYW5keSBmdW5jdGlvbiB0byBzZXQgR1BJTyBhbHRlcm5hdGUgZnVuY3Rpb25zCisgKi8KKwordm9pZCBweGFfZ3Bpb19tb2RlKGludCBncGlvX21vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZ3BpbyA9IGdwaW9fbW9kZSAmIEdQSU9fTURfTUFTS19OUjsKKwlpbnQgZm4gPSAoZ3Bpb19tb2RlICYgR1BJT19NRF9NQVNLX0ZOKSA+PiA4OworCWludCBnYWZyOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChncGlvX21vZGUgJiBHUElPX0RGTFRfTE9XKQorCQlHUENSKGdwaW8pID0gR1BJT19iaXQoZ3Bpbyk7CisJZWxzZSBpZiAoZ3Bpb19tb2RlICYgR1BJT19ERkxUX0hJR0gpCisJCUdQU1IoZ3BpbykgPSBHUElPX2JpdChncGlvKTsKKwlpZiAoZ3Bpb19tb2RlICYgR1BJT19NRF9NQVNLX0RJUikKKwkJR1BEUihncGlvKSB8PSBHUElPX2JpdChncGlvKTsKKwllbHNlCisJCUdQRFIoZ3BpbykgJj0gfkdQSU9fYml0KGdwaW8pOworCWdhZnIgPSBHQUZSKGdwaW8pICYgfigweDMgPDwgKCgoZ3BpbykgJiAweGYpKjIpKTsKKwlHQUZSKGdwaW8pID0gZ2FmciB8ICAoZm4gIDw8ICgoKGdwaW8pICYgMHhmKSoyKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKHB4YV9ncGlvX21vZGUpOworCisvKgorICogUm91dGluZSB0byBzYWZlbHkgZW5hYmxlIG9yIGRpc2FibGUgYSBjbG9jayBpbiB0aGUgQ0tFTgorICovCit2b2lkIHB4YV9zZXRfY2tlbihpbnQgY2xvY2ssIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoZW5hYmxlKQorCQlDS0VOIHw9IGNsb2NrOworCWVsc2UKKwkJQ0tFTiAmPSB+Y2xvY2s7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0wocHhhX3NldF9ja2VuKTsKKworLyoKKyAqIEludGVsIFBYQTJ4eCBpbnRlcm5hbCByZWdpc3RlciBtYXBwaW5nLgorICoKKyAqIE5vdGUgMTogbm90IGFsbCBQWEEyeHggdmFyaWFudHMgaW1wbGVtZW50IGFsbCB0aG9zZSBhZGRyZXNzZXMuCisgKgorICogTm90ZSAyOiB2aXJ0dWFsIDB4ZmZmZTAwMDAtMHhmZmZmZmZmZiBpcyByZXNlcnZlZCBmb3IgdGhlIHZlY3RvciB0YWJsZQorICogICAgICAgICBhbmQgY2FjaGUgZmx1c2ggYXJlYS4KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzdGFuZGFyZF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICBsZW5ndGggICAgICB0eXBlICovCisgIHsgMHhmMjAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMjAwMDAwMCwgTVRfREVWSUNFIH0sIC8qIERldnMgKi8KKyAgeyAweGY0MDAwMDAwLCAweDQ0MDAwMDAwLCAweDAwMTAwMDAwLCBNVF9ERVZJQ0UgfSwgLyogTENEICovCisgIHsgMHhmNjAwMDAwMCwgMHg0ODAwMDAwMCwgMHgwMDEwMDAwMCwgTVRfREVWSUNFIH0sIC8qIE1lbSBDdGwgKi8KKyAgeyAweGY4MDAwMDAwLCAweDRjMDAwMDAwLCAweDAwMTAwMDAwLCBNVF9ERVZJQ0UgfSwgLyogVVNCIGhvc3QgKi8KKyAgeyAweGZhMDAwMDAwLCAweDUwMDAwMDAwLCAweDAwMTAwMDAwLCBNVF9ERVZJQ0UgfSwgLyogQ2FtZXJhICovCisgIHsgMHhmZTAwMDAwMCwgMHg1ODAwMDAwMCwgMHgwMDEwMDAwMCwgTVRfREVWSUNFIH0sIC8qIElNZW0gY3RsICovCisgIHsgMHhmZjAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDEwMDAwMCwgTVRfREVWSUNFIH0gIC8qIFVOQ0FDSEVEX1BIWVNfMCAqLworfTsKKwordm9pZCBfX2luaXQgcHhhX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChzdGFuZGFyZF9pb19kZXNjLCBBUlJBWV9TSVpFKHN0YW5kYXJkX2lvX2Rlc2MpKTsKKwlnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMSk7Cit9CisKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBweGFtY2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDQxMTAwMDAwLAorCQkuZW5kCT0gMHg0MTEwMGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9NTUMsCisJCS5lbmQJPSBJUlFfTU1DLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHU2NCBweGFtY2lfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhbWNpX2RldmljZSA9IHsKKwkubmFtZQkJPSAicHhhMnh4LW1jaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sgPSAmcHhhbWNpX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocHhhbWNpX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcHhhbWNpX3Jlc291cmNlcywKK307CisKK3ZvaWQgX19pbml0IHB4YV9zZXRfbWNpX2luZm8oc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhICppbmZvKQoreworCXB4YW1jaV9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBpbmZvOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gcHhhX3VkY19pbmZvOworCit2b2lkIF9faW5pdCBweGFfc2V0X3VkY19pbmZvKHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyAqaW5mbykKK3sKKwltZW1jcHkoJnB4YV91ZGNfaW5mbywgaW5mbywgc2l6ZW9mICppbmZvKTsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBweGEyeHhfdWRjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHg0MDYwMDAwMCwKKwkJLmVuZAk9IDB4NDA2MGZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfVVNCLAorCQkuZW5kCT0gSVJRX1VTQiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyB1NjQgdWRjX2RtYV9tYXNrID0gfih1MzIpMDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdWRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAicHhhMnh4LXVkYyIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9IHB4YTJ4eF91ZGNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShweGEyeHhfdWRjX3Jlc291cmNlcyksCisJLmRldgkJPSAgeworCQkucGxhdGZvcm1fZGF0YQk9ICZweGFfdWRjX2luZm8sCisJCS5kbWFfbWFzawk9ICZ1ZGNfZG1hX21hc2ssCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gcHhhX2ZiX2luZm87CisKK3ZvaWQgX19pbml0IHNldF9weGFfZmJfaW5mbyhzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvICpoYXJkX3B4YV9mYl9pbmZvKQoreworCW1lbWNweSgmcHhhX2ZiX2luZm8saGFyZF9weGFfZmJfaW5mbyxzaXplb2Yoc3RydWN0IHB4YWZiX21hY2hfaW5mbykpOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHB4YWZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHg0NDAwMDAwMCwKKwkJLmVuZAk9IDB4NDQwMGZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfTENELAorCQkuZW5kCT0gSVJRX0xDRCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyB1NjQgZmJfZG1hX21hc2sgPSB+KHU2NCkwOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGFmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInB4YTJ4eC1mYiIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworIAkJLnBsYXRmb3JtX2RhdGEJPSAmcHhhX2ZiX2luZm8sCisJCS5kbWFfbWFzawk9ICZmYl9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShweGFmYl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHB4YWZiX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGZmdWFydF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInB4YTJ4eC11YXJ0IiwKKwkuaWQJCT0gMCwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBidHVhcnRfZGV2aWNlID0geworCS5uYW1lCQk9ICJweGEyeHgtdWFydCIsCisJLmlkCQk9IDEsCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3R1YXJ0X2RldmljZSA9IHsKKwkubmFtZQkJPSAicHhhMnh4LXVhcnQiLAorCS5pZAkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZweGFtY2lfZGV2aWNlLAorCSZ1ZGNfZGV2aWNlLAorCSZweGFmYl9kZXZpY2UsCisJJmZmdWFydF9kZXZpY2UsCisJJmJ0dWFydF9kZXZpY2UsCisJJnN0dWFydF9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGFfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKK30KKworc3Vic3lzX2luaXRjYWxsKHB4YV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRhOGRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5oCisgKgorICogQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworc3RydWN0IHN5c190aW1lcjsKKworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgcHhhX3RpbWVyOworZXh0ZXJuIHZvaWQgX19pbml0IHB4YV9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgcHhhX2luaXRfaXJxKHZvaWQpOworCitleHRlcm4gdW5zaWduZWQgaW50IGdldF9jbGtfZnJlcXVlbmN5X2toeihpbnQgaW5mbyk7CisKKyNkZWZpbmUgU0VUX0JBTksoX19ucixfX3N0YXJ0LF9fc2l6ZSkgXAorCW1pLT5iYW5rW19fbnJdLnN0YXJ0ID0gKF9fc3RhcnQpLCBcCisJbWktPmJhbmtbX19ucl0uc2l6ZSA9IChfX3NpemUpLCBcCisJbWktPmJhbmtbX19ucl0ubm9kZSA9ICgoKHVuc2lnbmVkKShfX3N0YXJ0KSAtIFBIWVNfT0ZGU0VUKSA+PiAyNykKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE2NmJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEgQ2xpZmYgQnJha2UsIEFjY2VsZW50IFN5c3RlbXMgSW5jLgorICoKKyAqICAyMDAxLTA5LTEzOiBDbGlmZiBCcmFrZSA8Y2JyYWtlQGFjY2VsZW50LmNvbT4KKyAqICAgICAgICAgICAgICBJbml0aWFsIGNvZGUKKyAqCisgKiAgMjAwNS0wMi0xNTogQ2xpZmYgQnJha2UgPGNsaWZmLmJyYWtlQGdtYWlsLmNvbT4KKyAqICAJCTxodHRwOi8vd3d3LnZpYnJlbi5jb20+IDxodHRwOi8vYmVjLXN5c3RlbXMuY29tPgorICogICAgICAgICAgICAgIFVwZGF0ZWQgZm9yIDIuNiBrZXJuZWwKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pZHAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGFmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdGZpZWxkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbW1jLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKy8qIFRPRE86CisgKiAtIGFkZCBweGEyeHhfYXVkaW9fb3BzX3QgZGV2aWNlIHN0cnVjdHVyZQorICogLSBFdGhlcm5ldCBpbnRlcnJ1cHQKKyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IChJRFBfRVRIX1BIWVMgKyAweDMwMCksCisJCS5lbmQJPSAoSURQX0VUSF9QSFlTICsgMHhmZmZmZiksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfR1BJTyg0KSwKKwkJLmVuZAk9IElSUV9HUElPKDQpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHZvaWQgaWRwX2JhY2tsaWdodF9wb3dlcihpbnQgb24pCit7CisJaWYgKG9uKSB7CisJCUlEUF9DUExEX0xDRCB8PSAoMTw8MSk7CisJfSBlbHNlIHsKKwkJSURQX0NQTERfTENEICY9IH4oMTw8MSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZHBfdmxjZChpbnQgb24pCit7CisJaWYgKG9uKSB7CisJCUlEUF9DUExEX0xDRCB8PSAoMTw8Mik7CisJfSBlbHNlIHsKKwkJSURQX0NQTERfTENEICY9IH4oMTw8Mik7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZHBfbGNkX3Bvd2VyKGludCBvbikKK3sKKwlpZiAob24pIHsKKwkJSURQX0NQTERfTENEIHw9ICgxPDwwKTsKKwl9IGVsc2UgeworCQlJRFBfQ1BMRF9MQ0QgJj0gfigxPDwwKTsKKwl9CisKKwkvKiBjYWxsIGlkcF92bGNkIGZvciBub3cgYXMgY29yZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAorCSAqIGJvdGggcG93ZXIgYW5kIHZsY2QgaG9va3MuICBOb3RlLCB0aGlzIGlzIG5vdCB0ZWNobmljYWxseQorCSAqIHRoZSBjb3JyZWN0IHNlcXVlbmNlLCBidXQgc2VlbXMgdG8gd29yay4gIERpc2NsYWltZXI6CisJICogdGhpcyBtYXkgZXZlbnR1YWxseSBkYW1hZ2UgdGhlIGRpc3BsYXkuCisJICovCisKKwlpZHBfdmxjZChvbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIHNoYXJwX2xtOHYzMSBfX2luaXRkYXRhID0geworCS5waXhjbG9jawk9IDI3MDAwMCwKKwkueHJlcwkJPSA2NDAsCisJLnlyZXMJCT0gNDgwLAorCS5icHAJCT0gMTYsCisJLmhzeW5jX2xlbgk9IDEsCisJLmxlZnRfbWFyZ2luCT0gMywKKwkucmlnaHRfbWFyZ2luCT0gMywKKwkudnN5bmNfbGVuCT0gMSwKKwkudXBwZXJfbWFyZ2luCT0gMCwKKwkubG93ZXJfbWFyZ2luCT0gMCwKKwkuc3luYwkJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkuY21hcF9ncmV5c2NhbGUJPSAwLAorCS5jbWFwX2ludmVyc2UJPSAwLAorCS5jbWFwX3N0YXRpYwk9IDAsCisJLmxjY3IwCQk9IExDQ1IwX1NEUywKKwkubGNjcjMJCT0gTENDUjNfUENQIHwgTENDUjNfQWNiKDI1NSksCisJLnB4YWZiX2JhY2tsaWdodF9wb3dlciA9ICZpZHBfYmFja2xpZ2h0X3Bvd2VyLAorCS5weGFmYl9sY2RfcG93ZXIgPSAmaWRwX2xjZF9wb3dlcgorfTsKKworc3RhdGljIGludCBpZHBfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFyZXR1cm5fdCAoKmlkcF9kZXRlY3RfaW50KShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHZvaWQgKmRhdGEpCit7CisJLyogc2V0dXAgR1BJTyBmb3IgUFhBMjV4IE1NQyBjb250cm9sbGVyCSovCisJcHhhX2dwaW9fbW9kZShHUElPNl9NTUNDTEtfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzhfTU1DQ1MwX01EKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIGlkcF9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKKwkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLmluaXQgCQk9IGlkcF9tY2lfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpZHBfaW5pdCh2b2lkKQoreworCXByaW50aygiaWRwX2luaXQoKVxuIik7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOworCS8vcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtc3RfYXVkaW9fZGV2aWNlKTsKKwlzZXRfcHhhX2ZiX2luZm8oJnNoYXJwX2xtOHYzMSk7CisJcHhhX3NldF9tY2lfaW5mbygmaWRwX21jaV9wbGF0Zm9ybV9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlkcF9pbml0X2lycSh2b2lkKQoreworCisJcHhhX2luaXRfaXJxKCk7CisKKwlzZXRfaXJxX3R5cGUoVE9VQ0hfUEFORUxfSVJRLCBUT1VDSF9QQU5FTF9JUlFfRURHRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaWRwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIC8qIHZpcnR1YWwgICAgIHBoeXNpY2FsICAgIGxlbmd0aCAgICAgIHR5cGUgKi8KKworICB7IElEUF9DT1JFVk9MVF9WSVJULAorICAgIElEUF9DT1JFVk9MVF9QSFlTLAorICAgIElEUF9DT1JFVk9MVF9TSVpFLAorICAgIE1UX0RFVklDRSB9LAorICB7IElEUF9DUExEX1ZJUlQsCisgICAgSURQX0NQTERfUEhZUywKKyAgICBJRFBfQ1BMRF9TSVpFLAorICAgIE1UX0RFVklDRSB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaWRwX21hcF9pbyh2b2lkKQoreworCXB4YV9tYXBfaW8oKTsKKwlpb3RhYmxlX2luaXQoaWRwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoaWRwX2lvX2Rlc2MpKTsKKworCS8vIHNlcmlhbCBwb3J0cyAyICYgMworCXB4YV9ncGlvX21vZGUoR1BJTzQyX0JUUlhEX01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU80M19CVFRYRF9NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPNDRfQlRDVFNfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzQ1X0JUUlRTX01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU80Nl9TVFJYRF9NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPNDdfU1RUWERfTUQpOworCit9CisKKworTUFDSElORV9TVEFSVChQWEFfSURQLCAiVmlicmVuIFBYQTI1NSBJRFAiKQorCU1BSU5UQUlORVIoIlZpYnJlbiBUZWNobm9sb2dpZXMiKQorCUJPT1RfTUVNKDB4YTAwMDAwMDAsIDB4NDAwMDAwMDAsIGlvX3AydigweDQwMDAwMDAwKSkKKwlNQVBJTyhpZHBfbWFwX2lvKQorCUlOSVRJUlEoaWRwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAorCUlOSVRfTUFDSElORShpZHBfaW5pdCkKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzY2FjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYworICoKKyAqICBHZW5lcmljIFBYQSBJUlEgaGFuZGxpbmcsIEdQSU8gSVJRIGRlbXVsdGlwbGV4aW5nLCBldGMuCisgKgorICogIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogIENyZWF0ZWQ6CUp1biAxNSwgMjAwMQorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKworLyoKKyAqIFRoaXMgaXMgZm9yIHBlcmlwaGVyYWwgSVJRcyBpbnRlcm5hbCB0byB0aGUgUFhBIGNoaXAuCisgKi8KKworc3RhdGljIHZvaWQgcHhhX21hc2tfbG93X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCUlDTVIgJj0gfigxIDw8IChpcnEgKyBQWEFfSVJRX1NLSVApKTsKK30KKworc3RhdGljIHZvaWQgcHhhX3VubWFza19sb3dfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJSUNNUiB8PSAoMSA8PCAoaXJxICsgUFhBX0lSUV9TS0lQKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBweGFfaW50ZXJuYWxfY2hpcF9sb3cgPSB7CisJLmFjawkJPSBweGFfbWFza19sb3dfaXJxLAorCS5tYXNrCQk9IHB4YV9tYXNrX2xvd19pcnEsCisJLnVubWFzawkJPSBweGFfdW5tYXNrX2xvd19pcnEsCit9OworCisjaWYgUFhBX0lOVEVSTkFMX0lSUVMgPiAzMgorCisvKgorICogVGhpcyBpcyBmb3IgdGhlIHNlY29uZCBzZXQgb2YgaW50ZXJuYWwgSVJRcyBhcyBmb3VuZCBvbiB0aGUgUFhBMjd4LgorICovCisKK3N0YXRpYyB2b2lkIHB4YV9tYXNrX2hpZ2hfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJSUNNUjIgJj0gfigxIDw8IChpcnEgLSAzMiArIFBYQV9JUlFfU0tJUCkpOworfQorCitzdGF0aWMgdm9pZCBweGFfdW5tYXNrX2hpZ2hfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJSUNNUjIgfD0gKDEgPDwgKGlycSAtIDMyICsgUFhBX0lSUV9TS0lQKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBweGFfaW50ZXJuYWxfY2hpcF9oaWdoID0geworCS5hY2sJCT0gcHhhX21hc2tfaGlnaF9pcnEsCisJLm1hc2sJCT0gcHhhX21hc2tfaGlnaF9pcnEsCisJLnVubWFzawkJPSBweGFfdW5tYXNrX2hpZ2hfaXJxLAorfTsKKworI2VuZGlmCisKKy8qCisgKiBQWEEgR1BJTyBlZGdlIGRldGVjdGlvbiBmb3IgSVJRczoKKyAqIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBGYWxsaW5nLUVkZ2UsIFJpc2luZy1FZGdlLCBvciBib3RoLgorICogVXNlIHRoaXMgaW5zdGVhZCBvZiBkaXJlY3RseSBzZXR0aW5nIEdSRVIvR0ZFUi4KKyAqLworCitzdGF0aWMgbG9uZyBHUElPX0lSUV9yaXNpbmdfZWRnZVs0XTsKK3N0YXRpYyBsb25nIEdQSU9fSVJRX2ZhbGxpbmdfZWRnZVs0XTsKK3N0YXRpYyBsb25nIEdQSU9fSVJRX21hc2tbNF07CisKK3N0YXRpYyBpbnQgcHhhX2dwaW9faXJxX3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJaW50IGdwaW8sIGlkeDsKKworCWdwaW8gPSBJUlFfVE9fR1BJTyhpcnEpOworCWlkeCA9IGdwaW8gPj4gNTsKKworCWlmICh0eXBlID09IElSUVRfUFJPQkUpIHsKKwkgICAgLyogRG9uJ3QgbWVzcyB3aXRoIGVuYWJsZWQgR1BJT3MgdXNpbmcgcHJlY29uZmlndXJlZCBlZGdlcyBvcgorCSAgICAgICBHUElPcyBzZXQgdG8gYWx0ZXJuYXRlIGZ1bmN0aW9uIGR1cmluZyBwcm9iZSAqLworCQlpZiAoKEdQSU9fSVJRX3Jpc2luZ19lZGdlW2lkeF0gfCBHUElPX0lSUV9mYWxsaW5nX2VkZ2VbaWR4XSkgJgorCQkgICAgR1BJT19iaXQoZ3BpbykpCisJCQlyZXR1cm4gMDsKKwkJaWYgKEdBRlIoZ3BpbykgJiAoMHgzIDw8ICgoKGdwaW8pICYgMHhmKSoyKSkpCisJCQlyZXR1cm4gMDsKKwkJdHlwZSA9IF9fSVJRVF9SSVNFREdFIHwgX19JUlFUX0ZBTEVER0U7CisJfQorCisJLyogcHJpbnRrKEtFUk5fREVCVUcgIklSUSVkIChHUElPJWQpOiAiLCBpcnEsIGdwaW8pOyAqLworCisJcHhhX2dwaW9fbW9kZShncGlvIHwgR1BJT19JTik7CisKKwlpZiAodHlwZSAmIF9fSVJRVF9SSVNFREdFKSB7CisJCS8qIHByaW50aygicmlzaW5nICIpOyAqLworCQlfX3NldF9iaXQgKGdwaW8sIEdQSU9fSVJRX3Jpc2luZ19lZGdlKTsKKwl9IGVsc2UKKwkJX19jbGVhcl9iaXQgKGdwaW8sIEdQSU9fSVJRX3Jpc2luZ19lZGdlKTsKKworCWlmICh0eXBlICYgX19JUlFUX0ZBTEVER0UpIHsKKwkJLyogcHJpbnRrKCJmYWxsaW5nICIpOyAqLworCQlfX3NldF9iaXQgKGdwaW8sIEdQSU9fSVJRX2ZhbGxpbmdfZWRnZSk7CisJfSBlbHNlCisJCV9fY2xlYXJfYml0IChncGlvLCBHUElPX0lSUV9mYWxsaW5nX2VkZ2UpOworCisJLyogcHJpbnRrKCJlZGdlc1xuIik7ICovCisKKwlHUkVSKGdwaW8pID0gR1BJT19JUlFfcmlzaW5nX2VkZ2VbaWR4XSAmIEdQSU9fSVJRX21hc2tbaWR4XTsKKwlHRkVSKGdwaW8pID0gR1BJT19JUlFfZmFsbGluZ19lZGdlW2lkeF0gJiBHUElPX0lSUV9tYXNrW2lkeF07CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHUElPIElSUXMgbXVzdCBiZSBhY2tub3dsZWRnZWQuICBUaGlzIGlzIGZvciBHUElPIDAgYW5kIDEuCisgKi8KKworc3RhdGljIHZvaWQgcHhhX2Fja19sb3dfZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQoreworCUdFRFIwID0gKDEgPDwgKGlycSAtIElSUV9HUElPMCkpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgcHhhX2xvd19ncGlvX2NoaXAgPSB7CisJLmFjawkJPSBweGFfYWNrX2xvd19ncGlvLAorCS5tYXNrCQk9IHB4YV9tYXNrX2xvd19pcnEsCisJLnVubWFzawkJPSBweGFfdW5tYXNrX2xvd19pcnEsCisJLnR5cGUJCT0gcHhhX2dwaW9faXJxX3R5cGUsCit9OworCisvKgorICogRGVtdXggaGFuZGxlciBmb3IgR1BJTz49MiBlZGdlIGRldGVjdCBpbnRlcnJ1cHRzCisgKi8KKworc3RhdGljIHZvaWQgcHhhX2dwaW9fZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlpbnQgbG9vcDsKKworCWRvIHsKKwkJbG9vcCA9IDA7CisKKwkJbWFzayA9IEdFRFIwICYgfjM7CisJCWlmIChtYXNrKSB7CisJCQlHRURSMCA9IG1hc2s7CisJCQlpcnEgPSBJUlFfR1BJTygyKTsKKwkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkJCW1hc2sgPj49IDI7CisJCQlkbyB7CisJCQkJaWYgKG1hc2sgJiAxKQorCQkJCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJCQlpcnErKzsKKwkJCQlkZXNjKys7CisJCQkJbWFzayA+Pj0gMTsKKwkJCX0gd2hpbGUgKG1hc2spOworCQkJbG9vcCA9IDE7CisJCX0KKworCQltYXNrID0gR0VEUjE7CisJCWlmIChtYXNrKSB7CisJCQlHRURSMSA9IG1hc2s7CisJCQlpcnEgPSBJUlFfR1BJTygzMik7CisJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCQlkbyB7CisJCQkJaWYgKG1hc2sgJiAxKQorCQkJCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJCQlpcnErKzsKKwkJCQlkZXNjKys7CisJCQkJbWFzayA+Pj0gMTsKKwkJCX0gd2hpbGUgKG1hc2spOworCQkJbG9vcCA9IDE7CisJCX0KKworCQltYXNrID0gR0VEUjI7CisJCWlmIChtYXNrKSB7CisJCQlHRURSMiA9IG1hc2s7CisJCQlpcnEgPSBJUlFfR1BJTyg2NCk7CisJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCQlkbyB7CisJCQkJaWYgKG1hc2sgJiAxKQorCQkJCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJCQlpcnErKzsKKwkJCQlkZXNjKys7CisJCQkJbWFzayA+Pj0gMTsKKwkJCX0gd2hpbGUgKG1hc2spOworCQkJbG9vcCA9IDE7CisJCX0KKworI2lmIFBYQV9MQVNUX0dQSU8gPj0gOTYKKwkJbWFzayA9IEdFRFIzOworCQlpZiAobWFzaykgeworCQkJR0VEUjMgPSBtYXNrOworCQkJaXJxID0gSVJRX0dQSU8oOTYpOworCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOworCQkJZG8geworCQkJCWlmIChtYXNrICYgMSkKKwkJCQkJZGVzYy0+aGFuZGxlKGlycSwgZGVzYywgcmVncyk7CisJCQkJaXJxKys7CisJCQkJZGVzYysrOworCQkJCW1hc2sgPj49IDE7CisJCQl9IHdoaWxlIChtYXNrKTsKKwkJCWxvb3AgPSAxOworCQl9CisjZW5kaWYKKwl9IHdoaWxlIChsb29wKTsKK30KKworc3RhdGljIHZvaWQgcHhhX2Fja19tdXhlZF9ncGlvKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGdwaW8gPSBpcnEgLSBJUlFfR1BJTygyKSArIDI7CisJR0VEUihncGlvKSA9IEdQSU9fYml0KGdwaW8pOworfQorCitzdGF0aWMgdm9pZCBweGFfbWFza19tdXhlZF9ncGlvKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGdwaW8gPSBpcnEgLSBJUlFfR1BJTygyKSArIDI7CisJX19jbGVhcl9iaXQoZ3BpbywgR1BJT19JUlFfbWFzayk7CisJR1JFUihncGlvKSAmPSB+R1BJT19iaXQoZ3Bpbyk7CisJR0ZFUihncGlvKSAmPSB+R1BJT19iaXQoZ3Bpbyk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV91bm1hc2tfbXV4ZWRfZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBncGlvID0gaXJxIC0gSVJRX0dQSU8oMikgKyAyOworCWludCBpZHggPSBncGlvID4+IDU7CisJX19zZXRfYml0KGdwaW8sIEdQSU9fSVJRX21hc2spOworCUdSRVIoZ3BpbykgPSBHUElPX0lSUV9yaXNpbmdfZWRnZVtpZHhdICYgR1BJT19JUlFfbWFza1tpZHhdOworCUdGRVIoZ3BpbykgPSBHUElPX0lSUV9mYWxsaW5nX2VkZ2VbaWR4XSAmIEdQSU9fSVJRX21hc2tbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHB4YV9tdXhlZF9ncGlvX2NoaXAgPSB7CisJLmFjawkJPSBweGFfYWNrX211eGVkX2dwaW8sCisJLm1hc2sJCT0gcHhhX21hc2tfbXV4ZWRfZ3BpbywKKwkudW5tYXNrCQk9IHB4YV91bm1hc2tfbXV4ZWRfZ3BpbywKKwkudHlwZQkJPSBweGFfZ3Bpb19pcnFfdHlwZSwKK307CisKKwordm9pZCBfX2luaXQgcHhhX2luaXRfaXJxKHZvaWQpCit7CisJaW50IGlycTsKKworCS8qIGRpc2FibGUgYWxsIElSUXMgKi8KKwlJQ01SID0gMDsKKworCS8qIGFsbCBJUlFzIGFyZSBJUlEsIG5vdCBGSVEgKi8KKwlJQ0xSID0gMDsKKworCS8qIGNsZWFyIGFsbCBHUElPIGVkZ2UgZGV0ZWN0cyAqLworCUdGRVIwID0gMDsKKwlHRkVSMSA9IDA7CisJR0ZFUjIgPSAwOworCUdSRVIwID0gMDsKKwlHUkVSMSA9IDA7CisJR1JFUjIgPSAwOworCUdFRFIwID0gR0VEUjA7CisJR0VEUjEgPSBHRURSMTsKKwlHRURSMiA9IEdFRFIyOworCisjaWZkZWYgQ09ORklHX1BYQTI3eAorCS8qIEFuZCBzaW1pbGFybHkgZm9yIHRoZSBleHRyYSByZWdzIG9uIHRoZSBQWEEyN3ggKi8KKwlJQ01SMiA9IDA7CisJSUNMUjIgPSAwOworCUdGRVIzID0gMDsKKwlHUkVSMyA9IDA7CisJR0VEUjMgPSBHRURSMzsKKyNlbmRpZgorCisJLyogb25seSB1bm1hc2tlZCBpbnRlcnJ1cHRzIGtpY2sgdXMgb3V0IG9mIGlkbGUgKi8KKwlJQ0NSID0gMTsKKworCS8qIEdQSU8gMCBhbmQgMSBtdXN0IGhhdmUgdGhlaXIgbWFzayBiaXQgYWx3YXlzIHNldCAqLworCUdQSU9fSVJRX21hc2tbMF0gPSAzOworCisJZm9yIChpcnEgPSBQWEFfSVJRKFBYQV9JUlFfU0tJUCk7IGlycSA8PSBQWEFfSVJRKDMxKTsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJnB4YV9pbnRlcm5hbF9jaGlwX2xvdyk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKwl9CisKKyNpZiBQWEFfSU5URVJOQUxfSVJRUyA+IDMyCisJZm9yIChpcnEgPSBQWEFfSVJRKDMyKTsgaXJxIDwgUFhBX0lSUShQWEFfSU5URVJOQUxfSVJRUyk7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZweGFfaW50ZXJuYWxfY2hpcF9oaWdoKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworCX0KKyNlbmRpZgorCisJZm9yIChpcnEgPSBJUlFfR1BJTzA7IGlycSA8PSBJUlFfR1BJTzE7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZweGFfbG93X2dwaW9fY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwl9CisKKwlmb3IgKGlycSA9IElSUV9HUElPKDIpOyBpcnEgPD0gSVJRX0dQSU8oUFhBX0xBU1RfR1BJTyk7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZweGFfbXV4ZWRfZ3Bpb19jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KKworCS8qIEluc3RhbGwgaGFuZGxlciBmb3IgR1BJTz49MiBlZGdlIGRldGVjdCBpbnRlcnJ1cHRzICovCisJc2V0X2lycV9jaGlwKElSUV9HUElPXzJfeCwgJnB4YV9pbnRlcm5hbF9jaGlwX2xvdyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU9fMl94LCBweGFfZ3Bpb19kZW11eF9oYW5kbGVyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2xlZHMtaWRwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLWlkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmE2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLWlkcC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy1pZHAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBKb2huIERvcnNleSA8am9obitAY3MuY211LmVkdT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVmZiBTdXRoZXJsYW5kIDxqZWZmc0BhY2NlbGVudC5jb20+CisgKgorICogT3JpZ2luYWwgKGxlZHMtZm9vdGJyaWRnZS5jKSBieSBSdXNzZWxsIEtpbmcKKyAqCisgKiBNYWNyb3MgZm9yIGFjdHVhbCBMRUQgbWFuaXB1bGF0aW9uIHNob3VsZCBiZSBpbiBtYWNoaW5lIHNwZWNpZmljCisgKiBmaWxlcyBpbiB0aGlzICdtYWNoJyBkaXJlY3RvcnkuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lkcC5oPgorCisjaW5jbHVkZSAibGVkcy5oIgorCisjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECTEKKyNkZWZpbmUgTEVEX1NUQVRFX0NMQUlNRUQJMgorCitzdGF0aWMgdW5zaWduZWQgaW50IGxlZF9zdGF0ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdfbGVkX3N0YXRlOworCit2b2lkIGlkcF9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3dpdGNoIChldnQpIHsKKwljYXNlIGxlZF9zdGFydDoKKwkJaHdfbGVkX3N0YXRlID0gSURQX0hCX0xFRCB8IElEUF9CVVNZX0xFRDsKKwkJbGVkX3N0YXRlID0gTEVEX1NUQVRFX0VOQUJMRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfc3RvcDoKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9jbGFpbToKKwkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSBJRFBfSEJfTEVEIHwgSURQX0JVU1lfTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlbGVhc2U6CisJCWxlZF9zdGF0ZSAmPSB+TEVEX1NUQVRFX0NMQUlNRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IElEUF9IQl9MRUQgfCBJRFBfQlVTWV9MRUQ7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKKwljYXNlIGxlZF90aW1lcjoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlIF49IElEUF9IQl9MRUQ7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgJj0gfklEUF9CVVNZX0xFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlIHw9IElEUF9CVVNZX0xFRDsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgbGVkX2hhbHRlZDoKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9ncmVlbl9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IElEUF9IQl9MRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfZ3JlZW5fb2ZmOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfklEUF9IQl9MRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfYW1iZXJfb246CisJCWJyZWFrOworCisJY2FzZSBsZWRfYW1iZXJfb2ZmOgorCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IElEUF9CVVNZX0xFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWRfb2ZmOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfklEUF9CVVNZX0xFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKQorCQlJRFBfQ1BMRF9MRURfQ09OVFJPTCA9ICggKElEUF9DUExEX0xFRF9DT05UUk9MIHwgSURQX0xFRFNfTUFTSykgJiB+aHdfbGVkX3N0YXRlKTsKKwllbHNlCisJCUlEUF9DUExEX0xFRF9DT05UUk9MIHw9IElEUF9MRURTX01BU0s7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLWx1YmJvY2suYyBiL2FyY2gvYXJtL21hY2gtcHhhL2xlZHMtbHViYm9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2Y1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLWx1YmJvY2suYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL2xlZHMtbHViYm9jay5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIEpvaG4gRG9yc2V5IDxqb2huK0Bjcy5jbXUuZWR1PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBKZWZmIFN1dGhlcmxhbmQgPGplZmZzQGFjY2VsZW50LmNvbT4KKyAqCisgKiBPcmlnaW5hbCAobGVkcy1mb290YnJpZGdlLmMpIGJ5IFJ1c3NlbGwgS2luZworICoKKyAqIE1ham9yIHN1cmdlcnkgb24gQXByaWwgMjAwNCBieSBOaWNvbGFzIFBpdHJlIGZvciBsZXNzIGdsb2JhbAorICogbmFtZXNwYWNlIGNvbGxpc2lvbi4gIE1vc3RseSBhZGFwdGVkIHRoZSBNYWluc3RvbmUgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9sdWJib2NrLmg+CisKKyNpbmNsdWRlICJsZWRzLmgiCisKKy8qCisgKiA4IGRpc2NyZXRlIGxlZHMgYXZhaWxhYmxlIGZvciBnZW5lcmFsIHVzZToKKyAqCisgKiBOb3RlOiBiaXRzIFsxNS04XSBhcmUgdXNlZCB0byBlbmFibGUvYmxhbmsgdGhlIDggNyBzZWdtZW50IGhleCBkaXNwbGF5cworICogc28gYmUgc3VyZSB0byBub3QgbW9ua2V5IHdpdGggdGhlbSBoZXJlLgorICovCisKKyNkZWZpbmUgRDI4CQkJKDEgPDwgMCkKKyNkZWZpbmUgRDI3CQkJKDEgPDwgMSkKKyNkZWZpbmUgRDI2CQkJKDEgPDwgMikKKyNkZWZpbmUgRDI1CQkJKDEgPDwgMykKKyNkZWZpbmUgRDI0CQkJKDEgPDwgNCkKKyNkZWZpbmUgRDIzCQkJKDEgPDwgNSkKKyNkZWZpbmUgRDIyCQkJKDEgPDwgNikKKyNkZWZpbmUgRDIxCQkJKDEgPDwgNykKKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKKworc3RhdGljIHVuc2lnbmVkIGludCBsZWRfc3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2xlZF9zdGF0ZTsKKwordm9pZCBsdWJib2NrX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzd2l0Y2ggKGV2dCkgeworCWNhc2UgbGVkX3N0YXJ0OgorCQlod19sZWRfc3RhdGUgPSAwOworCQlsZWRfc3RhdGUgPSBMRURfU1RBVEVfRU5BQkxFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9zdG9wOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9FTkFCTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX2NsYWltOgorCQlsZWRfc3RhdGUgfD0gTEVEX1NUQVRFX0NMQUlNRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVsZWFzZToKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfTEVEU19USU1FUgorCWNhc2UgbGVkX3RpbWVyOgorCQlod19sZWRfc3RhdGUgXj0gRDI2OworCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xFRFNfQ1BVCisJY2FzZSBsZWRfaWRsZV9zdGFydDoKKwkJaHdfbGVkX3N0YXRlICY9IH5EMjc7CisJCWJyZWFrOworCisJY2FzZSBsZWRfaWRsZV9lbmQ6CisJCWh3X2xlZF9zdGF0ZSB8PSBEMjc7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIGxlZF9oYWx0ZWQ6CisJCWJyZWFrOworCisJY2FzZSBsZWRfZ3JlZW5fb246CisJCWh3X2xlZF9zdGF0ZSB8PSBEMjE7CisJCWJyZWFrOworCisJY2FzZSBsZWRfZ3JlZW5fb2ZmOgorCQlod19sZWRfc3RhdGUgJj0gfkQyMTsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9hbWJlcl9vbjoKKwkJaHdfbGVkX3N0YXRlIHw9IEQyMjsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9hbWJlcl9vZmY6CisJCWh3X2xlZF9zdGF0ZSAmPSB+RDIyOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vbjoKKwkJaHdfbGVkX3N0YXRlIHw9IEQyMzsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWRfb2ZmOgorCQlod19sZWRfc3RhdGUgJj0gfkQyMzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKQorCQlMVUJfRElTQ19CTE5LX0xFRCA9IChMVUJfRElTQ19CTE5LX0xFRCB8IDB4ZmYpICYgfmh3X2xlZF9zdGF0ZTsKKwllbHNlCisJCUxVQl9ESVNDX0JMTktfTEVEIHw9IDB4ZmY7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLW1haW5zdG9uZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy1tYWluc3RvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQzZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy1tYWluc3RvbmUuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL2xlZHMtbWFpbnN0b25lLmMKKyAqCisgKiBBdXRob3I6ICAgICBOaWNvbGFzIFBpdHJlCisgKiBDcmVhdGVkOiAgICBOb3YgMDUsIDIwMDIKKyAqIENvcHlyaWdodDogIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tYWluc3RvbmUuaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworCisvKiA4IGRpc2NyZXRlIGxlZHMgYXZhaWxhYmxlIGZvciBnZW5lcmFsIHVzZTogKi8KKyNkZWZpbmUgRDI4CQkJKDEgPDwgMCkKKyNkZWZpbmUgRDI3CQkJKDEgPDwgMSkKKyNkZWZpbmUgRDI2CQkJKDEgPDwgMikKKyNkZWZpbmUgRDI1CQkJKDEgPDwgMykKKyNkZWZpbmUgRDI0CQkJKDEgPDwgNCkKKyNkZWZpbmUgRDIzCQkJKDEgPDwgNSkKKyNkZWZpbmUgRDIyCQkJKDEgPDwgNikKKyNkZWZpbmUgRDIxCQkJKDEgPDwgNykKKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKKworc3RhdGljIHVuc2lnbmVkIGludCBsZWRfc3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2xlZF9zdGF0ZTsKKwordm9pZCBtYWluc3RvbmVfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXN3aXRjaCAoZXZ0KSB7CisJY2FzZSBsZWRfc3RhcnQ6CisJCWh3X2xlZF9zdGF0ZSA9IDA7CisJCWxlZF9zdGF0ZSA9IExFRF9TVEFURV9FTkFCTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX3N0b3A6CisJCWxlZF9zdGF0ZSAmPSB+TEVEX1NUQVRFX0VOQUJMRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfY2xhaW06CisJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWxlYXNlOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSAwOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19MRURTX1RJTUVSCisJY2FzZSBsZWRfdGltZXI6CisJCWh3X2xlZF9zdGF0ZSBePSBEMjY7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlod19sZWRfc3RhdGUgJj0gfkQyNzsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJaHdfbGVkX3N0YXRlIHw9IEQyNzsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgbGVkX2hhbHRlZDoKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9ncmVlbl9vbjoKKwkJaHdfbGVkX3N0YXRlIHw9IEQyMTs7CisJCWJyZWFrOworCisJY2FzZSBsZWRfZ3JlZW5fb2ZmOgorCQlod19sZWRfc3RhdGUgJj0gfkQyMTsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9hbWJlcl9vbjoKKwkJaHdfbGVkX3N0YXRlIHw9IEQyMjs7CisJCWJyZWFrOworCisJY2FzZSBsZWRfYW1iZXJfb2ZmOgorCQlod19sZWRfc3RhdGUgJj0gfkQyMjsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWRfb246CisJCWh3X2xlZF9zdGF0ZSB8PSBEMjM7OworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vZmY6CisJCWh3X2xlZF9zdGF0ZSAmPSB+RDIzOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmICAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpCisJCU1TVF9MRURDVFJMID0gKE1TVF9MRURDVFJMIHwgMHhmZikgJiB+aHdfbGVkX3N0YXRlOworCWVsc2UKKwkJTVNUX0xFRENUUkwgfD0gMHhmZjsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2xlZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU0ZDVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLmMKKyAqCisgKiB4c2NhbGUgTEVEcyBkaXNwYXRjaGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIE5pY29sYXMgUGl0cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVmZiBTdXRoZXJsYW5kLCBBY2NlbGVudCBTeXN0ZW1zIEluYy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSAibGVkcy5oIgorCitzdGF0aWMgaW50IF9faW5pdAorcHhhX2xlZHNfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX2x1YmJvY2soKSkKKwkJbGVkc19ldmVudCA9IGx1YmJvY2tfbGVkc19ldmVudDsKKwlpZiAobWFjaGluZV9pc19tYWluc3RvbmUoKSkKKwkJbGVkc19ldmVudCA9IG1haW5zdG9uZV9sZWRzX2V2ZW50OworCWlmIChtYWNoaW5lX2lzX3B4YV9pZHAoKSkKKwkJbGVkc19ldmVudCA9IGlkcF9sZWRzX2V2ZW50OworCisJbGVkc19ldmVudChsZWRfc3RhcnQpOworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKHB4YV9sZWRzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OGY2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9sZWRzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVmZiBTdXRoZXJsYW5kLCBBY2NlbGVudCBTeXN0ZW1zIEluYy4KKyAqCisgKiBibGlua3kgbGlnaHRzIGZvciB2YXJpb3VzIFBYQS1iYXNlZCBzeXN0ZW1zOgorICoKKyAqLworCitleHRlcm4gdm9pZCBpZHBfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpOworZXh0ZXJuIHZvaWQgbHViYm9ja19sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBtYWluc3RvbmVfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDEyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCisgKgorICogIFN1cHBvcnQgZm9yIHRoZSBJbnRlbCBEQlBYQTI1MCBEZXZlbG9wbWVudCBQbGF0Zm9ybS4KKyAqCisgKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiAgQ3JlYXRlZDoJSnVuIDE1LCAyMDAxCisgKiAgQ29weXJpZ2h0OglNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbHViYm9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VkYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YWZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbW1jLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKworI2RlZmluZSBMVUJfTUlTQ19XUgkJX19MVUJfUkVHKExVQkJPQ0tfRlBHQV9QSFlTICsgMHgwODApCisKK3ZvaWQgbHViYm9ja19zZXRfbWlzY193cih1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCUxVQl9NSVNDX1dSID0gKExVQl9NSVNDX1dSICYgfm1hc2spIHwgKHNldCAmIG1hc2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobHViYm9ja19zZXRfbWlzY193cik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGx1YmJvY2tfaXJxX2VuYWJsZWQ7CisKK3N0YXRpYyB2b2lkIGx1YmJvY2tfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgbHViYm9ja19pcnEgPSAoaXJxIC0gTFVCQk9DS19JUlEoMCkpOworCUxVQl9JUlFfTUFTS19FTiA9IChsdWJib2NrX2lycV9lbmFibGVkICY9IH4oMSA8PCBsdWJib2NrX2lycSkpOworfQorCitzdGF0aWMgdm9pZCBsdWJib2NrX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgbHViYm9ja19pcnEgPSAoaXJxIC0gTFVCQk9DS19JUlEoMCkpOworCS8qIHRoZSBpcnEgY2FuIGJlIGFja25vd2xlZGdlZCBvbmx5IGlmIGRlYXNzZXJ0ZWQsIHNvIGl0J3MgZG9uZSBoZXJlICovCisJTFVCX0lSUV9TRVRfQ0xSICY9IH4oMSA8PCBsdWJib2NrX2lycSk7CisJTFVCX0lSUV9NQVNLX0VOID0gKGx1YmJvY2tfaXJxX2VuYWJsZWQgfD0gKDEgPDwgbHViYm9ja19pcnEpKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGx1YmJvY2tfaXJxX2NoaXAgPSB7CisJLmFjawkJPSBsdWJib2NrX21hc2tfaXJxLAorCS5tYXNrCQk9IGx1YmJvY2tfbWFza19pcnEsCisJLnVubWFzawkJPSBsdWJib2NrX3VubWFza19pcnEsCit9OworCitzdGF0aWMgdm9pZCBsdWJib2NrX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgcGVuZGluZyA9IExVQl9JUlFfU0VUX0NMUiAmIGx1YmJvY2tfaXJxX2VuYWJsZWQ7CisJZG8geworCQlHRURSKDApID0gR1BJT19iaXQoMCk7CS8qIGNsZWFyIG91ciBwYXJlbnQgaXJxICovCisJCWlmIChsaWtlbHkocGVuZGluZykpIHsKKwkJCWlycSA9IExVQkJPQ0tfSVJRKDApICsgX19mZnMocGVuZGluZyk7CisJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJfQorCQlwZW5kaW5nID0gTFVCX0lSUV9TRVRfQ0xSICYgbHViYm9ja19pcnFfZW5hYmxlZDsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGx1YmJvY2tfaW5pdF9pcnEodm9pZCkKK3sKKwlpbnQgaXJxOworCisJcHhhX2luaXRfaXJxKCk7CisKKwkvKiBzZXR1cCBleHRyYSBsdWJib2NrIGlycXMgKi8KKwlmb3IgKGlycSA9IExVQkJPQ0tfSVJRKDApOyBpcnEgPD0gTFVCQk9DS19MQVNUX0lSUTsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJmx1YmJvY2tfaXJxX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9HUElPKDApLCBsdWJib2NrX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX3R5cGUoSVJRX0dQSU8oMCksIElSUVRfRkFMTElORyk7Cit9CisKK3N0YXRpYyBpbnQgbHViYm9ja191ZGNfaXNfY29ubmVjdGVkKHZvaWQpCit7CisJcmV0dXJuIChMVUJfTUlTQ19SRCAmICgxIDw8IDkpKSA9PSAwOworfQorCitzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIHVkY19pbmZvIF9faW5pdGRhdGEgPSB7CisJLnVkY19pc19jb25uZWN0ZWQJPSBsdWJib2NrX3VkY19pc19jb25uZWN0ZWQsCisJLy8gbm8gRCsgcHVsbHVwOyBsdWJib2NrIGNhbid0IGNvbm5lY3QvZGlzY29ubmVjdCBpbiBzb2Z0d2FyZQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYTExMTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDEwMDAwMDAwLAorCQkuZW5kCT0gMHgxMDAwMWZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IExVQkJPQ0tfU0ExMTExX0lSUSwKKwkJLmVuZAk9IExVQkJPQ0tfU0ExMTExX0lSUSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhMTExMV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNhMTExMSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzYTExMTFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzYTExMTFfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJzbWM5MXgtcmVncyIsCisJCS5zdGFydAk9IDB4MGMwMDAwMDAsCisJCS5lbmQJPSAweDBjMGZmZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gTFVCQk9DS19FVEhfSVJRLAorCQkuZW5kCT0gTFVCQk9DS19FVEhfSVJRLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLm5hbWUJPSAic21jOTF4LWF0dHJpYiIsCisJCS5zdGFydAk9IDB4MGUwMDAwMDAsCisJCS5lbmQJPSAweDBlMGZmZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic21jOTF4IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNhMTExMV9kZXZpY2UsCisJJnNtYzkxeF9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBzaGFycF9sbTh2MzEgX19pbml0ZGF0YSA9IHsKKwkucGl4Y2xvY2sJPSAyNzAwMDAsCisJLnhyZXMJCT0gNjQwLAorCS55cmVzCQk9IDQ4MCwKKwkuYnBwCQk9IDE2LAorCS5oc3luY19sZW4JPSAxLAorCS5sZWZ0X21hcmdpbgk9IDMsCisJLnJpZ2h0X21hcmdpbgk9IDMsCisJLnZzeW5jX2xlbgk9IDEsCisJLnVwcGVyX21hcmdpbgk9IDAsCisJLmxvd2VyX21hcmdpbgk9IDAsCisJLnN5bmMJCT0gRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJLmNtYXBfZ3JleXNjYWxlCT0gMCwKKwkuY21hcF9pbnZlcnNlCT0gMCwKKwkuY21hcF9zdGF0aWMJPSAwLAorCS5sY2NyMAkJPSBMQ0NSMF9TRFMsCisJLmxjY3IzCQk9IExDQ1IzX1BDUCB8IExDQ1IzX0FjYigyNTUpLAorfTsKKworc3RhdGljIGludCBsdWJib2NrX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxcmV0dXJuX3QgKCpsdWJib2NrX2RldGVjdF9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdm9pZCAqZGF0YSkKK3sKKwkvKiBzZXR1cCBHUElPIGZvciBQWEEyNXggTU1DIGNvbnRyb2xsZXIJKi8KKwlweGFfZ3Bpb19tb2RlKEdQSU82X01NQ0NMS19NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPOF9NTUNDUzBfTUQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgbHViYm9ja19tY2lfcGxhdGZvcm1fZGF0YSA9IHsKKwkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLmluaXQgCQk9IGx1YmJvY2tfbWNpX2luaXQsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbHViYm9ja19pbml0KHZvaWQpCit7CisJcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOworCXNldF9weGFfZmJfaW5mbygmc2hhcnBfbG04djMxKTsKKwlweGFfc2V0X21jaV9pbmZvKCZsdWJib2NrX21jaV9wbGF0Zm9ybV9kYXRhKTsKKwkodm9pZCkgcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbHViYm9ja19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAgeyBMVUJCT0NLX0ZQR0FfVklSVCwgTFVCQk9DS19GUEdBX1BIWVMsIDB4MDAxMDAwMDAsIE1UX0RFVklDRSB9LCAvKiBDUExEICovCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbHViYm9ja19tYXBfaW8odm9pZCkKK3sKKwlweGFfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KGx1YmJvY2tfaW9fZGVzYywgQVJSQVlfU0laRShsdWJib2NrX2lvX2Rlc2MpKTsKKworCS8qIFRoaXMgZW5hYmxlcyB0aGUgQlRVQVJUICovCisJcHhhX2dwaW9fbW9kZShHUElPNDJfQlRSWERfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzQzX0JUVFhEX01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU80NF9CVENUU19NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPNDVfQlRSVFNfTUQpOworCisJLyogVGhpcyBpcyBmb3IgdGhlIFNNQyBjaGlwIHNlbGVjdCAqLworCXB4YV9ncGlvX21vZGUoR1BJTzc5X25DU18zX01EKTsKKworCS8qIHNldHVwIHNsZWVwIG1vZGUgdmFsdWVzICovCisJUFdFUiAgPSAweDAwMDAwMDAyOworCVBGRVIgID0gMHgwMDAwMDAwMDsKKwlQUkVSICA9IDB4MDAwMDAwMDI7CisJUEdTUjAgPSAweDAwMDA4MDAwOworCVBHU1IxID0gMHgwMDNGMDIwMjsKKwlQR1NSMiA9IDB4MDAwMUMwMDA7CisJUENGUiB8PSBQQ0ZSX09QREU7Cit9CisKK01BQ0hJTkVfU1RBUlQoTFVCQk9DSywgIkludGVsIERCUFhBMjUwIERldmVsb3BtZW50IFBsYXRmb3JtIChha2EgTHViYm9jaykiKQorCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLiIpCisJQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQorCU1BUElPKGx1YmJvY2tfbWFwX2lvKQorCUlOSVRJUlEobHViYm9ja19pbml0X2lycSkKKwkudGltZXIJCT0gJnB4YV90aW1lciwKKwlJTklUX01BQ0hJTkUobHViYm9ja19pbml0KQorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5NTIyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisgKgorICogIFN1cHBvcnQgZm9yIHRoZSBJbnRlbCBIQ0REQkJWQTAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0uCisgKiAgKGdvIGZpZ3VyZSBob3cgdGhleSBjYW1lIHVwIHdpdGggc3VjaCBuYW1lLi4uKQorICoKKyAqICBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqICBDcmVhdGVkOglOb3YgMDUsIDIwMDIKKyAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21haW5zdG9uZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F1ZGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhZmIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tbWMuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWluc3RvbmVfaXJxX2VuYWJsZWQ7CisKK3N0YXRpYyB2b2lkIG1haW5zdG9uZV9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBtYWluc3RvbmVfaXJxID0gKGlycSAtIE1BSU5TVE9ORV9JUlEoMCkpOworCU1TVF9JTlRNU0tFTkEgPSAobWFpbnN0b25lX2lycV9lbmFibGVkICY9IH4oMSA8PCBtYWluc3RvbmVfaXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1haW5zdG9uZV91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IG1haW5zdG9uZV9pcnEgPSAoaXJxIC0gTUFJTlNUT05FX0lSUSgwKSk7CisJLyogdGhlIGlycSBjYW4gYmUgYWNrbm93bGVkZ2VkIG9ubHkgaWYgZGVhc3NlcnRlZCwgc28gaXQncyBkb25lIGhlcmUgKi8KKwlNU1RfSU5UU0VUQ0xSICY9IH4oMSA8PCBtYWluc3RvbmVfaXJxKTsKKwlNU1RfSU5UTVNLRU5BID0gKG1haW5zdG9uZV9pcnFfZW5hYmxlZCB8PSAoMSA8PCBtYWluc3RvbmVfaXJxKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBtYWluc3RvbmVfaXJxX2NoaXAgPSB7CisJLmFjawkJPSBtYWluc3RvbmVfbWFza19pcnEsCisJLm1hc2sJCT0gbWFpbnN0b25lX21hc2tfaXJxLAorCS51bm1hc2sJCT0gbWFpbnN0b25lX3VubWFza19pcnEsCit9OworCisKK3N0YXRpYyB2b2lkIG1haW5zdG9uZV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgcGVuZGluZyA9IE1TVF9JTlRTRVRDTFIgJiBtYWluc3RvbmVfaXJxX2VuYWJsZWQ7CisJZG8geworCQlHRURSKDApID0gR1BJT19iaXQoMCk7ICAvKiBjbGVhciB1c2VsZXNzIGVkZ2Ugbm90aWZpY2F0aW9uICovCisJCWlmIChsaWtlbHkocGVuZGluZykpIHsKKwkJCWlycSA9IE1BSU5TVE9ORV9JUlEoMCkgKyBfX2ZmcyhwZW5kaW5nKTsKKwkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkJCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQl9CisJCXBlbmRpbmcgPSBNU1RfSU5UU0VUQ0xSICYgbWFpbnN0b25lX2lycV9lbmFibGVkOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbWFpbnN0b25lX2luaXRfaXJxKHZvaWQpCit7CisJaW50IGlycTsKKworCXB4YV9pbml0X2lycSgpOworCisJLyogc2V0dXAgZXh0cmEgTWFpbnN0b25lIGlycXMgKi8KKwlmb3IoaXJxID0gTUFJTlNUT05FX0lSUSgwKTsgaXJxIDw9IE1BSU5TVE9ORV9JUlEoMTUpOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmbWFpbnN0b25lX2lycV9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwl9CisJc2V0X2lycV9mbGFncyhNQUlOU1RPTkVfSVJRKDgpLCAwKTsKKwlzZXRfaXJxX2ZsYWdzKE1BSU5TVE9ORV9JUlEoMTIpLCAwKTsKKworCU1TVF9JTlRNU0tFTkEgPSAwOworCU1TVF9JTlRTRVRDTFIgPSAwOworCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU8oMCksIG1haW5zdG9uZV9pcnFfaGFuZGxlcik7CisJc2V0X2lycV90eXBlKElSUV9HUElPKDApLCBJUlFUX0ZBTExJTkcpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gKE1TVF9FVEhfUEhZUyArIDB4MzAwKSwKKwkJLmVuZAk9IChNU1RfRVRIX1BIWVMgKyAweGZmZmZmKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IE1BSU5TVE9ORV9JUlEoMyksCisJCS5lbmQJPSBNQUlOU1RPTkVfSVJRKDMpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIGludCBtc3RfYXVkaW9fc3RhcnR1cChzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIHZvaWQgKnByaXYpCit7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCU1TVF9NU0NXUjIgJj0gfk1TVF9NU0NXUjJfQUM5N19TUEtST0ZGOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtc3RfYXVkaW9fc2h1dGRvd24oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCB2b2lkICpwcml2KQoreworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlNU1RfTVNDV1IyIHw9IE1TVF9NU0NXUjJfQUM5N19TUEtST0ZGOworfQorCitzdGF0aWMgbG9uZyBtc3RfYXVkaW9fc3VzcGVuZF9tYXNrOworCitzdGF0aWMgdm9pZCBtc3RfYXVkaW9fc3VzcGVuZCh2b2lkICpwcml2KQoreworCW1zdF9hdWRpb19zdXNwZW5kX21hc2sgPSBNU1RfTVNDV1IyOworCU1TVF9NU0NXUjIgfD0gTVNUX01TQ1dSMl9BQzk3X1NQS1JPRkY7Cit9CisKK3N0YXRpYyB2b2lkIG1zdF9hdWRpb19yZXN1bWUodm9pZCAqcHJpdikKK3sKKwlNU1RfTVNDV1IyICY9IG1zdF9hdWRpb19zdXNwZW5kX21hc2sgfCB+TVNUX01TQ1dSMl9BQzk3X1NQS1JPRkY7Cit9CisKK3N0YXRpYyBweGEyeHhfYXVkaW9fb3BzX3QgbXN0X2F1ZGlvX29wcyA9IHsKKwkuc3RhcnR1cAk9IG1zdF9hdWRpb19zdGFydHVwLAorCS5zaHV0ZG93bgk9IG1zdF9hdWRpb19zaHV0ZG93biwKKwkuc3VzcGVuZAk9IG1zdF9hdWRpb19zdXNwZW5kLAorCS5yZXN1bWUJCT0gbXN0X2F1ZGlvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zdF9hdWRpb19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInB4YTJ4eC1hYzk3IiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7IC5wbGF0Zm9ybV9kYXRhID0gJm1zdF9hdWRpb19vcHMgfSwKK307CisKK3N0YXRpYyB2b2lkIG1haW5zdG9uZV9iYWNrbGlnaHRfcG93ZXIoaW50IG9uKQoreworCWlmIChvbikgeworCQlweGFfZ3Bpb19tb2RlKEdQSU8xNl9QV00wX01EKTsKKwkJcHhhX3NldF9ja2VuKENLRU4wX1BXTTAsIDEpOworCQlQV01fQ1RSTDAgPSAwOworCQlQV01fUFdEVVRZMCA9IDB4M2ZmOworCQlQV01fUEVSVkFMMCA9IDB4M2ZmOworCX0gZWxzZSB7CisJCVBXTV9DVFJMMCA9IDA7CisJCVBXTV9QV0RVVFkwID0gMHgwOworCQlQV01fUEVSVkFMMCA9IDB4M0ZGOworCQlweGFfc2V0X2NrZW4oQ0tFTjBfUFdNMCwgMCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyB0b3NoaWJhX2x0bTA0YzM4MGsgX19pbml0ZGF0YSA9IHsKKwkucGl4Y2xvY2sJCT0gNTAwMDAsCisJLnhyZXMJCQk9IDY0MCwKKwkueXJlcwkJCT0gNDgwLAorCS5icHAJCQk9IDE2LAorCS5oc3luY19sZW4JCT0gMSwKKwkubGVmdF9tYXJnaW4JCT0gMHg5ZiwKKwkucmlnaHRfbWFyZ2luCQk9IDEsCisJLnZzeW5jX2xlbgkJPSA0NCwKKwkudXBwZXJfbWFyZ2luCQk9IDAsCisJLmxvd2VyX21hcmdpbgkJPSAwLAorCS5zeW5jCQkJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJLmxjY3IwCQkJPSBMQ0NSMF9BY3QsCisJLmxjY3IzCQkJPSBMQ0NSM19QQ1AsCisJLnB4YWZiX2JhY2tsaWdodF9wb3dlcgk9IG1haW5zdG9uZV9iYWNrbGlnaHRfcG93ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyB0b3NoaWJhX2x0bTAzNWE3NzZjIF9faW5pdGRhdGEgPSB7CisJLnBpeGNsb2NrCQk9IDExMDAwMCwKKwkueHJlcwkJCT0gMjQwLAorCS55cmVzCQkJPSAzMjAsCisJLmJwcAkJCT0gMTYsCisJLmhzeW5jX2xlbgkJPSA0LAorCS5sZWZ0X21hcmdpbgkJPSA4LAorCS5yaWdodF9tYXJnaW4JCT0gMjAsCisJLnZzeW5jX2xlbgkJPSAzLAorCS51cHBlcl9tYXJnaW4JCT0gMSwKKwkubG93ZXJfbWFyZ2luCQk9IDEwLAorCS5zeW5jCQkJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJLmxjY3IwCQkJPSBMQ0NSMF9BY3QsCisJLmxjY3IzCQkJPSBMQ0NSM19QQ1AsCisJLnB4YWZiX2JhY2tsaWdodF9wb3dlcgk9IG1haW5zdG9uZV9iYWNrbGlnaHRfcG93ZXIsCit9OworCitzdGF0aWMgaW50IG1haW5zdG9uZV9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycXJldHVybl90ICgqbXN0b25lX2RldGVjdF9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyOworCisJLyoKKwkgKiBzZXR1cCBHUElPIGZvciBQWEEyN3ggTU1DIGNvbnRyb2xsZXIKKwkgKi8KKwlweGFfZ3Bpb19tb2RlKEdQSU8zMl9NTUNDTEtfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzExMl9NTUNDTURfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzkyX01NQ0RBVDBfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzEwOV9NTUNEQVQxX01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU8xMTBfTU1DREFUMl9NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPMTExX01NQ0RBVDNfTUQpOworCisJLyogbWFrZSBzdXJlIFNEL01lbW9yeSBTdGljayBtdWx0aXBsZXhlcidzIHNpZ25hbHMKKwkgKiBhcmUgcm91dGVkIHRvIE1NQyBjb250cm9sbGVyCisJICovCisJTVNUX01TQ1dSMSAmPSB+TVNUX01TQ1dSMV9NU19TRUw7CisKKwllcnIgPSByZXF1ZXN0X2lycShNQUlOU1RPTkVfTU1DX0lSUSwgbXN0b25lX2RldGVjdF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJCSAgICAgIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWluc3RvbmVfbWNpX2luaXQ6IE1NQy9TRDogY2FuJ3QgcmVxdWVzdCBNTUMgY2FyZCBkZXRlY3QgSVJRXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYWluc3RvbmVfbWNpX3NldHBvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZkZCkKK3sKKwlzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEqIHBfZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlmICgoIDEgPDwgdmRkKSAmIHBfZC0+b2NyX21hc2spIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJTVNUX01TQ1dSMSB8PSBNU1RfTVNDV1IxX01NQ19PTjsKKwkJTVNUX01TQ1dSMSAmPSB+TVNUX01TQ1dSMV9NU19TRUw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvZmZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCU1TVF9NU0NXUjEgJj0gfk1TVF9NU0NXUjFfTU1DX09OOworCX0KK30KKworc3RhdGljIHZvaWQgbWFpbnN0b25lX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlmcmVlX2lycShNQUlOU1RPTkVfTU1DX0lSUSwgZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgbWFpbnN0b25lX21jaV9wbGF0Zm9ybV9kYXRhID0geworCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuaW5pdCAJCT0gbWFpbnN0b25lX21jaV9pbml0LAorCS5zZXRwb3dlciAJPSBtYWluc3RvbmVfbWNpX3NldHBvd2VyLAorCS5leGl0CQk9IG1haW5zdG9uZV9tY2lfZXhpdCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtYWluc3RvbmVfaW5pdCh2b2lkKQoreworCS8qCisJICogT24gTWFpbnN0b25lLCB3ZSByb3V0ZSBBQzk3X1NZU0NMSyB2aWEgR1BJTzQ1IHRvCisJICogdGhlIGF1ZGlvIGRhdWdodGVyIGNhcmQKKwkgKi8KKwlweGFfZ3Bpb19tb2RlKEdQSU80NV9TWVNDTEtfQUM5N19NRCk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXN0X2F1ZGlvX2RldmljZSk7CisKKwkvKiByZWFkaW5nIE1haW5zdG9uZSdzICJWaXJ0dWFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIiCisJICAgbWlnaHQgYmUgaGFuZHkgdG8gc2VsZWN0IExDRCB0eXBlIGhlcmUgKi8KKwlpZiAoMCkKKwkJc2V0X3B4YV9mYl9pbmZvKCZ0b3NoaWJhX2x0bTA0YzM4MGspOworCWVsc2UKKwkJc2V0X3B4YV9mYl9pbmZvKCZ0b3NoaWJhX2x0bTAzNWE3NzZjKTsKKworCXB4YV9zZXRfbWNpX2luZm8oJm1haW5zdG9uZV9tY2lfcGxhdGZvcm1fZGF0YSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBtYWluc3RvbmVfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgIHsgTVNUX0ZQR0FfVklSVCwgTVNUX0ZQR0FfUEhZUywgMHgwMDEwMDAwMCwgTVRfREVWSUNFIH0sIC8qIENQTEQgKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtYWluc3RvbmVfbWFwX2lvKHZvaWQpCit7CisJcHhhX21hcF9pbygpOworCWlvdGFibGVfaW5pdChtYWluc3RvbmVfaW9fZGVzYywgQVJSQVlfU0laRShtYWluc3RvbmVfaW9fZGVzYykpOworCisJLyogaW5pdGlhbGl6ZSBzbGVlcCBtb2RlIHJlZ3MgKHdha2UtdXAgc291cmNlcywgZXRjKSAqLworCVBHU1IwID0gMHgwMDAwODgwMDsKKwlQR1NSMSA9IDB4MDAwMDAwMDI7CisJUEdTUjIgPSAweDAwMDFGQzAwOworCVBHU1IzID0gMHgwMDAwMUY4MTsKKwlQV0VSICA9IDB4QzAwMDAwMDI7CisJUFJFUiAgPSAweDAwMDAwMDAyOworCVBGRVIgID0gMHgwMDAwMDAwMjsKK30KKworTUFDSElORV9TVEFSVChNQUlOU1RPTkUsICJJbnRlbCBIQ0REQkJWQTAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0gKGFrYSBNYWluc3RvbmUpIikKKwlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlIEluYy4iKQorCUJPT1RfTUVNKDB4YTAwMDAwMDAsIDB4NDAwMDAwMDAsIGlvX3AydigweDQwMDAwMDAwKSkKKwlNQVBJTyhtYWluc3RvbmVfbWFwX2lvKQorCUlOSVRJUlEobWFpbnN0b25lX2luaXRfaXJxKQorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAorCUlOSVRfTUFDSElORShtYWluc3RvbmVfaW5pdCkKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wbS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE0YmYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG0uYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIFBYQTI1MC8yMTAgUG93ZXIgTWFuYWdlbWVudCBSb3V0aW5lcworICoKKyAqIE9yaWdpbmFsIGNvZGUgZm9yIHRoZSBTQTExeDA6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQ2xpZmYgQnJha2UgPGNicmFrZUBhY2NlbGVudC5jb20+CisgKgorICogTW9kaWZpZWQgZm9yIHRoZSBQWEEyNTAgYnkgTmljb2xhcyBQaXRyZToKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9sdWJib2NrLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisKKy8qCisgKiBEZWJ1ZyBtYWNyb3MKKyAqLworI3VuZGVmIERFQlVHCisKK2V4dGVybiB2b2lkIHB4YV9jcHVfc3VzcGVuZCh2b2lkKTsKK2V4dGVybiB2b2lkIHB4YV9jcHVfcmVzdW1lKHZvaWQpOworCisjZGVmaW5lIFNBVkUoeCkJCXNsZWVwX3NhdmVbU0xFRVBfU0FWRV8jI3hdID0geAorI2RlZmluZSBSRVNUT1JFKHgpCXggPSBzbGVlcF9zYXZlW1NMRUVQX1NBVkVfIyN4XQorCisjZGVmaW5lIFJFU1RPUkVfR1BMRVZFTChuKSBkbyB7IFwKKwlHUFNSIyNuID0gc2xlZXBfc2F2ZVtTTEVFUF9TQVZFX0dQTFIjI25dOyBcCisJR1BDUiMjbiA9IH5zbGVlcF9zYXZlW1NMRUVQX1NBVkVfR1BMUiMjbl07IFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBMaXN0IG9mIGdsb2JhbCBQWEEgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gcHJlc2VydmUuCisgKiBNb3JlIG9uZXMgbGlrZSBDUCBhbmQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIHZhbHVlcyBhcmUgcHJlc2VydmVkCisgKiB3aXRoIHRoZSBzdGFjayBwb2ludGVyIGluIHNsZWVwLlMuCisgKi8KK2VudW0gewlTTEVFUF9TQVZFX1NUQVJUID0gMCwKKworCVNMRUVQX1NBVkVfR1BMUjAsIFNMRUVQX1NBVkVfR1BMUjEsIFNMRUVQX1NBVkVfR1BMUjIsIFNMRUVQX1NBVkVfR1BMUjMsCisJU0xFRVBfU0FWRV9HUERSMCwgU0xFRVBfU0FWRV9HUERSMSwgU0xFRVBfU0FWRV9HUERSMiwgU0xFRVBfU0FWRV9HUERSMywKKwlTTEVFUF9TQVZFX0dSRVIwLCBTTEVFUF9TQVZFX0dSRVIxLCBTTEVFUF9TQVZFX0dSRVIyLCBTTEVFUF9TQVZFX0dSRVIzLAorCVNMRUVQX1NBVkVfR0ZFUjAsIFNMRUVQX1NBVkVfR0ZFUjEsIFNMRUVQX1NBVkVfR0ZFUjIsIFNMRUVQX1NBVkVfR0ZFUjMsCisJU0xFRVBfU0FWRV9QR1NSMCwgU0xFRVBfU0FWRV9QR1NSMSwgU0xFRVBfU0FWRV9QR1NSMiwgU0xFRVBfU0FWRV9QR1NSMywKKworCVNMRUVQX1NBVkVfR0FGUjBfTCwgU0xFRVBfU0FWRV9HQUZSMF9VLAorCVNMRUVQX1NBVkVfR0FGUjFfTCwgU0xFRVBfU0FWRV9HQUZSMV9VLAorCVNMRUVQX1NBVkVfR0FGUjJfTCwgU0xFRVBfU0FWRV9HQUZSMl9VLAorCVNMRUVQX1NBVkVfR0FGUjNfTCwgU0xFRVBfU0FWRV9HQUZSM19VLAorCisJU0xFRVBfU0FWRV9QU1RSLAorCisJU0xFRVBfU0FWRV9JQ01SLAorCVNMRUVQX1NBVkVfQ0tFTiwKKworCVNMRUVQX1NBVkVfQ0tTVU0sCisKKwlTTEVFUF9TQVZFX1NJWkUKK307CisKKworc3RhdGljIGludCBweGFfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgc2xlZXBfc2F2ZVtTTEVFUF9TQVZFX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgY2hlY2tzdW0gPSAwOworCXN0cnVjdCB0aW1lc3BlYyBkZWx0YSwgcnRjOworCWludCBpOworCisJaWYgKHN0YXRlICE9IFBNX1NVU1BFTkRfTUVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmZGVmIENPTkZJR19JV01NWFQKKwkvKiBmb3JjZSBhbnkgaVdNTVh0IGNvbnRleHQgdG8gcmFtICoqLworCWl3bW14dF90YXNrX2Rpc2FibGUoTlVMTCk7CisjZW5kaWYKKworCS8qIHByZXNlcnZlIGN1cnJlbnQgdGltZSAqLworCXJ0Yy50dl9zZWMgPSBSQ05SOworCXJ0Yy50dl9uc2VjID0gMDsKKwlzYXZlX3RpbWVfZGVsdGEoJmRlbHRhLCAmcnRjKTsKKworCVNBVkUoR1BMUjApOyBTQVZFKEdQTFIxKTsgU0FWRShHUExSMik7CisJU0FWRShHUERSMCk7IFNBVkUoR1BEUjEpOyBTQVZFKEdQRFIyKTsKKwlTQVZFKEdSRVIwKTsgU0FWRShHUkVSMSk7IFNBVkUoR1JFUjIpOworCVNBVkUoR0ZFUjApOyBTQVZFKEdGRVIxKTsgU0FWRShHRkVSMik7CisJU0FWRShQR1NSMCk7IFNBVkUoUEdTUjEpOyBTQVZFKFBHU1IyKTsKKworCVNBVkUoR0FGUjBfTCk7IFNBVkUoR0FGUjBfVSk7CisJU0FWRShHQUZSMV9MKTsgU0FWRShHQUZSMV9VKTsKKwlTQVZFKEdBRlIyX0wpOyBTQVZFKEdBRlIyX1UpOworCisjaWZkZWYgQ09ORklHX1BYQTI3eAorCVNBVkUoR1BMUjMpOyBTQVZFKEdQRFIzKTsgU0FWRShHUkVSMyk7IFNBVkUoR0ZFUjMpOyBTQVZFKFBHU1IzKTsKKwlTQVZFKEdBRlIzX0wpOyBTQVZFKEdBRlIzX1UpOworI2VuZGlmCisKKwlTQVZFKElDTVIpOworCUlDTVIgPSAwOworCisJU0FWRShDS0VOKTsKKwlDS0VOID0gMDsKKworCVNBVkUoUFNUUik7CisKKwkvKiBOb3RlOiB3YWtlIHVwIHNvdXJjZSBhcmUgc2V0IHVwIGluIGVhY2ggbWFjaGluZSBzcGVjaWZpYyBmaWxlcyAqLworCisJLyogY2xlYXIgR1BJTyB0cmFuc2l0aW9uIGRldGVjdCAgYml0cyAqLworCUdFRFIwID0gR0VEUjA7IEdFRFIxID0gR0VEUjE7IEdFRFIyID0gR0VEUjI7CisjaWZkZWYgQ09ORklHX1BYQTI3eAorCUdFRFIzID0gR0VEUjM7CisjZW5kaWYKKworCS8qIENsZWFyIHNsZWVwIHJlc2V0IHN0YXR1cyAqLworCVJDU1IgPSBSQ1NSX1NNUjsKKworCS8qIHNldCByZXN1bWUgcmV0dXJuIGFkZHJlc3MgKi8KKwlQU1BSID0gdmlydF90b19waHlzKHB4YV9jcHVfcmVzdW1lKTsKKworCS8qIGJlZm9yZSBzbGVlcGluZywgY2FsY3VsYXRlIGFuZCBzYXZlIGEgY2hlY2tzdW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0xFRVBfU0FWRV9TSVpFIC0gMTsgaSsrKQorCQljaGVja3N1bSArPSBzbGVlcF9zYXZlW2ldOworCXNsZWVwX3NhdmVbU0xFRVBfU0FWRV9DS1NVTV0gPSBjaGVja3N1bTsKKworCS8qICoqKiBnbyB6enogKioqICovCisJcHhhX2NwdV9zdXNwZW5kKCk7CisKKwkvKiBhZnRlciBzbGVlcGluZywgdmFsaWRhdGUgdGhlIGNoZWNrc3VtICovCisJY2hlY2tzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBTTEVFUF9TQVZFX1NJWkUgLSAxOyBpKyspCisJCWNoZWNrc3VtICs9IHNsZWVwX3NhdmVbaV07CisKKwkvKiBpZiBpbnZhbGlkLCBkaXNwbGF5IG1lc3NhZ2UgYW5kIHdhaXQgZm9yIGEgaGFyZHdhcmUgcmVzZXQgKi8KKwlpZiAoY2hlY2tzdW0gIT0gc2xlZXBfc2F2ZVtTTEVFUF9TQVZFX0NLU1VNXSkgeworI2lmZGVmIENPTkZJR19BUkNIX0xVQkJPQ0sKKwkJTFVCX0hFWExFRCA9IDB4YmFkYmFkYzU7CisjZW5kaWYKKwkJd2hpbGUgKDEpCisJCQlweGFfY3B1X3N1c3BlbmQoKTsKKwl9CisKKwkvKiBlbnN1cmUgbm90IHRvIGNvbWUgYmFjayBoZXJlIGlmIGl0IHdhc24ndCBpbnRlbmRlZCAqLworCVBTUFIgPSAwOworCisJLyogcmVzdG9yZSByZWdpc3RlcnMgKi8KKwlSRVNUT1JFKEdBRlIwX0wpOyBSRVNUT1JFKEdBRlIwX1UpOworCVJFU1RPUkUoR0FGUjFfTCk7IFJFU1RPUkUoR0FGUjFfVSk7CisJUkVTVE9SRShHQUZSMl9MKTsgUkVTVE9SRShHQUZSMl9VKTsKKwlSRVNUT1JFX0dQTEVWRUwoMCk7IFJFU1RPUkVfR1BMRVZFTCgxKTsgUkVTVE9SRV9HUExFVkVMKDIpOworCVJFU1RPUkUoR1BEUjApOyBSRVNUT1JFKEdQRFIxKTsgUkVTVE9SRShHUERSMik7CisJUkVTVE9SRShHUkVSMCk7IFJFU1RPUkUoR1JFUjEpOyBSRVNUT1JFKEdSRVIyKTsKKwlSRVNUT1JFKEdGRVIwKTsgUkVTVE9SRShHRkVSMSk7IFJFU1RPUkUoR0ZFUjIpOworCVJFU1RPUkUoUEdTUjApOyBSRVNUT1JFKFBHU1IxKTsgUkVTVE9SRShQR1NSMik7CisKKyNpZmRlZiBDT05GSUdfUFhBMjd4CisJUkVTVE9SRShHQUZSM19MKTsgUkVTVE9SRShHQUZSM19VKTsgUkVTVE9SRV9HUExFVkVMKDMpOworCVJFU1RPUkUoR1BEUjMpOyBSRVNUT1JFKEdSRVIzKTsgUkVTVE9SRShHRkVSMyk7IFJFU1RPUkUoUEdTUjMpOworI2VuZGlmCisKKwlQU1NSID0gUFNTUl9SREggfCBQU1NSX1BIOworCisJUkVTVE9SRShDS0VOKTsKKworCUlDTFIgPSAwOworCUlDQ1IgPSAxOworCVJFU1RPUkUoSUNNUik7CisKKwlSRVNUT1JFKFBTVFIpOworCisJLyogcmVzdG9yZSBjdXJyZW50IHRpbWUgKi8KKwlydGMudHZfc2VjID0gUkNOUjsKKwlyZXN0b3JlX3RpbWVfZGVsdGEoJmRlbHRhLCAmcnRjKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIioqKiBtYWRlIGl0IGJhY2sgZnJvbSByZXN1bWVcbiIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbG9uZyBzbGVlcF9waHlzX3NwKHZvaWQgKnNwKQoreworCXJldHVybiB2aXJ0X3RvX3BoeXMoc3ApOworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIHByb2Nlc3NlcyBhcmUgZnJvemVuLCBidXQgYmVmb3JlIHdlIHNodXQgZG93biBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHB4YV9wbV9wcmVwYXJlKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBkZXZpY2VzIGFyZSByZS1zZXR1cCwgYnV0IGJlZm9yZSBwcm9jZXNzZXMgYXJlIHRoYXdlZC4KKyAqLworc3RhdGljIGludCBweGFfcG1fZmluaXNoKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0byBQTV9ESVNLX0ZJUk1XQVJFIHNvIHdlIGNhbiBxdWlja2x5IHZldG8gc3VzcGVuZC10by1kaXNrLgorICovCitzdGF0aWMgc3RydWN0IHBtX29wcyBweGFfcG1fb3BzID0geworCS5wbV9kaXNrX21vZGUJPSBQTV9ESVNLX0ZJUk1XQVJFLAorCS5wcmVwYXJlCT0gcHhhX3BtX3ByZXBhcmUsCisJLmVudGVyCQk9IHB4YV9wbV9lbnRlciwKKwkuZmluaXNoCQk9IHB4YV9wbV9maW5pc2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGFfcG1faW5pdCh2b2lkKQoreworCXBtX3NldF9vcHMoJnB4YV9wbV9vcHMpOworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKHB4YV9wbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjNzQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKKyAqCisgKiAgU3VwcG9ydCBmb3IgdGhlIFNIQVJQIFBvb2RsZSBCb2FyZC4KKyAqCisgKiBCYXNlZCBvbjoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDaGFuZ2UgTG9nCisgKiAgMTItRGVjLTIwMDIgU2hhcnAgQ29ycG9yYXRpb24gZm9yIFBvb2RsZQorICogIEpvaG4gTGVueiA8bGVuekBjcy53aXNjLmVkdT4gdXBkYXRlcyB0byAyLjYKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3Bvb2RsZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YWZiLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2Nvb3AuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvbG9jb21vLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2hhcnBzbF9wYXJhbS5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBvb2RsZV9zY29vcF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAkJPSAweDEwODAwMDAwLAorCQkuZW5kCQk9IDB4MTA4MDBmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzY29vcF9jb25maWcgcG9vZGxlX3Njb29wX3NldHVwID0geworCS5pb19kaXIJCT0gUE9PRExFX1NDT09QX0lPX0RJUiwKKwkuaW9fb3V0CQk9IFBPT0RMRV9TQ09PUF9JT19PVVQsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBvb2RsZV9zY29vcF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoYXJwLXNjb29wIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBvb2RsZV9zY29vcF9zZXR1cCwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwb29kbGVfc2Nvb3BfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBwb29kbGVfc2Nvb3BfcmVzb3VyY2VzLAorfTsKKworCisvKiBMb0NvTW8gZGV2aWNlICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGxvY29tb19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAkJPSAweDEwMDAwMDAwLAorCQkuZW5kCQk9IDB4MTAwMDFmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CQk9IElSUV9HUElPKDEwKSwKKwkJLmVuZAkJPSBJUlFfR1BJTygxMCksCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbG9jb21vX2RldmljZSA9IHsKKwkubmFtZQkJPSAibG9jb21vIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobG9jb21vX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbG9jb21vX3Jlc291cmNlcywKK307CisKKy8qIFBYQUZCIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gcG9vZGxlX2ZiX2luZm8gX19pbml0ZGF0YSA9IHsKKwkucGl4Y2xvY2sJPSAxNDQ3MDAsCisKKwkueHJlcwkJPSAzMjAsCisJLnlyZXMJCT0gMjQwLAorCS5icHAJCT0gMTYsCisKKwkuaHN5bmNfbGVuCT0gNywKKwkubGVmdF9tYXJnaW4JPSAxMSwKKwkucmlnaHRfbWFyZ2luCT0gMzAsCisKKwkudnN5bmNfbGVuCT0gMiwKKwkudXBwZXJfbWFyZ2luCT0gMiwKKwkubG93ZXJfbWFyZ2luCT0gMCwKKwkuc3luYwkJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKworCS5sY2NyMAkJPSBMQ0NSMF9BY3QgfCBMQ0NSMF9TbmdsIHwgTENDUjBfQ29sb3IsCisJLmxjY3IzCQk9IDAsCisKKwkucHhhZmJfYmFja2xpZ2h0X3Bvd2VyCT0gTlVMTCwKKwkucHhhZmJfbGNkX3Bvd2VyCT0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbG9jb21vX2RldmljZSwKKwkmcG9vZGxlX3Njb29wX2RldmljZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwb29kbGVfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJLyogY3B1IGluaXRpYWxpemUgKi8KKwkvKiBQZ3NyIFJlZ2lzdGVyICovCisgIAlQR1NSMCA9IDB4MDE0NmRkODA7CisgIAlQR1NSMSA9IDB4MDNiZjA4OTA7CisgIAlQR1NSMiA9IDB4MDAwMWMwMDA7CisKKwkvKiBBbHRlcm5hdGUgUmVnaXN0ZXIgKi8KKyAgCUdBRlIwX0wgPSAweDAxMDAxMDAwOworICAJR0FGUjBfVSA9IDB4NTkxYTgwMTA7CisgIAlHQUZSMV9MID0gMHg5MDBhODQ1MTsKKyAgCUdBRlIxX1UgPSAweGFhYTVhYWFhOworICAJR0FGUjJfTCA9IDB4OGFhYWFhYWE7CisgIAlHQUZSMl9VID0gMHgwMDAwMDAwMjsKKworCS8qIERpcmVjdGlvbiBSZWdpc3RlciAqLworICAJR1BEUjAgPSAweGQzZjA5MDRjOworICAJR1BEUjEgPSAweGZjZmZiN2QzOworICAJR1BEUjIgPSAweDAwMDFmZmZmOworCisJLyogT3V0cHV0IFJlZ2lzdGVyICovCisgIAlHUENSMCA9IDB4MDAwMDAwMDA7CisgIAlHUENSMSA9IDB4MDAwMDAwMDA7CisgIAlHUENSMiA9IDB4MDAwMDAwMDA7CisKKyAgCUdQU1IwID0gMHgwMDQwMDAwMDsKKyAgCUdQU1IxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgR1BTUjIgPSAweDAwMDAwMDAwOworCisJc2V0X3B4YV9mYl9pbmZvKCZwb29kbGVfZmJfaW5mbyk7CisKKwlyZXQgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBvb2RsZTogVW5hYmxlIHRvIHJlZ2lzdGVyIExvQ29NbyBkZXZpY2VcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGZpeHVwX3Bvb2RsZShzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLAorCQlzdHJ1Y3QgdGFnICp0YWdzLCBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCXNoYXJwc2xfc2F2ZV9wYXJhbSgpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHBvb2RsZV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICBsZW5ndGggICAgICAgICAgICAgICAgICAgKi8KKyAgeyAweGVmODAwMDAwLCAweDAwMDAwMDAwLCAweDAwODAwMDAwLCBNVF9ERVZJQ0UgfSwgLyogQm9vdCBGbGFzaCAqLworfTsKKworc3RhdGljIHZvaWQgX19pbml0IHBvb2RsZV9tYXBfaW8odm9pZCkKK3sKKwlweGFfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KHBvb2RsZV9pb19kZXNjLCBBUlJBWV9TSVpFKHBvb2RsZV9pb19kZXNjKSk7CisKKwkvKiBzZXR1cCBzbGVlcCBtb2RlIHZhbHVlcyAqLworCVBXRVIgID0gMHgwMDAwMDAwMjsKKwlQRkVSICA9IDB4MDAwMDAwMDA7CisJUFJFUiAgPSAweDAwMDAwMDAyOworCVBHU1IwID0gMHgwMDAwODAwMDsKKwlQR1NSMSA9IDB4MDAzRjAyMDI7CisJUEdTUjIgPSAweDAwMDFDMDAwOworCVBDRlIgfD0gUENGUl9PUERFOworfQorCitNQUNISU5FX1NUQVJUKFBPT0RMRSwgIlNIQVJQIFBvb2RsZSIpCisJQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQorCUZJWFVQKGZpeHVwX3Bvb2RsZSkKKwlNQVBJTyhwb29kbGVfbWFwX2lvKQorCUlOSVRJUlEocHhhX2luaXRfaXJxKQorCS50aW1lciA9ICZweGFfdGltZXIsCisJLmluaXRfbWFjaGluZSA9IHBvb2RsZV9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4N2I3MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCisgKgorICogIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogIENyZWF0ZWQ6CUp1biAxNSwgMjAwMQorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogQ29kZSBzcGVjaWZpYyB0byBQWEEyMXgvMjV4LzI2eCB2YXJpYW50cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFNpbmNlIHRoaXMgZmlsZSBzaG91bGQgYmUgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgbWFjaGluZSBzcGVjaWZpYyBmaWxlLAorICogdGhlIF9faW5pdGNhbGwoKSBoZXJlIHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QuICBUaGlzIHNlcnZlcyBhcyBkZWZhdWx0CisgKiBpbml0aWFsaXphdGlvbiBzdHVmZiBmb3IgUFhBIG1hY2hpbmVzIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGxhdGVyIGlmCisgKiBuZWVkIGJlLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisvKgorICogVmFyaW91cyBjbG9jayBmYWN0b3JzIGRyaXZlbiBieSB0aGUgQ0NDUiByZWdpc3Rlci4KKyAqLworCisvKiBDcnlzdGFsIEZyZXF1ZW5jeSB0byBNZW1vcnkgRnJlcXVlbmN5IE11bHRpcGxpZXIgKEwpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBMX2Nsa19tdWx0WzMyXSA9IHsgMCwgMjcsIDMyLCAzNiwgNDAsIDQ1LCAwLCB9OworCisvKiBNZW1vcnkgRnJlcXVlbmN5IHRvIFJ1biBNb2RlIEZyZXF1ZW5jeSBNdWx0aXBsaWVyIChNKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgTV9jbGtfbXVsdFs0XSA9IHsgMCwgMSwgMiwgNCB9OworCisvKiBSdW4gTW9kZSBGcmVxdWVuY3kgdG8gVHVyYm8gTW9kZSBGcmVxdWVuY3kgTXVsdGlwbGllciAoTikgKi8KKy8qIE5vdGU6IHdlIHN0b3JlIHRoZSB2YWx1ZSBOICogMiBoZXJlLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgTjJfY2xrX211bHRbOF0gPSB7IDAsIDAsIDIsIDMsIDQsIDAsIDYsIDAgfTsKKworLyogQ3J5c3RhbCBjbG9jayAqLworI2RlZmluZSBCQVNFX0NMSwkzNjg2NDAwCisKKy8qCisgKiBHZXQgdGhlIGNsb2NrIGZyZXF1ZW5jeSBhcyByZWZsZWN0ZWQgYnkgQ0NDUiBhbmQgdGhlIHR1cmJvIGZsYWcuCisgKiBXZSBhc3N1bWUgdGhlc2UgdmFsdWVzIGhhdmUgYmVlbiBhcHBsaWVkIHZpYSBhIGZjcy4KKyAqIElmIGluZm8gaXMgbm90IDAgd2UgYWxzbyBkaXNwbGF5IHRoZSBjdXJyZW50IHNldHRpbmdzLgorICovCit1bnNpZ25lZCBpbnQgZ2V0X2Nsa19mcmVxdWVuY3lfa2h6KGludCBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgY2NjciwgdHVyYm87CisJdW5zaWduZWQgaW50IGwsIEwsIG0sIE0sIG4yLCBOOworCisJY2NjciA9IENDQ1I7CisJYXNtKCAibXJjXHRwMTQsIDAsICUwLCBjNiwgYzAsIDAiIDogIj1yIiAodHVyYm8pICk7CisKKwlsICA9ICBMX2Nsa19tdWx0WyhjY2NyID4+IDApICYgMHgxZl07CisJbSAgPSAgTV9jbGtfbXVsdFsoY2NjciA+PiA1KSAmIDB4MDNdOworCW4yID0gTjJfY2xrX211bHRbKGNjY3IgPj4gNykgJiAweDA3XTsKKworCUwgPSBsICogQkFTRV9DTEs7CisJTSA9IG0gKiBMOworCU4gPSBuMiAqIE0gLyAyOworCisJaWYoaW5mbykKKwl7CisJCUwgKz0gNTAwMDsKKwkJcHJpbnRrKCBLRVJOX0lORk8gIk1lbW9yeSBjbG9jazogJWQuJTAyZE1IeiAoKiVkKVxuIiwKKwkJCUwgLyAxMDAwMDAwLCAoTCAlIDEwMDAwMDApIC8gMTAwMDAsIGwgKTsKKwkJTSArPSA1MDAwOworCQlwcmludGsoIEtFUk5fSU5GTyAiUnVuIE1vZGUgY2xvY2s6ICVkLiUwMmRNSHogKColZClcbiIsCisJCQlNIC8gMTAwMDAwMCwgKE0gJSAxMDAwMDAwKSAvIDEwMDAwLCBtICk7CisJCU4gKz0gNTAwMDsKKwkJcHJpbnRrKCBLRVJOX0lORk8gIlR1cmJvIE1vZGUgY2xvY2s6ICVkLiUwMmRNSHogKColZC4lZCwgJXNhY3RpdmUpXG4iLAorCQkJTiAvIDEwMDAwMDAsIChOICUgMTAwMDAwMCkgLyAxMDAwMCwgbjIgLyAyLCAobjIgJSAyKSAqIDUsCisJCQkodHVyYm8gJiAxKSA/ICIiIDogImluIiApOworCX0KKworCXJldHVybiAodHVyYm8gJiAxKSA/IChOLzEwMDApIDogKE0vMTAwMCk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X2Nsa19mcmVxdWVuY3lfa2h6KTsKKworLyoKKyAqIFJldHVybiB0aGUgY3VycmVudCBtZW1vcnkgY2xvY2sgZnJlcXVlbmN5IGluIHVuaXRzIG9mIDEwa0h6CisgKi8KK3Vuc2lnbmVkIGludCBnZXRfbWVtY2xrX2ZyZXF1ZW5jeV8xMGtoeih2b2lkKQoreworCXJldHVybiBMX2Nsa19tdWx0WyhDQ0NSID4+IDApICYgMHgxZl0gKiBCQVNFX0NMSyAvIDEwMDAwOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9tZW1jbGtfZnJlcXVlbmN5XzEwa2h6KTsKKworLyoKKyAqIFJldHVybiB0aGUgY3VycmVudCBMQ0QgY2xvY2sgZnJlcXVlbmN5IGluIHVuaXRzIG9mIDEwa0h6CisgKi8KK3Vuc2lnbmVkIGludCBnZXRfbGNkY2xrX2ZyZXF1ZW5jeV8xMGtoeih2b2lkKQoreworCXJldHVybiBnZXRfbWVtY2xrX2ZyZXF1ZW5jeV8xMGtoeigpOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9sY2RjbGtfZnJlcXVlbmN5XzEwa2h6KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4NjNhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCisgKgorICogIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogIENyZWF0ZWQ6CU5vdiAwNSwgMjAwMgorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogQ29kZSBzcGVjaWZpYyB0byBQWEEyN3ggYWthIEJ1bHZlcmRlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisvKiBDcnlzdGFsIGNsb2NrOiAxM01IeiAqLworI2RlZmluZSBCQVNFX0NMSwkxMzAwMDAwMAorCisvKgorICogR2V0IHRoZSBjbG9jayBmcmVxdWVuY3kgYXMgcmVmbGVjdGVkIGJ5IENDU1IgYW5kIHRoZSB0dXJibyBmbGFnLgorICogV2UgYXNzdW1lIHRoZXNlIHZhbHVlcyBoYXZlIGJlZW4gYXBwbGllZCB2aWEgYSBmY3MuCisgKiBJZiBpbmZvIGlzIG5vdCAwIHdlIGFsc28gZGlzcGxheSB0aGUgY3VycmVudCBzZXR0aW5ncy4KKyAqLwordW5zaWduZWQgaW50IGdldF9jbGtfZnJlcXVlbmN5X2toeiggaW50IGluZm8pCit7CisJdW5zaWduZWQgbG9uZyBjY3NyLCBjbGtjZmc7CisJdW5zaWduZWQgaW50IGwsIEwsIG0sIE0sIG4yLCBOLCBTOworICAgICAgIAlpbnQgY2Njcl9hLCB0LCBodCwgYjsKKworCWNjc3IgPSBDQ1NSOworCWNjY3JfYSA9IENDQ1IgJiAoMSA8PCAyNSk7CisKKwkvKiBSZWFkIGNsa2NmZyByZWdpc3RlcjogaXQgaGFzIHR1cmJvLCBiLCBoYWxmLXR1cmJvIChhbmQgZikgKi8KKwlhc20oICJtcmNcdHAxNCwgMCwgJTAsIGM2LCBjMCwgMCIgOiAiPXIiIChjbGtjZmcpICk7CisJdCAgPSBjbGtjZmcgJiAoMSA8PCAxKTsKKwlodCA9IGNsa2NmZyAmICgxIDw8IDIpOworCWIgID0gY2xrY2ZnICYgKDEgPDwgMyk7CisKKwlsICA9IGNjc3IgJiAweDFmOworCW4yID0gKGNjc3I+PjcpICYgMHhmOworCW0gID0gKGwgPD0gMTApID8gMSA6IChsIDw9IDIwKSA/IDIgOiA0OworCisJTCAgPSBsICogQkFTRV9DTEs7CisJTiAgPSAoTCAqIG4yKSAvIDI7CisJTSAgPSAoIWNjY3JfYSkgPyAoTC9tKSA6ICgoYikgPyBMIDogKEwvMikpOworCVMgID0gKGIpID8gTCA6IChMLzIpOworCisJaWYgKGluZm8pIHsKKwkJcHJpbnRrKCBLRVJOX0lORk8gIlJ1biBNb2RlIGNsb2NrOiAlZC4lMDJkTUh6ICgqJWQpXG4iLAorCQkJTCAvIDEwMDAwMDAsIChMICUgMTAwMDAwMCkgLyAxMDAwMCwgbCApOworCQlwcmludGsoIEtFUk5fSU5GTyAiVHVyYm8gTW9kZSBjbG9jazogJWQuJTAyZE1IeiAoKiVkLiVkLCAlc2FjdGl2ZSlcbiIsCisJCQlOIC8gMTAwMDAwMCwgKE4gJSAxMDAwMDAwKS8xMDAwMCwgbjIgLyAyLCAobjIgJSAyKSo1LAorCQkJKHQpID8gIiIgOiAiaW4iICk7CisJCXByaW50ayggS0VSTl9JTkZPICJNZW1vcnkgY2xvY2s6ICVkLiUwMmRNSHogKC8lZClcbiIsCisJCQlNIC8gMTAwMDAwMCwgKE0gJSAxMDAwMDAwKSAvIDEwMDAwLCBtICk7CisJCXByaW50ayggS0VSTl9JTkZPICJTeXN0ZW0gYnVzIGNsb2NrOiAlZC4lMDJkTUh6IFxuIiwKKwkJCVMgLyAxMDAwMDAwLCAoUyAlIDEwMDAwMDApIC8gMTAwMDAgKTsKKwl9CisKKwlyZXR1cm4gKHQpID8gKE4vMTAwMCkgOiAoTC8xMDAwKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgY3VycmVudCBtZW0gY2xvY2sgZnJlcXVlbmN5IGluIHVuaXRzIG9mIDEwa0h6IGFzCisgKiByZWZsZWN0ZWQgYnkgQ0NDUltBXSwgQiwgYW5kIEwKKyAqLwordW5zaWduZWQgaW50IGdldF9tZW1jbGtfZnJlcXVlbmN5XzEwa2h6KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjY3NyLCBjbGtjZmc7CisJdW5zaWduZWQgaW50IGwsIEwsIG0sIE07CisgICAgICAgCWludCBjY2NyX2EsIGI7CisKKwljY3NyID0gQ0NTUjsKKwljY2NyX2EgPSBDQ0NSICYgKDEgPDwgMjUpOworCisJLyogUmVhZCBjbGtjZmcgcmVnaXN0ZXI6IGl0IGhhcyB0dXJibywgYiwgaGFsZi10dXJibyAoYW5kIGYpICovCisJYXNtKCAibXJjXHRwMTQsIDAsICUwLCBjNiwgYzAsIDAiIDogIj1yIiAoY2xrY2ZnKSApOworCWIgPSBjbGtjZmcgJiAoMSA8PCAzKTsKKworCWwgPSBjY3NyICYgMHgxZjsKKwltID0gKGwgPD0gMTApID8gMSA6IChsIDw9IDIwKSA/IDIgOiA0OworCisJTCA9IGwgKiBCQVNFX0NMSzsKKwlNID0gKCFjY2NyX2EpID8gKEwvbSkgOiAoKGIpID8gTCA6IChMLzIpKTsKKworCXJldHVybiAoTSAvIDEwMDAwKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgY3VycmVudCBMQ0QgY2xvY2sgZnJlcXVlbmN5IGluIHVuaXRzIG9mIDEwa0h6IGFzCisgKi8KK3Vuc2lnbmVkIGludCBnZXRfbGNkY2xrX2ZyZXF1ZW5jeV8xMGtoeih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2NzcjsKKwl1bnNpZ25lZCBpbnQgbCwgTCwgaywgSzsKKworCWNjc3IgPSBDQ1NSOworCisJbCA9IGNjc3IgJiAweDFmOworCWsgPSAobCA8PSA3KSA/IDEgOiAobCA8PSAxNikgPyAyIDogNDsKKworCUwgPSBsICogQkFTRV9DTEs7CisJSyA9IEwgLyBrOworCisJcmV0dXJuIChLIC8gMTAwMDApOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9jbGtfZnJlcXVlbmN5X2toeik7CitFWFBPUlRfU1lNQk9MKGdldF9tZW1jbGtfZnJlcXVlbmN5XzEwa2h6KTsKK0VYUE9SVF9TWU1CT0woZ2V0X2xjZGNsa19mcmVxdWVuY3lfMTBraHopOworCisKKy8qCisgKiBkZXZpY2UgcmVnaXN0cmF0aW9uIHNwZWNpZmljIHRvIFBYQTI3eC4KKyAqLworCitzdGF0aWMgdTY0IHB4YTI3eF9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHB4YTI3eF9vaGNpX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4NEMwMDAwMDAsCisJCS5lbmQgICAgPSAweDRDMDBmZjZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBJUlFfVVNCSDEsCisJCS5lbmQgICAgPSBJUlFfVVNCSDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb2hjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInB4YTI3eC1vaGNpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzayA9ICZweGEyN3hfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUocHhhMjd4X29oY2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBweGEyN3hfb2hjaV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm9oY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHhhMjd4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChweGEyN3hfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zbGVlcC5TIGIvYXJjaC9hcm0vbWFjaC1weGEvc2xlZXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmNhZDJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc2xlZXAuUwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExvdy1sZXZlbCBQWEEyNTAvMjEwIHNsZWVwL3dha2VVcCBzdXBwb3J0CisgKgorICogSW5pdGlhbCBTQTExMTAgY29kZToKKyAqIENvcHlyaWdodCAoYykgMjAwMSBDbGlmZiBCcmFrZSA8Y2JyYWtlQGFjY2VsZW50LmNvbT4KKyAqCisgKiBBZGFwdGVkIGZvciBQWEEgYnkgTmljb2xhcyBQaXRyZToKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworCQkudGV4dAorCisvKgorICogcHhhX2NwdV9zdXNwZW5kKCkKKyAqCisgKiBGb3JjZXMgQ1BVIGludG8gc2xlZXAgc3RhdGUKKyAqLworCitFTlRSWShweGFfY3B1X3N1c3BlbmQpCisKKwltcmEJcjIsIHIzLCBhY2MwCisJc3RtZmQJc3AhLCB7cjIgLSByMTIsIGxyfQkJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjaworCisJQCBnZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzCisJbXJjCXAxNCwgMCwgcjMsIGM2LCBjMCwgMAkJQCBjbG9jayBjb25maWd1cmF0aW9uLCBmb3IgdHVyYm8gbW9kZQorCW1yYwlwMTUsIDAsIHI0LCBjMTUsIGMxLCAwCQlAIENQIGFjY2VzcyByZWcKKwltcmMJcDE1LCAwLCByNSwgYzEzLCBjMCwgMAkJQCBQSUQKKwltcmMgCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAkJQCBkb21haW4gSUQKKwltcmMgCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAkJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKKwltcmMJcDE1LCAwLCByOCwgYzEsIGMxLCAwICAgICAgICAgICBAIGF1eGlsaWFyeSBjb250cm9sIHJlZworCW1yYyAJcDE1LCAwLCByOSwgYzEsIGMwLCAwCQlAIGNvbnRyb2wgcmVnCisKKwliaWMJcjMsIHIzLCAjMgkJCUAgY2xlYXIgZnJlcXVlbmN5IGNoYW5nZSBiaXQKKworCUAgc3RvcmUgdGhlbSBwbHVzIGN1cnJlbnQgdmlydHVhbCBzdGFjayBwdHIgb24gc3RhY2sKKwltb3YJcjEwLCBzcAorCXN0bWZkCXNwISwge3IzIC0gcjEwfQorCisJQCBwcmVzZXJ2ZSBwaHlzIGFkZHJlc3Mgb2Ygc3RhY2sKKwltb3YJcjAsIHNwCisJYmwJc2xlZXBfcGh5c19zcAorCWxkcglyMSwgPXNsZWVwX3NhdmVfc3AKKwlzdHIJcjAsIFtyMV0KKworCUAgY2xlYW4gZGF0YSBjYWNoZQorCWJsCXhzY2FsZV9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCisJQCBQdXQgdGhlIHByb2Nlc3NvciB0byBzbGVlcAorCUAgKGFsc28gd29ya2Fyb3VuZCBmb3Igc2lnaHRpbmcgMjgwNzEpCisKKwlAIHByZXBhcmUgdmFsdWUgZm9yIHNsZWVwIG1vZGUKKwltb3YJcjEsICMzCQkJCUAgc2xlZXAgbW9kZQorCisJQCBwcmVwYXJlIHRvIHB1dCBTRFJBTSBpbnRvIHNlbGYtcmVmcmVzaCBtYW51YWxseQorCWxkcglyNCwgPU1EUkVGUgorCWxkcglyNSwgW3I0XQorCW9ycglyNSwgcjUsICNNRFJFRlJfU0xGUlNICisKKwlAIHByZXBhcmUgcG9pbnRlciB0byBwaHlzaWNhbCBhZGRyZXNzIDAgKHZpcnR1YWwgbWFwcGluZyBpbiBnZW5lcmljLmMpCisJbW92CXIyLCAjVU5DQUNIRURfUEhZU18wCisKKwlAIEludGVsIFBYQTI1NSBTcGVjaWZpY2F0aW9uIFVwZGF0ZSBub3RlcyBwcm9ibGVtcworCUAgYWJvdXQgc3VzcGVuZGluZyB3aXRoIFBYQnVzIG9wZXJhdGluZyBhYm92ZSAxMzNNSHoKKwlAIChzZWUgRXJyYXRhIDMxLCBHUElPIG91dHB1dCBzaWduYWxzLCAuLi4gdW5wcmVkaWN0YWJsZSBpbiBzbGVlcAorCUAKKwlAIFdlIGtlZXAgdGhlIGNoYW5nZS1kb3duIGNsb3NlIHRvIHRoZSBhY3R1YWwgc3VzcGVuZCBvbiBTRFJBTQorCUAgYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIG1lc3NpbmcgYWJvdXQgd2l0aCB0aGUgcmVmcmVzaCBjbG9jaworCUAgYXMgdGhlIHN5c3RlbSB3aWxsIHJlc3RvcmUgd2l0aCB0aGUgb3JpZ2luYWwgc3BlZWQgc2V0dGluZ3MKKwlACisJQCBCZW4gRG9va3MsIDEzLVNlcC0yMDA0CisKKwlsZHIJcjYsID1DQ0NSCisJbGRyCXI4LCBbcjZdCQlAIGtlZXAgb3JpZ2luYWwgdmFsdWUgZm9yIHJlc3VtZQorCisJQCBlbnN1cmUgeDEgZm9yIHJ1biBhbmQgdHVyYm8gbW9kZSB3aXRoIG1lbW9yeSBjbG9jaworCWJpYwlyNywgcjgsICNDQ0NSX01fTUFTSyB8IENDQ1JfTl9NQVNLCisJb3JyCXI3LCByNywgIygxPDw1KSB8ICgyPDw3KQorCisJQCBjaGVjayB0aGF0IHRoZSBtZW1vcnkgZnJlcXVlbmN5IGlzIHdpdGhpbiBsaW1pdHMKKwlhbmQJcjE0LCByNywgI0NDQ1JfTF9NQVNLCisJdGVxCXIxNCwgIzEKKwliaWNuZQlyNywgcjcsICNDQ0NSX0xfTUFTSworCW9ycm5lCXI3LCByNywgIzEJCQlAQCA5OS41M01IegorCisJQCBnZXQgcmVhZHkgZm9yIHRoZSBjaGFuZ2UKKworCUAgbm90ZSwgdHVyYm8gaXMgbm90IHByZXNlcnZlZCBvdmVyIHNsZWVwIHNvIHRoZXJlIGlzIG5vCisJQCBwb2ludCBpbiBwcmVzZXJ2aW5nIGl0IGhlcmUuIHdlIHNhdmUgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlCisJQCBvdGhlciBDUCByZWdpc3RlcnMgaW5zdGVhZC4KKwltb3YJcjAsICMwCisJbWNyCXAxNCwgMCwgcjAsIGM2LCBjMCwgMAorCW9ycglyMCwgcjAsICMyCQkJQCBpbml0aWF0ZSBjaGFuZ2UgYml0CisKKwlAIGFsaWduIGV4ZWN1dGlvbiB0byBhIGNhY2hlIGxpbmUKKwliCTFmCisKKwkubHRvcmcKKwkuYWxpZ24JNQorMToKKworCUAgQWxsIG5lZWRlZCB2YWx1ZXMgYXJlIG5vdyBpbiByZWdpc3RlcnMuCisJQCBUaGVzZSBsYXN0IGluc3RydWN0aW9ucyBzaG91bGQgYmUgaW4gY2FjaGUKKworCUAgaW5pdGlhdGUgdGhlIGZyZXF1ZW5jeSBjaGFuZ2UuLi4KKwlzdHIJcjcsIFtyNl0KKwltY3IJcDE0LCAwLCByMCwgYzYsIGMwLCAwCisKKwlAIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGNwdSBzcGVlZCB2YWx1ZSBmb3IgcmVzdW1lCisJc3RyCXI4LCBbcjZdCisKKwlAIHB1dCBTRFJBTSBpbnRvIHNlbGYtcmVmcmVzaAorCXN0cglyNSwgW3I0XQorCisJQCBmb3JjZSBhZGRyZXNzIGxpbmVzIGxvdyBieSByZWFkaW5nIGF0IHBoeXNpY2FsIGFkZHJlc3MgMAorCWxkcglyMywgW3IyXQorCisJQCBlbnRlciBzbGVlcCBtb2RlCisJbWNyCXAxNCwgMCwgcjEsIGM3LCBjMCwgMAorCisyMDoJYgkyMGIJCQkJQCBsb29wIHdhaXRpbmcgZm9yIHNsZWVwCisKKy8qCisgKiBjcHVfcHhhX3Jlc3VtZSgpCisgKgorICogZW50cnkgcG9pbnQgZnJvbSBib290bG9hZGVyIGludG8ga2VybmVsIGR1cmluZyByZXN1bWUKKyAqCisgKiBOb3RlOiBZZXMsIHBhcnQgb2YgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGxvY2F0ZWQgaW50byB0aGUgLmRhdGEgc2VjdGlvbi4KKyAqICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgc2xlZXBfc2F2ZV9zcCB0byBiZSBhY2Nlc3NlZCB3aXRoIGEgcmVsYXRpdmUgbG9hZAorICogICAgICAgd2hpbGUgd2UgY2FuJ3QgcmVseSBvbiBhbnkgTU1VIHRyYW5zbGF0aW9uLiAgV2UgY291bGQgaGF2ZSBwdXQKKyAqICAgICAgIHNsZWVwX3NhdmVfc3AgaW4gdGhlIC50ZXh0IHNlY3Rpb24gYXMgd2VsbCwgYnV0IHNvbWUgc2V0dXBzIG1pZ2h0CisgKiAgICAgICBpbnNpc3Qgb24gaXQgdG8gYmUgdHJ1bHkgcmVhZC1vbmx5LgorICovCisKKwkuZGF0YQorCS5hbGlnbiA1CitFTlRSWShweGFfY3B1X3Jlc3VtZSkKKwltb3YJcjAsICNQU1JfSV9CSVQgfCBQU1JfRl9CSVQgfCBNT0RFX1NWQwlAIHNldCBTVkMsIGlycXMgb2ZmCisJbXNyCWNwc3JfYywgcjAKKworCWxkcglyMCwgc2xlZXBfc2F2ZV9zcAkJQCBzdGFjayBwaHlzIGFkZHIKKwlsZHIJcjIsID1yZXN1bWVfYWZ0ZXJfbW11CQlAIGl0cyBhYnNvbHV0ZSB2aXJ0dWFsIGFkZHJlc3MKKwlsZG1mZAlyMCwge3IzIC0gcjksIHNwfQkJQCBDUCByZWdzICsgdmlydCBzdGFjayBwdHIKKworCW1vdglyMSwgIzAKKwltY3IJcDE1LCAwLCByMSwgYzgsIGM3LCAwICAgCUAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIGNhY2hlcywgQlRCCisKKyNpZmRlZiBDT05GSUdfWFNDQUxFX0NBQ0hFX0VSUkFUQQorCWJpYyAgICAgcjksIHI5LCAjMHgwMDA0CQkJQCBzZWUgY3B1X3hzY2FsZV9wcm9jX2luaXQKKyNlbmRpZgorCisJbWNyCXAxNCwgMCwgcjMsIGM2LCBjMCwgMAkJQCBjbG9jayBjb25maWd1cmF0aW9uLCB0dXJibyBtb2RlLgorCW1jcglwMTUsIDAsIHI0LCBjMTUsIGMxLCAwCQlAIENQIGFjY2VzcyByZWcKKwltY3IJcDE1LCAwLCByNSwgYzEzLCBjMCwgMAkJQCBQSUQKKwltY3IgCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAkJQCBkb21haW4gSUQKKwltY3IgCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAkJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKKwltY3IJcDE1LCAwLCByOCwgYzEsIGMxLCAwICAgICAgICAgICBAIGF1eGlsaWFyeSBjb250cm9sIHJlZworCWIJcmVzdW1lX3R1cm5fb25fbW11CQlAIGNhY2hlIGFsaWduIGV4ZWN1dGlvbgorCisJLmFsaWduIDUKK3Jlc3VtZV90dXJuX29uX21tdToKKwltY3IgCXAxNSwgMCwgcjksIGMxLCBjMCwgMAkJQCB0dXJuIG9uIE1NVSwgY2FjaGVzLCBldGMuCisKKwlAIExldCB1cyBlbnN1cmUgd2UganVtcCB0byByZXN1bWVfYWZ0ZXJfbW11IG9ubHkgd2hlbiB0aGUgbWNyIGFib3ZlCisJQCBhY3R1YWxseSB0b29rIGVmZmVjdC4gIFRoZXkgY2FsbCBpdCB0aGUgImNwd2FpdCIgb3BlcmF0aW9uLgorCW1yYwlwMTUsIDAsIHIxLCBjMiwgYzAsIDAJCUAgcXVldWUgYSBkZXBlbmRlbmN5IG9uIENQMTUKKwlzdWIJcGMsIHIyLCByMSwgbHNyICMzMgkJQCBqdW1wIHRvIHZpcnR1YWwgYWRkcgorCW5vcAorCW5vcAorCW5vcAorCitzbGVlcF9zYXZlX3NwOgorCS53b3JkCTAJCQkJQCBwcmVzZXJ2ZSBzdGFjayBwaHlzIHB0ciBoZXJlCisKKwkudGV4dAorcmVzdW1lX2FmdGVyX21tdToKKyNpZmRlZiBDT05GSUdfWFNDQUxFX0NBQ0hFX0VSUkFUQQorCWJsCWNwdV94c2NhbGVfcHJvY19pbml0CisjZW5kaWYKKwlsZG1mZAlzcCEsIHtyMiwgcjN9CisJbWFyCWFjYzAsIHIyLCByMworCWxkbWZkCXNwISwge3I0IC0gcjEyLCBwY30JCUAgcmV0dXJuIHRvIGNhbGxlcgorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4MjZjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jCisgKgorICogIGJhc2VkIG9uIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL3NzcC5jIGJ5IFJ1c3NlbGwgS2luZworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgUnVzc2VsbCBLaW5nLgorICogIENvcHlyaWdodCAoQykgMjAwMyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgUFhBMnh4IFNTUCBkcml2ZXIuICBUaGlzIHByb3ZpZGVzIHRoZSBnZW5lcmljIGNvcmUgZm9yIHNpbXBsZQorICogIElPLWJhc2VkIFNTUCBhcHBsaWNhdGlvbnMgYW5kIGFsbG93cyBlYXN5IHBvcnQgc2V0dXAgZm9yIERNQSBhY2Nlc3MuCisgKgorICogIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8bGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tPgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5OgorICogICAyMm5kIEF1ZyAyMDAzIEluaXRpYWwgdmVyc2lvbi4KKyAqICAgMjB0aCBEZWMgMjAwNCBBZGRlZCBzc3BfY29uZmlnIGZvciBjaGFuZ2luZyBwb3J0IGNvbmZpZyB3aXRob3V0CisgKiAgICAgICAgICAgICAgICAgY2xvc2luZyB0aGUgcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3NzcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKKyNkZWZpbmUgUFhBX1NTUF9QT1JUUyAJMworCitzdGF0aWMgREVDTEFSRV9NVVRFWChzZW0pOworc3RhdGljIGludCB1c2VfY291bnRbUFhBX1NTUF9QT1JUU10gPSB7MCwgMCwgMH07CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzc3BfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNzcF9kZXYgKmRldiA9IChzdHJ1Y3Qgc3NwX2RldiopIGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzID0gU1NTUl9QKGRldi0+cG9ydCk7CisKKwlTU1NSX1AoZGV2LT5wb3J0KSA9IHN0YXR1czsgLyogY2xlYXIgc3RhdHVzIGJpdHMgKi8KKworCWlmIChzdGF0dXMgJiBTU1NSX1JPUikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1NQKCVkKTogcmVjZWl2ZXIgb3ZlcnJ1blxuIiwgZGV2LT5wb3J0KTsKKworCWlmIChzdGF0dXMgJiBTU1NSX1RVUikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1NQKCVkKTogdHJhbnNtaXR0ZXIgdW5kZXJydW5cbiIsIGRldi0+cG9ydCk7CisKKwlpZiAoc3RhdHVzICYgU1NTUl9CQ0UpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNTUCglZCk6IGJpdCBjb3VudCBlcnJvclxuIiwgZGV2LT5wb3J0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBzc3Bfd3JpdGVfd29yZCAtIHdyaXRlIGEgd29yZCB0byB0aGUgU1NQIHBvcnQKKyAqIEBkYXRhOiAzMi1iaXQsIE1TQiBqdXN0aWZpZWQgZGF0YSB0byB3cml0ZS4KKyAqCisgKiBXYWl0IGZvciBhIGZyZWUgZW50cnkgaW4gdGhlIFNTUCB0cmFuc21pdCBGSUZPLCBhbmQgd3JpdGUgYSBkYXRhCisgKiB3b3JkIHRvIHRoZSBTU1AgcG9ydC4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBsb2NraW5nLgorICoKKyAqIFJldHVybnM6CisgKiAgICUtRVRJTUVET1VUCXRpbWVvdXQgb2NjdXJyZWQgKGZvciBmdXR1cmUpCisgKiAgIDAJCQlzdWNjZXNzCisgKi8KK2ludCBzc3Bfd3JpdGVfd29yZChzdHJ1Y3Qgc3NwX2RldiAqZGV2LCB1MzIgZGF0YSkKK3sKKwl3aGlsZSAoIShTU1NSX1AoZGV2LT5wb3J0KSAmIFNTU1JfVE5GKSkKKwkJY3B1X3JlbGF4KCk7CisKKwlTU0RSX1AoZGV2LT5wb3J0KSA9IGRhdGE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzc3BfcmVhZF93b3JkIC0gcmVhZCBhIHdvcmQgZnJvbSB0aGUgU1NQIHBvcnQKKyAqCisgKiBXYWl0IGZvciBhIGRhdGEgd29yZCBpbiB0aGUgU1NQIHJlY2VpdmUgRklGTywgYW5kIHJldHVybiB0aGUKKyAqIHJlY2VpdmVkIGRhdGEuICBEYXRhIGlzIExTQiBqdXN0aWZpZWQuCisgKgorICogTm90ZTogQ3VycmVudGx5LCBpZiBkYXRhIGlzIG5vdCBleHBlY3RlZCB0byBiZSByZWNlaXZlZCwgdGhpcworICogZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBldmVyLgorICoKKyAqIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcuCisgKgorICogUmV0dXJuczoKKyAqICAgJS1FVElNRURPVVQJdGltZW91dCBvY2N1cnJlZCAoZm9yIGZ1dHVyZSkKKyAqICAgMzItYml0IGRhdGEJc3VjY2VzcworICovCitpbnQgc3NwX3JlYWRfd29yZChzdHJ1Y3Qgc3NwX2RldiAqZGV2KQoreworCXdoaWxlICghKFNTU1JfUChkZXYtPnBvcnQpICYgU1NTUl9STkUpKQorCQljcHVfcmVsYXgoKTsKKworCXJldHVybiBTU0RSX1AoZGV2LT5wb3J0KTsKK30KKworLyoqCisgKiBzc3BfZmx1c2ggLSBmbHVzaCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgRklGT3MKKyAqCisgKiBXYWl0IGZvciB0aGUgU1NQIHRvIGlkbGUsIGFuZCBlbnN1cmUgdGhhdCB0aGUgcmVjZWl2ZSBGSUZPCisgKiBpcyBlbXB0eS4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBsb2NraW5nLgorICovCit2b2lkIHNzcF9mbHVzaChzdHJ1Y3Qgc3NwX2RldiAqZGV2KQoreworCWRvIHsKKwkJd2hpbGUgKFNTU1JfUChkZXYtPnBvcnQpICYgU1NTUl9STkUpIHsKKwkJCSh2b2lkKSBTU0RSX1AoZGV2LT5wb3J0KTsKKwkJfQorCX0gd2hpbGUgKFNTU1JfUChkZXYtPnBvcnQpICYgU1NTUl9CU1kpOworfQorCisvKioKKyAqIHNzcF9lbmFibGUgLSBlbmFibGUgdGhlIFNTUCBwb3J0CisgKgorICogVHVybiBvbiB0aGUgU1NQIHBvcnQuCisgKi8KK3ZvaWQgc3NwX2VuYWJsZShzdHJ1Y3Qgc3NwX2RldiAqZGV2KQoreworCVNTQ1IwX1AoZGV2LT5wb3J0KSB8PSBTU0NSMF9TU0U7Cit9CisKKy8qKgorICogc3NwX2Rpc2FibGUgLSBzaHV0IGRvd24gdGhlIFNTUCBwb3J0CisgKgorICogVHVybiBvZmYgdGhlIFNTUCBwb3J0LCBvcHRpb25hbGx5IHBvd2VyaW5nIGl0IGRvd24uCisgKi8KK3ZvaWQgc3NwX2Rpc2FibGUoc3RydWN0IHNzcF9kZXYgKmRldikKK3sKKwlTU0NSMF9QKGRldi0+cG9ydCkgJj0gflNTQ1IwX1NTRTsKK30KKworLyoqCisgKiBzc3Bfc2F2ZV9zdGF0ZSAtIHNhdmUgdGhlIFNTUCBjb25maWd1cmF0aW9uCisgKiBAc3NwOiBwb2ludGVyIHRvIHN0cnVjdHVyZSB0byBzYXZlIFNTUCBjb25maWd1cmF0aW9uCisgKgorICogU2F2ZSB0aGUgY29uZmlndXJlZCBTU1Agc3RhdGUgZm9yIHN1c3BlbmQuCisgKi8KK3ZvaWQgc3NwX3NhdmVfc3RhdGUoc3RydWN0IHNzcF9kZXYgKmRldiwgc3RydWN0IHNzcF9zdGF0ZSAqc3NwKQoreworCXNzcC0+Y3IwID0gU1NDUjBfUChkZXYtPnBvcnQpOworCXNzcC0+Y3IxID0gU1NDUjFfUChkZXYtPnBvcnQpOworCXNzcC0+dG8gPSBTU1RPX1AoZGV2LT5wb3J0KTsKKwlzc3AtPnBzcCA9IFNTUFNQX1AoZGV2LT5wb3J0KTsKKworCVNTQ1IwX1AoZGV2LT5wb3J0KSAmPSB+U1NDUjBfU1NFOworfQorCisvKioKKyAqIHNzcF9yZXN0b3JlX3N0YXRlIC0gcmVzdG9yZSBhIHByZXZpb3VzbHkgc2F2ZWQgU1NQIGNvbmZpZ3VyYXRpb24KKyAqIEBzc3A6IHBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiBzYXZlZCBieSBzc3Bfc2F2ZV9zdGF0ZQorICoKKyAqIFJlc3RvcmUgdGhlIFNTUCBjb25maWd1cmF0aW9uIHNhdmVkIHByZXZpb3VzbHkgYnkgc3NwX3NhdmVfc3RhdGUuCisgKi8KK3ZvaWQgc3NwX3Jlc3RvcmVfc3RhdGUoc3RydWN0IHNzcF9kZXYgKmRldiwgc3RydWN0IHNzcF9zdGF0ZSAqc3NwKQoreworCVNTU1JfUChkZXYtPnBvcnQpID0gU1NTUl9ST1IgfCBTU1NSX1RVUiB8IFNTU1JfQkNFOworCisJU1NDUjBfUChkZXYtPnBvcnQpID0gc3NwLT5jcjAgJiB+U1NDUjBfU1NFOworCVNTQ1IxX1AoZGV2LT5wb3J0KSA9IHNzcC0+Y3IxOworCVNTVE9fUChkZXYtPnBvcnQpID0gc3NwLT50bzsKKwlTU1BTUF9QKGRldi0+cG9ydCkgPSBzc3AtPnBzcDsKKworCVNTQ1IwX1AoZGV2LT5wb3J0KSA9IHNzcC0+Y3IwOworfQorCisvKioKKyAqIHNzcF9jb25maWcgLSBjb25maWd1cmUgU1NQIHBvcnQgc2V0dGluZ3MKKyAqIEBtb2RlOiBwb3J0IG9wZXJhdGluZyBtb2RlCisgKiBAZmxhZ3M6IHBvcnQgY29uZmlnIGZsYWdzCisgKiBAcHNwX2ZsYWdzOiBwb3J0IFBTUCBjb25maWcgZmxhZ3MKKyAqIEBzcGVlZDogcG9ydCBzcGVlZAorICoKKyAqIFBvcnQgTVVTVCBiZSBkaXNhYmxlZCBieSBzc3BfZGlzYWJsZSBiZWZvcmUgbWFraW5nIGFueSBjb25maWcgY2hhbmdlcy4KKyAqLworaW50IHNzcF9jb25maWcoc3RydWN0IHNzcF9kZXYgKmRldiwgdTMyIG1vZGUsIHUzMiBmbGFncywgdTMyIHBzcF9mbGFncywgdTMyIHNwZWVkKQoreworCWRldi0+bW9kZSA9IG1vZGU7CisJZGV2LT5mbGFncyA9IGZsYWdzOworCWRldi0+cHNwX2ZsYWdzID0gcHNwX2ZsYWdzOworCWRldi0+c3BlZWQgPSBzcGVlZDsKKworCS8qIHNldCB1cCBwb3J0IHR5cGUsIHNwZWVkLCBwb3J0IHNldHRpbmdzICovCisJU1NDUjBfUChkZXYtPnBvcnQpID0gKGRldi0+c3BlZWQgfCBkZXYtPm1vZGUpOworCVNTQ1IxX1AoZGV2LT5wb3J0KSA9IGRldi0+ZmxhZ3M7CisJU1NQU1BfUChkZXYtPnBvcnQpID0gZGV2LT5wc3BfZmxhZ3M7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzc3BfaW5pdCAtIHNldHVwIHRoZSBTU1AgcG9ydAorICoKKyAqIGluaXRpYWxpc2UgYW5kIGNsYWltIHJlc291cmNlcyBmb3IgdGhlIFNTUCBwb3J0LgorICoKKyAqIFJldHVybnM6CisgKiAgICUtRU5PREVWCWlmIHRoZSBTU1AgcG9ydCBpcyB1bmF2YWlsYWJsZQorICogICAlLUVCVVNZCWlmIHRoZSByZXNvdXJjZXMgYXJlIGFscmVhZHkgaW4gdXNlCisgKiAgICUwCQlvbiBzdWNjZXNzCisgKi8KK2ludCBzc3BfaW5pdChzdHJ1Y3Qgc3NwX2RldiAqZGV2LCB1MzIgcG9ydCkKK3sKKwlpbnQgcmV0LCBpcnE7CisKKwlpZiAocG9ydCA+IFBYQV9TU1BfUE9SVFMgfHwgcG9ydCA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRvd24oJnNlbSk7CisJaWYgKHVzZV9jb3VudFtwb3J0IC0gMV0pIHsKKwkJdXAoJnNlbSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXVzZV9jb3VudFtwb3J0IC0gMV0rKzsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKF9fUFJFRyhTU0NSMF9QKHBvcnQpKSwgMHgyYywgIlNTUCIpKSB7CisJCXVzZV9jb3VudFtwb3J0IC0gMV0tLTsKKwkJdXAoJnNlbSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc3dpdGNoIChwb3J0KSB7CisJCWNhc2UgMToKKwkJCWlycSA9IElSUV9TU1A7CisJCQlicmVhazsKKyNpZiBkZWZpbmVkIChDT05GSUdfUFhBMjd4KQorCQljYXNlIDI6CisJCQlpcnEgPSBJUlFfU1NQMjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpcnEgPSBJUlFfU1NQMzsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSAyOgorCQkJaXJxID0gSVJRX05TU1A7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJaXJxID0gSVJRX0FTU1A7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2LT5wb3J0ID0gcG9ydDsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgc3NwX2ludGVycnVwdCwgMCwgIlNTUCIsIGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVnaW9uOworCisJLyogdHVybiBvbiBTU1AgcG9ydCBjbG9jayAqLworCXN3aXRjaCAoZGV2LT5wb3J0KSB7CisjaWYgZGVmaW5lZCAoQ09ORklHX1BYQTI3eCkKKwkJY2FzZSAxOgorCQkJcHhhX3NldF9ja2VuKENLRU4yM19TU1AxLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlweGFfc2V0X2NrZW4oQ0tFTjNfU1NQMiwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcHhhX3NldF9ja2VuKENLRU40X1NTUDMsIDEpOworCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIDE6CisJCQlweGFfc2V0X2NrZW4oQ0tFTjNfU1NQLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlweGFfc2V0X2NrZW4oQ0tFTjlfTlNTUCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcHhhX3NldF9ja2VuKENLRU4xMF9BU1NQLCAxKTsKKwkJCWJyZWFrOworI2VuZGlmCisJfQorCisJdXAoJnNlbSk7CisJcmV0dXJuIDA7CisKK291dF9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTU0NSMF9QKHBvcnQpKSwgMHgyYyk7CisJdXNlX2NvdW50W3BvcnQgLSAxXS0tOworCXVwKCZzZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3NwX2V4aXQgLSB1bmRvIHRoZSBlZmZlY3RzIG9mIHNzcF9pbml0CisgKgorICogcmVsZWFzZSBhbmQgZnJlZSByZXNvdXJjZXMgZm9yIHRoZSBTU1AgcG9ydC4KKyAqLwordm9pZCBzc3BfZXhpdChzdHJ1Y3Qgc3NwX2RldiAqZGV2KQoreworCWludCBpcnE7CisKKwlkb3duKCZzZW0pOworCVNTQ1IwX1AoZGV2LT5wb3J0KSAmPSB+U1NDUjBfU1NFOworCisJLyogZmluZCBpcnEsIHNhdmUgcG93ZXIgYW5kIHR1cm4gb2ZmIFNTUCBwb3J0IGNsb2NrICovCisJc3dpdGNoIChkZXYtPnBvcnQpIHsKKyNpZiBkZWZpbmVkIChDT05GSUdfUFhBMjd4KQorCQljYXNlIDE6CisJCQlpcnEgPSBJUlFfU1NQOworCQkJcHhhX3NldF9ja2VuKENLRU4yM19TU1AxLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpcnEgPSBJUlFfU1NQMjsKKwkJCXB4YV9zZXRfY2tlbihDS0VOM19TU1AyLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpcnEgPSBJUlFfU1NQMzsKKwkJCXB4YV9zZXRfY2tlbihDS0VONF9TU1AzLCAwKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSAxOgorCQkJaXJxID0gSVJRX1NTUDsKKwkJCXB4YV9zZXRfY2tlbihDS0VOM19TU1AsIDApOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlycSA9IElSUV9OU1NQOworCQkJcHhhX3NldF9ja2VuKENLRU45X05TU1AsIDApOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWlycSA9IElSUV9BU1NQOworCQkJcHhhX3NldF9ja2VuKENLRU4xMF9BU1NQLCAwKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTU1A6IHRyaWVkIHRvIGNsb3NlIGludmFsaWQgcG9ydFxuIik7CisJCQlyZXR1cm47CisJfQorCisJZnJlZV9pcnEoaXJxLCBkZXYpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU1NDUjBfUChkZXYtPnBvcnQpKSwgMHgyYyk7CisJdXNlX2NvdW50W2Rldi0+cG9ydCAtIDFdLS07CisJdXAoJnNlbSk7Cit9CisKK0VYUE9SVF9TWU1CT0woc3NwX3dyaXRlX3dvcmQpOworRVhQT1JUX1NZTUJPTChzc3BfcmVhZF93b3JkKTsKK0VYUE9SVF9TWU1CT0woc3NwX2ZsdXNoKTsKK0VYUE9SVF9TWU1CT0woc3NwX2VuYWJsZSk7CitFWFBPUlRfU1lNQk9MKHNzcF9kaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0woc3NwX3NhdmVfc3RhdGUpOworRVhQT1JUX1NZTUJPTChzc3BfcmVzdG9yZV9zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKHNzcF9pbml0KTsKK0VYUE9SVF9TWU1CT0woc3NwX2V4aXQpOworRVhQT1JUX1NZTUJPTChzc3BfY29uZmlnKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQWEEgU1NQIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczZmI2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtcHhhL3RpbWUuYworICoKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJSnVuIDE1LCAyMDAxCisgKiBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB4YV9nZXRfcnRjX3RpbWUodm9pZCkKK3sKKwlyZXR1cm4gUkNOUjsKK30KKworc3RhdGljIGludCBweGFfc2V0X3J0Yyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lID0geHRpbWUudHZfc2VjOworCisJaWYgKFJUU1IgJiBSVFNSX0FMRSkgeworCQkvKiBtYWtlIHN1cmUgbm90IHRvIGZvcndhcmQgdGhlIGNsb2NrIG92ZXIgYW4gYWxhcm0gKi8KKwkJdW5zaWduZWQgbG9uZyBhbGFybSA9IFJUQVI7CisJCWlmIChjdXJyZW50X3RpbWUgPj0gYWxhcm0gJiYgYWxhcm0gPj0gUkNOUikKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCVJDTlIgPSBjdXJyZW50X3RpbWU7CisJcmV0dXJuIDA7Cit9CisKKy8qIElSUXMgYXJlIGRpc2FibGVkIGJlZm9yZSBlbnRlcmluZyBoZXJlIGZyb20gZG9fZ2V0dGltZW9mZGF5KCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHB4YV9nZXR0aW1lb2Zmc2V0ICh2b2lkKQoreworCWxvbmcgdGlja3NfdG9fbWF0Y2gsIGVsYXBzZWQsIHVzZWM7CisKKwkvKiBHZXQgdGlja3MgYmVmb3JlIG5leHQgdGltZXIgbWF0Y2ggKi8KKwl0aWNrc190b19tYXRjaCA9IE9TTVIwIC0gT1NDUjsKKworCS8qIFdlIG5lZWQgZWxhcHNlZCB0aWNrcyBzaW5jZSBsYXN0IG1hdGNoICovCisJZWxhcHNlZCA9IExBVENIIC0gdGlja3NfdG9fbWF0Y2g7CisKKwkvKiBkb24ndCBnZXQgZm9vbGVkIGJ5IHRoZSB3b3JrYXJvdW5kIGluIHB4YV90aW1lcl9pbnRlcnJ1cHQoKSAqLworCWlmIChlbGFwc2VkIDw9IDApCisJCXJldHVybiAwOworCisJLyogTm93IGNvbnZlcnQgdGhlbSB0byB1c2VjICovCisJdXNlYyA9ICh1bnNpZ25lZCBsb25nKShlbGFwc2VkICogKHRpY2tfbnNlYyAvIDEwMDApKS9MQVRDSDsKKworCXJldHVybiB1c2VjOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK3B4YV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgbmV4dF9tYXRjaDsKKworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJLyogTG9vcCB1bnRpbCB3ZSBnZXQgYWhlYWQgb2YgdGhlIGZyZWUgcnVubmluZyB0aW1lci4KKwkgKiBUaGlzIGVuc3VyZXMgYW4gZXhhY3QgY2xvY2sgdGljayBjb3VudCBhbmQgdGltZSBhY2N1cmFjeS4KKwkgKiBJUlFzIGFyZSBkaXNhYmxlZCBpbnNpZGUgdGhlIGxvb3AgdG8gZW5zdXJlIGNvaGVyZW5jZSBiZXR3ZWVuCisJICogbG9zdF90aWNrcyAodXBkYXRlZCBpbiBkb190aW1lcigpKSBhbmQgdGhlIG1hdGNoIHJlZyB2YWx1ZSwgc28gd2UKKwkgKiBjYW4gdXNlIGRvX2dldHRpbWVvZmRheSgpIGZyb20gaW50ZXJydXB0IGhhbmRsZXJzLgorCSAqCisJICogSEFDSyBBTEVSVDogaXQgc2VlbXMgdGhhdCB0aGUgUFhBIHRpbWVyIHJlZ3MgYXJlbid0IHVwZGF0ZWQgcmlnaHQKKwkgKiBhd2F5IGluIGFsbCBjYXNlcyB3aGVuIGEgd3JpdGUgb2NjdXJzLiAgV2UgdGhlcmVmb3JlIGNvbXBhcmUgd2l0aAorCSAqIDggaW5zdGVhZCBvZiAwIGluIHRoZSB3aGlsZSgpIGNvbmRpdGlvbiBiZWxvdyB0byBhdm9pZCBtaXNzaW5nIGEKKwkgKiBtYXRjaCBpZiBPU0NSIGhhcyBhbHJlYWR5IHJlYWNoZWQgdGhlIG5leHQgT1NNUiB2YWx1ZS4KKwkgKiBFeHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHVwIHRvIDYgdGlja3MgYXJlIG5lZWRlZCB0byB3b3JrIGFyb3VuZAorCSAqIHRoaXMgcHJvYmxlbSwgYnV0IGxldCdzIHVzZSA4IHRvIGJlIGNvbnNlcnZhdGl2ZS4gIE5vdGUgdGhhdCB0aGlzCisJICogYWZmZWN0IHRoaW5ncyBvbmx5IHdoZW4gdGhlIHRpbWVyIElSUSBoYXMgYmVlbiBkZWxheWVkIGJ5IG5lYXJseQorCSAqIGV4YWN0bHkgb25lIHRpY2sgcGVyaW9kIHdoaWNoIHNob3VsZCBiZSBhIHByZXR0eSByYXJlIGV2ZW50LgorCSAqLworCWRvIHsKKwkJdGltZXJfdGljayhyZWdzKTsKKwkJT1NTUiA9IE9TU1JfTTA7ICAvKiBDbGVhciBtYXRjaCBvbiB0aW1lciAwICovCisJCW5leHRfbWF0Y2ggPSAoT1NNUjAgKz0gTEFUQ0gpOworCX0gd2hpbGUoIChzaWduZWQgbG9uZykobmV4dF9tYXRjaCAtIE9TQ1IpIDw9IDggKTsKKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHB4YV90aW1lcl9pcnEgPSB7CisJLm5hbWUJCT0gIlBYQSBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gcHhhX3RpbWVyX2ludGVycnVwdAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHB4YV90aW1lcl9pbml0KHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHR2OworCisJc2V0X3J0YyA9IHB4YV9zZXRfcnRjOworCisJdHYudHZfbnNlYyA9IDA7CisJdHYudHZfc2VjID0gcHhhX2dldF9ydGNfdGltZSgpOworCWRvX3NldHRpbWVvZmRheSgmdHYpOworCisJT1NNUjAgPSAwOwkJLyogc2V0IGluaXRpYWwgbWF0Y2ggYXQgMCAqLworCU9TU1IgPSAweGY7CQkvKiBjbGVhciBzdGF0dXMgb24gYWxsIHRpbWVycyAqLworCXNldHVwX2lycShJUlFfT1NUMCwgJnB4YV90aW1lcl9pcnEpOworCU9JRVIgfD0gT0lFUl9FMDsJLyogZW5hYmxlIG1hdGNoIG9uIHRpbWVyIDAgdG8gY2F1c2UgaW50ZXJydXB0cyAqLworCU9TQ1IgPSAwOwkJLyogaW5pdGlhbGl6ZSBmcmVlLXJ1bm5pbmcgdGltZXIsIGZvcmNlIGZpcnN0IG1hdGNoICovCit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9zbXJbNF0sIG9pZXI7CisKK3N0YXRpYyB2b2lkIHB4YV90aW1lcl9zdXNwZW5kKHZvaWQpCit7CisJb3NtclswXSA9IE9TTVIwOworCW9zbXJbMV0gPSBPU01SMTsKKwlvc21yWzJdID0gT1NNUjI7CisJb3NtclszXSA9IE9TTVIzOworCW9pZXIgPSBPSUVSOworfQorCitzdGF0aWMgdm9pZCBweGFfdGltZXJfcmVzdW1lKHZvaWQpCit7CisJT1NNUjAgPSBvc21yWzBdOworCU9TTVIxID0gb3NtclsxXTsKKwlPU01SMiA9IG9zbXJbMl07CisJT1NNUjMgPSBvc21yWzNdOworCU9JRVIgPSBvaWVyOworCisJLyoKKwkgKiBPU01SMCBpcyB0aGUgc3lzdGVtIHRpbWVyOiBtYWtlIHN1cmUgT1NDUiBpcyBzdWZmaWNpZW50bHkgYmVoaW5kCisJICovCisJT1NDUiA9IE9TTVIwIC0gTEFUQ0g7Cit9CisjZWxzZQorI2RlZmluZSBweGFfdGltZXJfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHB4YV90aW1lcl9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzeXNfdGltZXIgcHhhX3RpbWVyID0geworCS5pbml0CQk9IHB4YV90aW1lcl9pbml0LAorCS5zdXNwZW5kCT0gcHhhX3RpbWVyX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBweGFfdGltZXJfcmVzdW1lLAorCS5vZmZzZXQJCT0gcHhhX2dldHRpbWVvZmZzZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXJwYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc3YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBPYmplY3QgZmlsZSBsaXN0cy4KKworb2JqLXkJCQk6PSBkbWEubyBpcnEubyByaXNjcGMubworb2JqLW0JCQk6PQorb2JqLW4JCQk6PQorb2JqLQkJCTo9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXJwYy9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOWU3Njg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDQgQEAKKyAgIHpyZWxhZGRyLXkJOj0gMHgxMDAwODAwMAorcGFyYW1zX3BoeXMteQk6PSAweDEwMDAwMTAwCitpbml0cmRfcGh5cy15CTo9IDB4MTgwMDAwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXJwYy9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzA3NDc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvZG1hLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1ycGMvZG1hLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIERNQSBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gUmlzY1BDIGFyY2hpdGVjdHVyZQorICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZmlxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9tZC5oPgorCisjaWYgMAordHlwZWRlZiBlbnVtIHsKKwlkbWFfc2l6ZV84CT0gMSwKKwlkbWFfc2l6ZV8xNgk9IDIsCisJZG1hX3NpemVfMzIJPSA0LAorCWRtYV9zaXplXzEyOAk9IDE2Cit9IGRtYV9zaXplX3Q7CisjZW5kaWYKKworI2RlZmluZSBUUkFOU0ZFUl9TSVpFCTIKKworI2RlZmluZSBDVVJBCSgwKQorI2RlZmluZSBFTkRBCShJT01EX0lPMEVOREEgLSBJT01EX0lPMENVUkEpCisjZGVmaW5lIENVUkIJKElPTURfSU8wQ1VSQiAtIElPTURfSU8wQ1VSQSkKKyNkZWZpbmUgRU5EQgkoSU9NRF9JTzBFTkRCIC0gSU9NRF9JTzBDVVJBKQorI2RlZmluZSBDUgkoSU9NRF9JTzBDUiAtIElPTURfSU8wQ1VSQSkKKyNkZWZpbmUgU1QJKElPTURfSU8wU1QgLSBJT01EX0lPMENVUkEpCisKK3N0YXRpYyB2b2lkIGlvbWRfZ2V0X25leHRfc2coc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgZG1hX3QgKmRtYSkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZCwgb2Zmc2V0LCBmbGFncyA9IDA7CisKKwlpZiAoZG1hLT5zZykgeworCQlzZy0+ZG1hX2FkZHJlc3MgPSBkbWEtPnNnLT5kbWFfYWRkcmVzczsKKwkJb2Zmc2V0ID0gc2ctPmRtYV9hZGRyZXNzICYgflBBR0VfTUFTSzsKKworCQllbmQgPSBvZmZzZXQgKyBkbWEtPnNnLT5sZW5ndGg7CisKKwkJaWYgKGVuZCA+IFBBR0VfU0laRSkKKwkJCWVuZCA9IFBBR0VfU0laRTsKKworCQlpZiAob2Zmc2V0ICsgVFJBTlNGRVJfU0laRSA+PSBlbmQpCisJCQlmbGFncyB8PSBETUFfRU5EX0w7CisKKwkJc2ctPmxlbmd0aCA9IGVuZCAtIFRSQU5TRkVSX1NJWkU7CisKKwkJZG1hLT5zZy0+bGVuZ3RoIC09IGVuZCAtIG9mZnNldDsKKwkJZG1hLT5zZy0+ZG1hX2FkZHJlc3MgKz0gZW5kIC0gb2Zmc2V0OworCisJCWlmIChkbWEtPnNnLT5sZW5ndGggPT0gMCkgeworCQkJaWYgKGRtYS0+c2djb3VudCA+IDEpIHsKKwkJCQlkbWEtPnNnKys7CisJCQkJZG1hLT5zZ2NvdW50LS07CisJCQl9IGVsc2UgeworCQkJCWRtYS0+c2cgPSBOVUxMOworCQkJCWZsYWdzIHw9IERNQV9FTkRfUzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZsYWdzID0gRE1BX0VORF9TIHwgRE1BX0VORF9MOworCQlzZy0+ZG1hX2FkZHJlc3MgPSAwOworCQlzZy0+bGVuZ3RoID0gMDsKKwl9CisKKwlzZy0+bGVuZ3RoIHw9IGZsYWdzOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW9tZF9kbWFfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZG1hX3QgKmRtYSA9IChkbWFfdCAqKWRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBkbWEtPmRtYV9iYXNlOworCisJZG8geworCQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJCXN0YXR1cyA9IGlvbWRfcmVhZGIoYmFzZSArIFNUKTsKKwkJaWYgKCEoc3RhdHVzICYgRE1BX1NUX0lOVCkpCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkJaWYgKChkbWEtPnN0YXRlIF4gc3RhdHVzKSAmIERNQV9TVF9BQikKKwkJCWlvbWRfZ2V0X25leHRfc2coJmRtYS0+Y3VyX3NnLCBkbWEpOworCisJCXN3aXRjaCAoc3RhdHVzICYgKERNQV9TVF9PRkwgfCBETUFfU1RfQUIpKSB7CisJCWNhc2UgRE1BX1NUX09GTDoJCQkvKiBPSUEgKi8KKwkJY2FzZSBETUFfU1RfQUI6CQkJCS8qIC5JQiAqLworCQkJaW9tZF93cml0ZWwoZG1hLT5jdXJfc2cuZG1hX2FkZHJlc3MsIGJhc2UgKyBDVVJBKTsKKwkJCWlvbWRfd3JpdGVsKGRtYS0+Y3VyX3NnLmxlbmd0aCwgYmFzZSArIEVOREEpOworCQkJZG1hLT5zdGF0ZSA9IERNQV9TVF9BQjsKKwkJCWJyZWFrOworCisJCWNhc2UgRE1BX1NUX09GTCB8IERNQV9TVF9BQjoJCS8qIE9JQiAqLworCQljYXNlIDA6CQkJCQkvKiAuSUEgKi8KKwkJCWlvbWRfd3JpdGVsKGRtYS0+Y3VyX3NnLmRtYV9hZGRyZXNzLCBiYXNlICsgQ1VSQik7CisJCQlpb21kX3dyaXRlbChkbWEtPmN1cl9zZy5sZW5ndGgsIGJhc2UgKyBFTkRCKTsKKwkJCWRtYS0+c3RhdGUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRE1BX1NUX09GTCAmJgorCQkgICAgZG1hLT5jdXJfc2cubGVuZ3RoID09IChETUFfRU5EX1N8RE1BX0VORF9MKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKDEpOworCisJZG1hLT5zdGF0ZSA9IH5ETUFfU1RfQUI7CisJZGlzYWJsZV9pcnEoaXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBpb21kX3JlcXVlc3RfZG1hKGRtYWNoX3QgY2hhbm5lbCwgZG1hX3QgKmRtYSkKK3sKKwlyZXR1cm4gcmVxdWVzdF9pcnEoZG1hLT5kbWFfaXJxLCBpb21kX2RtYV9oYW5kbGUsCisJCQkgICBTQV9JTlRFUlJVUFQsIGRtYS0+ZGV2aWNlX2lkLCBkbWEpOworfQorCitzdGF0aWMgdm9pZCBpb21kX2ZyZWVfZG1hKGRtYWNoX3QgY2hhbm5lbCwgZG1hX3QgKmRtYSkKK3sKKwlmcmVlX2lycShkbWEtPmRtYV9pcnEsIGRtYSk7Cit9CisKK3N0YXRpYyB2b2lkIGlvbWRfZW5hYmxlX2RtYShkbWFjaF90IGNoYW5uZWwsIGRtYV90ICpkbWEpCit7CisJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGRtYS0+ZG1hX2Jhc2U7CisJdW5zaWduZWQgaW50IGN0cmwgPSBUUkFOU0ZFUl9TSVpFIHwgRE1BX0NSX0U7CisKKwlpZiAoZG1hLT5pbnZhbGlkKSB7CisJCWRtYS0+aW52YWxpZCA9IDA7CisKKwkJLyoKKwkJICogQ29wZSB3aXRoIElTQS1zdHlsZSBkcml2ZXJzIHdoaWNoIGV4cGVjdCBjYWNoZQorCQkgKiBjb2hlcmVuY2UuCisJCSAqLworCQlpZiAoIWRtYS0+dXNpbmdfc2cpIHsKKwkJCWRtYS0+YnVmLmRtYV9hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUoTlVMTCwKKwkJCQlkbWEtPmJ1Zi5fX2FkZHJlc3MsIGRtYS0+YnVmLmxlbmd0aCwKKwkJCQlkbWEtPmRtYV9tb2RlID09IERNQV9NT0RFX1JFQUQgPworCQkJCVBDSV9ETUFfRlJPTURFVklDRSA6IFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisKKwkJaW9tZF93cml0ZWIoRE1BX0NSX0MsIGRtYV9iYXNlICsgQ1IpOworCQlkbWEtPnN0YXRlID0gRE1BX1NUX0FCOworCX0KKwkJCisJaWYgKGRtYS0+ZG1hX21vZGUgPT0gRE1BX01PREVfUkVBRCkKKwkJY3RybCB8PSBETUFfQ1JfRDsKKworCWlvbWRfd3JpdGViKGN0cmwsIGRtYV9iYXNlICsgQ1IpOworCWVuYWJsZV9pcnEoZG1hLT5kbWFfaXJxKTsKK30KKworc3RhdGljIHZvaWQgaW9tZF9kaXNhYmxlX2RtYShkbWFjaF90IGNoYW5uZWwsIGRtYV90ICpkbWEpCit7CisJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGRtYS0+ZG1hX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoZG1hLT5zdGF0ZSAhPSB+RE1BX1NUX0FCKQorCQlkaXNhYmxlX2lycShkbWEtPmRtYV9pcnEpOworCWlvbWRfd3JpdGViKDAsIGRtYV9iYXNlICsgQ1IpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCBpb21kX3NldF9kbWFfc3BlZWQoZG1hY2hfdCBjaGFubmVsLCBkbWFfdCAqZG1hLCBpbnQgY3ljbGUpCit7CisJaW50IHRjciwgc3BlZWQ7CisKKwlpZiAoY3ljbGUgPCAxODgpCisJCXNwZWVkID0gMzsKKwllbHNlIGlmIChjeWNsZSA8PSAyNTApCisJCXNwZWVkID0gMjsKKwllbHNlIGlmIChjeWNsZSA8IDQzOCkKKwkJc3BlZWQgPSAxOworCWVsc2UKKwkJc3BlZWQgPSAwOworCisJdGNyID0gaW9tZF9yZWFkYihJT01EX0RNQVRDUik7CisJc3BlZWQgJj0gMzsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgRE1BXzA6CisJCXRjciA9ICh0Y3IgJiB+MHgwMykgfCBzcGVlZDsKKwkJYnJlYWs7CisKKwljYXNlIERNQV8xOgorCQl0Y3IgPSAodGNyICYgfjB4MGMpIHwgKHNwZWVkIDw8IDIpOworCQlicmVhazsKKworCWNhc2UgRE1BXzI6CisJCXRjciA9ICh0Y3IgJiB+MHgzMCkgfCAoc3BlZWQgPDwgNCk7CisJCWJyZWFrOworCisJY2FzZSBETUFfMzoKKwkJdGNyID0gKHRjciAmIH4weGMwKSB8IChzcGVlZCA8PCA2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpb21kX3dyaXRlYih0Y3IsIElPTURfRE1BVENSKTsKKworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfb3BzIGlvbWRfZG1hX29wcyA9IHsKKwkudHlwZQkJPSAiSU9NRCIsCisJLnJlcXVlc3QJPSBpb21kX3JlcXVlc3RfZG1hLAorCS5mcmVlCQk9IGlvbWRfZnJlZV9kbWEsCisJLmVuYWJsZQkJPSBpb21kX2VuYWJsZV9kbWEsCisJLmRpc2FibGUJPSBpb21kX2Rpc2FibGVfZG1hLAorCS5zZXRzcGVlZAk9IGlvbWRfc2V0X2RtYV9zcGVlZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlxX2hhbmRsZXIgZmggPSB7CisJLm5hbWUJPSAiZmxvcHB5ZG1hIgorfTsKKworc3RhdGljIHZvaWQgZmxvcHB5X2VuYWJsZV9kbWEoZG1hY2hfdCBjaGFubmVsLCBkbWFfdCAqZG1hKQoreworCXZvaWQgKmZpcWhhbmRsZXJfc3RhcnQ7CisJdW5zaWduZWQgaW50IGZpcWhhbmRsZXJfbGVuZ3RoOworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisKKwlpZiAoZG1hLT51c2luZ19zZykKKwkJQlVHKCk7CisKKwlpZiAoZG1hLT5kbWFfbW9kZSA9PSBETUFfTU9ERV9SRUFEKSB7CisJCWV4dGVybiB1bnNpZ25lZCBjaGFyIGZsb3BweV9maXFpbl9zdGFydCwgZmxvcHB5X2ZpcWluX2VuZDsKKwkJZmlxaGFuZGxlcl9zdGFydCA9ICZmbG9wcHlfZmlxaW5fc3RhcnQ7CisJCWZpcWhhbmRsZXJfbGVuZ3RoID0gJmZsb3BweV9maXFpbl9lbmQgLSAmZmxvcHB5X2ZpcWluX3N0YXJ0OworCX0gZWxzZSB7CisJCWV4dGVybiB1bnNpZ25lZCBjaGFyIGZsb3BweV9maXFvdXRfc3RhcnQsIGZsb3BweV9maXFvdXRfZW5kOworCQlmaXFoYW5kbGVyX3N0YXJ0ID0gJmZsb3BweV9maXFvdXRfc3RhcnQ7CisJCWZpcWhhbmRsZXJfbGVuZ3RoID0gJmZsb3BweV9maXFvdXRfZW5kIC0gJmZsb3BweV9maXFvdXRfc3RhcnQ7CisJfQorCisJcmVncy5BUk1fcjkgID0gZG1hLT5idWYubGVuZ3RoOworCXJlZ3MuQVJNX3IxMCA9ICh1bnNpZ25lZCBsb25nKWRtYS0+YnVmLl9fYWRkcmVzczsKKwlyZWdzLkFSTV9mcCAgPSAodW5zaWduZWQgbG9uZylGTE9QUFlETUFfQkFTRTsKKworCWlmIChjbGFpbV9maXEoJmZoKSkgeworCQlwcmludGsoImZsb3BweWRtYTogY291bGRuJ3QgY2xhaW0gRklRLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZXRfZmlxX2hhbmRsZXIoZmlxaGFuZGxlcl9zdGFydCwgZmlxaGFuZGxlcl9sZW5ndGgpOworCXNldF9maXFfcmVncygmcmVncyk7CisJZW5hYmxlX2ZpcShkbWEtPmRtYV9pcnEpOworfQorCitzdGF0aWMgdm9pZCBmbG9wcHlfZGlzYWJsZV9kbWEoZG1hY2hfdCBjaGFubmVsLCBkbWFfdCAqZG1hKQoreworCWRpc2FibGVfZmlxKGRtYS0+ZG1hX2lycSk7CisJcmVsZWFzZV9maXEoJmZoKTsKK30KKworc3RhdGljIGludCBmbG9wcHlfZ2V0X3Jlc2lkdWUoZG1hY2hfdCBjaGFubmVsLCBkbWFfdCAqZG1hKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJZ2V0X2ZpcV9yZWdzKCZyZWdzKTsKKwlyZXR1cm4gcmVncy5BUk1fcjk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX29wcyBmbG9wcHlfZG1hX29wcyA9IHsKKwkudHlwZQkJPSAiRklRRE1BIiwKKwkuZW5hYmxlCQk9IGZsb3BweV9lbmFibGVfZG1hLAorCS5kaXNhYmxlCT0gZmxvcHB5X2Rpc2FibGVfZG1hLAorCS5yZXNpZHVlCT0gZmxvcHB5X2dldF9yZXNpZHVlLAorfTsKKworLyoKKyAqIFRoaXMgaXMgdmlydHVhbCBETUEgLSB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNvdW5kX2VuYWJsZV9kaXNhYmxlX2RtYShkbWFjaF90IGNoYW5uZWwsIGRtYV90ICpkbWEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX29wcyBzb3VuZF9kbWFfb3BzID0geworCS50eXBlCQk9ICJWSVJUVUFMIiwKKwkuZW5hYmxlCQk9IHNvdW5kX2VuYWJsZV9kaXNhYmxlX2RtYSwKKwkuZGlzYWJsZQk9IHNvdW5kX2VuYWJsZV9kaXNhYmxlX2RtYSwKK307CisKK3ZvaWQgX19pbml0IGFyY2hfZG1hX2luaXQoZG1hX3QgKmRtYSkKK3sKKwlpb21kX3dyaXRlYigwLCBJT01EX0lPMENSKTsKKwlpb21kX3dyaXRlYigwLCBJT01EX0lPMUNSKTsKKwlpb21kX3dyaXRlYigwLCBJT01EX0lPMkNSKTsKKwlpb21kX3dyaXRlYigwLCBJT01EX0lPM0NSKTsKKworCWlvbWRfd3JpdGViKDB4YTAsIElPTURfRE1BVENSKTsKKworCWRtYVtETUFfMF0uZG1hX2Jhc2UJCT0gSU9NRF9JTzBDVVJBOworCWRtYVtETUFfMF0uZG1hX2lycQkJPSBJUlFfRE1BMDsKKwlkbWFbRE1BXzBdLmRfb3BzCQk9ICZpb21kX2RtYV9vcHM7CisJZG1hW0RNQV8xXS5kbWFfYmFzZQkJPSBJT01EX0lPMUNVUkE7CisJZG1hW0RNQV8xXS5kbWFfaXJxCQk9IElSUV9ETUExOworCWRtYVtETUFfMV0uZF9vcHMJCT0gJmlvbWRfZG1hX29wczsKKwlkbWFbRE1BXzJdLmRtYV9iYXNlCQk9IElPTURfSU8yQ1VSQTsKKwlkbWFbRE1BXzJdLmRtYV9pcnEJCT0gSVJRX0RNQTI7CisJZG1hW0RNQV8yXS5kX29wcwkJPSAmaW9tZF9kbWFfb3BzOworCWRtYVtETUFfM10uZG1hX2Jhc2UJCT0gSU9NRF9JTzNDVVJBOworCWRtYVtETUFfM10uZG1hX2lycQkJPSBJUlFfRE1BMzsKKwlkbWFbRE1BXzNdLmRfb3BzCQk9ICZpb21kX2RtYV9vcHM7CisJZG1hW0RNQV9TMF0uZG1hX2Jhc2UJCT0gSU9NRF9TRDBDVVJBOworCWRtYVtETUFfUzBdLmRtYV9pcnEJCT0gSVJRX0RNQVMwOworCWRtYVtETUFfUzBdLmRfb3BzCQk9ICZpb21kX2RtYV9vcHM7CisJZG1hW0RNQV9TMV0uZG1hX2Jhc2UJCT0gSU9NRF9TRDFDVVJBOworCWRtYVtETUFfUzFdLmRtYV9pcnEJCT0gSVJRX0RNQVMxOworCWRtYVtETUFfUzFdLmRfb3BzCQk9ICZpb21kX2RtYV9vcHM7CisJZG1hW0RNQV9WSVJUVUFMX0ZMT1BQWV0uZG1hX2lycQk9IEZJUV9GTE9QUFlEQVRBOworCWRtYVtETUFfVklSVFVBTF9GTE9QUFldLmRfb3BzCT0gJmZsb3BweV9kbWFfb3BzOworCWRtYVtETUFfVklSVFVBTF9TT1VORF0uZF9vcHMJPSAmc291bmRfZG1hX29wczsKKworCS8qCisJICogU2V0dXAgRE1BIGNoYW5uZWxzIDIsMyB0byBiZSBmb3IgcG9kdWxlcworCSAqIGFuZCBjaGFubmVscyAwLDEgZm9yIGludGVybmFsIGRldmljZXMKKwkgKi8KKwlpb21kX3dyaXRlYihETUFfRVhUX0lPM3xETUFfRVhUX0lPMiwgSU9NRF9ETUFFWFQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXJwYy9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmIyNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaXJxLmMKQEAgLTAsMCArMSwxNjIgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyB2b2lkIGlvbWRfYWNrX2lycV9hKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHZhbCwgbWFzazsKKworCW1hc2sgPSAxIDw8IGlycTsKKwl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0EpOworCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0lSUU1BU0tBKTsKKwlpb21kX3dyaXRlYihtYXNrLCBJT01EX0lSUUNMUkEpOworfQorCitzdGF0aWMgdm9pZCBpb21kX21hc2tfaXJxX2EodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOworCisJbWFzayA9IDEgPDwgaXJxOworCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9JUlFNQVNLQSk7CisJaW9tZF93cml0ZWIodmFsICYgfm1hc2ssIElPTURfSVJRTUFTS0EpOworfQorCitzdGF0aWMgdm9pZCBpb21kX3VubWFza19pcnFfYSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCBpcnE7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tBKTsKKwlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tBKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGlvbWRfYV9jaGlwID0geworCS5hY2sJPSBpb21kX2Fja19pcnFfYSwKKwkubWFzawk9IGlvbWRfbWFza19pcnFfYSwKKwkudW5tYXNrID0gaW9tZF91bm1hc2tfaXJxX2EsCit9OworCitzdGF0aWMgdm9pZCBpb21kX21hc2tfaXJxX2IodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOworCisJbWFzayA9IDEgPDwgKGlycSAmIDcpOworCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9JUlFNQVNLQik7CisJaW9tZF93cml0ZWIodmFsICYgfm1hc2ssIElPTURfSVJRTUFTS0IpOworfQorCitzdGF0aWMgdm9pZCBpb21kX3VubWFza19pcnFfYih1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tCKTsKKwlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tCKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGlvbWRfYl9jaGlwID0geworCS5hY2sJPSBpb21kX21hc2tfaXJxX2IsCisJLm1hc2sJPSBpb21kX21hc2tfaXJxX2IsCisJLnVubWFzayA9IGlvbWRfdW5tYXNrX2lycV9iLAorfTsKKworc3RhdGljIHZvaWQgaW9tZF9tYXNrX2lycV9kbWEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOworCisJbWFzayA9IDEgPDwgKGlycSAmIDcpOworCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9ETUFNQVNLKTsKKwlpb21kX3dyaXRlYih2YWwgJiB+bWFzaywgSU9NRF9ETUFNQVNLKTsKK30KKworc3RhdGljIHZvaWQgaW9tZF91bm1hc2tfaXJxX2RtYSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0RNQU1BU0spOworCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfRE1BTUFTSyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpb21kX2RtYV9jaGlwID0geworCS5hY2sJPSBpb21kX21hc2tfaXJxX2RtYSwKKwkubWFzawk9IGlvbWRfbWFza19pcnFfZG1hLAorCS51bm1hc2sgPSBpb21kX3VubWFza19pcnFfZG1hLAorfTsKKworc3RhdGljIHZvaWQgaW9tZF9tYXNrX2lycV9maXEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOworCisJbWFzayA9IDEgPDwgKGlycSAmIDcpOworCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9GSVFNQVNLKTsKKwlpb21kX3dyaXRlYih2YWwgJiB+bWFzaywgSU9NRF9GSVFNQVNLKTsKK30KKworc3RhdGljIHZvaWQgaW9tZF91bm1hc2tfaXJxX2ZpcSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CisKKwltYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdmFsID0gaW9tZF9yZWFkYihJT01EX0ZJUU1BU0spOworCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfRklRTUFTSyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpb21kX2ZpcV9jaGlwID0geworCS5hY2sJPSBpb21kX21hc2tfaXJxX2ZpcSwKKwkubWFzawk9IGlvbWRfbWFza19pcnFfZmlxLAorCS51bm1hc2sgPSBpb21kX3VubWFza19pcnFfZmlxLAorfTsKKwordm9pZCBfX2luaXQgcnBjX2luaXRfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGlycSwgZmxhZ3M7CisKKwlpb21kX3dyaXRlYigwLCBJT01EX0lSUU1BU0tBKTsKKwlpb21kX3dyaXRlYigwLCBJT01EX0lSUU1BU0tCKTsKKwlpb21kX3dyaXRlYigwLCBJT01EX0ZJUU1BU0spOworCWlvbWRfd3JpdGViKDAsIElPTURfRE1BTUFTSyk7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCWZsYWdzID0gSVJRRl9WQUxJRDsKKworCQlpZiAoaXJxIDw9IDYgfHwgKGlycSA+PSA5ICYmIGlycSA8PSAxNSkpCisJCQlmbGFncyB8PSBJUlFGX1BST0JFOworCisJCWlmIChpcnEgPT0gMjEgfHwgKGlycSA+PSAxNiAmJiBpcnEgPD0gMTkpIHx8CisJCSAgICBpcnEgPT0gSVJRX0tFWUJPQVJEVFgpCisJCQlmbGFncyB8PSBJUlFGX05PQVVUT0VOOworCisJCXN3aXRjaCAoaXJxKSB7CisJCWNhc2UgMCAuLi4gNzoKKwkJCXNldF9pcnFfY2hpcChpcnEsICZpb21kX2FfY2hpcCk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgOCAuLi4gMTU6CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaW9tZF9iX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIDE2IC4uLiAyMToKKwkJCXNldF9pcnFfY2hpcChpcnEsICZpb21kX2RtYV9jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSA2NCAuLi4gNzE6CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaW9tZF9maXFfY2hpcCk7CisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWluaXRfRklRKCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1YzUzMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmaXh1cHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2RvbWFpbi5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworZXh0ZXJuIHZvaWQgcnBjX2luaXRfaXJxKHZvaWQpOworCitleHRlcm4gdW5zaWduZWQgaW50IHZyYW1fc2l6ZTsKKworI2lmIDAKKwordW5zaWduZWQgaW50IG1lbWNfY3RybF9yZWc7Cit1bnNpZ25lZCBpbnQgbnVtYmVyX21mbV9kcml2ZXM7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19hY29ybihjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJbWVtY19jdHJsX3JlZyA9IHRhZy0+dS5hY29ybi5tZW1jX2NvbnRyb2xfcmVnOworCW51bWJlcl9tZm1fZHJpdmVzID0gdGFnLT51LmFjb3JuLmFkZnNkcml2ZXM7CisKKwlzd2l0Y2ggKHRhZy0+dS5hY29ybi52cmFtX3BhZ2VzKSB7CisJY2FzZSA1MTI6CisJCXZyYW1fc2l6ZSArPSBQQUdFX1NJWkUgKiAyNTY7CisJY2FzZSAyNTY6CisJCXZyYW1fc2l6ZSArPSBQQUdFX1NJWkUgKiAyNTY7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2lmIDAKKwlpZiAodnJhbV9zaXplKSB7CisJCWRlc2MtPnZpZGVvX3N0YXJ0ID0gMHgwMjAwMDAwMDsKKwkJZGVzYy0+dmlkZW9fZW5kICAgPSAweDAyMDAwMDAwICsgdnJhbV9zaXplOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfQUNPUk4sIHBhcnNlX3RhZ19hY29ybik7CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHJwY19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IFNDUkVFTl9CQVNFLAlTQ1JFRU5fU1RBUlQsCTIqMTA0ODU3NiwgTVRfREVWSUNFIH0sIC8qIFZSQU0JCSovCisgeyAodTMyKUlPX0JBU0UsIElPX1NUQVJULAlJT19TSVpFCSAsIE1UX0RFVklDRSB9LCAvKiBJTyBzcGFjZQkqLworIHsgRUFTSV9CQVNFLAlFQVNJX1NUQVJULAlFQVNJX1NJWkUsIE1UX0RFVklDRSB9ICAvKiBFQVNJIHNwYWNlCSovCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgcnBjX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChycGNfaW9fZGVzYywgQVJSQVlfU0laRShycGNfaW9fZGVzYykpOworCisJLyoKKwkgKiBUdXJuIG9mZiBmbG9wcHkuCisJICovCisJb3V0YigweGMsIDB4M2YyKTsKKworCS8qCisJICogUmlzY1BDIGNhbid0IGhhbmRsZSBoYWxmLXdvcmQgbG9hZHMgYW5kIHN0b3JlcworCSAqLworCWVsZl9od2NhcCAmPSB+SFdDQVBfSEFMRjsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhY29ybmZiX3Jlc291cmNlc1tdID0geworCXsJLyogVklEQyAqLworCQkuc3RhcnQJCT0gMHgwMzQwMDAwMCwKKwkJLmVuZAkJPSAweDAzNWZmZmZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJCT0gSVJRX1ZTWU5DUFVMU0UsCisJCS5lbmQJCT0gSVJRX1ZTWU5DUFVMU0UsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYWNvcm5mYl9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJhY29ybmZiIiwKKwkuaWQJCQk9IC0xLAorCS5kZXYJCQk9IHsKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUoYWNvcm5mYl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQkJPSBhY29ybmZiX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9tZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSAweDAzMjAwMDAwLAorCQkuZW5kCQk9IDB4MDMyMGZmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9tZF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJpb21kIiwKKwkuaWQJCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUoaW9tZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQkJPSBpb21kX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGtiZF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJrYXJ0IiwKKwkuaWQJCQk9IC0xLAorCS5kZXYJCQk9IHsKKwkJLnBhcmVudCAJPSAmaW9tZF9kZXZpY2UuZGV2LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4MDMwMTBmZTAsCisJCS5pcnEJCT0gMTAsCisJCS51YXJ0Y2xrCT0gMTg0MzIwMCwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVAgfCBVUEZfU0tJUF9URVNULAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZzW10gX19pbml0ZGF0YSA9IHsKKwkmaW9tZF9kZXZpY2UsCisJJmtiZF9kZXZpY2UsCisJJnNlcmlhbF9kZXZpY2UsCisJJmFjb3JuZmJfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcnBjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2cywgQVJSQVlfU0laRShkZXZzKSk7Cit9CisKK2FyY2hfaW5pdGNhbGwocnBjX2luaXQpOworCitleHRlcm4gc3RydWN0IHN5c190aW1lciBpb2NfdGltZXI7CisKK01BQ0hJTkVfU1RBUlQoUklTQ1BDLCAiQWNvcm4tUmlzY1BDIikKKwlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmciKQorCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4MDMwMDAwMDAsIDB4ZTAwMDAwMDApCisJQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKKwlESVNBQkxFX1BBUlBPUlQoMCkKKwlESVNBQkxFX1BBUlBPUlQoMSkKKwlNQVBJTyhycGNfbWFwX2lvKQorCUlOSVRJUlEocnBjX2luaXRfaXJxKQorCS50aW1lcgkJPSAmaW9jX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0ZGYwYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCkBAIC0wLDAgKzEsMTY5IEBACitpZiBBUkNIX1MzQzI0MTAKKworbWVudSAiUzNDMjRYWCBJbXBsZW1lbnRhdGlvbnMiCisKK2NvbmZpZyBBUkNIX0JBU1QKKwlib29sICJTaW10ZWMgRWxlY3Ryb25pY3MgQkFTVCAoRUIyNDEwSVRYKSIKKwlzZWxlY3QgQ1BVX1MzQzI0MTAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIFNpbXRlYyBFbGVjdHJvbmljcyBFQjI0MTBJVFgKKwkgIGRldmVsb3BtZW50IGJvYXJkIChhbHNvIGtub3duIGFzIEJBU1QpCisKKwkgIFByb2R1Y3QgcGFnZTogPGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL0VCMjQxMElUWC8+LgorCitjb25maWcgQVJDSF9IMTk0MAorCWJvb2wgIklQQVEgSDE5NDAiCisJc2VsZWN0IENQVV9TM0MyNDEwCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBIUCBJUEFRIEgxOTQwCisKKwkgIDxodHRwOi8vd3d3LmhhbmRoZWxkcy5vcmcvcHJvamVjdHMvaDE5NDAuaHRtbD4uCisKK2NvbmZpZyBNQUNIX04zMAorCWJvb2wgIkFjZXIgTjMwIgorCXNlbGVjdCBDUFVfUzNDMjQxMAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgQWNlciBOMzAKKworCSAgPGh0dHA6Ly96b28ud2VpbmlnZWwuc2UvbjMwPi4KKworY29uZmlnIEFSQ0hfU01ESzI0MTAKKwlib29sICJTTURLMjQxMC9BOU0yNDEwIgorCXNlbGVjdCBDUFVfUzNDMjQxMAorCWhlbHAKKwkgICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIFNNREsyNDEwIG9yIHRoZSBkZXJpdmVkIG1vZHVsZSBBOU0yNDEwCisgICAgICAgICAgIDxodHRwOi8vd3d3LmZzZm9ydGguZGU+CisKK2NvbmZpZyBBUkNIX1MzQzI0NDAKKwlib29sICJTTURLMjQ0MCIKKwlzZWxlY3QgQ1BVX1MzQzI0NDAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIFNNREsyNDQwLgorCitjb25maWcgTUFDSF9WUjEwMDAKKwlib29sICJUaG9yY29tIFZSMTAwMCIKKwlzZWxlY3QgQ1BVX1MzQzI0MTAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIFRob3Jjb20gVlIxMDAwIGJvYXJkLgorCisJICBUaGlzIGxpbnV4IHBvcnQgaXMgY3VycmVudGx5IGJlaW5nIG1haW50YWluZWQgYnkgU2ltdGVjLCBvbiBiZWhhbGYKKwkgIG9mIFRob3Jjb20uIEFueSBxdWVyaWVzLCBwbGVhc2UgY29udGFjdCBUaG9yY29tIGZpcnN0LgorCitjb25maWcgTUFDSF9SWDM3MTUKKwlib29sICJIUCBpUEFRIHJ4MzcxNSIKKwlzZWxlY3QgQ1BVX1MzQzI0NDAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEhQIGlQQVEgcngzNzE1LgorCisJICBTZWUgPGh0dHA6Ly93d3cuaGFuZGhlbGRzLm9yZy9wcm9qZWN0cy9yeDM3MTUuaHRtbD4gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uIG9uIHRoaXMgcHJvamVjdAorCitjb25maWcgTUFDSF9PVE9NCisgCWJvb2wgIk5leFZpc2lvbiBPVE9NIEJvYXJkIgorIAlzZWxlY3QgQ1BVX1MzQzI0MTAKKwloZWxwCisgCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBOZXggVmlzaW9uIE9UT00gYm9hcmQKKworY29uZmlnIE1BQ0hfTkVYQ09ERVJfMjQ0MAorIAlib29sICJOZXhWaXNpb24gTkVYQ09ERVIgMjQ0MCBMaWdodCBCb2FyZCIKKyAJc2VsZWN0IENQVV9TM0MyNDQwCisJaGVscAorIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgTmV4IFZpc2lvbiBORVhDT0RFUiAyNDQwIExpZ2h0IEJvYXJkCisKK2VuZG1lbnUKKworY29uZmlnIENQVV9TM0MyNDEwCisJYm9vbAorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCisJaGVscAorCSAgU3VwcG9ydCBmb3IgUzNDMjQxMCBhbmQgUzNDMjQxMEEgZmFtaWx5IGZyb20gdGhlIFMzQzI0WFggbGluZQorCSAgb2YgU2Ftc3VuZyBNb2JpbGUgQ1BVcy4KKworY29uZmlnIENQVV9TM0MyNDQwCisJYm9vbAorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCisJaGVscAorCSAgU3VwcG9ydCBmb3IgUzNDMjQ0MCBTYW1zdW5nIE1vYmlsZSBDUFUgYmFzZWQgc3lzdGVtcy4KKworY29tbWVudCAiUzNDMjQxMCBCb290IgorCitjb25maWcgUzNDMjQxMF9CT09UX1dBVENIRE9HCisJYm9vbCAiUzNDMjQxMCBJbml0aWFsaXNhdGlvbiB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCAmJiBTM0MyNDEwX1dBVENIRE9HCisJaGVscAorCSAgU2F5IHkgdG8gZW5hYmxlIHRoZSB3YXRjaGRvZyBkdXJpbmcgdGhlIGtlcm5lbCBkZWNvbXByZXNzaW9uCisJICBzdGFnZS4gSWYgdGhlIGtlcm5lbCBmYWlscyB0byB1bmNvbXByZXNzLCB0aGVuIHRoZSB3YXRjaGRvZworCSAgd2lsbCB0cmlnZ2VyIGEgcmVzZXQgYW5kIHRoZSBzeXN0ZW0gc2hvdWxkIHJlc3RhcnQuCisKKwkgIEFsdGhvdWdoIHRoaXMgdXNlcyB0aGUgc2FtZSBoYXJkd2FyZSB1bml0IGFzIHRoZSBrZXJuZWwgd2F0Y2hkb2cKKwkgIGRyaXZlciwgaXQgaXMgbm90IGEgcmVwbGFjZW1lbnQgZm9yIGl0LiBJZiB5b3UgdXNlIHRoaXMgb3B0aW9uLAorCSAgeW91IHdpbGwgaGF2ZSB0byB1c2UgdGhlIHdhdGNoZGcgZHJpdmVyIHRvIGVpdGhlciBzdG9wIHRoZSB0aW1lb3V0CisJICBvciByZXN0YXJ0IGl0LiBJZiB5b3UgZG8gbm90LCB0aGVuIHlvdXIga2VybmVsIHdpbGwgcmVib290IGFmdGVyCisJICBzdGFydHVwLgorCisJICBUaGUgZHJpdmVyIHVzZXMgYSBmaXhlZCB0aW1lb3V0IHZhbHVlLCBzbyB0aGUgZXhhY3QgdGltZSB0aWxsIHRoZQorCSAgc3lzdGVtIHJlc2V0cyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBQQ0xLLiBUaGUgdGltZW91dCBvbiBhbgorCSAgMjAwTUh6IHMzYzI0MTAgc2hvdWxkIGJlIGFib3V0IDMwIHNlY29uZHMuCisKK2NvbW1lbnQgIlMzQzI0MTAgU2V0dXAiCisKK2NvbmZpZyBTM0MyNDEwX0RNQQorCWJvb2wgIlMzQzI0MTAgRE1BIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKKwloZWxwCisJICBTM0MyNDEwIERNQSBzdXBwb3J0LiBUaGlzIGlzIG5lZWRlZCBmb3IgZHJpdmVycyBsaWtlIHNvdW5kIHdoaWNoCisJICB1c2UgdGhlIFMzQzI0MTAncyBETUEgc3lzdGVtIHRvIG1vdmUgZGF0YSB0byBhbmQgZnJvbSB0aGUKKwkgIHBlcmlwaGVyYWwgYmxvY2tzLgorCitjb25maWcgUzNDMjQxMF9ETUFfREVCVUcKKwlib29sICJTM0MyNDEwIERNQSBzdXBwb3J0IGRlYnVnIgorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmIFMzQzI0MTBfRE1BCisJaGVscAorCSAgRW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQgZm9yIHRoZSBETUEgY29kZS4gVGhpcyBvcHRpb24gc2VuZHMgaW5mbworCSAgdG8gdGhlIGtlcm5lbCBsb2csIGF0IHByaW9yaXR5IEtFUk5fREVCVUcuCisKKwkgIE5vdGUsIGl0IGlzIGVhc3kgdG8gY3JlYXRlIGFuZCBmaWxsIHRoZSBsb2cgYnVmZmVyIGluIGEgc21hbGwKKwkgIGFtb3VudCBvZiB0aW1lLCBhcyB3ZWxsIGFzIHVzaW5nIGFuIHNpZ25pZmljYW50IHBlcmNlbnRhZ2Ugb2YKKwkgIHRoZSBDUFUgdGltZSBkb2luZyBzby4KKworCitjb25maWcgUzNDMjQxMF9QTV9ERUJVRworCWJvb2wgIlMzQzI0MTAgUE0gU3VzcGVuZCBkZWJ1ZyIKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCAmJiBQTQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdmVyYm9zZSBkZWJ1Z2dpbmcgZnJvbSB0aGUgUE0gU3VzcGVuZCBhbmQKKwkgIFJlc3VtZSBjb2RlLiBTZWUgYERvY3VtZW50YXRpb24vYXJtL1NhbXNpbmctUzNDMjRYWC9TdXNwZW5kLnR4dGAKKwkgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgUzNDMjQxMF9QTV9DSEVDSworCWJvb2wgIlMzQzI0MTAgUE0gU3VzcGVuZCBNZW1vcnkgQ1JDIgorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmIFBNICYmIENSQzMyCisJaGVscAorIAkgIEVuYWJsZSB0aGUgUE0gY29kZSdzIG1lbW9yeSBhcmVhIGNoZWNrc3VtIG92ZXIgc2xlZXAuIFRoaXMgb3B0aW9uCisJICB3aWxsIGdlbmVyYXRlIENSQ3Mgb2YgYWxsIGJsb2NrcyBvZiBtZW1vcnksIGFuZCBzdG9yZSB0aGVtIGJlZm9yZQorCSAgZ29pbmcgdG8gc2xlZXAuIFRoZSBibG9ja3MgYXJlIHRoZW4gY2hlY2tlZCBvbiByZXN1bWUgZm9yIGFueQorCSAgZXJyb3JzLgorCitjb25maWcgUzNDMjQxMF9QTV9DSEVDS19DSFVOS1NJWkUKKwlpbnQgIlMzQzI0MTAgUE0gU3VzcGVuZCBDUkMgQ2h1bmtzaXplIChLaUIpIgorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmIFBNICYmIFMzQzI0MTBfUE1fQ0hFQ0sKKwlkZWZhdWx0IDY0CisJaGVscAorCSAgU2V0IHRoZSBjaHVua3NpemUgaW4gS2lsb2J5dGVzIG9mIHRoZSBDUkMgZm9yIGNoZWNraW5nIG1lbW9yeQorCSAgY29ycnVwdGlvbiBvdmVyIHN1c3BlbmQgYW5kIHJlc3VtZS4gQSBzbWFsbGVyIHZhbHVlIHdpbGwgbWVhbiB0aGF0CisJICB0aGUgQ1JDIGRhdGEgYmxvY2sgd2lsbCB0YWtlIG1vcmUgbWVtb3J5LCBidXQgd2lsIGlkZW50aWZ5IGFueQorCSAgZmF1bHRzIHdpdGggYmV0dGVyIHByZWNpc2lvbi4KKworY29uZmlnIFMzQzI0MTBfTE9XTEVWRUxfVUFSVF9QT1JUCisJaW50ICJTM0MyNDEwIFVBUlQgdG8gdXNlIGZvciBsb3ctbGV2ZWwgbWVzc2FnZXMiCisJZGVmYXVsdCAwCisJaGVscAorCSAgQ2hvaWNlIG9mIHdoaWNoIFVBUlQgcG9ydCB0byB1c2UgZm9yIHRoZSBsb3ctbGV2ZWwgbWVzc2FnZXMsCisJICBzdWNoIGFzIHRoZSBgVW5jb21wcmVzc2luZy4uLmAgYXQgc3RhcnQgdGltZS4gVGhlIHZhbHVlIG9mCisJICB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGJldHdlZW4gemVybyBhbmQgdHdvLiBUaGUgcG9ydAorCSAgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgYnkgdGhlIGJvb3QtbG9hZGVyIGJlZm9yZSB1c2UuCisKKwkgIE5vdGUsIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBwb3J0IHVzZWQgYnkgdGhlIGRlYnVnIG1lc3NhZ2VzLAorCSAgd2hpY2ggaXMgYSBzZXBhcmF0ZSBjb25maWd1cmF0aW9uLgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzc5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKQEAgLTAsMCArMSwzNiBAQAorCisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCisjIE9iamVjdCBmaWxlIGxpc3RzLgorCitvYmoteQkJCTo9IGNwdS5vIGlycS5vIHRpbWUubyBncGlvLm8gY2xvY2subyBkZXZzLm8KK29iai1tCQkJOj0KK29iai1uCQkJOj0KK29iai0JCQk6PQorCisjIFMzQzI0MTAgc3VwcG9ydCBmaWxlcworCitvYmotJChDT05GSUdfQ1BVX1MzQzI0MTApICArPSBzM2MyNDEwLm8KK29iai0kKENPTkZJR19TM0MyNDEwX0RNQSkgICs9IGRtYS5vCisKKyMgUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0CisKK29iai0kKENPTkZJR19QTSkJICAgKz0gcG0ubyBzbGVlcC5vCisKKyMgUzNDMjQ0MCBzdXBwb3J0CisKK29iai0kKENPTkZJR19DUFVfUzNDMjQ0MCkgICs9IHMzYzI0NDAubyBzM2MyNDQwLWRzYy5vCisKKyMgbWFjaGluZSBzcGVjaWZpYyBzdXBwb3J0CisKK29iai0kKENPTkZJR19BUkNIX0JBU1QpCQkrPSBtYWNoLWJhc3QubyB1c2Itc2ltdGVjLm8KK29iai0kKENPTkZJR19BUkNIX0gxOTQwKQkrPSBtYWNoLWgxOTQwLm8KK29iai0kKENPTkZJR19NQUNIX04zMCkJCSs9IG1hY2gtbjMwLm8KK29iai0kKENPTkZJR19BUkNIX1NNREsyNDEwKQkrPSBtYWNoLXNtZGsyNDEwLm8KK29iai0kKENPTkZJR19BUkNIX1MzQzI0NDApCSs9IG1hY2gtc21kazI0NDAubworb2JqLSQoQ09ORklHX01BQ0hfVlIxMDAwKQkrPSBtYWNoLXZyMTAwMC5vIHVzYi1zaW10ZWMubworb2JqLSQoQ09ORklHX01BQ0hfUlgzNzE1KQkrPSBtYWNoLXJ4MzcxNS5vCitvYmotJChDT05GSUdfTUFDSF9PVE9NKQkJKz0gbWFjaC1vdG9tLm8KK29iai0kKENPTkZJR19NQUNIX05FWENPREVSXzI0NDApICs9IG1hY2gtbmV4Y29kZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFiMmEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSwzIEBACisgICB6cmVsYWRkci15CTo9IDB4MzAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHgzMDAwMDEwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWJiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYwpAQCAtMCwwICsxLDEzMiBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Jhc3QtaXJxLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9FQjI0MTBJVFgvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiAgICAgMDgtSmFuLTIwMDMgQkpEICBNb3ZlZCBmcm9tIGNlbnRyYWwgSVJRIGNvZGUKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvczNjMjQxMC9pcnEuaD4KKworI2lmIDAKKyNpbmNsdWRlIDxhc20vZGVidWctbGwuaD4KKyNlbmRpZgorCisjZGVmaW5lIGlycWRiZih4Li4uKQorI2RlZmluZSBpcnFkYmYyKHguLi4pCisKKworLyogaGFuZGxlIFBDMTA0IElTQSBpbnRlcnJ1cHRzIGZyb20gdGhlIHN5c3RlbSBDUExEICovCisKKy8qIHRhYmxlIG9mIElTQSBpcnEgbm9zIHRvIHRoZSByZWxldmFudCBtYXNrLi4uIHplcm8gbWVhbnMKKyAqIHRoZSBpcnEgaXMgbm90IGltcGxlbWVudGVkCisqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmFzdF9wYzEwNF9pcnFtYXNrc1tdID0geworCTAsICAgLyogMCAqLworCTAsICAgLyogMSAqLworCTAsICAgLyogMiAqLworCTEsICAgLyogMyAqLworCTAsICAgLyogNCAqLworCTIsICAgLyogNSAqLworCTAsICAgLyogNiAqLworCTQsICAgLyogNyAqLworCTAsICAgLyogOCAqLworCTAsICAgLyogOSAqLworCTgsICAgLyogMTAgKi8KKwkwLCAgIC8qIDExICovCisJMCwgICAvKiAxMiAqLworCTAsICAgLyogMTMgKi8KKwkwLCAgIC8qIDE0ICovCisJMCwgICAvKiAxNSAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmFzdF9wYzEwNF9pcnFzW10gPSB7IDMsIDUsIDcsIDEwIH07CisKK3N0YXRpYyB2b2lkCitiYXN0X3BjMTA0X21hc2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworCXRlbXAgPSBfX3Jhd19yZWFkYihCQVNUX1ZBX1BDMTA0X0lSUU1BU0spOworCXRlbXAgJj0gfmJhc3RfcGMxMDRfaXJxbWFza3NbaXJxbm9dOworCV9fcmF3X3dyaXRlYih0ZW1wLCBCQVNUX1ZBX1BDMTA0X0lSUU1BU0spOworCisJaWYgKHRlbXAgPT0gMCkKKwkJYmFzdF9leHRpbnRfbWFzayhJUlFfSVNBKTsKK30KKworc3RhdGljIHZvaWQKK2Jhc3RfcGMxMDRfYWNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwliYXN0X2V4dGludF9hY2soSVJRX0lTQSk7Cit9CisKK3N0YXRpYyB2b2lkCitiYXN0X3BjMTA0X3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCisJdGVtcCA9IF9fcmF3X3JlYWRiKEJBU1RfVkFfUEMxMDRfSVJRTUFTSyk7CisJdGVtcCB8PSBiYXN0X3BjMTA0X2lycW1hc2tzW2lycW5vXTsKKwlfX3Jhd193cml0ZWIodGVtcCwgQkFTVF9WQV9QQzEwNF9JUlFNQVNLKTsKKworCWJhc3RfZXh0aW50X3VubWFzayhJUlFfSVNBKTsKK30KKworc3RhdGljIHN0cnVjdCBiYXN0X3BjMTA0X2NoaXAgPSB7CisJLm1hc2sJICAgICA9IGJhc3RfcGMxMDRfbWFzaywKKwkudW5tYXNrCSAgICAgPSBiYXN0X3BjMTA0X3VubWFzaywKKwkuYWNrCSAgICAgPSBiYXN0X3BjMTA0X2FjaworfTsKKworc3RhdGljIHZvaWQKK2Jhc3RfaXJxX3BjMTA0X2RlbXV4KHVuc2lnbmVkIGludCBpcnEsCisJCSAgICAgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IHN0YXQ7CisJdW5zaWduZWQgaW50IGlycW5vOworCWludCBpOworCisJc3RhdCA9IF9fcmF3X3JlYWRiKEJBU1RfVkFfUEMxMDRfSVJRUkVRKSAmIDB4ZjsKKworCWZvciAoaSA9IDA7IGkgPCA0ICYmIHN0YXQgIT0gMDsgaSsrKSB7CisJCWlmIChzdGF0ICYgMSkgeworCQkJaXJxbm8gPSBiYXN0X3BjMTA0X2lycXNbaV07CisJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnFubzsKKworCQkJZGVzYy0+aGFuZGxlKGlycW5vLCBkZXNjLCByZWdzKTsKKwkJfQorCisJCXN0YXQgPj49IDE7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Jhc3QuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkMDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LmgKQEAgLTAsMCArMSwyIEBACisKK2V4dGVybiB2b2lkIGJhc3RfaW5pdF9pcnEodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyM2Y1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suYwpAQCAtMCwwICsxLDUwNyBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNDEwIENsb2NrIGNvbnRyb2wgc3VwcG9ydAorICoKKyAqIEJhc2VkIG9uLCBhbmQgY29kZSBmcm9tIGxpbnV4L2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmMKKyAqKgorICoqICBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQuCisgKiogIFdyaXR0ZW4gYnkgRGVlcCBCbHVlIFNvbHV0aW9ucyBMaW1pdGVkLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1jbG9jay5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJjcHUuaCIKKworLyogY2xvY2sgaW5mb3JtYXRpb24gKi8KKworc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOworc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CisKKy8qIG9sZCBmdW5jdGlvbnMgKi8KKwordm9pZCBpbmxpbmUgczNjMjR4eF9jbGtfZW5hYmxlKHVuc2lnbmVkIGludCBjbG9ja3MsIHVuc2lnbmVkIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBjbGtjb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWNsa2NvbiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfQ0xLQ09OKTsKKwljbGtjb24gJj0gfmNsb2NrczsKKworCWlmIChlbmFibGUpCisJCWNsa2NvbiB8PSBjbG9ja3M7CisKKwkvKiBlbnN1cmUgbm9uZSBvZiB0aGUgc3BlY2lhbCBmdW5jdGlvbiBiaXRzIHNldCAqLworCWNsa2NvbiAmPSB+KFMzQzI0MTBfQ0xLQ09OX0lETEV8UzNDMjQxMF9DTEtDT05fUE9XRVIpOworCisJX19yYXdfd3JpdGVsKGNsa2NvbiwgUzNDMjQxMF9DTEtDT04pOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKiBlbmFibGUgYW5kIGRpc2FibGUgY2FsbHMgZm9yIHVzZSB3aXRoIHRoZSBjbGsgc3RydWN0ICovCisKK3N0YXRpYyBpbnQgY2xrX251bGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHMzYzI0eHhfY2xrY29uX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJczNjMjR4eF9jbGtfZW5hYmxlKGNsay0+Y3RybGJpdCwgZW5hYmxlKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2xvY2sgQVBJIGNhbGxzICovCisKK3N0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKK3sKKwlzdHJ1Y3QgY2xrICpwOworCXN0cnVjdCBjbGsgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CisJaW50IGlkbm87CisKKwlpZG5vID0gKGRldiA9PSBOVUxMKSA/IC0xIDogdG9fcGxhdGZvcm1fZGV2aWNlKGRldiktPmlkOworCisJZG93bigmY2xvY2tzX3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIGxpc3QpIHsKKwkJaWYgKHAtPmlkID09IGlkbm8gJiYKKwkJICAgIHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJgorCQkgICAgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CisJCQljbGsgPSBwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBjaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgYSBkZXZpY2Ugd2FzIHN1cHBsaWVkLCBidXQgdGhlCisJICogY2xvY2sgdGhhdCB3YXMgYmVpbmcgc2VhcmNoZWQgZm9yIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgKi8KKworCWlmIChJU19FUlIoY2xrKSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIGxpc3QpIHsKKwkJCWlmIChwLT5pZCA9PSAtMSAmJiBzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYKKwkJCSAgICB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKKwkJCQljbGsgPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJdXAoJmNsb2Nrc19zZW0pOworCXJldHVybiBjbGs7Cit9CisKK3ZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCit7CisJbW9kdWxlX3B1dChjbGstPm93bmVyKTsKK30KKworaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChJU19FUlIoY2xrKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gKGNsay0+ZW5hYmxlKShjbGssIDEpOworfQorCit2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoIUlTX0VSUihjbGspKQorCQkoY2xrLT5lbmFibGUpKGNsaywgMCk7Cit9CisKKworaW50IGNsa191c2Uoc3RydWN0IGNsayAqY2xrKQoreworCWF0b21pY19pbmMoJmNsay0+dXNlZCk7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBjbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQoreworCWF0b21pY19kZWMoJmNsay0+dXNlZCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiAwOworCisJaWYgKGNsay0+cmF0ZSAhPSAwKQorCQlyZXR1cm4gY2xrLT5yYXRlOworCisJd2hpbGUgKGNsay0+cGFyZW50ICE9IE5VTEwgJiYgY2xrLT5yYXRlID09IDApCisJCWNsayA9IGNsay0+cGFyZW50OworCisJcmV0dXJuIGNsay0+cmF0ZTsKK30KKworbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gcmF0ZTsKK30KKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RydWN0IGNsayAqY2xrX2dldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGstPnBhcmVudDsKK30KKworRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKK0VYUE9SVF9TWU1CT0woY2xrX3B1dCk7CitFWFBPUlRfU1lNQk9MKGNsa19lbmFibGUpOworRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7CitFWFBPUlRfU1lNQk9MKGNsa191c2UpOworRVhQT1JUX1NZTUJPTChjbGtfdW51c2UpOworRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOworRVhQT1JUX1NZTUJPTChjbGtfcm91bmRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGNsa19zZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGNsa19nZXRfcGFyZW50KTsKKworLyogYmFzZSBjbG9ja3MgKi8KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3h0YWwgPSB7CisJLm5hbWUJCT0gInh0YWwiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAwLAorCS5wYXJlbnQJCT0gTlVMTCwKKwkuY3RybGJpdAk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjbGtfZiA9IHsKKwkubmFtZQkJPSAiZmNsayIsCisJLmlkCQk9IC0xLAorCS5yYXRlCQk9IDAsCisJLnBhcmVudAkJPSBOVUxMLAorCS5jdHJsYml0CT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19oID0geworCS5uYW1lCQk9ICJoY2xrIiwKKwkuaWQJCT0gLTEsCisJLnJhdGUJCT0gMCwKKwkucGFyZW50CQk9IE5VTEwsCisJLmN0cmxiaXQJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3AgPSB7CisJLm5hbWUJCT0gInBjbGsiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAwLAorCS5wYXJlbnQJCT0gTlVMTCwKKwkuY3RybGJpdAk9IDAsCit9OworCisvKiBjbG9ja3MgdGhhdCBjb3VsZCBiZSByZWdpc3RlcmVkIGJ5IGV4dGVybmFsIGNvZGUgKi8KKworc3RydWN0IGNsayBzM2MyNHh4X2RjbGswID0geworCS5uYW1lCQk9ICJkY2xrMCIsCisJLmlkCQk9IC0xLAorfTsKKworc3RydWN0IGNsayBzM2MyNHh4X2RjbGsxID0geworCS5uYW1lCQk9ICJkY2xrMSIsCisJLmlkCQk9IC0xLAorfTsKKworc3RydWN0IGNsayBzM2MyNHh4X2Nsa291dDAgPSB7CisJLm5hbWUJCT0gImNsa291dDAiLAorCS5pZAkJPSAtMSwKK307CisKK3N0cnVjdCBjbGsgczNjMjR4eF9jbGtvdXQxID0geworCS5uYW1lCQk9ICJjbGtvdXQxIiwKKwkuaWQJCT0gLTEsCit9OworCitzdHJ1Y3QgY2xrIHMzYzI0eHhfdWNsayA9IHsKKwkubmFtZQkJPSAidWNsayIsCisJLmlkCQk9IC0xLAorfTsKKworCisvKiBjbG9jayBkZWZpbml0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc1tdID0geworCXsgLm5hbWUgICAgPSAibmFuZCIsCisJICAuaWQJICAgPSAtMSwKKwkgIC5wYXJlbnQgID0gJmNsa19oLAorCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX05BTkQKKwl9LAorCXsgLm5hbWUgICAgPSAibGNkIiwKKwkgIC5pZAkgICA9IC0xLAorCSAgLnBhcmVudCAgPSAmY2xrX2gsCisJICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fTENEQworCX0sCisJeyAubmFtZSAgICA9ICJ1c2ItaG9zdCIsCisJICAuaWQJICAgPSAtMSwKKwkgIC5wYXJlbnQgID0gJmNsa19oLAorCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX1VTQkgKKwl9LAorCXsgLm5hbWUgICAgPSAidXNiLWRldmljZSIsCisJICAuaWQJICAgPSAtMSwKKwkgIC5wYXJlbnQgID0gJmNsa19oLAorCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX1VTQkQKKwl9LAorCXsgLm5hbWUgICAgPSAidGltZXJzIiwKKwkgIC5pZAkgICA9IC0xLAorCSAgLnBhcmVudCAgPSAmY2xrX3AsCisJICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fUFdNVAorCX0sCisJeyAubmFtZSAgICA9ICJzZGkiLAorCSAgLmlkCSAgID0gLTEsCisJICAucGFyZW50ICA9ICZjbGtfcCwKKwkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAorCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9TREkKKwl9LAorCXsgLm5hbWUgICAgPSAidWFydCIsCisJICAuaWQJICAgPSAwLAorCSAgLnBhcmVudCAgPSAmY2xrX3AsCisJICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fVUFSVDAKKwl9LAorCXsgLm5hbWUgICAgPSAidWFydCIsCisJICAuaWQJICAgPSAxLAorCSAgLnBhcmVudCAgPSAmY2xrX3AsCisJICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fVUFSVDEKKwl9LAorCXsgLm5hbWUgICAgPSAidWFydCIsCisJICAuaWQJICAgPSAyLAorCSAgLnBhcmVudCAgPSAmY2xrX3AsCisJICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fVUFSVDIKKwl9LAorCXsgLm5hbWUgICAgPSAiZ3BpbyIsCisJICAuaWQJICAgPSAtMSwKKwkgIC5wYXJlbnQgID0gJmNsa19wLAorCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX0dQSU8KKwl9LAorCXsgLm5hbWUgICAgPSAicnRjIiwKKwkgIC5pZAkgICA9IC0xLAorCSAgLnBhcmVudCAgPSAmY2xrX3AsCisJICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fUlRDCisJfSwKKwl7IC5uYW1lICAgID0gImFkYyIsCisJICAuaWQJICAgPSAtMSwKKwkgIC5wYXJlbnQgID0gJmNsa19wLAorCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX0FEQworCX0sCisJeyAubmFtZSAgICA9ICJpMmMiLAorCSAgLmlkCSAgID0gLTEsCisJICAucGFyZW50ICA9ICZjbGtfcCwKKwkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAorCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9JSUMKKwl9LAorCXsgLm5hbWUgICAgPSAiaWlzIiwKKwkgIC5pZAkgICA9IC0xLAorCSAgLnBhcmVudCAgPSAmY2xrX3AsCisJICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fSUlTCisJfSwKKwl7IC5uYW1lICAgID0gInNwaSIsCisJICAuaWQJICAgPSAtMSwKKwkgIC5wYXJlbnQgID0gJmNsa19wLAorCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX1NQSQorCX0sCisJeyAubmFtZSAgICA9ICJ3YXRjaGRvZyIsCisJICAuaWQJICAgPSAtMSwKKwkgIC5wYXJlbnQgID0gJmNsa19wLAorCSAgLmN0cmxiaXQgPSAwCisJfQorfTsKKworLyogaW5pdGlhbGlzZSB0aGUgY2xvY2sgc3lzdGVtICovCisKK2ludCBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBjbGsgKmNsaykKK3sKKwljbGstPm93bmVyID0gVEhJU19NT0RVTEU7CisJYXRvbWljX3NldCgmY2xrLT51c2VkLCAwKTsKKworCWlmIChjbGstPmVuYWJsZSA9PSBOVUxMKQorCQljbGstPmVuYWJsZSA9IGNsa19udWxsX2VuYWJsZTsKKworCS8qIGFkZCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2xvY2tzICovCisKKwlkb3duKCZjbG9ja3Nfc2VtKTsKKwlsaXN0X2FkZCgmY2xrLT5saXN0LCAmY2xvY2tzKTsKKwl1cCgmY2xvY2tzX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaW5pdGFsaXNlIGFsbCB0aGUgY2xvY2tzICovCisKK2ludCBfX2luaXQgczNjMjR4eF9zZXR1cF9jbG9ja3ModW5zaWduZWQgbG9uZyB4dGFsLAorCQkJCXVuc2lnbmVkIGxvbmcgZmNsaywKKwkJCQl1bnNpZ25lZCBsb25nIGhjbGssCisJCQkJdW5zaWduZWQgbG9uZyBwY2xrKQoreworCXN0cnVjdCBjbGsgKmNsa3AgPSBpbml0X2Nsb2NrczsKKwlpbnQgcHRyOworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJTM0MyNDEwIENsb2NrcywgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzXG4iKTsKKworCS8qIGluaXRpYWxpc2UgdGhlIG1haW4gc3lzdGVtIGNsb2NrcyAqLworCisJY2xrX3h0YWwucmF0ZSA9IHh0YWw7CisKKwljbGtfaC5yYXRlID0gaGNsazsKKwljbGtfcC5yYXRlID0gcGNsazsKKwljbGtfZi5yYXRlID0gZmNsazsKKworCS8qIGl0IGxvb2tzIGxpa2UganVzdCBzZXR0aW5nIHRoZSByZWdpc3RlciBoZXJlIGlzIG5vdCBnb29kCisJICogZW5vdWdoLCBhbmQgY2F1c2VzIHRoZSBvZGQgaGFuZyBhdCBpbml0aWFsIGJvb3QgdGltZSwgc28KKwkgKiBkbyBhbGwgb2YgdGhlbSBpbmRpdmR1YWxseS4KKwkgKgorCSAqIEkgdGhpbmsgZGlzYWJsaW5nIHRoZSBMQ0QgY2xvY2sgaWYgdGhlIExDRCBpcyBhY3RpdmUgaXMKKwkgKiB2ZXJ5IGRhbmdlcm91cywgYW5kIHRoZXJlZm9yZSB0aGUgYm9vdGxvYWRlciBzaG91bGQgYmUKKwkgKiBjYXJlZnVsIHRvIG5vdCBlbmFibGUgdGhlIExDRCBjbG9jayBpZiBpdCBpcyBub3QgbmVlZGVkLgorCSAqCisJICogYW5kIG9mIGNvdXJzZSwgdGhpcyBsb29rcyBuZWF0ZXIKKwkgKi8KKworCXMzYzI0eHhfY2xrX2VuYWJsZShTM0MyNDEwX0NMS0NPTl9OQU5ELCAwKTsKKwlzM2MyNHh4X2Nsa19lbmFibGUoUzNDMjQxMF9DTEtDT05fVVNCSCwgMCk7CisJczNjMjR4eF9jbGtfZW5hYmxlKFMzQzI0MTBfQ0xLQ09OX1VTQkQsIDApOworCXMzYzI0eHhfY2xrX2VuYWJsZShTM0MyNDEwX0NMS0NPTl9BREMsIDApOworCXMzYzI0eHhfY2xrX2VuYWJsZShTM0MyNDEwX0NMS0NPTl9JSUMsIDApOworCXMzYzI0eHhfY2xrX2VuYWJsZShTM0MyNDEwX0NMS0NPTl9TUEksIDApOworCisJLyogYXNzdW1lIHVhcnQgY2xvY2tzIGFyZSBjb3JyZWN0bHkgc2V0dXAgKi8KKworCS8qIHJlZ2lzdGVyIG91ciBjbG9ja3MgKi8KKworCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfeHRhbCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBtYXN0ZXIgeHRhbFxuIik7CisKKwlpZiAoczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmY2xrX2YpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVnaXN0ZXIgY3B1IGZjbGtcbiIpOworCisJaWYgKHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmNsa19oKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdSBoY2xrXG4iKTsKKworCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfcCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBjcHUgcGNsa1xuIik7CisKKwkvKiByZWdpc3RlciBjbG9ja3MgZnJvbSBjbG9jayBhcnJheSAqLworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzKTsgcHRyKyssIGNsa3ArKykgeworCQlyZXQgPSBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKGNsa3ApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJXMgKCVkKVxuIiwKKwkJCSAgICAgICBjbGtwLT5uYW1lLCByZXQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFMzQzI0NDAgZXh0ZW5kZWQgY2xvY2sgc3VwcG9ydCAqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHMzYzI0NDBfY2xrX3VwbGwgPSB7CisJLm5hbWUJCT0gInVwbGwiLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHMzYzI0NDBfY2xrX2NhbSA9IHsKKwkubmFtZQkJPSAiY2FtaWYiLAorCS5wYXJlbnQJCT0gJmNsa19oLAorCS5pZAkJPSAtMSwKKwkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkuY3RybGJpdAk9IFMzQzI0NDBfQ0xLQ09OX0NBTUVSQSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHMzYzI0NDBfY2xrX2FjOTcgPSB7CisJLm5hbWUJCT0gImFjOTciLAorCS5wYXJlbnQJCT0gJmNsa19wLAorCS5pZAkJPSAtMSwKKwkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkuY3RybGJpdAk9IFMzQzI0NDBfQ0xLQ09OX0NBTUVSQSwKK307CisKK3N0YXRpYyBpbnQgczNjMjQ0MF9jbGtfYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJdW5zaWduZWQgbG9uZyB1cGxsY29uID0gX19yYXdfcmVhZGwoUzNDMjQxMF9VUExMQ09OKTsKKworCXMzYzI0NDBfY2xrX3VwbGwucmF0ZSA9IHMzYzI0MTBfZ2V0X3BsbCh1cGxsY29uLCBjbGtfeHRhbC5yYXRlKSAqIDI7CisKKwlwcmludGsoIlMzQzI0NDA6IENsb2NrIFN1cHBvcnQsIFVQTEwgJWxkLiUwM2xkIE1IelxuIiwKKwkgICAgICAgcHJpbnRfbWh6KHMzYzI0NDBfY2xrX3VwbGwucmF0ZSkpOworCisJczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmczNjMjQ0MF9jbGtfYWM5Nyk7CisJczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmczNjMjQ0MF9jbGtfY2FtKTsKKwlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZzM2MyNDQwX2Nsa191cGxsKTsKKworCWNsa19kaXNhYmxlKCZzM2MyNDQwX2Nsa19hYzk3KTsKKwljbGtfZGlzYWJsZSgmczNjMjQ0MF9jbGtfY2FtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgczNjMjQ0MF9jbGtfZHJpdmVyID0geworCS5hZGQJPSBzM2MyNDQwX2Nsa19hZGQsCit9OworCitzdGF0aWMgaW50IHMzYzI0eHhfY2xrX2RyaXZlcih2b2lkKQoreworCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDQwX3N5c2NsYXNzLCAmczNjMjQ0MF9jbGtfZHJpdmVyKTsKK30KKworYXJjaF9pbml0Y2FsbChzM2MyNHh4X2Nsa19kcml2ZXIpOworCisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQwICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTNiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCisgKglXcml0dGVuIGJ5IEJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKK3N0cnVjdCBjbGsgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICBsaXN0OworCXN0cnVjdCBtb2R1bGUgICAgICAgICpvd25lcjsKKwlzdHJ1Y3QgY2xrICAgICAgICAgICAqcGFyZW50OworCWNvbnN0IGNoYXIgICAgICAgICAgICpuYW1lOworCWludAkJICAgICAgaWQ7CisJYXRvbWljX3QgICAgICAgICAgICAgIHVzZWQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgIHJhdGU7CisJdW5zaWduZWQgbG9uZyAgICAgICAgIGN0cmxiaXQ7CisJaW50CQkgICAgKCplbmFibGUpKHN0cnVjdCBjbGsgKiwgaW50IGVuYWJsZSk7Cit9OworCisvKiBvdGhlciBjbG9ja3Mgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgYnkgYm9hcmQgc3VwcG9ydCAqLworCitleHRlcm4gc3RydWN0IGNsayBzM2MyNHh4X2RjbGswOworZXh0ZXJuIHN0cnVjdCBjbGsgczNjMjR4eF9kY2xrMTsKK2V4dGVybiBzdHJ1Y3QgY2xrIHMzYzI0eHhfY2xrb3V0MDsKK2V4dGVybiBzdHJ1Y3QgY2xrIHMzYzI0eHhfY2xrb3V0MTsKK2V4dGVybiBzdHJ1Y3QgY2xrIHMzYzI0eHhfdWNsazsKKworLyogZXhwb3J0cyBmb3IgYXJjaC9hcm0vbWFjaC1zM2MyNDEwCisgKgorICogUGxlYXNlIERPIE5PVCB1c2UgdGhlc2Ugb3V0c2lkZSBvZiBhcmNoL2FybS9tYWNoLXMzYzI0MTAKKyovCisKK2V4dGVybiBpbnQgczNjMjR4eF9jbGtjb25fZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CitleHRlcm4gaW50IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soc3RydWN0IGNsayAqY2xrKTsKKworZXh0ZXJuIGludCBzM2MyNHh4X3NldHVwX2Nsb2Nrcyh1bnNpZ25lZCBsb25nIHh0YWwsCisJCQkJdW5zaWduZWQgbG9uZyBmY2xrLAorCQkJCXVuc2lnbmVkIGxvbmcgaGNsaywKKwkJCQl1bnNpZ25lZCBsb25nIHBjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzY2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9jcHUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNFhYIENQVSBTdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInMzYzI0MTAuaCIKKyNpbmNsdWRlICJzM2MyNDQwLmgiCisKK3N0cnVjdCBjcHVfdGFibGUgeworCXVuc2lnbmVkIGxvbmcJaWRjb2RlOworCXVuc2lnbmVkIGxvbmcJaWRtYXNrOworCXZvaWQJCSgqbWFwX2lvKShzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IHNpemUpOworCXZvaWQJCSgqaW5pdF91YXJ0cykoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworCXZvaWQJCSgqaW5pdF9jbG9ja3MpKGludCB4dGFsKTsKKwlpbnQJCSgqaW5pdCkodm9pZCk7CisJY29uc3QgY2hhcgkqbmFtZTsKK307CisKKy8qIHRhYmxlIG9mIHN1cHBvcnRlZCBDUFVzICovCisKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQxMFtdICA9ICJTM0MyNDEwIjsKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQ0MFtdICA9ICJTM0MyNDQwIjsKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQxMGFbXSA9ICJTM0MyNDEwQSI7CitzdGF0aWMgY29uc3QgY2hhciBuYW1lX3MzYzI0NDBhW10gPSAiUzNDMjQ0MEEiOworCitzdGF0aWMgc3RydWN0IGNwdV90YWJsZSBjcHVfaWRzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5pZGNvZGUJCT0gMHgzMjQxMDAwMCwKKwkJLmlkbWFzawkJPSAweGZmZmZmZmZmLAorCQkubWFwX2lvCQk9IHMzYzI0MTBfbWFwX2lvLAorCQkuaW5pdF9jbG9ja3MJPSBzM2MyNDEwX2luaXRfY2xvY2tzLAorCQkuaW5pdF91YXJ0cwk9IHMzYzI0MTBfaW5pdF91YXJ0cywKKwkJLmluaXQJCT0gczNjMjQxMF9pbml0LAorCQkubmFtZQkJPSBuYW1lX3MzYzI0MTAKKwl9LAorCXsKKwkJLmlkY29kZQkJPSAweDMyNDEwMDAyLAorCQkuaWRtYXNrCQk9IDB4ZmZmZmZmZmYsCisJCS5tYXBfaW8JCT0gczNjMjQxMF9tYXBfaW8sCisJCS5pbml0X2Nsb2Nrcwk9IHMzYzI0MTBfaW5pdF9jbG9ja3MsCisJCS5pbml0X3VhcnRzCT0gczNjMjQxMF9pbml0X3VhcnRzLAorCQkuaW5pdAkJPSBzM2MyNDEwX2luaXQsCisJCS5uYW1lCQk9IG5hbWVfczNjMjQxMGEKKwl9LAorCXsKKwkJLmlkY29kZQkJPSAweDMyNDQwMDAwLAorCQkuaWRtYXNrCQk9IDB4ZmZmZmZmZmYsCisJCS5tYXBfaW8JCT0gczNjMjQ0MF9tYXBfaW8sCisJCS5pbml0X2Nsb2Nrcwk9IHMzYzI0NDBfaW5pdF9jbG9ja3MsCisJCS5pbml0X3VhcnRzCT0gczNjMjQ0MF9pbml0X3VhcnRzLAorCQkuaW5pdAkJPSBzM2MyNDQwX2luaXQsCisJCS5uYW1lCQk9IG5hbWVfczNjMjQ0MAorCX0sCisJeworCQkuaWRjb2RlCQk9IDB4MzI0NDAwMDEsCisJCS5pZG1hc2sJCT0gMHhmZmZmZmZmZiwKKwkJLm1hcF9pbwkJPSBzM2MyNDQwX21hcF9pbywKKwkJLmluaXRfY2xvY2tzCT0gczNjMjQ0MF9pbml0X2Nsb2NrcywKKwkJLmluaXRfdWFydHMJPSBzM2MyNDQwX2luaXRfdWFydHMsCisJCS5pbml0CQk9IHMzYzI0NDBfaW5pdCwKKwkJLm5hbWUJCT0gbmFtZV9zM2MyNDQwYQorCX0KK307CisKKy8qIG1pbmltYWwgSU8gbWFwcGluZyAqLworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHMzY19pb2Rlc2NbXSBfX2luaXRkYXRhID0geworCUlPREVTQ19FTlQoR1BJTyksCisJSU9ERVNDX0VOVChJUlEpLAorCUlPREVTQ19FTlQoTUVNQ1RSTCksCisJSU9ERVNDX0VOVChVQVJUKQorfTsKKworCitzdGF0aWMgc3RydWN0IGNwdV90YWJsZSAqCitzM2NfbG9va3VwX2NwdSh1bnNpZ25lZCBsb25nIGlkY29kZSkKK3sKKwlzdHJ1Y3QgY3B1X3RhYmxlICp0YWI7CisJaW50IGNvdW50OworCisJdGFiID0gY3B1X2lkczsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBBUlJBWV9TSVpFKGNwdV9pZHMpOyBjb3VudCsrLCB0YWIrKykgeworCQlpZiAoKGlkY29kZSAmIHRhYi0+aWRtYXNrKSA9PSB0YWItPmlkY29kZSkKKwkJCXJldHVybiB0YWI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGJvYXJkIGluZm9ybWF0aW9uICovCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9ib2FyZCAqYm9hcmQ7CisKK3ZvaWQgczNjMjR4eF9zZXRfYm9hcmQoc3RydWN0IHMzYzI0eHhfYm9hcmQgKmIpCit7CisJaW50IGk7CisKKwlib2FyZCA9IGI7CisKKwlpZiAoYi0+Y2xvY2tzX2NvdW50ICE9IDApIHsKKwkJc3RydWN0IGNsayAqKnB0ciA9IGItPmNsb2Nrczs7CisKKwkJZm9yIChpID0gYi0+Y2xvY2tzX2NvdW50OyBpID4gMDsgaS0tLCBwdHIrKykKKwkJCXMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soKnB0cik7CisJfQorfQorCisvKiBjcHUgaW5mb3JtYXRpb24gKi8KKworc3RhdGljIHN0cnVjdCBjcHVfdGFibGUgKmNwdTsKKwordm9pZCBfX2luaXQgczNjMjR4eF9pbml0X2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlkY29kZTsKKworCS8qIGluaXRpYWxpc2UgdGhlIGlvIGRlc2NyaXB0b3JzIHdlIG5lZWQgZm9yIGluaXRpYWxpc2F0aW9uICovCisJaW90YWJsZV9pbml0KHMzY19pb2Rlc2MsIEFSUkFZX1NJWkUoczNjX2lvZGVzYykpOworCisJaWRjb2RlID0gX19yYXdfcmVhZGwoUzNDMjQxMF9HU1RBVFVTMSk7CisJY3B1ID0gczNjX2xvb2t1cF9jcHUoaWRjb2RlKTsKKworCWlmIChjcHUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gQ1BVIHR5cGUgMHglMDhseFxuIiwgaWRjb2RlKTsKKwkJcGFuaWMoIlVua25vd24gUzNDMjRYWCBDUFUiKTsKKwl9CisKKwlpZiAoY3B1LT5tYXBfaW8gPT0gTlVMTCB8fCBjcHUtPmluaXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNQVSAlcyBzdXBwb3J0IG5vdCBlbmFibGVkXG4iLCBjcHUtPm5hbWUpOworCQlwYW5pYygiVW5zdXBwb3J0ZWQgUzNDMjRYWCBDUFUiKTsKKwl9CisKKwlwcmludGsoIkNQVSAlcyAoaWQgMHglMDhseClcbiIsIGNwdS0+bmFtZSwgaWRjb2RlKTsKKworCShjcHUtPm1hcF9pbykobWFjaF9kZXNjLCBzaXplKTsKK30KKworLyogczNjMjR4eF9pbml0X2Nsb2NrcworICoKKyAqIEluaXRpYWxpc2UgdGhlIGNsb2NrIHN1YnN5c3RlbSBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICogZ2l2ZW4gbWFzdGVyIGNyeXN0YWwgdmFsdWUuCisgKgorICogeHRhbCAgPSAwIC0+IHVzZSBkZWZhdWx0IFBMTCBjcnlzdGFsIHZhbHVlIChub3JtYWxseSAxMk1IeikKKyAqICAgICAgIT0gMCAtPiBQTEwgY3J5c3RhbCB2YWx1ZSBpbiBIegorKi8KKwordm9pZCBfX2luaXQgczNjMjR4eF9pbml0X2Nsb2NrcyhpbnQgeHRhbCkKK3sKKwlpZiAoeHRhbCA9PSAwKQorCQl4dGFsID0gMTIqMTAwMCoxMDAwOworCisJaWYgKGNwdSA9PSBOVUxMKQorCQlwYW5pYygiczNjMjR4eF9pbml0X2Nsb2Nrczogbm8gY3B1IHNldHVwP1xuIik7CisKKwlpZiAoY3B1LT5pbml0X2Nsb2NrcyA9PSBOVUxMKQorCQlwYW5pYygiczNjMjR4eF9pbml0X2Nsb2NrczogY3B1IGhhcyBubyBjbG9jayBpbml0XG4iKTsKKwllbHNlCisJCShjcHUtPmluaXRfY2xvY2tzKSh4dGFsKTsKK30KKwordm9pZCBfX2luaXQgczNjMjR4eF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKQoreworCWlmIChjcHUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGNwdS0+aW5pdF91YXJ0cyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiczNjMjR4eF9pbml0X3VhcnRzOiBjcHUgaGFzIG5vIHVhcnQgaW5pdFxuIik7CisJfSBlbHNlCisJCShjcHUtPmluaXRfdWFydHMpKGNmZywgbm8pOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzM2NfYXJjaF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8vIGRvIHRoZSBjb3JyZWN0IGluaXQgZm9yIGNwdQorCisJaWYgKGNwdSA9PSBOVUxMKQorCQlwYW5pYygiczNjX2FyY2hfaW5pdDogTlVMTCBjcHVcbiIpOworCisJcmV0ID0gKGNwdS0+aW5pdCkoKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoYm9hcmQgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqcHRyID0gYm9hcmQtPmRldmljZXM7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+ZGV2aWNlc19jb3VudDsgaSsrLCBwdHIrKykgeworCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCpwdHIpOworCisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzM2MyNHh4OiBmYWlsZWQgdG8gYWRkIGJvYXJkIGRldmljZSAlcyAoJWQpIEAlcFxuIiwgKCpwdHIpLT5uYW1lLCByZXQsICpwdHIpOworCQkJfQorCQl9CisKKwkJLyogbWFzayBhbnkgZXJyb3IsIHdlIG1heSBub3QgbmVlZCBhbGwgdGhlc2UgYm9hcmQKKwkJICogZGV2aWNlcyAqLworCQlyZXQgPSAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2FyY2hfaW5pdGNhbGwoczNjX2FyY2hfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4YzE1YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jcHUuaApAQCAtMCwwICsxLDY5IEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgUzNDMjRYWCBDUFUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqICAgICAyNC1BdWctMjAwNCBCSkQgIFN0YXJ0IG9mIGdlbmVyaWMgUzNDMjRYWCBzdXBwb3J0CisgKiAgICAgMTgtT2N0LTIwMDQgQkpEICBNb3ZlZCBib2FyZCBzdHJ1Y3QgaW50byB0aGlzIGZpbGUKKyAqICAgICAwNC1KYW4tMjAwNSBCSkQgIE5ldyB1YXJ0IGluaXRpYWxpc2F0aW9uCisgKiAgICAgMTAtSmFuLTIwMDUgQkpEICBNb3ZlZCBnZW5lcmljIGluaXQgaGVyZSwgc3BlY2lmaWMgdG8gY3B1IGhlYWRlcnMKKyAqICAgICAxNC1KYW4tMjAwNSBCSkQgIEFkZGVkIHMzYzI0eHhfaW5pdF9jbG9ja3MoKSBjYWxsCisgKiAgICAgMTAtTWFyLTIwMDUgTENWUiBDaGFuZ2VkIFMzQzI0MTBfe1ZBLFNafSB0byBTM0MyNFhYX3tWQSxTWn0gJiBJT0RFU0NfRU5UCisgKiAgICAgMTQtTWFyLTIwMDUgQkpEICBVcGRhdGVkIGZvciBfX2lvbWVtCisqLworCisvKiB0b2RvIC0gZml4IHdoZW4gcm1rIGNoYW5nZXMgaW9kZXNjcyB0byB1c2UgYHZvaWQgX19pb21lbSAqYCAqLworCisjZGVmaW5lIElPREVTQ19FTlQoeCkgeyAodW5zaWduZWQgbG9uZylTM0MyNFhYX1ZBXyMjeCwgUzNDMjQxMF9QQV8jI3gsIFMzQzI0WFhfU1pfIyN4LCBNVF9ERVZJQ0UgfQorCisjaWZuZGVmIE1IWgorI2RlZmluZSBNSFogKDEwMDAqMTAwMCkKKyNlbmRpZgorCisjZGVmaW5lIHByaW50X21oeihtKSAoKG0pIC8gTUhaKSwgKChtIC8gMTAwMCkgJSAxMDAwKQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnOworc3RydWN0IG1hcF9kZXNjOworCisvKiBjb3JlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyAqLworCitleHRlcm4gdm9pZCBzM2MyNHh4X2luaXRfaXJxKHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNHh4X2luaXRfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBzaXplKTsKKworZXh0ZXJuIHZvaWQgczNjMjR4eF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKworZXh0ZXJuIHZvaWQgczNjMjR4eF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKy8qIHRoZSBib2FyZCBzdHJ1Y3R1cmUgaXMgdXNlZCBhdCBmaXJzdCBpbml0aWFsc2F0aW9uIHRpbWUKKyAqIHRvIGdldCBpbmZvIHN1Y2ggYXMgdGhlIGRldmljZXMgdG8gcmVnaXN0ZXIgZm9yIHRoaXMKKyAqIGJvYXJkLiBUaGlzIGlzIGRvbmUgYmVjYXVzZSBwbGF0ZnJvbV9hZGRfZGV2aWNlcygpIGNhbm5vdAorICogYmUgY2FsbGVkIGZyb20gdGhlIG1hcF9pbyBlbnRyeS4KKyovCisKK3N0cnVjdCBzM2MyNHh4X2JvYXJkIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICAqKmRldmljZXM7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBkZXZpY2VzX2NvdW50OworCisJc3RydWN0IGNsawkJKipjbG9ja3M7CisJdW5zaWduZWQgaW50CQkgIGNsb2Nrc19jb3VudDsKK307CisKK2V4dGVybiB2b2lkIHMzYzI0eHhfc2V0X2JvYXJkKHN0cnVjdCBzM2MyNHh4X2JvYXJkICpib2FyZCk7CisKKy8qIHRpbWVyIGZvciAyNDEwLzI0NDAgKi8KKworc3RydWN0IHN5c190aW1lcjsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHMzYzI0eHhfdGltZXI7CisKKy8qIHN5c3RlbSBkZXZpY2UgY2xhc3NlcyAqLworCitleHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBzM2MyNDQwX3N5c2NsYXNzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3OTJmNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogQmFzZSBTM0MyNDEwIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqICAgICAxMC1NYXItMjAwNSBMQ1ZSIENoYW5nZWQgUzNDMjQxMF97VkEsU1p9IHRvIFMzQzI0WFhfe1ZBLFNafQorICogICAgIDEwLUZlYi0yMDA1IEJKRCAgQWRkZWQgY2FtZXJhIGZyb20gZ3VpbGxhdW1lLmdvdXJhdEBuZXh2aXNpb24udHYKKyAqICAgICAyOS1BdWctMjAwNCBCSkQgIEFkZGVkIHRpbWVycyAwIHRocm91Z2ggMworICogICAgIDI5LUF1Zy0yMDA0IEJKRCAgQ2hhbmdlZCBpbmRleCBvZiBkZXZpY2VzIHdlIG9ubHkgaGF2ZSBvbmUgb2YgdG8gLTEKKyAqICAgICAyMS1BdWctMjAwNCBCSkQgIEFkZGVkIElSUV9USUNLIHRvIFJUQyByZXNvdXJjZXMKKyAqICAgICAxOC1BdWctMjAwNCBCSkQgIENyZWF0ZWQgaW5pdGlhbCB2ZXJzaW9uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgorCisjaW5jbHVkZSAiZGV2cy5oIgorCisvKiBTZXJpYWwgcG9ydCByZWdpc3RyYXRpb25zICovCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfdWFydF9kZXZzWzNdOworCisvKiBVU0IgSG9zdCBDb250cm9sbGVyICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3VzYl9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9VU0JIT1NULAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VTQkhPU1QgKyBTM0MyNFhYX1NaX1VTQkhPU1QsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfVVNCSCwKKwkJLmVuZCAgID0gSVJRX1VTQkgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyB1NjQgczNjX2RldmljZV91c2JfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYiA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLW9oY2kiLAorCS5pZAkJICA9IC0xLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY191c2JfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX3VzYl9yZXNvdXJjZSwKKwkuZGV2ICAgICAgICAgICAgICA9IHsKKwkJLmRtYV9tYXNrID0gJnMzY19kZXZpY2VfdXNiX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTAorCX0KK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV91c2IpOworCisvKiBMQ0QgQ29udHJvbGxlciAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19sY2RfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfTENELAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX0xDRCArIFMzQzI0WFhfU1pfTENELAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0xDRCwKKwkJLmVuZCAgID0gSVJRX0xDRCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorCit9OworCitzdGF0aWMgdTY0IHMzY19kZXZpY2VfbGNkX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9sY2QgPSB7CisJLm5hbWUJCSAgPSAiczNjMjQxMC1sY2QiLAorCS5pZAkJICA9IC0xLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19sY2RfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX2xjZF9yZXNvdXJjZSwKKwkuZGV2ICAgICAgICAgICAgICA9IHsKKwkJLmRtYV9tYXNrID0gJnMzY19kZXZpY2VfbGNkX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTAorCX0KK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV9sY2QpOworCisvKiBOQU5EIENvbnRyb2xsZXIgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfbmFuZF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9OQU5ELAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX05BTkQgKyBTM0MyNFhYX1NaX05BTkQsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9uYW5kID0geworCS5uYW1lCQkgID0gInMzYzI0MTAtbmFuZCIsCisJLmlkCQkgID0gLTEsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX25hbmRfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX25hbmRfcmVzb3VyY2UsCit9OworCitFWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfbmFuZCk7CisKKy8qIFVTQiBEZXZpY2UgKEdhZGdldCkqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY191c2JnYWRnZXRfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfVVNCREVWLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VTQkRFViArIFMzQzI0WFhfU1pfVVNCREVWLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1VTQkQsCisJCS5lbmQgICA9IElSUV9VU0JELAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9CisKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JnYWRnZXQgPSB7CisJLm5hbWUJCSAgPSAiczNjMjQxMC11c2JnYWRnZXQiLAorCS5pZAkJICA9IC0xLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY191c2JnYWRnZXRfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX3VzYmdhZGdldF9yZXNvdXJjZSwKK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV91c2JnYWRnZXQpOworCisvKiBXYXRjaGRvZyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY193ZHRfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfV0FUQ0hET0csCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfV0FUQ0hET0cgKyBTM0MyNFhYX1NaX1dBVENIRE9HLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1dEVCwKKwkJLmVuZCAgID0gSVJRX1dEVCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfd2R0ID0geworCS5uYW1lCQkgID0gInMzYzI0MTAtd2R0IiwKKwkuaWQJCSAgPSAtMSwKKwkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2Nfd2R0X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY193ZHRfcmVzb3VyY2UsCit9OworCitFWFBPUlRfU1lNQk9MKHMzY19kZXZpY2Vfd2R0KTsKKworLyogSTJDICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9JSUMsCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfSUlDICsgUzNDMjRYWF9TWl9JSUMsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSUlDLAorCQkuZW5kICAgPSBJUlFfSUlDLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9CisKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMgPSB7CisJLm5hbWUJCSAgPSAiczNjMjQxMC1pMmMiLAorCS5pZAkJICA9IC0xLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19pMmNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX2kyY19yZXNvdXJjZSwKK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV9pMmMpOworCisvKiBJSVMgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaWlzX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX0lJUywKKwkJLmVuZCAgID0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNFhYX1NaX0lJUywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHU2NCBzM2NfZGV2aWNlX2lpc19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaWlzID0geworCS5uYW1lCQkgID0gInMzYzI0MTAtaWlzIiwKKwkuaWQJCSAgPSAtMSwKKwkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfaWlzX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY19paXNfcmVzb3VyY2UsCisJLmRldiAgICAgICAgICAgICAgPSB7CisJCS5kbWFfbWFzayA9ICZzM2NfZGV2aWNlX2lpc19kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKKwl9Cit9OworCitFWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfaWlzKTsKKworLyogUlRDICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3J0Y19yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9SVEMsCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfUlRDICsgMHhmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9SVEMsCisJCS5lbmQgICA9IElSUV9SVEMsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQgPSBJUlFfVElDSywKKwkJLmVuZCAgID0gSVJRX1RJQ0ssCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3J0YyA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLXJ0YyIsCisJLmlkCQkgID0gLTEsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3J0Y19yZXNvdXJjZSksCisJLnJlc291cmNlCSAgPSBzM2NfcnRjX3Jlc291cmNlLAorfTsKKworRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3J0Yyk7CisKKy8qIEFEQyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19hZGNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfQURDLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX0FEQyArIFMzQzI0WFhfU1pfQURDLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1RDLAorCQkuZW5kICAgPSBJUlFfQURDLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9CisKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGMgPSB7CisJLm5hbWUJCSAgPSAiczNjMjQxMC1hZGMiLAorCS5pZAkJICA9IC0xLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19hZGNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX2FkY19yZXNvdXJjZSwKK307CisKKy8qIFNESSAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zZGlfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfU0RJLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1NESSArIFMzQzI0WFhfU1pfU0RJLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1NESSwKKwkJLmVuZCAgID0gSVJRX1NESSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc2RpID0geworCS5uYW1lCQkgID0gInMzYzI0MTAtc2RpIiwKKwkuaWQJCSAgPSAtMSwKKwkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2Nfc2RpX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY19zZGlfcmVzb3VyY2UsCit9OworCitFWFBPUlRfU1lNQk9MKHMzY19kZXZpY2Vfc2RpKTsKKworLyogU1BJICgwKSAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zcGkwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1NQSSwKKwkJLmVuZCAgID0gUzNDMjQxMF9QQV9TUEkgKyAweDFmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1NQSTAsCisJCS5lbmQgICA9IElSUV9TUEkwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9CisKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zcGkwID0geworCS5uYW1lCQkgID0gInMzYzI0MTAtc3BpIiwKKwkuaWQJCSAgPSAwLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19zcGkwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY19zcGkwX3Jlc291cmNlLAorfTsKKworRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3NwaTApOworCisvKiBTUEkgKDEpICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3NwaTFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfU1BJICsgMHgyMCwKKwkJLmVuZCAgID0gUzNDMjQxMF9QQV9TUEkgKyAweDIwICsgMHgxZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9TUEkxLAorCQkuZW5kICAgPSBJUlFfU1BJMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMSA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLXNwaSIsCisJLmlkCQkgID0gMSwKKwkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2Nfc3BpMV9yZXNvdXJjZSksCisJLnJlc291cmNlCSAgPSBzM2Nfc3BpMV9yZXNvdXJjZSwKK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV9zcGkxKTsKKworLyogcHdtIHRpbWVyIGJsb2NrcyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY190aW1lcjBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfVElNRVIgKyAweDBDLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1RJTUVSICsgMHgwQyArIDB4QiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9USU1FUjAsCisJCS5lbmQgICA9IElSUV9USU1FUjAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KKworfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyMCA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLXRpbWVyIiwKKwkuaWQJCSAgPSAwLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY190aW1lcjBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX3RpbWVyMF9yZXNvdXJjZSwKK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV90aW1lcjApOworCisvKiB0aW1lciAxICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3RpbWVyMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9USU1FUiArIDB4MTgsCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfVElNRVIgKyAweDIzLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1RJTUVSMSwKKwkJLmVuZCAgID0gSVJRX1RJTUVSMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdGltZXIxID0geworCS5uYW1lCQkgID0gInMzYzI0MTAtdGltZXIiLAorCS5pZAkJICA9IDEsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3RpbWVyMV9yZXNvdXJjZSksCisJLnJlc291cmNlCSAgPSBzM2NfdGltZXIxX3Jlc291cmNlLAorfTsKKworRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3RpbWVyMSk7CisKKy8qIHRpbWVyIDIgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdGltZXIyX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1RJTUVSICsgMHgyNCwKKwkJLmVuZCAgID0gUzNDMjQxMF9QQV9USU1FUiArIDB4MkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfVElNRVIyLAorCQkuZW5kICAgPSBJUlFfVElNRVIyLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9CisKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90aW1lcjIgPSB7CisJLm5hbWUJCSAgPSAiczNjMjQxMC10aW1lciIsCisJLmlkCQkgID0gMiwKKwkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfdGltZXIyX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY190aW1lcjJfcmVzb3VyY2UsCit9OworCitFWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfdGltZXIyKTsKKworLyogdGltZXIgMyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY190aW1lcjNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfVElNRVIgKyAweDMwLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1RJTUVSICsgMHgzQiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9USU1FUjMsCisJCS5lbmQgICA9IElSUV9USU1FUjMsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KKworfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyMyA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLXRpbWVyIiwKKwkuaWQJCSAgPSAzLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY190aW1lcjNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQkgID0gczNjX3RpbWVyM19yZXNvdXJjZSwKK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV90aW1lcjMpOworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCisKKy8qIENhbWlmIENvbnRyb2xsZXIgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfY2FtaWZfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0NDBfUEFfQ0FNSUYsCisJCS5lbmQgICA9IFMzQzI0NDBfUEFfQ0FNSUYgKyBTM0MyNDQwX1NaX0NBTUlGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0NBTSwKKwkJLmVuZCAgID0gSVJRX0NBTSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorCit9OworCitzdGF0aWMgdTY0IHMzY19kZXZpY2VfY2FtaWZfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2NhbWlmID0geworCS5uYW1lCQkgID0gInMzYzI0NDAtY2FtaWYiLAorCS5pZAkJICA9IC0xLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19jYW1pZl9yZXNvdXJjZSksCisJLnJlc291cmNlCSAgPSBzM2NfY2FtaWZfcmVzb3VyY2UsCisJLmRldiAgICAgICAgICAgICAgPSB7CisJCS5kbWFfbWFzayA9ICZzM2NfZGV2aWNlX2NhbWlmX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTAorCX0KK307CisKK0VYUE9SVF9TWU1CT0woczNjX2RldmljZV9jYW1pZik7CisKKyNlbmRpZiAvLyBDT05GSUdfQ1BVX1MzMjQ0MApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzMjhmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmgKQEAgLTAsMCArMSw0OCBAQAorLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczNjMjQxMCBzdGFuZGFyZCBwbGF0Zm9ybSBkZXZpY2VzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogICAgICAxOC1BdWctMjAwNCBCSkQgIENyZWF0ZWQgaW5pdGlhbCB2ZXJzaW9uCisgKgkyNy1BdWctMjAwNCBCSkQgIEFkZGVkIHRpbWVycyAwIHRocm91Z2ggMworICoJMTAtRmViLTIwMDUgQkpECSBBZGRlZCBjYW1lcmEgZnJvbSBndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi50dgorKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfdWFydF9kZXZzW107CisKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdXNiOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9sY2Q7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3dkdDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9paXM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3J0YzsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfYWRjOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zZGk7CisKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMTsKKworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9uYW5kOworCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdGltZXIxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90aW1lcjI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyMzsKKworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JnYWRnZXQ7CisKKy8qIHMzYzI0NDAgc3BlY2lmaWMgZGV2aWNlcyAqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCisKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfY2FtaWY7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjI5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMKQEAgLTAsMCArMSwxMjEwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWJhc3QvZG1hLmMKKyAqCisgKiAoYykgMjAwMy0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0MTAgRE1BIGNvcmUKKyAqCisgKiBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9FQjI0MTBJVFgvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiAgMjctRmViLTIwMDUgQkpEICBBZGRlZCBrbWVtIGNhY2hlIGZvciBkbWEgZGVzY3JpcHRvcnMKKyAqICAxOC1Ob3YtMjAwNCBCSkQgIFJlbW92ZWQgZXJyb3IgZm9yIGxvYWRpbmcgb250byBzdG9wcGVkIGNoYW5uZWwKKyAqICAxMC1Ob3YtMjAwNCBCSkQgIEVuc3VyZSBhbGwgZXh0ZXJuYWwgc3ltYm9scyBleHBvcnRlZCBmb3IgbW9kdWxlcworICogIDEwLU5vdi0yMDA0IEJKRCAgVXNlIHN5c19kZXZpY2UgYW5kIHN5c2Rldl9jbGFzcyBmb3IgcG93ZXIgbWFuYWdlbWVudAorICogIDA4LUF1Zy0yMDA0IEJKRCAgQXBwbHkgcm1rJ3Mgc3VnZ2VzdGlvbnMKKyAqICAyMS1KdWwtMjAwNCBCSkQgIFBvcnRlZCB0byBsaW51eCAyLjYKKyAqICAxMi1KdWwtMjAwNCBCSkQgIEZpbmlzaGVkIHJlLXdyaXRlIGFuZCBjaGFuZ2Ugb2YgQVBJCisgKiAgMDYtSnVsLTIwMDQgQkpEICBSZXdyb3RlIGRtYSBjb2RlIHRvIHRyeSBhbmQgY29wZSB3aXRoIHZhcmlvdXMgcHJvYmxlbXMKKyAqICAyMy1NYXktMjAwMyBCSkQgIENyZWF0ZWQgZmlsZQorICogIDE5LUF1Zy0yMDAzIEJKRCAgQ2xlYW51cCwgaGVhZGVyIGZpeCwgYWRkZWQgVVJMCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBTYW5nd29vayBMZWUvU2Ftc3VuZyBwYXRjaGVzLCByZS13cml0dGVuIGR1ZQorICogdG8gdmFyaW91cyBvbW1pc2lvbnMgZnJvbSB0aGUgY29kZSAoc3VjaCBhcyBmbGV4aWJsZSBkbWEgY29uZmlndXJhdGlvbikKKyAqIGZvciB1c2Ugd2l0aCB0aGUgQkFTVCBzeXN0ZW0gYm9hcmQuCisgKgorICogVGhlIHJlLXdyaXRlIGlzIHByZXR0eSBtdWNoIGNvbXBsZXRlLCBhbmQgc2hvdWxkIGJlIGdvb2QgZW5vdWdoIGZvciBhbnkKKyAqIHBvc3NpYmxlIERNQSBmdW5jdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19TM0MyNDEwX0RNQV9ERUJVRworI2RlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hcC5oPgorCisvKiBpbyBtYXAgZm9yIGRtYSAqLworc3RhdGljIHZvaWQgX19pb21lbSAqZG1hX2Jhc2U7CitzdGF0aWMga21lbV9jYWNoZV90ICpkbWFfa21lbTsKKworLyogZG1hIGNoYW5uZWwgc3RhdGUgaW5mb3JtYXRpb24gKi8KK3MzYzI0MTBfZG1hX2NoYW5fdCBzM2MyNDEwX2NoYW5zW1MzQzI0MTBfRE1BX0NIQU5ORUxTXTsKKworLyogZGVidWdnaW5nIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIEJVRl9NQUdJQyAoMHhjYWZlYmFiZSkKKworI2RlZmluZSBkbWF3YXJuKGZtdC4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm10KQorCisjZGVmaW5lIGRtYV9yZWdhZGRyKGNoYW4sIHJlZykgKChjaGFuKS0+cmVncyArIChyZWcpKQorCisjaWYgMQorI2RlZmluZSBkbWFfd3JyZWcoY2hhbiwgcmVnLCB2YWwpIHdyaXRlbCgodmFsKSwgKGNoYW4pLT5yZWdzICsgKHJlZykpCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitkbWFfd3JyZWcoczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuLCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlwcl9kZWJ1Zygid3JpdGluZyAlMDh4IHRvIHJlZ2lzdGVyICUwOHhcbiIsKHVuc2lnbmVkIGludCl2YWwscmVnKTsKKwl3cml0ZWwodmFsLCBkbWFfcmVnYWRkcihjaGFuLCByZWcpKTsKK30KKworI2VuZGlmCisKKyNkZWZpbmUgZG1hX3JkcmVnKGNoYW4sIHJlZykgcmVhZGwoKGNoYW4pLT5yZWdzICsgKHJlZykpCisKKy8qIGNhcHR1cmVkIHJlZ2lzdGVyIHN0YXRlIGZvciBkZWJ1ZyAqLworCitzdHJ1Y3QgczNjMjQxMF9kbWFfcmVnc3RhdGUgeworCXVuc2lnbmVkIGxvbmcgICAgICAgICBkY3NyYzsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgZGlzcmM7CisJdW5zaWduZWQgbG9uZyAgICAgICAgIGRzdGF0OworCXVuc2lnbmVkIGxvbmcgICAgICAgICBkY29uOworCXVuc2lnbmVkIGxvbmcgICAgICAgICBkbXNrdHJpZzsKK307CisKKyNpZmRlZiBDT05GSUdfUzNDMjQxMF9ETUFfREVCVUcKKworLyogZG1hZGJnX3Nob3dyZWdzCisgKgorICogc2ltcGxlIGRlYnVnIHJvdXRpbmUgdG8gcHJpbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRtYSByZWdpc3RlcnMKKyovCisKK3N0YXRpYyB2b2lkCitkbWFkYmdfY2FwdHVyZShzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4sIHN0cnVjdCBzM2MyNDEwX2RtYV9yZWdzdGF0ZSAqcmVncykKK3sKKwlyZWdzLT5kY3NyYyAgICA9IGRtYV9yZHJlZyhjaGFuLCBTM0MyNDEwX0RNQV9EQ1NSQyk7CisJcmVncy0+ZGlzcmMgICAgPSBkbWFfcmRyZWcoY2hhbiwgUzNDMjQxMF9ETUFfRElTUkMpOworCXJlZ3MtPmRzdGF0ICAgID0gZG1hX3JkcmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RTVEFUKTsKKwlyZWdzLT5kY29uICAgICA9IGRtYV9yZHJlZyhjaGFuLCBTM0MyNDEwX0RNQV9EQ09OKTsKKwlyZWdzLT5kbXNrdHJpZyA9IGRtYV9yZHJlZyhjaGFuLCBTM0MyNDEwX0RNQV9ETUFTS1RSSUcpOworfQorCitzdGF0aWMgdm9pZAorZG1hZGJnX3Nob3dyZWdzKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZSwgczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuLAorCQkgc3RydWN0IHMzYzI0MTBfZG1hX3JlZ3N0YXRlICpyZWdzKQoreworCXByaW50ayhLRVJOX0RFQlVHICJkbWElZDogJXM6JWQ6IERDU1JDPSUwOGx4LCBESVNSQz0lMDhseCwgRFNUQVQ9JTA4bHggRE1UPSUwMmx4LCBEQ09OPSUwOGx4XG4iLAorCSAgICAgICBjaGFuLT5udW1iZXIsIGZuYW1lLCBsaW5lLAorCSAgICAgICByZWdzLT5kY3NyYywgcmVncy0+ZGlzcmMsIHJlZ3MtPmRzdGF0LCByZWdzLT5kbXNrdHJpZywKKwkgICAgICAgcmVncy0+ZGNvbik7Cit9CisKK3N0YXRpYyB2b2lkCitkbWFkYmdfc2hvd2NoYW4oY29uc3QgY2hhciAqZm5hbWUsIGludCBsaW5lLCBzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4pCit7CisJc3RydWN0IHMzYzI0MTBfZG1hX3JlZ3N0YXRlIHN0YXRlOworCisJZG1hZGJnX2NhcHR1cmUoY2hhbiwgJnN0YXRlKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJkbWElZDogJXM6JWQ6IGxzPSVkLCBjdXI9JXAsICVwICVwXG4iLAorCSAgICAgICBjaGFuLT5udW1iZXIsIGZuYW1lLCBsaW5lLCBjaGFuLT5sb2FkX3N0YXRlLAorCSAgICAgICBjaGFuLT5jdXJyLCBjaGFuLT5uZXh0LCBjaGFuLT5lbmQpOworCisJZG1hZGJnX3Nob3dyZWdzKGZuYW1lLCBsaW5lLCBjaGFuLCAmc3RhdGUpOworfQorCisjZGVmaW5lIGRiZ19zaG93cmVncyhjaGFuKSBkbWFkYmdfc2hvd3JlZ3MoX19GVU5DVElPTl9fLCBfX0xJTkVfXywgKGNoYW4pKQorI2RlZmluZSBkYmdfc2hvd2NoYW4oY2hhbikgZG1hZGJnX3Nob3djaGFuKF9fRlVOQ1RJT05fXywgX19MSU5FX18sIChjaGFuKSkKKyNlbHNlCisjZGVmaW5lIGRiZ19zaG93cmVncyhjaGFuKSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZGJnX3Nob3djaGFuKGNoYW4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmIC8qIENPTkZJR19TM0MyNDEwX0RNQV9ERUJVRyAqLworCisjZGVmaW5lIGNoZWNrX2NoYW5uZWwoY2hhbikgXAorICBkbyB7IGlmICgoY2hhbikgPj0gUzNDMjQxMF9ETUFfQ0hBTk5FTFMpIHsgXAorICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgY2hhbm5lbCAlZFxuIiwgX19GVU5DVElPTl9fLCAoY2hhbikpOyBcCisgICAgcmV0dXJuIC1FSU5WQUw7IFwKKyAgfSB9IHdoaWxlKDApCisKKworLyogczNjMjQxMF9kbWFfc3RhdHNfdGltZW91dAorICoKKyAqIFVwZGF0ZSBETUEgc3RhdHMgZnJvbSB0aW1lb3V0IGluZm8KKyovCisKK3N0YXRpYyB2b2lkCitzM2MyNDEwX2RtYV9zdGF0c190aW1lb3V0KHMzYzI0MTBfZG1hX3N0YXRzX3QgKnN0YXRzLCBpbnQgdmFsKQoreworCWlmIChzdGF0cyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAodmFsID4gc3RhdHMtPnRpbWVvdXRfbG9uZ2VzdCkKKwkJc3RhdHMtPnRpbWVvdXRfbG9uZ2VzdCA9IHZhbDsKKwlpZiAodmFsIDwgc3RhdHMtPnRpbWVvdXRfc2hvcnRlc3QpCisJCXN0YXRzLT50aW1lb3V0X3Nob3J0ZXN0ID0gdmFsOworCisJc3RhdHMtPnRpbWVvdXRfYXZnICs9IHZhbDsKK30KKworLyogczNjMjQxMF9kbWFfd2FpdGZvcmxvYWQKKyAqCisgKiB3YWl0IGZvciB0aGUgRE1BIGVuZ2luZSB0byBsb2FkIGEgYnVmZmVyLCBhbmQgdXBkYXRlIHRoZSBzdGF0ZSBhY2NvcmRpbmdseQorKi8KKworc3RhdGljIGludAorczNjMjQxMF9kbWFfd2FpdGZvcmxvYWQoczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuLCBpbnQgbGluZSkKK3sKKwlpbnQgdGltZW91dCA9IGNoYW4tPmxvYWRfdGltZW91dDsKKwlpbnQgdG9vazsKKworCWlmIChjaGFuLT5sb2FkX3N0YXRlICE9IFMzQzI0MTBfRE1BTE9BRF8xTE9BREVEKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IHMzYzI0MTBfZG1hX3dhaXRmb3Jsb2FkKCkgY2FsbGVkIGluIGxvYWRzdGF0ZSAlZCBmcm9tIGxpbmUgJWRcbiIsIGNoYW4tPm51bWJlciwgY2hhbi0+bG9hZF9zdGF0ZSwgbGluZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaGFuLT5zdGF0cyAhPSBOVUxMKQorCQljaGFuLT5zdGF0cy0+bG9hZHMrKzsKKworCXdoaWxlICgtLXRpbWVvdXQgPiAwKSB7CisJCWlmICgoZG1hX3JkcmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RTVEFUKSA8PCAoMzItMjApKSAhPSAwKSB7CisJCQl0b29rID0gY2hhbi0+bG9hZF90aW1lb3V0IC0gdGltZW91dDsKKworCQkJczNjMjQxMF9kbWFfc3RhdHNfdGltZW91dChjaGFuLT5zdGF0cywgdG9vayk7CisKKwkJCXN3aXRjaCAoY2hhbi0+bG9hZF9zdGF0ZSkgeworCQkJY2FzZSBTM0MyNDEwX0RNQUxPQURfMUxPQURFRDoKKwkJCQljaGFuLT5sb2FkX3N0YXRlID0gUzNDMjQxMF9ETUFMT0FEXzFSVU5OSU5HOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IHVua25vd24gbG9hZF9zdGF0ZSBpbiBzM2MyNDEwX2RtYV93YWl0Zm9ybG9hZCgpICVkXG4iLCBjaGFuLT5udW1iZXIsIGNoYW4tPmxvYWRfc3RhdGUpOworCQkJfQorCisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChjaGFuLT5zdGF0cyAhPSBOVUxMKSB7CisJCWNoYW4tPnN0YXRzLT50aW1lb3V0X2ZhaWxlZCsrOworCX0KKworCXJldHVybiAwOworfQorCisKKworLyogczNjMjQxMF9kbWFfbG9hZGJ1ZmZlcgorICoKKyAqIGxvYWQgYSBidWZmZXIsIGFuZCB1cGRhdGUgdGhlIGNoYW5uZWwgc3RhdGUKKyovCisKK3N0YXRpYyBpbmxpbmUgaW50CitzM2MyNDEwX2RtYV9sb2FkYnVmZmVyKHMzYzI0MTBfZG1hX2NoYW5fdCAqY2hhbiwKKwkJICAgICAgIHMzYzI0MTBfZG1hX2J1Zl90ICpidWYpCit7CisJdW5zaWduZWQgbG9uZyByZWxvYWQ7CisKKwlwcl9kZWJ1ZygiczNjMjQxMF9jaGFuX2xvYWRidWZmZXI6IGxvYWRpbmcgYnVmZiAlcCAoMHglMDhseCwweCUwNngpXG4iLAorCQkgYnVmLCAodW5zaWduZWQgbG9uZylidWYtPmRhdGEsIGJ1Zi0+c2l6ZSk7CisKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJZG1hd2FybigiYnVmZmVyIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjaGVjayB0aGUgc3RhdGUgb2YgdGhlIGNoYW5uZWwgYmVmb3JlIHdlIGRvIGFueXRoaW5nICovCisKKwlpZiAoY2hhbi0+bG9hZF9zdGF0ZSA9PSBTM0MyNDEwX0RNQUxPQURfMUxPQURFRCkgeworCQlkbWF3YXJuKCJsb2FkX3N0YXRlIGlzIFMzQzI0MTBfRE1BTE9BRF8xTE9BREVEXG4iKTsKKwl9CisKKwlpZiAoY2hhbi0+bG9hZF9zdGF0ZSA9PSBTM0MyNDEwX0RNQUxPQURfMUxPQURFRF8xUlVOTklORykgeworCQlkbWF3YXJuKCJzdGF0ZSBpcyBTM0MyNDEwX0RNQUxPQURfMUxPQURFRF8xUlVOTklOR1xuIik7CisJfQorCisJLyogaXQgd291bGQgc2VlbSBzZW5zaWJsZSBpZiB3ZSBhcmUgdGhlIGxhc3QgYnVmZmVyIHRvIG5vdCBib3RoZXIKKwkgKiB3aXRoIHRoZSBhdXRvLXJlbG9hZCBiaXQsIHNvIHRoYXQgdGhlIERNQSBlbmdpbmUgd2lsbCBub3QgdHJ5CisJICogYW5kIGxvYWQgYW5vdGhlciB0cmFuc2ZlciBhZnRlciB0aGlzIG9uZSBoYXMgZmluaXNoZWQuLi4KKwkgKi8KKwlpZiAoY2hhbi0+bG9hZF9zdGF0ZSA9PSBTM0MyNDEwX0RNQUxPQURfTk9ORSkgeworCQlwcl9kZWJ1ZygibG9hZF9zdGF0ZSBpcyBub25lLCBjaGVja2luZyBmb3Igbm9yZWxvYWQgKG5leHQ9JXApXG4iLAorCQkJIGJ1Zi0+bmV4dCk7CisJCXJlbG9hZCA9IChidWYtPm5leHQgPT0gTlVMTCkgPyBTM0MyNDEwX0RDT05fTk9SRUxPQUQgOiAwOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJsb2FkX3N0YXRlIGlzICVkID0+IGF1dG9yZWxvYWRcbiIsIGNoYW4tPmxvYWRfc3RhdGUpOworCQlyZWxvYWQgPSBTM0MyNDEwX0RDT05fQVVUT1JFTE9BRDsKKwl9CisKKwl3cml0ZWwoYnVmLT5kYXRhLCBjaGFuLT5hZGRyX3JlZyk7CisKKwlkbWFfd3JyZWcoY2hhbiwgUzNDMjQxMF9ETUFfRENPTiwKKwkJICBjaGFuLT5kY29uIHwgcmVsb2FkIHwgKGJ1Zi0+c2l6ZS9jaGFuLT54ZmVyX3VuaXQpKTsKKworCWNoYW4tPm5leHQgPSBidWYtPm5leHQ7CisKKwkvKiB1cGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBjaGFubmVsICovCisKKwlzd2l0Y2ggKGNoYW4tPmxvYWRfc3RhdGUpIHsKKwljYXNlIFMzQzI0MTBfRE1BTE9BRF9OT05FOgorCQljaGFuLT5sb2FkX3N0YXRlID0gUzNDMjQxMF9ETUFMT0FEXzFMT0FERUQ7CisJCWJyZWFrOworCisJY2FzZSBTM0MyNDEwX0RNQUxPQURfMVJVTk5JTkc6CisJCWNoYW4tPmxvYWRfc3RhdGUgPSBTM0MyNDEwX0RNQUxPQURfMUxPQURFRF8xUlVOTklORzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkbWF3YXJuKCJkbWFsb2FkOiB1bmtub3duIHN0YXRlICVkIGluIGxvYWRidWZmZXJcbiIsCisJCQljaGFuLT5sb2FkX3N0YXRlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHMzYzI0MTBfZG1hX2NhbGxfb3AKKyAqCisgKiBzbWFsbCByb3V0aW5lIHRvIGNhbGwgdGhlIG9wIHJvdXRpbmUgd2l0aCB0aGUgZ2l2ZW4gb3AgaWYgaXQgaGFzIGJlZW4KKyAqIHJlZ2lzdGVyZWQKKyovCisKK3N0YXRpYyB2b2lkCitzM2MyNDEwX2RtYV9jYWxsX29wKHMzYzI0MTBfZG1hX2NoYW5fdCAqY2hhbiwgczNjMjQxMF9jaGFuX29wX3Qgb3ApCit7CisJaWYgKGNoYW4tPm9wX2ZuICE9IE5VTEwpIHsKKwkJKGNoYW4tPm9wX2ZuKShjaGFuLCBvcCk7CisJfQorfQorCisvKiBzM2MyNDEwX2RtYV9idWZmZG9uZQorICoKKyAqIHNtYWxsIHdyYXBwZXIgdG8gY2hlY2sgaWYgY2FsbGJhY2sgcm91dGluZSBuZWVkcyB0byBiZSBjYWxsZWQsIGFuZAorICogaWYgc28sIGNhbGwgaXQKKyovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorczNjMjQxMF9kbWFfYnVmZmRvbmUoczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuLCBzM2MyNDEwX2RtYV9idWZfdCAqYnVmLAorCQkgICAgIHMzYzI0MTBfZG1hX2J1ZmZyZXN1bHRfdCByZXN1bHQpCit7CisJcHJfZGVidWcoImNhbGxiYWNrX2ZuPSVwLCBidWY9JXAsIGlkPSVwLCBzaXplPSVkLCByZXN1bHQ9JWRcbiIsCisJCSBjaGFuLT5jYWxsYmFja19mbiwgYnVmLCBidWYtPmlkLCBidWYtPnNpemUsIHJlc3VsdCk7CisKKwlpZiAoY2hhbi0+Y2FsbGJhY2tfZm4gIT0gTlVMTCkgeworCQkoY2hhbi0+Y2FsbGJhY2tfZm4pKGNoYW4sIGJ1Zi0+aWQsIGJ1Zi0+c2l6ZSwgcmVzdWx0KTsKKwl9Cit9CisKKy8qIHMzYzI0MTBfZG1hX3N0YXJ0CisgKgorICogc3RhcnQgYSBkbWEgY2hhbm5lbCBnb2luZworKi8KKworc3RhdGljIGludCBzM2MyNDEwX2RtYV9zdGFydChzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4pCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCJzM2MyNDEwX3N0YXJ0X2RtYTogY2hhbm5lbD0lZFxuIiwgY2hhbi0+bnVtYmVyKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChjaGFuLT5zdGF0ZSA9PSBTM0MyNDEwX0RNQV9SVU5OSU5HKSB7CisJCXByX2RlYnVnKCJzM2MyNDEwX3N0YXJ0X2RtYTogYWxyZWFkeSBydW5uaW5nICglZClcbiIsIGNoYW4tPnN0YXRlKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwljaGFuLT5zdGF0ZSA9IFMzQzI0MTBfRE1BX1JVTk5JTkc7CisKKwkvKiBjaGVjayB3ZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgdG8gbG9hZCwgYW5kIGlmIG5vdCwgc2VlCisJICogaWYgd2UgY2FuIGZpbmQgYW55dGhpbmcgdG8gbG9hZAorCSAqLworCisJaWYgKGNoYW4tPmxvYWRfc3RhdGUgPT0gUzNDMjQxMF9ETUFMT0FEX05PTkUpIHsKKwkJaWYgKGNoYW4tPm5leHQgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogY2hhbm5lbCBoYXMgbm90aGluZyBsb2FkZWRcbiIsCisJCQkgICAgICAgY2hhbi0+bnVtYmVyKTsKKwkJCWNoYW4tPnN0YXRlID0gUzNDMjQxMF9ETUFfSURMRTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJczNjMjQxMF9kbWFfbG9hZGJ1ZmZlcihjaGFuLCBjaGFuLT5uZXh0KTsKKwl9CisKKwlkYmdfc2hvd2NoYW4oY2hhbik7CisKKwkvKiBlbmFibGUgdGhlIGNoYW5uZWwgKi8KKworCWlmICghY2hhbi0+aXJxX2VuYWJsZWQpIHsKKwkJZW5hYmxlX2lycShjaGFuLT5pcnEpOworCQljaGFuLT5pcnFfZW5hYmxlZCA9IDE7CisJfQorCisJLyogc3RhcnQgdGhlIGNoYW5uZWwgZ29pbmcgKi8KKworCXRtcCA9IGRtYV9yZHJlZyhjaGFuLCBTM0MyNDEwX0RNQV9ETUFTS1RSSUcpOworCXRtcCAmPSB+UzNDMjQxMF9ETUFTS1RSSUdfU1RPUDsKKwl0bXAgfD0gUzNDMjQxMF9ETUFTS1RSSUdfT047CisJZG1hX3dycmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RNQVNLVFJJRywgdG1wKTsKKworCXByX2RlYnVnKCJ3cm90ZSAlMDhseCB0byBETUFTS1RSSUdcbiIsIHRtcCk7CisKKyNpZiAwCisJLyogdGhlIGRtYSBidWZmZXIgbG9hZHMgc2hvdWxkIHRha2UgY2FyZSBvZiBjbGVhcmluZyB0aGUgQVVUTworCSAqIHJlbG9hZGluZyBmZWF0dXJlICovCisJdG1wID0gZG1hX3JkcmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RDT04pOworCXRtcCAmPSB+UzNDMjQxMF9EQ09OX05PUkVMT0FEOworCWRtYV93cnJlZyhjaGFuLCBTM0MyNDEwX0RNQV9EQ09OLCB0bXApOworI2VuZGlmCisKKwlzM2MyNDEwX2RtYV9jYWxsX29wKGNoYW4sIFMzQzI0MTBfRE1BT1BfU1RBUlQpOworCisJZGJnX3Nob3djaGFuKGNoYW4pOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBzM2MyNDEwX2RtYV9jYW5sb2FkCisgKgorICogd29yayBvdXQgaWYgd2UgY2FuIHF1ZXVlIGFub3RoZXIgYnVmZmVyIGludG8gdGhlIERNQSBlbmdpbmUKKyovCisKK3N0YXRpYyBpbnQKK3MzYzI0MTBfZG1hX2NhbmxvYWQoczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuKQoreworCWlmIChjaGFuLT5sb2FkX3N0YXRlID09IFMzQzI0MTBfRE1BTE9BRF9OT05FIHx8CisJICAgIGNoYW4tPmxvYWRfc3RhdGUgPT0gUzNDMjQxMF9ETUFMT0FEXzFSVU5OSU5HKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisKKy8qIHMzYzI0MTBfZG1hX2VucXVldWUKKyAqCisgKiBxdWV1ZSBhbiBnaXZlbiBidWZmZXIgZm9yIGRtYSB0cmFuc2Zlci4KKyAqCisgKiBpZCAgICAgICAgIHRoZSBkZXZpY2UgZHJpdmVyJ3MgaWQgaW5mb3JtYXRpb24gZm9yIHRoaXMgYnVmZmVyCisgKiBkYXRhICAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgZGF0YQorICogc2l6ZSAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzCisgKgorICogSWYgdGhlIGNoYW5uZWwgaXMgbm90IHJ1bm5pbmcsIHRoZW4gdGhlIGZsYWcgUzNDMjQxMF9ETUFGX0FVVE9TVEFSVAorICogaXMgY2hlY2tlZCwgYW5kIGlmIHNldCwgdGhlIGNoYW5uZWwgaXMgc3RhcnRlZC4gSWYgdGhpcyBmbGFnIGlzbid0IHNldCwKKyAqIHRoZW4gYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBJdCBpcyBwb3NzaWJsZSB0byBxdWV1ZSBtb3JlIHRoYW4gb25lIERNQSBidWZmZXIgb250byBhIGNoYW5uZWwgYXQKKyAqIG9uY2UsIGFuZCB0aGUgY29kZSB3aWxsIGRlYWwgd2l0aCB0aGUgcmUtbG9hZGluZyBvZiB0aGUgbmV4dCBidWZmZXIKKyAqIHdoZW4gbmVjZXNzYXJ5LgorKi8KKworaW50IHMzYzI0MTBfZG1hX2VucXVldWUodW5zaWduZWQgaW50IGNoYW5uZWwsIHZvaWQgKmlkLAorCQkJZG1hX2FkZHJfdCBkYXRhLCBpbnQgc2l6ZSkKK3sKKwlzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4gPSAmczNjMjQxMF9jaGFuc1tjaGFubmVsXTsKKwlzM2MyNDEwX2RtYV9idWZfdCAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljaGVja19jaGFubmVsKGNoYW5uZWwpOworCisJcHJfZGVidWcoIiVzOiBpZD0lcCwgZGF0YT0lMDh4LCBzaXplPSVkXG4iLAorCQkgX19GVU5DVElPTl9fLCBpZCwgKHVuc2lnbmVkIGludClkYXRhLCBzaXplKTsKKworCWJ1ZiA9IGttZW1fY2FjaGVfYWxsb2MoZG1hX2ttZW0sIEdGUF9BVE9NSUMpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiJXM6IG91dCBvZiBtZW1vcnkgKCVkIGFsbG9jKVxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sIHNpemVvZigqYnVmKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByX2RlYnVnKCIlczogbmV3IGJ1ZmZlciAlcFxuIiwgX19GVU5DVElPTl9fLCBidWYpOworCisJLy9kYmdfc2hvd2NoYW4oY2hhbik7CisKKwlidWYtPm5leHQgID0gTlVMTDsKKwlidWYtPmRhdGEgID0gYnVmLT5wdHIgPSBkYXRhOworCWJ1Zi0+c2l6ZSAgPSBzaXplOworCWJ1Zi0+aWQgICAgPSBpZDsKKwlidWYtPm1hZ2ljID0gQlVGX01BR0lDOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKGNoYW4tPmN1cnIgPT0gTlVMTCkgeworCQkvKiB3ZSd2ZSBnb3Qgbm90aGluZyBsb2FkZWQuLi4gKi8KKwkJcHJfZGVidWcoIiVzOiBidWZmZXIgJXAgcXVldWVkIG9udG8gZW1wdHkgY2hhbm5lbFxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sIGJ1Zik7CisKKwkJY2hhbi0+Y3VyciA9IGJ1ZjsKKwkJY2hhbi0+ZW5kICA9IGJ1ZjsKKwkJY2hhbi0+bmV4dCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoImRtYSVkOiAlczogYnVmZmVyICVwIHF1ZXVlZCBvbnRvIG5vbi1lbXB0eSBjaGFubmVsXG4iLAorCQkJIGNoYW4tPm51bWJlciwgX19GVU5DVElPTl9fLCBidWYpOworCisJCWlmIChjaGFuLT5lbmQgPT0gTlVMTCkKKwkJCXByX2RlYnVnKCJkbWElZDogJXM6ICVwIG5vdCBlbXB0eSwgYW5kIGNoYW4tPmVuZD09TlVMTD9cbiIsCisJCQkJIGNoYW4tPm51bWJlciwgX19GVU5DVElPTl9fLCBjaGFuKTsKKworCQljaGFuLT5lbmQtPm5leHQgPSBidWY7CisJCWNoYW4tPmVuZCA9IGJ1ZjsKKwl9CisKKwkvKiBpZiBuZWNlc3NhcnksIHVwZGF0ZSB0aGUgbmV4dCBidWZmZXIgZmllbGQgKi8KKwlpZiAoY2hhbi0+bmV4dCA9PSBOVUxMKQorCQljaGFuLT5uZXh0ID0gYnVmOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBsb2FkIGEgYnVmZmVyICovCisJaWYgKGNoYW4tPnN0YXRlID09IFMzQzI0MTBfRE1BX1JVTk5JTkcpIHsKKwkJaWYgKGNoYW4tPmxvYWRfc3RhdGUgPT0gUzNDMjQxMF9ETUFMT0FEXzFMT0FERUQgJiYgMSkgeworCQkJaWYgKHMzYzI0MTBfZG1hX3dhaXRmb3Jsb2FkKGNoYW4sIF9fTElORV9fKSA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogbG9hZGJ1ZmZlcjoiCisJCQkJICAgICAgICJ0aW1lb3V0IGxvYWRpbmcgYnVmZmVyXG4iLAorCQkJCSAgICAgICBjaGFuLT5udW1iZXIpOworCQkJCWRiZ19zaG93Y2hhbihjaGFuKTsKKwkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQl3aGlsZSAoczNjMjQxMF9kbWFfY2FubG9hZChjaGFuKSAmJiBjaGFuLT5uZXh0ICE9IE5VTEwpIHsKKwkJCXMzYzI0MTBfZG1hX2xvYWRidWZmZXIoY2hhbiwgY2hhbi0+bmV4dCk7CisJCX0KKwl9IGVsc2UgaWYgKGNoYW4tPnN0YXRlID09IFMzQzI0MTBfRE1BX0lETEUpIHsKKwkJaWYgKGNoYW4tPmZsYWdzICYgUzNDMjQxMF9ETUFGX0FVVE9TVEFSVCkgeworCQkJczNjMjQxMF9kbWFfY3RybChjaGFuLT5udW1iZXIsIFMzQzI0MTBfRE1BT1BfU1RBUlQpOworCQl9CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2VucXVldWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3MzYzI0MTBfZG1hX2ZyZWVidWYoczNjMjQxMF9kbWFfYnVmX3QgKmJ1ZikKK3sKKwlpbnQgbWFnaWNvayA9IChidWYtPm1hZ2ljID09IEJVRl9NQUdJQyk7CisKKwlidWYtPm1hZ2ljID0gLTE7CisKKwlpZiAobWFnaWNvaykgeworCQlrbWVtX2NhY2hlX2ZyZWUoZG1hX2ttZW0sIGJ1Zik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJzM2MyNDEwX2RtYV9mcmVlYnVmOiBidWZmICVwIHdpdGggYmFkIG1hZ2ljXG4iLCBidWYpOworCX0KK30KKworLyogczNjMjQxMF9kbWFfbGFzdHhmZXIKKyAqCisgKiBjYWxsZWQgd2hlbiB0aGUgc3lzdGVtIGlzIG91dCBvZiBidWZmZXJzLCB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbm5lbAorICogaXMgcHJlcGFyZWQgZm9yIHNodXRkb3duLgorKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzM2MyNDEwX2RtYV9sYXN0eGZlcihzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4pCit7CisJcHJfZGVidWcoImRtYSVkOiBzM2MyNDEwX2RtYV9sYXN0eGZlcjogbG9hZF9zdGF0ZSAlZFxuIiwKKwkJIGNoYW4tPm51bWJlciwgY2hhbi0+bG9hZF9zdGF0ZSk7CisKKwlzd2l0Y2ggKGNoYW4tPmxvYWRfc3RhdGUpIHsKKwljYXNlIFMzQzI0MTBfRE1BTE9BRF9OT05FOgorCQlicmVhazsKKworCWNhc2UgUzNDMjQxMF9ETUFMT0FEXzFMT0FERUQ6CisJCWlmIChzM2MyNDEwX2RtYV93YWl0Zm9ybG9hZChjaGFuLCBfX0xJTkVfXykgPT0gMCkgeworCQkJCS8qIGZsYWcgZXJyb3I/ICovCisJCQlwcmludGsoS0VSTl9FUlIgImRtYSVkOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGxvYWRcbiIsCisJCQkgICAgICAgY2hhbi0+bnVtYmVyKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJkbWElZDogbGFzdHhmZXI6IHVuaGFuZGxlZCBsb2FkX3N0YXRlICVkIHdpdGggbm8gbmV4dCIsCisJCQkgY2hhbi0+bnVtYmVyLCBjaGFuLT5sb2FkX3N0YXRlKTsKKwkJcmV0dXJuOworCisJfQorCisJLyogaG9wZWZ1bGx5IHRoaXMnbGwgc2h1dCB0aGUgZGFtbmVkIHRoaW5nIHVwIGFmdGVyIHRoZSB0cmFuc2Zlci4uLiAqLworCWRtYV93cnJlZyhjaGFuLCBTM0MyNDEwX0RNQV9EQ09OLCBjaGFuLT5kY29uIHwgUzNDMjQxMF9EQ09OX05PUkVMT0FEKTsKK30KKworCisjZGVmaW5lIGRtYWRiZzIoeC4uLikKKworc3RhdGljIGlycXJldHVybl90CitzM2MyNDEwX2RtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2cHcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXMzYzI0MTBfZG1hX2NoYW5fdCAqY2hhbiA9IChzM2MyNDEwX2RtYV9jaGFuX3QgKilkZXZwdzsKKwlzM2MyNDEwX2RtYV9idWZfdCAgKmJ1ZjsKKworCWJ1ZiA9IGNoYW4tPmN1cnI7CisKKwlkYmdfc2hvd2NoYW4oY2hhbik7CisKKwkvKiBtb2RpZnkgdGhlIGNoYW5uZWwgc3RhdGUgKi8KKworCXN3aXRjaCAoY2hhbi0+bG9hZF9zdGF0ZSkgeworCWNhc2UgUzNDMjQxMF9ETUFMT0FEXzFSVU5OSU5HOgorCQkvKiBUT0RPIC0gaWYgd2UgYXJlIHJ1bm5pbmcgb25seSBvbmUgYnVmZmVyLCB3ZSBwcm9iYWJseQorCQkgKiB3YW50IHRvIHJlbG9hZCBoZXJlLCBhbmQgdGhlbiB3b3JyeSBhYm91dCB0aGUgYnVmZmVyCisJCSAqIGNhbGxiYWNrICovCisKKwkJY2hhbi0+bG9hZF9zdGF0ZSA9IFMzQzI0MTBfRE1BTE9BRF9OT05FOworCQlicmVhazsKKworCWNhc2UgUzNDMjQxMF9ETUFMT0FEXzFMT0FERUQ6CisJCS8qIGlpcmMsIHdlIHNob3VsZCBnbyBiYWNrIHRvIE5PTkUgbG9hZGVkIGhlcmUsIHdlCisJCSAqIGhhZCBhIGJ1ZmZlciwgYW5kIGl0IHdhcyBuZXZlciB2ZXJpZmllZCBhcyBiZWluZworCQkgKiBsb2FkZWQuCisJCSAqLworCisJCWNoYW4tPmxvYWRfc3RhdGUgPSBTM0MyNDEwX0RNQUxPQURfTk9ORTsKKwkJYnJlYWs7CisKKwljYXNlIFMzQzI0MTBfRE1BTE9BRF8xTE9BREVEXzFSVU5OSU5HOgorCQkvKiB3ZSdsbCB3b3JyeSBhYm91dCBjaGVja2luZyB0byBzZWUgaWYgYW5vdGhlciBidWZmZXIgaXMKKwkJICogcmVhZHkgYWZ0ZXIgd2UndmUgY2FsbGVkIGJhY2sgdGhlIG93bmVyLiBUaGlzIHNob3VsZAorCQkgKiBlbnN1cmUgd2UgZG8gbm90IHdhaXQgYXJvdW5kIHRvbyBsb25nIGZvciB0aGUgRE1BCisJCSAqIGVuZ2luZSB0byBzdGFydCB0aGUgbmV4dCB0cmFuc2ZlcgorCQkgKi8KKworCQljaGFuLT5sb2FkX3N0YXRlID0gUzNDMjQxMF9ETUFMT0FEXzFMT0FERUQ7CisJCWJyZWFrOworCisJY2FzZSBTM0MyNDEwX0RNQUxPQURfTk9ORToKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogSVJRIHdpdGggbm8gbG9hZGVkIGJ1ZmZlcj9cbiIsCisJCSAgICAgICBjaGFuLT5udW1iZXIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IElSUSBpbiBpbnZhbGlkIGxvYWRfc3RhdGUgJWRcbiIsCisJCSAgICAgICBjaGFuLT5udW1iZXIsIGNoYW4tPmxvYWRfc3RhdGUpOworCQlicmVhazsKKwl9CisKKwlpZiAoYnVmICE9IE5VTEwpIHsKKwkJLyogdXBkYXRlIHRoZSBjaGFpbiB0byBtYWtlIHN1cmUgdGhhdCBpZiB3ZSBsb2FkIGFueSBtb3JlCisJCSAqIGJ1ZmZlcnMgd2hlbiB3ZSBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgdGhpbmdzIHNob3VsZAorCQkgKiB3b3JrIHByb3Blcmx5ICovCisKKwkJY2hhbi0+Y3VyciA9IGJ1Zi0+bmV4dDsKKwkJYnVmLT5uZXh0ICA9IE5VTEw7CisKKwkJaWYgKGJ1Zi0+bWFnaWMgIT0gQlVGX01BR0lDKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRtYSVkOiAlczogYnVmICVwIGluY29ycmVjdCBtYWdpY1xuIiwKKwkJCSAgICAgICBjaGFuLT5udW1iZXIsIF9fRlVOQ1RJT05fXywgYnVmKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCXMzYzI0MTBfZG1hX2J1ZmZkb25lKGNoYW4sIGJ1ZiwgUzNDMjQxMF9SRVNfT0spOworCisJCS8qIGZyZWUgcmVzb3VjZXMgKi8KKwkJczNjMjQxMF9kbWFfZnJlZWJ1ZihidWYpOworCX0gZWxzZSB7CisJfQorCisJaWYgKGNoYW4tPm5leHQgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXN3aXRjaCAoY2hhbi0+bG9hZF9zdGF0ZSkgeworCQljYXNlIFMzQzI0MTBfRE1BTE9BRF8xUlVOTklORzoKKwkJCS8qIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIHRoaXMgc3RhdGUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUzNDMjQxMF9ETUFMT0FEX05PTkU6CisJCQkvKiBjYW4gbG9hZCBidWZmZXIgaW1tZWRpYXRlbHkgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUzNDMjQxMF9ETUFMT0FEXzFMT0FERUQ6CisJCQlpZiAoczNjMjQxMF9kbWFfd2FpdGZvcmxvYWQoY2hhbiwgX19MSU5FX18pID09IDApIHsKKwkJCQkvKiBmbGFnIGVycm9yPyAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IHRpbWVvdXQgd2FpdGluZyBmb3IgbG9hZFxuIiwKKwkJCQkgICAgICAgY2hhbi0+bnVtYmVyKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUzNDMjQxMF9ETUFMT0FEXzFMT0FERURfMVJVTk5JTkc6CisJCQlnb3RvIG5vX2xvYWQ7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IHVua25vd24gbG9hZF9zdGF0ZSBpbiBpcnEsICVkXG4iLAorCQkJICAgICAgIGNoYW4tPm51bWJlciwgY2hhbi0+bG9hZF9zdGF0ZSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCXMzYzI0MTBfZG1hX2xvYWRidWZmZXIoY2hhbiwgY2hhbi0+bmV4dCk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9IGVsc2UgeworCQlzM2MyNDEwX2RtYV9sYXN0eGZlcihjaGFuKTsKKworCQkvKiBzZWUgaWYgd2UgY2FuIHN0b3AgdGhpcyBjaGFubmVsLi4gKi8KKwkJaWYgKGNoYW4tPmxvYWRfc3RhdGUgPT0gUzNDMjQxMF9ETUFMT0FEX05PTkUpIHsKKwkJCXByX2RlYnVnKCJkbWElZDogZW5kIG9mIHRyYW5zZmVyLCBzdG9wcGluZyBjaGFubmVsICglbGQpXG4iLAorCQkJCSBjaGFuLT5udW1iZXIsIGppZmZpZXMpOworCQkJczNjMjQxMF9kbWFfY3RybChjaGFuLT5udW1iZXIsIFMzQzI0MTBfRE1BT1BfU1RPUCk7CisJCX0KKwl9CisKKyBub19sb2FkOgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisKKy8qIHMzYzI0MTBfcmVxdWVzdF9kbWEKKyAqCisgKiBnZXQgY29udHJvbCBvZiBhbiBkbWEgY2hhbm5lbAorKi8KKworaW50IHMzYzI0MTBfZG1hX3JlcXVlc3QodW5zaWduZWQgaW50IGNoYW5uZWwsIHMzYzI0MTBfZG1hX2NsaWVudF90ICpjbGllbnQsCisJCQl2b2lkICpkZXYpCit7CisJczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuID0gJnMzYzI0MTBfY2hhbnNbY2hhbm5lbF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJcHJfZGVidWcoImRtYSVkOiBzM2MyNDEwX3JlcXVlc3RfZG1hOiBjbGllbnQ9JXMsIGRldj0lcFxuIiwKKwkJIGNoYW5uZWwsIGNsaWVudC0+bmFtZSwgZGV2KTsKKworCWNoZWNrX2NoYW5uZWwoY2hhbm5lbCk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlkYmdfc2hvd2NoYW4oY2hhbik7CisKKwlpZiAoY2hhbi0+aW5fdXNlKSB7CisJCWlmIChjbGllbnQgIT0gY2hhbi0+Y2xpZW50KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRtYSVkOiBhbHJlYWR5IGluIHVzZVxuIiwgY2hhbm5lbCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogY2xpZW50IGFscmVhZHkgaGFzIGNoYW5uZWxcbiIsIGNoYW5uZWwpOworCQl9CisJfQorCisJY2hhbi0+Y2xpZW50ID0gY2xpZW50OworCWNoYW4tPmluX3VzZSA9IDE7CisKKwlpZiAoIWNoYW4tPmlycV9jbGFpbWVkKSB7CisJCXByX2RlYnVnKCJkbWElZDogJXMgOiByZXF1ZXN0aW5nIGlycSAlZFxuIiwKKwkJCSBjaGFubmVsLCBfX0ZVTkNUSU9OX18sIGNoYW4tPmlycSk7CisKKwkJZXJyID0gcmVxdWVzdF9pcnEoY2hhbi0+aXJxLCBzM2MyNDEwX2RtYV9pcnEsIFNBX0lOVEVSUlVQVCwKKwkJCQkgIGNsaWVudC0+bmFtZSwgKHZvaWQgKiljaGFuKTsKKworCQlpZiAoZXJyKSB7CisJCQljaGFuLT5pbl91c2UgPSAwOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZ2V0IElSUSAlZCBmb3IgRE1BICVkXG4iLAorCQkJICAgICAgIGNsaWVudC0+bmFtZSwgY2hhbi0+aXJxLCBjaGFuLT5udW1iZXIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWNoYW4tPmlycV9jbGFpbWVkID0gMTsKKwkJY2hhbi0+aXJxX2VuYWJsZWQgPSAxOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIG5lZWQgdG8gc2V0dXAgKi8KKworCXByX2RlYnVnKCIlczogY2hhbm5lbCBpbml0aWFsaXNlZCwgJXBcbiIsIF9fRlVOQ1RJT05fXywgY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9yZXF1ZXN0KTsKKworLyogczNjMjQxMF9kbWFfZnJlZQorICoKKyAqIHJlbGVhc2UgdGhlIGdpdmVuIGNoYW5uZWwgYmFjayB0byB0aGUgc3lzdGVtLCB3aWxsIHN0b3AgYW5kIGZsdXNoCisgKiBhbnkgb3V0c3RhbmRpbmcgdHJhbnNmZXJzLCBhbmQgZW5zdXJlIHRoZSBjaGFubmVsIGlzIHJlYWR5IGZvciB0aGUKKyAqIG5leHQgY2xhaW1hbnQuCisgKgorICogTm90ZSwgYWx0aG91Z2ggYSB3YXJuaW5nIGlzIGN1cnJlbnRseSBwcmludGVkIGlmIHRoZSBmcmVlaW5nIGNsaWVudAorICogaW5mbyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHJlZ2lzdHJhbnQncyBjbGllbnQgaW5mbywgdGhlIGZyZWUgaXMgc3RpbGwKKyAqIGFsbG93ZWQgdG8gZ28gdGhyb3VnaC4KKyovCisKK2ludCBzM2MyNDEwX2RtYV9mcmVlKGRtYWNoX3QgY2hhbm5lbCwgczNjMjQxMF9kbWFfY2xpZW50X3QgKmNsaWVudCkKK3sKKwlzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4gPSAmczNjMjQxMF9jaGFuc1tjaGFubmVsXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2hlY2tfY2hhbm5lbChjaGFubmVsKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCisJaWYgKGNoYW4tPmNsaWVudCAhPSBjbGllbnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZG1hJWQ6IHBvc3NpYmxlIGZyZWUgZnJvbSBkaWZmZXJlbnQgY2xpZW50IChjaGFubmVsICVwLCBwYXNzZWQgJXApXG4iLAorCQkgICAgICAgY2hhbm5lbCwgY2hhbi0+Y2xpZW50LCBjbGllbnQpOworCX0KKworCS8qIHNvcnQgb3V0IHN0b3BwaW5nIGFuZCBmcmVlaW5nIHRoZSBjaGFubmVsICovCisKKwlpZiAoY2hhbi0+c3RhdGUgIT0gUzNDMjQxMF9ETUFfSURMRSkgeworCQlwcl9kZWJ1ZygiJXM6IG5lZWQgdG8gc3RvcCBkbWEgY2hhbm5lbCAlcFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgY2hhbik7CisKKwkJLyogcG9zc2libHkgZmx1c2ggdGhlIGNoYW5uZWwgKi8KKwkJczNjMjQxMF9kbWFfY3RybChjaGFubmVsLCBTM0MyNDEwX0RNQU9QX1NUT1ApOworCX0KKworCWNoYW4tPmNsaWVudCA9IE5VTEw7CisJY2hhbi0+aW5fdXNlID0gMDsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2ZyZWUpOworCitzdGF0aWMgaW50IHMzYzI0MTBfZG1hX2Rvc3RvcChzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4pCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlkYmdfc2hvd2NoYW4oY2hhbik7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzM2MyNDEwX2RtYV9jYWxsX29wKGNoYW4sICBTM0MyNDEwX0RNQU9QX1NUT1ApOworCisJdG1wID0gZG1hX3JkcmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RNQVNLVFJJRyk7CisJdG1wIHw9IFMzQzI0MTBfRE1BU0tUUklHX1NUT1A7CisJZG1hX3dycmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RNQVNLVFJJRywgdG1wKTsKKworI2lmIDAKKwkvKiBzaG91bGQgYWxzbyBjbGVhciBpbnRlcnJ1cHRzLCBhY2NvcmRpbmcgdG8gV2luQ0UgQlNQICovCisJdG1wID0gZG1hX3JkcmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RDT04pOworCXRtcCB8PSBTM0MyNDEwX0RDT05fTk9SRUxPQUQ7CisJZG1hX3dycmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RDT04sIHRtcCk7CisjZW5kaWYKKworCWNoYW4tPnN0YXRlICAgICAgPSBTM0MyNDEwX0RNQV9JRExFOworCWNoYW4tPmxvYWRfc3RhdGUgPSBTM0MyNDEwX0RNQUxPQURfTk9ORTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBzM2MyNDEwX2RtYV9mbHVzaAorICoKKyAqIHN0b3AgdGhlIGNoYW5uZWwsIGFuZCByZW1vdmUgYWxsIGN1cnJlbnQgYW5kIHBlbmRpbmcgdHJhbnNmZXJzCisqLworCitzdGF0aWMgaW50IHMzYzI0MTBfZG1hX2ZsdXNoKHMzYzI0MTBfZG1hX2NoYW5fdCAqY2hhbikKK3sKKwlzM2MyNDEwX2RtYV9idWZfdCAqYnVmLCAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChjaGFuLT5zdGF0ZSAhPSBTM0MyNDEwX0RNQV9JRExFKSB7CisJCXByX2RlYnVnKCIlczogc3RvcHBpbmcgY2hhbm5lbC4uLlxuIiwgX19GVU5DVElPTl9fICk7CisJCXMzYzI0MTBfZG1hX2N0cmwoY2hhbi0+bnVtYmVyLCBTM0MyNDEwX0RNQU9QX1NUT1ApOworCX0KKworCWJ1ZiA9IGNoYW4tPmN1cnI7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlidWYgPSBjaGFuLT5uZXh0OworCisJY2hhbi0+Y3VyciA9IGNoYW4tPm5leHQgPSBjaGFuLT5lbmQgPSBOVUxMOworCisJaWYgKGJ1ZiAhPSBOVUxMKSB7CisJCWZvciAoIDsgYnVmICE9IE5VTEw7IGJ1ZiA9IG5leHQpIHsKKwkJCW5leHQgPSBidWYtPm5leHQ7CisKKwkJCXByX2RlYnVnKCIlczogZnJlZSBidWZmZXIgJXAsIG5leHQgJXBcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBidWYsIGJ1Zi0+bmV4dCk7CisKKwkJCXMzYzI0MTBfZG1hX2J1ZmZkb25lKGNoYW4sIGJ1ZiwgUzNDMjQxMF9SRVNfQUJPUlQpOworCQkJczNjMjQxMF9kbWFfZnJlZWJ1ZihidWYpOworCQl9CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50CitzM2MyNDEwX2RtYV9jdHJsKGRtYWNoX3QgY2hhbm5lbCwgczNjMjQxMF9jaGFuX29wX3Qgb3ApCit7CisJczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuID0gJnMzYzI0MTBfY2hhbnNbY2hhbm5lbF07CisKKwljaGVja19jaGFubmVsKGNoYW5uZWwpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgUzNDMjQxMF9ETUFPUF9TVEFSVDoKKwkJcmV0dXJuIHMzYzI0MTBfZG1hX3N0YXJ0KGNoYW4pOworCisJY2FzZSBTM0MyNDEwX0RNQU9QX1NUT1A6CisJCXJldHVybiBzM2MyNDEwX2RtYV9kb3N0b3AoY2hhbik7CisKKwljYXNlIFMzQzI0MTBfRE1BT1BfUEFVU0U6CisJCXJldHVybiAtRU5PRU5UOworCisJY2FzZSBTM0MyNDEwX0RNQU9QX1JFU1VNRToKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljYXNlIFMzQzI0MTBfRE1BT1BfRkxVU0g6CisJCXJldHVybiBzM2MyNDEwX2RtYV9mbHVzaChjaGFuKTsKKworCWNhc2UgUzNDMjQxMF9ETUFPUF9USU1FT1VUOgorCQlyZXR1cm4gMDsKKworCX0KKworCXJldHVybiAtRU5PRU5UOyAgICAgIC8qIHVua25vd24sIGRvbid0IGJvdGhlciAqLworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2N0cmwpOworCisvKiBETUEgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBjaGFubmVsCisgKgorICogRElTUkNDIC0+IHNvdXJjZSBvZiB0aGUgRE1BIChBSEIsQVBCKQorICogRElTUkMgIC0+IHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBETUEKKyAqIERJRFNUQyAtPiBkZXN0aW5hdGlvbiBvZiB0aGUgRE1BIChBSEIsQVBEKQorICogRElEU1QgIC0+IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIERNQQorKi8KKworLyogczNjMjQxMF9kbWFfY29uZmlnCisgKgorICogeGZlcnNpemU6ICAgICBzaXplIG9mIHVuaXQgaW4gYnl0ZXMgKDEsMiw0KQorICogZGNvbjogICAgICAgICBiYXNlIHZhbHVlIG9mIHRoZSBEQ09OeCByZWdpc3RlcgorKi8KKworaW50IHMzYzI0MTBfZG1hX2NvbmZpZyhkbWFjaF90IGNoYW5uZWwsCisJCSAgICAgICBpbnQgeGZlcnVuaXQsCisJCSAgICAgICBpbnQgZGNvbikKK3sKKwlzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4gPSAmczNjMjQxMF9jaGFuc1tjaGFubmVsXTsKKworCXByX2RlYnVnKCIlczogY2hhbj0lZCwgeGZlcl91bml0PSVkLCBkY29uPSUwOHhcbiIsCisJCSBfX0ZVTkNUSU9OX18sIGNoYW5uZWwsIHhmZXJ1bml0LCBkY29uKTsKKworCWNoZWNrX2NoYW5uZWwoY2hhbm5lbCk7CisKKwlzd2l0Y2ggKHhmZXJ1bml0KSB7CisJY2FzZSAxOgorCQlkY29uIHw9IFMzQzI0MTBfRENPTl9CWVRFOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJZGNvbiB8PSBTM0MyNDEwX0RDT05fSEFMRldPUkQ7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlkY29uIHw9IFMzQzI0MTBfRENPTl9XT1JEOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczogYmFkIHRyYW5zZmVyIHNpemUgJWRcbiIsIF9fRlVOQ1RJT05fXywgeGZlcnVuaXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkY29uIHw9IFMzQzI0MTBfRENPTl9IV1RSSUc7CisJZGNvbiB8PSBTM0MyNDEwX0RDT05fSU5UUkVROworCisJcHJfZGVidWcoIiVzOiBkY29uIG5vdyAlMDh4XG4iLCBfX0ZVTkNUSU9OX18sIGRjb24pOworCisJY2hhbi0+ZGNvbiA9IGRjb247CisJY2hhbi0+eGZlcl91bml0ID0geGZlcnVuaXQ7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9jb25maWcpOworCitpbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3MoZG1hY2hfdCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuID0gJnMzYzI0MTBfY2hhbnNbY2hhbm5lbF07CisKKwljaGVja19jaGFubmVsKGNoYW5uZWwpOworCisJcHJfZGVidWcoIiVzOiBjaGFuPSVwLCBmbGFncz0lMDh4XG4iLCBfX0ZVTkNUSU9OX18sIGNoYW4sIGZsYWdzKTsKKworCWNoYW4tPmZsYWdzID0gZmxhZ3M7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9zZXRmbGFncyk7CisKKworLyogZG8gd2UgbmVlZCB0byBwcm90ZWN0IHRoZSBzZXR0aW5ncyBvZiB0aGUgZmllbGRzIGZyb20KKyAqIGlycT8KKyovCisKK2ludCBzM2MyNDEwX2RtYV9zZXRfb3BmbihkbWFjaF90IGNoYW5uZWwsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pCit7CisJczNjMjQxMF9kbWFfY2hhbl90ICpjaGFuID0gJnMzYzI0MTBfY2hhbnNbY2hhbm5lbF07CisKKwljaGVja19jaGFubmVsKGNoYW5uZWwpOworCisJcHJfZGVidWcoIiVzOiBjaGFuPSVwLCBvcCBydG49JXBcbiIsIF9fRlVOQ1RJT05fXywgY2hhbiwgcnRuKTsKKworCWNoYW4tPm9wX2ZuID0gcnRuOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfc2V0X29wZm4pOworCitpbnQgczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKGRtYWNoX3QgY2hhbm5lbCwgczNjMjQxMF9kbWFfY2Jmbl90IHJ0bikKK3sKKwlzM2MyNDEwX2RtYV9jaGFuX3QgKmNoYW4gPSAmczNjMjQxMF9jaGFuc1tjaGFubmVsXTsKKworCWNoZWNrX2NoYW5uZWwoY2hhbm5lbCk7CisKKwlwcl9kZWJ1ZygiJXM6IGNoYW49JXAsIGNhbGxiYWNrIHJ0bj0lcFxuIiwgX19GVU5DVElPTl9fLCBjaGFuLCBydG4pOworCisJY2hhbi0+Y2FsbGJhY2tfZm4gPSBydG47CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4pOworCisvKiBzM2MyNDEwX2RtYV9kZXZjb25maWcKKyAqCisgKiBjb25maWd1cmUgdGhlIGRtYSBzb3VyY2UvZGVzdGluYXRpb24gaGFyZHdhcmUgdHlwZSBhbmQgYWRkcmVzcworICoKKyAqIHNvdXJjZTogICAgUzNDMjQxMF9ETUFTUkNfSFc6IHNvdXJjZSBpcyBoYXJkd2FyZQorICogICAgICAgICAgICBTM0MyNDEwX0RNQVNSQ19NRU06IHNvdXJjZSBpcyBtZW1vcnkKKyAqCisgKiBod2NmZzogICAgIHRoZSB2YWx1ZSBmb3IgeHh4U1RDbiByZWdpc3RlciwKKyAqICAgICAgICAgICAgYml0IDA6IDA9aW5jcmVtZW50IHBvaW50ZXIsIDE9bGVhdmUgcG9pbnRlcgorICogICAgICAgICAgICBiaXQgMTogMD1zb3VjcmUgaXMgQUhCLCAxPXNvdWNyZSBpcyBBUEIKKyAqCisgKiBkZXZhZGRyOiAgIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNvdXJjZQorKi8KKworaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyhpbnQgY2hhbm5lbCwKKwkJCSAgczNjMjQxMF9kbWFzcmNfdCBzb3VyY2UsCisJCQkgIGludCBod2NmZywKKwkJCSAgdW5zaWduZWQgbG9uZyBkZXZhZGRyKQoreworCXMzYzI0MTBfZG1hX2NoYW5fdCAqY2hhbiA9ICZzM2MyNDEwX2NoYW5zW2NoYW5uZWxdOworCisJY2hlY2tfY2hhbm5lbChjaGFubmVsKTsKKworCXByX2RlYnVnKCIlczogc291cmNlPSVkLCBod2NmZz0lMDh4LCBkZXZhZGRyPSUwOGx4XG4iLAorCQkgX19GVU5DVElPTl9fLCAoaW50KXNvdXJjZSwgaHdjZmcsIGRldmFkZHIpOworCisJY2hhbi0+c291cmNlID0gc291cmNlOworCWNoYW4tPmRldl9hZGRyID0gZGV2YWRkcjsKKworCXN3aXRjaCAoc291cmNlKSB7CisJY2FzZSBTM0MyNDEwX0RNQVNSQ19IVzoKKwkJLyogc291cmNlIGlzIGhhcmR3YXJlICovCisJCXByX2RlYnVnKCIlczogaHcgc291cmNlLCBkZXZhZGRyPSUwOGx4LCBod2NmZz0lZFxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sIGRldmFkZHIsIGh3Y2ZnKTsKKwkJZG1hX3dycmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RJU1JDQywgaHdjZmcgJiAzKTsKKwkJZG1hX3dycmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RJU1JDLCAgZGV2YWRkcik7CisJCWRtYV93cnJlZyhjaGFuLCBTM0MyNDEwX0RNQV9ESURTVEMsICgwPDwxKSB8ICgwPDwwKSk7CisKKwkJY2hhbi0+YWRkcl9yZWcgPSBkbWFfcmVnYWRkcihjaGFuLCBTM0MyNDEwX0RNQV9ESURTVCk7CisJCXJldHVybiAwOworCisJY2FzZSBTM0MyNDEwX0RNQVNSQ19NRU06CisJCS8qIHNvdXJjZSBpcyBtZW1vcnkgKi8KKwkJcHJfZGVidWcoICIlczogbWVtIHNvdXJjZSwgZGV2YWRkcj0lMDhseCwgaHdjZmc9JWRcbiIsCisJCQkgIF9fRlVOQ1RJT05fXywgZGV2YWRkciwgaHdjZmcpOworCQlkbWFfd3JyZWcoY2hhbiwgUzNDMjQxMF9ETUFfRElTUkNDLCAoMDw8MSkgfCAoMDw8MCkpOworCQlkbWFfd3JyZWcoY2hhbiwgUzNDMjQxMF9ETUFfRElEU1QsICBkZXZhZGRyKTsKKwkJZG1hX3dycmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RJRFNUQywgaHdjZmcgJiAzKTsKKworCQljaGFuLT5hZGRyX3JlZyA9IGRtYV9yZWdhZGRyKGNoYW4sIFMzQzI0MTBfRE1BX0RJU1JDKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogaW52YWxpZCBzb3VyY2UgdHlwZSAoJWQpXG4iLCBjaGFubmVsLCBzb3VyY2UpOworCXJldHVybiAtRUlOVkFMOworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2RldmNvbmZpZyk7CisKKy8qIHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uCisgKgorICogcmV0dXJucyB0aGUgY3VycmVudCB0cmFuc2ZlciBwb2ludHMgZm9yIHRoZSBkbWEgc291cmNlIGFuZCBkZXN0aW5hdGlvbgorKi8KKworaW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKGRtYWNoX3QgY2hhbm5lbCwgZG1hX2FkZHJfdCAqc3JjLCBkbWFfYWRkcl90ICpkc3QpCit7CisgCXMzYzI0MTBfZG1hX2NoYW5fdCAqY2hhbiA9ICZzM2MyNDEwX2NoYW5zW2NoYW5uZWxdOworCisgCWNoZWNrX2NoYW5uZWwoY2hhbm5lbCk7CisKKwlpZiAoc3JjICE9IE5VTEwpCisgCQkqc3JjID0gZG1hX3JkcmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RDU1JDKTsKKworIAlpZiAoZHN0ICE9IE5VTEwpCisgCQkqZHN0ID0gZG1hX3JkcmVnKGNoYW4sIFMzQzI0MTBfRE1BX0RDRFNUKTsKKworIAlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbik7CisKKworLyogc3lzdGVtIGRldmljZSBjbGFzcyAqLworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgczNjMjQxMF9kbWFfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJczNjMjQxMF9kbWFfY2hhbl90ICpjcCA9IGNvbnRhaW5lcl9vZihkZXYsIHMzYzI0MTBfZG1hX2NoYW5fdCwgZGV2KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJzdXNwZW5kaW5nIGRtYSBjaGFubmVsICVkXG4iLCBjcC0+bnVtYmVyKTsKKworCWlmIChkbWFfcmRyZWcoY3AsIFMzQzI0MTBfRE1BX0RNQVNLVFJJRykgJiBTM0MyNDEwX0RNQVNLVFJJR19PTikgeworCQkvKiB0aGUgZG1hIGNoYW5uZWwgaXMgc3RpbGwgd29ya2luZywgd2hpY2ggaXMgcHJvYmFibHkKKwkJICogYSBiYWQgdGhpbmcgdG8gZG8gb3ZlciBzdXNwZW5kL3Jlc3VtZS4gV2Ugc3RvcCB0aGUKKwkJICogY2hhbm5lbCBhbmQgYXNzdW1lIHRoYXQgdGhlIGNsaWVudCBpcyBlaXRoZXIgZ29pbmcgdG8KKwkJICogcmV0cnkgYWZ0ZXIgcmVzdW1lLCBvciB0aGF0IGl0IGlzIGJyb2tlbi4KKwkJICovCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZG1hOiBzdG9wcGluZyBjaGFubmVsICVkIGR1ZSB0byBzdXNwZW5kXG4iLAorCQkgICAgICAgY3AtPm51bWJlcik7CisKKwkJczNjMjQxMF9kbWFfZG9zdG9wKGNwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX2RtYV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgczNjMjQxMF9kbWFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzYzI0MTBfZG1hX3Jlc3VtZSAgTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBkbWFfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiczNjMjR4eC1kbWEiKSwKKwkuc3VzcGVuZAk9IHMzYzI0MTBfZG1hX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2MyNDEwX2RtYV9yZXN1bWUsCit9OworCisvKiBrbWVtIGNhY2hlIGltcGxlbWVudGF0aW9uICovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfZG1hX2NhY2hlX2N0b3Iodm9pZCAqcCwga21lbV9jYWNoZV90ICpjLCB1bnNpZ25lZCBsb25nIGYpCit7CisJbWVtc2V0KHAsIDAsIHNpemVvZihzM2MyNDEwX2RtYV9idWZfdCkpOworfQorCisKKy8qIGluaXRpYWxpc2F0aW9uIGNvZGUgKi8KKworc3RhdGljIGludCBfX2luaXQgczNjMjQxMF9pbml0X2RtYSh2b2lkKQoreworCXMzYzI0MTBfZG1hX2NoYW5fdCAqY3A7CisJaW50IGNoYW5uZWw7CisJaW50IHJldDsKKworCXByaW50aygiUzNDMjQxMCBETUEgRHJpdmVyLCAoYykgMjAwMy0yMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIik7CisKKwlkbWFfYmFzZSA9IGlvcmVtYXAoUzNDMjQxMF9QQV9ETUEsIDB4MjAwKTsKKwlpZiAoZG1hX2Jhc2UgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYSBmYWlsZWQgdG8gcmVtYXAgcmVnaXN0ZXIgYmxvY2tcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmRtYV9zeXNjbGFzcyk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hIHN5c2NsYXNzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlkbWFfa21lbSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkbWFfZGVzYyIsIHNpemVvZihzM2MyNDEwX2RtYV9idWZfdCksIDAsCisJCQkJICAgICBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJICAgICBzM2MyNDEwX2RtYV9jYWNoZV9jdG9yLCBOVUxMKTsKKworCWlmIChkbWFfa21lbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hIGZhaWxlZCB0byBtYWtlIGttZW0gY2FjaGVcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgUzNDMjQxMF9ETUFfQ0hBTk5FTFM7IGNoYW5uZWwrKykgeworCQljcCA9ICZzM2MyNDEwX2NoYW5zW2NoYW5uZWxdOworCisJCW1lbXNldChjcCwgMCwgc2l6ZW9mKHMzYzI0MTBfZG1hX2NoYW5fdCkpOworCisJCS8qIGRtYSBjaGFubmVsIGlycXMgYXJlIGluIG9yZGVyLi4gKi8KKwkJY3AtPm51bWJlciA9IGNoYW5uZWw7CisJCWNwLT5pcnEgICAgPSBjaGFubmVsICsgSVJRX0RNQTA7CisJCWNwLT5yZWdzICAgPSBkbWFfYmFzZSArIChjaGFubmVsKjB4NDApOworCisJCS8qIHBvaW50IGN1cnJlbnQgc3RhdHMgc29tZXdoZXJlICovCisJCWNwLT5zdGF0cyAgPSAmY3AtPnN0YXRzX3N0b3JlOworCQljcC0+c3RhdHNfc3RvcmUudGltZW91dF9zaG9ydGVzdCA9IExPTkdfTUFYOworCisJCS8qIGJhc2ljIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworCisJCWNwLT5sb2FkX3RpbWVvdXQgPSAxPDwxODsKKworCQkvKiByZWdpc3RlciBzeXN0ZW0gZGV2aWNlICovCisKKwkJY3AtPmRldi5jbHMgPSAmZG1hX3N5c2NsYXNzOworCQljcC0+ZGV2LmlkICA9IGNoYW5uZWw7CisJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmY3AtPmRldik7CisKKwkJcHJpbnRrKCJETUEgY2hhbm5lbCAlZCBhdCAlcCwgaXJxICVkXG4iLAorCQkgICAgICAgY3AtPm51bWJlciwgY3AtPnJlZ3MsIGNwLT5pcnEpOworCX0KKworCXJldHVybiAwOworCisgZXJyOgorCWttZW1fY2FjaGVfZGVzdHJveShkbWFfa21lbSk7CisJaW91bm1hcChkbWFfYmFzZSk7CisJZG1hX2Jhc2UgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKK19faW5pdGNhbGwoczNjMjQxMF9pbml0X2RtYSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYxNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYwpAQCAtMCwwICsxLDIxMyBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0MTAgR1BJTyBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIENoYW5nZWxvZworICoJMTMtU2VwLTIwMDQgIEJKRCAgSW1wbGVtZW50ZWQgY2hhbmdlIG9mIE1JU0NDUgorICoJMTQtU2VwLTIwMDQgIEJKRCAgQWRkZWQgZ2V0cGluIGNhbGwKKyAqCTE0LVNlcC0yMDA0ICBCSkQgIEZpeGVkIGJ1ZyBpbiBzZXRwaW4oKSBjYWxsCisgKgkzMC1TZXAtMjAwNCAgQkpEICBGaXhlZCBjZmdwaW4oKSBtYXNrIGJ1ZworICoJMDEtT2N0LTIwMDQgIEJKRCAgQWRkZWQgZ2V0Y2ZnKCkgdG8gZ2V0IHBpbiBjb25maWd1cmF0aW9uCisgKgkwMS1PY3QtMjAwNCAgQkpEICBGaXhlZCBtYXNrIGJ1ZyBpbiBwdWxsdXAoKSBjYWxsCisgKgkwMS1PY3QtMjAwNCAgQkpEICBBZGRlZCBnZXRpcnEoKSB0byB0dXJuIHBpbiBpbnRvIGlycW5vCisgKgkwNC1PY3QtMjAwNCAgQkpEICBBZGRlZCBpcnEgZmlsdGVyIGNvbnRyb2xzIGZvciBHUElPCisgKgkwNS1Ob3YtMjAwNCAgQkpEICBFWFBPUlRfU1lNQk9MKCkgYWRkZWQgZm9yIGFsbCBjb2RlCisgKgkxMy1NYXItMjAwNSAgQkpEICBVcGRhdGVzIGZvciBfX2lvbWVtCisgKi8KKworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisKK3ZvaWQgczNjMjQxMF9ncGlvX2NmZ3Bpbih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gUzNDMjQxMF9HUElPX0JBU0UocGluKTsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyBjb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChwaW4gPCBTM0MyNDEwX0dQSU9fQkFOS0IpIHsKKwkJbWFzayA9IDEgPDwgUzNDMjQxMF9HUElPX09GRlNFVChwaW4pOworCX0gZWxzZSB7CisJCW1hc2sgPSAzIDw8IFMzQzI0MTBfR1BJT19PRkZTRVQocGluKSoyOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWNvbiAgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7CisJY29uICY9IH5tYXNrOworCWNvbiB8PSBmdW5jdGlvbjsKKworCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyAweDAwKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fY2ZncGluKTsKKwordW5zaWduZWQgaW50IHMzYzI0MTBfZ3Bpb19nZXRjZmcodW5zaWduZWQgaW50IHBpbikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBTM0MyNDEwX0dQSU9fQkFTRShwaW4pOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCWlmIChwaW4gPCBTM0MyNDEwX0dQSU9fQkFOS0IpIHsKKwkJbWFzayA9IDEgPDwgUzNDMjQxMF9HUElPX09GRlNFVChwaW4pOworCX0gZWxzZSB7CisJCW1hc2sgPSAzIDw8IFMzQzI0MTBfR1BJT19PRkZTRVQocGluKSoyOworCX0KKworCXJldHVybiBfX3Jhd19yZWFkbChiYXNlKSAmIG1hc2s7Cit9CisKK0VYUE9SVF9TWU1CT0woczNjMjQxMF9ncGlvX2dldGNmZyk7CisKK3ZvaWQgczNjMjQxMF9ncGlvX3B1bGx1cCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdG8pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gUzNDMjQxMF9HUElPX0JBU0UocGluKTsKKwl1bnNpZ25lZCBsb25nIG9mZnMgPSBTM0MyNDEwX0dQSU9fT0ZGU0VUKHBpbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHVwOworCisJaWYgKHBpbiA8IFMzQzI0MTBfR1BJT19CQU5LQikKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJdXAgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwOCk7CisJdXAgJj0gfigxTCA8PCBvZmZzKTsKKwl1cCB8PSB0byA8PCBvZmZzOworCV9fcmF3X3dyaXRlbCh1cCwgYmFzZSArIDB4MDgpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19wdWxsdXApOworCit2b2lkIHMzYzI0MTBfZ3Bpb19zZXRwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IFMzQzI0MTBfR1BJT19CQVNFKHBpbik7CisJdW5zaWduZWQgbG9uZyBvZmZzID0gUzNDMjQxMF9HUElPX09GRlNFVChwaW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkYXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7CisJZGF0ICY9IH4oMSA8PCBvZmZzKTsKKwlkYXQgfD0gdG8gPDwgb2ZmczsKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woczNjMjQxMF9ncGlvX3NldHBpbik7CisKK3Vuc2lnbmVkIGludCBzM2MyNDEwX2dwaW9fZ2V0cGluKHVuc2lnbmVkIGludCBwaW4pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gUzNDMjQxMF9HUElPX0JBU0UocGluKTsKKwl1bnNpZ25lZCBsb25nIG9mZnMgPSBTM0MyNDEwX0dQSU9fT0ZGU0VUKHBpbik7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZSArIDB4MDQpICYgKDE8PCBvZmZzKTsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fZ2V0cGluKTsKKwordW5zaWduZWQgaW50IHMzYzI0MTBfbW9kaWZ5X21pc2Njcih1bnNpZ25lZCBpbnQgY2xlYXIsIHVuc2lnbmVkIGludCBjaGFuZ2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG1pc2NjcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwltaXNjY3IgPSBfX3Jhd19yZWFkbChTM0MyNDEwX01JU0NDUik7CisJbWlzY2NyICY9IH5jbGVhcjsKKwltaXNjY3IgXj0gY2hhbmdlOworCV9fcmF3X3dyaXRlbChtaXNjY3IsIFMzQzI0MTBfTUlTQ0NSKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gbWlzY2NyOworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfbW9kaWZ5X21pc2Njcik7CisKK2ludCBzM2MyNDEwX2dwaW9fZ2V0aXJxKHVuc2lnbmVkIGludCBwaW4pCit7CisJaWYgKHBpbiA8IFMzQzI0MTBfR1BGMCB8fCBwaW4gPiBTM0MyNDEwX0dQRzE1X0VJTlQyMykKKwkJcmV0dXJuIC0xOwkvKiBub3QgdmFsaWQgaW50ZXJydXB0cyAqLworCisJaWYgKHBpbiA8IFMzQzI0MTBfR1BHMCAmJiBwaW4gPiBTM0MyNDEwX0dQRjcpCisJCXJldHVybiAtMTsJLyogbm90IHZhbGlkIHBpbiAqLworCisJaWYgKHBpbiA8IFMzQzI0MTBfR1BGNCkKKwkJcmV0dXJuIChwaW4gLSBTM0MyNDEwX0dQRjApICsgSVJRX0VJTlQwOworCisJaWYgKHBpbiA8IFMzQzI0MTBfR1BHMCkKKwkJcmV0dXJuIChwaW4gLSBTM0MyNDEwX0dQRjQpICsgSVJRX0VJTlQ0OworCisJcmV0dXJuIChwaW4gLSBTM0MyNDEwX0dQRzApICsgSVJRX0VJTlQ4OworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19nZXRpcnEpOworCitpbnQgczNjMjQxMF9ncGlvX2lycWZpbHRlcih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgb24sCisJCQkgICB1bnNpZ25lZCBpbnQgY29uZmlnKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gUzNDMjQxMF9FSU5GTFQwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAocGluIDwgUzNDMjQxMF9HUEc4IHx8IHBpbiA+IFMzQzI0MTBfR1BHMTUpCisJCXJldHVybiAtMTsKKworCWNvbmZpZyAmPSAweGZmOworCisJcGluIC09IFMzQzI0MTBfR1BHOF9FSU5UMTY7CisJcmVnICs9IHBpbiAmIH4zOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogdXBkYXRlIGZpbHRlciB3aWR0aCBhbmQgY2xvY2sgc291cmNlICovCisKKwl2YWwgPSBfX3Jhd19yZWFkbChyZWcpOworCXZhbCAmPSB+KDB4ZmYgPDwgKChwaW4gJiAzKSAqIDgpKTsKKwl2YWwgfD0gY29uZmlnIDw8ICgocGluICYgMykgKiA4KTsKKwlfX3Jhd193cml0ZWwodmFsLCByZWcpOworCisJLyogdXBkYXRlIGZpbHRlciBlbmFibGUgKi8KKworCXZhbCA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfRVhUSU5UMik7CisJdmFsICY9IH4oMSA8PCAoKHBpbiAqIDQpICsgMykpOworCXZhbCB8PSBvbiA8PCAoKHBpbiAqIDQpICsgMyk7CisJX19yYXdfd3JpdGVsKHZhbCwgUzNDMjQxMF9FWFRJTlQyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19pcnFmaWx0ZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjhjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKQEAgLTAsMCArMSw5NjYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMywyMDA0IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKgorICogICAyMi1KdWwtMjAwNCAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICAgICAgICAgICAgRml4ZWQgY29tcGlsZSB3YXJuaW5ncworICoKKyAqICAgMjItSnVsLTIwMDQgIFJvYyBXdSA8Y29vbG9uZXlAeWFob28uY29tLmNuPgorICogICAgICAgICAgICAgICAgRml4ZWQgczNjX2V4dGlycV90eXBlCisgKgorICogICAyMS1KdWwtMjAwNCAgQXJuYXVkIFBhdGFyZCAoUnRwKSA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqICAgICAgICAgICAgICAgIEFkZGl0aW9uIG9mIEFEQy9UQyBkZW11eAorICoKKyAqICAgMDQtT2N0LTIwMDQgIEtsYXVzIEZldHNjaGVyIDxrLmZldHNjaGVyQGZldHJvbi5kZT4KKyAqCQkgIEZpeCBmb3Igc2V0X2lycV90eXBlKCkgb24gbG93IEVJTlQgbnVtYmVycworICoKKyAqICAgMDUtT2N0LTIwMDQgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCQkgIFRpZHkgdXAgS0YncyBwYXRjaCBhbmQgc29ydCBvdXQgbmV3IHJlbGVhc2UKKyAqCisgKiAgIDA1LU9jdC0yMDA0ICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgkJICBBZGQgc3VwcG9ydCBmb3IgcG93ZXIgbWFuYWdlbWVudCBjb250cm9scworICoKKyAqICAgMDQtTm92LTIwMDQgIEJlbiBEb29rcworICoJCSAgRml4IHN0YW5kYXJkIElSUSB3YWtlIGZvciBFSU5UMC4uNCBhbmQgUlRDCisgKgorICogICAyMi1GZWItMjAwNCAgQmVuIERvb2tzCisgKgkJICBGaXhlZCBlZGdlLXRyaWdnZXJpbmcgb24gQURDIElSUQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInBtLmgiCisKKyNkZWZpbmUgaXJxZGJmKHguLi4pCisjZGVmaW5lIGlycWRiZjIoeC4uLikKKworI2RlZmluZSBFWFRJTlRfT0ZGIChJUlFfRUlOVDQgLSA0KQorCisvKiB3YWtldXAgaXJxIGNvbnRyb2wgKi8KKworI2lmZGVmIENPTkZJR19QTQorCisvKiBzdGF0ZSBmb3IgSVJRcyBvdmVyIHNsZWVwICovCisKKy8qIGRlZmF1bHQgaXMgdG8gYWxsb3cgZm9yIEVJTlQwLi5FSU5UMTUsIGFuZCBJUlFfUlRDIGFzIHdha2V1cCBzb3VyY2VzCisgKgorICogc2V0IGJpdCB0byAxIGluIGFsbG93IGJpdGZpZWxkIHRvIGVuYWJsZSB0aGUgd2FrZXVwIHNldHRpbmdzIG9uIGl0CisqLworCit1bnNpZ25lZCBsb25nIHMzY19pcnF3YWtlX2ludGFsbG93CT0gMUwgPDwgKElSUV9SVEMgLSBJUlFfRUlOVDApIHwgMHhmTDsKK3Vuc2lnbmVkIGxvbmcgczNjX2lycXdha2VfaW50bWFzawk9IDB4ZmZmZmZmZmZMOwordW5zaWduZWQgbG9uZyBzM2NfaXJxd2FrZV9laW50YWxsb3cJPSAweDAwMDBmZmYwTDsKK3Vuc2lnbmVkIGxvbmcgczNjX2lycXdha2VfZWludG1hc2sJPSAweGZmZmZmZmZmTDsKKworc3RhdGljIGludAorczNjX2lycV93YWtlKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgaXJxYml0ID0gMSA8PCAoaXJxbm8gLSBJUlFfRUlOVDApOworCisJaWYgKCEoczNjX2lycXdha2VfaW50YWxsb3cgJiBpcnFiaXQpKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXByaW50ayhLRVJOX0lORk8gIndha2UgJXMgZm9yIGlycSAlZFxuIiwKKwkgICAgICAgc3RhdGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLCBpcnFubyk7CisKKwlpZiAoIXN0YXRlKQorCQlzM2NfaXJxd2FrZV9pbnRtYXNrIHw9IGlycWJpdDsKKwllbHNlCisJCXMzY19pcnF3YWtlX2ludG1hc2sgJj0gfmlycWJpdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzM2NfaXJxZXh0X3dha2UodW5zaWduZWQgaW50IGlycW5vLCB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBiaXQgPSAxTCA8PCAoaXJxbm8gLSBFWFRJTlRfT0ZGKTsKKworCWlmICghKHMzY19pcnF3YWtlX2VpbnRhbGxvdyAmIGJpdCkpCisJCXJldHVybiAtRU5PRU5UOworCisJcHJpbnRrKEtFUk5fSU5GTyAid2FrZSAlcyBmb3IgaXJxICVkXG4iLAorCSAgICAgICBzdGF0ZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIGlycW5vKTsKKworCWlmICghc3RhdGUpCisJCXMzY19pcnF3YWtlX2VpbnRtYXNrIHw9IGJpdDsKKwllbHNlCisJCXMzY19pcnF3YWtlX2VpbnRtYXNrICY9IH5iaXQ7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgczNjX2lycWV4dF93YWtlIE5VTEwKKyNkZWZpbmUgczNjX2lycV93YWtlIE5VTEwKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX21hc2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCWlycW5vIC09IElSUV9FSU5UMDsKKworCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVE1TSyk7CisJbWFzayB8PSAxVUwgPDwgaXJxbm87CisJX19yYXdfd3JpdGVsKG1hc2ssIFMzQzI0MTBfSU5UTVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzM2NfaXJxX2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJdW5zaWduZWQgbG9uZyBiaXR2YWwgPSAxVUwgPDwgKGlycW5vIC0gSVJRX0VJTlQwKTsKKworCV9fcmF3X3dyaXRlbChiaXR2YWwsIFMzQzI0MTBfU1JDUE5EKTsKKwlfX3Jhd193cml0ZWwoYml0dmFsLCBTM0MyNDEwX0lOVFBORCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorczNjX2lycV9tYXNrYWNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwl1bnNpZ25lZCBsb25nIGJpdHZhbCA9IDFVTCA8PCAoaXJxbm8gLSBJUlFfRUlOVDApOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVE1TSyk7CisJX19yYXdfd3JpdGVsKG1hc2t8Yml0dmFsLCBTM0MyNDEwX0lOVE1TSyk7CisKKwlfX3Jhd193cml0ZWwoYml0dmFsLCBTM0MyNDEwX1NSQ1BORCk7CisJX19yYXdfd3JpdGVsKGJpdHZhbCwgUzNDMjQxMF9JTlRQTkQpOworfQorCisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJaWYgKGlycW5vICE9IElSUV9USU1FUjQgJiYgaXJxbm8gIT0gSVJRX0VJTlQ4dDIzKQorCQlpcnFkYmYyKCJzM2NfaXJxX3VubWFzayAlZFxuIiwgaXJxbm8pOworCisJaXJxbm8gLT0gSVJRX0VJTlQwOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKKwltYXNrICY9IH4oMVVMIDw8IGlycW5vKTsKKwlfX3Jhd193cml0ZWwobWFzaywgUzNDMjQxMF9JTlRNU0spOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgczNjX2lycV9sZXZlbF9jaGlwID0geworCS5hY2sJICAgPSBzM2NfaXJxX21hc2thY2ssCisJLm1hc2sJICAgPSBzM2NfaXJxX21hc2ssCisJLnVubWFzawkgICA9IHMzY19pcnFfdW5tYXNrLAorCS53YWtlCSAgID0gczNjX2lycV93YWtlCit9OworCitzdGF0aWMgc3RydWN0IGlycWNoaXAgczNjX2lycV9jaGlwID0geworCS5hY2sJICAgPSBzM2NfaXJxX2FjaywKKwkubWFzawkgICA9IHMzY19pcnFfbWFzaywKKwkudW5tYXNrCSAgID0gczNjX2lycV91bm1hc2ssCisJLndha2UJICAgPSBzM2NfaXJxX3dha2UKK307CisKKy8qIFMzQzI0MTBfRUlOVE1BU0sKKyAqIFMzQzI0MTBfRUlOVFBFTkQKKyAqLworCitzdGF0aWMgdm9pZAorczNjX2lycWV4dF9tYXNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwlpcnFubyAtPSBFWFRJTlRfT0ZGOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfRUlOVE1BU0spOworCW1hc2sgfD0gKCAxVUwgPDwgaXJxbm8pOworCV9fcmF3X3dyaXRlbChtYXNrLCBTM0MyNDEwX0VJTlRNQVNLKTsKKworCWlmIChpcnFubyA8PSAoSVJRX0VJTlQ3IC0gRVhUSU5UX09GRikpIHsKKwkJLyogY2hlY2sgdG8gc2VlIGlmIGFsbCBuZWVkIG1hc2tpbmcgKi8KKworCQlpZiAoKG1hc2sgJiAoMHhmIDw8IDQpKSA9PSAoMHhmIDw8IDQpKSB7CisJCQkvKiBhbGwgbWFza2VkLCBtYXNrIHRoZSBwYXJlbnQgKi8KKwkJCXMzY19pcnFfbWFzayhJUlFfRUlOVDR0Nyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiB0b2RvOiB0aGUgc2FtZSBjaGVjayBhcyBhYm92ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIGlycSByZWdzLi4uKi8KKworCX0KK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFleHRfYWNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwl1bnNpZ25lZCBsb25nIHJlcTsKKwl1bnNpZ25lZCBsb25nIGJpdDsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwliaXQgPSAxVUwgPDwgKGlycW5vIC0gRVhUSU5UX09GRik7CisKKworCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0VJTlRNQVNLKTsKKworCV9fcmF3X3dyaXRlbChiaXQsIFMzQzI0MTBfRUlOVFBFTkQpOworCisJcmVxID0gX19yYXdfcmVhZGwoUzNDMjQxMF9FSU5UUEVORCk7CisJcmVxICY9IH5tYXNrOworCisJLyogbm90IHN1cmUgaWYgd2Ugc2hvdWxkIGJlIGFja2luZyB0aGUgcGFyZW50IGlycS4uLiAqLworCisJaWYgKGlycW5vIDw9IElSUV9FSU5UNyApIHsKKwkJaWYgKChyZXEgJiAweGYwKSA9PSAwKQorCQkJczNjX2lycV9hY2soSVJRX0VJTlQ0dDcpOworCX0gZWxzZSB7CisJCWlmICgocmVxID4+IDgpID09IDApCisJCQlzM2NfaXJxX2FjayhJUlFfRUlOVDh0MjMpOworCX0KK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFleHRfdW5tYXNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwlpcnFubyAtPSBFWFRJTlRfT0ZGOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfRUlOVE1BU0spOworCW1hc2sgJj0gfiggMVVMIDw8IGlycW5vKTsKKwlfX3Jhd193cml0ZWwobWFzaywgUzNDMjQxMF9FSU5UTUFTSyk7CisKKwlzM2NfaXJxX3VubWFzaygoaXJxbm8gPD0gKElSUV9FSU5UNyAtIEVYVElOVF9PRkYpKSA/IElSUV9FSU5UNHQ3IDogSVJRX0VJTlQ4dDIzKTsKK30KKworc3RhdGljIGludAorczNjX2lycWV4dF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXZvaWQgX19pb21lbSAqZXh0aW50X3JlZzsKKwl2b2lkIF9faW9tZW0gKmdwY29uX3JlZzsKKwl1bnNpZ25lZCBsb25nIGdwY29uX29mZnNldCwgZXh0aW50X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG5ld3ZhbHVlID0gMCwgdmFsdWU7CisKKwlpZiAoKGlycSA+PSBJUlFfRUlOVDApICYmIChpcnEgPD0gSVJRX0VJTlQzKSkKKwl7CisJCWdwY29uX3JlZyA9IFMzQzI0MTBfR1BGQ09OOworCQlleHRpbnRfcmVnID0gUzNDMjQxMF9FWFRJTlQwOworCQlncGNvbl9vZmZzZXQgPSAoaXJxIC0gSVJRX0VJTlQwKSAqIDI7CisJCWV4dGludF9vZmZzZXQgPSAoaXJxIC0gSVJRX0VJTlQwKSAqIDQ7CisJfQorCWVsc2UgaWYgKChpcnEgPj0gSVJRX0VJTlQ0KSAmJiAoaXJxIDw9IElSUV9FSU5UNykpCisJeworCQlncGNvbl9yZWcgPSBTM0MyNDEwX0dQRkNPTjsKKwkJZXh0aW50X3JlZyA9IFMzQzI0MTBfRVhUSU5UMDsKKwkJZ3Bjb25fb2Zmc2V0ID0gKGlycSAtIChFWFRJTlRfT0ZGKSkgKiAyOworCQlleHRpbnRfb2Zmc2V0ID0gKGlycSAtIChFWFRJTlRfT0ZGKSkgKiA0OworCX0KKwllbHNlIGlmICgoaXJxID49IElSUV9FSU5UOCkgJiYgKGlycSA8PSBJUlFfRUlOVDE1KSkKKwl7CisJCWdwY29uX3JlZyA9IFMzQzI0MTBfR1BHQ09OOworCQlleHRpbnRfcmVnID0gUzNDMjQxMF9FWFRJTlQxOworCQlncGNvbl9vZmZzZXQgPSAoaXJxIC0gSVJRX0VJTlQ4KSAqIDI7CisJCWV4dGludF9vZmZzZXQgPSAoaXJxIC0gSVJRX0VJTlQ4KSAqIDQ7CisJfQorCWVsc2UgaWYgKChpcnEgPj0gSVJRX0VJTlQxNikgJiYgKGlycSA8PSBJUlFfRUlOVDIzKSkKKwl7CisJCWdwY29uX3JlZyA9IFMzQzI0MTBfR1BHQ09OOworCQlleHRpbnRfcmVnID0gUzNDMjQxMF9FWFRJTlQyOworCQlncGNvbl9vZmZzZXQgPSAoaXJxIC0gSVJRX0VJTlQ4KSAqIDI7CisJCWV4dGludF9vZmZzZXQgPSAoaXJxIC0gSVJRX0VJTlQxNikgKiA0OworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisKKwkvKiBTZXQgdGhlIEdQSU8gdG8gZXh0ZXJuYWwgaW50ZXJydXB0IG1vZGUgKi8KKwl2YWx1ZSA9IF9fcmF3X3JlYWRsKGdwY29uX3JlZyk7CisJdmFsdWUgPSAodmFsdWUgJiB+KDMgPDwgZ3Bjb25fb2Zmc2V0KSkgfCAoMHgwMiA8PCBncGNvbl9vZmZzZXQpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgZ3Bjb25fcmVnKTsKKworCS8qIFNldCB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IHRvIHBvaW50ZWQgdHJpZ2dlciB0eXBlICovCisJc3dpdGNoICh0eXBlKQorCXsKKwkJY2FzZSBJUlFUX05PRURHRToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIGVkZ2Ugc2V0dGluZyFcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUlFUX1JJU0lORzoKKwkJCW5ld3ZhbHVlID0gUzNDMjQxMF9FWFRJTlRfUklTRUVER0U7CisJCQlicmVhazsKKworCQljYXNlIElSUVRfRkFMTElORzoKKwkJCW5ld3ZhbHVlID0gUzNDMjQxMF9FWFRJTlRfRkFMTEVER0U7CisJCQlicmVhazsKKworCQljYXNlIElSUVRfQk9USEVER0U6CisJCQluZXd2YWx1ZSA9IFMzQzI0MTBfRVhUSU5UX0JPVEhFREdFOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUlFUX0xPVzoKKwkJCW5ld3ZhbHVlID0gUzNDMjQxMF9FWFRJTlRfTE9XTEVWOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUlFUX0hJR0g6CisJCQluZXd2YWx1ZSA9IFMzQzI0MTBfRVhUSU5UX0hJTEVWOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiTm8gc3VjaCBpcnEgdHlwZSAlZCIsIHR5cGUpOworCQkJcmV0dXJuIC0xOworCX0KKworCXZhbHVlID0gX19yYXdfcmVhZGwoZXh0aW50X3JlZyk7CisJdmFsdWUgPSAodmFsdWUgJiB+KDcgPDwgZXh0aW50X29mZnNldCkpIHwgKG5ld3ZhbHVlIDw8IGV4dGludF9vZmZzZXQpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgZXh0aW50X3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFleHRfY2hpcCA9IHsKKwkubWFzawkgICAgPSBzM2NfaXJxZXh0X21hc2ssCisJLnVubWFzawkgICAgPSBzM2NfaXJxZXh0X3VubWFzaywKKwkuYWNrCSAgICA9IHMzY19pcnFleHRfYWNrLAorCS50eXBlCSAgICA9IHMzY19pcnFleHRfdHlwZSwKKwkud2FrZQkgICAgPSBzM2NfaXJxZXh0X3dha2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX2VpbnQwdDQgPSB7CisJLmFjawkgICA9IHMzY19pcnFfYWNrLAorCS5tYXNrCSAgID0gczNjX2lycV9tYXNrLAorCS51bm1hc2sJICAgPSBzM2NfaXJxX3VubWFzaywKKwkud2FrZQkgICA9IHMzY19pcnFfd2FrZSwKKwkudHlwZQkgICA9IHMzY19pcnFleHRfdHlwZSwKK307CisKKy8qIG1hc2sgdmFsdWVzIGZvciB0aGUgcGFyZW50IHJlZ2lzdGVycyBmb3IgZWFjaCBvZiB0aGUgaW50ZXJydXB0IHR5cGVzICovCisKKyNkZWZpbmUgSU5UTVNLX1VBUlQwCSAoMVVMIDw8IChJUlFfVUFSVDAgLSBJUlFfRUlOVDApKQorI2RlZmluZSBJTlRNU0tfVUFSVDEJICgxVUwgPDwgKElSUV9VQVJUMSAtIElSUV9FSU5UMCkpCisjZGVmaW5lIElOVE1TS19VQVJUMgkgKDFVTCA8PCAoSVJRX1VBUlQyIC0gSVJRX0VJTlQwKSkKKyNkZWZpbmUgSU5UTVNLX0FEQ1BBUkVOVCAoMVVMIDw8IChJUlFfQURDUEFSRU5UIC0gSVJRX0VJTlQwKSkKKyNkZWZpbmUgSU5UTVNLX0xDRAkgKDFVTCA8PCAoSVJRX0xDRCAtIElSUV9FSU5UMCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorczNjX2lycXN1Yl9tYXNrKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHBhcmVudGJpdCwKKwkJaW50IHN1YmNoZWNrKQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nIHN1Ym1hc2s7CisKKwlzdWJtYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRTVUJNU0spOworCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVE1TSyk7CisKKwlzdWJtYXNrIHw9ICgxVUwgPDwgKGlycW5vIC0gSVJRX1MzQ1VBUlRfUlgwKSk7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYXNrIHRoZSBwYXJlbnQgSVJRICovCisKKwlpZiAoKHN1Ym1hc2sgICYgc3ViY2hlY2spID09IHN1YmNoZWNrKSB7CisJCV9fcmF3X3dyaXRlbChtYXNrIHwgcGFyZW50Yml0LCBTM0MyNDEwX0lOVE1TSyk7CisJfQorCisJLyogd3JpdGUgYmFjayBtYXNrcyAqLworCV9fcmF3X3dyaXRlbChzdWJtYXNrLCBTM0MyNDEwX0lOVFNVQk1TSyk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzM2NfaXJxc3ViX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8sIHVuc2lnbmVkIGludCBwYXJlbnRiaXQpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCXVuc2lnbmVkIGxvbmcgc3VibWFzazsKKworCXN1Ym1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVFNVQk1TSyk7CisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKKworCXN1Ym1hc2sgJj0gfigxVUwgPDwgKGlycW5vIC0gSVJRX1MzQ1VBUlRfUlgwKSk7CisJbWFzayAmPSB+cGFyZW50Yml0OworCisJLyogd3JpdGUgYmFjayBtYXNrcyAqLworCV9fcmF3X3dyaXRlbChzdWJtYXNrLCBTM0MyNDEwX0lOVFNVQk1TSyk7CisJX19yYXdfd3JpdGVsKG1hc2ssIFMzQzI0MTBfSU5UTVNLKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK3MzY19pcnFzdWJfbWFza2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8sIHVuc2lnbmVkIGludCBwYXJlbnRtYXNrLCB1bnNpZ25lZCBpbnQgZ3JvdXApCit7CisJdW5zaWduZWQgaW50IGJpdCA9IDFVTCA8PCAoaXJxbm8gLSBJUlFfUzNDVUFSVF9SWDApOworCisJczNjX2lycXN1Yl9tYXNrKGlycW5vLCBwYXJlbnRtYXNrLCBncm91cCk7CisKKwlfX3Jhd193cml0ZWwoYml0LCBTM0MyNDEwX1NVQlNSQ1BORCk7CisKKwkvKiBvbmx5IGFjayBwYXJlbnQgaWYgd2UndmUgZ290IGFsbCB0aGUgaXJxcyAoc2VlbXMgd2UgbXVzdAorCSAqIGFjaywgYWxsIGFuZCBob3BlIHRoYXQgdGhlIGlycSBzeXN0ZW0gcmV0cmlnZ2VycyBvayB3aGVuCisJICogdGhlIGludGVycnVwdCBnb2VzIG9mZiBhZ2FpbikKKwkgKi8KKworCWlmICgxKSB7CisJCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX1NSQ1BORCk7CisJCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX0lOVFBORCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3MzY19pcnFzdWJfYWNrKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHBhcmVudG1hc2ssIHVuc2lnbmVkIGludCBncm91cCkKK3sKKwl1bnNpZ25lZCBpbnQgYml0ID0gMVVMIDw8IChpcnFubyAtIElSUV9TM0NVQVJUX1JYMCk7CisKKwlfX3Jhd193cml0ZWwoYml0LCBTM0MyNDEwX1NVQlNSQ1BORCk7CisKKwkvKiBvbmx5IGFjayBwYXJlbnQgaWYgd2UndmUgZ290IGFsbCB0aGUgaXJxcyAoc2VlbXMgd2UgbXVzdAorCSAqIGFjaywgYWxsIGFuZCBob3BlIHRoYXQgdGhlIGlycSBzeXN0ZW0gcmV0cmlnZ2VycyBvayB3aGVuCisJICogdGhlIGludGVycnVwdCBnb2VzIG9mZiBhZ2FpbikKKwkgKi8KKworCWlmICgxKSB7CisJCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX1NSQ1BORCk7CisJCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX0lOVFBORCk7CisJfQorfQorCisvKiBVQVJUMCAqLworCitzdGF0aWMgdm9pZAorczNjX2lycV91YXJ0MF9tYXNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwlzM2NfaXJxc3ViX21hc2soaXJxbm8sIElOVE1TS19VQVJUMCwgNyk7Cit9CisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX3VhcnQwX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl91bm1hc2soaXJxbm8sIElOVE1TS19VQVJUMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX3VhcnQwX2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl9tYXNrYWNrKGlycW5vLCBJTlRNU0tfVUFSVDAsIDcpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgczNjX2lycV91YXJ0MCA9IHsKKwkubWFzawkgICAgPSBzM2NfaXJxX3VhcnQwX21hc2ssCisJLnVubWFzawkgICAgPSBzM2NfaXJxX3VhcnQwX3VubWFzaywKKwkuYWNrCSAgICA9IHMzY19pcnFfdWFydDBfYWNrLAorfTsKKworLyogVUFSVDEgKi8KKworc3RhdGljIHZvaWQKK3MzY19pcnFfdWFydDFfbWFzayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl9tYXNrKGlycW5vLCBJTlRNU0tfVUFSVDEsIDcgPDwgMyk7Cit9CisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX3VhcnQxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl91bm1hc2soaXJxbm8sIElOVE1TS19VQVJUMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX3VhcnQxX2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl9tYXNrYWNrKGlycW5vLCBJTlRNU0tfVUFSVDEsIDcgPDwgMyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX3VhcnQxID0geworCS5tYXNrCSAgICA9IHMzY19pcnFfdWFydDFfbWFzaywKKwkudW5tYXNrCSAgICA9IHMzY19pcnFfdWFydDFfdW5tYXNrLAorCS5hY2sJICAgID0gczNjX2lycV91YXJ0MV9hY2ssCit9OworCisvKiBVQVJUMiAqLworCitzdGF0aWMgdm9pZAorczNjX2lycV91YXJ0Ml9tYXNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwlzM2NfaXJxc3ViX21hc2soaXJxbm8sIElOVE1TS19VQVJUMiwgNyA8PCA2KTsKK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFfdWFydDJfdW5tYXNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwlzM2NfaXJxc3ViX3VubWFzayhpcnFubywgSU5UTVNLX1VBUlQyKTsKK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFfdWFydDJfYWNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwlzM2NfaXJxc3ViX21hc2thY2soaXJxbm8sIElOVE1TS19VQVJUMiwgNyA8PCA2KTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFfdWFydDIgPSB7CisJLm1hc2sJICAgID0gczNjX2lycV91YXJ0Ml9tYXNrLAorCS51bm1hc2sJICAgID0gczNjX2lycV91YXJ0Ml91bm1hc2ssCisJLmFjawkgICAgPSBzM2NfaXJxX3VhcnQyX2FjaywKK307CisKKy8qIEFEQyBhbmQgVG91Y2hzY3JlZW4gKi8KKworc3RhdGljIHZvaWQKK3MzY19pcnFfYWRjX21hc2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXMzY19pcnFzdWJfbWFzayhpcnFubywgSU5UTVNLX0FEQ1BBUkVOVCwgMyA8PCA5KTsKK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFfYWRjX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl91bm1hc2soaXJxbm8sIElOVE1TS19BRENQQVJFTlQpOworfQorCitzdGF0aWMgdm9pZAorczNjX2lycV9hZGNfYWNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwlzM2NfaXJxc3ViX2FjayhpcnFubywgSU5UTVNLX0FEQ1BBUkVOVCwgMyA8PCA5KTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFfYWRjID0geworCS5tYXNrCSAgICA9IHMzY19pcnFfYWRjX21hc2ssCisJLnVubWFzawkgICAgPSBzM2NfaXJxX2FkY191bm1hc2ssCisJLmFjawkgICAgPSBzM2NfaXJxX2FkY19hY2ssCit9OworCisvKiBpcnEgZGVtdXggZm9yIGFkYyAqLworc3RhdGljIHZvaWQgczNjX2lycV9kZW11eF9hZGModW5zaWduZWQgaW50IGlycSwKKwkJCSAgICAgIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IHN1YnNyYywgc3VibXNrOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSA5OworCXN0cnVjdCBpcnFkZXNjICpteWRlc2M7CisKKwkvKiByZWFkIHRoZSBjdXJyZW50IHBlbmRpbmcgaW50ZXJydXB0cywgYW5kIHRoZSBtYXNrCisJICogZm9yIHdoYXQgaXQgaXMgYXZhaWxhYmxlICovCisKKwlzdWJzcmMgPSBfX3Jhd19yZWFkbChTM0MyNDEwX1NVQlNSQ1BORCk7CisJc3VibXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRTVUJNU0spOworCisJc3Vic3JjICY9IH5zdWJtc2s7CisJc3Vic3JjID4+PSBvZmZzZXQ7CisJc3Vic3JjICY9IDM7CisKKwlpZiAoc3Vic3JjICE9IDApIHsKKwkJaWYgKHN1YnNyYyAmIDEpIHsKKwkJCW15ZGVzYyA9IGlycV9kZXNjICsgSVJRX1RDOworCQkJbXlkZXNjLT5oYW5kbGUoIElSUV9UQywgbXlkZXNjLCByZWdzKTsKKwkJfQorCQlpZiAoc3Vic3JjICYgMikgeworCQkJbXlkZXNjID0gaXJxX2Rlc2MgKyBJUlFfQURDOworCQkJbXlkZXNjLT5oYW5kbGUoSVJRX0FEQywgbXlkZXNjLCByZWdzKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgczNjX2lycV9kZW11eF91YXJ0KHVuc2lnbmVkIGludCBzdGFydCwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgc3Vic3JjLCBzdWJtc2s7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHN0YXJ0IC0gSVJRX1MzQ1VBUlRfUlgwOworCXN0cnVjdCBpcnFkZXNjICpkZXNjOworCisJLyogcmVhZCB0aGUgY3VycmVudCBwZW5kaW5nIGludGVycnVwdHMsIGFuZCB0aGUgbWFzaworCSAqIGZvciB3aGF0IGl0IGlzIGF2YWlsYWJsZSAqLworCisJc3Vic3JjID0gX19yYXdfcmVhZGwoUzNDMjQxMF9TVUJTUkNQTkQpOworCXN1Ym1zayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UU1VCTVNLKTsKKworCWlycWRiZjIoInMzY19pcnFfZGVtdXhfdWFydDogc3RhcnQ9JWQgKCVkKSwgc3Vic3JjPTB4JTA4eCwweCUwOHhcbiIsCisJCXN0YXJ0LCBvZmZzZXQsIHN1YnNyYywgc3VibXNrKTsKKworCXN1YnNyYyAmPSB+c3VibXNrOworCXN1YnNyYyA+Pj0gb2Zmc2V0OworCXN1YnNyYyAmPSA3OworCisJaWYgKHN1YnNyYyAhPSAwKSB7CisJCWRlc2MgPSBpcnFfZGVzYyArIHN0YXJ0OworCisJCWlmIChzdWJzcmMgJiAxKQorCQkJZGVzYy0+aGFuZGxlKHN0YXJ0LCBkZXNjLCByZWdzKTsKKworCQlkZXNjKys7CisKKwkJaWYgKHN1YnNyYyAmIDIpCisJCQlkZXNjLT5oYW5kbGUoc3RhcnQrMSwgZGVzYywgcmVncyk7CisKKwkJZGVzYysrOworCisJCWlmIChzdWJzcmMgJiA0KQorCQkJZGVzYy0+aGFuZGxlKHN0YXJ0KzIsIGRlc2MsIHJlZ3MpOworCX0KK30KKworLyogdWFydCBkZW11eCBlbnRyeSBwb2ludHMgKi8KKworc3RhdGljIHZvaWQKK3MzY19pcnFfZGVtdXhfdWFydDAodW5zaWduZWQgaW50IGlycSwKKwkJICAgIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaXJxID0gaXJxOworCXMzY19pcnFfZGVtdXhfdWFydChJUlFfUzNDVUFSVF9SWDAsIHJlZ3MpOworfQorCitzdGF0aWMgdm9pZAorczNjX2lycV9kZW11eF91YXJ0MSh1bnNpZ25lZCBpbnQgaXJxLAorCQkgICAgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpcnEgPSBpcnE7CisJczNjX2lycV9kZW11eF91YXJ0KElSUV9TM0NVQVJUX1JYMSwgcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX2RlbXV4X3VhcnQyKHVuc2lnbmVkIGludCBpcnEsCisJCSAgICBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlycSA9IGlycTsKKwlzM2NfaXJxX2RlbXV4X3VhcnQoSVJRX1MzQ1VBUlRfUlgyLCByZWdzKTsKK30KKworCisvKiBzM2MyNHh4X2luaXRfaXJxCisgKgorICogSW5pdGlhbGlzZSBTM0MyNDEwIElSUSBzeXN0ZW0KKyovCisKK3ZvaWQgX19pbml0IHMzYzI0eHhfaW5pdF9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBlbmQ7CisJdW5zaWduZWQgbG9uZyBsYXN0OworCWludCBpcnFubzsKKwlpbnQgaTsKKworCWlycWRiZigiczNjMjQxMF9pbml0X2lycTogY2xlYXJpbmcgaW50ZXJydXB0IHN0YXR1cyBmbGFnc1xuIik7CisKKwkvKiBmaXJzdCwgY2xlYXIgYWxsIGludGVycnVwdHMgcGVuZGluZy4uLiAqLworCisJbGFzdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwZW5kID0gX19yYXdfcmVhZGwoUzNDMjQxMF9FSU5UUEVORCk7CisKKwkJaWYgKHBlbmQgPT0gMCB8fCBwZW5kID09IGxhc3QpCisJCQlicmVhazsKKworCQlfX3Jhd193cml0ZWwocGVuZCwgUzNDMjQxMF9FSU5UUEVORCk7CisJCXByaW50aygiaXJxOiBjbGVhcmluZyBwZW5kaW5nIGV4dCBzdGF0dXMgJTA4eFxuIiwgKGludClwZW5kKTsKKwkJbGFzdCA9IHBlbmQ7CisJfQorCisJbGFzdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwZW5kID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRQTkQpOworCisJCWlmIChwZW5kID09IDAgfHwgcGVuZCA9PSBsYXN0KQorCQkJYnJlYWs7CisKKwkJX19yYXdfd3JpdGVsKHBlbmQsIFMzQzI0MTBfU1JDUE5EKTsKKwkJX19yYXdfd3JpdGVsKHBlbmQsIFMzQzI0MTBfSU5UUE5EKTsKKwkJcHJpbnRrKCJpcnE6IGNsZWFyaW5nIHBlbmRpbmcgc3RhdHVzICUwOHhcbiIsIChpbnQpcGVuZCk7CisJCWxhc3QgPSBwZW5kOworCX0KKworCWxhc3QgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcGVuZCA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfU1VCU1JDUE5EKTsKKworCQlpZiAocGVuZCA9PSAwIHx8IHBlbmQgPT0gbGFzdCkKKwkJCWJyZWFrOworCisJCXByaW50aygiaXJxOiBjbGVhcmluZyBzdWJwZW5kaW5nIHN0YXR1cyAlMDh4XG4iLCAoaW50KXBlbmQpOworCQlfX3Jhd193cml0ZWwocGVuZCwgUzNDMjQxMF9TVUJTUkNQTkQpOworCQlsYXN0ID0gcGVuZDsKKwl9CisKKwkvKiByZWdpc3RlciB0aGUgbWFpbiBpbnRlcnJ1cHRzICovCisKKwlpcnFkYmYoInMzYzI0MTBfaW5pdF9pcnE6IHJlZ2lzdGVyaW5nIHMzYzI0MTAgaW50ZXJydXB0IGhhbmRsZXJzXG4iKTsKKworCWZvciAoaXJxbm8gPSBJUlFfQkFUVF9GTFQ7IGlycW5vIDw9IElSUV9BRENQQVJFTlQ7IGlycW5vKyspIHsKKwkJLyogc2V0IGFsbCB0aGUgczNjMjQxMCBpbnRlcm5hbCBpcnFzICovCisKKwkJc3dpdGNoIChpcnFubykgeworCQkJLyogZGVhbCB3aXRoIHRoZSBzcGVjaWFsIElSUXMgKGNhc2NhZGVkKSAqLworCisJCWNhc2UgSVJRX1VBUlQwOgorCQljYXNlIElSUV9VQVJUMToKKwkJY2FzZSBJUlFfVUFSVDI6CisJCWNhc2UgSVJRX0xDRDoKKwkJY2FzZSBJUlFfQURDUEFSRU5UOgorCQkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV9sZXZlbF9jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVJRX1JFU0VSVkVENjoKKwkJY2FzZSBJUlFfUkVTRVJWRUQyNDoKKwkJCS8qIG5vIElSUSBoZXJlICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLy9pcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIGlycSlcbiIsIGlycW5vKTsKKwkJCXNldF9pcnFfY2hpcChpcnFubywgJnMzY19pcnFfY2hpcCk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGRvX2VkZ2VfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxbm8sIElSUUZfVkFMSUQpOworCQl9CisJfQorCisJLyogc2V0dXAgdGhlIGNhc2NhZGUgaXJxIGhhbmRsZXJzICovCisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfVUFSVDAsIHMzY19pcnFfZGVtdXhfdWFydDApOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9VQVJUMSwgczNjX2lycV9kZW11eF91YXJ0MSk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX1VBUlQyLCBzM2NfaXJxX2RlbXV4X3VhcnQyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfQURDUEFSRU5ULCBzM2NfaXJxX2RlbXV4X2FkYyk7CisKKworCS8qIGV4dGVybmFsIGludGVycnVwdHMgKi8KKworCWZvciAoaXJxbm8gPSBJUlFfRUlOVDA7IGlycW5vIDw9IElSUV9FSU5UMzsgaXJxbm8rKykgeworCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoZXh0IGludClcbiIsIGlycW5vKTsKKwkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV9laW50MHQ0KTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxbm8sIElSUUZfVkFMSUQpOworCX0KKworCWZvciAoaXJxbm8gPSBJUlFfRUlOVDQ7IGlycW5vIDw9IElSUV9FSU5UMjM7IGlycW5vKyspIHsKKwkJaXJxZGJmKCJyZWdpc3RlcmluZyBpcnEgJWQgKGV4dGVuZGVkIHMzYyBpcnEpXG4iLCBpcnFubyk7CisJCXNldF9pcnFfY2hpcChpcnFubywgJnMzY19pcnFleHRfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKKwl9CisKKwkvKiByZWdpc3RlciB0aGUgdWFydCBpbnRlcnJ1cHRzICovCisKKwlpcnFkYmYoInMzYzI0MTA6IHJlZ2lzdGVyaW5nIGV4dGVybmFsIGludGVycnVwdHNcbiIpOworCisJZm9yIChpcnFubyA9IElSUV9TM0NVQVJUX1JYMDsgaXJxbm8gPD0gSVJRX1MzQ1VBUlRfRVJSMDsgaXJxbm8rKykgeworCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIHVhcnQwIGlycSlcbiIsIGlycW5vKTsKKwkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV91YXJ0MCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CisJfQorCisJZm9yIChpcnFubyA9IElSUV9TM0NVQVJUX1JYMTsgaXJxbm8gPD0gSVJRX1MzQ1VBUlRfRVJSMTsgaXJxbm8rKykgeworCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIHVhcnQxIGlycSlcbiIsIGlycW5vKTsKKwkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV91YXJ0MSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CisJfQorCisJZm9yIChpcnFubyA9IElSUV9TM0NVQVJUX1JYMjsgaXJxbm8gPD0gSVJRX1MzQ1VBUlRfRVJSMjsgaXJxbm8rKykgeworCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIHVhcnQyIGlycSlcbiIsIGlycW5vKTsKKwkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV91YXJ0Mik7CisJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CisJfQorCisJZm9yIChpcnFubyA9IElSUV9UQzsgaXJxbm8gPD0gSVJRX0FEQzsgaXJxbm8rKykgeworCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIGFkYyBpcnEpXG4iLCBpcnFubyk7CisJCXNldF9pcnFfY2hpcChpcnFubywgJnMzY19pcnFfYWRjKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxbm8sIElSUUZfVkFMSUQpOworCX0KKworCWlycWRiZigiczNjMjQxMDogcmVnaXN0ZXJlZCBpbnRlcnJ1cHQgaGFuZGxlcnNcbiIpOworfQorCisvKiBzM2MyNDQwIGlycSBjb2RlCisqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCisKKy8qIFdEVC9BQzk3ICovCisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfd2R0YWM5Nyh1bnNpZ25lZCBpbnQgaXJxLAorCQkJCSAgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgc3Vic3JjLCBzdWJtc2s7CisJc3RydWN0IGlycWRlc2MgKm15ZGVzYzsKKworCS8qIHJlYWQgdGhlIGN1cnJlbnQgcGVuZGluZyBpbnRlcnJ1cHRzLCBhbmQgdGhlIG1hc2sKKwkgKiBmb3Igd2hhdCBpdCBpcyBhdmFpbGFibGUgKi8KKworCXN1YnNyYyA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfU1VCU1JDUE5EKTsKKwlzdWJtc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVFNVQk1TSyk7CisKKwlzdWJzcmMgJj0gfnN1Ym1zazsKKwlzdWJzcmMgPj49IDEzOworCXN1YnNyYyAmPSAzOworCisJaWYgKHN1YnNyYyAhPSAwKSB7CisJCWlmIChzdWJzcmMgJiAxKSB7CisJCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9TM0MyNDQwX1dEVDsKKwkJCW15ZGVzYy0+aGFuZGxlKCBJUlFfUzNDMjQ0MF9XRFQsIG15ZGVzYywgcmVncyk7CisJCX0KKwkJaWYgKHN1YnNyYyAmIDIpIHsKKwkJCW15ZGVzYyA9IGlycV9kZXNjICsgSVJRX1MzQzI0NDBfQUM5NzsKKwkJCW15ZGVzYy0+aGFuZGxlKElSUV9TM0MyNDQwX0FDOTcsIG15ZGVzYywgcmVncyk7CisJCX0KKwl9Cit9CisKKworI2RlZmluZSBJTlRNU0tfV0RUCSAoMVVMIDw8IChJUlFfV0RUIC0gSVJRX0VJTlQwKSkKKworc3RhdGljIHZvaWQKK3MzY19pcnFfd2R0YWM5N19tYXNrKHVuc2lnbmVkIGludCBpcnFubykKK3sKKwlzM2NfaXJxc3ViX21hc2soaXJxbm8sIElOVE1TS19XRFQsIDM8PDEzKTsKK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFfd2R0YWM5N191bm1hc2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXMzY19pcnFzdWJfdW5tYXNrKGlycW5vLCBJTlRNU0tfV0RUKTsKK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFfd2R0YWM5N19hY2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXMzY19pcnFzdWJfbWFza2FjayhpcnFubywgSU5UTVNLX1dEVCwgMzw8MTMpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgczNjX2lycV93ZHRhYzk3ID0geworCS5tYXNrCSAgICA9IHMzY19pcnFfd2R0YWM5N19tYXNrLAorCS51bm1hc2sJICAgID0gczNjX2lycV93ZHRhYzk3X3VubWFzaywKKwkuYWNrCSAgICA9IHMzY19pcnFfd2R0YWM5N19hY2ssCit9OworCisvKiBjYW1lcmEgaXJxICovCisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfY2FtKHVuc2lnbmVkIGludCBpcnEsCisJCQkgICAgICBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBzdWJzcmMsIHN1Ym1zazsKKwlzdHJ1Y3QgaXJxZGVzYyAqbXlkZXNjOworCisJLyogcmVhZCB0aGUgY3VycmVudCBwZW5kaW5nIGludGVycnVwdHMsIGFuZCB0aGUgbWFzaworCSAqIGZvciB3aGF0IGl0IGlzIGF2YWlsYWJsZSAqLworCisJc3Vic3JjID0gX19yYXdfcmVhZGwoUzNDMjQxMF9TVUJTUkNQTkQpOworCXN1Ym1zayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UU1VCTVNLKTsKKworCXN1YnNyYyAmPSB+c3VibXNrOworCXN1YnNyYyA+Pj0gMTE7CisJc3Vic3JjICY9IDM7CisKKwlpZiAoc3Vic3JjICE9IDApIHsKKwkJaWYgKHN1YnNyYyAmIDEpIHsKKwkJCW15ZGVzYyA9IGlycV9kZXNjICsgSVJRX1MzQzI0NDBfQ0FNX0M7CisJCQlteWRlc2MtPmhhbmRsZSggSVJRX1MzQzI0NDBfV0RULCBteWRlc2MsIHJlZ3MpOworCQl9CisJCWlmIChzdWJzcmMgJiAyKSB7CisJCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9TM0MyNDQwX0NBTV9QOworCQkJbXlkZXNjLT5oYW5kbGUoSVJRX1MzQzI0NDBfQUM5NywgbXlkZXNjLCByZWdzKTsKKwkJfQorCX0KK30KKworI2RlZmluZSBJTlRNU0tfQ0FNICgxVUwgPDwgKElSUV9DQU0gLSBJUlFfRUlOVDApKQorCitzdGF0aWMgdm9pZAorczNjX2lycV9jYW1fbWFzayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl9tYXNrKGlycW5vLCBJTlRNU0tfQ0FNLCAzPDwxMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzM2NfaXJxX2NhbV91bm1hc2sodW5zaWduZWQgaW50IGlycW5vKQoreworCXMzY19pcnFzdWJfdW5tYXNrKGlycW5vLCBJTlRNU0tfQ0FNKTsKK30KKworc3RhdGljIHZvaWQKK3MzY19pcnFfY2FtX2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8pCit7CisJczNjX2lycXN1Yl9tYXNrYWNrKGlycW5vLCBJTlRNU0tfQ0FNLCAzPDwxMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX2NhbSA9IHsKKwkubWFzawkgICAgPSBzM2NfaXJxX2NhbV9tYXNrLAorCS51bm1hc2sJICAgID0gczNjX2lycV9jYW1fdW5tYXNrLAorCS5hY2sJICAgID0gczNjX2lycV9jYW1fYWNrLAorfTsKKworc3RhdGljIGludCBzM2MyNDQwX2lycV9hZGQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwl1bnNpZ25lZCBpbnQgaXJxbm87CisKKwlwcmludGsoIlMzQzI0NDA6IElSUSBTdXBwb3J0XG4iKTsKKworCXNldF9pcnFfY2hpcChJUlFfTkZDT04sICZzM2NfaXJxX2xldmVsX2NoaXApOworCXNldF9pcnFfaGFuZGxlcihJUlFfTkZDT04sIGRvX2xldmVsX0lSUSk7CisJc2V0X2lycV9mbGFncyhJUlFfTkZDT04sIElSUUZfVkFMSUQpOworCisJLyogYWRkIG5ldyBjaGFpbmVkIGhhbmRsZXIgZm9yIHdkdCwgYWM3ICovCisKKwlzZXRfaXJxX2NoaXAoSVJRX1dEVCwgJnMzY19pcnFfbGV2ZWxfY2hpcCk7CisJc2V0X2lycV9oYW5kbGVyKElSUV9XRFQsIGRvX2xldmVsX0lSUSk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX1dEVCwgczNjX2lycV9kZW11eF93ZHRhYzk3KTsKKworCWZvciAoaXJxbm8gPSBJUlFfUzNDMjQ0MF9XRFQ7IGlycW5vIDw9IElSUV9TM0MyNDQwX0FDOTc7IGlycW5vKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV93ZHRhYzk3KTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKKwl9CisKKwkvKiBhZGQgY2hhaW5lZCBoYW5kbGVyIGZvciBjYW1lcmEgKi8KKworCXNldF9pcnFfY2hpcChJUlFfQ0FNLCAmczNjX2lycV9sZXZlbF9jaGlwKTsKKwlzZXRfaXJxX2hhbmRsZXIoSVJRX0NBTSwgZG9fbGV2ZWxfSVJRKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfQ0FNLCBzM2NfaXJxX2RlbXV4X2NhbSk7CisKKwlmb3IgKGlycW5vID0gSVJRX1MzQzI0NDBfQ0FNX0M7IGlycW5vIDw9IElSUV9TM0MyNDQwX0NBTV9QOyBpcnFubysrKSB7CisJCXNldF9pcnFfY2hpcChpcnFubywgJnMzY19pcnFfY2FtKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIHMzYzI0NDBfaXJxX2RyaXZlciA9IHsKKwkuYWRkCT0gczNjMjQ0MF9pcnFfYWRkLAorfTsKKworc3RhdGljIGludCBzM2MyNHh4X2lycV9kcml2ZXIodm9pZCkKK3sKKwlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmczNjMjQ0MF9zeXNjbGFzcywgJnMzYzI0NDBfaXJxX2RyaXZlcik7Cit9CisKK2FyY2hfaW5pdGNhbGwoczNjMjR4eF9pcnFfZHJpdmVyKTsKKworI2VuZGlmIC8qIENPTkZJR19DUFVfUzNDMjQ0MCAqLworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiOTdlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwpAQCAtMCwwICsxLDQwOSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9FQjI0MTBJVFgvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogICAgIDE0LVNlcC0yMDA0IEJKRCAgVVNCIHBvd2VyIGNvbnRyb2wKKyAqICAgICAyMC1BdWctMjAwNCBCSkQgIEFkZGVkIHMzYzI0MTBfYm9hcmQgc3RydWN0CisgKiAgICAgMTgtQXVnLTIwMDQgQkpEICBBZGRlZCBwbGF0Zm9ybSBkZXZpY2VzIGZyb20gZGVmYXVsdCBzZXQKKyAqICAgICAxNi1NYXktMjAwMyBCSkQgIENyZWF0ZWQgaW5pdGlhbCB2ZXJzaW9uCisgKiAgICAgMTYtQXVnLTIwMDMgQkpEICBGaXhlZCBoZWFkZXIgZmlsZXMgYW5kIGNvcHlyaWdodCwgYWRkZWQgVVJMCisgKiAgICAgMDUtU2VwLTIwMDMgQkpEICBNb3ZlZCB0byB2Mi42IGtlcm5lbAorICogICAgIDA2LUphbi0yMDAzIEJKRCAgVXBkYXRlcyBmb3IgPGFyY2gvbWFwLmg+CisgKiAgICAgMTgtSmFuLTIwMDMgQkpEICBBZGRlZCBzZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uCisgKiAgICAgMDUtT2N0LTIwMDQgQkpEICBQb3dlciBtYW5hZ2VtZW50IGNvZGUKKyAqICAgICAwNC1Ob3YtMjAwNCBCSkQgIFVwZGF0ZWQgc2VyaWFsIHBvcnQgY2xvY2tzCisgKiAgICAgMDQtSmFuLTIwMDUgQkpEICBOZXcgdWFydCBpbml0IGNhbGwKKyAqICAgICAxMC1KYW4tMjAwNSBCSkQgIFJlbW92ZWQgaW5jbHVkZSBvZiBzM2MyNDEwLmgKKyAqICAgICAxNC1KYW4tMjAwNSBCSkQgIEFkZCBzdXBwb3J0IGZvciBtdWl0bHBsZSBOQU5EIGRldmljZXMKKyAqICAgICAwMy1NYXItMjAwNSBCSkQgIEVuc3VyZWQgdGhhdCBiYXN0LWNwbGQuaCBpcyBpbmNsdWRlZAorICogICAgIDEwLU1hci0yMDA1IExDVlIgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKKyAqICAgICAxNC1NYXItMjAwNiBCSkQgIFVwZGF0ZWQgZm9yIF9faW9tZW0gY2hhbmdlcworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvYmFzdC1tYXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iYXN0LWlycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Jhc3QtY3BsZC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8vI2luY2x1ZGUgPGFzbS9kZWJ1Zy1sbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9uYW5kLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJkZXZzLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAidXNiLXNpbXRlYy5oIgorI2luY2x1ZGUgInBtLmgiCisKKyNkZWZpbmUgQ09QWVJJR0hUICIsIChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzIgorCisvKiBtYWNyb3MgZm9yIHZpcnR1YWwgYWRkcmVzcyBtb2RzIGZvciB0aGUgaW8gc3BhY2UgZW50cmllcyAqLworI2RlZmluZSBWQV9DNShpdGVtKSAoKHVuc2lnbmVkIGxvbmcpKGl0ZW0pICsgQkFTVF9WQU1fQ1M1KQorI2RlZmluZSBWQV9DNChpdGVtKSAoKHVuc2lnbmVkIGxvbmcpKGl0ZW0pICsgQkFTVF9WQU1fQ1M0KQorI2RlZmluZSBWQV9DMyhpdGVtKSAoKHVuc2lnbmVkIGxvbmcpKGl0ZW0pICsgQkFTVF9WQU1fQ1MzKQorI2RlZmluZSBWQV9DMihpdGVtKSAoKHVuc2lnbmVkIGxvbmcpKGl0ZW0pICsgQkFTVF9WQU1fQ1MyKQorCisvKiBtYWNyb3MgdG8gbW9kaWZ5IHRoZSBwaHlzaWNhbCBhZGRyZXNzZXMgZm9yIGlvIHNwYWNlICovCisKKyNkZWZpbmUgUEFfQ1MyKGl0ZW0pICgoaXRlbSkgKyBTM0MyNDEwX0NTMikKKyNkZWZpbmUgUEFfQ1MzKGl0ZW0pICgoaXRlbSkgKyBTM0MyNDEwX0NTMykKKyNkZWZpbmUgUEFfQ1M0KGl0ZW0pICgoaXRlbSkgKyBTM0MyNDEwX0NTNCkKKyNkZWZpbmUgUEFfQ1M1KGl0ZW0pICgoaXRlbSkgKyBTM0MyNDEwX0NTNSkKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBiYXN0X2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgIC8qIElTQSBJTyBhcmVhcyAqLworCisgIHsgKHUzMilTM0MyNFhYX1ZBX0lTQV9CWVRFLCBQQV9DUzIoQkFTVF9QQV9JU0FJTyksICAgU1pfMTZNLCBNVF9ERVZJQ0UgfSwKKyAgeyAodTMyKVMzQzI0WFhfVkFfSVNBX1dPUkQsIFBBX0NTMyhCQVNUX1BBX0lTQUlPKSwgICBTWl8xNk0sIE1UX0RFVklDRSB9LAorCisgIC8qIHdlIGNvdWxkIHBvc3NpYmx5IGNvbXByZXNzIHRoZSBuZXh0IHNldCBkb3duIGludG8gYSBzZXQgb2Ygc21hbGxlciB0YWJsZXMKKyAgICogcGFnZXRhYmxlcywgYnV0IHRoYXQgd291bGQgbWVhbiB1c2luZyBhbiBMMiBzZWN0aW9uLCBhbmQgaXQgc3RpbGwgbWVhbnMKKyAgICogd2UgY2Fubm90IGFjdHVhbGx5IGZlZWQgdGhlIHNhbWUgcmVnaXN0ZXIgdG8gYW4gTERSIGR1ZSB0byAxNksgc3BhY2luZworICAgKi8KKworICAvKiBiYXN0IENQTEQgY29udHJvbCByZWdpc3RlcnMsIGFuZCBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbHMgKi8KKyAgeyAodTMyKUJBU1RfVkFfQ1RSTDEsIEJBU1RfUEFfQ1RSTDEsCQkgICBTWl8xTSwgTVRfREVWSUNFIH0sCisgIHsgKHUzMilCQVNUX1ZBX0NUUkwyLCBCQVNUX1BBX0NUUkwyLAkJICAgU1pfMU0sIE1UX0RFVklDRSB9LAorICB7ICh1MzIpQkFTVF9WQV9DVFJMMywgQkFTVF9QQV9DVFJMMywJCSAgIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyAodTMyKUJBU1RfVkFfQ1RSTDQsIEJBU1RfUEFfQ1RSTDQsCQkgICBTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAgLyogUEMxMDQgSVJRIG11eCAqLworICB7ICh1MzIpQkFTVF9WQV9QQzEwNF9JUlFSRVEsICBCQVNUX1BBX1BDMTA0X0lSUVJFUSwgICBTWl8xTSwgTVRfREVWSUNFIH0sCisgIHsgKHUzMilCQVNUX1ZBX1BDMTA0X0lSUVJBVywgIEJBU1RfUEFfUEMxMDRfSVJRUkFXLCAgIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyAodTMyKUJBU1RfVkFfUEMxMDRfSVJRTUFTSywgQkFTVF9QQV9QQzEwNF9JUlFNQVNLLCAgU1pfMU0sIE1UX0RFVklDRSB9LAorCisgIC8qIHBlcmlwaGVyYWwgc3BhY2UuLi4gb25lIGZvciBlYWNoIG9mIGZhc3Qvc2xvdy9ieXRlLzE2Yml0ICovCisgIC8qIG5vdGUsIGlkZSBpcyBvbmx5IGRlY29kZWQgaW4gd29yZCBzcGFjZSwgZXZlbiB0aG91Z2ggc29tZSByZWdpc3RlcnMKKyAgICogYXJlIG9ubHkgOGJpdCAqLworCisgIC8qIHNsb3csIGJ5dGUgKi8KKyAgeyBWQV9DMihCQVNUX1ZBX0lTQUlPKSwgICBQQV9DUzIoQkFTVF9QQV9JU0FJTyksICAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisgIHsgVkFfQzIoQkFTVF9WQV9JU0FNRU0pLCAgUEFfQ1MyKEJBU1RfUEFfSVNBTUVNKSwgICBTWl8xNk0sIE1UX0RFVklDRSB9LAorICB7IFZBX0MyKEJBU1RfVkFfQVNJWE5FVCksIFBBX0NTMyhCQVNUX1BBX0FTSVhORVQpLCAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMihCQVNUX1ZBX1NVUEVSSU8pLCBQQV9DUzIoQkFTVF9QQV9TVVBFUklPKSwgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzIoQkFTVF9WQV9ETTkwMDApLCAgUEFfQ1MyKEJBU1RfUEFfRE05MDAwKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0MyKEJBU1RfVkFfSURFUFJJKSwgIFBBX0NTMyhCQVNUX1BBX0lERVBSSSksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMihCQVNUX1ZBX0lERVNFQyksICBQQV9DUzMoQkFTVF9QQV9JREVTRUMpLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzIoQkFTVF9WQV9JREVQUklBVVgpLCBQQV9DUzMoQkFTVF9QQV9JREVQUklBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCisgIHsgVkFfQzIoQkFTVF9WQV9JREVTRUNBVVgpLCBQQV9DUzMoQkFTVF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAgLyogc2xvdywgd29yZCAqLworICB7IFZBX0MzKEJBU1RfVkFfSVNBSU8pLCAgIFBBX0NTMyhCQVNUX1BBX0lTQUlPKSwgICAgU1pfMTZNLCBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMyhCQVNUX1ZBX0lTQU1FTSksICBQQV9DUzMoQkFTVF9QQV9JU0FNRU0pLCAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisgIHsgVkFfQzMoQkFTVF9WQV9BU0lYTkVUKSwgUEFfQ1MzKEJBU1RfUEFfQVNJWE5FVCksICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0MzKEJBU1RfVkFfU1VQRVJJTyksIFBBX0NTMyhCQVNUX1BBX1NVUEVSSU8pLCAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMyhCQVNUX1ZBX0RNOTAwMCksICBQQV9DUzMoQkFTVF9QQV9ETTkwMDApLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzMoQkFTVF9WQV9JREVQUkkpLCAgUEFfQ1MzKEJBU1RfUEFfSURFUFJJKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0MzKEJBU1RfVkFfSURFU0VDKSwgIFBBX0NTMyhCQVNUX1BBX0lERVNFQyksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMyhCQVNUX1ZBX0lERVBSSUFVWCksIFBBX0NTMyhCQVNUX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMyhCQVNUX1ZBX0lERVNFQ0FVWCksIFBBX0NTMyhCQVNUX1BBX0lERVNFQ0FVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKworICAvKiBmYXN0LCBieXRlICovCisgIHsgVkFfQzQoQkFTVF9WQV9JU0FJTyksICAgUEFfQ1M0KEJBU1RfUEFfSVNBSU8pLCAgICBTWl8xNk0sIE1UX0RFVklDRSB9LAorICB7IFZBX0M0KEJBU1RfVkFfSVNBTUVNKSwgIFBBX0NTNChCQVNUX1BBX0lTQU1FTSksICAgU1pfMTZNLCBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNChCQVNUX1ZBX0FTSVhORVQpLCBQQV9DUzUoQkFTVF9QQV9BU0lYTkVUKSwgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzQoQkFTVF9WQV9TVVBFUklPKSwgUEFfQ1M0KEJBU1RfUEFfU1VQRVJJTyksICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0M0KEJBU1RfVkFfRE05MDAwKSwgIFBBX0NTNChCQVNUX1BBX0RNOTAwMCksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNChCQVNUX1ZBX0lERVBSSSksICBQQV9DUzUoQkFTVF9QQV9JREVQUkkpLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzQoQkFTVF9WQV9JREVTRUMpLCAgUEFfQ1M1KEJBU1RfUEFfSURFU0VDKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0M0KEJBU1RfVkFfSURFUFJJQVVYKSwgUEFfQ1M1KEJBU1RfUEFfSURFUFJJQVVYKSwgU1pfMU0sIE1UX0RFVklDRSB9LAorICB7IFZBX0M0KEJBU1RfVkFfSURFU0VDQVVYKSwgUEFfQ1M1KEJBU1RfUEFfSURFU0VDQVVYKSwgU1pfMU0sIE1UX0RFVklDRSB9LAorCisgIC8qIGZhc3QsIHdvcmQgKi8KKyAgeyBWQV9DNShCQVNUX1ZBX0lTQUlPKSwgICBQQV9DUzUoQkFTVF9QQV9JU0FJTyksICAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisgIHsgVkFfQzUoQkFTVF9WQV9JU0FNRU0pLCAgUEFfQ1M1KEJBU1RfUEFfSVNBTUVNKSwgICBTWl8xNk0sIE1UX0RFVklDRSB9LAorICB7IFZBX0M1KEJBU1RfVkFfQVNJWE5FVCksIFBBX0NTNShCQVNUX1BBX0FTSVhORVQpLCAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNShCQVNUX1ZBX1NVUEVSSU8pLCBQQV9DUzUoQkFTVF9QQV9TVVBFUklPKSwgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzUoQkFTVF9WQV9ETTkwMDApLCAgUEFfQ1M1KEJBU1RfUEFfRE05MDAwKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0M1KEJBU1RfVkFfSURFUFJJKSwgIFBBX0NTNShCQVNUX1BBX0lERVBSSSksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNShCQVNUX1ZBX0lERVNFQyksICBQQV9DUzUoQkFTVF9QQV9JREVTRUMpLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzUoQkFTVF9WQV9JREVQUklBVVgpLCBQQV9DUzUoQkFTVF9QQV9JREVQUklBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCisgIHsgVkFfQzUoQkFTVF9WQV9JREVTRUNBVVgpLCBQQV9DUzUoQkFTVF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCit9OworCisjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1VDT05fVUNMSworI2RlZmluZSBVTENPTiBTM0MyNDEwX0xDT05fQ1M4IHwgUzNDMjQxMF9MQ09OX1BOT05FIHwgUzNDMjQxMF9MQ09OX1NUT1BCCisjZGVmaW5lIFVGQ09OIFMzQzI0MTBfVUZDT05fUlhUUklHOCB8IFMzQzI0MTBfVUZDT05fRklGT01PREUKKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjIGJhc3Rfc2VyaWFsX2Nsb2Nrc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJCT0gInVjbGsiLAorCQkuZGl2aXNvcgk9IDEsCisJCS5taW5fYmF1ZAk9IDAsCisJCS5tYXhfYmF1ZAk9IDAsCisJfSwKKwlbMV0gPSB7CisJCS5uYW1lCQk9ICJwY2xrIiwKKwkJLmRpdmlzb3IJPSAxLAorCQkubWluX2JhdWQJPSAwLAorCQkubWF4X2JhdWQJPSAwLgorCX0KK307CisKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgYmFzdF91YXJ0Y2Znc1tdID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMCwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwkJLmNsb2NrcwkgICAgID0gYmFzdF9zZXJpYWxfY2xvY2tzLAorCQkuY2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKGJhc3Rfc2VyaWFsX2Nsb2NrcykKKwl9LAorCVsxXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMSwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwkJLmNsb2NrcwkgICAgID0gYmFzdF9zZXJpYWxfY2xvY2tzLAorCQkuY2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKGJhc3Rfc2VyaWFsX2Nsb2NrcykKKwl9LAorCS8qIHBvcnQgMiBpcyBub3QgYWN0dWFsbHkgdXNlZCAqLworCVsyXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMiwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwkJLmNsb2NrcwkgICAgID0gYmFzdF9zZXJpYWxfY2xvY2tzLAorCQkuY2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKGJhc3Rfc2VyaWFsX2Nsb2NrcykKKwl9Cit9OworCisvKiBOT1IgRmxhc2ggb24gQkFTVCBib2FyZCAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJhc3Rfbm9yX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX0NTMSArIDB4NDAwMDAwMCwKKwkJLmVuZCAgID0gUzNDMjQxMF9DUzEgKyAweDQwMDAwMDAgKyAoMzIqMTAyNCoxMDI0KSAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJhc3RfZGV2aWNlX25vciA9IHsKKwkubmFtZQkJPSAiYmFzdC1ub3IiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYmFzdF9ub3JfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IGJhc3Rfbm9yX3Jlc291cmNlLAorfTsKKworLyogTkFORCBGbGFzaCBvbiBCQVNUIGJvYXJkICovCisKKworc3RhdGljIGludCBzbWFydG1lZGlhX21hcFtdID0geyAwIH07CitzdGF0aWMgaW50IGNoaXAwX21hcFtdID0geyAxIH07CitzdGF0aWMgaW50IGNoaXAxX21hcFtdID0geyAyIH07CitzdGF0aWMgaW50IGNoaXAyX21hcFtdID0geyAzIH07CisKK3N0cnVjdCBtdGRfcGFydGl0aW9uIGJhc3RfZGVmYXVsdF9uYW5kX3BhcnRbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIkJvb3QgQWdlbnQiLAorCQkuc2l6ZQk9IFNaXzE2SywKKwkJLm9mZnNldAk9IDAKKwl9LAorCVsxXSA9IHsKKwkJLm5hbWUJPSAiL2Jvb3QiLAorCQkuc2l6ZQk9IFNaXzRNIC0gU1pfMTZLLAorCQkub2Zmc2V0CT0gU1pfMTZLLAorCX0sCisJWzJdID0geworCQkubmFtZQk9ICJ1c2VyIiwKKwkJLm9mZnNldAk9IFNaXzRNLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJfQorfTsKKworLyogdGhlIGJhc3QgaGFzIDQgc2VsZWN0YWJsZSBzbG90cyBmb3IgbmFuZC1mbGFzaCwgdGhlIHRocmVlCisgKiBvbi1ib2FyZCBjaGlwIGFyZWFzLCBhcyB3ZWxsIGFzIHRoZSBleHRlcm5hbCBTbWFydE1lZGlhCisgKiBzbG90LgorICoKKyAqIE5vdGUsIHRoZXJlIGlzIG5vIGN1cnJlbnQgaG90LXBsdWcgc3VwcG9ydCBmb3IgdGhlIFNtYXJ0TWVkaWEKKyAqIHNvY2tldC4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCBiYXN0X25hbmRfc2V0c1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJCT0gIlNtYXJ0TWVkaWEiLAorCQkubnJfY2hpcHMJPSAxLAorCQkubnJfbWFwCQk9IHNtYXJ0bWVkaWFfbWFwLAorCQkubnJfcGFydGl0aW9ucwk9IEFSUkFZX1NJWkUoYmFzdF9kZWZhdWx0X25hbmRfcGFydCksCisJCS5wYXJ0aXRpb25zCT0gYmFzdF9kZWZhdWx0X25hbmRfcGFydAorCX0sCisJWzFdID0geworCQkubmFtZQkJPSAiY2hpcDAiLAorCQkubnJfY2hpcHMJPSAxLAorCQkubnJfbWFwCQk9IGNoaXAwX21hcCwKKwkJLm5yX3BhcnRpdGlvbnMJPSBBUlJBWV9TSVpFKGJhc3RfZGVmYXVsdF9uYW5kX3BhcnQpLAorCQkucGFydGl0aW9ucwk9IGJhc3RfZGVmYXVsdF9uYW5kX3BhcnQKKwl9LAorCVsyXSA9IHsKKwkJLm5hbWUJCT0gImNoaXAxIiwKKwkJLm5yX2NoaXBzCT0gMSwKKwkJLm5yX21hcAkJPSBjaGlwMV9tYXAsCisJCS5ucl9wYXJ0aXRpb25zCT0gQVJSQVlfU0laRShiYXN0X2RlZmF1bHRfbmFuZF9wYXJ0KSwKKwkJLnBhcnRpdGlvbnMJPSBiYXN0X2RlZmF1bHRfbmFuZF9wYXJ0CisJfSwKKwlbM10gPSB7CisJCS5uYW1lCQk9ICJjaGlwMiIsCisJCS5ucl9jaGlwcwk9IDEsCisJCS5ucl9tYXAJCT0gY2hpcDJfbWFwLAorCQkubnJfcGFydGl0aW9ucwk9IEFSUkFZX1NJWkUoYmFzdF9kZWZhdWx0X25hbmRfcGFydCksCisJCS5wYXJ0aXRpb25zCT0gYmFzdF9kZWZhdWx0X25hbmRfcGFydAorCX0KK307CisKK3N0YXRpYyB2b2lkIGJhc3RfbmFuZF9zZWxlY3Qoc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgKnNldCwgaW50IHNsb3QpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXNsb3QgPSBzZXQtPm5yX21hcFtzbG90XSAmIDM7CisKKwlwcl9kZWJ1ZygiYmFzdF9uYW5kOiBzZWxlY3Rpbmcgc2xvdCAlZCAoc2V0ICVwLCVwKVxuIiwKKwkJIHNsb3QsIHNldCwgc2V0LT5ucl9tYXApOworCisJdG1wID0gX19yYXdfcmVhZGIoQkFTVF9WQV9DVFJMMik7CisJdG1wICY9IEJBU1RfQ1BMRF9DVExSMl9JREVSU1Q7CisJdG1wIHw9IHNsb3Q7CisJdG1wIHw9IEJBU1RfQ1BMRF9DVFJMMl9XTkFORDsKKworCXByX2RlYnVnKCJiYXN0X25hbmQ6IGN0cmwyIG5vdyAlMDJ4XG4iLCB0bXApOworCisJX19yYXdfd3JpdGViKHRtcCwgQkFTVF9WQV9DVFJMMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kIGJhc3RfbmFuZF9pbmZvID0geworCS50YWNscwkJPSA4MCwKKwkudHdycGgwCQk9IDgwLAorCS50d3JwaDEJCT0gODAsCisJLm5yX3NldHMJPSBBUlJBWV9TSVpFKGJhc3RfbmFuZF9zZXRzKSwKKwkuc2V0cwkJPSBiYXN0X25hbmRfc2V0cywKKwkuc2VsZWN0X2NoaXAJPSBiYXN0X25hbmRfc2VsZWN0LAorfTsKKworCisvKiBTdGFuZGFyZCBCQVNUIGRldmljZXMgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJhc3RfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnMzY19kZXZpY2VfdXNiLAorCSZzM2NfZGV2aWNlX2xjZCwKKwkmczNjX2RldmljZV93ZHQsCisJJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2lpcywKKyAJJnMzY19kZXZpY2VfcnRjLAorCSZzM2NfZGV2aWNlX25hbmQsCisJJmJhc3RfZGV2aWNlX25vcgorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmJhc3RfY2xvY2tzW10gPSB7CisJJnMzYzI0eHhfZGNsazAsCisJJnMzYzI0eHhfZGNsazEsCisJJnMzYzI0eHhfY2xrb3V0MCwKKwkmczNjMjR4eF9jbGtvdXQxLAorCSZzM2MyNHh4X3VjbGssCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfYm9hcmQgYmFzdF9ib2FyZCBfX2luaXRkYXRhID0geworCS5kZXZpY2VzICAgICAgID0gYmFzdF9kZXZpY2VzLAorCS5kZXZpY2VzX2NvdW50ID0gQVJSQVlfU0laRShiYXN0X2RldmljZXMpLAorCS5jbG9ja3MJICAgICAgID0gYmFzdF9jbG9ja3MsCisJLmNsb2Nrc19jb3VudCAgPSBBUlJBWV9TSVpFKGJhc3RfY2xvY2tzKQorfTsKKwordm9pZCBfX2luaXQgYmFzdF9tYXBfaW8odm9pZCkKK3sKKwkvKiBpbml0aWFsaXNlIHRoZSBjbG9ja3MgKi8KKworCXMzYzI0eHhfZGNsazAucGFyZW50ID0gTlVMTDsKKwlzM2MyNHh4X2RjbGswLnJhdGUgICA9IDEyKjEwMDAqMTAwMDsKKworCXMzYzI0eHhfZGNsazEucGFyZW50ID0gTlVMTDsKKwlzM2MyNHh4X2RjbGsxLnJhdGUgICA9IDI0KjEwMDAqMTAwMDsKKworCXMzYzI0eHhfY2xrb3V0MC5wYXJlbnQgID0gJnMzYzI0eHhfZGNsazA7CisJczNjMjR4eF9jbGtvdXQxLnBhcmVudCAgPSAmczNjMjR4eF9kY2xrMTsKKworCXMzYzI0eHhfdWNsay5wYXJlbnQgID0gJnMzYzI0eHhfY2xrb3V0MTsKKworCXMzY19kZXZpY2VfbmFuZC5kZXYucGxhdGZvcm1fZGF0YSA9ICZiYXN0X25hbmRfaW5mbzsKKworCXMzYzI0eHhfaW5pdF9pbyhiYXN0X2lvZGVzYywgQVJSQVlfU0laRShiYXN0X2lvZGVzYykpOworCXMzYzI0eHhfaW5pdF9jbG9ja3MoMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKGJhc3RfdWFydGNmZ3MsIEFSUkFZX1NJWkUoYmFzdF91YXJ0Y2ZncykpOworCXMzYzI0eHhfc2V0X2JvYXJkKCZiYXN0X2JvYXJkKTsKKwl1c2Jfc2ltdGVjX2luaXQoKTsKK30KKwordm9pZCBfX2luaXQgYmFzdF9pbml0X2lycSh2b2lkKQoreworCXMzYzI0eHhfaW5pdF9pcnEoKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKiBiYXN0X2luaXRfbWFjaGluZQorICoKKyAqIGVuYWJsZSB0aGUgcG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIHRoZSBFQjI0MTBJVFgKKyovCisKK3N0YXRpYyBfX2luaXQgdm9pZCBiYXN0X2luaXRfbWFjaGluZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ3N0YXR1czQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJCQVNUIFBvd2VyIE1hbmFuZ2VtZW50IiBDT1BZUklHSFQgIlxuIik7CisKKwlnc3RhdHVzNCAgPSAoX19yYXdfcmVhZGwoUzNDMjQxMF9CQU5LQ09ONykgJiAweDMpIDw8IDMwOworCWdzdGF0dXM0IHw9IChfX3Jhd19yZWFkbChTM0MyNDEwX0JBTktDT042KSAmIDB4MykgPDwgMjg7CisJZ3N0YXR1czQgfD0gKF9fcmF3X3JlYWRsKFMzQzI0MTBfQkFOS1NJWkUpICYgUzNDMjQxMF9CQU5LU0laRV9NQVNLKTsKKworCV9fcmF3X3dyaXRlbChnc3RhdHVzNCwgUzNDMjQxMF9HU1RBVFVTNCk7CisKKwlzM2MyNDEwX3BtX2luaXQoKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgYmFzdF9pbml0X21hY2hpbmUgTlVMTAorI2VuZGlmCisKKworTUFDSElORV9TVEFSVChCQVNULCAiU2ltdGVjLUJBU1QiKQorICAgICBNQUlOVEFJTkVSKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+IikKKyAgICAgQk9PVF9NRU0oUzNDMjQxMF9TRFJBTV9QQSwgUzNDMjQxMF9QQV9VQVJULCAodTMyKVMzQzI0WFhfVkFfVUFSVCkKKyAgICAgQk9PVF9QQVJBTVMoUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwKQorICAgICBNQVBJTyhiYXN0X21hcF9pbykKKyAgICAgSU5JVElSUShiYXN0X2luaXRfaXJxKQorCS5pbml0X21hY2hpbmUJPSBiYXN0X2luaXRfbWFjaGluZSwKKwkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyNGFmYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIGh0dHA6Ly93d3cuaGFuZGhlbGRzLm9yZy9wcm9qZWN0cy9oMTk0MC5odG1sCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogICAgIDE2LU1heS0yMDAzIEJKRCAgQ3JlYXRlZCBpbml0aWFsIHZlcnNpb24KKyAqICAgICAxNi1BdWctMjAwMyBCSkQgIEZpeGVkIGhlYWRlciBmaWxlcyBhbmQgY29weXJpZ2h0LCBhZGRlZCBVUkwKKyAqICAgICAwNS1TZXAtMjAwMyBCSkQgIE1vdmVkIHRvIHYyLjYga2VybmVsCisgKiAgICAgMDYtSmFuLTIwMDMgQkpEICBVcGRhdGVzIGZvciA8YXJjaC9tYXAuaD4KKyAqICAgICAxOC1KYW4tMjAwMyBCSkQgIEFkZGVkIHNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24KKyAqICAgICAxNy1GZWItMjAwMyBCSkQgIENvcGllZCB0byBtYWNoLWlwYXEuYworICogICAgIDIxLUF1Zy0yMDA0IEJKRCAgQWRkZWQgc3RydWN0IHMzYzI0MTBfYm9hcmQKKyAqICAgICAwNC1TZXAtMjAwNCBCSkQgIENoYW5nZWQgdWFydCBpbml0LCByZW5hbWVkIGlwYXFfIC0+IGgxOTQwXworICogICAgIDE4LU9jdC0yMDA0IEJKRCAgVXBkYXRlZCBuZXcgYm9hcmQgc3RydWN0dXJlIG5hbWUKKyAqICAgICAwNC1Ob3YtMjAwNCBCSkQgIENoYW5nZSBmb3IgbmV3IHNlcmlhbCBjbG9jaworICogICAgIDA0LUphbi0yMDA1IEJKRCAgVXBkYXRlZCB1YXJ0IGluaXQgY2FsbAorICogICAgIDEwLUphbi0yMDA1IEJKRCAgUmVtb3ZlZCBpbmNsdWRlIG9mIHMzYzI0MTAuaAorICogICAgIDE0LUphbi0yMDA1IEJKRCAgQWRkZWQgY2xvY2sgaW5pdAorICogICAgIDEwLU1hci0yMDA1IExDVlIgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb21kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8vI2luY2x1ZGUgPGFzbS9kZWJ1Zy1sbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJkZXZzLmgiCisjaW5jbHVkZSAiY3B1LmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaDE5NDBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9OworCisjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1VDT05fVUNMSworI2RlZmluZSBVTENPTiBTM0MyNDEwX0xDT05fQ1M4IHwgUzNDMjQxMF9MQ09OX1BOT05FIHwgUzNDMjQxMF9MQ09OX1NUT1BCCisjZGVmaW5lIFVGQ09OIFMzQzI0MTBfVUZDT05fUlhUUklHOCB8IFMzQzI0MTBfVUZDT05fRklGT01PREUKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgaDE5NDBfdWFydGNmZ3NbXSA9IHsKKwlbMF0gPSB7CisJCS5od3BvcnQJICAgICA9IDAsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IDB4M2M1LAorCQkudWxjb24JICAgICA9IDB4MDMsCisJCS51ZmNvbgkgICAgID0gMHg1MSwKKwl9LAorCVsxXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMSwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gMHgyNDUsCisJCS51bGNvbgkgICAgID0gMHgwMywKKwkJLnVmY29uCSAgICAgPSAweDAwLAorCX0sCisJLyogSVIgcG9ydCAqLworCVsyXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMiwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWFydF9mbGFncyAgPSBVUEZfQ09OU19GTE9XLAorCQkudWNvbgkgICAgID0gMHgzYzUsCisJCS51bGNvbgkgICAgID0gMHg0MywKKwkJLnVmY29uCSAgICAgPSAweDUxLAorCX0KK307CisKKworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpoMTk0MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmczNjX2RldmljZV91c2IsCisJJnMzY19kZXZpY2VfbGNkLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaWlzLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X2JvYXJkIGgxOTQwX2JvYXJkIF9faW5pdGRhdGEgPSB7CisJLmRldmljZXMgICAgICAgPSBoMTk0MF9kZXZpY2VzLAorCS5kZXZpY2VzX2NvdW50ID0gQVJSQVlfU0laRShoMTk0MF9kZXZpY2VzKQorfTsKKwordm9pZCBfX2luaXQgaDE5NDBfbWFwX2lvKHZvaWQpCit7CisJczNjMjR4eF9pbml0X2lvKGgxOTQwX2lvZGVzYywgQVJSQVlfU0laRShoMTk0MF9pb2Rlc2MpKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhoMTk0MF91YXJ0Y2ZncywgQVJSQVlfU0laRShoMTk0MF91YXJ0Y2ZncykpOworCXMzYzI0eHhfc2V0X2JvYXJkKCZoMTk0MF9ib2FyZCk7Cit9CisKK3ZvaWQgX19pbml0IGgxOTQwX2luaXRfaXJxKHZvaWQpCit7CisJczNjMjR4eF9pbml0X2lycSgpOworCit9CisKK01BQ0hJTkVfU1RBUlQoSDE5NDAsICJJUEFRLUgxOTQwIikKKyAgICAgTUFJTlRBSU5FUigiQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiIpCisgICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCisgICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKKyAgICAgTUFQSU8oaDE5NDBfbWFwX2lvKQorICAgICBJTklUSVJRKGgxOTQwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTU5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2hyaXN0ZXIgV2VpbmlnZWwgPGNocmlzdGVyQHdlaW5pZ2VsLnNlPgorICoKKyAqIFRoZXJlIGlzIGEgd2lraSB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG4zMCBwb3J0IGF0CisgKiBodHRwOi8vaGFuZGhlbGRzLm9yZy9tb2luL21vaW4uY2dpL0FjZXJOMzBEb2N1bWVudGF0aW9uIC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaWljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorCisjaW5jbHVkZSAiczNjMjQxMC5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiZGV2cy5oIgorI2luY2x1ZGUgImNwdS5oIgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG4zMF9pb2Rlc2NbXSBfX2luaXRkYXRhID0geworCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIG4zMF91YXJ0Y2Znc1tdID0geworCS8qIE5vcm1hbCBzZXJpYWwgcG9ydCAqLworCVswXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMCwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gMHgyYzUsCisJCS51bGNvbgkgICAgID0gMHgwMywKKwkJLnVmY29uCSAgICAgPSAweDUxLAorCX0sCisJLyogSVIgcG9ydCAqLworCVsxXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMSwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWFydF9mbGFncyAgPSBVUEZfQ09OU19GTE9XLAorCQkudWNvbgkgICAgID0gMHgyYzUsCisJCS51bGNvbgkgICAgID0gMHg0MywKKwkJLnVmY29uCSAgICAgPSAweDUxLAorCX0sCisJLyogVGhlIEJsdWVUb290aCBjb250cm9sbGVyIGlzIGNvbm5lY3RlZCB0byBwb3J0IDIgKi8KKwlbMl0gPSB7CisJCS5od3BvcnQJICAgICA9IDIsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IDB4MmM1LAorCQkudWxjb24JICAgICA9IDB4MDMsCisJCS51ZmNvbgkgICAgID0gMHg1MSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm4zMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmczNjX2RldmljZV91c2IsCisJJnMzY19kZXZpY2VfbGNkLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaWlzLAorCSZzM2NfZGV2aWNlX3VzYmdhZGdldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgbjMwX2kyY2NmZyA9IHsKKwkuZmxhZ3MJCT0gMCwKKwkuc2xhdmVfYWRkcgk9IDB4MTAsCisJLmJ1c19mcmVxCT0gMTAqMTAwMCwKKwkubWF4X2ZyZXEJPSAxMCoxMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X2JvYXJkIG4zMF9ib2FyZCBfX2luaXRkYXRhID0geworCS5kZXZpY2VzICAgICAgID0gbjMwX2RldmljZXMsCisJLmRldmljZXNfY291bnQgPSBBUlJBWV9TSVpFKG4zMF9kZXZpY2VzKQorfTsKKwordm9pZCBfX2luaXQgbjMwX21hcF9pbyh2b2lkKQoreworCXMzYzI0eHhfaW5pdF9pbyhuMzBfaW9kZXNjLCBBUlJBWV9TSVpFKG4zMF9pb2Rlc2MpKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhuMzBfdWFydGNmZ3MsIEFSUkFZX1NJWkUobjMwX3VhcnRjZmdzKSk7CisJczNjMjR4eF9zZXRfYm9hcmQoJm4zMF9ib2FyZCk7Cit9CisKK3ZvaWQgX19pbml0IG4zMF9pbml0X2lycSh2b2lkKQoreworCXMzYzI0eHhfaW5pdF9pcnEoKTsKK30KKworCitzdGF0aWMgaW50IG4zMF91c2JzdGFydF90aHJlYWQodm9pZCAqdW51c2VkKQoreworCS8qIFR1cm4gb2ZmIHN1c3BlbmQgb24gYm90aCBVU0IgcG9ydHMsIGFuZCBzd2l0Y2ggdGhlCisJICogc2VsZWN0YWJsZSBVU0IgcG9ydCB0byBVU0IgZGV2aWNlIG1vZGUuICovCisJd3JpdGVsKHJlYWRsKFMzQzI0MTBfTUlTQ0NSKSAmIH4weDAwMDAzMDA4LCBTM0MyNDEwX01JU0NDUik7CisKKwkvKiBUdXJuIG9mZiB0aGUgRCsgcHVsbCB1cCBmb3IgMyBzZWNvbmRzIHNvIHRoYXQgdGhlIFVTQiBob3N0CisJICogYXQgdGhlIG90aGVyIGVuZCB3aWxsIGRvIGEgcmVzY2FuIG9mIHRoZSBVU0IgYnVzLiAgKi8KKwlzM2MyNDEwX2dwaW9fc2V0cGluKFMzQzI0MTBfR1BCMywgMCk7CisKKwltc2xlZXBfaW50ZXJydXB0aWJsZSgzKkhaKTsKKworCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEIzLCAxKTsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgX19pbml0IG4zMF9pbml0KHZvaWQpCit7CisJczNjX2RldmljZV9pMmMuZGV2LnBsYXRmb3JtX2RhdGEgPSAmbjMwX2kyY2NmZzsKKworCWt0aHJlYWRfcnVuKG4zMF91c2JzdGFydF90aHJlYWQsIE5VTEwsICJuMzBfdXNic3RhcnQiKTsKK30KKworTUFDSElORV9TVEFSVChOMzAsICJBY2VyLU4zMCIpCisgICAgIE1BSU5UQUlORVIoIkNocmlzdGVyIFdlaW5pZ2VsIDxjaHJpc3RlckB3ZWluaWdlbC5zZT4sIEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4iKQorICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQorICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCisKKwkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG4zMF9pbml0LAorCS5pbml0X2lycQk9IG4zMF9pbml0X2lycSwKKwkubWFwX2lvCQk9IG4zMF9tYXBfaW8sCitNQUNISU5FX0VORAorCisvKgorICAgIExvY2FsIHZhcmlhYmxlczoKKyAgICAgICAgY29tcGlsZS1jb21tYW5kOiAibWFrZSBBUkNIPWFybSBDUk9TU19DT01QSUxFPS91c3IvbG9jYWwvYXJtLzMuMy4yL2Jpbi9hcm0tbGludXgtIC1rIC1DIC4uLy4uLy4uIgorICAgICAgICBjLWJhc2ljLW9mZnNldDogOAorICAgIEVuZDoKKyovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uZXhjb2Rlci5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ4N2JmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYwpAQCAtMCwwICsxLDE1NiBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBOZXggVmlzaW9uCisgKiAgIEd1aWxsYXVtZSBHT1VSQVQgPGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqICAgICAxNS0xMC0yMDA0IEdHICBDcmVhdGVkIGluaXRpYWwgdmVyc2lvbgorICogICAgIDEyLTAzLTIwMDUgQkpEIFVwZGF0ZWQgZm9yIHJlbGVhc2UKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworLy8jaW5jbHVkZSA8YXNtL2RlYnVnLWxsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKworI2luY2x1ZGUgInMzYzI0MTAuaCIKKyNpbmNsdWRlICJzM2MyNDQwLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJkZXZzLmgiCisjaW5jbHVkZSAiY3B1LmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbmV4Y29kZXJfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9OworCisjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQKKyNkZWZpbmUgVUxDT04gUzNDMjQxMF9MQ09OX0NTOCB8IFMzQzI0MTBfTENPTl9QTk9ORSB8IFMzQzI0MTBfTENPTl9TVE9QQgorI2RlZmluZSBVRkNPTiBTM0MyNDEwX1VGQ09OX1JYVFJJRzEyIHwgUzNDMjQxMF9VRkNPTl9GSUZPTU9ERQorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBuZXhjb2Rlcl91YXJ0Y2Znc1tdID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMCwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwl9LAorCVsxXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMSwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwl9LAorCVsyXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMiwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwl9Cit9OworCisvKiBOT1IgRmxhc2ggb24gTmV4VmlzaW9uIE5leENvZGVyIDI0NDAgYm9hcmQgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuZXhjb2Rlcl9ub3JfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfQ1MwLAorCQkuZW5kICAgPSBTM0MyNDEwX0NTMCArICg4KjEwMjQqMTAyNCkgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IG1hcF9pbmZvIG5leGNvZGVyX25vcl9tYXAgPSB7CisJLmJhbmt3aWR0aCA9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBuZXhjb2Rlcl9kZXZpY2Vfbm9yID0geworCS5uYW1lCQk9ICJtdGQtZmxhc2giLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobmV4Y29kZXJfbm9yX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBuZXhjb2Rlcl9ub3JfcmVzb3VyY2UsCisJLmRldiA9CisJeworCQkucGxhdGZvcm1fZGF0YSA9ICZuZXhjb2Rlcl9ub3JfbWFwLAorCX0KK307CisKKy8qIFN0YW5kYXJkIE5leGNvZGVyIGRldmljZXMgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm5leGNvZGVyX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfZGV2aWNlX3VzYiwKKwkmczNjX2RldmljZV9sY2QsCisJJnMzY19kZXZpY2Vfd2R0LAorCSZzM2NfZGV2aWNlX2kyYywKKwkmczNjX2RldmljZV9paXMsCisgCSZzM2NfZGV2aWNlX3J0YywKKwkmczNjX2RldmljZV9jYW1pZiwKKwkmczNjX2RldmljZV9zcGkwLAorCSZzM2NfZGV2aWNlX3NwaTEsCisJJm5leGNvZGVyX2RldmljZV9ub3IsCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfYm9hcmQgbmV4Y29kZXJfYm9hcmQgX19pbml0ZGF0YSA9IHsKKwkuZGV2aWNlcyAgICAgICA9IG5leGNvZGVyX2RldmljZXMsCisJLmRldmljZXNfY291bnQgPSBBUlJBWV9TSVpFKG5leGNvZGVyX2RldmljZXMpLAorfTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgbmV4Y29kZXJfc2Vuc29yYm9hcmRfaW5pdCh2b2lkKQoreworCS8vIEluaXRpYWxpemUgU0NDQiBidXMKKwlzM2MyNDEwX2dwaW9fc2V0cGluKFMzQzI0MTBfR1BFMTQsIDEpOyAvLyBJSUNTQ0wKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTQsIFMzQzI0MTBfR1BFMTRfT1VUUCk7CisJczNjMjQxMF9ncGlvX3NldHBpbihTM0MyNDEwX0dQRTE1LCAxKTsgLy8gSUlDU0RBCisJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTE1LCBTM0MyNDEwX0dQRTE1X09VVFApOworCisJLy8gUG93ZXIgdXAgdGhlIHNlbnNvciBib2FyZAorCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEYxLCAxKTsKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BGMSwgUzNDMjQxMF9HUEYxX09VVFApOyAvLyBDQU1fR1BJTzcgPT4gbkxET19QV1JETgorCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEYyLCAwKTsKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BGMiwgUzNDMjQxMF9HUEYyX09VVFApOyAvLyBDQU1fR1BJTzYgPT4gQ0FNX1BXUkROCit9CisKK3ZvaWQgX19pbml0IG5leGNvZGVyX21hcF9pbyh2b2lkKQoreworCXMzYzI0eHhfaW5pdF9pbyhuZXhjb2Rlcl9pb2Rlc2MsIEFSUkFZX1NJWkUobmV4Y29kZXJfaW9kZXNjKSk7CisJczNjMjR4eF9pbml0X2Nsb2NrcygwKTsKKwlzM2MyNHh4X2luaXRfdWFydHMobmV4Y29kZXJfdWFydGNmZ3MsIEFSUkFZX1NJWkUobmV4Y29kZXJfdWFydGNmZ3MpKTsKKwlzM2MyNHh4X3NldF9ib2FyZCgmbmV4Y29kZXJfYm9hcmQpOworCW5leGNvZGVyX3NlbnNvcmJvYXJkX2luaXQoKTsKK30KKworCitNQUNISU5FX1NUQVJUKE5FWENPREVSXzI0NDAsICJOZXhWaXNpb24gLSBOZXhjb2RlciAyNDQwIikKKyAgICAgTUFJTlRBSU5FUigiR3VpbGxhdW1lIEdPVVJBVCA8Z3VpbGxhdW1lLmdvdXJhdEBuZXh2aXNpb24udHY+IikKKyAgICAgQk9PVF9NRU0oUzNDMjQxMF9TRFJBTV9QQSwgUzNDMjQxMF9QQV9VQVJULCAodTMyKVMzQzI0WFhfVkFfVUFSVCkKKyAgICAgQk9PVF9QQVJBTVMoUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwKQorCS5tYXBfaW8JCT0gbmV4Y29kZXJfbWFwX2lvLAorCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q4Y2U4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTmV4IFZpc2lvbgorICogICBHdWlsbGF1bWUgR09VUkFUIDxndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi5mcj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9vdG9tLW1hcC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorCisjaW5jbHVkZSAiczNjMjQxMC5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiZGV2cy5oIgorI2luY2x1ZGUgImNwdS5oIgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG90b20xMV9pb2Rlc2NbXSBfX2luaXRkYXRhID0geworICAvKiBEZXZpY2UgYXJlYSAqLworCXsgKHUzMilPVE9NX1ZBX0NTODkwMEFfQkFTRSwgT1RPTV9QQV9DUzg5MDBBX0JBU0UsIFNaXzE2TSwgTVRfREVWSUNFIH0sCit9OworCisjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQKKyNkZWZpbmUgVUxDT04gUzNDMjQxMF9MQ09OX0NTOCB8IFMzQzI0MTBfTENPTl9QTk9ORSB8IFMzQzI0MTBfTENPTl9TVE9QQgorI2RlZmluZSBVRkNPTiBTM0MyNDEwX1VGQ09OX1JYVFJJRzEyIHwgUzNDMjQxMF9VRkNPTl9GSUZPTU9ERQorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBvdG9tMTFfdWFydGNmZ3NbXSA9IHsKKwlbMF0gPSB7CisJCS5od3BvcnQJICAgICA9IDAsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IFVDT04sCisJCS51bGNvbgkgICAgID0gVUxDT04sCisJCS51ZmNvbgkgICAgID0gVUZDT04sCisJfSwKKwlbMV0gPSB7CisJCS5od3BvcnQJICAgICA9IDEsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IFVDT04sCisJCS51bGNvbgkgICAgID0gVUxDT04sCisJCS51ZmNvbgkgICAgID0gVUZDT04sCisJfSwKKwkvKiBwb3J0IDIgaXMgbm90IGFjdHVhbGx5IHVzZWQgKi8KKwlbMl0gPSB7CisJCS5od3BvcnQJICAgICA9IDIsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IFVDT04sCisJCS51bGNvbgkgICAgID0gVUxDT04sCisJCS51ZmNvbgkgICAgID0gVUZDT04sCisJfQorfTsKKworLyogTk9SIEZsYXNoIG9uIE5leFZpc2lvbiBPVE9NIGJvYXJkICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3RvbV9ub3JfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfQ1MwLAorCQkuZW5kICAgPSBTM0MyNDEwX0NTMCArICg0KjEwMjQqMTAyNCkgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvdG9tX2RldmljZV9ub3IgPSB7CisJLm5hbWUJCT0gIm10ZC1mbGFzaCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvdG9tX25vcl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gb3RvbV9ub3JfcmVzb3VyY2UsCit9OworCisvKiBTdGFuZGFyZCBPVE9NIGRldmljZXMgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm90b20xMV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmczNjX2RldmljZV91c2IsCisJJnMzY19kZXZpY2VfbGNkLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaWlzLAorIAkmczNjX2RldmljZV9ydGMsCisJJm90b21fZGV2aWNlX25vciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9ib2FyZCBvdG9tMTFfYm9hcmQgX19pbml0ZGF0YSA9IHsKKwkuZGV2aWNlcyAgICAgICA9IG90b20xMV9kZXZpY2VzLAorCS5kZXZpY2VzX2NvdW50ID0gQVJSQVlfU0laRShvdG9tMTFfZGV2aWNlcykKK307CisKKwordm9pZCBfX2luaXQgb3RvbTExX21hcF9pbyh2b2lkKQoreworCXMzYzI0eHhfaW5pdF9pbyhvdG9tMTFfaW9kZXNjLCBBUlJBWV9TSVpFKG90b20xMV9pb2Rlc2MpKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhvdG9tMTFfdWFydGNmZ3MsIEFSUkFZX1NJWkUob3RvbTExX3VhcnRjZmdzKSk7CisJczNjMjR4eF9zZXRfYm9hcmQoJm90b20xMV9ib2FyZCk7Cit9CisKKworTUFDSElORV9TVEFSVChPVE9NLCAiTmV4IFZpc2lvbiAtIE90b20gMS4xIikKKyAgICAgTUFJTlRBSU5FUigiR3VpbGxhdW1lIEdPVVJBVCA8Z3VpbGxhdW1lLmdvdXJhdEBuZXh2aXNpb24udHY+IikKKyAgICAgQk9PVF9NRU0oUzNDMjQxMF9TRFJBTV9QQSwgUzNDMjQxMF9QQV9VQVJULCAodTMyKVMzQzI0WFhfVkFfVUFSVCkKKyAgICAgQk9PVF9QQVJBTVMoUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwKQorCS5tYXBfaW8JCT0gb3RvbTExX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXJ4MzcxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDNhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBodHRwOi8vd3d3LmhhbmRoZWxkcy5vcmcvcHJvamVjdHMvcngzNzE1Lmh0bWwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKgkxNi1TZXAtMjAwNCBCSkQgIENvcGllZCBmcm9tIG1hY2gtaDE5NDAuYworICoJMjUtT2N0LTIwMDQgQkpEICBVcGRhdGVzIGZvciAyLjYuMTAtcmMxCisgKgkxMC1KYW4tMjAwNSBCSkQgIFJlbW92ZWQgaW5jbHVkZSBvZiBzM2MyNDEwLmggczNjMjQ0MC5oCisgKgkxNC1KYW4tMjAwNSBCSkQgIEFkZGVkIG5ldyBjbG9jayBpbml0CisgKgkxMC1NYXItMjAwNSBMQ1ZSIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCisgKgkxNC1NYXItMjAwNSBCSkQgIEZpeGVkIF9faW9tZW0gd2FybmluZ3MKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb21kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJkZXZzLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAicG0uaCIKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyByeDM3MTVfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwkvKiBkdW1wIElTQSBzcGFjZSBzb21ld2hlcmUgdW51c2VkICovCisKKwl7ICh1MzIpUzNDMjRYWF9WQV9JU0FfV09SRCwgUzNDMjQxMF9DUzMsIFNaXzE2TSwgTVRfREVWSUNFIH0sCisJeyAodTMyKVMzQzI0WFhfVkFfSVNBX0JZVEUsIFMzQzI0MTBfQ1MzLCBTWl8xNk0sIE1UX0RFVklDRSB9LAorfTsKKworCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgcngzNzE1X3NlcmlhbF9jbG9ja3NbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCQk9ICJmY2xrIiwKKwkJLmRpdmlzb3IJPSAwLAorCQkubWluX2JhdWQJPSAwLAorCQkubWF4X2JhdWQJPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHJ4MzcxNV91YXJ0Y2Znc1tdID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMCwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gMHgzYzUsCisJCS51bGNvbgkgICAgID0gMHgwMywKKwkJLnVmY29uCSAgICAgPSAweDUxLAorCQkuY2xvY2tzCSAgICAgPSByeDM3MTVfc2VyaWFsX2Nsb2NrcywKKwkJLmNsb2Nrc19zaXplID0gQVJSQVlfU0laRShyeDM3MTVfc2VyaWFsX2Nsb2NrcyksCisJfSwKKwlbMV0gPSB7CisJCS5od3BvcnQJICAgICA9IDEsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IDB4M2M1LAorCQkudWxjb24JICAgICA9IDB4MDMsCisJCS51ZmNvbgkgICAgID0gMHgwMCwKKwkJLmNsb2NrcwkgICAgID0gcngzNzE1X3NlcmlhbF9jbG9ja3MsCisJCS5jbG9ja3Nfc2l6ZSA9IEFSUkFZX1NJWkUocngzNzE1X3NlcmlhbF9jbG9ja3MpLAorCX0sCisJLyogSVIgcG9ydCAqLworCVsyXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMiwKKwkJLnVhcnRfZmxhZ3MgID0gVVBGX0NPTlNfRkxPVywKKwkJLnVjb24JICAgICA9IDB4M2M1LAorCQkudWxjb24JICAgICA9IDB4NDMsCisJCS51ZmNvbgkgICAgID0gMHg1MSwKKwkJLmNsb2NrcwkgICAgID0gcngzNzE1X3NlcmlhbF9jbG9ja3MsCisJCS5jbG9ja3Nfc2l6ZSA9IEFSUkFZX1NJWkUocngzNzE1X3NlcmlhbF9jbG9ja3MpLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpyeDM3MTVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnMzY19kZXZpY2VfdXNiLAorCSZzM2NfZGV2aWNlX2xjZCwKKwkmczNjX2RldmljZV93ZHQsCisJJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2lpcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9ib2FyZCByeDM3MTVfYm9hcmQgX19pbml0ZGF0YSA9IHsKKwkuZGV2aWNlcyAgICAgICA9IHJ4MzcxNV9kZXZpY2VzLAorCS5kZXZpY2VzX2NvdW50ID0gQVJSQVlfU0laRShyeDM3MTVfZGV2aWNlcykKK307CisKK3ZvaWQgX19pbml0IHJ4MzcxNV9tYXBfaW8odm9pZCkKK3sKKwlzM2MyNHh4X2luaXRfaW8ocngzNzE1X2lvZGVzYywgQVJSQVlfU0laRShyeDM3MTVfaW9kZXNjKSk7CisJczNjMjR4eF9pbml0X2Nsb2NrcygxNjkzNDAwMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKHJ4MzcxNV91YXJ0Y2ZncywgQVJSQVlfU0laRShyeDM3MTVfdWFydGNmZ3MpKTsKKwlzM2MyNHh4X3NldF9ib2FyZCgmcngzNzE1X2JvYXJkKTsKK30KKwordm9pZCBfX2luaXQgcngzNzE1X2luaXRfaXJxKHZvaWQpCit7CisJczNjMjR4eF9pbml0X2lycSgpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBfX2luaXQgcngzNzE1X2luaXRfbWFjaGluZSh2b2lkKQoreworCXMzYzI0MTBfcG1faW5pdCgpOworfQorI2Vsc2UKKyNkZWZpbmUgcngzNzE1X2luaXRfbWFjaGluZSBOVUxMCisjZW5kaWYKKworTUFDSElORV9TVEFSVChSWDM3MTUsICJJUEFRLVJYMzcxNSIpCisgICAgIE1BSU5UQUlORVIoIkJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4iKQorICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQorICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCisgICAgIE1BUElPKHJ4MzcxNV9tYXBfaW8pCisgICAgIElOSVRJUlEocngzNzE1X2luaXRfaXJxKQorICAgICBJTklUX01BQ0hJTkUocngzNzE1X2luaXRfbWFjaGluZSkKKwkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhNGExNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRlMgRm9ydGgtU3lzdGVtZSBHbWJICisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICRJZDogbWFjaC1zbWRrMjQxMC5jLHYgMS4xIDIwMDQvMDUvMTEgMTQ6MTU6MzggbXBpZXRyZWsgRXhwICQKKyAqIEBBdXRob3I6IEpvbmFzIERpZXRzY2hlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQEhpc3Rvcnk6CisgKiBkZXJpdmVkIGZyb20gbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jLCB3cml0dGVuIGJ5CisgKiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogMTAtTWFyLTIwMDUgTENWUiAgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKworI2luY2x1ZGUgImRldnMuaCIKKyNpbmNsdWRlICJjcHUuaCIKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzbWRrMjQxMF9pb2Rlc2NbXSBfX2luaXRkYXRhID0geworICAvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9OworCisjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQKKyNkZWZpbmUgVUxDT04gUzNDMjQxMF9MQ09OX0NTOCB8IFMzQzI0MTBfTENPTl9QTk9ORSB8IFMzQzI0MTBfTENPTl9TVE9QQgorI2RlZmluZSBVRkNPTiBTM0MyNDEwX1VGQ09OX1JYVFJJRzggfCBTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHNtZGsyNDEwX3VhcnRjZmdzW10gPSB7CisJWzBdID0geworCQkuaHdwb3J0CSAgICAgPSAwLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSBVQ09OLAorCQkudWxjb24JICAgICA9IFVMQ09OLAorCQkudWZjb24JICAgICA9IFVGQ09OLAorCX0sCisJWzFdID0geworCQkuaHdwb3J0CSAgICAgPSAxLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSBVQ09OLAorCQkudWxjb24JICAgICA9IFVMQ09OLAorCQkudWZjb24JICAgICA9IFVGQ09OLAorCX0sCisJWzJdID0geworCQkuaHdwb3J0CSAgICAgPSAyLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSBVQ09OLAorCQkudWxjb24JICAgICA9IFVMQ09OLAorCQkudWZjb24JICAgICA9IFVGQ09OLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbWRrMjQxMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmczNjX2RldmljZV91c2IsCisJJnMzY19kZXZpY2VfbGNkLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaWlzLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X2JvYXJkIHNtZGsyNDEwX2JvYXJkIF9faW5pdGRhdGEgPSB7CisJLmRldmljZXMgICAgICAgPSBzbWRrMjQxMF9kZXZpY2VzLAorCS5kZXZpY2VzX2NvdW50ID0gQVJSQVlfU0laRShzbWRrMjQxMF9kZXZpY2VzKQorfTsKKwordm9pZCBfX2luaXQgc21kazI0MTBfbWFwX2lvKHZvaWQpCit7CisJczNjMjR4eF9pbml0X2lvKHNtZGsyNDEwX2lvZGVzYywgQVJSQVlfU0laRShzbWRrMjQxMF9pb2Rlc2MpKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhzbWRrMjQxMF91YXJ0Y2ZncywgQVJSQVlfU0laRShzbWRrMjQxMF91YXJ0Y2ZncykpOworCXMzYzI0eHhfc2V0X2JvYXJkKCZzbWRrMjQxMF9ib2FyZCk7Cit9CisKK3ZvaWQgX19pbml0IHNtZGsyNDEwX2luaXRfaXJxKHZvaWQpCit7CisJczNjMjR4eF9pbml0X2lycSgpOworfQorCitNQUNISU5FX1NUQVJUKFNNREsyNDEwLCAiU01ESzI0MTAiKSAvKiBAVE9ETzogcmVxdWVzdCBhIG5ldyBpZGVudGlmaWVyIGFuZCBzd2l0Y2gKKwkJCQkgICAgKiB0byBTTURLMjQxMCAqLworICAgICBNQUlOVEFJTkVSKCJKb25hcyBEaWV0c2NoZSIpCisgICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCisgICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKKyAgICAgTUFQSU8oc21kazI0MTBfbWFwX2lvKQorICAgICBJTklUSVJRKHNtZGsyNDEwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKK01BQ0hJTkVfRU5ECisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDQwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1NzE3NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDQwLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDQwLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBodHRwOi8vd3d3LmZsdWZmLm9yZy9iZW4vc21kazI0NDAvCisgKgorICogVGhhbmtzIHRvIERpbWl0eSBBbmRyaWMgYW5kIFRvbVRvbSBmb3IgdGhlIGxvYW4gb2YgYW4gU01ESzI0NDAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICoJMDEtTm92LTIwMDQgQkpEICAgSW5pdGlhbCB2ZXJzaW9uCisgKgkxMi1Ob3YtMjAwNCBCSkQgICBVcGRhdGVkIGZvciByZWxlYXNlCisgKgkwNC1KYW4tMjAwNSBCSkQgICBGaXhlcyBmb3IgcHJlLXJlbGVhc2UKKyAqCTIyLUZlYi0yMDA1IEJKRCAgIFVwZGF0ZWQgZm9yIDIuNi4xMS1yYzUgcmVsZXNhCisgKgkxMC1NYXItMjAwNSBMQ1ZSICBSZXBsYWNlZCBTM0MyNDEwX1ZBIGJ5IFMzQzI0WFhfVkEKKyAqCTE0LU1hci0yMDA1IEJKRAkgIHZvaWQgX19pb21lbSBmaXhlcworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworLy8jaW5jbHVkZSA8YXNtL2RlYnVnLWxsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pZGxlLmg+CisKKyNpbmNsdWRlICJzM2MyNDEwLmgiCisjaW5jbHVkZSAiczNjMjQ0MC5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiZGV2cy5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInBtLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgc21kazI0NDBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwkvKiBJU0EgSU8gU3BhY2UgbWFwIChtZW1vcnkgc3BhY2Ugc2VsZWN0ZWQgYnkgQTI0KSAqLworCisJeyAodTMyKVMzQzI0WFhfVkFfSVNBX1dPUkQsIFMzQzI0MTBfQ1MyLCBTWl8xNk0sIE1UX0RFVklDRSB9LAorCXsgKHUzMilTM0MyNFhYX1ZBX0lTQV9CWVRFLCBTM0MyNDEwX0NTMiwgU1pfMTZNLCBNVF9ERVZJQ0UgfSwKK307CisKKyNkZWZpbmUgVUNPTiBTM0MyNDEwX1VDT05fREVGQVVMVCB8IFMzQzI0MTBfVUNPTl9VQ0xLCisjZGVmaW5lIFVMQ09OIFMzQzI0MTBfTENPTl9DUzggfCBTM0MyNDEwX0xDT05fUE5PTkUgfCBTM0MyNDEwX0xDT05fU1RPUEIKKyNkZWZpbmUgVUZDT04gUzNDMjQxMF9VRkNPTl9SWFRSSUc4IHwgUzNDMjQxMF9VRkNPTl9GSUZPTU9ERQorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBzbWRrMjQ0MF91YXJ0Y2Znc1tdID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMCwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gMHgzYzUsCisJCS51bGNvbgkgICAgID0gMHgwMywKKwkJLnVmY29uCSAgICAgPSAweDUxLAorCX0sCisJWzFdID0geworCQkuaHdwb3J0CSAgICAgPSAxLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSAweDNjNSwKKwkJLnVsY29uCSAgICAgPSAweDAzLAorCQkudWZjb24JICAgICA9IDB4NTEsCisJfSwKKwkvKiBJUiBwb3J0ICovCisJWzJdID0geworCQkuaHdwb3J0CSAgICAgPSAyLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSAweDNjNSwKKwkJLnVsY29uCSAgICAgPSAweDQzLAorCQkudWZjb24JICAgICA9IDB4NTEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGsyNDQwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfZGV2aWNlX3VzYiwKKwkmczNjX2RldmljZV9sY2QsCisJJnMzY19kZXZpY2Vfd2R0LAorCSZzM2NfZGV2aWNlX2kyYywKKwkmczNjX2RldmljZV9paXMsCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfYm9hcmQgc21kazI0NDBfYm9hcmQgX19pbml0ZGF0YSA9IHsKKwkuZGV2aWNlcyAgICAgICA9IHNtZGsyNDQwX2RldmljZXMsCisJLmRldmljZXNfY291bnQgPSBBUlJBWV9TSVpFKHNtZGsyNDQwX2RldmljZXMpCit9OworCit2b2lkIF9faW5pdCBzbWRrMjQ0MF9tYXBfaW8odm9pZCkKK3sKKwlzM2MyNHh4X2luaXRfaW8oc21kazI0NDBfaW9kZXNjLCBBUlJBWV9TSVpFKHNtZGsyNDQwX2lvZGVzYykpOworCXMzYzI0eHhfaW5pdF9jbG9ja3MoMTY5MzQ0MDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhzbWRrMjQ0MF91YXJ0Y2ZncywgQVJSQVlfU0laRShzbWRrMjQ0MF91YXJ0Y2ZncykpOworCXMzYzI0eHhfc2V0X2JvYXJkKCZzbWRrMjQ0MF9ib2FyZCk7Cit9CisKK3ZvaWQgX19pbml0IHNtZGsyNDQwX21hY2hpbmVfaW5pdCh2b2lkKQoreworCS8qIENvbmZpZ3VyZSB0aGUgTEVEcyAoZXZlbiBpZiB3ZSBoYXZlIG5vIExFRCBzdXBwb3J0KSovCisKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BGNCwgUzNDMjQxMF9HUEY0X09VVFApOworCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEY1LCBTM0MyNDEwX0dQRjVfT1VUUCk7CisJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRjYsIFMzQzI0MTBfR1BGNl9PVVRQKTsKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BGNywgUzNDMjQxMF9HUEY3X09VVFApOworCisJczNjMjQxMF9ncGlvX3NldHBpbihTM0MyNDEwX0dQRjQsIDApOworCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEY1LCAwKTsKKwlzM2MyNDEwX2dwaW9fc2V0cGluKFMzQzI0MTBfR1BGNiwgMCk7CisJczNjMjQxMF9ncGlvX3NldHBpbihTM0MyNDEwX0dQRjcsIDApOworCisJczNjMjQxMF9wbV9pbml0KCk7Cit9CisKK01BQ0hJTkVfU1RBUlQoUzNDMjQ0MCwgIlNNREsyNDQwIikKKwlNQUlOVEFJTkVSKCJCZW4gRG9va3MgPGJlbkBmbHVmZi5vcmc+IikKKwlCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQorCUJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKKworCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCisJLm1hcF9pbwkJPSBzbWRrMjQ0MF9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IHNtZGsyNDQwX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTEyMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBNYWNoaW5lIHN1cHBvcnQgZm9yIFRob3Jjb20gVlIxMDAwIGJvYXJkLiBEZXNpZ25lZCBmb3IgVGhvcmNvbSBieQorICogU2ltdGVjIEVsZWN0cm9uaWNzLCBodHRwOi8vd3d3LnNpbXRlYy5jby51ay8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiAgICAgMTQtU2VwLTIwMDQgQkpEICBVU0IgUG93ZXIgY29udHJvbAorICogICAgIDA0LVNlcC0yMDA0IEJKRCAgQWRkZWQgbmV3IHVhcnQgaW5pdCwgYW5kIGlvIGluaXQKKyAqICAgICAyMS1BdWctMjAwNCBCSkQgIEFkZGVkIHN0cnVjdCBzM2MyNDEwX2JvYXJkCisgKiAgICAgMDYtQXVnLTIwMDQgQkpEICBGaXhlZCBjYWxsIHRvIHRpbWUgaW5pdGlhbGlzYXRpb24KKyAqICAgICAwNS1BcHItMjAwNCBCSkQgIENvcGllZCB0byBtYWtlIG1hY2gtdnIxMDAwLmMKKyAqICAgICAxOC1PY3QtMjAwNCBCSkQgIFVwZGF0ZWQgYm9hcmQgc3RydWN0CisgKiAgICAgMDQtTm92LTIwMDQgQkpEICBDbG9jayBhbmQgc2VyaWFsIGNvbmZpZ3VyYXRpb24gdXBkYXRlCisgKgorICogICAgIDA0LUphbi0yMDA1IEJKRCAgVXBkYXRlZCB1YXJ0IGluaXQgY2FsbAorICogICAgIDEwLUphbi0yMDA1IEJKRCAgUmVtb3ZlZCBpbmNsdWRlIG9mIHMzYzI0MTAuaAorICogICAgIDE0LUphbi0yMDA1IEJKRCAgQWRkZWQgY2xvY2sgaW5pdAorICogICAgIDE1LUphbi0yMDA1IEJKRCAgQWRkIHNlcmlhbCBwb3J0IGRldmljZSBkZWZpbml0aW9uCisgKiAgICAgMjAtSmFuLTIwMDUgQkpEICBVc2UgVVBGX0lPUkVNQVAgZm9yIHBvcnRzCisgKiAgICAgMTAtRmViLTIwMDUgQkpEICBBZGRlZCBwb3dlci1vZmYgY2FwYWJpbGl0eQorICogICAgIDEwLU1hci0yMDA1IExDVlIgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKKyAqICAgICAxNC1NYXItMjAwNiBCSkQgIHZvaWQgX19pb21lbSBmaXhlcworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9iYXN0LW1hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3ZyMTAwMC1tYXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC92cjEwMDAtaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdnIxMDAwLWNwbGQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiZGV2cy5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInVzYi1zaW10ZWMuaCIKKworLyogbWFjcm9zIGZvciB2aXJ0dWFsIGFkZHJlc3MgbW9kcyBmb3IgdGhlIGlvIHNwYWNlIGVudHJpZXMgKi8KKyNkZWZpbmUgVkFfQzUoaXRlbSkgKCh1bnNpZ25lZCBsb25nKShpdGVtKSArIEJBU1RfVkFNX0NTNSkKKyNkZWZpbmUgVkFfQzQoaXRlbSkgKCh1bnNpZ25lZCBsb25nKShpdGVtKSArIEJBU1RfVkFNX0NTNCkKKyNkZWZpbmUgVkFfQzMoaXRlbSkgKCh1bnNpZ25lZCBsb25nKShpdGVtKSArIEJBU1RfVkFNX0NTMykKKyNkZWZpbmUgVkFfQzIoaXRlbSkgKCh1bnNpZ25lZCBsb25nKShpdGVtKSArIEJBU1RfVkFNX0NTMikKKworLyogbWFjcm9zIHRvIG1vZGlmeSB0aGUgcGh5c2ljYWwgYWRkcmVzc2VzIGZvciBpbyBzcGFjZSAqLworCisjZGVmaW5lIFBBX0NTMihpdGVtKSAoKGl0ZW0pICsgUzNDMjQxMF9DUzIpCisjZGVmaW5lIFBBX0NTMyhpdGVtKSAoKGl0ZW0pICsgUzNDMjQxMF9DUzMpCisjZGVmaW5lIFBBX0NTNChpdGVtKSAoKGl0ZW0pICsgUzNDMjQxMF9DUzQpCisjZGVmaW5lIFBBX0NTNShpdGVtKSAoKGl0ZW0pICsgUzNDMjQxMF9DUzUpCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdnIxMDAwX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgIC8qIElTQSBJTyBhcmVhcyAqLworCisgIHsgKHUzMilTM0MyNFhYX1ZBX0lTQV9CWVRFLCBQQV9DUzIoQkFTVF9QQV9JU0FJTyksCSAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisgIHsgKHUzMilTM0MyNFhYX1ZBX0lTQV9XT1JELCBQQV9DUzMoQkFTVF9QQV9JU0FJTyksCSAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisKKyAgLyogd2UgY291bGQgcG9zc2libHkgY29tcHJlc3MgdGhlIG5leHQgc2V0IGRvd24gaW50byBhIHNldCBvZiBzbWFsbGVyIHRhYmxlcworICAgKiBwYWdldGFibGVzLCBidXQgdGhhdCB3b3VsZCBtZWFuIHVzaW5nIGFuIEwyIHNlY3Rpb24sIGFuZCBpdCBzdGlsbCBtZWFucworICAgKiB3ZSBjYW5ub3QgYWN0dWFsbHkgZmVlZCB0aGUgc2FtZSByZWdpc3RlciB0byBhbiBMRFIgZHVlIHRvIDE2SyBzcGFjaW5nCisgICAqLworCisgIC8qIGJhc3QgQ1BMRCBjb250cm9sIHJlZ2lzdGVycywgYW5kIGV4dGVybmFsIGludGVycnVwdCBjb250cm9scyAqLworICB7ICh1MzIpVlIxMDAwX1ZBX0NUUkwxLCBWUjEwMDBfUEFfQ1RSTDEsCSAgICAgICBTWl8xTSwgTVRfREVWSUNFIH0sCisgIHsgKHUzMilWUjEwMDBfVkFfQ1RSTDIsIFZSMTAwMF9QQV9DVFJMMiwJICAgICAgIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyAodTMyKVZSMTAwMF9WQV9DVFJMMywgVlIxMDAwX1BBX0NUUkwzLAkgICAgICAgU1pfMU0sIE1UX0RFVklDRSB9LAorICB7ICh1MzIpVlIxMDAwX1ZBX0NUUkw0LCBWUjEwMDBfUEFfQ1RSTDQsCSAgICAgICBTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAgLyogcGVyaXBoZXJhbCBzcGFjZS4uLiBvbmUgZm9yIGVhY2ggb2YgZmFzdC9zbG93L2J5dGUvMTZiaXQgKi8KKyAgLyogbm90ZSwgaWRlIGlzIG9ubHkgZGVjb2RlZCBpbiB3b3JkIHNwYWNlLCBldmVuIHRob3VnaCBzb21lIHJlZ2lzdGVycworICAgKiBhcmUgb25seSA4Yml0ICovCisKKyAgLyogc2xvdywgYnl0ZSAqLworICB7IFZBX0MyKFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1MyKFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzIoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMihWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTMyhWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0MyKFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMihWUjEwMDBfVkFfSURFU0VDQVVYKSwgUEFfQ1MzKFZSMTAwMF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAgLyogc2xvdywgd29yZCAqLworICB7IFZBX0MzKFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1MzKFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzMoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMyhWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTMyhWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0MzKFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DMyhWUjEwMDBfVkFfSURFU0VDQVVYKSwgUEFfQ1MzKFZSMTAwMF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAgLyogZmFzdCwgYnl0ZSAqLworICB7IFZBX0M0KFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1M0KFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzQoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNChWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTNShWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0M0KFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNChWUjEwMDBfVkFfSURFU0VDQVVYKSwgUEFfQ1M1KFZSMTAwMF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAgLyogZmFzdCwgd29yZCAqLworICB7IFZBX0M1KFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1M1KFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCisgIHsgVkFfQzUoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNShWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTNShWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAorICB7IFZBX0M1KFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyBWQV9DNShWUjEwMDBfVkFfSURFU0VDQVVYKSwgUEFfQ1M1KFZSMTAwMF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCit9OworCisjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1VDT05fVUNMSworI2RlZmluZSBVTENPTiBTM0MyNDEwX0xDT05fQ1M4IHwgUzNDMjQxMF9MQ09OX1BOT05FIHwgUzNDMjQxMF9MQ09OX1NUT1BCCisjZGVmaW5lIFVGQ09OIFMzQzI0MTBfVUZDT05fUlhUUklHOCB8IFMzQzI0MTBfVUZDT05fRklGT01PREUKKworLyogdWFydCBjbG9jayBzb3VyY2UocykgKi8KKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjIHZyMTAwMF9zZXJpYWxfY2xvY2tzW10gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAidWNsayIsCisJCS5kaXZpc29yCT0gMSwKKwkJLm1pbl9iYXVkCT0gMCwKKwkJLm1heF9iYXVkCT0gMCwKKwl9LAorCVsxXSA9IHsKKwkJLm5hbWUJCT0gInBjbGsiLAorCQkuZGl2aXNvcgk9IDEsCisJCS5taW5fYmF1ZAk9IDAsCisJCS5tYXhfYmF1ZAk9IDAuCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgdnIxMDAwX3VhcnRjZmdzW10gPSB7CisJWzBdID0geworCQkuaHdwb3J0CSAgICAgPSAwLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSBVQ09OLAorCQkudWxjb24JICAgICA9IFVMQ09OLAorCQkudWZjb24JICAgICA9IFVGQ09OLAorCQkuY2xvY2tzCSAgICAgPSB2cjEwMDBfc2VyaWFsX2Nsb2NrcywKKwkJLmNsb2Nrc19zaXplID0gQVJSQVlfU0laRSh2cjEwMDBfc2VyaWFsX2Nsb2NrcyksCisJfSwKKwlbMV0gPSB7CisJCS5od3BvcnQJICAgICA9IDEsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IFVDT04sCisJCS51bGNvbgkgICAgID0gVUxDT04sCisJCS51ZmNvbgkgICAgID0gVUZDT04sCisJCS5jbG9ja3MJICAgICA9IHZyMTAwMF9zZXJpYWxfY2xvY2tzLAorCQkuY2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKHZyMTAwMF9zZXJpYWxfY2xvY2tzKSwKKwl9LAorCS8qIHBvcnQgMiBpcyBub3QgYWN0dWFsbHkgdXNlZCAqLworCVsyXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMiwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwkJLmNsb2NrcwkgICAgID0gdnIxMDAwX3NlcmlhbF9jbG9ja3MsCisJCS5jbG9ja3Nfc2l6ZSA9IEFSUkFZX1NJWkUodnIxMDAwX3NlcmlhbF9jbG9ja3MpLAorCisJfQorfTsKKworLyogZGVmaW5pdGlvbnMgZm9yIHRoZSB2cjEwMDAgZXh0cmEgMTY1NTAgc2VyaWFsIHBvcnRzICovCisKKyNkZWZpbmUgVlIxMDAwX0JBVURCQVNFICgzNjkyMzA3KQorCisjZGVmaW5lIFZSMTAwMF9TRVJJQUxfTUFQQkFTRSh4KSAoVlIxMDAwX1BBX1NFUklBTCArIDB4ODAgKyAoKHgpIDw8IDUpKQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CisJWzBdID0geworCQkubWFwYmFzZQk9IFZSMTAwMF9TRVJJQUxfTUFQQkFTRSgwKSwKKwkJLmlycQkJPSBJUlFfVlIxMDAwX1NFUklBTCArIDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAwLAorCQkudWFydGNsawk9IFZSMTAwMF9CQVVEQkFTRSwKKwl9LAorCVsxXSA9IHsKKwkJLm1hcGJhc2UJPSBWUjEwMDBfU0VSSUFMX01BUEJBU0UoMSksCisJCS5pcnEJCT0gSVJRX1ZSMTAwMF9TRVJJQUwgKyAxLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMCwKKwkJLnVhcnRjbGsJPSBWUjEwMDBfQkFVREJBU0UsCisJfSwKKwlbMl0gPSB7CisJCS5tYXBiYXNlCT0gVlIxMDAwX1NFUklBTF9NQVBCQVNFKDIpLAorCQkuaXJxCQk9IElSUV9WUjEwMDBfU0VSSUFMICsgMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVAsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDAsCisJCS51YXJ0Y2xrCT0gVlIxMDAwX0JBVURCQVNFLAorCX0sCisJWzNdID0geworCQkubWFwYmFzZQk9IFZSMTAwMF9TRVJJQUxfTUFQQkFTRSgzKSwKKwkJLmlycQkJPSBJUlFfVlIxMDAwX1NFUklBTCArIDMsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAwLAorCQkudWFydGNsawk9IFZSMTAwMF9CQVVEQkFTRSwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDAsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCisvKiBNVEQgTk9SIEZsYXNoICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdnIxMDAwX25vcl9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUzNDMjQxMF9DUzEgKyAweDQwMDAwMDAsCisJCS5lbmQJPSBTM0MyNDEwX0NTMSArIDB4NDAwMDAwMCArIFNaXzE2TSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZyMTAwMF9ub3IgPSB7CisJLm5hbWUJCT0gImJhc3Qtbm9yIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHZyMTAwMF9ub3JfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHZyMTAwMF9ub3JfcmVzb3VyY2UsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp2cjEwMDBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnMzY19kZXZpY2VfdXNiLAorCSZzM2NfZGV2aWNlX2xjZCwKKwkmczNjX2RldmljZV93ZHQsCisJJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2lpcywKKwkmc2VyaWFsX2RldmljZSwKKwkmdnIxMDAwX25vciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICp2cjEwMDBfY2xvY2tzW10gPSB7CisJJnMzYzI0eHhfZGNsazAsCisJJnMzYzI0eHhfZGNsazEsCisJJnMzYzI0eHhfY2xrb3V0MCwKKwkmczNjMjR4eF9jbGtvdXQxLAorCSZzM2MyNHh4X3VjbGssCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfYm9hcmQgdnIxMDAwX2JvYXJkIF9faW5pdGRhdGEgPSB7CisJLmRldmljZXMgICAgICAgPSB2cjEwMDBfZGV2aWNlcywKKwkuZGV2aWNlc19jb3VudCA9IEFSUkFZX1NJWkUodnIxMDAwX2RldmljZXMpLAorCS5jbG9ja3MJICAgICAgID0gdnIxMDAwX2Nsb2NrcywKKwkuY2xvY2tzX2NvdW50ICA9IEFSUkFZX1NJWkUodnIxMDAwX2Nsb2NrcyksCit9OworCitzdGF0aWMgdm9pZCB2cjEwMDBfcG93ZXJfb2ZmKHZvaWQpCit7CisJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQQjksIFMzQzI0MTBfR1BCOV9PVVRQKTsKKwlzM2MyNDEwX2dwaW9fc2V0cGluKFMzQzI0MTBfR1BCOSwgMSk7Cit9CisKK3ZvaWQgX19pbml0IHZyMTAwMF9tYXBfaW8odm9pZCkKK3sKKwkvKiBpbml0aWFsaXNlIGNsb2NrIHNvdXJjZXMgKi8KKworCXMzYzI0eHhfZGNsazAucGFyZW50ID0gTlVMTDsKKwlzM2MyNHh4X2RjbGswLnJhdGUgICA9IDEyKjEwMDAqMTAwMDsKKworCXMzYzI0eHhfZGNsazEucGFyZW50ID0gTlVMTDsKKwlzM2MyNHh4X2RjbGsxLnJhdGUgICA9IDM2OTIzMDc7CisKKwlzM2MyNHh4X2Nsa291dDAucGFyZW50ICA9ICZzM2MyNHh4X2RjbGswOworCXMzYzI0eHhfY2xrb3V0MS5wYXJlbnQgID0gJnMzYzI0eHhfZGNsazE7CisKKwlzM2MyNHh4X3VjbGsucGFyZW50ICA9ICZzM2MyNHh4X2Nsa291dDE7CisKKwlwbV9wb3dlcl9vZmYgPSB2cjEwMDBfcG93ZXJfb2ZmOworCisJczNjMjR4eF9pbml0X2lvKHZyMTAwMF9pb2Rlc2MsIEFSUkFZX1NJWkUodnIxMDAwX2lvZGVzYykpOworCXMzYzI0eHhfaW5pdF9jbG9ja3MoMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKHZyMTAwMF91YXJ0Y2ZncywgQVJSQVlfU0laRSh2cjEwMDBfdWFydGNmZ3MpKTsKKwlzM2MyNHh4X3NldF9ib2FyZCgmdnIxMDAwX2JvYXJkKTsKKwl1c2Jfc2ltdGVjX2luaXQoKTsKK30KKwordm9pZCBfX2luaXQgdnIxMDAwX2luaXRfaXJxKHZvaWQpCit7CisJczNjMjR4eF9pbml0X2lycSgpOworfQorCitNQUNISU5FX1NUQVJUKFZSMTAwMCwgIlRob3Jjb20tVlIxMDAwIikKKyAgICAgTUFJTlRBSU5FUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpCisgICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCisgICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKKyAgICAgTUFQSU8odnIxMDAwX21hcF9pbykKKyAgICAgSU5JVElSUSh2cjEwMDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhNDhlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jCkBAIC0wLDAgKzEsNjcyIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNDEwIFBvd2VyIE1hbmFnZXIgKFN1c3BlbmQtVG8tUkFNKSBzdXBwb3J0CisgKgorICogU2VlIERvY3VtZW50YXRpb24vYXJtL1NhbXN1bmctUzNDMjRYWC9TdXNwZW5kLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBQYXJ0cyBiYXNlZCBvbiBhcmNoL2FybS9tYWNoLXB4YS9wbS5jCisgKgorICogVGhhbmtzIHRvIERpbWl0cnkgQW5kcmljIGZvciBkZWJ1Z2dpbmcKKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogICAgIDEwLU1hci0yMDA1IExDVlIgIENoYW5nZWQgUzNDMjQxMF9WQV9VQVJUIHRvIFMzQzI0WFhfVkFfVUFSVAorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLW1lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlICJwbS5oIgorCisvKiBmb3IgZXh0ZXJuYWwgdXNlICovCisKK3Vuc2lnbmVkIGxvbmcgczNjX3BtX2ZsYWdzOworCisvKiBjYWNoZSBmdW5jdGlvbnMgZnJvbSBhcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TICovCisKK2V4dGVybiB2b2lkIGFybTkyMF9mbHVzaF9rZXJuX2NhY2hlX2FsbCh2b2lkKTsKKworI2RlZmluZSBQRlggInMzYzI0eHgtcG06ICIKKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGNvcmVfc2F2ZVtdID0geworCVNBVkVfSVRFTShTM0MyNDEwX0xPQ0tUSU1FKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9DTEtDT04pLAorCisJLyogd2UgcmVzdG9yZSB0aGUgdGltaW5ncyBoZXJlLCB3aXRoIHRoZSBwcm92aXNvIHRoYXQgdGhlIGJvYXJkCisJICogYnJpbmdzIHRoZSBzeXN0ZW0gdXAgaW4gYW4gc2xvd2VyLCBvciBlcXVhbCBmcmVxdWVuY3kgc2V0dGluZworCSAqIHRvIHRoZSBvcmlnaW5hbCBzeXN0ZW0uCisJICoKKwkgKiBpZiB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoaXMsIHRoZW4gdGhpbmdzIGFyZSBnb2luZyB0byBnbyB2ZXJ5CisJICogd3JvbmcgaGVyZSwgYXMgd2UgbW9kaWZ5IHRoZSByZWZyZXNoIGFuZCBib3RoIHBsbCBzZXR0aW5ncy4KKwkgKi8KKworCVNBVkVfSVRFTShTM0MyNDEwX0JXU0NPTiksCisJU0FWRV9JVEVNKFMzQzI0MTBfQkFOS0NPTjApLAorCVNBVkVfSVRFTShTM0MyNDEwX0JBTktDT04xKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9CQU5LQ09OMiksCisJU0FWRV9JVEVNKFMzQzI0MTBfQkFOS0NPTjMpLAorCVNBVkVfSVRFTShTM0MyNDEwX0JBTktDT040KSwKKwlTQVZFX0lURU0oUzNDMjQxMF9CQU5LQ09ONSksCisKKwlTQVZFX0lURU0oUzNDMjQxMF9DTEtESVZOKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9NUExMQ09OKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9VUExMQ09OKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9DTEtTTE9XKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9SRUZSRVNIKSwKK307CisKKy8qIHRoaXMgbG90IHNob3VsZCBiZSByZWFsbHkgc2F2ZWQgYnkgdGhlIElSUSBjb2RlICovCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgaXJxX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzNDMjQxMF9FWFRJTlQwKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9FWFRJTlQxKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9FWFRJTlQyKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9FSU5GTFQwKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9FSU5GTFQxKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9FSU5GTFQyKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9FSU5GTFQzKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9FSU5UTUFTSyksCisJU0FWRV9JVEVNKFMzQzI0MTBfSU5UTVNLKQorfTsKKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGdwaW9fc2F2ZVtdID0geworCVNBVkVfSVRFTShTM0MyNDEwX0dQQUNPTiksCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BBREFUKSwKKworCVNBVkVfSVRFTShTM0MyNDEwX0dQQkNPTiksCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BCREFUKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9HUEJVUCksCisKKwlTQVZFX0lURU0oUzNDMjQxMF9HUENDT04pLAorCVNBVkVfSVRFTShTM0MyNDEwX0dQQ0RBVCksCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BDVVApLAorCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BEQ09OKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9HUEREQVQpLAorCVNBVkVfSVRFTShTM0MyNDEwX0dQRFVQKSwKKworCVNBVkVfSVRFTShTM0MyNDEwX0dQRUNPTiksCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BFREFUKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9HUEVVUCksCisKKwlTQVZFX0lURU0oUzNDMjQxMF9HUEZDT04pLAorCVNBVkVfSVRFTShTM0MyNDEwX0dQRkRBVCksCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BGVVApLAorCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BHQ09OKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9HUEdEQVQpLAorCVNBVkVfSVRFTShTM0MyNDEwX0dQR1VQKSwKKworCVNBVkVfSVRFTShTM0MyNDEwX0dQSENPTiksCisJU0FWRV9JVEVNKFMzQzI0MTBfR1BIREFUKSwKKwlTQVZFX0lURU0oUzNDMjQxMF9HUEhVUCksCisKKwlTQVZFX0lURU0oUzNDMjQxMF9EQ0xLQ09OKSwKK307CisKKyNpZmRlZiBDT05GSUdfUzNDMjQxMF9QTV9ERUJVRworCisjZGVmaW5lIFNBVkVfVUFSVCh2YSkgXAorCVNBVkVfSVRFTSgodmEpICsgUzNDMjQxMF9VTENPTiksIFwKKwlTQVZFX0lURU0oKHZhKSArIFMzQzI0MTBfVUNPTiksIFwKKwlTQVZFX0lURU0oKHZhKSArIFMzQzI0MTBfVUZDT04pLCBcCisJU0FWRV9JVEVNKCh2YSkgKyBTM0MyNDEwX1VNQ09OKSwgXAorCVNBVkVfSVRFTSgodmEpICsgUzNDMjQxMF9VQlJESVYpCisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSB1YXJ0X3NhdmVbXSA9IHsKKwlTQVZFX1VBUlQoUzNDMjRYWF9WQV9VQVJUMCksCisJU0FWRV9VQVJUKFMzQzI0WFhfVkFfVUFSVDEpLAorI2lmbmRlZiBDT05GSUdfQ1BVX1MzQzI0MDAKKwlTQVZFX1VBUlQoUzNDMjRYWF9WQV9VQVJUMiksCisjZW5kaWYKK307CisKKy8qIGRlYnVnCisgKgorICogd2Ugc2VuZCB0aGUgZGVidWcgdG8gcHJpbnRhc2NpaSgpIHRvIGFsbG93IGl0IHRvIGJlIHNlZW4gaWYgdGhlCisgKiBzeXN0ZW0gbmV2ZXIgd2FrZXMgdXAgZnJvbSB0aGUgc2xlZXAKKyovCisKK2V4dGVybiB2b2lkIHByaW50YXNjaWkoY29uc3QgY2hhciAqKTsKKworc3RhdGljIHZvaWQgcG1fZGJnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisJY2hhciBidWZmWzI1Nl07CisKKwl2YV9zdGFydCh2YSwgZm10KTsKKwl2c3ByaW50ZihidWZmLCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworCisJcHJpbnRhc2NpaShidWZmKTsKK30KKworc3RhdGljIHZvaWQgczNjMjQxMF9wbV9kZWJ1Z19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bXAgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0NPTik7CisKKwkvKiByZS1zdGFydCB1YXJ0IGNsb2NrcyAqLworCXRtcCB8PSBTM0MyNDEwX0NMS0NPTl9VQVJUMDsKKwl0bXAgfD0gUzNDMjQxMF9DTEtDT05fVUFSVDE7CisJdG1wIHw9IFMzQzI0MTBfQ0xLQ09OX1VBUlQyOworCisJX19yYXdfd3JpdGVsKHRtcCwgUzNDMjQxMF9DTEtDT04pOworCXVkZWxheSgxMCk7Cit9CisKKyNkZWZpbmUgREJHKGZtdC4uLikgcG1fZGJnKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZtdCkKKworI2RlZmluZSBzM2MyNDEwX3BtX2RlYnVnX2luaXQoKSBkbyB7IH0gd2hpbGUoMCkKKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIHVhcnRfc2F2ZVtdID0ge307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MTBfUE1fQ0hFQ0spICYmIENPTkZJR19TM0MyNDEwX1BNX0NIRUNLX0NIVU5LU0laRSAhPSAwCisKKy8qIHN1c3BlbmQgY2hlY2tpbmcgY29kZS4uLgorICoKKyAqIHRoaXMgbmV4dCBhcmVhIGRvZXMgYSBzZXQgb2YgY3JjIGNoZWNrcyBvdmVyIGFsbCB0aGUgaW5zdGFsbGVkCisgKiBtZW1vcnksIHNvIHRoZSBzeXN0ZW0gY2FuIHZlcmlmeSBpZiB0aGUgcmVzdW1lIHdhcyBvay4KKyAqCisgKiBDT05GSUdfUzNDMjQxMF9QTV9DSEVDS19DSFVOS1NJWkUgZGVmaW5lcyB0aGUgYmxvY2stc2l6ZSBmb3IgdGhlIENSQywKKyAqIGluY3JlYXNpbmcgaXQgd2lsbCBtZWFuIHRoYXQgdGhlIGFyZWEgY29ycnVwdGVkIHdpbGwgYmUgbGVzcyBlYXN5IHRvIHNwb3QsCisgKiBhbmQgcmVkdWNpbmcgdGhlIHNpemUgd2lsbCBjYXVzZSB0aGUgQ1JDIHNhdmUgYXJlYSB0byBncm93CisqLworCisjZGVmaW5lIENIRUNLX0NIVU5LU0laRSAoQ09ORklHX1MzQzI0MTBfUE1fQ0hFQ0tfQ0hVTktTSVpFICogMTAyNCkKKworc3RhdGljIHUzMiBjcmNfc2l6ZTsJLyogc2l6ZSBuZWVkZWQgZm9yIHRoZSBjcmMgYmxvY2sgKi8KK3N0YXRpYyB1MzIgKmNyY3M7CS8qIGFsbG9jYXRlZCBvdmVyIHN1c3BlbmQvcmVzdW1lICovCisKK3R5cGVkZWYgdTMyICoocnVuX2ZuX3QpKHN0cnVjdCByZXNvdXJjZSAqcHRyLCB1MzIgKmFyZyk7CisKKy8qIHMzYzI0MTBfcG1fcnVuX3JlcworICoKKyAqIGdvIHRob3J1Z2ggdGhlIGdpdmVuIHJlc291cmNlIGxpc3QsIGFuZCBsb29rIGZvciBzeXN0ZW0gcmFtCisqLworCitzdGF0aWMgdm9pZCBzM2MyNDEwX3BtX3J1bl9yZXMoc3RydWN0IHJlc291cmNlICpwdHIsIHJ1bl9mbl90IGZuLCB1MzIgKmFyZykKK3sKKwl3aGlsZSAocHRyICE9IE5VTEwpIHsKKwkJaWYgKHB0ci0+Y2hpbGQgIT0gTlVMTCkKKwkJCXMzYzI0MTBfcG1fcnVuX3JlcyhwdHItPmNoaWxkLCBmbiwgYXJnKTsKKworCQlpZiAoKHB0ci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgJiYKKwkJICAgIHN0cmNtcChwdHItPm5hbWUsICJTeXN0ZW0gUkFNIikgPT0gMCkgeworCQkJREJHKCJGb3VuZCBzeXN0ZW0gUkFNIGF0ICUwOGx4Li4lMDhseFxuIiwKKwkJCSAgICBwdHItPnN0YXJ0LCBwdHItPmVuZCk7CisJCQlhcmcgPSAoZm4pKHB0ciwgYXJnKTsKKwkJfQorCisJCXB0ciA9IHB0ci0+c2libGluZzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcG1fcnVuX3N5c3JhbShydW5fZm5fdCBmbiwgdTMyICphcmcpCit7CisJczNjMjQxMF9wbV9ydW5fcmVzKCZpb21lbV9yZXNvdXJjZSwgZm4sIGFyZyk7Cit9CisKK3N0YXRpYyB1MzIgKnMzYzI0MTBfcG1fY291bnRyYW0oc3RydWN0IHJlc291cmNlICpyZXMsIHUzMiAqdmFsKQoreworCXUzMiBzaXplID0gKHUzMikocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSsxOworCisJc2l6ZSArPSBDSEVDS19DSFVOS1NJWkUtMTsKKwlzaXplIC89IENIRUNLX0NIVU5LU0laRTsKKworCURCRygiQXJlYSAlMDhseC4uJTA4bHgsICVkIGJsb2Nrc1xuIiwgcmVzLT5zdGFydCwgcmVzLT5lbmQsIHNpemUpOworCisJKnZhbCArPSBzaXplICogc2l6ZW9mKHUzMik7CisJcmV0dXJuIHZhbDsKK30KKworLyogczNjMjQxMF9wbV9wcmVwYXJlX2NoZWNrCisgKgorICogcHJlcGFyZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBjcmVhdGluZyB0aGUgQ1JDcy4gVGhpcworICogbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZmluYWwgc2F2ZSwgYXMgaXQgd2lsbCByZXF1aXJlIG1lbW9yeQorICogYWxsb2NhdGluZywgYW5kIHRodXMgdG91Y2hpbmcgYml0cyBvZiB0aGUga2VybmVsIHdlIGRvIG5vdAorICoga25vdyBhYm91dC4KKyovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcG1fY2hlY2tfcHJlcGFyZSh2b2lkKQoreworCWNyY19zaXplID0gMDsKKworCXMzYzI0MTBfcG1fcnVuX3N5c3JhbShzM2MyNDEwX3BtX2NvdW50cmFtLCAmY3JjX3NpemUpOworCisJREJHKCJzM2MyNDEwX3BtX3ByZXBhcmVfY2hlY2s6ICV1IGNoZWNrcyBuZWVkZWRcbiIsIGNyY19zaXplKTsKKworCWNyY3MgPSBrbWFsbG9jKGNyY19zaXplKzQsIEdGUF9LRVJORUwpOworCWlmIChjcmNzID09IE5VTEwpCisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlZCBDUkMgc2F2ZSBhcmVhXG4iKTsKK30KKworc3RhdGljIHUzMiAqczNjMjQxMF9wbV9tYWtlY2hlY2soc3RydWN0IHJlc291cmNlICpyZXMsIHUzMiAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciwgbGVmdDsKKworCWZvciAoYWRkciA9IHJlcy0+c3RhcnQ7IGFkZHIgPCByZXMtPmVuZDsKKwkgICAgIGFkZHIgKz0gQ0hFQ0tfQ0hVTktTSVpFKSB7CisJCWxlZnQgPSByZXMtPmVuZCAtIGFkZHI7CisKKwkJaWYgKGxlZnQgPiBDSEVDS19DSFVOS1NJWkUpCisJCQlsZWZ0ID0gQ0hFQ0tfQ0hVTktTSVpFOworCisJCSp2YWwgPSBjcmMzMl9sZSh+MCwgcGh5c190b192aXJ0KGFkZHIpLCBsZWZ0KTsKKwkJdmFsKys7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworLyogczNjMjQxMF9wbV9jaGVja19zdG9yZQorICoKKyAqIGNvbXB1dGUgdGhlIENSQyB2YWx1ZXMgZm9yIHRoZSBtZW1vcnkgYmxvY2tzIGJlZm9yZSB0aGUgZmluYWwKKyAqIHNsZWVwLgorKi8KKworc3RhdGljIHZvaWQgczNjMjQxMF9wbV9jaGVja19zdG9yZSh2b2lkKQoreworCWlmIChjcmNzICE9IE5VTEwpCisJCXMzYzI0MTBfcG1fcnVuX3N5c3JhbShzM2MyNDEwX3BtX21ha2VjaGVjaywgY3Jjcyk7Cit9CisKKy8qIGluX3JlZ2lvbgorICoKKyAqIHJldHVybiBUUlVFIGlmIHRoZSBhcmVhIGRlZmluZWQgYnkgcHRyLi5wdHIrc2l6ZSBjb250YXRpbnMgdGhlCisgKiB3aGF0Li53aGF0K3doYXRzegorKi8KKworc3RhdGljIGlubGluZSBpbnQgaW5fcmVnaW9uKHZvaWQgKnB0ciwgaW50IHNpemUsIHZvaWQgKndoYXQsIHNpemVfdCB3aGF0c3opCit7CisJaWYgKCh3aGF0K3doYXRzeikgPCBwdHIpCisJCXJldHVybiAwOworCisJaWYgKHdoYXQgPiAocHRyK3NpemUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdTMyICpzM2MyNDEwX3BtX3J1bmNoZWNrKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgKnZhbCkKK3sKKwl2b2lkICpzYXZlX2F0ID0gcGh5c190b192aXJ0KHMzYzI0MTBfc2xlZXBfc2F2ZV9waHlzKTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsZWZ0OworCXZvaWQgKnB0cjsKKwl1MzIgY2FsYzsKKworCWZvciAoYWRkciA9IHJlcy0+c3RhcnQ7IGFkZHIgPCByZXMtPmVuZDsKKwkgICAgIGFkZHIgKz0gQ0hFQ0tfQ0hVTktTSVpFKSB7CisJCWxlZnQgPSByZXMtPmVuZCAtIGFkZHI7CisKKwkJaWYgKGxlZnQgPiBDSEVDS19DSFVOS1NJWkUpCisJCQlsZWZ0ID0gQ0hFQ0tfQ0hVTktTSVpFOworCisJCXB0ciA9IHBoeXNfdG9fdmlydChhZGRyKTsKKworCQlpZiAoaW5fcmVnaW9uKHB0ciwgbGVmdCwgY3JjcywgY3JjX3NpemUpKSB7CisJCQlEQkcoInNraXBwaW5nICUwOGx4LCBoYXMgY3JjIGJsb2NrIGluXG4iLCBhZGRyKTsKKwkJCWdvdG8gc2tpcF9jaGVjazsKKwkJfQorCisJCWlmIChpbl9yZWdpb24ocHRyLCBsZWZ0LCBzYXZlX2F0LCAzMio0ICkpIHsKKwkJCURCRygic2tpcHBpbmcgJTA4bHgsIGhhcyBzYXZlIGJsb2NrIGluXG4iLCBhZGRyKTsKKwkJCWdvdG8gc2tpcF9jaGVjazsKKwkJfQorCisJCS8qIGNhbGN1bGF0ZSBhbmQgY2hlY2sgdGhlIGNoZWNrc3VtICovCisKKwkJY2FsYyA9IGNyYzMyX2xlKH4wLCBwdHIsIGxlZnQpOworCQlpZiAoY2FsYyAhPSAqdmFsKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSZXN0b3JlIENSQyBlcnJvciBhdCAiCisJCQkgICAgICAgIiUwOGx4ICglMDh4IHZzICUwOHgpXG4iLCBhZGRyLCBjYWxjLCAqdmFsKTsKKworCQkJREJHKCJSZXN0b3JlIENSQyBlcnJvciBhdCAlMDhseCAoJTA4eCB2cyAlMDh4KVxuIiwKKwkJCSAgICBhZGRyLCBjYWxjLCAqdmFsKTsKKwkJfQorCisJc2tpcF9jaGVjazoKKwkJdmFsKys7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworLyogczNjMjQxMF9wbV9jaGVja19yZXN0b3JlCisgKgorICogY2hlY2sgdGhlIENSQ3MgYWZ0ZXIgdGhlIHJlc3RvcmUgZXZlbnQgYW5kIGZyZWUgdGhlIG1lbW9yeSB1c2VkCisgKiB0byBob2xkIHRoZW0KKyovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcG1fY2hlY2tfcmVzdG9yZSh2b2lkKQoreworCWlmIChjcmNzICE9IE5VTEwpIHsKKwkJczNjMjQxMF9wbV9ydW5fc3lzcmFtKHMzYzI0MTBfcG1fcnVuY2hlY2ssIGNyY3MpOworCQlrZnJlZShjcmNzKTsKKwkJY3JjcyA9IE5VTEw7CisJfQorfQorCisjZWxzZQorCisjZGVmaW5lIHMzYzI0MTBfcG1fY2hlY2tfcHJlcGFyZSgpIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBzM2MyNDEwX3BtX2NoZWNrX3Jlc3RvcmUoKSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgczNjMjQxMF9wbV9jaGVja19zdG9yZSgpICAgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLyogaGVscGVyIGZ1bmN0aW9ucyB0byBzYXZlIGFuZCByZXN0b3JlIHJlZ2lzdGVyIHN0YXRlICovCisKK3ZvaWQgczNjMjQxMF9wbV9kb19zYXZlKHN0cnVjdCBzbGVlcF9zYXZlICpwdHIsIGludCBjb3VudCkKK3sKKwlmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tLCBwdHIrKykgeworCQlwdHItPnZhbCA9IF9fcmF3X3JlYWRsKHB0ci0+cmVnKTsKKwkJREJHKCJzYXZlZCAlcCB2YWx1ZSAlMDhseFxuIiwgcHRyLT5yZWcsIHB0ci0+dmFsKTsKKwl9Cit9CisKKy8qIHMzYzI0MTBfcG1fZG9fcmVzdG9yZQorICoKKyAqIHJlc3RvcmUgdGhlIHN5c3RlbSBmcm9tIHRoZSBnaXZlbiBsaXN0IG9mIHNhdmVkIHJlZ2lzdGVycworICoKKyAqIE5vdGUsIHdlIGRvIG5vdCB1c2UgREJHKCkgaW4gaGVyZSwgYXMgdGhlIHN5c3RlbSBtYXkgbm90IGhhdmUKKyAqIHJlc3RvcmUgdGhlIFVBUlRzIHN0YXRlIHlldAorKi8KKwordm9pZCBzM2MyNDEwX3BtX2RvX3Jlc3RvcmUoc3RydWN0IHNsZWVwX3NhdmUgKnB0ciwgaW50IGNvdW50KQoreworCWZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0sIHB0cisrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJyZXN0b3JlICVwIChyZXN0b3JlICUwOGx4LCB3YXMgJTA4eClcbiIsCisJCSAgICAgICBwdHItPnJlZywgcHRyLT52YWwsIF9fcmF3X3JlYWRsKHB0ci0+cmVnKSk7CisKKwkJX19yYXdfd3JpdGVsKHB0ci0+dmFsLCBwdHItPnJlZyk7CisJfQorfQorCisvKiBzM2MyNDEwX3BtX2RvX3Jlc3RvcmVfY29yZQorICoKKyAqIHNpbWlsYXIgdG8gczNjMjQxMF9wbV9kb19yZXN0b3JlX2NvcmUKKyAqCisgKiBXQVJOSU5HOiBEbyBub3QgcHV0IGFueSBkZWJ1ZyBpbiBoZXJlIHRoYXQgbWF5IGVmZmVjdCBtZW1vcnkgb3IgdXNlCisgKiBwZXJpcGhlcmFscywgYXMgdGhpbmdzIG1heSBiZSBjaGFuZ2luZyEKKyovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcG1fZG9fcmVzdG9yZV9jb3JlKHN0cnVjdCBzbGVlcF9zYXZlICpwdHIsIGludCBjb3VudCkKK3sKKwlmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tLCBwdHIrKykgeworCQlfX3Jhd193cml0ZWwocHRyLT52YWwsIHB0ci0+cmVnKTsKKwl9Cit9CisKKy8qIHMzYzI0MTBfcG1fc2hvd19yZXN1bWVfaXJxcworICoKKyAqIHByaW50IGFueSBJUlFzIGFzc2VydGVkIGF0IHJlc3VtZSB0aW1lIChpZSwgd2Ugd29rZSBmcm9tKQorKi8KKworc3RhdGljIHZvaWQgczNjMjQxMF9wbV9zaG93X3Jlc3VtZV9pcnFzKGludCBzdGFydCwgdW5zaWduZWQgbG9uZyB3aGljaCwKKwkJCQkJdW5zaWduZWQgbG9uZyBtYXNrKQoreworCWludCBpOworCisJd2hpY2ggJj0gfm1hc2s7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDMxOyBpKyspIHsKKwkJaWYgKCh3aGljaCkgJiAoMUw8PGkpKSB7CisJCQlEQkcoIklSUSAlZCBhc3NlcnRlZCBhdCByZXN1bWVcbiIsIHN0YXJ0K2kpOworCQl9CisJfQorfQorCisvKiBzM2MyNDEwX3BtX2NoZWNrX3Jlc3VtZV9waW4KKyAqCisgKiBjaGVjayB0byBzZWUgaWYgdGhlIHBpbiBpcyBjb25maWd1cmVkIGNvcnJlY3RseSBmb3Igc2xlZXAgbW9kZSwgYW5kCisgKiBtYWtlIGFueSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgaWYgaXQgaXMgbm90CisqLworCitzdGF0aWMgdm9pZCBzM2MyNDEwX3BtX2NoZWNrX3Jlc3VtZV9waW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IGlycW9mZnMpCit7CisJdW5zaWduZWQgbG9uZyBpcnFzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHBpbnN0YXRlOworCWludCBpcnEgPSBzM2MyNDEwX2dwaW9fZ2V0aXJxKHBpbik7CisKKwlpZiAoaXJxb2ZmcyA8IDQpCisJCWlycXN0YXRlID0gczNjX2lycXdha2VfaW50bWFzayAmICgxTDw8aXJxb2Zmcyk7CisJZWxzZQorCQlpcnFzdGF0ZSA9IHMzY19pcnF3YWtlX2VpbnRtYXNrICYgKDFMPDxpcnFvZmZzKTsKKworCXBpbnN0YXRlID0gczNjMjQxMF9ncGlvX2dldGNmZyhwaW4pOworCXBpbnN0YXRlID4+PSBTM0MyNDEwX0dQSU9fT0ZGU0VUKHBpbikqMjsKKworCWlmICghaXJxc3RhdGUpIHsKKwkJaWYgKHBpbnN0YXRlID09IDB4MDIpCisJCQlEQkcoIkxlYXZpbmcgSVJRICVkIChwaW4gJWQpIGVuYWJsZWRcbiIsIGlycSwgcGluKTsKKwl9IGVsc2UgeworCQlpZiAocGluc3RhdGUgPT0gMHgwMikgeworCQkJREJHKCJEaXNhYmxpbmcgSVJRICVkIChwaW4gJWQpXG4iLCBpcnEsIHBpbik7CisJCQlzM2MyNDEwX2dwaW9fY2ZncGluKHBpbiwgMHgwMCk7CisJCX0KKwl9Cit9CisKKy8qIHMzYzI0MTBfcG1fY29uZmlndXJlX2V4dGludAorICoKKyAqIGNvbmZpZ3VyZSBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0IHBpbnMKKyovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcG1fY29uZmlndXJlX2V4dGludCh2b2lkKQoreworCWludCBwaW47CisKKwkvKiBmb3IgZWFjaCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0cyAoRUlOVDAuLkVJTlQxNSkgd2UKKwkgKiBuZWVkIHRvIGNoZWNrIHdldGhlciBpdCBpcyBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlLAorCSAqIGFuZCB0aGVuIGNvbmZpZ3VyZSBpdCBhcyBhbiBpbnB1dCBpZiBpdCBpcyBub3QKKwkqLworCisJZm9yIChwaW4gPSBTM0MyNDEwX0dQRjA7IHBpbiA8PSBTM0MyNDEwX0dQRjc7IHBpbisrKSB7CisJCXMzYzI0MTBfcG1fY2hlY2tfcmVzdW1lX3BpbihwaW4sIHBpbiAtIFMzQzI0MTBfR1BGMCk7CisJfQorCisJZm9yIChwaW4gPSBTM0MyNDEwX0dQRzA7IHBpbiA8PSBTM0MyNDEwX0dQRzc7IHBpbisrKSB7CisJCXMzYzI0MTBfcG1fY2hlY2tfcmVzdW1lX3BpbihwaW4sIChwaW4gLSBTM0MyNDEwX0dQRzApKzgpOworCX0KK30KKworI2RlZmluZSBhbnlfYWxsb3dlZChtYXNrLCBhbGxvdykgKCgobWFzaykgJiAoYWxsb3cpKSAhPSAoYWxsb3cpKQorCisvKiBzM2MyNDEwX3BtX2VudGVyCisgKgorICogY2VudHJhbCBjb250cm9sIGZvciBzbGVlcC9yZXN1bWUgcHJvY2VzcworKi8KKworc3RhdGljIGludCBzM2MyNDEwX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ3Nfc2F2ZVsxNl07CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkvKiBlbnN1cmUgdGhlIGRlYnVnIGlzIGluaXRpYWxpc2VkIChpZiBlbmFibGVkKSAqLworCisJczNjMjQxMF9wbV9kZWJ1Z19pbml0KCk7CisKKwlEQkcoInMzYzI0MTBfcG1fZW50ZXIoJWQpXG4iLCBzdGF0ZSk7CisKKwlpZiAoc3RhdGUgIT0gUE1fU1VTUEVORF9NRU0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyb3I6IG9ubHkgUE1fU1VTUEVORF9NRU0gc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbnl0aGluZyB0byB3YWtlLXVwIHdpdGguLi4gYmFkIHRoaW5ncyBzZWVtCisJICogdG8gaGFwcGVuIGlmIHlvdSBzdXNwZW5kIHdpdGggbm8gd2FrZXVwIChzeXN0ZW0gd2lsbCBvZnRlbgorCSAqIHJlcXVpcmUgYSBmdWxsIHBvd2VyLWN5Y2xlKQorCSovCisKKwlpZiAoIWFueV9hbGxvd2VkKHMzY19pcnF3YWtlX2ludG1hc2ssIHMzY19pcnF3YWtlX2ludGFsbG93KSAmJgorCSAgICAhYW55X2FsbG93ZWQoczNjX2lycXdha2VfZWludG1hc2ssIHMzY19pcnF3YWtlX2VpbnRhbGxvdykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gc291cmNlcyBlbmFibGVkIGZvciB3YWtlLXVwIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFib3J0aW5nIHNsZWVwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcHJlcGFyZSBjaGVjayBhcmVhIGlmIGNvbmZpZ3VyZWQgKi8KKworCXMzYzI0MTBfcG1fY2hlY2tfcHJlcGFyZSgpOworCisJLyogc3RvcmUgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIHJlY292ZXJ5IGJsb2NrICovCisKKwlzM2MyNDEwX3NsZWVwX3NhdmVfcGh5cyA9IHZpcnRfdG9fcGh5cyhyZWdzX3NhdmUpOworCisJREJHKCJzM2MyNDEwX3NsZWVwX3NhdmVfcGh5cz0weCUwOGx4XG4iLCBzM2MyNDEwX3NsZWVwX3NhdmVfcGh5cyk7CisKKwkvKiBlbnN1cmUgYXQgbGVhc3QgR0VTVEFUVVMzIGhhcyB0aGUgcmVzdW1lIGFkZHJlc3MgKi8KKworCV9fcmF3X3dyaXRlbCh2aXJ0X3RvX3BoeXMoczNjMjQxMF9jcHVfcmVzdW1lKSwgUzNDMjQxMF9HU1RBVFVTMyk7CisKKwlEQkcoIkdTVEFUVVMzIDB4JTA4eFxuIiwgX19yYXdfcmVhZGwoUzNDMjQxMF9HU1RBVFVTMykpOworCURCRygiR1NUQVRVUzQgMHglMDh4XG4iLCBfX3Jhd19yZWFkbChTM0MyNDEwX0dTVEFUVVM0KSk7CisKKwkvKiBzYXZlIGFsbCBuZWNlc3NhcnkgY29yZSByZWdpc3RlcnMgbm90IGNvdmVyZWQgYnkgdGhlIGRyaXZlcnMgKi8KKworCXMzYzI0MTBfcG1fZG9fc2F2ZShncGlvX3NhdmUsIEFSUkFZX1NJWkUoZ3Bpb19zYXZlKSk7CisJczNjMjQxMF9wbV9kb19zYXZlKGlycV9zYXZlLCBBUlJBWV9TSVpFKGlycV9zYXZlKSk7CisJczNjMjQxMF9wbV9kb19zYXZlKGNvcmVfc2F2ZSwgQVJSQVlfU0laRShjb3JlX3NhdmUpKTsKKwlzM2MyNDEwX3BtX2RvX3NhdmUodWFydF9zYXZlLCBBUlJBWV9TSVpFKHVhcnRfc2F2ZSkpOworCisJLyogc2V0IHRoZSBpcnEgY29uZmlndXJhdGlvbiBmb3Igd2FrZSAqLworCisJczNjMjQxMF9wbV9jb25maWd1cmVfZXh0aW50KCk7CisKKwlEQkcoInNsZWVwOiBpcnEgd2FrZXVwIG1hc2tzOiAlMDhseCwlMDhseFxuIiwKKwkgICAgczNjX2lycXdha2VfaW50bWFzaywgczNjX2lycXdha2VfZWludG1hc2spOworCisJX19yYXdfd3JpdGVsKHMzY19pcnF3YWtlX2ludG1hc2ssIFMzQzI0MTBfSU5UTVNLKTsKKwlfX3Jhd193cml0ZWwoczNjX2lycXdha2VfZWludG1hc2ssIFMzQzI0MTBfRUlOVE1BU0spOworCisJLyogYWNrIGFueSBvdXRzdGFuZGluZyBleHRlcm5hbCBpbnRlcnJ1cHRzIGJlZm9yZSB3ZSBnbyB0byBzbGVlcCAqLworCisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFMzQzI0MTBfRUlOVFBFTkQpLCBTM0MyNDEwX0VJTlRQRU5EKTsKKworCS8qIGZsdXNoIGNhY2hlIGJhY2sgdG8gcmFtICovCisKKwlhcm05MjBfZmx1c2hfa2Vybl9jYWNoZV9hbGwoKTsKKworCXMzYzI0MTBfcG1fY2hlY2tfc3RvcmUoKTsKKworCS8vIG5lZWQgdG8gbWFrZSBzb21lIGZvcm0gb2YgdGltZS1kZWx0YQorCisJLyogc2VuZCB0aGUgY3B1IHRvIHNsZWVwLi4uICovCisKKwlfX3Jhd193cml0ZWwoMHgwMCwgUzNDMjQxMF9DTEtDT04pOyAgLyogdHVybiBvZmYgY2xvY2tzIG92ZXIgc2xlZXAgKi8KKworCXMzYzI0MTBfY3B1X3N1c3BlbmQocmVnc19zYXZlKTsKKworCS8qIHVuc2V0IHRoZSByZXR1cm4tZnJvbS1zbGVlcCBmbGFnLCB0byBlbnN1cmUgcmVzZXQgKi8KKworCXRtcCA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfR1NUQVRVUzIpOworCXRtcCAmPSBTM0MyNDEwX0dTVEFUVVMyX09GRlJFU0VUOworCV9fcmF3X3dyaXRlbCh0bXAsIFMzQzI0MTBfR1NUQVRVUzIpOworCisJLyogcmVzdG9yZSB0aGUgc3lzdGVtIHN0YXRlICovCisKKwlzM2MyNDEwX3BtX2RvX3Jlc3RvcmVfY29yZShjb3JlX3NhdmUsIEFSUkFZX1NJWkUoY29yZV9zYXZlKSk7CisJczNjMjQxMF9wbV9kb19yZXN0b3JlKGdwaW9fc2F2ZSwgQVJSQVlfU0laRShncGlvX3NhdmUpKTsKKwlzM2MyNDEwX3BtX2RvX3Jlc3RvcmUoaXJxX3NhdmUsIEFSUkFZX1NJWkUoaXJxX3NhdmUpKTsKKwlzM2MyNDEwX3BtX2RvX3Jlc3RvcmUodWFydF9zYXZlLCBBUlJBWV9TSVpFKHVhcnRfc2F2ZSkpOworCisJczNjMjQxMF9wbV9kZWJ1Z19pbml0KCk7CisKKwkvKiBjaGVjayB3aGF0IGlycSAoaWYgYW55KSByZXN0b3JlZCB0aGUgc3lzdGVtICovCisKKwlEQkcoInBvc3Qgc2xlZXA6IElSUXMgMHglMDh4LCAweCUwOHhcbiIsCisJICAgIF9fcmF3X3JlYWRsKFMzQzI0MTBfU1JDUE5EKSwKKwkgICAgX19yYXdfcmVhZGwoUzNDMjQxMF9FSU5UUEVORCkpOworCisJczNjMjQxMF9wbV9zaG93X3Jlc3VtZV9pcnFzKElSUV9FSU5UMCwgX19yYXdfcmVhZGwoUzNDMjQxMF9TUkNQTkQpLAorCQkJCSAgICBzM2NfaXJxd2FrZV9pbnRtYXNrKTsKKworCXMzYzI0MTBfcG1fc2hvd19yZXN1bWVfaXJxcyhJUlFfRUlOVDQtNCwgX19yYXdfcmVhZGwoUzNDMjQxMF9FSU5UUEVORCksCisJCQkJICAgIHMzY19pcnF3YWtlX2VpbnRtYXNrKTsKKworCURCRygicG9zdCBzbGVlcCwgcHJlcGFyaW5nIHRvIHJldHVyblxuIik7CisKKwlzM2MyNDEwX3BtX2NoZWNrX3Jlc3RvcmUoKTsKKworCS8qIG9rLCBsZXQncyByZXR1cm4gZnJvbSBzbGVlcCAqLworCisJREJHKCJTM0MyNDEwIFBNIFJlc3VtZSAocG9zdC1yZXN0b3JlKVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgcHJvY2Vzc2VzIGFyZSBmcm96ZW4sIGJ1dCBiZWZvcmUgd2Ugc2h1dCBkb3duIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMF9wbV9wcmVwYXJlKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBkZXZpY2VzIGFyZSByZS1zZXR1cCwgYnV0IGJlZm9yZSBwcm9jZXNzZXMgYXJlIHRoYXdlZC4KKyAqLworc3RhdGljIGludCBzM2MyNDEwX3BtX2ZpbmlzaChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdG8gUE1fRElTS19GSVJNV0FSRSBzbyB3ZSBjYW4gcXVpY2tseSB2ZXRvIHN1c3BlbmQtdG8tZGlzay4KKyAqLworc3RhdGljIHN0cnVjdCBwbV9vcHMgczNjMjQxMF9wbV9vcHMgPSB7CisJLnBtX2Rpc2tfbW9kZQk9IFBNX0RJU0tfRklSTVdBUkUsCisJLnByZXBhcmUJPSBzM2MyNDEwX3BtX3ByZXBhcmUsCisJLmVudGVyCQk9IHMzYzI0MTBfcG1fZW50ZXIsCisJLmZpbmlzaAkJPSBzM2MyNDEwX3BtX2ZpbmlzaCwKK307CisKKy8qIHMzYzI0MTBfcG1faW5pdAorICoKKyAqIEF0dGFjaCB0aGUgcG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZAorICogZnJvbSB0aGUgYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gaWYgdGhlIGJvYXJkIHN1cHBvcnRzCisgKiBpdC4KKyovCisKK2ludCBfX2luaXQgczNjMjQxMF9wbV9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJTM0MyNDEwIFBvd2VyIE1hbmFnZW1lbnQsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIik7CisKKwlwbV9zZXRfb3BzKCZzM2MyNDEwX3BtX29wcyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0uaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNWU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0uaApAQCAtMCwwICsxLDU5IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCVdyaXR0ZW4gYnkgQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogczNjMjQxMF9wbV9pbml0CisgKgorICogY2FsbGVkIGZyb20gYm9hcmQgYXQgaW5pdGlhbGlzYXRpb24gdGltZSB0byBzZXR1cCB0aGUgcG93ZXIKKyAqIG1hbmFnZW1lbnQKKyovCisKKyNpZmRlZiBDT05GSUdfUE0KKworZXh0ZXJuIF9faW5pdCBpbnQgczNjMjQxMF9wbV9pbml0KHZvaWQpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBzM2MyNDEwX3BtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBjb25maWd1cmF0aW9uIGZvciB0aGUgSVJRIG1hc2sgb3ZlciBzbGVlcCAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgczNjX2lycXdha2VfaW50bWFzazsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHMzY19pcnF3YWtlX2VpbnRtYXNrOworCisvKiBJUlEgbWFza3MgZm9yIElSUXMgYWxsb3dlZCB0byBnbyB0byBzbGVlcCAoc2VlIGlycS5jKSAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgczNjX2lycXdha2VfaW50YWxsb3c7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzM2NfaXJxd2FrZV9laW50YWxsb3c7CisKKy8qIEZsYWdzIGZvciBQTSBDb250cm9sICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHMzY19wbV9mbGFnczsKKworLyogZnJvbSBzbGVlcC5TICovCisKK2V4dGVybiB2b2lkIHMzYzI0MTBfY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZyAqc2F2ZWJsayk7CitleHRlcm4gdm9pZCBzM2MyNDEwX2NwdV9yZXN1bWUodm9pZCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHMzYzI0MTBfc2xlZXBfc2F2ZV9waHlzOworCisvKiBzbGVlcCBzYXZlIGluZm8gKi8KKworc3RydWN0IHNsZWVwX3NhdmUgeworCXZvaWQgX19pb21lbQkqcmVnOworCXVuc2lnbmVkIGxvbmcJdmFsOworfTsKKworI2RlZmluZSBTQVZFX0lURU0oeCkgXAorCXsgLnJlZyA9ICh4KSB9CisKK2V4dGVybiB2b2lkIHMzYzI0MTBfcG1fZG9fc2F2ZShzdHJ1Y3Qgc2xlZXBfc2F2ZSAqcHRyLCBpbnQgY291bnQpOworZXh0ZXJuIHZvaWQgczNjMjQxMF9wbV9kb19yZXN0b3JlKHN0cnVjdCBzbGVlcF9zYXZlICpwdHIsIGludCBjb3VudCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJmMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYwpAQCAtMCwwICsxLDIwMCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL0VCMjQxMElUWC8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiAgICAgMTYtTWF5LTIwMDMgQkpEICBDcmVhdGVkIGluaXRpYWwgdmVyc2lvbgorICogICAgIDE2LUF1Zy0yMDAzIEJKRCAgRml4ZWQgaGVhZGVyIGZpbGVzIGFuZCBjb3B5cmlnaHQsIGFkZGVkIFVSTAorICogICAgIDA1LVNlcC0yMDAzIEJKRCAgTW92ZWQgdG8ga2VybmVsIHYyLjYKKyAqICAgICAxOC1KYW4tMjAwNCBCSkQgIEFkZGVkIHNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24KKyAqICAgICAyMS1BdWctMjAwNCBCSkQgIEFkZGVkIG5ldyBzdHJ1Y3QgczNjMjQxMF9ib2FyZCBoYW5kbGVyCisgKiAgICAgMjgtU2VwLTIwMDQgQkpEICBVcGRhdGVzIGZvciBuZXcgc2VyaWFsIHBvcnQgYml0cworICogICAgIDA0LU5vdi0yMDA0IEJKRCAgVXBkYXRlZCBVQVJUIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworICogICAgIDEwLUphbi0yMDA1IEJKRCAgUmVtb3ZlZCBzM2MyNDEwX2Nsb2NrX3RpY2tfcmF0ZQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CisKKyNpbmNsdWRlICJzM2MyNDEwLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKworLyogSW5pdGlhbCBJTyBtYXBwaW5ncyAqLworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHMzYzI0MTBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlJT0RFU0NfRU5UKFVTQkhPU1QpLAorCUlPREVTQ19FTlQoQ0xLUFdSKSwKKwlJT0RFU0NfRU5UKExDRCksCisJSU9ERVNDX0VOVChVQVJUKSwKKwlJT0RFU0NfRU5UKFRJTUVSKSwKKwlJT0RFU0NfRU5UKEFEQyksCisJSU9ERVNDX0VOVChXQVRDSERPRykKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3VhcnQwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1VBUlQwLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VBUlQwICsgMHgzZmZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgwLAorCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9CisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3VhcnQxX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1VBUlQxLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VBUlQxICsgMHgzZmZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgxLAorCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY191YXJ0Ml9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9VQVJUMiwKKwkJLmVuZCAgID0gUzNDMjQxMF9QQV9VQVJUMiArIDB4M2ZmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9TM0NVQVJUX1JYMiwKKwkJLmVuZCAgID0gSVJRX1MzQ1VBUlRfRVJSMiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworLyogb3VyIHVhcnQgZGV2aWNlcyAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfdWFydDAgPSB7CisJLm5hbWUJCSAgPSAiczNjMjQxMC11YXJ0IiwKKwkuaWQJCSAgPSAwLAorCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY191YXJ0MF9yZXNvdXJjZSksCisJLnJlc291cmNlCSAgPSBzM2NfdWFydDBfcmVzb3VyY2UsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY191YXJ0MSA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLXVhcnQiLAorCS5pZAkJICA9IDEsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3VhcnQxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY191YXJ0MV9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY191YXJ0MiA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLXVhcnQiLAorCS5pZAkJICA9IDIsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3VhcnQyX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY191YXJ0Ml9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp1YXJ0X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfdWFydDAsCisJJnMzY191YXJ0MSwKKwkmczNjX3VhcnQyCit9OworCisvKiBzdG9yZSBvdXIgdWFydCBkZXZpY2VzIGZvciB0aGUgc2VyaWFsIGRyaXZlciBjb25zb2xlICovCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzM2MyNDEwX3VhcnRfZGV2aWNlc1szXTsKKworc3RhdGljIGludCBzM2MyNDEwX3VhcnRfY291bnQgPSAwOworCisvKiB1YXJ0IHJlZ2lzdHJhdGlvbiBwcm9jZXNzICovCisKK3ZvaWQgX19pbml0IHMzYzI0MTBfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0ZGV2OworCWludCB1YXJ0OworCisJZm9yICh1YXJ0ID0gMDsgdWFydCA8IG5vOyB1YXJ0KyssIGNmZysrKSB7CisJCXBsYXRkZXYgPSB1YXJ0X2RldmljZXNbY2ZnLT5od3BvcnRdOworCisJCXMzYzI0eHhfdWFydF9kZXZzW3VhcnRdID0gcGxhdGRldjsKKwkJcGxhdGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBjZmc7CisJfQorCisJczNjMjQxMF91YXJ0X2NvdW50ID0gdWFydDsKK30KKworLyogczNjMjQxMF9tYXBfaW8KKyAqCisgKiByZWdpc3RlciB0aGUgc3RhbmRhcmQgY3B1IElPIGFyZWFzLCBhbmQgYW55IHBhc3NlZCBpbiBmcm9tIHRoZQorICogbWFjaGluZSBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbi4KKyovCisKK3ZvaWQgX19pbml0IHMzYzI0MTBfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgbWFjaF9zaXplKQoreworCS8qIHJlZ2lzdGVyIG91ciBpby10YWJsZXMgKi8KKworCWlvdGFibGVfaW5pdChzM2MyNDEwX2lvZGVzYywgQVJSQVlfU0laRShzM2MyNDEwX2lvZGVzYykpOworCWlvdGFibGVfaW5pdChtYWNoX2Rlc2MsIG1hY2hfc2l6ZSk7Cit9CisKK3ZvaWQgX19pbml0IHMzYzI0MTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBmY2xrOworCXVuc2lnbmVkIGxvbmcgaGNsazsKKwl1bnNpZ25lZCBsb25nIHBjbGs7CisKKwkvKiBub3cgd2UndmUgZ290IG91ciBtYWNoaW5lIGJpdHMgaW5pdGlhbGlzZWQsIHdvcmsgb3V0IHdoYXQKKwkgKiBjbG9ja3Mgd2UndmUgZ290ICovCisKKwlmY2xrID0gczNjMjQxMF9nZXRfcGxsKF9fcmF3X3JlYWRsKFMzQzI0MTBfTVBMTENPTiksIHh0YWwpOworCisJdG1wID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtESVZOKTsKKworCS8qIHdvcmsgb3V0IGNsb2NrIHNjYWxpbmdzICovCisKKwloY2xrID0gZmNsayAvICgodG1wICYgUzNDMjQxMF9DTEtESVZOX0hESVZOKSA/IDIgOiAxKTsKKwlwY2xrID0gaGNsayAvICgodG1wICYgUzNDMjQxMF9DTEtESVZOX1BESVZOKSA/IDIgOiAxKTsKKworCS8qIHByaW50IGJyaWVmdCBzdW1tYXJ5IG9mIGNsb2NrcywgZXRjICovCisKKwlwcmludGsoIlMzQzI0MTA6IGNvcmUgJWxkLiUwM2xkIE1IeiwgbWVtb3J5ICVsZC4lMDNsZCBNSHosIHBlcmlwaGVyYWwgJWxkLiUwM2xkIE1IelxuIiwKKwkgICAgICAgcHJpbnRfbWh6KGZjbGspLCBwcmludF9taHooaGNsayksIHByaW50X21oeihwY2xrKSk7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBjbG9ja3MgaGVyZSwgdG8gYWxsb3cgb3RoZXIgdGhpbmdzIGxpa2UgdGhlCisJICogY29uc29sZSB0byB1c2UgdGhlbQorCSAqLworCisJczNjMjR4eF9zZXR1cF9jbG9ja3MoeHRhbCwgZmNsaywgaGNsaywgcGNsayk7Cit9CisKK2ludCBfX2luaXQgczNjMjQxMF9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJTM0MyNDEwOiBJbml0aWFsaXNpbmcgYXJjaGl0ZWN0dXJlXG4iKTsKKworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzM2MyNHh4X3VhcnRfZGV2cywgczNjMjQxMF91YXJ0X2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNTMxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogSGVhZGVyIGZpbGUgZm9yIHMzYzI0MTAgbWFjaGluZSBkaXJlY3RvcnkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiAgICAgMTgtQXVnLTIwMDQgQkpEICBDcmVhdGVkIGluaXRpYWwgdmVyc2lvbgorICogICAgIDIwLUF1Zy0yMDA0IEJKRCAgQWRkZWQgczNjMjQxMF9ib2FyZCBzdHJ1Y3QKKyAqICAgICAwNC1TZXAtMjAwNCBCSkQgIEFkZGVkIHMzYzI0MTBfaW5pdF91YXJ0cygpIGNhbGwKKyAqICAgICAxNy1PY3QtMjAwNCBCSkQgIE1vdmVkIGJvYXJkIG91dCB0byBjcHUKKyAqICAgICAwNC1KYW4tMjAwNSBCSkQgIENoYW5nZWQgdWFydCBpbml0CisgKiAgICAgMTAtSmFuLTIwMDUgQkpEICBSZW1vdmVkIHRpbWVyIHRvIGNwdS5oLCBtb3ZlZCAyNDEwIHNwZWNpZmljIGJpdHMgaGVyZQorICogICAgIDE0LUphbi0yMDA1IEJKRCAgQWRkZWQgczNjMjQxMF9pbml0X2Nsb2NrcyBjYWxsCisqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEwCisKK2V4dGVybiAgaW50IHMzYzI0MTBfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMF9tYXBfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBzaXplKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNlbHNlCisjZGVmaW5lIHMzYzI0MTBfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzM2MyNDEwX2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzM2MyNDEwX21hcF9pbyBOVUxMCisjZGVmaW5lIHMzYzI0MTBfaW5pdCBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWRzYy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtZHNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmYTJhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWRzYy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWRzYy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTYW1zdW5nIFMzQzI0NDAgRHJpdmUgU3RyZW5ndGggQ29udHJvbCBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogICAgIDI5LUF1Zy0yMDA0IEJKRCAgU3RhcnQgb2YgZHJpdmUtc3RyZW5ndGggY29udHJvbAorICogICAgIDA5LU5vdi0yMDA0IEJKRCAgQWRkZWQgc3ltYm9sIGV4cG9ydAorICogICAgIDExLUphbi0yMDA1IEJKRCAgSW5jbHVkZSBmaXgKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZHNjLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJzM2MyNDQwLmgiCisKK2ludCBzM2MyNDQwX3NldF9kc2ModW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCWJhc2UgPSAocGluICYgUzNDMjQ0MF9TRUxFQ1RfRFNDMSkgPyBTM0MyNDQwX0RTQzEgOiBTM0MyNDQwX0RTQzA7CisJbWFzayA9IDMgPDwgUzNDMjQ0MF9EU0NfR0VUU0hJRlQocGluKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGJhc2UpOworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gdmFsdWUgJiBtYXNrOworCV9fcmF3X3dyaXRlbCh2YWwsIGJhc2UpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHMzYzI0NDBfc2V0X2RzYyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThjYzVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAuYwpAQCAtMCwwICsxLDI4MSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICogICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogU2Ftc3VuZyBTM0MyNDQwIE1vYmlsZSBDUFUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqCTI0LUF1Zy0yMDA0IEJKRCAgU3RhcnQgb2YgczNjMjQ0MCBzdXBwb3J0CisgKgkxMi1PY3QtMjAwNCBCSkQJIE1vdmVkIGNsb2NrIGluZm8gb3V0IHRvIGNsb2NrLmMKKyAqCTAxLU5vdi0yMDA0IEJKRCAgRml4ZWQgY2xvY2sgYnVpbGQgY29kZQorICoJMDktTm92LTIwMDQgQkpEICBBZGRlZCBzeXNkZXYgZm9yIHBvd2VyIG1hbmFnZW1lbnQKKyAqCTA0LU5vdi0yMDA0IEJKRCAgTmV3IHNlcmlhbCByZWdpc3RyYXRpb24KKyAqCTE1LU5vdi0yMDA0IEJKRCAgUmVuYW1lIHRoZSBpMmMgZGV2aWNlIGZvciB0aGUgczNjMjQ0MAorICoJMTQtSmFuLTIwMDUgQkpEICBNb3ZlZCBjbG9jayBpbml0IGNvZGUgaW50byBzZXBlcmF0ZSBmdW5jdGlvbgorICoJMTQtSmFuLTIwMDUgQkpEICBSZW1vdmVkIHVuLXVzZWQgY2xvY2sgYml0cworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvai5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZHNjLmg+CisKKyNpbmNsdWRlICJzM2MyNDQwLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJkZXZzLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAicG0uaCIKKworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHMzYzI0NDBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlJT0RFU0NfRU5UKFVTQkhPU1QpLAorCUlPREVTQ19FTlQoQ0xLUFdSKSwKKwlJT0RFU0NfRU5UKExDRCksCisJSU9ERVNDX0VOVChUSU1FUiksCisJSU9ERVNDX0VOVChBREMpLAorCUlPREVTQ19FTlQoV0FUQ0hET0cpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdWFydDBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfVUFSVDAsCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfVUFSVDAgKyAweDNmZmYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfUzNDVUFSVF9SWDAsCisJCS5lbmQgICA9IElSUV9TM0NVQVJUX0VSUjAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KKworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdWFydDFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfVUFSVDEsCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfVUFSVDEgKyAweDNmZmYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfUzNDVUFSVF9SWDEsCisJCS5lbmQgICA9IElSUV9TM0NVQVJUX0VSUjEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3VhcnQyX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1VBUlQyLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VBUlQyICsgMHgzZmZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgyLAorCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIyLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCisvKiBvdXIgdWFydCBkZXZpY2VzICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY191YXJ0MCA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDQwLXVhcnQiLAorCS5pZAkJICA9IDAsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3VhcnQwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY191YXJ0MF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY191YXJ0MSA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDQwLXVhcnQiLAorCS5pZAkJICA9IDEsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3VhcnQxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY191YXJ0MV9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY191YXJ0MiA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDQwLXVhcnQiLAorCS5pZAkJICA9IDIsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3VhcnQyX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY191YXJ0Ml9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp1YXJ0X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfdWFydDAsCisJJnMzY191YXJ0MSwKKwkmczNjX3VhcnQyCit9OworCisvKiB1YXJ0IGluaXRpYWxpc2F0aW9uICovCisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzM2MyNDQwX3VhcnRfY291bnQ7CisKK3ZvaWQgX19pbml0IHMzYzI0NDBfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0ZGV2OworCWludCB1YXJ0OworCisJZm9yICh1YXJ0ID0gMDsgdWFydCA8IG5vOyB1YXJ0KyssIGNmZysrKSB7CisJCXBsYXRkZXYgPSB1YXJ0X2RldmljZXNbY2ZnLT5od3BvcnRdOworCisJCXMzYzI0eHhfdWFydF9kZXZzW3VhcnRdID0gcGxhdGRldjsKKwkJcGxhdGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBjZmc7CisJfQorCisJczNjMjQ0MF91YXJ0X2NvdW50ID0gdWFydDsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0cnVjdCBzbGVlcF9zYXZlIHMzYzI0NDBfc2xlZXBbXSA9IHsKKwlTQVZFX0lURU0oUzNDMjQ0MF9EU0MwKSwKKwlTQVZFX0lURU0oUzNDMjQ0MF9EU0MxKSwKKwlTQVZFX0lURU0oUzNDMjQ0MF9HUEpEQVQpLAorCVNBVkVfSVRFTShTM0MyNDQwX0dQSkNPTiksCisJU0FWRV9JVEVNKFMzQzI0NDBfR1BKVVApCit9OworCitzdGF0aWMgaW50IHMzYzI0NDBfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJczNjMjQxMF9wbV9kb19zYXZlKHMzYzI0NDBfc2xlZXAsIEFSUkFZX1NJWkUoczNjMjQ0MF9zbGVlcCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0NDBfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJczNjMjQxMF9wbV9kb19yZXN0b3JlKHMzYzI0NDBfc2xlZXAsIEFSUkFZX1NJWkUoczNjMjQ0MF9zbGVlcCkpOworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBzM2MyNDQwX3N1c3BlbmQgTlVMTAorI2RlZmluZSBzM2MyNDQwX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzeXNkZXZfY2xhc3MgczNjMjQ0MF9zeXNjbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJzM2MyNDQwLWNvcmUiKSwKKwkuc3VzcGVuZAk9IHMzYzI0NDBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHMzYzI0NDBfcmVzdW1lCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgczNjMjQ0MF9zeXNkZXYgPSB7CisJLmNscwkJPSAmczNjMjQ0MF9zeXNjbGFzcywKK307CisKK3ZvaWQgX19pbml0IHMzYzI0NDBfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSkKK3sKKwkvKiByZWdpc3RlciBvdXIgaW8tdGFibGVzICovCisKKwlpb3RhYmxlX2luaXQoczNjMjQ0MF9pb2Rlc2MsIEFSUkFZX1NJWkUoczNjMjQ0MF9pb2Rlc2MpKTsKKwlpb3RhYmxlX2luaXQobWFjaF9kZXNjLCBzaXplKTsKKwkvKiByZW5hbWUgYW55IHBlcmlwaGVyYWxzIHVzZWQgZGlmZmVyaW5nIGZyb20gdGhlIHMzYzI0MTAgKi8KKworCXMzY19kZXZpY2VfaTJjLm5hbWUgPSAiczNjMjQ0MC1pMmMiOworCisJLyogY2hhbmdlIGlycSBmb3Igd2F0Y2hkb2cgKi8KKworCXMzY19kZXZpY2Vfd2R0LnJlc291cmNlWzFdLnN0YXJ0ID0gSVJRX1MzQzI0NDBfV0RUOworCXMzY19kZXZpY2Vfd2R0LnJlc291cmNlWzFdLmVuZCAgID0gSVJRX1MzQzI0NDBfV0RUOworfQorCit2b2lkIF9faW5pdCBzM2MyNDQwX2luaXRfY2xvY2tzKGludCB4dGFsKQoreworCXVuc2lnbmVkIGxvbmcgY2xrZGl2OworCXVuc2lnbmVkIGxvbmcgY2FtZGl2OworCXVuc2lnbmVkIGxvbmcgaGNsaywgZmNsaywgcGNsazsKKwlpbnQgaGRpdiA9IDE7CisKKwkvKiBub3cgd2UndmUgZ290IG91ciBtYWNoaW5lIGJpdHMgaW5pdGlhbGlzZWQsIHdvcmsgb3V0IHdoYXQKKwkgKiBjbG9ja3Mgd2UndmUgZ290ICovCisKKwlmY2xrID0gczNjMjQxMF9nZXRfcGxsKF9fcmF3X3JlYWRsKFMzQzI0MTBfTVBMTENPTiksIHh0YWwpICogMjsKKworCWNsa2RpdiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfQ0xLRElWTik7CisJY2FtZGl2ID0gX19yYXdfcmVhZGwoUzNDMjQ0MF9DQU1ESVZOKTsKKworCS8qIHdvcmsgb3V0IGNsb2NrIHNjYWxpbmdzICovCisKKwlzd2l0Y2ggKGNsa2RpdiAmIFMzQzI0NDBfQ0xLRElWTl9IRElWTl9NQVNLKSB7CisJY2FzZSBTM0MyNDQwX0NMS0RJVk5fSERJVk5fMToKKwkJaGRpdiA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTM0MyNDQwX0NMS0RJVk5fSERJVk5fMjoKKwkJaGRpdiA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTM0MyNDQwX0NMS0RJVk5fSERJVk5fNF84OgorCQloZGl2ID0gKGNhbWRpdiAmIFMzQzI0NDBfQ0FNRElWTl9IQ0xLNF9IQUxGKSA/IDggOiA0OworCQlicmVhazsKKworCWNhc2UgUzNDMjQ0MF9DTEtESVZOX0hESVZOXzNfNjoKKwkJaGRpdiA9IChjYW1kaXYgJiBTM0MyNDQwX0NBTURJVk5fSENMSzNfSEFMRikgPyA2IDogMzsKKwkJYnJlYWs7CisJfQorCisJaGNsayA9IGZjbGsgLyBoZGl2OworCXBjbGsgPSBoY2xrIC8gKChjbGtkaXYgJiBTM0MyNDQwX0NMS0RJVk5fUERJVk4pPyAyOjEpOworCisJLyogcHJpbnQgYnJpZWYgc3VtbWFyeSBvZiBjbG9ja3MsIGV0YyAqLworCisJcHJpbnRrKCJTM0MyNDQwOiBjb3JlICVsZC4lMDNsZCBNSHosIG1lbW9yeSAlbGQuJTAzbGQgTUh6LCBwZXJpcGhlcmFsICVsZC4lMDNsZCBNSHpcbiIsCisJICAgICAgIHByaW50X21oeihmY2xrKSwgcHJpbnRfbWh6KGhjbGspLCBwcmludF9taHoocGNsaykpOworCisJLyogaW5pdGlhbGlzZSB0aGUgY2xvY2tzIGhlcmUsIHRvIGFsbG93IG90aGVyIHRoaW5ncyBsaWtlIHRoZQorCSAqIGNvbnNvbGUgdG8gdXNlIHRoZW0sIGFuZCB0byBhZGQgbmV3IG9uZXMgYWZ0ZXIgdGhlIGluaXRpYWxpc2F0aW9uCisJICovCisKKwlzM2MyNHh4X3NldHVwX2Nsb2Nrcyh4dGFsLCBmY2xrLCBoY2xrLCBwY2xrKTsKK30KKworLyogbmVlZCB0byByZWdpc3RlciBjbGFzcyBiZWZvcmUgd2UgYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGRldmljZSwgYW5kCisgKiB3ZSBhbHNvIG5lZWQgdG8gZW5zdXJlIHRoYXQgaXQgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYmVmb3JlIGFueSBvZiB0aGUKKyAqIGRyaXZlcnMgZXZlbiB0cnkgdG8gdXNlIGl0IChldmVuIGlmIG5vdCBvbiBhbiBzM2MyNDQwIGJhc2VkIHN5c3RlbSkKKyAqIGFzIGEgZHJpdmVyIHdoaWNoIG1heSBzdXBwb3J0IGJvdGggMjQxMCBhbmQgMjQ0MCBtYXkgdHJ5IGFuZCB1c2UgaXQuCisqLworCitpbnQgX19pbml0IHMzYzI0NDBfY29yZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHN5c2Rldl9jbGFzc19yZWdpc3RlcigmczNjMjQ0MF9zeXNjbGFzcyk7Cit9CisKK2NvcmVfaW5pdGNhbGwoczNjMjQ0MF9jb3JlX2luaXQpOworCitpbnQgX19pbml0IHMzYzI0NDBfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoIlMzQzI0NDA6IEluaXRpYWxpc2luZyBhcmNoaXRlY3R1cmVcbiIpOworCisJcmV0ID0gc3lzZGV2X3JlZ2lzdGVyKCZzM2MyNDQwX3N5c2Rldik7CisJaWYgKHJldCAhPSAwKQorCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBzeXNkZXYgZm9yIHMzYzI0NDBcbiIpOworCWVsc2UKKwkJcmV0ID0gcGxhdGZvcm1fYWRkX2RldmljZXMoczNjMjR4eF91YXJ0X2RldnMsIHMzYzI0NDBfdWFydF9jb3VudCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljYjZkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLmgKQEAgLTAsMCArMSwzNSBAQAorLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDQwIGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICoJMjQtQXVnLTIwMDQgQkpEICBTdGFydCBvZiBTM0MyNDQwIENQVSBzdXBwb3J0CisgKgkwNC1Ob3YtMjAwNCBCSkQgIEFkZGVkIHMzYzI0NDBfaW5pdF91YXJ0cygpCisgKgkwNC1KYW4tMjAwNSBCSkQgIE1vdmVkIHVhcnQgaW5pdCB0byBjcHUgY29kZQorICoJMTAtSmFuLTIwMDUgQkpEICBNb3ZlZCAyNDQwIHNwZWNpZmljIGluaXQgaGVyZQorICoJMTQtSmFuLTIwMDUgQkpEICBTcGxpdCB0aGUgY2xvY2sgaW5pdGlhbGlzYXRpb24gY29kZQorKi8KKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAorCitleHRlcm4gIGludCBzM2MyNDQwX2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0NDBfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CisKK2V4dGVybiB2b2lkIHMzYzI0NDBfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CisKK2V4dGVybiB2b2lkIHMzYzI0NDBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCisjZWxzZQorI2RlZmluZSBzM2MyNDQwX2luaXRfY2xvY2tzIE5VTEwKKyNkZWZpbmUgczNjMjQ0MF9pbml0X3VhcnRzIE5VTEwKKyNkZWZpbmUgczNjMjQ0MF9tYXBfaW8gTlVMTAorI2RlZmluZSBzM2MyNDQwX2luaXQgTlVMTAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zbGVlcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzY4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvc2xlZXAuUwpAQCAtMCwwICsxLDE4MCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3NsZWVwLlMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjQxMCBQb3dlciBNYW5hZ2VyIChTdXNwZW5kLVRvLVJBTSkgc3VwcG9ydAorICoKKyAqIEJhc2VkIG9uIFBYQS9TQTExMDAgc2xlZXAgY29kZSBieToKKyAqCU5pY29sYXMgUGl0cmUsIChjKSAyMDAyIE1vbnRhIFZpc3RhIFNvZnR3YXJlIEluYworICoJQ2xpZmYgQnJha2UsIChjKSAyMDAxCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWNsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgorCisvKiBDT05GSUdfREVCVUdfUkVTVU1FIGlzIGRhbmdlcm91cyBpZiB5b3VyIGJvb3Rsb2FkZXIgZG9lcyBub3QKKyAqIHJlc2V0IHRoZSBVQVJUIGNvbmZpZ3VyYXRpb24sIG9ubHkgZW5hYmxlIGlmIHlvdSByZWFsbHkgbmVlZCB0aGlzIQorKi8KKy8vI2RlZmluZSBDT05GSUdfREVCVUdfUkVTVU1FCisKKwkudGV4dAorCisJLyogczNjMjQxMF9jcHVfc3VzcGVuZAorCSAqCisJICogcHV0IHRoZSBjcHUgaW50byBzbGVlcCBtb2RlCisJICoKKwkgKiBlbnRyeToKKwkgKglyMCA9IHNsZWVwIHNhdmUgYmxvY2sKKwkqLworCitFTlRSWShzM2MyNDEwX2NwdV9zdXNwZW5kKQorCXN0bWZkCXNwISwgeyByNCAtIHIxMiwgbHIgfQorCisJQEAgc3RvcmUgY28tcHJvY2Vzc29yIHJlZ2lzdGVycworCisJbXJjCXAxNSwgMCwgcjQsIGMxNSwgYzEsIDAJQCBDUCBhY2Nlc3MgcmVnaXN0ZXIKKwltcmMJcDE1LCAwLCByNSwgYzEzLCBjMCwgMAlAIFBJRAorCW1yYwlwMTUsIDAsIHI2LCBjMywgYzAsIDAJQCBEb21haW4gSUQKKwltcmMJcDE1LCAwLCByNywgYzIsIGMwLCAwCUAgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBhZGRyZXNzCisJbXJjCXAxNSwgMCwgcjgsIGMyLCBjMCwgMAlAIGF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyCisJbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMAlAIGNvbnRyb2wgcmVnaXN0ZXIKKworCXN0bWlhCXIwLCB7IHI0IC0gcjEzIH0KKworCUBAIGZsdXNoIHRoZSBjYWNoZXMgdG8gZW5zdXJlIGV2ZXJ5dGhpbmcgaXMgYmFjayBvdXQgdG8KKwlAQCBTRFJBTSBiZWZvcmUgdGhlIGNvcmUgcG93ZXJzIGRvd24KKworCWJsCWFybTkyMF9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCisJQEAgcHJlcGFyZSBjcHUgdG8gc2xlZXAKKworCWxkcglyNCwgPVMzQzI0MTBfUkVGUkVTSAorCWxkcglyNSwgPVMzQzI0MTBfTUlTQ0NSCisJbGRyCXI2LCA9UzNDMjQxMF9DTEtDT04KKwlsZHIJcjcsIFsgcjQgXQkJQCBnZXQgUkVGUkVTSCAoYW5kIGVuc3VyZSBpbiBUTEIpCisJbGRyCXI4LCBbIHI1IF0JCUAgZ2V0IE1JU0NDUiAoYW5kIGVuc3VyZSBpbiBUTEIpCisJbGRyCXI5LCBbIHI2IF0JCUAgZ2V0IENMS0NPTiAoYW5kIGVuc3VyZSBpbiBUTEIpCisKKwlvcnIJcjcsIHI3LCAjUzNDMjQxMF9SRUZSRVNIX1NFTEYJQCBTRFJBTSBzbGVlcCBjb21tYW5kCisJb3JyCXI4LCByOCwgI1MzQzI0MTBfTUlTQ0NSX1NEU0xFRVAgQCBTRFJBTSBwb3dlci1kb3duIHNpZ25hbHMKKwlvcnIJcjksIHI5LCAjUzNDMjQxMF9DTEtDT05fUE9XRVIJQCBwb3dlciBkb3duIGNvbW1hbmQKKworCXRlcQlwYywgIzAJCQlAIGZpcnN0IGFzIGEgdHJpYWwtcnVuIHRvIGxvYWQgY2FjaGUKKwlibAlzM2MyNDEwX2RvX3NsZWVwCisJdGVxCXIwLCByMAkJCUAgbm93IGRvIGl0IGZvciByZWFsCisJYglzM2MyNDEwX2RvX3NsZWVwCUAKKworCUBAIGFsaWduIG5leHQgYml0IG9mIGNvZGUgdG8gY2FjaGUgbGluZQorCS5hbGlnbgk4CitzM2MyNDEwX2RvX3NsZWVwOgorCXN0cmVxCXI3LCBbIHI0IF0JCQlAIFNEUkFNIHNsZWVwIGNvbW1hbmQKKwlzdHJlcQlyOCwgWyByNSBdCQkJQCBTRFJBTSBwb3dlci1kb3duIGNvbmZpZworCXN0cmVxCXI5LCBbIHI2IF0JCQlAIENQVSBzbGVlcAorMToJYmVxCTFiCisJbW92CXBjLCByMTQKKworCUBAIHJldHVybiB0byB0aGUgY2FsbGVyLCBhZnRlciBoYXZpbmcgdGhlIE1NVQorCUBAIHR1cm5lZCBvbiwgdGhpcyByZXN0b3JlcyB0aGUgbGFzdCBiaXRzIGZyb20gdGhlCisJQEAgc3RhY2sKK3Jlc3VtZV93aXRoX21tdToKKwlsZG1mZAlzcCEsIHsgcjQgLSByMTIsIHBjIH0KKworCS5sdG9yZworCisJQEAgdGhlIG5leHQgYml0cyBzaXQgaW4gdGhlIC5kYXRhIHNlZ21lbnQsIGV2ZW4gdGhvdWdoIHRoZXkKKwlAQCBoYXBwZW4gdG8gYmUgY29kZS4uLiB0aGUgczNjMjQxMF9zbGVlcF9zYXZlX3BoeXMgbmVlZHMgdG8gYmUKKwlAQCBhY2Nlc3NlZCBieSB0aGUgcmVzdW1lIGNvZGUgYmVmb3JlIGl0IGNhbiByZXN0b3JlIHRoZSBNTVUuCisJQEAgVGhpcyBtZWFucyB0aGF0IHRoZSB2YXJpYWJsZSBoYXMgdG8gYmUgY2xvc2UgZW5vdWdoIGZvciB0aGUKKwlAQCBjb2RlIHRvIHJlYWQgaXQuLi4gc2luY2UgdGhlIC50ZXh0IHNlZ21lbnQgbmVlZHMgdG8gYmUgUk8sCisJQEAgdGhlIGRhdGEgc2VnbWVudCBjYW4gYmUgdGhlIG9ubHkgcGxhY2UgdG8gcHV0IHRoaXMgY29kZS4KKworCS5kYXRhCisKKwkuZ2xvYmFsCXMzYzI0MTBfc2xlZXBfc2F2ZV9waHlzCitzM2MyNDEwX3NsZWVwX3NhdmVfcGh5czoKKwkud29yZAkwCisKKwkvKiBzM2MyNDEwX2NwdV9yZXN1bWUKKwkgKgorCSAqIHJlc3VtZSBjb2RlIGVudHJ5IGZvciBib290bG9hZGVyIHRvIGNhbGwKKwkgKgorCSAqIHdlIG11c3QgcHV0IHRoaXMgY29kZSBoZXJlIGluIHRoZSBkYXRhIHNlZ21lbnQgYXMgd2UgaGF2ZSBubworCSAqIG90aGVyIHdheSBvZiByZXN0b3JpbmcgdGhlIHN0YWNrIHBvaW50ZXIgYWZ0ZXIgc2xlZXAsIGFuZCB3ZQorCSAqIG11c3Qgbm90IHdyaXRlIHRvIHRoZSBjb2RlIHNlZ21lbnQgKGNvZGUgaXMgcmVhZC1vbmx5KQorCSovCisKK0VOVFJZKHMzYzI0MTBfY3B1X3Jlc3VtZSkKKwltb3YJcjAsICNQU1JfSV9CSVQgfCBQU1JfRl9CSVQgfCBNT0RFX1NWQworCW1zcgljcHNyX2MsIHIwCisKKwlAQCBsb2FkIFVBUlQgdG8gYWxsb3cgdXMgdG8gcHJpbnQgdGhlIHR3byBjaGFyYWN0ZXJzIGZvcgorCUBAIHJlc3VtZSBkZWJ1ZworCisJbW92CXIyLCAjUzNDMjQxMF9QQV9VQVJUICYgMHhmZjAwMDAwMAorCW9ycglyMiwgcjIsICNTM0MyNDEwX1BBX1VBUlQgJiAweGZmMDAwCisKKyNpZiAwCisJLyogU01ESzI0NDAgTEVEIHNldCAqLworCW1vdglyMTQsICNTM0MyNDEwX1BBX0dQSU8KKwlsZHIJcjEyLCBbIHIxNCwgIzB4NTQgXQorCWJpYwlyMTIsIHIxMiwgIzM8PDQKKwlvcnIJcjEyLCByMTIsICMxPDw3CisJc3RyCXIxMiwgWyByMTQsICMweDU0IF0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RFQlVHX1JFU1VNRQorCW1vdglyMywgIydMJworCXN0cmIJcjMsIFsgcjIsICNTM0MyNDEwX1VUWEggXQorMTAwMToKKwlsZHJiCXIxNCwgWyByMywgI1MzQzI0MTBfVVRSU1RBVCBdCisJdHN0CXIxNCwgI1MzQzI0MTBfVVRSU1RBVF9UWEUKKwliZXEJMTAwMWIKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfUkVTVU1FICovCisKKwltb3YJcjEsICMwCisJbWNyCXAxNSwgMCwgcjEsIGM4LCBjNywgMAkJQEAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNywgMAkJQEAgaW52YWxpZGF0ZSBJICYgRCBjYWNoZXMKKworCWxkcglyMCwgczNjMjQxMF9zbGVlcF9zYXZlX3BoeXMJQCBhZGRyZXNzIG9mIHJlc3RvcmUgYmxvY2sKKwlsZG1pYQlyMCwgeyByNCAtIHIxMyB9CisKKwltY3IJcDE1LCAwLCByNCwgYzE1LCBjMSwgMAkJQCBDUCBhY2Nlc3MgcmVnaXN0ZXIKKwltY3IJcDE1LCAwLCByNSwgYzEzLCBjMCwgMAkJQCBQSUQKKwltY3IJcDE1LCAwLCByNiwgYzMsIGMwLCAwCQlAIERvbWFpbiBJRAorCW1jcglwMTUsIDAsIHI3LCBjMiwgYzAsIDAJCUAgdHJhbnNsYXRpb24gdGFibGUgYmFzZQorCW1jcglwMTUsIDAsIHI4LCBjMSwgYzEsIDAJCUAgYXV4aWxsaWFyeSBjb250cm9sCisKKyNpZmRlZiBDT05GSUdfREVCVUdfUkVTVU1FCisJbW92CXIzLCAjJ1InCisJc3RyYglyMywgWyByMiwgI1MzQzI0MTBfVVRYSCBdCisjZW5kaWYKKworCWxkcglyMiwgPXJlc3VtZV93aXRoX21tdQorCW1jcglwMTUsIDAsIHI5LCBjMSwgYzAsIDAJCUAgdHVybiBvbiBNTVUsIGV0YworCW5vcAkJCQkJQCBzZWNvbmQtdG8tbGFzdCBiZWZvcmUgbW11CisJbW92CXBjLCByMgkJCQlAIGdvIGJhY2sgdG8gdmlydHVhbCBhZGRyZXNzCisKKwkubHRvcmcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWYwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWlycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXJ0dmFsOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfdXNlY190aWNrczsKKworI2RlZmluZSBUSU1FUl9VU0VDX1NISUZUIDE2CisKKy8qIHdlIHVzZSB0aGUgc2hpZnRlZCBhcml0aG1ldGljIHRvIHdvcmsgb3V0IHRoZSByYXRpbyBvZiB0aW1lciB0aWNrcworICogdG8gdXNlY3MsIGFzIG9mdGVuIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIG5vdCBhIG5pY2UgZXZlbiBtdWx0aXBsZQorICogb2YgMU1Iei4KKyAqCisgKiBzaGlmdCBvZiAxNCBhbmQgMTUgYXJlIHRvbyBsb3cgZm9yIHRoZSAxMk1IeiwgMTYgc2VlbXMgdG8gYmUgb2sKKyAqIGZvciB0aGUgY3VycmVudCBIWiB2YWx1ZSBvZiAyMDAgd2l0aG91dCBwcm9kdWNpbmcgb3ZlcmZsb3dzLgorICoKKyAqIE9yaWdpbmFsIHBhdGNoIGJ5IERpbWl0cnkgQW5kcmljLCB1cGRhdGVkIGJ5IEJlbiBEb29rcworKi8KKworCisvKiB0aW1lcl9tYXNrX3VzZWNfdGlja3MKKyAqCisgKiBnaXZlbiBhIGNsb2NrIGFuZCBkaXZpc29yLCBtYWtlIHRoZSB2YWx1ZSB0byBwYXNzIGludG8gdGltZXJfdGlja3NfdG9fdXNlYworICogdG8gc2NhbGUgdGhlIHRpY2tzIGludG8gdXNlY3MKKyovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordGltZXJfbWFza191c2VjX3RpY2tzKHVuc2lnbmVkIGxvbmcgc2NhbGVyLCB1bnNpZ25lZCBsb25nIHBjbGspCit7CisJdW5zaWduZWQgbG9uZyBkZW4gPSBwY2xrIC8gMTAwMDsKKworCXJldHVybiAoKDEwMDAgPDwgVElNRVJfVVNFQ19TSElGVCkgKiBzY2FsZXIgKyAoZGVuID4+IDEpKSAvIGRlbjsKK30KKworLyogdGltZXJfdGlja3NfdG9fdXNlYworICoKKyAqIGNvbnZlcnQgdGltZXIgdGlja3MgdG8gdXNlYy4KKyovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aW1lcl90aWNrc190b191c2VjKHVuc2lnbmVkIGxvbmcgdGlja3MpCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisKKwlyZXMgPSB0aWNrcyAqIHRpbWVyX3VzZWNfdGlja3M7CisJcmVzICs9IDEgPDwgKFRJTUVSX1VTRUNfU0hJRlQgLSA0KTsJLyogcm91bmQgdXAgc2xpZ2h0bHkgKi8KKworCXJldHVybiByZXMgPj4gVElNRVJfVVNFQ19TSElGVDsKK30KKworLyoqKgorICogUmV0dXJucyBtaWNyb3NlY29uZCAgc2luY2UgbGFzdCBjbG9jayBpbnRlcnJ1cHQuICBOb3RlIHRoYXQgaW50ZXJydXB0cworICogd2lsbCBoYXZlIGJlZW4gZGlzYWJsZWQgYnkgZG9fZ2V0dGltZW9mZnNldCgpCisgKiBJUlFzIGFyZSBkaXNhYmxlZCBiZWZvcmUgZW50ZXJpbmcgaGVyZSBmcm9tIGRvX2dldHRpbWVvZmRheSgpCisgKi8KKworI2RlZmluZSBTUkNQTkRfVElNRVI0ICgxPDwoSVJRX1RJTUVSNCAtIElSUV9FSU5UMCkpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0MTBfZ2V0dGltZW9mZnNldCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRkb25lOworCXVuc2lnbmVkIGxvbmcgaXJxcGVuZDsKKwl1bnNpZ25lZCBsb25nIHR2YWw7CisKKwkvKiB3b3JrIG91dCBob3cgbWFueSB0aWNrcyBoYXZlIGdvbmUgc2luY2UgbGFzdCB0aW1lciBpbnRlcnJ1cHQgKi8KKworICAgICAgICB0dmFsID0gIF9fcmF3X3JlYWRsKFMzQzI0MTBfVENOVE8oNCkpOworCXRkb25lID0gdGltZXJfc3RhcnR2YWwgLSB0dmFsOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIGludGVycnVwdCBwZW5kaW5nICovCisKKwlpcnFwZW5kID0gX19yYXdfcmVhZGwoUzNDMjQxMF9TUkNQTkQpOworCWlmIChpcnFwZW5kICYgU1JDUE5EX1RJTUVSNCkgeworCQkvKiByZS1yZWFkIHRoZSB0aW1lciwgYW5kIHRyeSBhbmQgZml4IHVwIGZvciB0aGUgbWlzc2VkCisJCSAqIGludGVycnVwdC4gTm90ZSwgdGhlIGludGVycnVwdCBtYXkgZ28gb2ZmIGJlZm9yZSB0aGUKKwkJICogdGltZXIgaGFzIHJlLWxvYWRlZCBmcm9tIHdyYXBwaW5nLgorCQkgKi8KKworCQl0dmFsID0gIF9fcmF3X3JlYWRsKFMzQzI0MTBfVENOVE8oNCkpOworCQl0ZG9uZSA9IHRpbWVyX3N0YXJ0dmFsIC0gdHZhbDsKKworCQlpZiAodHZhbCAhPSAwKQorCQkJdGRvbmUgKz0gdGltZXJfc3RhcnR2YWw7CisJfQorCisJcmV0dXJuIHRpbWVyX3RpY2tzX3RvX3VzZWModGRvbmUpOworfQorCisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIHRpbWVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorczNjMjQxMF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwl0aW1lcl90aWNrKHJlZ3MpOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBzM2MyNDEwX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiUzNDMjQxMCBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5oYW5kbGVyCT0gczNjMjQxMF90aW1lcl9pbnRlcnJ1cHQKK307CisKKy8qCisgKiBTZXQgdXAgdGltZXIgaW50ZXJydXB0LCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy4KKyAqCisgKiBDdXJyZW50bHkgd2Ugb25seSB1c2UgdGltZXI0LCBhcyBpdCBpcyB0aGUgb25seSB0aW1lciB3aGljaCBoYXMgbm8KKyAqIG90aGVyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGV4cGxvaXRlZCBleHRlcm5hbGx5CisgKi8KK3N0YXRpYyB2b2lkIHMzYzI0MTBfdGltZXJfc2V0dXAgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0Y29uOworCXVuc2lnbmVkIGxvbmcgdGNudDsKKwl1bnNpZ25lZCBsb25nIHRjZmcxOworCXVuc2lnbmVkIGxvbmcgdGNmZzA7CisKKwl0Y250ID0gMHhmZmZmOyAgLyogZGVmYXVsdCB2YWx1ZSBmb3IgdGNudCAqLworCisJLyogcmVhZCB0aGUgY3VycmVudCB0aW1lciBjb25maWd1cmF0aW9uIGJpdHMgKi8KKworCXRjb24gPSBfX3Jhd19yZWFkbChTM0MyNDEwX1RDT04pOworCXRjZmcxID0gX19yYXdfcmVhZGwoUzNDMjQxMF9UQ0ZHMSk7CisJdGNmZzAgPSBfX3Jhd19yZWFkbChTM0MyNDEwX1RDRkcwKTsKKworCS8qIGNvbmZpZ3VyZSB0aGUgc3lzdGVtIGZvciB3aGljaGV2ZXIgbWFjaGluZSBpcyBpbiB1c2UgKi8KKworCWlmIChtYWNoaW5lX2lzX2Jhc3QoKSB8fCBtYWNoaW5lX2lzX3ZyMTAwMCgpKSB7CisJCS8qIHRpbWVyIGlzIGF0IDEyTUh6LCBzY2FsZXIgaXMgMSAqLworCQl0aW1lcl91c2VjX3RpY2tzID0gdGltZXJfbWFza191c2VjX3RpY2tzKDEsIDEyMDAwMDAwKTsKKwkJdGNudCA9IDEyMDAwMDAwIC8gSFo7CisKKwkJdGNmZzEgJj0gflMzQzI0MTBfVENGRzFfTVVYNF9NQVNLOworCQl0Y2ZnMSB8PSBTM0MyNDEwX1RDRkcxX01VWDRfVENMSzE7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBwY2xrOworCQlzdHJ1Y3QgY2xrICpjbGs7CisKKwkJLyogZm9yIHRoZSBoMTk0MCAoYW5kIG90aGVycyksIHdlIHVzZSB0aGUgcGNsayBmcm9tIHRoZSBjb3JlCisJCSAqIHRvIGdlbmVyYXRlIHRoZSB0aW1lciB2YWx1ZXMuIHNpbmNlIHZhbHVlcyBhcm91bmQgNTAgdG8KKwkJICogNzBNSHogYXJlIG5vdCB2YWx1ZXMgd2UgY2FuIGRpcmVjdGx5IGdlbmVyYXRlIHRoZSB0aW1lcgorCQkgKiB2YWx1ZSBmcm9tLCB3ZSBuZWVkIHRvIHByZS1zY2FsZSBhbmQgZGl2aWRlIGJlZm9yZSB1c2luZyBpdC4KKwkJICoKKwkJICogZm9yIGluc3RhbmNlLCB1c2luZyA1MC43TUh6IGFuZCBkaXZpZGluZyBieSA2IGdpdmVzIDguNDVNSHoKKwkJICogKDguNDUgdGlja3MgcGVyIHVzZWMpCisJCSAqLworCisJCS8qIHRoaXMgaXMgdXNlZCBhcyBkZWZhdWx0IGlmIG5vIG90aGVyIHRpbWVyIGNhbiBiZSBmb3VuZCAqLworCisJCWNsayA9IGNsa19nZXQoTlVMTCwgInRpbWVycyIpOworCQlpZiAoSVNfRVJSKGNsaykpCisJCQlwYW5pYygiZmFpbGVkIHRvIGdldCBjbG9jayBmb3Igc3lzdGVtIHRpbWVyIik7CisKKwkJY2xrX3VzZShjbGspOworCQljbGtfZW5hYmxlKGNsayk7CisKKwkJcGNsayA9IGNsa19nZXRfcmF0ZShjbGspOworCisJCS8qIGNvbmZpZ3VyZSBjbG9jayB0aWNrICovCisKKwkJdGltZXJfdXNlY190aWNrcyA9IHRpbWVyX21hc2tfdXNlY190aWNrcyg2LCBwY2xrKTsKKworCQl0Y2ZnMSAmPSB+UzNDMjQxMF9UQ0ZHMV9NVVg0X01BU0s7CisJCXRjZmcxIHw9IFMzQzI0MTBfVENGRzFfTVVYNF9ESVYyOworCisJCXRjZmcwICY9IH5TM0MyNDEwX1RDRkdfUFJFU0NBTEVSMV9NQVNLOworCQl0Y2ZnMCB8PSAoKDYgLSAxKSAvIDIpIDw8IFMzQzI0MTBfVENGR19QUkVTQ0FMRVIxX1NISUZUOworCisJCXRjbnQgPSAocGNsayAvIDYpIC8gSFo7CisJfQorCisJLyogdGltZXJzIHJlbG9hZCBhZnRlciBjb3VudGluZyB6ZXJvLCBzbyByZWR1Y2UgdGhlIGNvdW50IGJ5IDEgKi8KKworCXRjbnQtLTsKKworCXByaW50aygidGltZXIgdGNvbj0lMDhseCwgdGNudCAlMDRseCwgdGNmZyAlMDhseCwlMDhseCwgdXNlYyAlMDhseFxuIiwKKwkgICAgICAgdGNvbiwgdGNudCwgdGNmZzAsIHRjZmcxLCB0aW1lcl91c2VjX3RpY2tzKTsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB0aW1lciBpcyB3aXRoaW4gMTZiaXQgcmFuZ2UuLi4gKi8KKwlpZiAodGNudCA+IDB4ZmZmZikgeworCQlwYW5pYygic2V0dXBfdGltZXI6IEhaIGlzIHRvbyBzbWFsbCwgY2Fubm90IGNvbmZpZ3VyZSB0aW1lciEiKTsKKwkJcmV0dXJuOworCX0KKworCV9fcmF3X3dyaXRlbCh0Y2ZnMSwgUzNDMjQxMF9UQ0ZHMSk7CisJX19yYXdfd3JpdGVsKHRjZmcwLCBTM0MyNDEwX1RDRkcwKTsKKworCXRpbWVyX3N0YXJ0dmFsID0gdGNudDsKKwlfX3Jhd193cml0ZWwodGNudCwgUzNDMjQxMF9UQ05UQig0KSk7CisKKwkvKiBlbnN1cmUgdGltZXIgaXMgc3RvcHBlZC4uLiAqLworCisJdGNvbiAmPSB+KDc8PDIwKTsKKwl0Y29uIHw9IFMzQzI0MTBfVENPTl9UNFJFTE9BRDsKKwl0Y29uIHw9IFMzQzI0MTBfVENPTl9UNE1BTlVBTFVQRDsKKworCV9fcmF3X3dyaXRlbCh0Y29uLCBTM0MyNDEwX1RDT04pOworCV9fcmF3X3dyaXRlbCh0Y250LCBTM0MyNDEwX1RDTlRCKDQpKTsKKwlfX3Jhd193cml0ZWwodGNudCwgUzNDMjQxMF9UQ01QQig0KSk7CisKKwkvKiBzdGFydCB0aGUgdGltZXIgcnVubmluZyAqLworCXRjb24gfD0gUzNDMjQxMF9UQ09OX1Q0U1RBUlQ7CisJdGNvbiAmPSB+UzNDMjQxMF9UQ09OX1Q0TUFOVUFMVVBEOworCV9fcmF3X3dyaXRlbCh0Y29uLCBTM0MyNDEwX1RDT04pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgczNjMjQxMF90aW1lcl9pbml0ICh2b2lkKQoreworCXMzYzI0MTBfdGltZXJfc2V0dXAoKTsKKwlzZXR1cF9pcnEoSVJRX1RJTUVSNCwgJnMzYzI0MTBfdGltZXJfaXJxKTsKK30KKworc3RydWN0IHN5c190aW1lciBzM2MyNHh4X3RpbWVyID0geworCS5pbml0CQk9IHMzYzI0MTBfdGltZXJfaW5pdCwKKwkub2Zmc2V0CQk9IHMzYzI0MTBfZ2V0dGltZW9mZnNldCwKKwkucmVzdW1lCQk9IHMzYzI0MTBfdGltZXJfc2V0dXAKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdXNiLXNpbXRlYy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJiNjEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuYwpAQCAtMCwwICsxLDExMyBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL0VCMjQxMElUWC8KKyAqCisgKiBTaW10ZWMgQkFTVCBhbmQgVGhvcmNvbSBWUjEwMDAgVVNCIHBvcnQgc3VwcG9ydCBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKgkxNC1TZXAtMjAwNCBCSkQgIENyZWF0ZWQKKyAqCTE4LU9jdC0yMDA0IEJKRCAgQ2xlYW51cHMsIGFuZCBhZGRlZCBjb2RlIHRvIHJlcG9ydCBPQyBjbGVhcmVkCisqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2Jhc3QtbWFwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYmFzdC1pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC91c2ItY29udHJvbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlICJkZXZzLmgiCisjaW5jbHVkZSAidXNiLXNpbXRlYy5oIgorCisvKiBjb250cm9sIHBvd2VyIGFuZCBtb25pdG9yIG92ZXItY3VycmVudCBldmVudHMgb24gdmFyaW91cyBTaW10ZWMKKyAqIGRlc2lnbmVkIGJvYXJkcy4KKyovCisKK3N0YXRpYyB2b2lkCit1c2Jfc2ltdGVjX3Bvd2VyY29udHJvbChpbnQgcG9ydCwgaW50IHRvKQoreworCXByX2RlYnVnKCJ1c2Jfc2ltdGVjX3Bvd2VyY29udHJvbCglZCwlZClcbiIsIHBvcnQsIHRvKTsKKworCWlmIChwb3J0ID09IDEpCisJCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEI0LCB0byA/IDA6MSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAordXNiX3NpbXRlY19vY2lycShpbnQgaXJxLCB2b2lkICpwdywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHMzYzI0MTBfaGNkX2luZm8gKmluZm8gPSAoc3RydWN0IHMzYzI0MTBfaGNkX2luZm8gKilwdzsKKworCWlmIChzM2MyNDEwX2dwaW9fZ2V0cGluKFMzQzI0MTBfR1BHMTApID09IDApIHsKKwkJcHJfZGVidWcoInVzYl9zaW10ZWM6IG92ZXItY3VycmVudCBpcnEgKG9jIGRldGVjdGVkKVxuIik7CisJCXMzYzI0MTBfcmVwb3J0X29jKGluZm8sIDMpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJ1c2Jfc2ltdGVjOiBvdmVyLWN1cnJlbnQgaXJxIChvYyBjbGVhcmVkKVxuIik7CisJCXMzYzI0MTBfcmVwb3J0X29jKGluZm8sIDApOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdXNiX3NpbXRlY19lbmFibGVvYyhzdHJ1Y3QgczNjMjQxMF9oY2RfaW5mbyAqaW5mbywgaW50IG9uKQoreworCWludCByZXQ7CisKKwlpZiAob24pIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoSVJRX1VTQk9DLCB1c2Jfc2ltdGVjX29jaXJxLCBTQV9JTlRFUlJVUFQsCisJCQkJICAiVVNCIE92ZXItY3VycmVudCIsIGluZm8pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlcXVlc3QgdXNiIG9jIGlycVxuIik7CisJCX0KKworCQlzZXRfaXJxX3R5cGUoSVJRX1VTQk9DLCBJUlFUX0JPVEhFREdFKTsKKwl9IGVsc2UgeworCQlmcmVlX2lycShJUlFfVVNCT0MsIGluZm8pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX2hjZF9pbmZvIHVzYl9zaW10ZWNfaW5mbyA9IHsKKwkucG9ydFswXQk9IHsKKwkJLmZsYWdzCT0gUzNDX0hDREZMR19VU0VECisJfSwKKwkucG9ydFsxXQk9IHsKKwkJLmZsYWdzCT0gUzNDX0hDREZMR19VU0VECisJfSwKKworCS5wb3dlcl9jb250cm9sCT0gdXNiX3NpbXRlY19wb3dlcmNvbnRyb2wsCisJLmVuYWJsZV9vYwk9IHVzYl9zaW10ZWNfZW5hYmxlb2MsCit9OworCisKK2ludCB1c2Jfc2ltdGVjX2luaXQodm9pZCkKK3sKKwlwcmludGsoIlVTQiBQb3dlciBDb250cm9sLCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiIpOworCXMzY19kZXZpY2VfdXNiLmRldi5wbGF0Zm9ybV9kYXRhID0gJnVzYl9zaW10ZWNfaW5mbzsKKworCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEI0LCBTM0MyNDEwX0dQQjRfT1VUUCk7CisJczNjMjQxMF9ncGlvX3NldHBpbihTM0MyNDEwX0dQQjQsIDEpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC91c2Itc2ltdGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjMGNjOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC91c2Itc2ltdGVjLmgKQEAgLTAsMCArMSwxOSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL0VCMjQxMElUWC8KKyAqCisgKiBTaW10ZWMgQkFTVCBhbmQgVGhvcmNvbSBWUjEwMDAgVVNCIHBvcnQgc3VwcG9ydCBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKgkyMC1BdWctMjAwNCBCSkQgIENyZWF0ZWQKKyovCisKK2V4dGVybiBpbnQgdXNiX3NpbXRlY19pbml0KHZvaWQpOworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNkZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvS2NvbmZpZwpAQCAtMCwwICsxLDE2MiBAQAoraWYgQVJDSF9TQTExMDAKKworbWVudSAiU0ExMXgwIEltcGxlbWVudGF0aW9ucyIKKworY29uZmlnIFNBMTEwMF9BU1NBQkVUCisJYm9vbCAiQXNzYWJldCIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEludGVsKFIpIFN0cm9uZ0FSTShSKSBTQS0xMTEwCisJICBNaWNyb3Byb2Nlc3NvciBEZXZlbG9wbWVudCBCb2FyZCAoYWxzbyBrbm93biBhcyB0aGUgQXNzYWJldCkuCisKK2NvbmZpZyBBU1NBQkVUX05FUE9OU0VUCisJYm9vbCAiSW5jbHVkZSBzdXBwb3J0IGZvciBOZXBvbnNldCIKKwlkZXBlbmRzIG9uIFNBMTEwMF9BU1NBQkVUCisJc2VsZWN0IFNBMTExMQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgSW50ZWwoUikgU3Ryb25nQVJNKFIpIFNBLTExMTAKKwkgIE1pY3JvcHJvY2Vzc29yIERldmVsb3BtZW50IEJvYXJkIChBc3NhYmV0KSAgd2l0aCB0aGUgU0EtMTExMQorCSAgRGV2ZWxvcG1lbnQgQm9hcmQgKE5lcG9uKS4KKworY29uZmlnIFNBMTEwMF9DRVJGCisJYm9vbCAiQ2VyZkJvYXJkIgorCWhlbHAKKwkgIFRoZSBJbnRyaW5zeWMgQ2VyZkJvYXJkIGlzIGJhc2VkIG9uIHRoZSBTdHJvbmdBUk0gMTExMCAoRGlzY29udGludWVkKS4KKwkgIE1vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGF0OgorCSAgPGh0dHA6Ly93d3cuaW50cmluc3ljLmNvbS9wcm9kdWN0cy9jZXJmYm9hcmQvPi4KKworCSAgU2F5IFkgaWYgY29uZmlndXJpbmcgZm9yIGFuIEludHJpbnN5YyBDZXJmQm9hcmQuCisJICBTYXkgTiBvdGhlcndpc2UuCisKK2Nob2ljZQorCXByb21wdCAiQ2VyZiBGbGFzaCBhdmFpbGFibGUiCisJZGVwZW5kcyBvbiBTQTExMDBfQ0VSRgorCWRlZmF1bHQgU0ExMTAwX0NFUkZfRkxBU0hfOE1CCisKK2NvbmZpZyBTQTExMDBfQ0VSRl9GTEFTSF84TUIKKwlib29sICI4TUIiCisKK2NvbmZpZyBTQTExMDBfQ0VSRl9GTEFTSF8xNk1CCisJYm9vbCAiMTZNQiIKKworY29uZmlnIFNBMTEwMF9DRVJGX0ZMQVNIXzMyTUIKKwlib29sICIzMk1CIgorCitlbmRjaG9pY2UKKworY29uZmlnIFNBMTEwMF9DT0xMSUUKKwlib29sICJTaGFycCBaYXVydXMgU0w1NTAwIgorCXNlbGVjdCBTSEFSUF9MT0NPTU8KKwlzZWxlY3QgU0hBUlBfU0NPT1AKKwlzZWxlY3QgU0hBUlBfUEFSQU0KKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIFNoYXJwIFphdXJ1cyBTTDU1MDAgUERBcy4KKworY29uZmlnIFNBMTEwMF9IMzEwMAorCWJvb2wgIkNvbXBhcSBpUEFRIEgzMTAwIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gdGhlIENvbXBhcSBpUEFRCisJICBIMzEwMCBoYW5kaGVsZCBjb21wdXRlci4gIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWFjaGluZSBhbmQgdGhlCisJICBMaW51eCBwb3J0IHRvIHRoaXMgbWFjaGluZSBjYW4gYmUgZm91bmQgYXQ6CisKKwkgIDxodHRwOi8vd3d3LmhhbmRoZWxkcy5vcmcvQ29tcGFxL2luZGV4Lmh0bWwjaVBBUV9IMzEwMD4KKwkgIDxodHRwOi8vd3d3LmNvbXBhcS5jb20vcHJvZHVjdHMvaGFuZGhlbGRzL3BvY2tldHBjLz4KKworY29uZmlnIFNBMTEwMF9IMzYwMAorCWJvb2wgIkNvbXBhcSBpUEFRIEgzNjAwL0gzNzAwIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gdGhlIENvbXBhcSBpUEFRCisJICBIMzYwMCBoYW5kaGVsZCBjb21wdXRlci4gIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWFjaGluZSBhbmQgdGhlCisJICBMaW51eCBwb3J0IHRvIHRoaXMgbWFjaGluZSBjYW4gYmUgZm91bmQgYXQ6CisKKwkgIDxodHRwOi8vd3d3LmhhbmRoZWxkcy5vcmcvQ29tcGFxL2luZGV4Lmh0bWwjaVBBUV9IMzYwMD4KKwkgIDxodHRwOi8vd3d3LmNvbXBhcS5jb20vcHJvZHVjdHMvaGFuZGhlbGRzL3BvY2tldHBjLz4KKworY29uZmlnIFNBMTEwMF9IMzgwMAorCWJvb2wgIkNvbXBhcSBpUEFRIEgzODAwIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gdGhlIENvbXBhcSBpUEFRIEgzODAwCisJICBzZXJpZXMgaGFuZGhlbGQgY29tcHV0ZXIuICBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1hY2hpbmUgYW5kIHRoZQorCSAgTGludXggcG9ydCB0byB0aGlzIG1hY2hpbmUgY2FuIGJlIGZvdW5kIGF0OgorCisJICA8aHR0cDovL3d3dy5oYW5kaGVsZHMub3JnL0NvbXBhcS9pbmRleC5odG1sI2lQQVFfSDM4MDA+CisJICA8aHR0cDovL3d3dy5jb21wYXEuY29tL3Byb2R1Y3RzL2hhbmRoZWxkcy9wb2NrZXRwYy8+CisKK2NvbmZpZyBTQTExMDBfSDNYWFgKKwlib29sCisJZGVwZW5kcyBvbiBTQTExMDBfSDMxMDAgfHwgU0ExMTAwX0gzNjAwIHx8IFNBMTEwMF9IMzgwMAorCWRlZmF1bHQgeQorCitjb25maWcgU0ExMTAwX0JBREdFNAorCWJvb2wgIkhQIExhYnMgQmFkZ2VQQUQgNCIKKwlzZWxlY3QgU0ExMTExCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIEhQIExhYm9yYXRvcmllcworCSAgQmFkZ2VQQUQgNC4KKworY29uZmlnIFNBMTEwMF9KT1JOQURBNzIwCisJYm9vbCAiSFAgSm9ybmFkYSA3MjAiCisJc2VsZWN0IFNBMTExMQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBrZXJuZWwgZm9yIHRoZSBIUCBKb3JuYWRhIDcyMAorCSAgaGFuZGhlbGQgY29tcHV0ZXIuICBTZWUgPGh0dHA6Ly93d3cuaHAuY29tL2pvcm5hZGEvcHJvZHVjdHMvNzIwPgorCSAgZm9yIGRldGFpbHMuCisKK2NvbmZpZyBTQTExMDBfSEFDS0tJVAorCWJvb2wgIkhhY2tLaXQgQ29yZSBDUFUgQm9hcmQiCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBIYWNrS2l0IENvcmUgQ1BVIEJvYXJkCisJICA8aHR0cDovL2hhY2traXQuZWxldHp0cmljay5kZT47CisKK2NvbmZpZyBTQTExMDBfTEFSVAorCWJvb2wgIkxBUlQiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBMaW51eCBBZHZhbmNlZCBSYWRpbyBUZXJtaW5hbAorCSAgKGFsc28ga25vd24gYXMgdGhlIExBUlQpLiAgU2VlIDxodHRwOi8vd3d3LmxhcnQudHVkZWxmdC5ubC8+IGZvcgorCSAgaW5mb3JtYXRpb24gb24gdGhlIExBUlQuCisKK2NvbmZpZyBTQTExMDBfUExFQgorCWJvb2wgIlBMRUIiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHZlcnNpb24gMSBvZiB0aGUgUG9ydGFibGUgTGludXgKKwkgIEVtYmVkZGVkIEJvYXJkIChhbHNvIGtub3duIGFzIFBMRUIpLgorCSAgU2VlIDxodHRwOi8vd3d3LmRpc3kuY3NlLnVuc3cuZWR1LmF1L0hhcmR3YXJlL1BMRUIvPgorCSAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBTQTExMDBfU0hBTk5PTgorCWJvb2wgIlNoYW5ub24iCisJaGVscAorCSAgVGhlIFNoYW5ub24gKGFsc28ga25vd24gYXMgYSBUdXhzY3JlZW4sIGFuZCBhbHNvIGFzIGEgSVMyNjMwKSB3YXMgYQorCSAgbGltaXRlZCBlZGl0aW9uIHdlYnBob25lIHByb2R1Y2VkIGJ5IFBoaWxpcHMuIFRoZSBTaGFubm9uIGlzIGEgU0ExMTAwCisJICBwbGF0Zm9ybSB3aXRoIGEgNjQweDQ4MCBMQ0QsIHRvdWNoc2NyZWVuLCBDSVIga2V5Ym9hcmQsIFBDTUNJQSBzbG90cywKKwkgIGFuZCBhIHRlbGNvIGludGVyZmFjZS4KKworY29uZmlnIFNBMTEwMF9TSU1QQUQKKwlib29sICJTaW1wYWQiCisJaGVscAorCSAgVGhlIFNJRU1FTlMgd2VicGFkIFNJTXBhZCBpcyBiYXNlZCBvbiB0aGUgU3Ryb25nQVJNIDExMTAuIFRoZXJlCisJICBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBDTDQgYW5kIFNMNC4gQ0w0IGhhcyAzMk1CIFJBTSBhbmQgMTZNQgorCSAgRkxBU0guIFRoZSBTTDQgdmVyc2lvbiBnb3QgNjQgTUIgUkFNIGFuZCAzMiBNQiBGTEFTSCBhbmQgYQorCSAgUENNQ0lBLVNsb3QuIFRoZSB2ZXJzaW9uIGZvciB0aGUgR2VybWFueSBUZWxlY29tIChEVEFHKSBpcyB0aGUgc2FtZQorCSAgbGlrZSBDTDQgaW4gYWRkaXRpb25hbCBpdCBoYXMgYSBQQ01DSUEtU2xvdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KKwkgIHZpc2l0IDxodHRwOi8vd3d3Lm15LXNpZW1lbnMuY29tLz4gb3IgPGh0dHA6Ly93d3cuc2llbWVucy5jaC8+LgorCitjb25maWcgU0ExMTAwX1NTUAorCXRyaXN0YXRlICJHZW5lcmljIFBJTyBTU1AiCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgUElPIFNTUCBkcml2ZXIuCisJICBUaGlzIGlzbid0IGZvciBhdWRpbyBzdXBwb3J0LCBidXQgZm9yIGF0dGFjaGVkIHNlbnNvcnMgYW5kCisJICBvdGhlciBkZXZpY2VzLCBlZyBmb3IgQmFkZ2VQQUQgNCBzZW5zb3Igc3VwcG9ydCwgb3IgSm9ybmFkYQorCSAgNzIwIHRvdWNoc2NyZWVuIHN1cHBvcnQuCisKK2NvbmZpZyBIMzYwMF9TTEVFVkUKKwl0cmlzdGF0ZSAiQ29tcGFxIGlQQVEgSGFuZGhlbGQgc2xlZXZlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQTExMDBfSDM2MDAKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGV4dGVuc2lvbiBwYWNrcyAoc2xlZXZlcykKKwkgIGZvciB0aGUgQ29tcGFxIGlQQVEgSDNYWFggc2VyaWVzIG9mIGhhbmRoZWxkIGNvbXB1dGVycy4gIFRoaXMgb3B0aW9uCisJICBpcyByZXF1aXJlZCBmb3IgdGhlIENGLCBQQ01DSUEsIEJsdWV0b290aCBhbmQgR1NNL0dQUlMgZXh0ZW5zaW9uCisJICBwYWNrcy4KKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGE0YTNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUKQEAgLTAsMCArMSw1MyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBDb21tb24gc3VwcG9ydAorb2JqLXkgOj0gZ2VuZXJpYy5vIGlycS5vIGRtYS5vIHRpbWUubworb2JqLW0gOj0KK29iai1uIDo9CitvYmotICA6PQorbGVkLXkgOj0gbGVkcy5vCisKK29iai0kKENPTkZJR19DUFVfRlJFUV9TQTExMDApCQkrPSBjcHUtc2ExMTAwLm8KK29iai0kKENPTkZJR19DUFVfRlJFUV9TQTExMTApCQkrPSBjcHUtc2ExMTEwLm8KKworIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0CitvYmotJChDT05GSUdfU0ExMTAwX0FTU0FCRVQpCQkrPSBhc3NhYmV0Lm8KK2xlZC0kKENPTkZJR19TQTExMDBfQVNTQUJFVCkJCSs9IGxlZHMtYXNzYWJldC5vCitvYmotJChDT05GSUdfQVNTQUJFVF9ORVBPTlNFVCkJCSs9IG5lcG9uc2V0Lm8KKworb2JqLSQoQ09ORklHX1NBMTEwMF9CQURHRTQpCQkrPSBiYWRnZTQubworbGVkLSQoQ09ORklHX1NBMTEwMF9CQURHRTQpCQkrPSBsZWRzLWJhZGdlNC5vCisKK29iai0kKENPTkZJR19TQTExMDBfQ0VSRikJCSs9IGNlcmYubworbGVkLSQoQ09ORklHX1NBMTEwMF9DRVJGKQkJKz0gbGVkcy1jZXJmLm8KKworb2JqLSQoQ09ORklHX1NBMTEwMF9DT0xMSUUpCQkrPSBjb2xsaWUubworCitvYmotJChDT05GSUdfU0ExMTAwX0gzNjAwKQkJKz0gaDM2MDAubworCitvYmotJChDT05GSUdfU0ExMTAwX0hBQ0tLSVQpCQkrPSBoYWNra2l0Lm8KK2xlZC0kKENPTkZJR19TQTExMDBfSEFDS0tJVCkJCSs9IGxlZHMtaGFja2tpdC5vCisKK29iai0kKENPTkZJR19TQTExMDBfSk9STkFEQTcyMCkJCSs9IGpvcm5hZGE3MjAubworCitvYmotJChDT05GSUdfU0ExMTAwX0xBUlQpCQkrPSBsYXJ0Lm8KK2xlZC0kKENPTkZJR19TQTExMDBfTEFSVCkJCSs9IGxlZHMtbGFydC5vCisKK29iai0kKENPTkZJR19TQTExMDBfUExFQikJCSs9IHBsZWIubworCitvYmotJChDT05GSUdfU0ExMTAwX1NIQU5OT04pCQkrPSBzaGFubm9uLm8KKworb2JqLSQoQ09ORklHX1NBMTEwMF9TSU1QQUQpCQkrPSBzaW1wYWQubworbGVkLSQoQ09ORklHX1NBMTEwMF9TSU1QQUQpCQkrPSBsZWRzLXNpbXBhZC5vCisKKyMgTEVEcyBzdXBwb3J0CitvYmotJChDT05GSUdfTEVEUykgKz0gJChsZWQteSkKKworIyBTQTExMTAgVVNCIGNsaWVudCBzdXBwb3J0Cisjb2JqLSQoQ09ORklHX1NBMTEwMF9VU0IpCQkrPSB1c2IvCisKKyMgTWlzY2VsYW5lb3VzIGZ1bmN0aW9ucworb2JqLSQoQ09ORklHX1BNKQkJCSs9IHBtLm8gc2xlZXAubworb2JqLSQoQ09ORklHX1NBMTEwMF9TU1ApCQkrPSBzc3AubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2YWQwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSw3IEBACisgICB6cmVsYWRkci15CTo9IDB4YzAwMDgwMDAKK2lmZXEgKCQoQ09ORklHX0FSQ0hfU0ExMTAwKSx5KQorICAgenJlbGFkZHItJChDT05GSUdfU0ExMTExKQkJOj0gMHhjMDIwODAwMAorZW5kaWYKK3BhcmFtc19waHlzLXkJOj0gMHhjMDAwMDEwMAoraW5pdHJkX3BoeXMteQk6PSAweGMwODAwMDAwCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWRmODhmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCisgKgorICogQXV0aG9yOiBOaWNvbGFzIFBpdHJlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBBc3NhYmV0LXNwZWNpZmljIHR3ZWFrcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcmRhLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2VyaWFsX3NhMTEwMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Fzc2FiZXQuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworI2RlZmluZSBBU1NBQkVUX0JDUl9EQjExMTAgXAorCShBU1NBQkVUX0JDUl9TUEtfT0ZGICAgIHwgQVNTQUJFVF9CQ1JfUU1VVEUgICAgIHwgXAorCSBBU1NBQkVUX0JDUl9MRURfR1JFRU4gIHwgQVNTQUJFVF9CQ1JfTEVEX1JFRCAgIHwgXAorCSBBU1NBQkVUX0JDUl9SUzIzMkVOICAgIHwgQVNTQUJFVF9CQ1JfTENEXzEyUkdCIHwgXAorCSBBU1NBQkVUX0JDUl9JUkRBX01EMCkKKworI2RlZmluZSBBU1NBQkVUX0JDUl9EQjExMTEgXAorCShBU1NBQkVUX0JDUl9TUEtfT0ZGICAgIHwgQVNTQUJFVF9CQ1JfUU1VVEUgICAgIHwgXAorCSBBU1NBQkVUX0JDUl9MRURfR1JFRU4gIHwgQVNTQUJFVF9CQ1JfTEVEX1JFRCAgIHwgXAorCSBBU1NBQkVUX0JDUl9SUzIzMkVOICAgIHwgQVNTQUJFVF9CQ1JfTENEXzEyUkdCIHwgXAorCSBBU1NBQkVUX0JDUl9DRl9CVVNfT0ZGIHwgQVNTQUJFVF9CQ1JfU1RFUkVPX0xCIHwgXAorCSBBU1NBQkVUX0JDUl9JUkRBX01EMCAgIHwgQVNTQUJFVF9CQ1JfQ0ZfUlNUKQorCit1bnNpZ25lZCBsb25nIFNDUl92YWx1ZSA9IEFTU0FCRVRfU0NSX0lOSVQ7CitFWFBPUlRfU1lNQk9MKFNDUl92YWx1ZSk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEJDUl92YWx1ZSA9IEFTU0FCRVRfQkNSX0RCMTExMDsKKwordm9pZCBBU1NBQkVUX0JDUl9mcm9iKHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJQkNSX3ZhbHVlID0gKEJDUl92YWx1ZSAmIH5tYXNrKSB8IHZhbDsKKwlBU1NBQkVUX0JDUiA9IEJDUl92YWx1ZTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woQVNTQUJFVF9CQ1JfZnJvYik7CisKK3N0YXRpYyB2b2lkIGFzc2FiZXRfYmFja2xpZ2h0X3Bvd2VyKGludCBvbikKK3sKKyNpZm5kZWYgQVNTQUJFVF9QQUxfVklERU8KKwlpZiAob24pCisJCUFTU0FCRVRfQkNSX3NldChBU1NBQkVUX0JDUl9MSUdIVF9PTik7CisJZWxzZQorI2VuZGlmCisJCUFTU0FCRVRfQkNSX2NsZWFyKEFTU0FCRVRfQkNSX0xJR0hUX09OKTsKK30KKworLyoKKyAqIFR1cm4gb24vb2ZmIHRoZSBiYWNrbGlnaHQuICBXaGVuIHR1cm5pbmcgdGhlIGJhY2tsaWdodCBvbiwKKyAqIHdlIHdhaXQgNTAwdXMgYWZ0ZXIgdHVybmluZyBpdCBvbiBzbyB3ZSBkb24ndCBjYXVzZSB0aGUKKyAqIHN1cHBsaWVzIHRvIGRyb29wIHdoZW4gd2UgZW5hYmxlIHRoZSBMQ0QgY29udHJvbGxlciAoYW5kCisgKiBjYXVzZSBhIGhhcmQgcmVzZXQuKQorICovCitzdGF0aWMgdm9pZCBhc3NhYmV0X2xjZF9wb3dlcihpbnQgb24pCit7CisjaWZuZGVmIEFTU0FCRVRfUEFMX1ZJREVPCisJaWYgKG9uKSB7CisJCUFTU0FCRVRfQkNSX3NldChBU1NBQkVUX0JDUl9MQ0RfT04pOworCQl1ZGVsYXkoNTAwKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlBU1NBQkVUX0JDUl9jbGVhcihBU1NBQkVUX0JDUl9MQ0RfT04pOworfQorCisKKy8qCisgKiBBc3NhYmV0IGZsYXNoIHN1cHBvcnQgY29kZS4KKyAqLworCisjaWZkZWYgQVNTQUJFVF9SRVZfNAorLyoKKyAqIFBoYXNlIDQgQXNzYWJldCBoYXMgdHdvIDI4RjE2MEIzIGZsYXNoIHBhcnRzIGluIGJhbmsgMDoKKyAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGFzc2FiZXRfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJCT0gImJvb3Rsb2FkZXIiLAorCQkuc2l6ZQkJPSAweDAwMDIwMDAwLAorCQkub2Zmc2V0CQk9IDAsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwKKwl9LCB7CisJCS5uYW1lCQk9ICJib290bG9hZGVyIHBhcmFtcyIsCisJCS5zaXplCQk9IDB4MDAwMjAwMDAsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCisJfSwgeworCQkubmFtZQkJPSAiamZmcyIsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0KK307CisjZWxzZQorLyoKKyAqIFBoYXNlIDUgQXNzYWJldCBoYXMgdHdvIDI4RjEyOEozQSBmbGFzaCBwYXJ0cyBpbiBiYW5rIDA6CisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBhc3NhYmV0X3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJib290bG9hZGVyIiwKKwkJLnNpemUJCT0gMHgwMDA0MDAwMCwKKwkJLm9mZnNldAkJPSAwLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCisJfSwgeworCQkubmFtZQkJPSAiYm9vdGxvYWRlciBwYXJhbXMiLAorCQkuc2l6ZQkJPSAweDAwMDQwMDAwLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAorCX0sIHsKKwkJLm5hbWUJCT0gImpmZnMiLAorCQkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9Cit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBhc3NhYmV0X2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLnBhcnRzCQk9IGFzc2FiZXRfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGFzc2FiZXRfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFzc2FiZXRfZmxhc2hfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBTQTExMDBfQ1MwX1BIWVMsCisJCS5lbmQJPSBTQTExMDBfQ1MwX1BIWVMgKyBTWl8zMk0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAk9IFNBMTEwMF9DUzFfUEhZUywKKwkJLmVuZAk9IFNBMTEwMF9DUzFfUEhZUyArIFNaXzMyTSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKKworLyoKKyAqIEFzc2FiZXQgSXJEQSBzdXBwb3J0IGNvZGUuCisgKi8KKworc3RhdGljIGludCBhc3NhYmV0X2lyZGFfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0YXRlKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgYmNyX3N0YXRlWzRdID0geworCQlBU1NBQkVUX0JDUl9JUkRBX01EMCwKKwkJQVNTQUJFVF9CQ1JfSVJEQV9NRDF8QVNTQUJFVF9CQ1JfSVJEQV9NRDAsCisJCUFTU0FCRVRfQkNSX0lSREFfTUQxLAorCQkwCisJfTsKKworCWlmIChzdGF0ZSA8IDQpIHsKKwkJc3RhdGUgPSBiY3Jfc3RhdGVbc3RhdGVdOworCQlBU1NBQkVUX0JDUl9jbGVhcihzdGF0ZSBeIChBU1NBQkVUX0JDUl9JUkRBX01EMXwKKwkJCQkJICAgQVNTQUJFVF9CQ1JfSVJEQV9NRDApKTsKKwkJQVNTQUJFVF9CQ1Jfc2V0KHN0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzc2FiZXRfaXJkYV9zZXRfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3BlZWQpCit7CisJaWYgKHNwZWVkIDwgNDAwMDAwMCkKKwkJQVNTQUJFVF9CQ1JfY2xlYXIoQVNTQUJFVF9CQ1JfSVJEQV9GU0VMKTsKKwllbHNlCisJCUFTU0FCRVRfQkNSX3NldChBU1NBQkVUX0JDUl9JUkRBX0ZTRUwpOworfQorCitzdGF0aWMgc3RydWN0IGlyZGFfcGxhdGZvcm1fZGF0YSBhc3NhYmV0X2lyZGFfZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCT0gYXNzYWJldF9pcmRhX3NldF9wb3dlciwKKwkuc2V0X3NwZWVkCT0gYXNzYWJldF9pcmRhX3NldF9zcGVlZCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhc3NhYmV0X2luaXQodm9pZCkKK3sKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBwb3dlciBzdXBwbHkgaXMgaW4gImhpZ2ggcG93ZXIiIG1vZGUuCisJICovCisJR1BEUiB8PSBHUElPX0dQSU8xNjsKKwlHUFNSID0gR1BJT19HUElPMTY7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZXNlIHBpbnMgYXJlIHNldCBhcyBvdXRwdXRzIGFuZCBhcmUgZHJpdmluZworCSAqIGxvZ2ljIDAuICBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3b24ndCBpbmFkdmVydGVudGx5IHRvZ2dsZQorCSAqIHRoZSBXUyBsYXRjaCBpbiB0aGUgQ1BMRCwgYW5kIHdlIGRvbid0IGZsb2F0IGNhdXNpbmcKKwkgKiBleGNlc3NpdmUgcG93ZXIgZHJhaW4uICAtLXJtaworCSAqLworCUdQRFIgfD0gR1BJT19TU1BfVFhEIHwgR1BJT19TU1BfU0NMSyB8IEdQSU9fU1NQX1NGUk07CisJR1BDUiA9IEdQSU9fU1NQX1RYRCB8IEdQSU9fU1NQX1NDTEsgfCBHUElPX1NTUF9TRlJNOworCisJLyoKKwkgKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzbGVlcCBtb2RlLgorCSAqLworCVBXRVIgPSBQV0VSX0dQSU8wOworCVBHU1IgPSAwOworCVBDRlIgPSAwOworCVBTRFIgPSAwOworCVBQRFIgfD0gUFBDX1RYRDMgfCBQUENfVFhEMTsKKwlQUFNSIHw9IFBQQ19UWEQzIHwgUFBDX1RYRDE7CisKKwlzYTExMDBmYl9sY2RfcG93ZXIgPSBhc3NhYmV0X2xjZF9wb3dlcjsKKwlzYTExMDBmYl9iYWNrbGlnaHRfcG93ZXIgPSBhc3NhYmV0X2JhY2tsaWdodF9wb3dlcjsKKworCWlmIChtYWNoaW5lX2hhc19uZXBvbnNldCgpKSB7CisJCS8qCisJCSAqIEFuZ2VsIHNldHMgdGhpcywgYnV0IG90aGVyIGJvb3Rsb2FkZXJzIG1heSBub3QuCisJCSAqCisJCSAqIFRoaXMgbXVzdCBwcmVjZWRlIGFueSBkcml2ZXIgY2FsbHMgdG8gQkNSX3NldCgpCisJCSAqIG9yIEJDUl9jbGVhcigpLgorCQkgKi8KKwkJQVNTQUJFVF9CQ1IgPSBCQ1JfdmFsdWUgPSBBU1NBQkVUX0JDUl9EQjExMTE7CisKKyNpZm5kZWYgQ09ORklHX0FTU0FCRVRfTkVQT05TRVQKKwkJcHJpbnRrKCAiV2FybmluZzogTmVwb25zZXQgZGV0ZWN0ZWQgYnV0IGZ1bGwgc3VwcG9ydCAiCisJCQkiaGFzbid0IGJlZW4gY29uZmlndXJlZCBpbiB0aGUga2VybmVsXG4iICk7CisjZW5kaWYKKwl9CisKKwlzYTExeDBfc2V0X2ZsYXNoX2RhdGEoJmFzc2FiZXRfZmxhc2hfZGF0YSwgYXNzYWJldF9mbGFzaF9yZXNvdXJjZXMsCisJCQkgICAgICBBUlJBWV9TSVpFKGFzc2FiZXRfZmxhc2hfcmVzb3VyY2VzKSk7CisJc2ExMXgwX3NldF9pcmRhX2RhdGEoJmFzc2FiZXRfaXJkYV9kYXRhKTsKK30KKworLyoKKyAqIE9uIEFzc2FiZXQsIHdlIG11c3QgcHJvYmUgZm9yIHRoZSBOZXBvbnNldCBib2FyZCBfYmVmb3JlXworICogcGFnaW5nX2luaXQoKSBoYXMgb2NjdXJyZWQgdG8gYWN0dWFsbHkgZGV0ZXJtaW5lIHRoZSBhbW91bnQKKyAqIG9mIFJBTSBhdmFpbGFibGUuICBUbyBkbyBzbywgd2UgbWFwIHRoZSBhcHByb3ByaWF0ZSBJTyBzZWN0aW9uCisgKiBpbiB0aGUgcGFnZSB0YWJsZSBoZXJlIGluIG9yZGVyIHRvIGFjY2VzcyBHUElPIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG1hcF9zYTExMDBfZ3Bpb19yZWdzKCB2b2lkICkKK3sKKwl1bnNpZ25lZCBsb25nIHBoeXMgPSBfX1BSRUcoR1BMUikgJiBQTURfTUFTSzsKKwl1bnNpZ25lZCBsb25nIHZpcnQgPSBpb19wMnYocGh5cyk7CisJaW50IHByb3QgPSBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfRE9NQUlOKERPTUFJTl9JTyk7CisJcG1kX3QgKnBtZDsKKworCXBtZCA9IHBtZF9vZmZzZXQocGdkX29mZnNldF9rKHZpcnQpLCB2aXJ0KTsKKwkqcG1kID0gX19wbWQocGh5cyB8IHByb3QpOworCWZsdXNoX3BtZF9lbnRyeShwbWQpOworfQorCisvKgorICogUmVhZCBTeXN0ZW0gQ29uZmlndXJhdGlvbiAiUmVnaXN0ZXIiCisgKiAodGFrZW4gZnJvbSAiSW50ZWwgU3Ryb25nQVJNIFNBLTExMTAgTWljcm9wcm9jZXNzb3IgRGV2ZWxvcG1lbnQgQm9hcmQKKyAqIFVzZXIncyBHdWlkZSIsIHNlY3Rpb24gNC40LjEpCisgKgorICogVGhpcyBzYW1lIHNjYW4gaXMgcGVyZm9ybWVkIGluIGFyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNhMTEwMC5TCisgKiB0byBzZXQgdXAgdGhlIHNlcmlhbCBwb3J0IGZvciBkZWNvbXByZXNzaW9uIHN0YXR1cyBtZXNzYWdlcy4gV2UKKyAqIHJlcGVhdCBpdCBoZXJlIGJlY2F1c2UgdGhlIGtlcm5lbCBtYXkgbm90IGJlIGxvYWRlZCBhcyBhIHpJbWFnZSwgYW5kCisgKiBhbHNvIGJlY2F1c2UgaXQncyBhIGhhc3NsZSB0byBjb21tdW5pY2F0ZSB0aGUgU0NSIHZhbHVlIHRvIHRoZSBrZXJuZWwKKyAqIGZyb20gdGhlIGRlY29tcHJlc3Nvci4KKyAqCisgKiBOb3RlIHRoYXQgSVJRcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGdldF9hc3NhYmV0X3Njcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2NyLCBpOworCisJR1BEUiB8PSAweDNmYzsJCQkvKiBDb25maWd1cmUgR1BJTyA5OjIgYXMgb3V0cHV0cyAqLworCUdQU1IgPSAweDNmYzsJCQkvKiBXcml0ZSAweEZGIHRvIEdQSU8gOToyICovCisJR1BEUiAmPSB+KDB4M2ZjKTsJCS8qIENvbmZpZ3VyZSBHUElPIDk6MiBhcyBpbnB1dHMgKi8KKwlmb3IoaSA9IDEwMDsgaS0tOyBzY3IgPSBHUExSKTsJLyogUmVhZCBHUElPIDk6MiAqLworCUdQRFIgfD0gMHgzZmM7CQkJLyogIHJlc3RvcmUgY29ycmVjdCBwaW4gZGlyZWN0aW9uICovCisJc2NyICY9IDB4M2ZjOwkJCS8qIHNhdmUgYXMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gYnl0ZS4gKi8KKwlTQ1JfdmFsdWUgPSBzY3I7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZml4dXBfYXNzYWJldChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLAorCSAgICAgIGNoYXIgKipjbWRsaW5lLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJLyogVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGFueSBjYWxsIHRvIG1hY2hpbmVfaGFzX25lcG9uc2V0KCkgKi8KKwltYXBfc2ExMTAwX2dwaW9fcmVncygpOworCWdldF9hc3NhYmV0X3NjcigpOworCisJaWYgKG1hY2hpbmVfaGFzX25lcG9uc2V0KCkpCisJCXByaW50aygiTmVwb25zZXQgZXhwYW5zaW9uIGJvYXJkIGRldGVjdGVkXG4iKTsKK30KKworCitzdGF0aWMgdm9pZCBhc3NhYmV0X3VhcnRfcG0oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdV9pbnQgc3RhdGUsIHVfaW50IG9sZHN0YXRlKQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIxVVRDUjApIHsKKwkJaWYgKHN0YXRlKQorCQkJQVNTQUJFVF9CQ1JfY2xlYXIoQVNTQUJFVF9CQ1JfUlMyMzJFTiB8CisJCQkJCSAgQVNTQUJFVF9CQ1JfQ09NX1JUUyB8CisJCQkJCSAgQVNTQUJFVF9CQ1JfQ09NX0RUUik7CisJCWVsc2UKKwkJCUFTU0FCRVRfQkNSX3NldChBU1NBQkVUX0JDUl9SUzIzMkVOIHwKKwkJCQkJQVNTQUJFVF9CQ1JfQ09NX1JUUyB8CisJCQkJCUFTU0FCRVRfQkNSX0NPTV9EVFIpOworCX0KK30KKworLyoKKyAqIEFzc2FiZXQgdXNlcyBDT01fUlRTIGFuZCBDT01fRFRSIGZvciBib3RoIFVBUlQxIChjb20gcG9ydCkKKyAqIGFuZCBVQVJUMyAocmFkaW8gbW9kdWxlKS4gIFdlIG9ubHkgaGFuZGxlIHRoZW0gZm9yIFVBUlQxIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIGFzc2FiZXRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVfaW50IG1jdHJsKQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIxVVRDUjApIHsKKwkJdV9pbnQgc2V0ID0gMCwgY2xlYXIgPSAwOworCisJCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJCWNsZWFyIHw9IEFTU0FCRVRfQkNSX0NPTV9SVFM7CisJCWVsc2UKKwkJCXNldCB8PSBBU1NBQkVUX0JDUl9DT01fUlRTOworCisJCWlmIChtY3RybCAmIFRJT0NNX0RUUikKKwkJCWNsZWFyIHw9IEFTU0FCRVRfQkNSX0NPTV9EVFI7CisJCWVsc2UKKwkJCXNldCB8PSBBU1NBQkVUX0JDUl9DT01fRFRSOworCisJCUFTU0FCRVRfQkNSX2NsZWFyKGNsZWFyKTsKKwkJQVNTQUJFVF9CQ1Jfc2V0KHNldCk7CisJfQorfQorCitzdGF0aWMgdV9pbnQgYXNzYWJldF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1X2ludCByZXQgPSAwOworCXVfaW50IGJzciA9IEFTU0FCRVRfQlNSOworCisJLyogbmVlZCAyIHJlYWRzIHRvIHJlYWQgY3VycmVudCB2YWx1ZSAqLworCWJzciA9IEFTU0FCRVRfQlNSOworCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gX1NlcjFVVENSMCkgeworCQlpZiAoYnNyICYgQVNTQUJFVF9CU1JfQ09NX0RDRCkKKwkJCXJldCB8PSBUSU9DTV9DRDsKKwkJaWYgKGJzciAmIEFTU0FCRVRfQlNSX0NPTV9DVFMpCisJCQlyZXQgfD0gVElPQ01fQ1RTOworCQlpZiAoYnNyICYgQVNTQUJFVF9CU1JfQ09NX0RTUikKKwkJCXJldCB8PSBUSU9DTV9EU1I7CisJfSBlbHNlIGlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIzVVRDUjApIHsKKwkJaWYgKGJzciAmIEFTU0FCRVRfQlNSX1JBRF9EQ0QpCisJCQlyZXQgfD0gVElPQ01fQ0Q7CisJCWlmIChic3IgJiBBU1NBQkVUX0JTUl9SQURfQ1RTKQorCQkJcmV0IHw9IFRJT0NNX0NUUzsKKwkJaWYgKGJzciAmIEFTU0FCRVRfQlNSX1JBRF9EU1IpCisJCQlyZXQgfD0gVElPQ01fRFNSOworCQlpZiAoYnNyICYgQVNTQUJFVF9CU1JfUkFEX1JJKQorCQkJcmV0IHw9IFRJT0NNX1JJOworCX0gZWxzZSB7CisJCXJldCA9IFRJT0NNX0NEIHwgVElPQ01fQ1RTIHwgVElPQ01fRFNSOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2ExMTAwX3BvcnRfZm5zIGFzc2FiZXRfcG9ydF9mbnMgX19pbml0ZGF0YSA9IHsKKwkuc2V0X21jdHJsCT0gYXNzYWJldF9zZXRfbWN0cmwsCisJLmdldF9tY3RybAk9IGFzc2FiZXRfZ2V0X21jdHJsLAorCS5wbQkJPSBhc3NhYmV0X3VhcnRfcG0sCit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGFzc2FiZXRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgLyogdmlydHVhbCAgICAgcGh5c2ljYWwgICAgbGVuZ3RoICAgICAgdHlwZSAqLworICB7IDB4ZjEwMDAwMDAsIDB4MTIwMDAwMDAsIDB4MDAxMDAwMDAsIE1UX0RFVklDRSB9LCAvKiBCb2FyZCBDb250cm9sIFJlZ2lzdGVyICovCisgIHsgMHhmMjgwMDAwMCwgMHg0YjgwMDAwMCwgMHgwMDgwMDAwMCwgTVRfREVWSUNFIH0gIC8qIE1RMjAwICovCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXNzYWJldF9tYXBfaW8odm9pZCkKK3sKKwlzYTExMDBfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KGFzc2FiZXRfaW9fZGVzYywgQVJSQVlfU0laRShhc3NhYmV0X2lvX2Rlc2MpKTsKKworCS8qCisJICogU2V0IFNVUyBiaXQgaW4gU0RDUjAgc28gc2VyaWFsIHBvcnQgMSBmdW5jdGlvbnMuCisJICogSXRzIGNhbGxlZCBHUENMS1IwIGluIG15IFNBMTExMCBtYW51YWwuCisJICovCisJU2VyMVNEQ1IwIHw9IFNEQ1IwX1NVUzsKKworCWlmIChtYWNoaW5lX2hhc19uZXBvbnNldCgpKSB7CisjaWZkZWYgQ09ORklHX0FTU0FCRVRfTkVQT05TRVQKKwkJZXh0ZXJuIHZvaWQgbmVwb25zZXRfbWFwX2lvKHZvaWQpOworCisJCS8qCisJCSAqIFdlIG1hcCBOZXBvbnNldCByZWdpc3RlcnMgZXZlbiBpZiBpdCBpc24ndCBwcmVzZW50IHNpbmNlCisJCSAqIG1hbnkgZHJpdmVycyB3aWxsIHRyeSB0byBwcm9iZSB0aGVpciBzdHVmZiAoYW5kIGZhaWwpLgorCQkgKiBUaGlzIGlzIHN0aWxsIG1vcmUgZnJpZW5kbHkgdGhhbiBhIGtlcm5lbCBwYWdpbmcgcmVxdWVzdAorCQkgKiBjcmFzaC4KKwkJICovCisJCW5lcG9uc2V0X21hcF9pbygpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc2ExMTAwX3JlZ2lzdGVyX3VhcnRfZm5zKCZhc3NhYmV0X3BvcnRfZm5zKTsKKwl9CisKKwkvKgorCSAqIFdoZW4gTmVwb25zZXQgaXMgYXR0YWNoZWQsIHRoZSBmaXJzdCBVQVJUIHNob3VsZCBiZQorCSAqIFVBUlQzLiAgVGhhdCdzIHdoYXQgQW5nZWwgaXMgZG9pbmcgYW5kIG1hbnkgZG9jdW1lbnRzCisJICogYXJlIHN0YXRpbmcgdGhpcy4KKwkgKgorCSAqIFdlIGRvIHRoZSBOZXBvbnNldCBtYXBwaW5nIGV2ZW4gaWYgTmVwb25zZXQgc3VwcG9ydAorCSAqIGlzbid0IGNvbXBpbGVkIGluIHNvIHRoZSB1c2VyIHdpbGwgc3RpbGwgZ2V0IHNvbWV0aGluZyBvbgorCSAqIHRoZSBleHBlY3RlZCBwaHlzaWNhbCBzZXJpYWwgcG9ydC4KKwkgKgorCSAqIFdlIG5vIGxvbmdlciBkbyB0aGlzOyBub3QgYWxsIGJvb3QgbG9hZGVycyBzdXBwb3J0IGl0LAorCSAqIGFuZCBVQVJUMyBhcHBlYXJzIHRvIGJlIHNvbWV3aGF0IHVucmVsaWFibGUgd2l0aCBibG9iLgorCSAqLworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDAsIDEpOworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDIsIDMpOworfQorCisKK01BQ0hJTkVfU1RBUlQoQVNTQUJFVCwgIkludGVsLUFzc2FiZXQiKQorCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCisJQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKKwlGSVhVUChmaXh1cF9hc3NhYmV0KQorCU1BUElPKGFzc2FiZXRfbWFwX2lvKQorCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBhc3NhYmV0X2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTYwYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYworICoKKyAqIEJhZGdlUEFEIDQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqCisgKiAgIFRpbSBDb25ub3JzIDxjb25ub3JzQGhwbC5ocC5jb20+CisgKiAgIENocmlzdG9waGVyIEhvb3ZlciA8Y2hAaHBsLmhwLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfc2ExMTAwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9iYWRnZTQuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYTExMTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJCT0gQkFER0U0X1NBMTExMV9CQVNFLAorCQkuZW5kCQk9IEJBREdFNF9TQTExMTFfQkFTRSArIDB4MDAwMDFmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CQk9IEJBREdFNF9JUlFfR1BJT19TQTExMTEsCisJCS5lbmQJCT0gQkFER0U0X0lSUV9HUElPX1NBMTExMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IHNhMTExMV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYTExMTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzYTExMTEiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sgPSAmc2ExMTExX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2ExMTExX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc2ExMTExX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2ExMTExX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJhZGdlNF9zYTExMTFfaW5pdCh2b2lkKQoreworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIG1lbW9yeSBidXMgcmVxdWVzdC9ncmFudCBzaWduYWxzIGFyZSBzZXR1cCwKKwkgKiBhbmQgdGhlIGdyYW50IGlzIGhlbGQgaW4gaXRzIGluYWN0aXZlIHN0YXRlCisJICovCisJc2ExMTEwX21iX2Rpc2FibGUoKTsKKworCS8qCisJICogUHJvYmUgZm9yIFNBMTExMS4KKwkgKi8KKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKKworLyoKKyAqIDEgeCBJbnRlbCAyOEYzMjBDMyBBZHZhbmNlZCsgQm9vdCBCbG9jayBGbGFzaCAoMzIgTWkgYml0KQorICogICBFaWdodCA0IEtpVyBQYXJhbWV0ZXIgQm90dG9tIEJsb2NrcyAoNjQgS2lCKQorICogICBTaXh0eS10aHJlZSAzMiBLaVcgTWFpbiBCbG9ja3MgKDQwMzIgS2kgYikKKyAqCisgKiA8b3I+CisgKgorICogMSB4IEludGVsIDI4RjY0MEMzIEFkdmFuY2VkKyBCb290IEJsb2NrIEZsYXNoICg2NCBNaSBiaXQpCisgKiAgIEVpZ2h0IDQgS2lXIFBhcmFtZXRlciBCb3R0b20gQmxvY2tzICg2NCBLaUIpCisgKiAgIE9uZS1odW5kcmVkLXR3ZW50eS1zZXZlbiAzMiBLaVcgTWFpbiBCbG9ja3MgKDgxMjggS2kgYikKKyAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGJhZGdlNF9wYXJ0aXRpb25zW10gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQkxPQiBib290IGxvYWRlciIsCisgICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgICAgPSAweDAwMDBBMDAwCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAicGFyYW1zIiwKKyAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisgICAgICAgICAgICAgICAgLnNpemUgICAgICAgICAgID0gMHgwMDAwNjAwMAorICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gInJvb3QiLAorICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKyAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgICAgPSBNVERQQVJUX1NJWl9GVUxMCisgICAgICAgIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBiYWRnZTRfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkucGFydHMJCT0gYmFkZ2U0X3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShiYWRnZTRfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJhZGdlNF9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gU0ExMTAwX0NTMF9QSFlTLAorCS5lbmQJCT0gU0ExMTAwX0NTMF9QSFlTICsgU1pfNjRNIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgaW50IGZpdmVfdl9vbiBfX2luaXRkYXRhID0gMDsKKworc3RhdGljIGludCBfX2luaXQgZml2ZV92X29uX3NldHVwKGNoYXIgKmlnbm9yZSkKK3sKKyAgICAgICAgZml2ZV92X29uID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImZpdmVfdl9vbiIsIGZpdmVfdl9vbl9zZXR1cCk7CisKKworc3RhdGljIGludCBfX2luaXQgYmFkZ2U0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFtYWNoaW5lX2lzX2JhZGdlNCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIExDRCAqLworCUdQQ1IgID0gKEJBREdFNF9HUElPX0xHUDIgfCBCQURHRTRfR1BJT19MR1AzIHwKKwkJIEJBREdFNF9HUElPX0xHUDQgfCBCQURHRTRfR1BJT19MR1A1IHwKKwkJIEJBREdFNF9HUElPX0xHUDYgfCBCQURHRTRfR1BJT19MR1A3IHwKKwkJIEJBREdFNF9HUElPX0xHUDggfCBCQURHRTRfR1BJT19MR1A5IHwKKwkJIEJBREdFNF9HUElPX0dQQV9WSUQgfCBCQURHRTRfR1BJT19HUEJfVklEIHwKKwkJIEJBREdFNF9HUElPX0dQQ19WSUQpOworCUdQRFIgJj0gfkJBREdFNF9HUElPX0lOVF9WSUQ7CisJR1BEUiB8PSAoQkFER0U0X0dQSU9fTEdQMiB8IEJBREdFNF9HUElPX0xHUDMgfAorCQkgQkFER0U0X0dQSU9fTEdQNCB8IEJBREdFNF9HUElPX0xHUDUgfAorCQkgQkFER0U0X0dQSU9fTEdQNiB8IEJBREdFNF9HUElPX0xHUDcgfAorCQkgQkFER0U0X0dQSU9fTEdQOCB8IEJBREdFNF9HUElPX0xHUDkgfAorCQkgQkFER0U0X0dQSU9fR1BBX1ZJRCB8IEJBREdFNF9HUElPX0dQQl9WSUQgfAorCQkgQkFER0U0X0dQSU9fR1BDX1ZJRCk7CisKKwkvKiBTRFJBTSBTUEQgaTJjICovCisJR1BDUiAgPSAoQkFER0U0X0dQSU9fU0RTREEgfCBCQURHRTRfR1BJT19TRFNDTCk7CisJR1BEUiB8PSAoQkFER0U0X0dQSU9fU0RTREEgfCBCQURHRTRfR1BJT19TRFNDTCk7CisKKwkvKiB1YXJ0ICovCisJR1BDUiAgPSAoQkFER0U0X0dQSU9fVUFSVF9IUzEgfCBCQURHRTRfR1BJT19VQVJUX0hTMik7CisJR1BEUiB8PSAoQkFER0U0X0dQSU9fVUFSVF9IUzEgfCBCQURHRTRfR1BJT19VQVJUX0hTMik7CisKKwkvKiBDUExEIG11eHNlbDAgaW5wdXQgZm9yIG11eC9hZGMgY2hpcCBzZWxlY3QgKi8KKwlHUENSICA9IEJBREdFNF9HUElPX01VWFNFTDA7CisJR1BEUiB8PSBCQURHRTRfR1BJT19NVVhTRUwwOworCisJLyogdGVzdCBwb2ludHM6IEo1LCBKNiBhcyBpbnB1dHMsIEo3IG91dHB1dHMgKi8KKwlHUERSICY9IH4oQkFER0U0X0dQSU9fVEVTVFBUX0o1IHwgQkFER0U0X0dQSU9fVEVTVFBUX0o2KTsKKwlHUENSICA9IEJBREdFNF9HUElPX1RFU1RQVF9KNzsKKwlHUERSIHw9IEJBREdFNF9HUElPX1RFU1RQVF9KNzsKKworIAkvKiA1ViBzdXBwbHkgcmFpbC4gKi8KKyAJR1BDUiAgPSBCQURHRTRfR1BJT19QQ01FTjVWOwkJLyogaW5pdGlhbGx5IG9mZiAqLworICAJR1BEUiB8PSBCQURHRTRfR1BJT19QQ01FTjVWOworCisJLyogQ1BMRCBzZHJhbSB0eXBlIGlucHV0czsgc2V0IHVwIGJ5IGJsb2IgKi8KKwkvL0dQRFIgfD0gKEJBREdFNF9HUElPX1NEVFlQMSB8IEJBREdFNF9HUElPX1NEVFlQMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogU0RSQU0gQ1BMRCB0eXAxPSVkIHR5cDA9JWRcbiIsCisJICAgICAgICEhKEdQTFIgJiBCQURHRTRfR1BJT19TRFRZUDEpLAorCSAgICAgICAhIShHUExSICYgQkFER0U0X0dQSU9fU0RUWVAwKSk7CisKKwkvKiBTQTExMTEgcmVzZXQgcGluOyBzZXQgdXAgYnkgYmxvYiAqLworCS8vR1BTUiAgPSBCQURHRTRfR1BJT19TQTExMTFfTlJTVDsKKwkvL0dQRFIgfD0gQkFER0U0X0dQSU9fU0ExMTExX05SU1Q7CisKKworCS8qIHBvd2VyIG1hbmFnZW1lbnQgY3J1ZnQgKi8KKwlQR1NSID0gMDsKKwlQV0VSID0gMDsKKwlQQ0ZSID0gMDsKKwlQU0RSID0gMDsKKworCVBXRVIgfD0gUFdFUl9HUElPMjY7CS8qIHdha2UgdXAgb24gYW4gZWRnZSBmcm9tIFRFU1RQVF9KNSAqLworCVBXRVIgfD0gUFdFUl9SVEM7CS8qIHdha2UgdXAgaWYgcnRjIGZpcmVzICovCisKKwkvKiBkcml2ZSBzYTExMTFfbnJzdCBkdXJpbmcgc2xlZXAgKi8KKwlQR1NSIHw9IEJBREdFNF9HUElPX1NBMTExMV9OUlNUOworCS8qIGRyaXZlIENQTEQgYXMgaXMgZHVyaW5nIHNsZWVwICovCisJUEdTUiB8PSAoR1BMUiAmIChCQURHRTRfR1BJT19TRFRZUDB8QkFER0U0X0dQSU9fU0RUWVAxKSk7CisKKworCS8qIE5vdyBicmluZyB1cCB0aGUgU0EtMTExMS4gKi8KKwlyZXQgPSBiYWRnZTRfc2ExMTExX2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IFNBLTExMTEgaW5pdGlhbGl6YXRpb24gZmFpbGVkICglZClcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJldCk7CisKKworCS8qIG1heWJlIHR1cm4gb24gNXYwIGZyb20gdGhlIHN0YXJ0ICovCisJYmFkZ2U0X3NldF81VihCQURHRTRfNVZfSU5JVElBTExZLCBmaXZlX3Zfb24pOworCisJc2ExMXgwX3NldF9mbGFzaF9kYXRhKCZiYWRnZTRfZmxhc2hfZGF0YSwgJmJhZGdlNF9mbGFzaF9yZXNvdXJjZSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChiYWRnZTRfaW5pdCk7CisKKworc3RhdGljIHVuc2lnbmVkIGJhZGdlNF81Vl9iaXRtYXAgPSAwOworCit2b2lkIGJhZGdlNF9zZXRfNVYodW5zaWduZWQgc3Vic3lzdGVtLCBpbnQgb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBvbGRfNVZfYml0bWFwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJb2xkXzVWX2JpdG1hcCA9IGJhZGdlNF81Vl9iaXRtYXA7CisKKwlpZiAob24pIHsKKwkJYmFkZ2U0XzVWX2JpdG1hcCB8PSBzdWJzeXN0ZW07CisJfSBlbHNlIHsKKwkJYmFkZ2U0XzVWX2JpdG1hcCAmPSB+c3Vic3lzdGVtOworCX0KKworCS8qIGRldGVjdCBvbi0+b2ZmIGFuZCBvZmYtPm9uIHRyYW5zaXRpb25zICovCisJaWYgKCghb2xkXzVWX2JpdG1hcCkgJiYgKGJhZGdlNF81Vl9iaXRtYXApKSB7CisJCS8qIHdhcyBvZmYsIG5vdyBvbiAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogZW5hYmxpbmcgNVYgc3VwcGx5IHJhaWxcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUdQU1IgPSBCQURHRTRfR1BJT19QQ01FTjVWOworCX0gZWxzZSBpZiAoKG9sZF81Vl9iaXRtYXApICYmICghYmFkZ2U0XzVWX2JpdG1hcCkpIHsKKwkJLyogd2FzIG9uLCBub3cgb2ZmICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkaXNhYmxpbmcgNVYgc3VwcGx5IHJhaWxcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUdQQ1IgPSBCQURHRTRfR1BJT19QQ01FTjVWOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woYmFkZ2U0X3NldF81Vik7CisKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBiYWRnZTRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgIC8qICB2aXJ0dWFsICAgIHBoeXNpY2FsICAgIGxlbmd0aCAgICB0eXBlICovCisgIHsweGYxMDAwMDAwLCAweDA4MDAwMDAwLCAweDAwMTAwMDAwLCBNVF9ERVZJQ0UgfSwvKiBTUkFNICBiYW5rIDEgKi8KKyAgezB4ZjIwMDAwMDAsIDB4MTAwMDAwMDAsIDB4MDAxMDAwMDAsIE1UX0RFVklDRSB9LC8qIFNSQU0gIGJhbmsgMiAqLworICB7MHhmNDAwMDAwMCwgMHg0ODAwMDAwMCwgMHgwMDEwMDAwMCwgTVRfREVWSUNFIH0gLyogU0EtMTExMSAgICAgICovCit9OworCitzdGF0aWMgdm9pZAorYmFkZ2U0X3VhcnRfcG0oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdV9pbnQgc3RhdGUsIHVfaW50IG9sZHN0YXRlKQoreworCWlmICghc3RhdGUpIHsKKwkJU2VyMVNEQ1IwIHw9IFNEQ1IwX1VBUlQ7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNhMTEwMF9wb3J0X2ZucyBiYWRnZTRfcG9ydF9mbnMgX19pbml0ZGF0YSA9IHsKKwkvLy5nZXRfbWN0cmwJPSBiYWRnZTRfZ2V0X21jdHJsLAorCS8vLnNldF9tY3RybAk9IGJhZGdlNF9zZXRfbWN0cmwsCisJLnBtCQk9IGJhZGdlNF91YXJ0X3BtLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGJhZGdlNF9tYXBfaW8odm9pZCkKK3sKKwlzYTExMDBfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KGJhZGdlNF9pb19kZXNjLCBBUlJBWV9TSVpFKGJhZGdlNF9pb19kZXNjKSk7CisKKwlzYTExMDBfcmVnaXN0ZXJfdWFydF9mbnMoJmJhZGdlNF9wb3J0X2Zucyk7CisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMCwgMyk7CisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMSwgMSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQkFER0U0LCAiSGV3bGV0dC1QYWNrYXJkIExhYm9yYXRvcmllcyBCYWRnZVBBRCA0IikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8oYmFkZ2U0X21hcF9pbykKKwlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jZXJmLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlZGRlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NlcmYuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2NlcmYuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQXByLTIwMDMgOiBSZW1vdmVkIHNvbWUgb2xkIFBEQSBjcnVkIFtGQl0KKyAqIE9jdC0yMDAzIDogQWRkZWQgdWFydDIgcmVzb3VyY2UgW0ZCXQorICogSmFuLTIwMDQgOiBSZW1vdmVkIGlvIG1hcCBmb3IgZmxhc2ggW0ZCXQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9zYTExMDAuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2NlcmYuaD4KKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2VyZnVhcnQyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHg4MDAzMDAwMCwKKwkJLmVuZAk9IDB4ODAwM2ZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjZXJmdWFydDJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzYTExeDAtdWFydCIsCisJLmlkCQk9IDIsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNlcmZ1YXJ0Ml9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNlcmZ1YXJ0Ml9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2VyZl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmY2VyZnVhcnQyX2RldmljZSwKK307CisKKyNpZmRlZiBDT05GSUdfU0ExMTAwX0NFUkZfRkxBU0hfMzJNQgorIyAgZGVmaW5lIENFUkZfRkxBU0hfU0laRQkweDAyMDAwMDAwCisjZWxpZiBkZWZpbmVkIENPTkZJR19TQTExMDBfQ0VSRl9GTEFTSF8xNk1CCisjICBkZWZpbmUgQ0VSRl9GTEFTSF9TSVpFCTB4MDEwMDAwMDAKKyNlbGlmIGRlZmluZWQgQ09ORklHX1NBMTEwMF9DRVJGX0ZMQVNIXzhNQgorIyAgZGVmaW5lIENFUkZfRkxBU0hfU0laRQkweDAwODAwMDAwCisjZWxzZQorIyAgZXJyb3IgIlVuZGVmaW5lZCBmbGFzaCBzaXplIGZvciBDRVJGIgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjZXJmX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJCb290bG9hZGVyIiwKKwkJLnNpemUJCT0gMHgwMDAyMDAwMCwKKwkJLm9mZnNldAkJPSAweDAwMDAwMDAwLAorCX0sIHsKKwkJLm5hbWUJCT0gIlBhcmFtcyIsCisJCS5zaXplCQk9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQJCT0gMHgwMDAyMDAwMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJLZXJuZWwiLAorCQkuc2l6ZQkJPSAweDAwMTAwMDAwLAorCQkub2Zmc2V0CQk9IDB4MDAwNjAwMDAsCisJfSwgeworCQkubmFtZQkJPSAiRmlsZXN5c3RlbSIsCisJCS5zaXplCQk9IENFUkZfRkxBU0hfU0laRS0weDAwMTYwMDAwLAorCQkub2Zmc2V0CQk9IDB4MDAxNjAwMDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGNlcmZfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkucGFydHMJCT0gY2VyZl9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoY2VyZl9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2VyZl9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gU0ExMTAwX0NTMF9QSFlTLAorCS5lbmQJCT0gU0ExMTAwX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY2VyZl9pbml0X2lycSh2b2lkKQoreworCXNhMTEwMF9pbml0X2lycSgpOworCXNldF9pcnFfdHlwZShDRVJGX0VUSF9JUlEsIElSUVRfUklTSU5HKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBjZXJmX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworICAvKiB2aXJ0dWFsCSBwaHlzaWNhbCAgICBsZW5ndGgJIHR5cGUgKi8KKyAgeyAweGYwMDAwMDAwLCAweDA4MDAwMDAwLCAweDAwMTAwMDAwLCBNVF9ERVZJQ0UgfSAgLyogQ3J5c3RhbCBFdGhlcm5ldCBDaGlwICovCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY2VyZl9tYXBfaW8odm9pZCkKK3sKKwlzYTExMDBfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KGNlcmZfaW9fZGVzYywgQVJSQVlfU0laRShjZXJmX2lvX2Rlc2MpKTsKKworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDAsIDMpOworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDEsIDIpOyAvKiBkaXNhYmxlIHRoaXMgYW5kIHRoZSB1YXJ0MiBkZXZpY2UgZm9yIHNhMTEwMF9maXIgKi8KKwlzYTExMDBfcmVnaXN0ZXJfdWFydCgyLCAxKTsKKworCS8qIHNldCBzb21lIEdQRFIgYml0cyBoZXJlIHdoaWxlIGl0J3Mgc2FmZSAqLworCUdQRFIgfD0gQ0VSRl9HUElPX0NGX1JFU0VUOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY2VyZl9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoY2VyZl9kZXZpY2VzLCBBUlJBWV9TSVpFKGNlcmZfZGV2aWNlcykpOworCXNhMTF4MF9zZXRfZmxhc2hfZGF0YSgmY2VyZl9mbGFzaF9kYXRhLCAmY2VyZl9mbGFzaF9yZXNvdXJjZSwgMSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQ0VSRiwgIkludHJpbnN5YyBDZXJmQm9hcmQvQ2VyZkN1YmUiKQorCU1BSU5UQUlORVIoInN1cHBvcnRAaW50cmluc3ljLmNvbSIpCisJQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKKwlNQVBJTyhjZXJmX21hcF9pbykKKwlJTklUSVJRKGNlcmZfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGNlcmZfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Mjg3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgQ29sbGllLXNwZWNpZmljIHR3ZWFrcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENoYW5nZUxvZzoKKyAqICAwMy0wNi0yMDA0IEpvaG4gTGVueiA8amVsZW56QHdpc2MuZWR1PgorICogIDA2LTA0LTIwMDIgQ2hyaXMgTGFyc29uIDxrZXJnb3RoQGRpZ2l0YWxuZW1lc2lzLm5ldD4KKyAqICAwNC0xNi0yMDAxIExpbmVvIEphcGFuLEluYy4gLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jb2xsaWUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9zYTExMDAuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NoYXJwc2xfcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvbG9jb21vLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29sbGllX3Njb29wX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CQk9IDB4NDA4MDAwMDAsCisJCS5lbmQJCT0gMHg0MDgwMGZmZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNjb29wX2NvbmZpZyBjb2xsaWVfc2Nvb3Bfc2V0dXAgPSB7CisJLmlvX2RpciAJPSBDT0xMSUVfU0NPT1BfSU9fRElSLAorCS5pb19vdXQJCT0gQ09MTElFX1NDT09QX0lPX09VVCwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29sbGllc2Nvb3BfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaGFycC1zY29vcCIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworIAkJLnBsYXRmb3JtX2RhdGEJPSAmY29sbGllX3Njb29wX3NldHVwLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvbGxpZV9zY29vcF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNvbGxpZV9zY29vcF9yZXNvdXJjZXMsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbG9jb21vX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CQk9IDB4NDAwMDAwMDAsCisJCS5lbmQJCT0gMHg0MDAwMWZmZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJCT0gSVJRX0dQSU8yNSwKKwkJLmVuZAkJPSBJUlFfR1BJTzI1LAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxvY29tb19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImxvY29tbyIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGxvY29tb19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGxvY29tb19yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmxvY29tb19kZXZpY2UsCisJJmNvbGxpZXNjb29wX2RldmljZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjb2xsaWVfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJCT0gImJvb3Rsb2FkZXIiLAorCQkub2Zmc2V0IAk9IDAsCisJCS5zaXplCQk9IDB4MDAwQzAwMDAsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRQorCX0sIHsKKwkJLm5hbWUJCT0gImtlcm5lbCIsCisJCS5vZmZzZXQgCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQkJPSAweDAwMTAwMDAwLAorCX0sIHsKKwkJLm5hbWUJCT0gInJvb3RmcyIsCisJCS5vZmZzZXQgCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQkJPSAweDAwZTIwMDAwLAorCX0KK307CisKK3N0YXRpYyB2b2lkIGNvbGxpZV9zZXRfdnBwKGludCB2cHApCit7CisJd3JpdGVfc2Nvb3BfcmVnKFNDT09QX0dQQ1IsIHJlYWRfc2Nvb3BfcmVnKFNDT09QX0dQQ1IpIHwgQ09MTElFX1NDUF9WUEVOKTsKKwlpZiAodnBwKSB7CisJCXdyaXRlX3Njb29wX3JlZyhTQ09PUF9HUFdSLCByZWFkX3Njb29wX3JlZyhTQ09PUF9HUFdSKSB8IENPTExJRV9TQ1BfVlBFTik7CisJfSBlbHNlIHsKKwkJd3JpdGVfc2Nvb3BfcmVnKFNDT09QX0dQV1IsIHJlYWRfc2Nvb3BfcmVnKFNDT09QX0dQV1IpICYgfkNPTExJRV9TQ1BfVlBFTik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgY29sbGllX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLnNldF92cHAJPSBjb2xsaWVfc2V0X3ZwcCwKKwkucGFydHMJCT0gY29sbGllX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShjb2xsaWVfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbGxpZV9mbGFzaF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IFNBMTEwMF9DUzBfUEhZUywKKwkJLmVuZAk9IFNBMTEwMF9DUzBfUEhZUyArIFNaXzMyTSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb2xsaWVfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJLyogY3B1IGluaXRpYWxpemUgKi8KKwlHQUZSID0gKCBHUElPX1NTUF9UWEQgfCBcCisJCSBHUElPX1NTUF9TQ0xLIHwgR1BJT19TU1BfU0ZSTSB8IEdQSU9fU1NQX0NMSyB8IEdQSU9fVElDX0FDSyB8IFwKKwkJIEdQSU9fMzJfNzY4a0h6ICk7CisKKwlHUERSID0gKCBHUElPX0xERDggfCBHUElPX0xERDkgfCBHUElPX0xERDEwIHwgR1BJT19MREQxMSB8IEdQSU9fTEREMTIgfCBcCisJCSBHUElPX0xERDEzIHwgR1BJT19MREQxNCB8IEdQSU9fTEREMTUgfCBHUElPX1NTUF9UWEQgfCBcCisJCSBHUElPX1NTUF9TQ0xLIHwgR1BJT19TU1BfU0ZSTSB8IEdQSU9fU0RMQ19TQ0xLIHwgXAorCQkgR1BJT19TRExDX0FBRiB8IEdQSU9fVUFSVF9TQ0xLMSB8IEdQSU9fMzJfNzY4a0h6ICk7CisJR1BMUiA9IEdQSU9fR1BJTzE4OworCisJLy8gUFBDIHBpbiBzZXR0aW5nCisJUFBEUiA9ICggUFBDX0xERDAgfCBQUENfTEREMSB8IFBQQ19MREQyIHwgUFBDX0xERDMgfCBQUENfTERENCB8IFBQQ19MREQ1IHwgXAorCQkgUFBDX0xERDYgfCBQUENfTERENyB8IFBQQ19MX1BDTEsgfCBQUENfTF9MQ0xLIHwgUFBDX0xfRkNMSyB8IFBQQ19MX0JJQVMgfCBcCisJIAkgUFBDX1RYRDEgfCBQUENfVFhEMiB8IFBQQ19SWEQyIHwgUFBDX1RYRDMgfCBQUENfVFhENCB8IFBQQ19TQ0xLIHwgUFBDX1NGUk0gKTsKKworCVBTRFIgPSAoIFBQQ19SWEQxIHwgUFBDX1JYRDIgfCBQUENfUlhEMyB8IFBQQ19SWEQ0ICk7CisKKwlHQUZSIHw9IEdQSU9fMzJfNzY4a0h6OworCUdQRFIgfD0gR1BJT18zMl83NjhrSHo7CisJVFVDUiAgPSBUVUNSXzMyXzc2OGtIejsKKworCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29sbGllOiBVbmFibGUgdG8gcmVnaXN0ZXIgTG9Db01vIGRldmljZVxuIik7CisJfQorCisJc2ExMXgwX3NldF9mbGFzaF9kYXRhKCZjb2xsaWVfZmxhc2hfZGF0YSwgY29sbGllX2ZsYXNoX3Jlc291cmNlcywKKwkJCSAgICAgIEFSUkFZX1NJWkUoY29sbGllX2ZsYXNoX3Jlc291cmNlcykpOworCisJc2hhcnBzbF9zYXZlX3BhcmFtKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgY29sbGllX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCS8qIHZpcnR1YWwgICAgIHBoeXNpY2FsICAgIGxlbmd0aCAgICAgIHR5cGUgKi8KKwl7MHhlODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgTVRfREVWSUNFfSwJLyogMzJNIG1haW4gZmxhc2ggKGNzMCkgKi8KKwl7MHhlYTAwMDAwMCwgMHgwODAwMDAwMCwgMHgwMjAwMDAwMCwgTVRfREVWSUNFfSwJLyogMzJNIGJvb3QgZmxhc2ggKGNzMSkgKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb2xsaWVfbWFwX2lvKHZvaWQpCit7CisJc2ExMTAwX21hcF9pbygpOworCWlvdGFibGVfaW5pdChjb2xsaWVfaW9fZGVzYywgQVJSQVlfU0laRShjb2xsaWVfaW9fZGVzYykpOworfQorCitNQUNISU5FX1NUQVJUKENPTExJRSwgIlNoYXJwLUNvbGxpZSIpCisJQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKKwlNQVBJTyhjb2xsaWVfbWFwX2lvKQorCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBjb2xsaWVfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTAwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNWIyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMDAuYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIGNwdS1zYTExMDAuYzogY2xvY2sgc2NhbGluZyBmb3IgdGhlIFNBMTEwMAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAyMDAxLCBUaGUgRGVsZnQgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5CisgKgorICogQXV0aG9yczogCisgKiAtIEpvaGFuIFBvdXdlbHNlIChKLkEuUG91d2Vsc2VAaXRzLnR1ZGVsZnQubmwpOiBpbml0aWFsIHZlcnNpb24KKyAqIC0gRXJpayBNb3V3IChKLkEuSy5Nb3V3QGl0cy50dWRlbGZ0Lm5sKToKKyAqICAgLSBtYWpvciByZXdyaXRlIGZvciBsaW51eC0yLjMuOTkKKyAqICAgLSByZXdyaXR0ZW4gZm9yIHRoZSBtb3JlIGdlbmVyaWMgcG93ZXIgbWFuYWdlbWVudCBzY2hlbWUgaW4gCisgKiAgICAgbGludXgtMi40LjUtcm1rMQorICoKKyAqIFRoaXMgc29mdHdhcmUgaGFzIGJlZW4gZGV2ZWxvcGVkIHdoaWxlIHdvcmtpbmcgb24gdGhlIExBUlQKKyAqIGNvbXB1dGluZyBib2FyZCAoaHR0cDovL3d3dy5sYXJ0LnR1ZGVsZnQubmwvKSwgd2hpY2ggaXMKKyAqIHNwb25zb3JlZCBieSB0aGUgTW9iaWxlIE11bHRpLW1lZGlhIENvbW11bmljYXRpb25zCisgKiAoaHR0cDovL3d3dy5tbWMudHVkZWxmdC5ubC8pIGFuZCBVYmlxdWl0b3VzIENvbW11bmljYXRpb25zIAorICogKGh0dHA6Ly93d3cudWJpY29tLnR1ZGVsZnQubmwvKSBwcm9qZWN0cy4KKyAqCisgKiBUaGUgYXV0aG9ycyBjYW4gYmUgcmVhY2hlZCBhdDoKKyAqCisgKiAgRXJpayBNb3V3CisgKiAgSW5mb3JtYXRpb24gYW5kIENvbW11bmljYXRpb24gVGhlb3J5IEdyb3VwCisgKiAgRmFjdWx0eSBvZiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IGFuZCBTeXN0ZW1zCisgKiAgRGVsZnQgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5CisgKiAgUC5PLiBCb3ggNTAzMQorICogIDI2MDAgR0EgRGVsZnQKKyAqICBUaGUgTmV0aGVybGFuZHMKKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKgorICogVGhlb3J5IG9mIG9wZXJhdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09CisgKiAKKyAqIENsb2NrIHNjYWxpbmcgY2FuIGJlIHVzZWQgdG8gbG93ZXIgdGhlIHBvd2VyIGNvbnN1bXB0aW9uIG9mIHRoZSBDUFUKKyAqIGNvcmUuIFRoaXMgd2lsbCBnaXZlIHlvdSBhIHNvbWV3aGF0IGxvbmdlciBydW5uaW5nIHRpbWUuCisgKgorICogVGhlIFNBLTExMDAgaGFzIGEgc2luZ2xlIHJlZ2lzdGVyIHRvIGNoYW5nZSB0aGUgY29yZSBjbG9jayBzcGVlZDoKKyAqCisgKiAgIFBQQ1IgICAgICAweDkwMDIwMDE0ICAgIFBMTCBjb25maWcKKyAqCisgKiBIb3dldmVyLCB0aGUgRFJBTSB0aW1pbmdzIGFyZSBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIGNvcmUgY2xvY2sKKyAqIHNwZWVkLCBzbyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGVzZSwgdG9vLiBUaGUgdXNlZCByZWdpc3RlcnMgYXJlOgorICoKKyAqICAgTURDTkZHICAgIDB4QTAwMDAwMDAgICAgRFJBTSBjb25maWcKKyAqICAgTURDQVMwICAgIDB4QTAwMDAwMDQgICAgQWNjZXNzIHdhdmVmb3JtCisgKiAgIE1EQ0FTMSAgICAweEEwMDAwMDA4ICAgIEFjY2VzcyB3YXZlZm9ybQorICogICBNRENBUzIgICAgMHhBMDAwMDAwQyAgICBBY2Nlc3Mgd2F2ZWZvcm0gCisgKgorICogQ2FyZSBtdXN0IGJlIHRha2VuIHRvIGNoYW5nZSB0aGUgRFJBTSBwYXJhbWV0ZXJzIHRoZSBjb3JyZWN0IHdheSwKKyAqIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBEUkFNIGJlY29tZXMgdW51c2FibGUgYW5kIHRoZSBrZXJuZWwgd2lsbAorICogY3Jhc2guIAorICoKKyAqIFRoZSBzaW1wbGUgc29sdXRpb24gdG8gYXZvaWQgYSBrZXJuZWwgY3Jhc2ggaXMgdG8gcHV0IHRoZSBhY3R1YWwKKyAqIGNsb2NrIGNoYW5nZSBpbiBST00gYW5kIGp1bXAgdG8gdGhhdCBjb2RlIGZyb20gdGhlIGtlcm5lbC4gVGhlIG1haW4KKyAqIGRpc2FkdmFudGFnZSBpcyB0aGF0IHRoZSBST00gaGFzIHRvIGJlIG1vZGlmaWVkLCB3aGljaCBpcyBub3QKKyAqIHBvc3NpYmxlIG9uIGFsbCBTQS0xMTAwIHBsYXRmb3Jtcy4gQW5vdGhlciBkaXNhZHZhbnRhZ2UgaXMgdGhhdAorICoganVtcGluZyB0byBST00gbWFrZXMgY2xvY2sgc3dpdGNoaW5nIHVuZWNlc3NhcnkgY29tcGxpY2F0ZWQuCisgKgorICogVGhlIGlkZWEgYmVoaW5kIHRoaXMgZHJpdmVyIGlzIHRoYXQgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uIGNhbiBiZQorICogY2hhbmdlZCB3aGlsZSBydW5uaW5nIGZyb20gRFJBTSAoZXZlbiB3aXRoIGludGVycnVwdHMgdHVybmVkIG9uISkKKyAqIGFzIGxvbmcgYXMgYWxsIHJlLWNvbmZpZ3VyYXRpb24gc3RlcHMgeWllbGQgYSB2YWxpZCBEUkFNCisgKiBjb25maWd1cmF0aW9uLiBUaGUgYWR2YW50YWdlcyBhcmUgY2xlYXI6IGl0IHdpbGwgcnVuIG9uIGFsbCBTQS0xMTAwCisgKiBwbGF0Zm9ybXMsIGFuZCB0aGUgY29kZSBpcyB2ZXJ5IHNpbXBsZS4KKyAqIAorICogSWYgeW91IHJlYWxseSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbiBpbgorICogc2ExMTAwX3VwZGF0ZV9kcmFtX3RpbWluZ3MoKSwgeW91J2xsIGhhdmUgdG8gcmVhZCBzZWN0aW9ucyA4LjIsCisgKiA5LjUuNy4zLCBhbmQgMTAuMiBmcm9tIHRoZSAiSW50ZWwgU3Ryb25nQVJNIFNBLTExMDAgTWljcm9wcm9jZXNzb3IKKyAqIERldmVsb3BlcnMgTWFudWFsIiAoYXZhaWxhYmxlIGZvciBmcmVlIGZyb20gSW50ZWwpLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgc3BlZWQ7CisJdTMyIG1kY25mZzsKKwl1MzIgbWRjYXMwOyAKKwl1MzIgbWRjYXMxOworCXUzMiBtZGNhczI7Cit9IHNhMTEwMF9kcmFtX3JlZ3NfdDsKKworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIHNhMTEwMF9kcml2ZXI7CisKK3N0YXRpYyBzYTExMDBfZHJhbV9yZWdzX3Qgc2ExMTAwX2RyYW1fc2V0dGluZ3NbXSA9Cit7CisJLyogc3BlZWQsICAgICBtZGNuZmcsICAgICBtZGNhczAsICAgICBtZGNhczEsICAgICBtZGNhczIgIGNsb2NrIGZyZXF1ZW5jeSAqLworCXsgIDU5MDAwLCAweDAwZGM4OGEzLCAweGNjY2NjY2NmLCAweGZmZmZmZmZjLCAweGZmZmZmZmZmIH0sIC8qICA1OS4wIE1IeiAqLworCXsgIDczNzAwLCAweDAxMTQ5MGEzLCAweGNjY2NjY2NmLCAweGZmZmZmZmZjLCAweGZmZmZmZmZmIH0sIC8qICA3My43IE1IeiAqLworCXsgIDg4NTAwLCAweDAxNGU5MGEzLCAweGNjY2NjY2NmLCAweGZmZmZmZmZjLCAweGZmZmZmZmZmIH0sIC8qICA4OC41IE1IeiAqLworCXsgMTAzMjAwLCAweDAxODg5OTIzLCAweGNjY2NjY2NmLCAweGZmZmZmZmZjLCAweGZmZmZmZmZmIH0sIC8qIDEwMy4yIE1IeiAqLworCXsgMTE4MDAwLCAweDAxYzI5OTIzLCAweDk5OTk5OThmLCAweGZmZmZmZmY5LCAweGZmZmZmZmZmIH0sIC8qIDExOC4wIE1IeiAqLworCXsgMTMyNzAwLCAweDAxZmIyMTIzLCAweDk5OTk5OThmLCAweGZmZmZmZmY5LCAweGZmZmZmZmZmIH0sIC8qIDEzMi43IE1IeiAqLworCXsgMTQ3NTAwLCAweDAyMzUyMTIzLCAweDMzMzMzMzBmLCAweGZmZmZmZmYzLCAweGZmZmZmZmZmIH0sIC8qIDE0Ny41IE1IeiAqLworCXsgMTYyMjAwLCAweDAyNmIyOWEzLCAweDM4ZTM4ZTFmLCAweGZmZjhlMzhlLCAweGZmZmZmZmZmIH0sIC8qIDE2Mi4yIE1IeiAqLworCXsgMTc2OTAwLCAweDAyYTMyOWEzLCAweDcxYzcxYzFmLCAweGZmZjFjNzFjLCAweGZmZmZmZmZmIH0sIC8qIDE3Ni45IE1IeiAqLworCXsgMTkxNzAwLCAweDAyZGQzMWEzLCAweGUzOGUzODNmLCAweGZmZTM4ZTM4LCAweGZmZmZmZmZmIH0sIC8qIDE5MS43IE1IeiAqLworCXsgMjA2NDAwLCAweDAzMTUzMjIzLCAweGM3MWM3MDNmLCAweGZmYzcxYzcxLCAweGZmZmZmZmZmIH0sIC8qIDIwNi40IE1IeiAqLworCXsgMjIxMjAwLCAweDAzNGZiYTIzLCAweGM3MWM3MDNmLCAweGZmYzcxYzcxLCAweGZmZmZmZmZmIH0sIC8qIDIyMS4yIE1IeiAqLworCXsgMjM1OTAwLCAweDAzODUzYTIzLCAweGUxZTFlMDdmLCAweGUxZTFlMWUxLCAweGZmZmZmZmUxIH0sIC8qIDIzNS45IE1IeiAqLworCXsgMjUwNzAwLCAweDAzYmYzYWEzLCAweGMzYzNjMDdmLCAweGMzYzNjM2MzLCAweGZmZmZmZmMzIH0sIC8qIDI1MC43IE1IeiAqLworCXsgMjY1NDAwLCAweDAzZjdjMmEzLCAweGMzYzNjMDdmLCAweGMzYzNjM2MzLCAweGZmZmZmZmMzIH0sIC8qIDI2NS40IE1IeiAqLworCXsgMjgwMjAwLCAweDA0MzFjMmEzLCAweDg3ODc4MGZmLCAweDg3ODc4Nzg3LCAweGZmZmZmZjg3IH0sIC8qIDI4MC4yIE1IeiAqLworCXsgMCwgMCwgMCwgMCwgMCB9IC8qIGxhc3QgZW50cnkgKi8KK307CisKK3N0YXRpYyB2b2lkIHNhMTEwMF91cGRhdGVfZHJhbV90aW1pbmdzKGludCBjdXJyZW50X3NwZWVkLCBpbnQgbmV3X3NwZWVkKQoreworCXNhMTEwMF9kcmFtX3JlZ3NfdCAqc2V0dGluZ3MgPSBzYTExMDBfZHJhbV9zZXR0aW5nczsKKworCS8qIGZpbmQgc3BlZWQgKi8KKwl3aGlsZSAoc2V0dGluZ3MtPnNwZWVkICE9IDApIHsKKwkJaWYobmV3X3NwZWVkID09IHNldHRpbmdzLT5zcGVlZCkKKwkJCWJyZWFrOworCQkKKwkJc2V0dGluZ3MrKzsKKwl9CisKKwlpZiAoc2V0dGluZ3MtPnNwZWVkID09IDApIHsKKwkJcGFuaWMoIiVzOiBjb3VsZG4ndCBmaW5kIGRyYW0gc2V0dGluZyBmb3Igc3BlZWQgJWRcbiIsCisJCSAgICAgIF9fRlVOQ1RJT05fXywgbmV3X3NwZWVkKTsKKwl9CisKKwkvKiBObyByaXNrLCBubyBmdW46IHJ1biB3aXRoIGludGVycnVwdHMgb24hICovCisJaWYgKG5ld19zcGVlZCA+IGN1cnJlbnRfc3BlZWQpIHsKKwkJLyogV2UncmUgZ29pbmcgRkFTVEVSLCBzbyBmaXJzdCByZWxheCB0aGUgbWVtb3J5CisJCSAqIHRpbWluZ3MgYmVmb3JlIGNoYW5naW5nIHRoZSBjb3JlIGZyZXF1ZW5jeSAKKwkJICovCisJCQorCQkvKiBIYWxmIHRoZSBtZW1vcnkgYWNjZXNzIGNsb2NrICovCisJCU1EQ05GRyB8PSBNRENORkdfQ0RCMjsKKworCQkvKiBUaGUgb3JkZXIgb2YgdGhlc2Ugc3RhdGVtZW50cyBJUyBpbXBvcnRhbnQsIGtlZXAgOAorCQkgKiBwdWxzZXMhIQorCQkgKi8KKwkJTURDQVMyID0gc2V0dGluZ3MtPm1kY2FzMjsKKwkJTURDQVMxID0gc2V0dGluZ3MtPm1kY2FzMTsKKwkJTURDQVMwID0gc2V0dGluZ3MtPm1kY2FzMDsKKwkJTURDTkZHID0gc2V0dGluZ3MtPm1kY25mZzsKKwl9IGVsc2UgeworCQkvKiBXZSdyZSBnb2luZyBTTE9XRVI6IGZpcnN0IGRlY3JlYXNlIHRoZSBjb3JlCisJCSAqIGZyZXF1ZW5jeSBhbmQgdGhlbiB0aWdodGVuIHRoZSBtZW1vcnkgc2V0dGluZ3MuCisJCSAqLworCisJCS8qIEhhbGYgdGhlIG1lbW9yeSBhY2Nlc3MgY2xvY2sgKi8KKwkJTURDTkZHIHw9IE1EQ05GR19DREIyOworCisJCS8qIFRoZSBvcmRlciBvZiB0aGVzZSBzdGF0ZW1lbnRzIElTIGltcG9ydGFudCwga2VlcCA4CisJCSAqIHB1bHNlcyEhCisJCSAqLworCQlNRENBUzAgPSBzZXR0aW5ncy0+bWRjYXMwOworCQlNRENBUzEgPSBzZXR0aW5ncy0+bWRjYXMxOworCQlNRENBUzIgPSBzZXR0aW5ncy0+bWRjYXMyOworCQlNRENORkcgPSBzZXR0aW5ncy0+bWRjbmZnOworCX0KK30KKworc3RhdGljIGludCBzYTExMDBfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IGN1ciA9IHNhMTF4MF9nZXRzcGVlZCgwKTsKKwl1bnNpZ25lZCBpbnQgbmV3X3BwY3I7CisKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwlzd2l0Y2gocmVsYXRpb24peworCWNhc2UgQ1BVRlJFUV9SRUxBVElPTl9MOgorCQluZXdfcHBjciA9IHNhMTF4MF9mcmVxX3RvX3BwY3IodGFyZ2V0X2ZyZXEpOworCQlpZiAoc2ExMXgwX3BwY3JfdG9fZnJlcShuZXdfcHBjcikgPiBwb2xpY3ktPm1heCkKKwkJCW5ld19wcGNyLS07CisJCWJyZWFrOworCWNhc2UgQ1BVRlJFUV9SRUxBVElPTl9IOgorCQluZXdfcHBjciA9IHNhMTF4MF9mcmVxX3RvX3BwY3IodGFyZ2V0X2ZyZXEpOworCQlpZiAoKHNhMTF4MF9wcGNyX3RvX2ZyZXEobmV3X3BwY3IpID4gdGFyZ2V0X2ZyZXEpICYmCisJCSAgICAoc2ExMXgwX3BwY3JfdG9fZnJlcShuZXdfcHBjciAtIDEpID49IHBvbGljeS0+bWluKSkKKwkJCW5ld19wcGNyLS07CisJCWJyZWFrOworCX0KKworCWZyZXFzLm9sZCA9IGN1cjsKKwlmcmVxcy5uZXcgPSBzYTExeDBfcHBjcl90b19mcmVxKG5ld19wcGNyKTsKKwlmcmVxcy5jcHUgPSAwOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCWlmIChmcmVxcy5uZXcgPiBjdXIpCisJCXNhMTEwMF91cGRhdGVfZHJhbV90aW1pbmdzKGN1ciwgZnJlcXMubmV3KTsKKworCVBQQ1IgPSBuZXdfcHBjcjsKKworCWlmIChmcmVxcy5uZXcgPCBjdXIpCisJCXNhMTEwMF91cGRhdGVfZHJhbV90aW1pbmdzKGN1ciwgZnJlcXMubmV3KTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNhMTEwMF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gc2ExMXgwX2dldHNwZWVkKDApOworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxID0gNTkwMDA7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gMjg3MDAwOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgc2ExMTAwX2RyaXZlciA9IHsKKwkuZmxhZ3MJCT0gQ1BVRlJFUV9TVElDS1ksCisJLnZlcmlmeQkJPSBzYTExeDBfdmVyaWZ5X3NwZWVkLAorCS50YXJnZXQJCT0gc2ExMTAwX3RhcmdldCwKKwkuZ2V0CQk9IHNhMTF4MF9nZXRzcGVlZCwKKwkuaW5pdAkJPSBzYTExMDBfY3B1X2luaXQsCisJLm5hbWUJCT0gInNhMTEwMCIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYTExMDBfZHJhbV9pbml0KHZvaWQpCit7CisgCWlmICgocHJvY2Vzc29yX2lkICYgQ1BVX1NBMTEwMF9NQVNLKSA9PSBDUFVfU0ExMTAwX0lEKQorCQlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnNhMTEwMF9kcml2ZXIpOworCWVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2FyY2hfaW5pdGNhbGwoc2ExMTAwX2RyYW1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyYTg5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3NlbGwgS2luZworICoKKyAqICAkSWQ6IGNwdS1zYTExMTAuYyx2IDEuOSAyMDAyLzA3LzA2IDE2OjUzOjE4IHJtayBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTm90ZTogdGhlcmUgYXJlIHR3byBlcnJhdGFzIHRoYXQgYXBwbHkgdG8gdGhlIFNBMTExMCBoZXJlOgorICogIDcgLSBTRFJBTSBhdXRvLXBvd2VyLXVwIGZhaWx1cmUgKHJldiBBMCkKKyAqIDEzIC0gQ29ycnVwdGlvbiBvZiBpbnRlcm5hbCByZWdpc3RlciByZWFkcy93cml0ZXMgZm9sbG93aW5nCisgKiAgICAgIFNEUkFNIHJlYWRzIChyZXYgQTAsIEIwLCBCMSkKKyAqCisgKiBXZSBpZ25vcmUgcmV2LiBBMCBhbmQgQjAgZGV2aWNlczsgSSBkb24ndCB0aGluayB0aGV5J3JlIHdvcnRoIHN1cHBvcnRpbmcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyN1bmRlZiBERUJVRworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIHNhMTExMF9kcml2ZXI7CisKK3N0cnVjdCBzZHJhbV9wYXJhbXMgeworCXVfY2hhciAgcm93czsJCS8qIGJpdHMJCQkJICovCisJdV9jaGFyICBjYXNfbGF0ZW5jeTsJLyogY3ljbGVzCQkJICovCisJdV9jaGFyICB0Y2s7CQkvKiBjbG9jayBjeWNsZSB0aW1lIChucykJICovCisJdV9jaGFyICB0cmNkOwkJLyogYWN0aXZhdGUgdG8gci93IChucykJCSAqLworCXVfY2hhciAgdHJwOwkJLyogcHJlY2hhcmdlIHRvIGFjdGl2YXRlIChucykJICovCisJdV9jaGFyICB0d3I7CQkvKiB3cml0ZSByZWNvdmVyeSB0aW1lIChucykJICovCisJdV9zaG9ydCByZWZyZXNoOwkvKiByZWZyZXNoIHRpbWUgZm9yIGFycmF5ICh1cykJICovCit9OworCitzdHJ1Y3Qgc2RyYW1faW5mbyB7CisJdV9pbnQJbWRjbmZnOworCXVfaW50CW1kcmVmcjsKKwl1X2ludAltZGNhc1szXTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2RyYW1fcGFyYW1zIHRjNTlzbTcxNl9jbDJfcGFyYW1zIF9faW5pdGRhdGEgPSB7CisJLnJvd3MJCQk9IDEyLAorCS50Y2sJCQk9IDEwLAorCS50cmNkCQkJPSAyMCwKKwkudHJwCQkJPSAyMCwKKwkudHdyCQkJPSAxMCwKKwkucmVmcmVzaAkJPSA2NDAwMCwKKwkuY2FzX2xhdGVuY3kJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2RyYW1fcGFyYW1zIHRjNTlzbTcxNl9jbDNfcGFyYW1zIF9faW5pdGRhdGEgPSB7CisJLnJvd3MJCQk9IDEyLAorCS50Y2sJCQk9IDgsCisJLnRyY2QJCQk9IDIwLAorCS50cnAJCQk9IDIwLAorCS50d3IJCQk9IDgsCisJLnJlZnJlc2gJCT0gNjQwMDAsCisJLmNhc19sYXRlbmN5CQk9IDMsCit9OworCitzdGF0aWMgc3RydWN0IHNkcmFtX3BhcmFtcyBzYW1zdW5nX2s0czY0MTYzMmRfdGM3NSBfX2luaXRkYXRhID0geworCS5yb3dzCQkJPSAxNCwKKwkudGNrCQkJPSA5LAorCS50cmNkCQkJPSAyNywKKwkudHJwCQkJPSAyMCwKKwkudHdyCQkJPSA5LAorCS5yZWZyZXNoCQk9IDY0MDAwLAorCS5jYXNfbGF0ZW5jeQkJPSAzLAorfTsKKworc3RhdGljIHN0cnVjdCBzZHJhbV9wYXJhbXMgc2Ftc3VuZ19rbTQxNnM0MDMwY3QgX19pbml0ZGF0YSA9IHsKKwkucm93cwkJCT0gMTMsCisJLnRjawkJCT0gOCwKKwkudHJjZAkJCT0gMjQsCS8qIDMgQ0xLcyAqLworCS50cnAJCQk9IDI0LAkvKiAzIENMS3MgKi8KKwkudHdyCQkJPSAxNiwJLyogVHJkbDogMiBDTEtzICovCisJLnJlZnJlc2gJCT0gNjQwMDAsCisJLmNhc19sYXRlbmN5CQk9IDMsCit9OworCitzdGF0aWMgc3RydWN0IHNkcmFtX3BhcmFtcyB3Ym9uZF93OTgyNTE2YWg3NWxfY2wzX3BhcmFtcyBfX2luaXRkYXRhID0geworCS5yb3dzCQkJPSAxNiwKKwkudGNrCQkJPSA4LAorCS50cmNkCQkJPSAyMCwKKwkudHJwCQkJPSAyMCwKKwkudHdyCQkJPSA4LAorCS5yZWZyZXNoCQk9IDY0MDAwLAorCS5jYXNfbGF0ZW5jeQkJPSAzLAorfTsKKworc3RhdGljIHN0cnVjdCBzZHJhbV9wYXJhbXMgc2RyYW1fcGFyYW1zOworCisvKgorICogR2l2ZW4gYSBwZXJpb2QgaW4gbnMgYW5kIGZyZXF1ZW5jeSBpbiBraHosIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mCisgKiBjeWNsZXMgb2YgZnJlcXVlbmN5IGluIHBlcmlvZC4gIE5vdGUgdGhhdCB3ZSByb3VuZCB1cCB0byB0aGUgbmV4dAorICogY3ljbGUsIGV2ZW4gaWYgd2UgYXJlIG9ubHkgc2xpZ2h0bHkgb3Zlci4KKyAqLworc3RhdGljIGlubGluZSB1X2ludCBuc190b19jeWNsZXModV9pbnQgbnMsIHVfaW50IGtoeikKK3sKKwlyZXR1cm4gKG5zICoga2h6ICsgOTk5OTk5KSAvIDEwMDAwMDA7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIE1EQ0FTIHJlZ2lzdGVyIGJpdCBwYXR0ZXJuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21kY2FzKHVfaW50ICptZGNhcywgaW50IGRlbGF5ZWQsIHVfaW50IHJjZCkKK3sKKwl1X2ludCBzaGlmdDsKKworCXJjZCA9IDIgKiByY2QgLSAxOworCXNoaWZ0ID0gZGVsYXllZCArIDEgKyByY2Q7CisKKwltZGNhc1swXSAgPSAoMSA8PCByY2QpIC0gMTsKKwltZGNhc1swXSB8PSAweDU1NTU1NTU1IDw8IHNoaWZ0OworCW1kY2FzWzFdICA9IG1kY2FzWzJdID0gMHg1NTU1NTU1NSA8PCAoc2hpZnQgJiAxKTsKK30KKworc3RhdGljIHZvaWQKK3NkcmFtX2NhbGN1bGF0ZV90aW1pbmcoc3RydWN0IHNkcmFtX2luZm8gKnNkLCB1X2ludCBjcHVfa2h6LAorCQkgICAgICAgc3RydWN0IHNkcmFtX3BhcmFtcyAqc2RyYW0pCit7CisJdV9pbnQgbWVtX2toeiwgc2Rfa2h6LCB0cnAsIHR3cjsKKworCW1lbV9raHogPSBjcHVfa2h6IC8gMjsKKwlzZF9raHogPSBtZW1fa2h6OworCisJLyoKKwkgKiBJZiBTRENMSyB3b3VsZCBpbnZhbGlkYXRlIHRoZSBTRFJBTSB0aW1pbmdzLAorCSAqIHJ1biBTRENMSyBhdCBoYWxmIHNwZWVkLgorCSAqCisJICogQ1BVIHN0ZXBwaW5ncyBwcmlvciB0byBCMiBtdXN0IGVpdGhlciBydW4gdGhlIG1lbW9yeSBhdAorCSAqIGhhbGYgc3BlZWQgb3IgdXNlIGRlbGF5ZWQgcmVhZCBsYXRjaGluZyAoZXJyYXRhIDEzKS4KKwkgKi8KKwlpZiAoKG5zX3RvX2N5Y2xlcyhzZHJhbS0+dGNrLCBzZF9raHopID4gMSkgfHwKKwkgICAgKENQVV9SRVZJU0lPTiA8IENQVV9TQTExMTBfQjIgJiYgc2Rfa2h6IDwgNjIwMDApKQorCQlzZF9raHogLz0gMjsKKworCXNkLT5tZGNuZmcgPSBNRENORkcgJiAweDAwN2YwMDdmOworCisJdHdyID0gbnNfdG9fY3ljbGVzKHNkcmFtLT50d3IsIG1lbV9raHopOworCisJLyogdHJwIHNob3VsZCBhbHdheXMgYmUgPjEgKi8KKwl0cnAgPSBuc190b19jeWNsZXMoc2RyYW0tPnRycCwgbWVtX2toeikgLSAxOworCWlmICh0cnAgPCAxKQorCQl0cnAgPSAxOworCisJc2QtPm1kY25mZyB8PSB0cnAgPDwgODsKKwlzZC0+bWRjbmZnIHw9IHRycCA8PCAyNDsKKwlzZC0+bWRjbmZnIHw9IHNkcmFtLT5jYXNfbGF0ZW5jeSA8PCAxMjsKKwlzZC0+bWRjbmZnIHw9IHNkcmFtLT5jYXNfbGF0ZW5jeSA8PCAyODsKKwlzZC0+bWRjbmZnIHw9IHR3ciA8PCAxNDsKKwlzZC0+bWRjbmZnIHw9IHR3ciA8PCAzMDsKKworCXNkLT5tZHJlZnIgPSBNRFJFRlIgJiAweGZmYmZmZmYwOworCXNkLT5tZHJlZnIgfD0gNzsKKworCWlmIChzZF9raHogIT0gbWVtX2toeikKKwkJc2QtPm1kcmVmciB8PSBNRFJFRlJfSzFEQjI7CisKKwkvKiBpbml0aWFsIG51bWJlciBvZiAnMSdzIGluIE1EQ0FTICsgMSAqLworCXNldF9tZGNhcyhzZC0+bWRjYXMsIHNkX2toeiA+PSA2MjAwMCwgbnNfdG9fY3ljbGVzKHNkcmFtLT50cmNkLCBtZW1fa2h6KSk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiTURDTkZHOiAlMDh4IE1EUkVGUjogJTA4eCBNRENBUzA6ICUwOHggTURDQVMxOiAlMDh4IE1EQ0FTMjogJTA4eFxuIiwKKwkJc2QtPm1kY25mZywgc2QtPm1kcmVmciwgc2QtPm1kY2FzWzBdLCBzZC0+bWRjYXNbMV0sIHNkLT5tZGNhc1syXSk7CisjZW5kaWYKK30KKworLyoKKyAqIFNldCB0aGUgU0RSQU0gcmVmcmVzaCByYXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2RyYW1fc2V0X3JlZnJlc2godV9pbnQgZHJpKQoreworCU1EUkVGUiA9IChNRFJFRlIgJiAweGZmZmYwMDBmKSB8IChkcmkgPDwgNCk7CisJKHZvaWQpIE1EUkVGUjsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgcmVmcmVzaCBwZXJpb2QuICBXZSBkbyB0aGlzIHN1Y2ggdGhhdCB3ZSBhbHdheXMgcmVmcmVzaAorICogdGhlIFNEUkFNcyB3aXRoaW4gdGhlaXIgcGVybWlzc2libGUgcGVyaW9kLiAgVGhlIHJlZnJlc2ggcGVyaW9kIGlzCisgKiBhbHdheXMgYSBtdWx0aXBsZSBvZiB0aGUgbWVtb3J5IGNsb2NrIChmaXhlZCBhdCBjcHVfY2xvY2sgLyAyKS4KKyAqCisgKiBGSVhNRTogd2UgZG9uJ3QgY3VycmVudGx5IHRha2UgYWNjb3VudCBvZiBidXJzdCBhY2Nlc3NlcyBoZXJlLAorICogYnV0IG5laXRoZXIgZG8gSW50ZWxzIERNIG5vciBBbmdlbC4KKyAqLworc3RhdGljIHZvaWQKK3NkcmFtX3VwZGF0ZV9yZWZyZXNoKHVfaW50IGNwdV9raHosIHN0cnVjdCBzZHJhbV9wYXJhbXMgKnNkcmFtKQoreworCXVfaW50IG5zX3JvdyA9IChzZHJhbS0+cmVmcmVzaCAqIDEwMDApID4+IHNkcmFtLT5yb3dzOworCXVfaW50IGRyaSA9IG5zX3RvX2N5Y2xlcyhuc19yb3csIGNwdV9raHogLyAyKSAvIDMyOworCisjaWZkZWYgREVCVUcKKwltZGVsYXkoMjUwKTsKKwlwcmludGsoIm5ldyBkcmkgdmFsdWUgPSAlZFxuIiwgZHJpKTsKKyNlbmRpZgorCisJc2RyYW1fc2V0X3JlZnJlc2goZHJpKTsKK30KKworLyoKKyAqIE9rLCBzZXQgdGhlIENQVSBmcmVxdWVuY3kuICAKKyAqLworc3RhdGljIGludCBzYTExMTBfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IHNkcmFtX3BhcmFtcyAqc2RyYW0gPSAmc2RyYW1fcGFyYW1zOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXN0cnVjdCBzZHJhbV9pbmZvIHNkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHBwY3IsIHVudXNlZDsKKworCXN3aXRjaChyZWxhdGlvbil7CisJY2FzZSBDUFVGUkVRX1JFTEFUSU9OX0w6CisJCXBwY3IgPSBzYTExeDBfZnJlcV90b19wcGNyKHRhcmdldF9mcmVxKTsKKwkJaWYgKHNhMTF4MF9wcGNyX3RvX2ZyZXEocHBjcikgPiBwb2xpY3ktPm1heCkKKwkJCXBwY3ItLTsKKwkJYnJlYWs7CisJY2FzZSBDUFVGUkVRX1JFTEFUSU9OX0g6CisJCXBwY3IgPSBzYTExeDBfZnJlcV90b19wcGNyKHRhcmdldF9mcmVxKTsKKwkJaWYgKHBwY3IgJiYgKHNhMTF4MF9wcGNyX3RvX2ZyZXEocHBjcikgPiB0YXJnZXRfZnJlcSkgJiYKKwkJICAgIChzYTExeDBfcHBjcl90b19mcmVxKHBwY3ItMSkgPj0gcG9saWN5LT5taW4pKQorCQkJcHBjci0tOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmcmVxcy5vbGQgPSBzYTExeDBfZ2V0c3BlZWQoMCk7CisJZnJlcXMubmV3ID0gc2ExMXgwX3BwY3JfdG9fZnJlcShwcGNyKTsKKwlmcmVxcy5jcHUgPSAwOworCisJc2RyYW1fY2FsY3VsYXRlX3RpbWluZygmc2QsIGZyZXFzLm5ldywgc2RyYW0pOworCisjaWYgMAorCS8qCisJICogVGhlc2UgdmFsdWVzIGFyZSB3cm9uZyBhY2NvcmRpbmcgdG8gdGhlIFNBMTExMCBkb2N1bWVudGF0aW9uCisJICogYW5kIGVycmF0YSwgYnV0IHRoZXkgc2VlbSB0byB3b3JrLiAgTmVlZCB0byBnZXQgYSBzdG9yYWdlCisJICogc2NvcGUgb24gdG8gdGhlIFNEUkFNIHNpZ25hbHMgdG8gd29yayBvdXQgd2h5LgorCSAqLworCWlmIChwb2xpY3ktPm1heCA8IDE0NzUwMCkgeworCQlzZC5tZHJlZnIgfD0gTURSRUZSX0sxREIyOworCQlzZC5tZGNhc1swXSA9IDB4YWFhYWFhN2Y7CisJfSBlbHNlIHsKKwkJc2QubWRyZWZyICY9IH5NRFJFRlJfSzFEQjI7CisJCXNkLm1kY2FzWzBdID0gMHhhYWFhYWE5ZjsKKwl9CisJc2QubWRjYXNbMV0gPSAweGFhYWFhYWFhOworCXNkLm1kY2FzWzJdID0gMHhhYWFhYWFhYTsKKyNlbmRpZgorCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCS8qCisJICogVGhlIGNsb2NrIGNvdWxkIGJlIGdvaW5nIGF3YXkgZm9yIHNvbWUgdGltZS4gIFNldCB0aGUgU0RSQU1zCisJICogdG8gcmVmcmVzaCByYXBpZGx5IChldmVyeSA2NCBtZW1vcnkgY2xvY2sgY3ljbGVzKS4gIFRvIGdldAorCSAqIHRocm91Z2ggdGhlIHdob2xlIGFycmF5LCB3ZSBuZWVkIHRvIHdhaXQgMjYyMTQ0IG1jbGsgY3ljbGVzLgorCSAqIFdlIHdhaXQgMjBtcyB0byBiZSBzYWZlLgorCSAqLworCXNkcmFtX3NldF9yZWZyZXNoKDIpOworCWlmICghaXJxc19kaXNhYmxlZCgpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyMCAqIEhaIC8gMTAwMCk7CisJfSBlbHNlIHsKKwkJbWRlbGF5KDIwKTsKKwl9CisKKwkvKgorCSAqIFJlcHJvZ3JhbSB0aGUgRFJBTSB0aW1pbmdzIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCwgYW5kCisJICogZW5zdXJlIHRoYXQgd2UgYXJlIGRvaW5nIHRoaXMgd2l0aGluIGEgY29tcGxldGUgY2FjaGUgbGluZS4KKwkgKiBUaGlzIG1lYW5zIHRoYXQgd2Ugd29uJ3QgYWNjZXNzIFNEUkFNIGZvciB0aGUgZHVyYXRpb24gb2YKKwkgKiB0aGUgcHJvZ3JhbW1pbmcuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWFzbSgibWNyIHAxNSwgMCwgJTAsIGM3LCBjMTAsIDQiIDogOiAiciIgKDApKTsKKwl1ZGVsYXkoMTApOworCV9fYXNtX18gX192b2xhdGlsZV9fKCIJCQkJCVxuXAorCQliCTJmCQkJCQlcblwKKwkJLmFsaWduCTUJCQkJCVxuXAorMToJCXN0cgklMywgWyUxLCAjMF0JCUAgTURDTkZHCVxuXAorCQlzdHIJJTQsIFslMSwgIzI4XQkJQCBNRFJFRlIJXG5cCisJCXN0cgklNSwgWyUxLCAjNF0JCUAgTURDQVMwCVxuXAorCQlzdHIJJTYsIFslMSwgIzhdCQlAIE1EQ0FTMQlcblwKKwkJc3RyCSU3LCBbJTEsICMxMl0JCUAgTURDQVMyCVxuXAorCQlzdHIJJTgsIFslMiwgIzBdCQlAIFBQQ1IJCVxuXAorCQlsZHIJJTAsIFslMSwgIzBdCQkJCVxuXAorCQliCTNmCQkJCQlcblwKKzI6CQliCTFiCQkJCQlcblwKKzM6CQlub3AJCQkJCQlcblwKKwkJbm9wIgorCQk6ICI9JnIiICh1bnVzZWQpCisJCTogInIiICgmTURDTkZHKSwgInIiICgmUFBDUiksICIwIiAoc2QubWRjbmZnKSwKKwkJICAiciIgKHNkLm1kcmVmciksICJyIiAoc2QubWRjYXNbMF0pLAorCQkgICJyIiAoc2QubWRjYXNbMV0pLCAiciIgKHNkLm1kY2FzWzJdKSwgInIiIChwcGNyKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyoKKwkgKiBOb3csIHJldHVybiB0aGUgU0RSQU0gcmVmcmVzaCBiYWNrIHRvIG5vcm1hbC4KKwkgKi8KKwlzZHJhbV91cGRhdGVfcmVmcmVzaChmcmVxcy5uZXcsIHNkcmFtKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNhMTExMF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gc2ExMXgwX2dldHNwZWVkKDApOworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxID0gNTkwMDA7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gMjg3MDAwOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgc2ExMTEwX2RyaXZlciA9IHsKKwkuZmxhZ3MJCT0gQ1BVRlJFUV9TVElDS1ksCisJLnZlcmlmeQkJPSBzYTExeDBfdmVyaWZ5X3NwZWVkLAorCS50YXJnZXQJCT0gc2ExMTEwX3RhcmdldCwKKwkuZ2V0CQk9IHNhMTF4MF9nZXRzcGVlZCwKKwkuaW5pdAkJPSBzYTExMTBfY3B1X2luaXQsCisJLm5hbWUJCT0gInNhMTExMCIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYTExMTBfY2xrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2RyYW1fcGFyYW1zICpzZHJhbSA9IE5VTEw7CisKKwlpZiAobWFjaGluZV9pc19hc3NhYmV0KCkpCisJCXNkcmFtID0gJnRjNTlzbTcxNl9jbDNfcGFyYW1zOworCisJaWYgKG1hY2hpbmVfaXNfcHRfc3lzdGVtMygpKQorCQlzZHJhbSA9ICZzYW1zdW5nX2s0czY0MTYzMmRfdGM3NTsKKworCWlmIChtYWNoaW5lX2lzX2gzMTAwKCkpCisJCXNkcmFtID0gJnNhbXN1bmdfa200MTZzNDAzMGN0OworCisJaWYgKHNkcmFtKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJTRFJBTTogdGNrOiAlZCB0cmNkOiAlZCB0cnA6ICVkIgorCQkJIiB0d3I6ICVkIHJlZnJlc2g6ICVkIGNhc19sYXRlbmN5OiAlZFxuIiwKKwkJCXNkcmFtLT50Y2ssIHNkcmFtLT50cmNkLCBzZHJhbS0+dHJwLAorCQkJc2RyYW0tPnR3ciwgc2RyYW0tPnJlZnJlc2gsIHNkcmFtLT5jYXNfbGF0ZW5jeSk7CisKKwkJbWVtY3B5KCZzZHJhbV9wYXJhbXMsIHNkcmFtLCBzaXplb2Yoc2RyYW1fcGFyYW1zKSk7CisKKwkJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZzYTExMTBfZHJpdmVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChzYTExMTBfY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTBlNDQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwvZG1hLXNhMTEwMC5jCisgKgorICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBTQTExeDAgaW50ZXJuYWwgRE1BIGNoYW5uZWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBieSBOaWNvbGFzIFBpdHJlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisKKyN1bmRlZiBERUJVRworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQUklOVEsoIHMsIGFyZy4uLiApICBwcmludGsoICJkbWE8JXA+OiAiIHMsIHJlZ3MgLCAjI2FyZyApCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKCB4Li4uICkKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCBjaGFyICpkZXZpY2VfaWQ7CQkvKiBkZXZpY2UgbmFtZSAqLworCXVfbG9uZyBkZXZpY2U7CQkJLyogdGhpcyBjaGFubmVsIGRldmljZSwgMCAgaWYgdW51c2VkKi8KKwlkbWFfY2FsbGJhY2tfdCBjYWxsYmFjazsJLyogdG8gY2FsbCB3aGVuIERNQSBjb21wbGV0ZXMgKi8KKwl2b2lkICpkYXRhOwkJCS8qIC4uLiB3aXRoIHByaXZhdGUgZGF0YSBwdHIgKi8KK30gc2ExMTAwX2RtYV90OworCitzdGF0aWMgc2ExMTAwX2RtYV90IGRtYV9jaGFuW1NBMTEwMF9ETUFfQ0hBTk5FTFNdOworCitzdGF0aWMgc3BpbmxvY2tfdCBkbWFfbGlzdF9sb2NrOworCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlkbWFfcmVnc190ICpkbWFfcmVncyA9IGRldl9pZDsKKwlzYTExMDBfZG1hX3QgKmRtYSA9IGRtYV9jaGFuICsgKCgodV9pbnQpZG1hX3JlZ3MgPj4gNSkgJiA3KTsKKwlpbnQgc3RhdHVzID0gZG1hX3JlZ3MtPlJkRENTUjsKKworCWlmIChzdGF0dXMgJiAoRENTUl9FUlJPUikpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRE1BIG9uIFwiJXNcIiBjYXVzZWQgYW4gZXJyb3JcbiIsIGRtYS0+ZGV2aWNlX2lkKTsKKwkJZG1hX3JlZ3MtPkNsckRDU1IgPSBEQ1NSX0VSUk9SOworCX0KKworCWRtYV9yZWdzLT5DbHJEQ1NSID0gc3RhdHVzICYgKERDU1JfRE9ORUEgfCBEQ1NSX0RPTkVCKTsKKwlpZiAoZG1hLT5jYWxsYmFjaykgeworCQlpZiAoc3RhdHVzICYgRENTUl9ET05FQSkKKwkJCWRtYS0+Y2FsbGJhY2soZG1hLT5kYXRhKTsKKwkJaWYgKHN0YXR1cyAmIERDU1JfRE9ORUIpCisJCQlkbWEtPmNhbGxiYWNrKGRtYS0+ZGF0YSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioKKyAqCXNhMTEwMF9yZXF1ZXN0X2RtYSAtIGFsbG9jYXRlIG9uZSBvZiB0aGUgU0ExMXgwJ3MgRE1BIGNoYW5lbHMKKyAqCUBkZXZpY2U6IFRoZSBTQTExeDAgcGVyaXBoZXJhbCB0YXJnZXRlZCBieSB0aGlzIHJlcXVlc3QKKyAqCUBkZXZpY2VfaWQ6IEFuIGFzY2lpIG5hbWUgZm9yIHRoZSBjbGFpbWluZyBkZXZpY2UKKyAqCUBjYWxsYmFjazogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjb21wbGV0ZXMKKyAqCUBkYXRhOiBBIGNvb2tpZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCUBkbWFfcmVnczogUG9pbnRlciB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGFsbG9jYXRlZCBjaGFubmVsJ3MgaWRlbnRpZmllcgorICoKKyAqIAlUaGlzIGZ1bmN0aW9uIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgRE1BIGNoYW5uZWwgYW5kIHJldHVybnMgdGhlCisgKiAJYWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzIGZvciB0aGF0IGNoYW5uZWwgYXMgdGhlIGNoYW5uZWwKKyAqIAlpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgaXMgd3JpdHRlbiB0byB0aGUgbG9jYXRpb24gcG9pbnRlZCBieQorICogCUBkbWFfcmVncy4gVGhlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIGZvciBAZGV2aWNlIGFyZSBsaXN0ZWQgaW50bworICogCWxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9kbWEuaCBhcyBhIGRtYV9kZXZpY2VfdCBlbnVtLgorICoKKyAqIAlOb3RlIHRoYXQgcmVhZGluZyBmcm9tIGEgcG9ydCBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSBwb3J0IGFyZQorICogCWFjdHVhbGx5IGNvbnNpZGVyZWQgYXMgdHdvIGRpZmZlcmVudCBzdHJlYW1zIHJlcXVpcmluZyBzZXBhcmF0ZQorICogCURNQSByZWdpc3RyYXRpb25zLgorICoKKyAqIAlUaGUgQGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IHdoZW4gb25lCisgKiAJb2YgdGhlIHR3byBwb3NzaWJsZSBETUEgYnVmZmVycyBpbiBmbGlnaHQgaGFzIHRlcm1pbmF0ZWQuIFRoYXQKKyAqIAlmdW5jdGlvbiBoYXMgdG8gYmUgc21hbGwgYW5kIGVmZmljaWVudCB3aGlsZSBwb3Nwb25pbmcgbW9yZSBjb21wbGV4CisgKiAJcHJvY2Vzc2luZyB0byBhIGxvd2VyIHByaW9yaXR5IGV4ZWN1dGlvbiBjb250ZXh0LgorICoKKyAqIAlJZiBubyBjaGFubmVscyBhcmUgYXZhaWxhYmxlLCBvciBpZiB0aGUgZGVzaXJlZCBAZGV2aWNlIGlzIGFscmVhZHkgaW4KKyAqIAl1c2UgYnkgYW5vdGhlciBETUEgY2hhbm5lbCwgdGhlbiBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkLiAgVGhpcworICogCWZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgRE1BIGNhbGxzLgorICoqLworCitpbnQgc2ExMTAwX3JlcXVlc3RfZG1hIChkbWFfZGV2aWNlX3QgZGV2aWNlLCBjb25zdCBjaGFyICpkZXZpY2VfaWQsCisJCQlkbWFfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSwKKwkJCWRtYV9yZWdzX3QgKipkbWFfcmVncykKK3sKKwlzYTExMDBfZG1hX3QgKmRtYSA9IE5VTEw7CisJZG1hX3JlZ3NfdCAqcmVnczsKKwlpbnQgaSwgZXJyOworCisJKmRtYV9yZWdzID0gTlVMTDsKKworCWVyciA9IDA7CisJc3Bpbl9sb2NrKCZkbWFfbGlzdF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0ExMTAwX0RNQV9DSEFOTkVMUzsgaSsrKSB7CisJCWlmIChkbWFfY2hhbltpXS5kZXZpY2UgPT0gZGV2aWNlKSB7CisJCQllcnIgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICghZG1hX2NoYW5baV0uZGV2aWNlICYmICFkbWEpIHsKKwkJCWRtYSA9ICZkbWFfY2hhbltpXTsKKwkJfQorCX0KKwlpZiAoIWVycikgeworCSAgICAgICBpZiAoZG1hKQorCQkgICAgICAgZG1hLT5kZXZpY2UgPSBkZXZpY2U7CisJICAgICAgIGVsc2UKKwkJICAgICAgIGVyciA9IC1FTk9TUjsKKwl9CisJc3Bpbl91bmxvY2soJmRtYV9saXN0X2xvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpID0gZG1hIC0gZG1hX2NoYW47CisJcmVncyA9IChkbWFfcmVnc190ICopJkREQVIoaSk7CisJZXJyID0gcmVxdWVzdF9pcnEoSVJRX0RNQTAgKyBpLCBkbWFfaXJxX2hhbmRsZXIsIFNBX0lOVEVSUlVQVCwKKwkJCSAgZGV2aWNlX2lkLCByZWdzKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiB1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWQgZm9yICVzXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBJUlFfRE1BMCArIGksIGRldmljZV9pZCk7CisJCWRtYS0+ZGV2aWNlID0gMDsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkqZG1hX3JlZ3MgPSByZWdzOworCWRtYS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCWRtYS0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwlkbWEtPmRhdGEgPSBkYXRhOworCisJcmVncy0+Q2xyRENTUiA9CisJCShEQ1NSX0RPTkVBIHwgRENTUl9ET05FQiB8IERDU1JfU1RSVEEgfCBEQ1NSX1NUUlRCIHwKKwkJIERDU1JfSUUgfCBEQ1NSX0VSUk9SIHwgRENTUl9SVU4pOworCXJlZ3MtPkREQVIgPSBkZXZpY2U7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIAlzYTExMDBfZnJlZV9kbWEgLSBmcmVlIGEgU0ExMXgwIERNQSBjaGFubmVsCisgKiAJQHJlZ3M6IGlkZW50aWZpZXIgZm9yIHRoZSBjaGFubmVsIHRvIGZyZWUKKyAqCisgKiAJVGhpcyBjbGVhcnMgYWxsIGFjdGl2aXRpZXMgb24gYSBnaXZlbiBETUEgY2hhbm5lbCBhbmQgcmVsZWFzZXMgaXQKKyAqIAlmb3IgZnV0dXJlIHJlcXVlc3RzLiAgVGhlIEByZWdzIGlkZW50aWZpZXIgaXMgcHJvdmlkZWQgYnkgYQorICogCXN1Y2Nlc3NmdWwgY2FsbCB0byBzYTExMDBfcmVxdWVzdF9kbWEoKS4KKyAqKi8KKwordm9pZCBzYTExMDBfZnJlZV9kbWEoZG1hX3JlZ3NfdCAqcmVncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQTExMDBfRE1BX0NIQU5ORUxTOyBpKyspCisJCWlmIChyZWdzID09IChkbWFfcmVnc190ICopJkREQVIoaSkpCisJCQlicmVhazsKKwlpZiAoaSA+PSBTQTExMDBfRE1BX0NIQU5ORUxTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBETUEgaWRlbnRpZmllclxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZG1hX2NoYW5baV0uZGV2aWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRyeWluZyB0byBmcmVlIGZyZWUgRE1BXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJcmVncy0+Q2xyRENTUiA9CisJCShEQ1NSX0RPTkVBIHwgRENTUl9ET05FQiB8IERDU1JfU1RSVEEgfCBEQ1NSX1NUUlRCIHwKKwkJIERDU1JfSUUgfCBEQ1NSX0VSUk9SIHwgRENTUl9SVU4pOworCWZyZWVfaXJxKElSUV9ETUEwICsgaSwgcmVncyk7CisJZG1hX2NoYW5baV0uZGV2aWNlID0gMDsKK30KKworCisvKioKKyAqIAlzYTExMDBfc3RhcnRfZG1hIC0gc3VibWl0IGEgZGF0YSBidWZmZXIgZm9yIERNQQorICogCUByZWdzOiBpZGVudGlmaWVyIGZvciB0aGUgY2hhbm5lbCB0byB1c2UKKyAqIAlAZG1hX3B0cjogYnVmZmVyIHBoeXNpY2FsIChvciBidXMpIHN0YXJ0IGFkZHJlc3MKKyAqIAlAc2l6ZTogYnVmZmVyIHNpemUKKyAqCisgKiAJVGhpcyBmdW5jdGlvbiBoYW5kcyB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIgdG8gdGhlIGhhcmR3YXJlIGZvciBETUEKKyAqIAlhY2Nlc3MuIElmIGFub3RoZXIgYnVmZmVyIGlzIGFscmVhZHkgaW4gZmxpZ2h0IHRoZW4gdGhpcyBidWZmZXIKKyAqIAl3aWxsIGJlIHF1ZXVlZCBzbyB0aGUgRE1BIGVuZ2luZSB3aWxsIHN3aXRjaCB0byBpdCBhdXRvbWF0aWNhbGx5CisgKiAJd2hlbiB0aGUgcHJldmlvdXMgb25lIGlzIGRvbmUuICBUaGUgRE1BIGVuZ2luZSBpcyBhY3R1YWxseSB0b2dnbGluZworICogCWJldHdlZW4gdHdvIGJ1ZmZlcnMgc28gYXQgbW9zdCAyIHN1Y2Nlc3NmdWwgY2FsbHMgY2FuIGJlIG1hZGUgYmVmb3JlCisgKiAJb25lIG9mIHRoZW0gdGVybWluYXRlcyBhbmQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqCisgKiAJVGhlIEByZWdzIGlkZW50aWZpZXIgaXMgcHJvdmlkZWQgYnkgYSBzdWNjZXNzZnVsIGNhbGwgdG8KKyAqIAlzYTExMDBfcmVxdWVzdF9kbWEoKS4KKyAqCisgKiAJVGhlIEBzaXplIG11c3Qgbm90IGJlIGxhcmdlciB0aGFuICVNQVhfRE1BX1NJWkUuICBJZiBhIGdpdmVuIGJ1ZmZlcgorICogCWlzIGxhcmdlciB0aGFuIHRoYXQgdGhlbiBpdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBzcGxpdAorICogCWl0IGludG8gc21hbGxlciBjaHVua3MgYW5kIHN1Ym1pdCB0aGVtIHNlcGFyYXRlbHkuIElmIHRoaXMgaXMgdGhlCisgKiAJY2FzZSB0aGVuIGEgQHNpemUgb2YgJUNVVF9ETUFfU0laRSBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBlbmRpbmcKKyAqIAl1cCB3aXRoIHRvbyBzbWFsbCBjaHVua3MuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjaGFpbgorICogCXN1Ym1pc3Npb25zIG9mIGJ1ZmZlciBjaHVua3MuCisgKgorICogCUVycm9yIHJldHVybiB2YWx1ZXM6CisgKiAJJS1FT1ZFUkZMT1c6CUdpdmVuIGJ1ZmZlciBzaXplIGlzIHRvbyBiaWcuCisgKiAJJS1FQlVTWToJQm90aCBETUEgYnVmZmVycyBhcmUgYWxyZWFkeSBpbiB1c2UuCisgKiAJJS1FQUdBSU46CUJvdGggYnVmZmVycyB3ZXJlIGJ1c3kgYnV0IG9uZSBvZiB0aGVtIGp1c3QgY29tcGxldGVkCisgKiAJCQlidXQgdGhlIGludGVycnVwdCBoYW5kbGVyIGhhcyB0byBleGVjdXRlIGZpcnN0LgorICoKKyAqIAlUaGlzIGZ1bmN0aW9uIHJldHVycyAwIG9uIHN1Y2Nlc3MuCisgKiovCisKK2ludCBzYTExMDBfc3RhcnRfZG1hKGRtYV9yZWdzX3QgKnJlZ3MsIGRtYV9hZGRyX3QgZG1hX3B0ciwgdV9pbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVfbG9uZyBzdGF0dXM7CisJaW50IHJldDsKKworCWlmIChkbWFfcHRyICYgMykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRE1BOiB1bmFsaWduZWQgc3RhcnQgYWRkcmVzcyAoMHglMDhseClcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylkbWFfcHRyKTsKKworCWlmIChzaXplID4gTUFYX0RNQV9TSVpFKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzdGF0dXMgPSByZWdzLT5SZERDU1I7CisKKwkvKiBJZiBib3RoIERNQSBidWZmZXJzIGFyZSBzdGFydGVkLCB0aGVyZSdzIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8uICovCisJaWYgKChzdGF0dXMgJiAoRENTUl9TVFJUQSB8IERDU1JfU1RSVEIpKSA9PSAoRENTUl9TVFJUQSB8IERDU1JfU1RSVEIpKSB7CisJCURQUklOVEsoInN0YXJ0OiBzdCAlI3ggYnVzeVxuIiwgc3RhdHVzKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKChzdGF0dXMgJiBEQ1NSX0JJVSkgJiYgKHN0YXR1cyAmIERDU1JfU1RSVEIpKSB8fAorCSAgICAoIShzdGF0dXMgJiBEQ1NSX0JJVSkgJiYgIShzdGF0dXMgJiBEQ1NSX1NUUlRBKSkpIHsKKwkJaWYgKHN0YXR1cyAmIERDU1JfRE9ORUEpIHsKKwkJCS8qIGdpdmUgYSBjaGFuY2UgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gYmUgcHJvY2Vzc2VkICovCisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVncy0+REJTQSA9IGRtYV9wdHI7CisJCXJlZ3MtPkRCVEEgPSBzaXplOworCQlyZWdzLT5TZXREQ1NSID0gRENTUl9TVFJUQSB8IERDU1JfSUUgfCBEQ1NSX1JVTjsKKwkJRFBSSU5USygic3RhcnQgYT0lI3ggcz0lZCBvbiBBXG4iLCBkbWFfcHRyLCBzaXplKTsKKwl9IGVsc2UgeworCQlpZiAoc3RhdHVzICYgRENTUl9ET05FQikgeworCQkJLyogZ2l2ZSBhIGNoYW5jZSBmb3IgdGhlIGludGVycnVwdCB0byBiZSBwcm9jZXNzZWQgKi8KKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZWdzLT5EQlNCID0gZG1hX3B0cjsKKwkJcmVncy0+REJUQiA9IHNpemU7CisJCXJlZ3MtPlNldERDU1IgPSBEQ1NSX1NUUlRCIHwgRENTUl9JRSB8IERDU1JfUlVOOworCQlEUFJJTlRLKCJzdGFydCBhPSUjeCBzPSVkIG9uIEJcbiIsIGRtYV9wdHIsIHNpemUpOworCX0KKwlyZXQgPSAwOworCitvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiAJc2ExMTAwX2dldF9kbWFfcG9zIC0gcmV0dXJuIGN1cnJlbnQgRE1BIHBvc2l0aW9uCisgKiAJQHJlZ3M6IGlkZW50aWZpZXIgZm9yIHRoZSBjaGFubmVsIHRvIHVzZQorICoKKyAqIAlUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgcGh5c2ljYWwgKG9yIGJ1cykgYWRkcmVzcyBmb3IgdGhlCisgKiAJZ2l2ZW4gRE1BIGNoYW5uZWwuICBJZiB0aGUgY2hhbm5lbCBpcyBydW5uaW5nIGkuZS4gbm90IGluIGEgc3RvcHBlZAorICogCXN0YXRlIHRoZW4gdGhlIGNhbGxlciBtdXN0IGRpc2FibGUgaW50ZXJydXB0cyBwcmlvciBjYWxsaW5nIHRoaXMKKyAqIAlmdW5jdGlvbiBhbmQgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZW0gdG8KKyAqIAlwcmV2ZW50IHJhY2VzIHdpdGggdGhlIGNvbXBsZXRpb24gaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRoZSBjYWxsYmFjaworICogCWZ1bmN0aW9uLiBUaGUgdmFsaWRhdGlvbiBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIGNhbGxlcidzCisgKiAJcmVzcG9uc2liaWxpdHkgYXMgd2VsbCAtLSB0aGUgaGFyZHdhcmUgc2VlbXMgdG8gcmV0dXJuIG91dCBvZiByYW5nZQorICogCXZhbHVlcyB3aGVuIHRoZSBETUEgZW5naW5lIGNvbXBsZXRlcyBhIGJ1ZmZlci4KKyAqCisgKiAJVGhlIEByZWdzIGlkZW50aWZpZXIgaXMgcHJvdmlkZWQgYnkgYSBzdWNjZXNzZnVsIGNhbGwgdG8KKyAqIAlzYTExMDBfcmVxdWVzdF9kbWEoKS4KKyAqKi8KKworZG1hX2FkZHJfdCBzYTExMDBfZ2V0X2RtYV9wb3MoZG1hX3JlZ3NfdCAqcmVncykKK3sKKwlpbnQgc3RhdHVzOworCisJLyoKKwkgKiBXZSBtdXN0IGRldGVybWluZSB3aGV0aGVyIGJ1ZmZlciBBIG9yIEIgaXMgYWN0aXZlLgorCSAqIFR3byBwb3NzaWJpbGl0aWVzOiBlaXRoZXIgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YKKwkgKiBhIGJ1ZmZlciwgb3IgdGhlIERNQSBjb250cm9sbGVyIGp1c3Qgc3dpdGNoZWQgdG8gdGhlCisJICogbmV4dCB0b2dnbGUgYnV0IHRoZSBpbnRlcnJ1cHQgaGFzbid0IGJlZW4gc2VydmljZWQgeWV0LgorCSAqIFRoZSBmb3JtZXIgY2FzZSBpcyBzdHJhaWdodCBmb3J3YXJkLiAgSW4gdGhlIGxhdGVyIGNhc2UsCisJICogd2UnbGwgZG8gbGlrZSBpZiBETUEgaXMganVzdCBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cworCSAqIHRvZ2dsZSBzaW5jZSBhbGwgcmVnaXN0ZXJzIGhhdmVuJ3QgYmVlbiByZXNldCB5ZXQuCisJICogVGhpcyBnb2VzIGFyb3VuZCB0aGUgZWRnZSBjYXNlIGFuZCBzaW5jZSB3ZSdyZSBhbHdheXMKKwkgKiBhIGxpdHRsZSBiZWhpbmQgYW55d2F5cyBpdCBzaG91bGRuJ3QgbWFrZSBhIGJpZyBkaWZmZXJlbmNlLgorCSAqIElmIERNQSBoYXMgYmVlbiBzdG9wcGVkIHByaW9yIGNhbGxpbmcgdGhpcyB0aGVuIHRoZQorCSAqIHBvc2l0aW9uIGlzIGV4YWN0LgorCSAqLworCXN0YXR1cyA9IHJlZ3MtPlJkRENTUjsKKwlpZiAoKCEoc3RhdHVzICYgRENTUl9CSVUpICYmICAoc3RhdHVzICYgRENTUl9TVFJUQSkpIHx8CisJICAgICggKHN0YXR1cyAmIERDU1JfQklVKSAmJiAhKHN0YXR1cyAmIERDU1JfU1RSVEIpKSkKKwkJcmV0dXJuIHJlZ3MtPkRCU0E7CisJZWxzZQorCQlyZXR1cm4gcmVncy0+REJTQjsKK30KKworCisvKioKKyAqIAlzYTExMDBfcmVzZXRfZG1hIC0gcmVzZXQgYSBETUEgY2hhbm5lbAorICogCUByZWdzOiBpZGVudGlmaWVyIGZvciB0aGUgY2hhbm5lbCB0byB1c2UKKyAqCisgKiAJVGhpcyBmdW5jdGlvbiByZXNldHMgYW5kIHJlY29uZmlndXJlIHRoZSBnaXZlbiBETUEgY2hhbm5lbC4gVGhpcyBpcworICogCXBhcnRpY3VsYXJseSB1c2VmdWwgYWZ0ZXIgYSBzbGVlcC93YWtldXAgZXZlbnQuCisgKgorICogCVRoZSBAcmVncyBpZGVudGlmaWVyIGlzIHByb3ZpZGVkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvCisgKiAJc2ExMTAwX3JlcXVlc3RfZG1hKCkuCisgKiovCisKK3ZvaWQgc2ExMTAwX3Jlc2V0X2RtYShkbWFfcmVnc190ICpyZWdzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNBMTEwMF9ETUFfQ0hBTk5FTFM7IGkrKykKKwkJaWYgKHJlZ3MgPT0gKGRtYV9yZWdzX3QgKikmRERBUihpKSkKKwkJCWJyZWFrOworCWlmIChpID49IFNBMTEwMF9ETUFfQ0hBTk5FTFMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIERNQSBpZGVudGlmaWVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJcmVncy0+Q2xyRENTUiA9CisJCShEQ1NSX0RPTkVBIHwgRENTUl9ET05FQiB8IERDU1JfU1RSVEEgfCBEQ1NSX1NUUlRCIHwKKwkJIERDU1JfSUUgfCBEQ1NSX0VSUk9SIHwgRENTUl9SVU4pOworCXJlZ3MtPkREQVIgPSBkbWFfY2hhbltpXS5kZXZpY2U7Cit9CisKKworRVhQT1JUX1NZTUJPTChzYTExMDBfcmVxdWVzdF9kbWEpOworRVhQT1JUX1NZTUJPTChzYTExMDBfZnJlZV9kbWEpOworRVhQT1JUX1NZTUJPTChzYTExMDBfc3RhcnRfZG1hKTsKK0VYUE9SVF9TWU1CT0woc2ExMTAwX2dldF9kbWFfcG9zKTsKK0VYUE9SVF9TWU1CT0woc2ExMTAwX3Jlc2V0X2RtYSk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFlMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCisgKgorICogQXV0aG9yOiBOaWNvbGFzIFBpdHJlCisgKgorICogQ29kZSBjb21tb24gdG8gYWxsIFNBMTF4MCBtYWNoaW5lcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyNkZWZpbmUgTlJfRlJFUVMJMTYKKworLyoKKyAqIFRoaXMgdGFibGUgaXMgc2V0dXAgZm9yIGEgMy42ODY0TUh6IENyeXN0YWwuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjY2xrX2ZyZXF1ZW5jeV8xMDBraHpbTlJfRlJFUVNdID0geworCSA1OTAsCS8qICA1OS4wIE1IeiAqLworCSA3MzcsCS8qICA3My43IE1IeiAqLworCSA4ODUsIAkvKiAgODguNSBNSHogKi8KKwkxMDMyLAkvKiAxMDMuMiBNSHogKi8KKwkxMTgwLAkvKiAxMTguMCBNSHogKi8KKwkxMzI3LAkvKiAxMzIuNyBNSHogKi8KKwkxNDc1LAkvKiAxNDcuNSBNSHogKi8KKwkxNjIyLAkvKiAxNjIuMiBNSHogKi8KKwkxNzY5LAkvKiAxNzYuOSBNSHogKi8KKwkxOTE3LAkvKiAxOTEuNyBNSHogKi8KKwkyMDY0LAkvKiAyMDYuNCBNSHogKi8KKwkyMjEyLAkvKiAyMjEuMiBNSHogKi8KKwkyMzU5LCAgIC8qIDIzNS45IE1IeiAqLworCTI1MDcsICAgLyogMjUwLjcgTUh6ICovCisJMjY1NCwgICAvKiAyNjUuNCBNSHogKi8KKwkyODAyICAgIC8qIDI4MC4yIE1IeiAqLworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX1NBMTEwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVFfU0ExMTEwKQorLyogcm91bmRzIHVwKCEpICAqLwordW5zaWduZWQgaW50IHNhMTF4MF9mcmVxX3RvX3BwY3IodW5zaWduZWQgaW50IGtoeikKK3sKKwlpbnQgaTsKKworCWtoeiAvPSAxMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfRlJFUVM7IGkrKykKKwkJaWYgKGNjbGtfZnJlcXVlbmN5XzEwMGtoeltpXSA+PSBraHopCisJCQlicmVhazsKKworCXJldHVybiBpOworfQorCit1bnNpZ25lZCBpbnQgc2ExMXgwX3BwY3JfdG9fZnJlcSh1bnNpZ25lZCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGludCBmcmVxID0gMDsKKwlpZiAoaWR4IDwgTlJfRlJFUVMpCisJCWZyZXEgPSBjY2xrX2ZyZXF1ZW5jeV8xMDBraHpbaWR4XSAqIDEwMDsKKwlyZXR1cm4gZnJlcTsKK30KKworCisvKiBtYWtlIHN1cmUgdGhhdCBvbmx5IHRoZSAidXNlcnNwYWNlIiBnb3Zlcm5vciBpcyBydW4gLS0gYW55dGhpbmcgZWxzZSB3b3VsZG4ndCBtYWtlIHNlbnNlIG9uCisgKiB0aGlzIHBsYXRmb3JtLCBhbnl3YXkuCisgKi8KK2ludCBzYTExeDBfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCB0bXA7CisJaWYgKHBvbGljeS0+Y3B1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CisKKwkvKiBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgZnJlcXVlbmN5IGlzIHdpdGhpbiB0aGUgcG9saWN5ICovCisJdG1wID0gY2Nsa19mcmVxdWVuY3lfMTAwa2h6W3NhMTF4MF9mcmVxX3RvX3BwY3IocG9saWN5LT5taW4pXSAqIDEwMDsKKwlpZiAodG1wID4gcG9saWN5LT5tYXgpCisJCXBvbGljeS0+bWF4ID0gdG1wOworCisJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwgcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgc2ExMXgwX2dldHNwZWVkKHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGNjbGtfZnJlcXVlbmN5XzEwMGtoeltQUENSICYgMHhmXSAqIDEwMDsKK30KKworI2Vsc2UKKy8qCisgKiBXZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGUgdGhpcyBzbyBidWlsZGluZyB3aXRob3V0IGNwdWZyZXEgd29ya3MuCisgKi8gCit1bnNpZ25lZCBpbnQgY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gY2Nsa19mcmVxdWVuY3lfMTAwa2h6W1BQQ1IgJiAweGZdICogMTAwOworfQorRVhQT1JUX1NZTUJPTChjcHVmcmVxX2dldCk7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgdGhlIFNBMTF4MCBzY2hlZF9jbG9jayBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaGFzCisgKiBhIHJlc29sdXRpb24gb2YgMjcxbnMsIGFuZCBhIG1heGltdW0gdmFsdWUgb2YgMTE2NXMuCisgKiAgKCAqIDFFOSAvIDM2ODY0MDAgPT4gKiA3ODEyNSAvIDI4OCkKKyAqLwordW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHY7CisKKwl2ID0gKHVuc2lnbmVkIGxvbmcgbG9uZylPU0NSICogNzgxMjU7CisJZG9fZGl2KHYsIDI4OCk7CisKKwlyZXR1cm4gdjsKK30KKworLyoKKyAqIERlZmF1bHQgcG93ZXItb2ZmIGZvciBTQTExMDAKKyAqLworc3RhdGljIHZvaWQgc2ExMTAwX3Bvd2VyX29mZih2b2lkKQoreworCW1kZWxheSgxMDApOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJLyogZGlzYWJsZSBpbnRlcm5hbCBvc2NpbGxhdG9yLCBmbG9hdCBDUyBsaW5lcyAqLworCVBDRlIgPSAoUENGUl9PUERFIHwgUENGUl9GUCB8IFBDRlJfRlMpOworCS8qIGVuYWJsZSB3YWtlLXVwIG9uIEdQSU8wIChBc3NhYmV0Li4uKSAqLworCVBXRVIgPSBHRkVSID0gR1JFUiA9IDE7CisJLyoKKwkgKiBzZXQgc2NyYXRjaHBhZCB0byB6ZXJvLCBqdXN0IGluIGNhc2UgaXQgaXMgdXNlZCBhcyBhCisJICogcmVzdGFydCBhZGRyZXNzIGJ5IHRoZSBib290bG9hZGVyLgorCSAqLworCVBTUFIgPSAwOworCS8qIGVudGVyIHNsZWVwIG1vZGUgKi8KKwlQTUNSID0gUE1DUl9TRjsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYTExeDB1ZGNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDgwMDAwMDAwLAorCQkuZW5kCT0gMHg4MDAwZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyB1NjQgc2ExMXgwdWRjX2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYTExeDB1ZGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzYTExeDAtdWRjIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzayA9ICZzYTExeDB1ZGNfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2ExMXgwdWRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc2ExMXgwdWRjX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2ExMXgwdWFydDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDgwMDEwMDAwLAorCQkuZW5kCT0gMHg4MDAxZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhMTF4MHVhcnQxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2ExMXgwLXVhcnQiLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzYTExeDB1YXJ0MV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNhMTF4MHVhcnQxX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2ExMXgwdWFydDNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDgwMDUwMDAwLAorCQkuZW5kCT0gMHg4MDA1ZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhMTF4MHVhcnQzX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2ExMXgwLXVhcnQiLAorCS5pZAkJPSAzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzYTExeDB1YXJ0M19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNhMTF4MHVhcnQzX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2ExMXgwbWNwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHg4MDA2MDAwMCwKKwkJLmVuZAk9IDB4ODAwNmZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgdTY0IHNhMTF4MG1jcF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMXgwbWNwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2ExMXgwLW1jcCIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzayA9ICZzYTExeDBtY3BfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2ExMXgwbWNwX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc2ExMXgwbWNwX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2ExMXgwc3NwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHg4MDA3MDAwMCwKKwkJLmVuZAk9IDB4ODAwN2ZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgdTY0IHNhMTF4MHNzcF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMXgwc3NwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2ExMXgwLXNzcCIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzayA9ICZzYTExeDBzc3BfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2ExMXgwc3NwX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc2ExMXgwc3NwX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2ExMXgwZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGIwMTAwMDAwLAorCQkuZW5kCT0gMHhiMDEwZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9MQ0QsCisJCS5lbmQJPSBJUlFfTENELAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMXgwZmJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzYTExeDAtZmIiLAorCS5pZAkJPSAtMSwKKwkuZGV2ID0geworCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNhMTF4MGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc2ExMXgwZmJfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMXgwcGNtY2lhX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2ExMXgwLXBjbWNpYSIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMXgwbXRkX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZmxhc2giLAorCS5pZAkJPSAtMSwKK307CisKK3ZvaWQgc2ExMXgwX3NldF9mbGFzaF9kYXRhKHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhICpmbGFzaCwKKwkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgbnIpCit7CisJc2ExMXgwbXRkX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IGZsYXNoOworCXNhMTF4MG10ZF9kZXZpY2UucmVzb3VyY2UgPSByZXM7CisJc2ExMXgwbXRkX2RldmljZS5udW1fcmVzb3VyY2VzID0gbnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2ExMXgwaXJfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBfX1BSRUcoU2VyMlVUQ1IwKSwKKwkJLmVuZAk9IF9fUFJFRyhTZXIyVVRDUjApICsgMHgyNCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0CT0gX19QUkVHKFNlcjJIU0NSMCksCisJCS5lbmQJPSBfX1BSRUcoU2VyMkhTQ1IwKSArIDB4MWMgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAk9IF9fUFJFRyhTZXIySFNDUjIpLAorCQkuZW5kCT0gX19QUkVHKFNlcjJIU0NSMikgKyAweDA0IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJPSBJUlFfU2VyMklDUCwKKwkJLmVuZAk9IElSUV9TZXIySUNQLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYTExeDBpcl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNhMTF4MC1pciIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzYTExeDBpcl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNhMTF4MGlyX3Jlc291cmNlcywKK307CisKK3ZvaWQgc2ExMXgwX3NldF9pcmRhX2RhdGEoc3RydWN0IGlyZGFfcGxhdGZvcm1fZGF0YSAqaXJkYSkKK3sKKwlzYTExeDBpcl9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBpcmRhOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2ExMXgwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzYTExeDB1ZGNfZGV2aWNlLAorCSZzYTExeDB1YXJ0MV9kZXZpY2UsCisJJnNhMTF4MHVhcnQzX2RldmljZSwKKwkmc2ExMXgwbWNwX2RldmljZSwKKwkmc2ExMXgwc3NwX2RldmljZSwKKwkmc2ExMXgwcGNtY2lhX2RldmljZSwKKwkmc2ExMXgwZmJfZGV2aWNlLAorCSZzYTExeDBtdGRfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2ExMTAwX2luaXQodm9pZCkKK3sKKwlwbV9wb3dlcl9vZmYgPSBzYTExMDBfcG93ZXJfb2ZmOworCisJaWYgKHNhMTF4MGlyX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSkKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzYTExeDBpcl9kZXZpY2UpOworCisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNhMTF4MF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNhMTF4MF9kZXZpY2VzKSk7Cit9CisKK2FyY2hfaW5pdGNhbGwoc2ExMTAwX2luaXQpOworCit2b2lkICgqc2ExMTAwZmJfYmFja2xpZ2h0X3Bvd2VyKShpbnQgb24pOwordm9pZCAoKnNhMTEwMGZiX2xjZF9wb3dlcikoaW50IG9uKTsKKworRVhQT1JUX1NZTUJPTChzYTExMDBmYl9iYWNrbGlnaHRfcG93ZXIpOworRVhQT1JUX1NZTUJPTChzYTExMDBmYl9sY2RfcG93ZXIpOworCisKKy8qCisgKiBDb21tb24gSS9PIG1hcHBpbmc6CisgKgorICogVHlwaWNhbGx5LCBzdGF0aWMgdmlydHVhbCBhZGRyZXNzIG1hcHBpbmdzIGFyZSBhcyBmb2xsb3c6CisgKgorICogMHhmMDAwMDAwMC0weGYzZmZmZmZmOgltaXNjZWxsYW5lb3VzIHN0dWZmIChDUExEcywgZXRjLikKKyAqIDB4ZjQwMDAwMDAtMHhmNGZmZmZmZjoJU0EtMTExMQorICogMHhmNTAwMDAwMC0weGY1ZmZmZmZmOglyZXNlcnZlZCAodXNlZCBieSBjYWNoZSBmbHVzaGluZyBhcmVhKQorICogMHhmNjAwMDAwMC0weGZmZmVmZmZmOglyZXNlcnZlZCAoaW50ZXJuYWwgU0ExMTAwIElPIGRlZmluZWQgYWJvdmUpCisgKiAweGZmZmYwMDAwLTB4ZmZmZjBmZmY6CVNBMTEwMCBleGNlcHRpb24gdmVjdG9ycworICogMHhmZmZmMjAwMC0weGZmZmYyZmZmOglNaW5pY2FjaGUgY29weV91c2VyX3BhZ2UgYXJlYQorICoKKyAqIEJlbG93IDB4ZTgwMDAwMDAgaXMgcmVzZXJ2ZWQgZm9yIHZtIGFsbG9jYXRpb24uCisgKgorICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtdXN0IHByb3ZpZGUgdGhlIGV4dHJhIG1hcHBpbmcgYmVzaWRlIHRoZQorICogZGVmYXVsdCBtYXBwaW5nIHByb3ZpZGVkIGhlcmUuCisgKi8KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzdGFuZGFyZF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICBsZW5ndGggICAgICB0eXBlICovCisgIHsgMHhmODAwMDAwMCwgMHg4MDAwMDAwMCwgMHgwMDEwMDAwMCwgTVRfREVWSUNFIH0sIC8qIFBDTSAqLworICB7IDB4ZmEwMDAwMDAsIDB4OTAwMDAwMDAsIDB4MDAxMDAwMDAsIE1UX0RFVklDRSB9LCAvKiBTQ00gKi8KKyAgeyAweGZjMDAwMDAwLCAweGEwMDAwMDAwLCAweDAwMTAwMDAwLCBNVF9ERVZJQ0UgfSwgLyogTUVSICovCisgIHsgMHhmZTAwMDAwMCwgMHhiMDAwMDAwMCwgMHgwMDIwMDAwMCwgTVRfREVWSUNFIH0gIC8qIExDRCArIERNQSAqLworfTsKKwordm9pZCBfX2luaXQgc2ExMTAwX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChzdGFuZGFyZF9pb19kZXNjLCBBUlJBWV9TSVpFKHN0YW5kYXJkX2lvX2Rlc2MpKTsKK30KKworLyoKKyAqIERpc2FibGUgdGhlIG1lbW9yeSBidXMgcmVxdWVzdC9ncmFudCBzaWduYWxzIG9uIHRoZSBTQTExMTAgdG8KKyAqIGVuc3VyZSB0aGF0IHdlIGRvbid0IHJlY2VpdmUgc3B1cmlvdXMgbWVtb3J5IHJlcXVlc3RzLiAgV2Ugc2V0CisgKiB0aGUgTUJHTlQgc2lnbmFsIGZhbHNlIHRvIGVuc3VyZSB0aGUgU0ExMTExIGRvZXNuJ3Qgb3duIHRoZQorICogU0RSQU0gYnVzLgorICovCit2b2lkIF9faW5pdCBzYTExMTBfbWJfZGlzYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCisJUEdTUiAmPSB+R1BJT19NQkdOVDsKKwlHUENSID0gR1BJT19NQkdOVDsKKwlHUERSID0gKEdQRFIgJiB+R1BJT19NQlJFUSkgfCBHUElPX01CR05UOworCisJR0FGUiAmPSB+KEdQSU9fTUJHTlQgfCBHUElPX01CUkVRKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIElmIHRoZSBzeXN0ZW0gaXMgZ29pbmcgdG8gdXNlIHRoZSBTQS0xMTExIERNQSBlbmdpbmVzLCBzZXQgdXAKKyAqIHRoZSBtZW1vcnkgYnVzIHJlcXVlc3QvZ3JhbnQgcGlucy4KKyAqLwordm9pZCBfX2luaXQgc2ExMTEwX21iX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlQR1NSICY9IH5HUElPX01CR05UOworCUdQQ1IgPSBHUElPX01CR05UOworCUdQRFIgPSAoR1BEUiAmIH5HUElPX01CUkVRKSB8IEdQSU9fTUJHTlQ7CisKKwlHQUZSIHw9IChHUElPX01CR05UIHwgR1BJT19NQlJFUSk7CisJVFVDUiB8PSBUVUNSX01SOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmggYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlNDFkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5oCisgKgorICogQXV0aG9yOiBOaWNvbGFzIFBpdHJlCisgKi8KKworc3RydWN0IHN5c190aW1lcjsKKworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgc2ExMTAwX3RpbWVyOworZXh0ZXJuIHZvaWQgX19pbml0IHNhMTEwMF9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgc2ExMTAwX2luaXRfaXJxKHZvaWQpOworCisjZGVmaW5lIFNFVF9CQU5LKF9fbnIsX19zdGFydCxfX3NpemUpIFwKKwltaS0+YmFua1tfX25yXS5zdGFydCA9IChfX3N0YXJ0KSwgXAorCW1pLT5iYW5rW19fbnJdLnNpemUgPSAoX19zaXplKSwgXAorCW1pLT5iYW5rW19fbnJdLm5vZGUgPSAoKCh1bnNpZ25lZCkoX19zdGFydCkgLSBQSFlTX09GRlNFVCkgPj4gMjcpCisKK2V4dGVybiB2b2lkICgqc2ExMTAwZmJfYmFja2xpZ2h0X3Bvd2VyKShpbnQgb24pOworZXh0ZXJuIHZvaWQgKCpzYTExMDBmYl9sY2RfcG93ZXIpKGludCBvbik7CisKK2V4dGVybiB2b2lkIHNhMTExMF9tYl9lbmFibGUodm9pZCk7CitleHRlcm4gdm9pZCBzYTExMTBfbWJfZGlzYWJsZSh2b2lkKTsKKworc3RydWN0IGNwdWZyZXFfcG9saWN5OworCitleHRlcm4gdW5zaWduZWQgaW50IHNhMTF4MF9mcmVxX3RvX3BwY3IodW5zaWduZWQgaW50IGtoeik7CitleHRlcm4gaW50IHNhMTF4MF92ZXJpZnlfc3BlZWQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOworZXh0ZXJuIHVuc2lnbmVkIGludCBzYTExeDBfZ2V0c3BlZWQodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdW5zaWduZWQgaW50IHNhMTF4MF9wcGNyX3RvX2ZyZXEodW5zaWduZWQgaW50IGlkeCk7CisKK3N0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhOworc3RydWN0IHJlc291cmNlOworCitleHRlcm4gdm9pZCBzYTExeDBfc2V0X2ZsYXNoX2RhdGEoc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgKmZsYXNoLAorCQkJCSAgc3RydWN0IHJlc291cmNlICpyZXMsIGludCBucik7CisKK3N0cnVjdCBpcmRhX3BsYXRmb3JtX2RhdGE7Cit2b2lkIHNhMTF4MF9zZXRfaXJkYV9kYXRhKHN0cnVjdCBpcmRhX3BsYXRmb3JtX2RhdGEgKmlyZGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDM2MDAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4OGQzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKQEAgLTAsMCArMSw4OTIgQEAKKy8qCisgKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgQ29tcGFxIGlQQVEgSDN4eHggSGFuZGhlbGQgQ29tcHV0ZXJzCisgKgorICogQ29weXJpZ2h0IDIwMDAsMSBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24uCisgKgorICogVXNlIGNvbnNpc3RlbnQgd2l0aCB0aGUgR05VIEdQTCBpcyBwZXJtaXR0ZWQsCisgKiBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0IG5vdGljZSBpcworICogcHJlc2VydmVkIGluIGl0cyBlbnRpcmV0eSBpbiBhbGwgY29waWVzIGFuZCBkZXJpdmVkIHdvcmtzLgorICoKKyAqIENPTVBBUSBDT01QVVRFUiBDT1JQT1JBVElPTiBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTRUQgT1IgSU1QTElFRCwKKyAqIEFTIFRPIFRIRSBVU0VGVUxORVNTIE9SIENPUlJFQ1RORVNTIE9GIFRISVMgQ09ERSBPUiBJVFMKKyAqIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQXV0aG9yOiBKYW1leSBIaWNrcy4KKyAqCisgKiBIaXN0b3J5OgorICoKKyAqIDIwMDEtMTAtPz8JQW5kcmV3IENocmlzdGlhbiAgIEFkZGVkIHN1cHBvcnQgZm9yIGlQQVEgSDM4MDAKKyAqCQkJCSAgIGFuZCBhYnN0cmFjdGVkIEVHUElPIGludGVyZmFjZS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcmRhLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2VyaWFsX3NhMTEwMC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvaDM2MDAuaD4KKworI2lmIGRlZmluZWQgKENPTkZJR19TQTExMDBfSDM2MDApIHx8IGRlZmluZWQgKENPTkZJR19TQTExMDBfSDMxMDApCisjaW5jbHVkZSA8YXNtL2FyY2gvaDM2MDBfZ3Bpby5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0ExMTAwX0gzODAwCisjaW5jbHVkZSA8YXNtL2FyY2gvaDM2MDBfYXNpYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0cnVjdCBpcGFxX21vZGVsX29wcyBpcGFxX21vZGVsX29wczsKK0VYUE9SVF9TWU1CT0woaXBhcV9tb2RlbF9vcHMpOworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gaDN4eHhfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJCT0gIkgzWFhYIGJvb3QgZmlybXdhcmUiLAorCQkuc2l6ZQkJPSAweDAwMDQwMDAwLAorCQkub2Zmc2V0CQk9IDAsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwgIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sIHsKKyNpZmRlZiBDT05GSUdfTVREXzJQQVJUU19JUEFRCisJCS5uYW1lCQk9ICJIM1hYWCByb290IGpmZnMyIiwKKwkJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldAkJPSAweDAwMDQwMDAwLAorI2Vsc2UKKwkJLm5hbWUJCT0gIkgzWFhYIGtlcm5lbCIsCisJCS5zaXplCQk9IDB4MDAwODAwMDAsCisJCS5vZmZzZXQJCT0gMHgwMDA0MDAwMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJIM1hYWCBwYXJhbXMiLAorCQkuc2l6ZQkJPSAweDAwMDQwMDAwLAorCQkub2Zmc2V0CQk9IDB4MDAwQzAwMDAsCisJfSwgeworI2lmZGVmIENPTkZJR19KRkZTMl9GUworCQkubmFtZQkJPSAiSDNYWFggcm9vdCBqZmZzMiIsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQJCT0gMHgwMDEwMDAwMCwKKyNlbHNlCisJCS5uYW1lCQk9ICJIM1hYWCBpbml0cmQiLAorCQkuc2l6ZQkJPSAweDAwMTAwMDAwLAorCQkub2Zmc2V0CQk9IDB4MDAxMDAwMDAsCisJfSwgeworCQkubmFtZQkJPSAiSDNYWFggcm9vdCBjcmFtZnMiLAorCQkuc2l6ZQkJPSAweDAwMzAwMDAwLAorCQkub2Zmc2V0CQk9IDB4MDAyMDAwMDAsCisJfSwgeworCQkubmFtZQkJPSAiSDNYWFggdXNyIGNyYW1mcyIsCisJCS5zaXplCQk9IDB4MDA4MDAwMDAsCisJCS5vZmZzZXQJCT0gMHgwMDUwMDAwMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJIM1hYWCB1c3IgbG9jYWwiLAorCQkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCQkub2Zmc2V0CQk9IDB4MDBkMDAwMDAsCisjZW5kaWYKKyNlbmRpZgorCX0KK307CisKK3N0YXRpYyB2b2lkIGgzeHh4X3NldF92cHAoaW50IHZwcCkKK3sKKwlhc3NpZ25faDM2MDBfZWdwaW8oSVBBUV9FR1BJT19WUFBfT04sIHZwcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBoM3h4eF9mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS5zZXRfdnBwCT0gaDN4eHhfc2V0X3ZwcCwKKwkucGFydHMJCT0gaDN4eHhfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGgzeHh4X3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoM3h4eF9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gU0ExMTAwX0NTMF9QSFlTLAorCS5lbmQJCT0gU0ExMTAwX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCisvKgorICogVGhpcyB0dXJucyB0aGUgSVJEQSBwb3dlciBvbiBvciBvZmYgb24gdGhlIENvbXBhcSBIMzYwMAorICovCitzdGF0aWMgaW50IGgzNjAwX2lyZGFfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0YXRlKQoreworCWFzc2lnbl9oMzYwMF9lZ3BpbyggSVBBUV9FR1BJT19JUl9PTiwgc3RhdGUgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoMzYwMF9pcmRhX3NldF9zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzcGVlZCkKK3sKKwlpZiAoc3BlZWQgPCA0MDAwMDAwKSB7CisJCWNscl9oMzYwMF9lZ3BpbyhJUEFRX0VHUElPX0lSX0ZTRUwpOworCX0gZWxzZSB7CisJCXNldF9oMzYwMF9lZ3BpbyhJUEFRX0VHUElPX0lSX0ZTRUwpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcmRhX3BsYXRmb3JtX2RhdGEgaDM2MDBfaXJkYV9kYXRhID0geworCS5zZXRfcG93ZXIJPSBoMzYwMF9pcmRhX3NldF9wb3dlciwKKwkuc2V0X3NwZWVkCT0gaDM2MDBfaXJkYV9zZXRfc3BlZWQsCit9OworCitzdGF0aWMgdm9pZCBoM3h4eF9tYWNoX2luaXQodm9pZCkKK3sKKwlzYTExeDBfc2V0X2ZsYXNoX2RhdGEoJmgzeHh4X2ZsYXNoX2RhdGEsICZoM3h4eF9mbGFzaF9yZXNvdXJjZSwgMSk7CisJc2ExMXgwX3NldF9pcmRhX2RhdGEoJmgzNjAwX2lyZGFfZGF0YSk7Cit9CisKKy8qCisgKiBsb3ctbGV2ZWwgVUFSVCBmZWF0dXJlcworICovCisKK3N0YXRpYyB2b2lkIGgzNjAwX3VhcnRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVfaW50IG1jdHJsKQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIzVVRDUjApIHsKKwkJaWYgKG1jdHJsICYgVElPQ01fUlRTKQorCQkJR1BDUiA9IEdQSU9fSDM2MDBfQ09NX1JUUzsKKwkJZWxzZQorCQkJR1BTUiA9IEdQSU9fSDM2MDBfQ09NX1JUUzsKKwl9Cit9CisKK3N0YXRpYyB1X2ludCBoMzYwMF91YXJ0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVfaW50IHJldCA9IFRJT0NNX0NEIHwgVElPQ01fQ1RTIHwgVElPQ01fRFNSOworCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gX1NlcjNVVENSMCkgeworCQlpbnQgZ3BsciA9IEdQTFI7CisJCS8qIERDRCBhbmQgQ1RTIGJpdHMgYXJlIGludmVydGVkIGluIEdQTFIgYnkgUlMyMzIgdHJhbnNjZWl2ZXIgKi8KKwkJaWYgKGdwbHIgJiBHUElPX0gzNjAwX0NPTV9EQ0QpCisJCQlyZXQgJj0gflRJT0NNX0NEOworCQlpZiAoZ3BsciAmIEdQSU9fSDM2MDBfQ09NX0NUUykKKwkJCXJldCAmPSB+VElPQ01fQ1RTOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGgzNjAwX3VhcnRfcG0oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdV9pbnQgc3RhdGUsIHVfaW50IG9sZHN0YXRlKQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIyVVRDUjApIHsgLyogVE9ETzogUkVNT1ZFIFRISVMgKi8KKwkJYXNzaWduX2gzNjAwX2VncGlvKElQQVFfRUdQSU9fSVJfT04sICFzdGF0ZSk7CisJfSBlbHNlIGlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIzVVRDUjApIHsKKwkJYXNzaWduX2gzNjAwX2VncGlvKElQQVFfRUdQSU9fUlMyMzJfT04sICFzdGF0ZSk7CisJfQorfQorCisvKgorICogRW5hYmxlL0Rpc2FibGUgd2FrZSB1cCBldmVudHMgZm9yIHRoaXMgc2VyaWFsIHBvcnQuCisgKiBPYnZpb3VzbHksIHdlIG9ubHkgc3VwcG9ydCB0aGlzIG9uIHRoZSBub3JtYWwgQ09NIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgaDM2MDBfdWFydF9zZXRfd2FrZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1X2ludCBlbmFibGUpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSBfU2VyM1VUQ1IwKSB7CisJCWlmIChlbmFibGUpCisJCQlQV0VSIHw9IFBXRVJfR1BJTzIzIHwgUFdFUl9HUElPMjU7IC8qIERDRCBhbmQgQ1RTICovCisJCWVsc2UKKwkJCVBXRVIgJj0gfihQV0VSX0dQSU8yMyB8IFBXRVJfR1BJTzI1KTsgLyogRENEIGFuZCBDVFMgKi8KKwkJZXJyID0gMDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzYTExMDBfcG9ydF9mbnMgaDM2MDBfcG9ydF9mbnMgX19pbml0ZGF0YSA9IHsKKwkuc2V0X21jdHJsCT0gaDM2MDBfdWFydF9zZXRfbWN0cmwsCisJLmdldF9tY3RybAk9IGgzNjAwX3VhcnRfZ2V0X21jdHJsLAorCS5wbQkJPSBoMzYwMF91YXJ0X3BtLAorCS5zZXRfd2FrZQk9IGgzNjAwX3VhcnRfc2V0X3dha2UsCit9OworCisvKgorICogaGVscGVyIGZvciBzYTExMDBmYgorICovCitzdGF0aWMgdm9pZCBoM3h4eF9sY2RfcG93ZXIoaW50IGVuYWJsZSkKK3sKKwlhc3NpZ25faDM2MDBfZWdwaW8oSVBBUV9FR1BJT19MQ0RfUE9XRVIsIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaDM2MDBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgLyogdmlydHVhbAkgICAgICAgcGh5c2ljYWwgCSAgbGVuZ3RoICAgICAgdHlwZSAqLworICB7IEgzNjAwX0JBTktfMl9WSVJULCBTQTExMDBfQ1MyX1BIWVMsICAgMHgwMjgwMDAwMCwgTVRfREVWSUNFIH0sIC8qIHN0YXRpYyBtZW1vcnkgYmFuayAyICBDUyMyICovCisgIHsgSDM2MDBfQkFOS180X1ZJUlQsIFNBMTEwMF9DUzRfUEhZUywgICAweDAwODAwMDAwLCBNVF9ERVZJQ0UgfSwgLyogc3RhdGljIG1lbW9yeSBiYW5rIDQgIENTIzQgKi8KKyAgeyBIMzYwMF9FR1BJT19WSVJULCAgSDM2MDBfRUdQSU9fUEhZUywgIDB4MDEwMDAwMDAsIE1UX0RFVklDRSB9LCAvKiBFR1BJTyAwCQlDUyM1ICovCit9OworCisvKgorICogQ29tbW9uIG1hcF9pbyBpbml0aWFsaXphdGlvbgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBoM3h4eF9tYXBfaW8odm9pZCkKK3sKKwlzYTExMDBfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KGgzNjAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoaDM2MDBfaW9fZGVzYykpOworCisJc2ExMTAwX3JlZ2lzdGVyX3VhcnRfZm5zKCZoMzYwMF9wb3J0X2Zucyk7CisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMCwgMyk7IC8qIENvbW1vbiBzZXJpYWwgcG9ydCAqLworLy8Jc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMSwgMSk7IC8qIE1pY3JvY29udHJvbGxlciBvbiAzMTAwLzM2MDAgKi8KKworCS8qIEVuc3VyZSB0aG9zZSBwaW5zIGFyZSBvdXRwdXRzIGFuZCBkcml2aW5nIGxvdyAgKi8KKwlQUERSIHw9IFBQQ19UWEQ0IHwgUFBDX1NDTEsgfCBQUENfU0ZSTTsKKwlQUFNSICY9IH4oUFBDX1RYRDQgfCBQUENfU0NMSyB8IFBQQ19TRlJNKTsKKworCS8qIENvbmZpZ3VyZSBzdXNwZW5kIGNvbmRpdGlvbnMgKi8KKwlQR1NSID0gMDsKKwlQV0VSID0gUFdFUl9HUElPMCB8IFBXRVJfUlRDOworCVBDRlIgPSBQQ0ZSX09QREU7CisJUFNEUiA9IDA7CisKKwlzYTExMDBmYl9sY2RfcG93ZXIgPSBoM3h4eF9sY2RfcG93ZXI7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZG9fYmxhbmsoaW50IHNldHApCit7CisJaWYgKGlwYXFfbW9kZWxfb3BzLmJsYW5rX2NhbGxiYWNrKQorCQlpcGFxX21vZGVsX29wcy5ibGFua19jYWxsYmFjaygxLXNldHApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBIMzEwMCAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX1NBMTEwMF9IMzEwMAorCisjZGVmaW5lIEgzMTAwX0VHUElPCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKUgzNjAwX0VHUElPX1ZJUlQpCitzdGF0aWMgdW5zaWduZWQgaW50IGgzMTAwX2VncGlvID0gMDsKKworc3RhdGljIHZvaWQgaDMxMDBfY29udHJvbF9lZ3BpbyhlbnVtIGlwYXFfZWdwaW9fdHlwZSB4LCBpbnQgc2V0cCkKK3sKKwl1bnNpZ25lZCBpbnQgZWdwaW8gPSAwOworCWxvbmcJICAgICBncGlvID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoICh4KSB7CisJY2FzZSBJUEFRX0VHUElPX0xDRF9QT1dFUjoKKwkJZWdwaW8gfD0gRUdQSU9fSDM2MDBfTENEX09OOworCQlncGlvICB8PSBHUElPX0gzMTAwX0xDRF8zVl9PTjsKKwkJZG9fYmxhbmsoc2V0cCk7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19MQ0RfRU5BQkxFOgorCQlicmVhazsKKwljYXNlIElQQVFfRUdQSU9fQ09ERUNfTlJFU0VUOgorCQllZ3BpbyB8PSBFR1BJT19IMzYwMF9DT0RFQ19OUkVTRVQ7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19BVURJT19PTjoKKwkJZ3BpbyB8PSBHUElPX0gzMTAwX0FVRF9QV1JfT04KKwkJCXwgR1BJT19IMzEwMF9BVURfT047CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19RTVVURToKKwkJZ3BpbyB8PSBHUElPX0gzMTAwX1FNVVRFOworCQlicmVhazsKKwljYXNlIElQQVFfRUdQSU9fT1BUX05WUkFNX09OOgorCQllZ3BpbyB8PSBFR1BJT19IMzYwMF9PUFRfTlZSQU1fT047CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19PUFRfT046CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX09QVF9PTjsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0NBUkRfUkVTRVQ6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX0NBUkRfUkVTRVQ7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19PUFRfUkVTRVQ6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX09QVF9SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0lSX09OOgorCQlncGlvIHw9IEdQSU9fSDMxMDBfSVJfT047CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19JUl9GU0VMOgorCQlncGlvIHw9IEdQSU9fSDMxMDBfSVJfRlNFTDsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX1JTMjMyX09OOgorCQllZ3BpbyB8PSBFR1BJT19IMzYwMF9SUzIzMl9PTjsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX1ZQUF9PTjoKKwkJZWdwaW8gfD0gRUdQSU9fSDM2MDBfVlBQX09OOworCQlicmVhazsKKwl9CisKKwlpZiAoZWdwaW8gfHwgZ3BpbykgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWlmIChzZXRwKSB7CisJCQloMzEwMF9lZ3BpbyB8PSBlZ3BpbzsKKwkJCUdQU1IgPSBncGlvOworCQl9IGVsc2UgeworCQkJaDMxMDBfZWdwaW8gJj0gfmVncGlvOworCQkJR1BDUiA9IGdwaW87CisJCX0KKwkJSDMxMDBfRUdQSU8gPSBoMzEwMF9lZ3BpbzsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaDMxMDBfcmVhZF9lZ3Bpbyh2b2lkKQoreworCXJldHVybiBoMzEwMF9lZ3BpbzsKK30KKworc3RhdGljIGludCBoMzEwMF9wbV9jYWxsYmFjayhpbnQgcmVxKQoreworCWlmIChpcGFxX21vZGVsX29wcy5wbV9jYWxsYmFja19hdXgpCisJCXJldHVybiBpcGFxX21vZGVsX29wcy5wbV9jYWxsYmFja19hdXgocmVxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcGFxX21vZGVsX29wcyBoMzEwMF9tb2RlbF9vcHMgX19pbml0ZGF0YSA9IHsKKwkuZ2VuZXJpY19uYW1lCT0gIjMxMDAiLAorCS5jb250cm9sCT0gaDMxMDBfY29udHJvbF9lZ3BpbywKKwkucmVhZAkJPSBoMzEwMF9yZWFkX2VncGlvLAorCS5wbV9jYWxsYmFjawk9IGgzMTAwX3BtX2NhbGxiYWNrCit9OworCisjZGVmaW5lIEgzMTAwX0RJUkVDVF9FR1BJTyAoR1BJT19IMzEwMF9CVF9PTgkgIFwKKwkJCSAgfCBHUElPX0gzMTAwX0dQSU8zCSAgXAorCQkJICB8IEdQSU9fSDMxMDBfUU1VVEUJICBcCisJCQkgIHwgR1BJT19IMzEwMF9MQ0RfM1ZfT04gIFwKKwkJCSAgfCBHUElPX0gzMTAwX0FVRF9PTgkgIFwKKwkJCSAgfCBHUElPX0gzMTAwX0FVRF9QV1JfT04gXAorCQkJICB8IEdQSU9fSDMxMDBfSVJfT04JICBcCisJCQkgIHwgR1BJT19IMzEwMF9JUl9GU0VMKQorCitzdGF0aWMgdm9pZCBfX2luaXQgaDMxMDBfbWFwX2lvKHZvaWQpCit7CisJaDN4eHhfbWFwX2lvKCk7CisKKwkvKiBJbml0aWFsaXplIGgzMTAwLXNwZWNpZmljIHZhbHVlcyBoZXJlICovCisJR1BDUiA9IDB4MGZmZmZmZmY7CSAvKiBBbGwgb3V0cHV0cyBhcmUgc2V0IGxvdyBieSBkZWZhdWx0ICovCisJR1BEUiA9IEdQSU9fSDM2MDBfQ09NX1JUUyAgfCBHUElPX0gzNjAwX0wzX0NMT0NLIHwKKwkgICAgICAgR1BJT19IMzYwMF9MM19NT0RFICB8IEdQSU9fSDM2MDBfTDNfREFUQSAgfAorCSAgICAgICBHUElPX0gzNjAwX0NMS19TRVQxIHwgR1BJT19IMzYwMF9DTEtfU0VUMCB8CisJICAgICAgIEgzMTAwX0RJUkVDVF9FR1BJTzsKKworCS8qIE9sZGVyIGJvb3RsZHJzIHB1dCBHUElPMi05IGluIGFsdGVybmF0ZSBtb2RlIG9uIHRoZQorCSAgIGFzc3VtcHRpb24gdGhhdCB0aGV5IGFyZSB1c2VkIGZvciB2aWRlbyAqLworCUdBRlIgJj0gfkgzMTAwX0RJUkVDVF9FR1BJTzsKKworCUgzMTAwX0VHUElPID0gaDMxMDBfZWdwaW87CisJaXBhcV9tb2RlbF9vcHMgPSBoMzEwMF9tb2RlbF9vcHM7Cit9CisKK01BQ0hJTkVfU1RBUlQoSDMxMDAsICJDb21wYXEgaVBBUSBIMzEwMCIpCisJQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKKwlCT09UX1BBUkFNUygweGMwMDAwMTAwKQorCU1BUElPKGgzMTAwX21hcF9pbykKKwlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gaDN4eHhfbWFjaF9pbml0LAorTUFDSElORV9FTkQKKworI2VuZGlmIC8qIENPTkZJR19TQTExMDBfSDMxMDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSDM2MDAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19TQTExMDBfSDM2MDAKKworI2RlZmluZSBIMzYwMF9FR1BJTwkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilIMzYwMF9FR1BJT19WSVJUKQorc3RhdGljIHVuc2lnbmVkIGludCBoMzYwMF9lZ3BpbyA9IEVHUElPX0gzNjAwX1JTMjMyX09OOworCitzdGF0aWMgdm9pZCBoMzYwMF9jb250cm9sX2VncGlvKGVudW0gaXBhcV9lZ3Bpb190eXBlIHgsIGludCBzZXRwKQoreworCXVuc2lnbmVkIGludCBlZ3BpbyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoeCkgeworCWNhc2UgSVBBUV9FR1BJT19MQ0RfUE9XRVI6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX0xDRF9PTiB8CisJCQkgRUdQSU9fSDM2MDBfTENEX1BDSSB8CisJCQkgRUdQSU9fSDM2MDBfTENEXzVWX09OIHwKKwkJCSBFR1BJT19IMzYwMF9MVkREX09OOworCQlkb19ibGFuayhzZXRwKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0xDRF9FTkFCTEU6CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19DT0RFQ19OUkVTRVQ6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX0NPREVDX05SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0FVRElPX09OOgorCQllZ3BpbyB8PSBFR1BJT19IMzYwMF9BVURfQU1QX09OIHwKKwkJCSBFR1BJT19IMzYwMF9BVURfUFdSX09OOworCQlicmVhazsKKwljYXNlIElQQVFfRUdQSU9fUU1VVEU6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX1FNVVRFOworCQlicmVhazsKKwljYXNlIElQQVFfRUdQSU9fT1BUX05WUkFNX09OOgorCQllZ3BpbyB8PSBFR1BJT19IMzYwMF9PUFRfTlZSQU1fT047CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19PUFRfT046CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX09QVF9PTjsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0NBUkRfUkVTRVQ6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX0NBUkRfUkVTRVQ7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19PUFRfUkVTRVQ6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX09QVF9SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0lSX09OOgorCQllZ3BpbyB8PSBFR1BJT19IMzYwMF9JUl9PTjsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0lSX0ZTRUw6CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX0lSX0ZTRUw7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19SUzIzMl9PTjoKKwkJZWdwaW8gfD0gRUdQSU9fSDM2MDBfUlMyMzJfT047CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19WUFBfT046CisJCWVncGlvIHw9IEVHUElPX0gzNjAwX1ZQUF9PTjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGVncGlvKSB7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYgKHNldHApCisJCQloMzYwMF9lZ3BpbyB8PSBlZ3BpbzsKKwkJZWxzZQorCQkJaDM2MDBfZWdwaW8gJj0gfmVncGlvOworCQlIMzYwMF9FR1BJTyA9IGgzNjAwX2VncGlvOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoMzYwMF9yZWFkX2VncGlvKHZvaWQpCit7CisJcmV0dXJuIGgzNjAwX2VncGlvOworfQorCitzdGF0aWMgaW50IGgzNjAwX3BtX2NhbGxiYWNrKGludCByZXEpCit7CisJaWYgKGlwYXFfbW9kZWxfb3BzLnBtX2NhbGxiYWNrX2F1eCkKKwkJcmV0dXJuIGlwYXFfbW9kZWxfb3BzLnBtX2NhbGxiYWNrX2F1eChyZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlwYXFfbW9kZWxfb3BzIGgzNjAwX21vZGVsX29wcyBfX2luaXRkYXRhID0geworCS5nZW5lcmljX25hbWUJPSAiMzYwMCIsCisJLmNvbnRyb2wJPSBoMzYwMF9jb250cm9sX2VncGlvLAorCS5yZWFkCQk9IGgzNjAwX3JlYWRfZWdwaW8sCisJLnBtX2NhbGxiYWNrCT0gaDM2MDBfcG1fY2FsbGJhY2sKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoMzYwMF9tYXBfaW8odm9pZCkKK3sKKwloM3h4eF9tYXBfaW8oKTsKKworCS8qIEluaXRpYWxpemUgaDM2MDAtc3BlY2lmaWMgdmFsdWVzIGhlcmUgKi8KKworCUdQQ1IgPSAweDBmZmZmZmZmOwkgLyogQWxsIG91dHB1dHMgYXJlIHNldCBsb3cgYnkgZGVmYXVsdCAqLworCUdQRFIgPSBHUElPX0gzNjAwX0NPTV9SVFMgIHwgR1BJT19IMzYwMF9MM19DTE9DSyB8CisJICAgICAgIEdQSU9fSDM2MDBfTDNfTU9ERSAgfCBHUElPX0gzNjAwX0wzX0RBVEEgIHwKKwkgICAgICAgR1BJT19IMzYwMF9DTEtfU0VUMSB8IEdQSU9fSDM2MDBfQ0xLX1NFVDAgfAorCSAgICAgICBHUElPX0xERDE1IHwgR1BJT19MREQxNCB8IEdQSU9fTEREMTMgfCBHUElPX0xERDEyIHwKKwkgICAgICAgR1BJT19MREQxMSB8IEdQSU9fTEREMTAgfCBHUElPX0xERDkgIHwgR1BJT19MREQ4OworCisJSDM2MDBfRUdQSU8gPSBoMzYwMF9lZ3BpbzsJICAgLyogTWFpbnRhaW5zIGFjcm9zcyBzbGVlcD8gKi8KKwlpcGFxX21vZGVsX29wcyA9IGgzNjAwX21vZGVsX29wczsKK30KKworTUFDSElORV9TVEFSVChIMzYwMCwgIkNvbXBhcSBpUEFRIEgzNjAwIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8oaDM2MDBfbWFwX2lvKQorCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBoM3h4eF9tYWNoX2luaXQsCitNQUNISU5FX0VORAorCisjZW5kaWYgLyogQ09ORklHX1NBMTEwMF9IMzYwMCAqLworCisjaWZkZWYgQ09ORklHX1NBMTEwMF9IMzgwMAorCisjZGVmaW5lIFNFVF9BU0lDMSh4KSBcCisgICBkbyB7aWYgKHNldHApIHsgSDM4MDBfQVNJQzFfR1BJT19PVVQgfD0gKHgpOyB9IGVsc2UgeyBIMzgwMF9BU0lDMV9HUElPX09VVCAmPSB+KHgpOyB9fSB3aGlsZSgwKQorCisjZGVmaW5lIFNFVF9BU0lDMih4KSBcCisgICBkbyB7aWYgKHNldHApIHsgSDM4MDBfQVNJQzJfR1BJT1BJT0QgfD0gKHgpOyB9IGVsc2UgeyBIMzgwMF9BU0lDMl9HUElPUElPRCAmPSB+KHgpOyB9fSB3aGlsZSgwKQorCisjZGVmaW5lIENMRUFSX0FTSUMxKHgpIFwKKyAgIGRvIHtpZiAoc2V0cCkgeyBIMzgwMF9BU0lDMV9HUElPX09VVCAmPSB+KHgpOyB9IGVsc2UgeyBIMzgwMF9BU0lDMV9HUElPX09VVCB8PSAoeCk7IH19IHdoaWxlKDApCisKKyNkZWZpbmUgQ0xFQVJfQVNJQzIoeCkgXAorICAgZG8ge2lmIChzZXRwKSB7IEgzODAwX0FTSUMyX0dQSU9QSU9EICY9IH4oeCk7IH0gZWxzZSB7IEgzODAwX0FTSUMyX0dQSU9QSU9EIHw9ICh4KTsgfX0gd2hpbGUoMCkKKworCisvKgorICBPbiBzY3JlZW4gZW5hYmxlLCB3ZSBnZXQKKworICAgICBoMzgwMF92aWRlb19wb3dlcl9vbigxKQorICAgICBMQ0QgY29udHJvbGxlciBzdGFydHMKKyAgICAgaDM4MDBfdmlkZW9fbGNkX2VuYWJsZSgxKQorCisgIE9uIHNjcmVlbiBkaXNhYmxlLCB3ZSBnZXQKKworICAgICBoMzgwMF92aWRlb19sY2RfZW5hYmxlKDApCisgICAgIExDRCBjb250cm9sbGVyIHN0b3BzCisgICAgIGgzODAwX3ZpZGVvX3Bvd2VyX29uKDApCisqLworCisKK3N0YXRpYyB2b2lkIGgzODAwX3ZpZGVvX3Bvd2VyX29uKGludCBzZXRwKQoreworCWlmIChzZXRwKSB7CisJCUgzODAwX0FTSUMxX0dQSU9fT1VUIHw9IEdQSU8xX0xDRF9PTjsKKwkJbXNsZWVwKDMwKTsKKwkJSDM4MDBfQVNJQzFfR1BJT19PVVQgfD0gR1BJTzFfVkdMX09OOworCQltc2xlZXAoNSk7CisJCUgzODAwX0FTSUMxX0dQSU9fT1VUIHw9IEdQSU8xX1ZHSF9PTjsKKwkJbXNsZWVwKDUwKTsKKwkJSDM4MDBfQVNJQzFfR1BJT19PVVQgfD0gR1BJTzFfTENEXzVWX09OOworCQltc2xlZXAoNSk7CisJfSBlbHNlIHsKKwkJbXNsZWVwKDUpOworCQlIMzgwMF9BU0lDMV9HUElPX09VVCAmPSB+R1BJTzFfTENEXzVWX09OOworCQltc2xlZXAoNTApOworCQlIMzgwMF9BU0lDMV9HUElPX09VVCAmPSB+R1BJTzFfVkdMX09OOworCQltc2xlZXAoNSk7CisJCUgzODAwX0FTSUMxX0dQSU9fT1VUICY9IH5HUElPMV9WR0hfT047CisJCW1zbGVlcCgxMDApOworCQlIMzgwMF9BU0lDMV9HUElPX09VVCAmPSB+R1BJTzFfTENEX09OOworCX0KK30KKworc3RhdGljIHZvaWQgaDM4MDBfdmlkZW9fbGNkX2VuYWJsZShpbnQgc2V0cCkKK3sKKwlpZiAoc2V0cCkgeworCQltc2xlZXAoMTcpOwkvLyBXYWl0IG9uZSBmcm9tIGJlZm9yZSB0dXJuaW5nIG9uCisJCUgzODAwX0FTSUMxX0dQSU9fT1VUIHw9IEdQSU8xX0xDRF9QQ0k7CisJfSBlbHNlIHsKKwkJSDM4MDBfQVNJQzFfR1BJT19PVVQgJj0gfkdQSU8xX0xDRF9QQ0k7CisJCW1zbGVlcCgzMCk7CS8vIFdhaXQgYmVmb3JlIHR1cm5pbmcgb2ZmCisJfQorfQorCisKK3N0YXRpYyB2b2lkIGgzODAwX2NvbnRyb2xfZWdwaW8oZW51bSBpcGFxX2VncGlvX3R5cGUgeCwgaW50IHNldHApCit7CisJc3dpdGNoICh4KSB7CisJY2FzZSBJUEFRX0VHUElPX0xDRF9QT1dFUjoKKwkJaDM4MDBfdmlkZW9fcG93ZXJfb24oc2V0cCk7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19MQ0RfRU5BQkxFOgorCQloMzgwMF92aWRlb19sY2RfZW5hYmxlKHNldHApOworCQlicmVhazsKKwljYXNlIElQQVFfRUdQSU9fQ09ERUNfTlJFU0VUOgorCWNhc2UgSVBBUV9FR1BJT19BVURJT19PTjoKKwljYXNlIElQQVFfRUdQSU9fUU1VVEU6CisJCXByaW50aygiJXM6IGVycm9yIC0gc2hvdWxkIG5vdCBiZSBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19PUFRfTlZSQU1fT046CisJCVNFVF9BU0lDMihHUElPMl9PUFRfT05fTlZSQU0pOworCQlicmVhazsKKwljYXNlIElQQVFfRUdQSU9fT1BUX09OOgorCQlTRVRfQVNJQzIoR1BJTzJfT1BUX09OKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX0NBUkRfUkVTRVQ6CisJCVNFVF9BU0lDMihHUElPMl9PUFRfUENNX1JFU0VUKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFRX0VHUElPX09QVF9SRVNFVDoKKwkJU0VUX0FTSUMyKEdQSU8yX09QVF9SRVNFVCk7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19JUl9PTjoKKwkJQ0xFQVJfQVNJQzEoR1BJTzFfSVJfT05fTik7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19JUl9GU0VMOgorCQlicmVhazsKKwljYXNlIElQQVFfRUdQSU9fUlMyMzJfT046CisJCVNFVF9BU0lDMShHUElPMV9SUzIzMl9PTik7CisJCWJyZWFrOworCWNhc2UgSVBBUV9FR1BJT19WUFBfT046CisJCUgzODAwX0FTSUMyX0ZsYXNoV1BfVlBQX09OID0gc2V0cDsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoMzgwMF9yZWFkX2VncGlvKHZvaWQpCit7CisJcmV0dXJuIEgzODAwX0FTSUMxX0dQSU9fT1VUIHwgKEgzODAwX0FTSUMyX0dQSU9QSU9EIDw8IDE2KTsKK30KKworLyogV2UgbmVlZCB0byBmaXggQVNJQzIgR1BJTyBvdmVyIHN1c3BlbmQvcmVzdW1lLiAgQXQgdGhlIG1vbWVudCwKKyAgIGl0IGRvZXNuJ3QgYXBwZWFyIHRoYXQgQVNJQzEgR1BJTyBoYXMgdGhlIHNhbWUgcHJvYmxlbSAqLworCitzdGF0aWMgaW50IGgzODAwX3BtX2NhbGxiYWNrKGludCByZXEpCit7CisJc3RhdGljIHUxNiBhc2ljMV9kYXRhOworCXN0YXRpYyB1MTYgYXNpYzJfZGF0YTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXByaW50aygiJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVxKTsKKworCXN3aXRjaCAocmVxKSB7CisJY2FzZSBQTV9SRVNVTUU6CisJCU1TQzIgPSAoTVNDMiAmIDB4MDAwMGZmZmYpIHwgMHhFNDUxMDAwMDsgIC8qIFNldCBNU0MyIGNvcnJlY3RseSAqLworCisJCUgzODAwX0FTSUMyX0dQSU9QSU9EID0gYXNpYzJfZGF0YTsKKwkJSDM4MDBfQVNJQzJfR1BJT0RJUiA9IEdQSU8yX1BFTl9JUlEKKwkJCXwgR1BJTzJfU0RfREVURUNUCisJCQl8IEdQSU8yX0VBUl9JTl9OCisJCQl8IEdQSU8yX1VTQl9ERVRFQ1RfTgorCQkJfCBHUElPMl9TRF9DT05fU0xUOworCisJCUgzODAwX0FTSUMxX0dQSU9fT1VUID0gYXNpYzFfZGF0YTsKKworCQlpZiAoaXBhcV9tb2RlbF9vcHMucG1fY2FsbGJhY2tfYXV4KQorCQkJcmVzdWx0ID0gaXBhcV9tb2RlbF9vcHMucG1fY2FsbGJhY2tfYXV4KHJlcSk7CisJCWJyZWFrOworCisJY2FzZSBQTV9TVVNQRU5EOgorCQlpZiAoaXBhcV9tb2RlbF9vcHMucG1fY2FsbGJhY2tfYXV4ICYmCisJCSAgICAgKChyZXN1bHQgPSBpcGFxX21vZGVsX29wcy5wbV9jYWxsYmFja19hdXgocmVxKSkgIT0gMCkpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWFzaWMxX2RhdGEgPSBIMzgwMF9BU0lDMV9HUElPX09VVDsKKwkJYXNpYzJfZGF0YSA9IEgzODAwX0FTSUMyX0dQSU9QSU9EOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIiVzOiB1bnJlY29nbml6ZWQgUE0gY2FsbGJhY2tcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGlwYXFfbW9kZWxfb3BzIGgzODAwX21vZGVsX29wcyBfX2luaXRkYXRhID0geworCS5nZW5lcmljX25hbWUJPSAiMzgwMCIsCisJLmNvbnRyb2wJPSBoMzgwMF9jb250cm9sX2VncGlvLAorCS5yZWFkCQk9IGgzODAwX3JlYWRfZWdwaW8sCisJLnBtX2NhbGxiYWNrCT0gaDM4MDBfcG1fY2FsbGJhY2sKK307CisKKyNkZWZpbmUgTUFYX0FTSUNfSVNSX0xPT1BTICAgIDIwCisKKy8qIFRoZSBvcmRlciBvZiB0aGVzZSBpcyBpbXBvcnRhbnQgLSBzZWUgI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4gKi8KK3N0YXRpYyB1MzIga3Bpb19pcnFfbWFza1tdID0geworCUtQSU9fS0VZX0FMTCwKKwlLUElPX1NQSV9JTlQsCisJS1BJT19PV01fSU5ULAorCUtQSU9fQURDX0lOVCwKKwlLUElPX1VBUlRfMF9JTlQsCisJS1BJT19VQVJUXzFfSU5ULAorCUtQSU9fVElNRVJfMF9JTlQsCisJS1BJT19USU1FUl8xX0lOVCwKKwlLUElPX1RJTUVSXzJfSU5UCit9OworCitzdGF0aWMgdTMyIGdwaW9faXJxX21hc2tbXSA9IHsKKwlHUElPMl9QRU5fSVJRLAorCUdQSU8yX1NEX0RFVEVDVCwKKwlHUElPMl9FQVJfSU5fTiwKKwlHUElPMl9VU0JfREVURUNUX04sCisJR1BJTzJfU0RfQ09OX1NMVCwKK307CisKK3N0YXRpYyB2b2lkIGgzODAwX0lSUV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisKKwlpZiAoMCkgcHJpbnRrKCIlczogaW50ZXJydXB0IHJlY2VpdmVkXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FTSUNfSVNSX0xPT1BTICYmIChHUExSICYgR1BJT19IMzgwMF9BU0lDKTsgaSsrKSB7CisJCXUzMiBpcnE7CisJCWludCBqOworCisJCS8qIEtQSU8gKi8KKwkJaXJxID0gSDM4MDBfQVNJQzJfS1BJSU5URkxBRzsKKwkJaWYgKDApIHByaW50aygiJXMgS1BJTyAweCUwOFhcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKKwkJZm9yIChqID0gMDsgaiA8IEgzODAwX0tQSU9fSVJRX0NPVU5UOyBqKyspCisJCQlpZiAoaXJxICYga3Bpb19pcnFfbWFza1tqXSkKKwkJCQlkb19lZGdlX0lSUShIMzgwMF9LUElPX0lSUV9DT1VOVCArIGosIGlycV9kZXNjICsgSDM4MDBfS1BJT19JUlFfQ09VTlQgKyBqLCByZWdzKTsKKworCQkvKiBHUElPMiAqLworCQlpcnEgPSBIMzgwMF9BU0lDMl9HUElJTlRGTEFHOworCQlpZiAoMCkgcHJpbnRrKCIlcyBHUElPIDB4JTA4WFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOworCQlmb3IgKGogPSAwOyBqIDwgSDM4MDBfR1BJT19JUlFfQ09VTlQ7IGorKykKKwkJCWlmIChpcnEgJiBncGlvX2lycV9tYXNrW2pdKQorCQkJCWRvX2VkZ2VfSVJRKEgzODAwX0dQSU9fSVJRX0NPVU5UICsgaiwgaXJxX2Rlc2MgKyBIMzgwMF9HUElPX0lSUV9DT1VOVCArIGogLCByZWdzKTsKKwl9CisKKwlpZiAoaSA+PSBNQVhfQVNJQ19JU1JfTE9PUFMpCisJCXByaW50aygiJXM6IGludGVycnVwdCBwcm9jZXNzaW5nIG92ZXJydW5cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBGb3IgbGV2ZWwtYmFzZWQgaW50ZXJydXB0cyAqLworCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGgzODAwX2lycSA9IHsKKwkubmFtZQkJPSAiaDM4MDBfYXNpYyIsCisJLmhhbmRsZXIJPSBoMzgwMF9JUlFfZGVtdXgsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKK307CisKK3UzMiBrcGlvX2ludF9zaGFkb3cgPSAwOworCisKKy8qIG1hc2tfYWNrIDwtIElSUSBpcyBmaXJzdCBzZXJ2aWNlZC4KKyAgICAgICBtYXNrIDwtIElSUSBpcyBkaXNhYmxlZC4KKyAgICAgdW5tYXNrIDwtIElSUSBpcyBlbmFibGVkCisKKyAgICAgVGhlIElOVENMUiByZWdpc3RlcnMgYXJlIHBvb3JseSBkb2N1bWVudGVkLiAgSSBiZWxpZXZlIHRoYXQgd3JpdGluZworICAgICBhICIxIiB0byB0aGUgcmVnaXN0ZXIgY2xlYXJzIHRoZSBzcGVjaWZpYyBpbnRlcnJ1cHQsIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbgorICAgICBpbmRpY2F0ZXMgd3JpdGluZyBhICIwIiBjbGVhcnMgdGhlIGludGVycnVwdC4gIEluIGFueSBjYXNlLCB0aGV5IHNob3VsZG4ndAorICAgICBiZSByZWFkICh0aGF0J3MgdGhlIElOVEZMQUcgcmVnaXN0ZXIpCisgKi8KKworc3RhdGljIHZvaWQgaDM4MDBfbWFza19hY2tfa3Bpb19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgbWFzayA9IGtwaW9faXJxX21hc2tbaXJxIC0gSDM4MDBfS1BJT19JUlFfU1RBUlRdOworCWtwaW9faW50X3NoYWRvdyAmPSB+bWFzazsKKwlIMzgwMF9BU0lDMl9LUElJTlRTVEFUID0ga3Bpb19pbnRfc2hhZG93OworCUgzODAwX0FTSUMyX0tQSUlOVENMUiAgPSBtYXNrOworfQorCitzdGF0aWMgdm9pZCBoMzgwMF9tYXNrX2twaW9faXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIG1hc2sgPSBrcGlvX2lycV9tYXNrW2lycSAtIEgzODAwX0tQSU9fSVJRX1NUQVJUXTsKKwlrcGlvX2ludF9zaGFkb3cgJj0gfm1hc2s7CisJSDM4MDBfQVNJQzJfS1BJSU5UU1RBVCA9IGtwaW9faW50X3NoYWRvdzsKK30KKworc3RhdGljIHZvaWQgaDM4MDBfdW5tYXNrX2twaW9faXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIG1hc2sgPSBrcGlvX2lycV9tYXNrW2lycSAtIEgzODAwX0tQSU9fSVJRX1NUQVJUXTsKKwlrcGlvX2ludF9zaGFkb3cgfD0gbWFzazsKKwlIMzgwMF9BU0lDMl9LUElJTlRTVEFUID0ga3Bpb19pbnRfc2hhZG93OworfQorCitzdGF0aWMgdm9pZCBoMzgwMF9tYXNrX2Fja19ncGlvX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBtYXNrID0gZ3Bpb19pcnFfbWFza1tpcnEgLSBIMzgwMF9HUElPX0lSUV9TVEFSVF07CisJSDM4MDBfQVNJQzJfR1BJSU5UU1RBVCAmPSB+bWFzazsKKwlIMzgwMF9BU0lDMl9HUElJTlRDTFIJPSBtYXNrOworfQorCitzdGF0aWMgdm9pZCBoMzgwMF9tYXNrX2dwaW9faXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIG1hc2sgPSBncGlvX2lycV9tYXNrW2lycSAtIEgzODAwX0dQSU9fSVJRX1NUQVJUXTsKKwlIMzgwMF9BU0lDMl9HUElJTlRTVEFUICY9IH5tYXNrOworCX0KKworc3RhdGljIHZvaWQgaDM4MDBfdW5tYXNrX2dwaW9faXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIG1hc2sgPSBncGlvX2lycV9tYXNrW2lycSAtIEgzODAwX0dQSU9fSVJRX1NUQVJUXTsKKwlIMzgwMF9BU0lDMl9HUElJTlRTVEFUIHw9IG1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoMzgwMF9pbml0X2lycSh2b2lkKQoreworCWludCBpOworCisJLyogSW5pdGlhbGl6ZSBzdGFuZGFyZCBJUlFzICovCisJc2ExMTAwX2luaXRfaXJxKCk7CisKKwkvKiBEaXNhYmxlIGFsbCBJUlFzIGFuZCBzZXQgdXAgY2xvY2sgKi8KKwlIMzgwMF9BU0lDMl9LUElJTlRTVEFUCSAgID0gIDA7ICAgICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJSDM4MDBfQVNJQzJfR1BJSU5UU1RBVAkgICA9ICAwOworCisJSDM4MDBfQVNJQzJfS1BJSU5UQ0xSCSAgID0gIDA7ICAgICAvKiBDbGVhciBhbGwgS1BJTyBpbnRlcnJ1cHRzICovCisJSDM4MDBfQVNJQzJfR1BJSU5UQ0xSCSAgID0gIDA7ICAgICAvKiBDbGVhciBhbGwgR1BJTyBpbnRlcnJ1cHRzICovCisKKy8vCUgzODAwX0FTSUMyX0tQSUlOVENMUgkgICA9ICAweGZmZmY7CSAgLyogQ2xlYXIgYWxsIEtQSU8gaW50ZXJydXB0cyAqLworLy8JSDM4MDBfQVNJQzJfR1BJSU5UQ0xSCSAgID0gIDB4ZmZmZjsJICAvKiBDbGVhciBhbGwgR1BJTyBpbnRlcnJ1cHRzICovCisKKwlIMzgwMF9BU0lDMl9DTE9DS19FbmFibGUgICAgICAgfD0gQVNJQzJfQ0xPQ0tfRVgwOyAgIC8qIDMyIGtIWiBjcnlzdGFsIG9uICovCisJSDM4MDBfQVNJQzJfSU5UUl9DbG9ja1ByZXNjYWxlIHw9IEFTSUMyX0lOVENQU19TRVQ7CisJSDM4MDBfQVNJQzJfSU5UUl9DbG9ja1ByZXNjYWxlCT0gQVNJQzJfSU5UQ1BTX0NQUygweDBlKSB8IEFTSUMyX0lOVENQU19TRVQ7CisJSDM4MDBfQVNJQzJfSU5UUl9UaW1lclNldAk9IDE7CisKKyNpZiAwCisJZm9yIChpID0gMDsgaSA8IEgzODAwX0tQSU9fSVJRX0NPVU5UOyBpKyspIHsKKwkJaW50IGlycSA9IGkgKyBIMzgwMF9LUElPX0lSUV9TVEFSVDsKKwkJaXJxX2Rlc2NbaXJxXS52YWxpZCAgICA9IDE7CisJCWlycV9kZXNjW2lycV0ucHJvYmVfb2sgPSAxOworCQlzZXRfaXJxX2NoaXAoaXJxLCAmaDM4MDBfa3Bpb19pcnFjaGlwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSDM4MDBfR1BJT19JUlFfQ09VTlQ7IGkrKykgeworCQlpbnQgaXJxID0gaSArIEgzODAwX0dQSU9fSVJRX1NUQVJUOworCQlpcnFfZGVzY1tpcnFdLnZhbGlkICAgID0gMTsKKwkJaXJxX2Rlc2NbaXJxXS5wcm9iZV9vayA9IDE7CisJCXNldF9pcnFfY2hpcChpcnEsICZoMzgwMF9ncGlvX2lycWNoaXApOworCX0KKyNlbmRpZgorCXNldF9pcnFfdHlwZShJUlFfR1BJT19IMzgwMF9BU0lDLCBJUlFUX1JJU0lORyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU9fSDM4MDBfQVNJQywgJmgzODAwX0lSUV9kZW11eCk7Cit9CisKKworI2RlZmluZSBBU0lDMV9PVVRQVVRTCSAweDdmZmYgICAvKiBGaXJzdCAxNSBiaXRzIGFyZSB1c2VkICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBoMzgwMF9tYXBfaW8odm9pZCkKK3sKKwloM3h4eF9tYXBfaW8oKTsKKworCS8qIEFkZCB3YWtldXAgb24gQUMgcGx1Zy91bnBsdWcgKi8KKwlQV0VSICB8PSBQV0VSX0dQSU8xMjsKKworCS8qIEluaXRpYWxpemUgaDM4MDAtc3BlY2lmaWMgdmFsdWVzIGhlcmUgKi8KKwlHUENSID0gMHgwZmZmZmZmZjsJIC8qIEFsbCBvdXRwdXRzIGFyZSBzZXQgbG93IGJ5IGRlZmF1bHQgKi8KKwlHQUZSID0JR1BJT19IMzgwMF9DTEtfT1VUIHwKKwkJR1BJT19MREQxNSB8IEdQSU9fTEREMTQgfCBHUElPX0xERDEzIHwgR1BJT19MREQxMiB8CisJCUdQSU9fTEREMTEgfCBHUElPX0xERDEwIHwgR1BJT19MREQ5ICB8IEdQSU9fTEREODsKKwlHUERSID0JR1BJT19IMzgwMF9DTEtfT1VUIHwKKwkJR1BJT19IMzYwMF9DT01fUlRTICB8IEdQSU9fSDM2MDBfTDNfQ0xPQ0sgfAorCQlHUElPX0gzNjAwX0wzX01PREUgIHwgR1BJT19IMzYwMF9MM19EQVRBICB8CisJCUdQSU9fTEREMTUgfCBHUElPX0xERDE0IHwgR1BJT19MREQxMyB8IEdQSU9fTEREMTIgfAorCQlHUElPX0xERDExIHwgR1BJT19MREQxMCB8IEdQSU9fTEREOSAgfCBHUElPX0xERDg7CisJVFVDUiA9CVRVQ1JfM182ODY0TUh6OyAgIC8qIFNlZW1zIHRvIGJlIHVzZWQgb25seSBmb3IgdGhlIEJsdWV0b290aCBVQVJUICovCisKKwkvKiBGaXggdGhlIG1lbW9yeSBidXMgKi8KKwlNU0MyID0gKE1TQzIgJiAweDAwMDBmZmZmKSB8IDB4RTQ1MTAwMDA7CisKKwkvKiBTZXQgdXAgQVNJQyAjMSAqLworCUgzODAwX0FTSUMxX0dQSU9fRElSCQk9IEFTSUMxX09VVFBVVFM7CSAgICAvKiBBbGwgb3V0cHV0cyAqLworCUgzODAwX0FTSUMxX0dQSU9fTUFTSwkJPSBBU0lDMV9PVVRQVVRTOwkgICAgLyogTm8gaW50ZXJydXB0cyAqLworCUgzODAwX0FTSUMxX0dQSU9fU0xFRVBfTUFTSwk9IEFTSUMxX09VVFBVVFM7CisJSDM4MDBfQVNJQzFfR1BJT19TTEVFUF9ESVIJPSBBU0lDMV9PVVRQVVRTOworCUgzODAwX0FTSUMxX0dQSU9fU0xFRVBfT1VUCT0gR1BJTzFfRUFSX09OX047CisJSDM4MDBfQVNJQzFfR1BJT19CQVRUX0ZBVUxUX0RJUiA9IEFTSUMxX09VVFBVVFM7CisJSDM4MDBfQVNJQzFfR1BJT19CQVRUX0ZBVUxUX09VVCA9IEdQSU8xX0VBUl9PTl9OOworCisJSDM4MDBfQVNJQzFfR1BJT19PVVQgPSBHUElPMV9JUl9PTl9OCisJCQkJICAgICAgfCBHUElPMV9SUzIzMl9PTgorCQkJCSAgICAgIHwgR1BJTzFfRUFSX09OX047CisKKwkvKiBTZXQgdXAgQVNJQyAjMiAqLworCUgzODAwX0FTSUMyX0dQSU9QSU9ECT0gR1BJTzJfSU5fWTFfTiB8IEdQSU8yX0lOX1gxX047CisJSDM4MDBfQVNJQzJfR1BPQkZTVEFUCT0gR1BJTzJfSU5fWTFfTiB8IEdQSU8yX0lOX1gxX047CisKKwlIMzgwMF9BU0lDMl9HUElPRElSCT0gR1BJTzJfUEVOX0lSUQorCQkJCSAgICAgIHwgR1BJTzJfU0RfREVURUNUCisJCQkJICAgICAgfCBHUElPMl9FQVJfSU5fTgorCQkJCSAgICAgIHwgR1BJTzJfVVNCX0RFVEVDVF9OCisJCQkJICAgICAgfCBHUElPMl9TRF9DT05fU0xUOworCisJLyogVE9ETyA6IFNldCBzbGVlcCBzdGF0ZXMgJiBiYXR0ZXJ5IGZhdWx0IHN0YXRlcyAqLworCisJLyogQ2xlYXIgVlBQIEVuYWJsZSAqLworCUgzODAwX0FTSUMyX0ZsYXNoV1BfVlBQX09OID0gMDsKKwlpcGFxX21vZGVsX29wcyA9IGgzODAwX21vZGVsX29wczsKK30KKworTUFDSElORV9TVEFSVChIMzgwMCwgIkNvbXBhcSBpUEFRIEgzODAwIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8oaDM4MDBfbWFwX2lvKQorCUlOSVRJUlEoaDM4MDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGgzeHh4X21hY2hfaW5pdCwKK01BQ0hJTkVfRU5ECisKKyNlbmRpZiAvKiBDT05GSUdfU0ExMTAwX0gzODAwICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwODQxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBTdGVmYW4gRWxldHpob2ZlciA8c3RlZmFuLmVsZXR6aG9mZXJAZWxldHp0cmljay5kZT4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIEhhY2tLaXQgdHdlYWtzLiBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGZyb20KKyAqIE5pY29sYXMgUGl0cmUncyBhc3NhYmV0IGZpeGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2VyaWFsX3NhMTEwMC5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHByb3RvdHlwZXMKKyAqLworCisvKiBpbml0IGZ1bmNzICovCitzdGF0aWMgdm9pZCBfX2luaXQgaGFja2tpdF9tYXBfaW8odm9pZCk7CisKK3N0YXRpYyB1X2ludCBoYWNra2l0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGhhY2traXRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVfaW50IG1jdHJsKTsKK3N0YXRpYyB2b2lkIGhhY2traXRfdWFydF9wbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1X2ludCBzdGF0ZSwgdV9pbnQgb2xkc3RhdGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdsb2JhbCBkYXRhCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBzdGF0aWMgZGF0YQorICovCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaGFja2tpdF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICBsZW5ndGggICAgICB0eXBlICovCisgIHsgMHhlODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMTAwMDAwMCwgTVRfREVWSUNFIH0gLyogRmxhc2ggYmFuayAwICovCit9OworCitzdGF0aWMgc3RydWN0IHNhMTEwMF9wb3J0X2ZucyBoYWNra2l0X3BvcnRfZm5zIF9faW5pdGRhdGEgPSB7CisJLnNldF9tY3RybAk9IGhhY2traXRfc2V0X21jdHJsLAorCS5nZXRfbWN0cmwJPSBoYWNra2l0X2dldF9tY3RybCwKKwkucG0JCT0gaGFja2tpdF91YXJ0X3BtLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTdGF0aWMgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGhhY2traXRfbWFwX2lvKHZvaWQpCit7CisJc2ExMTAwX21hcF9pbygpOworCWlvdGFibGVfaW5pdChoYWNra2l0X2lvX2Rlc2MsIEFSUkFZX1NJWkUoaGFja2tpdF9pb19kZXNjKSk7CisKKwlzYTExMDBfcmVnaXN0ZXJfdWFydF9mbnMoJmhhY2traXRfcG9ydF9mbnMpOworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDAsIDEpOwkvKiBjb20gcG9ydCAqLworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDEsIDIpOworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDIsIDMpOwkvKiByYWRpbyBtb2R1bGUgKi8KKworCVNlcjFTRENSMCB8PSBTRENSMF9TVVM7Cit9CisKKy8qKgorICoJaGFja2tpdF91YXJ0X3BtIC0gcG93ZXJtZ210IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBzeXN0ZW0gMyBVQVJUCisgKglAcG9ydDogdWFydCBwb3J0IHN0cnVjdHVyZQorICoJQHN0YXRlOiBwbSBzdGF0ZQorICoJQG9sZHN0YXRlOiBvbGQgcG0gc3RhdGUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGhhY2traXRfdWFydF9wbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1X2ludCBzdGF0ZSwgdV9pbnQgb2xkc3RhdGUpCit7CisJLyogVE9ETzogc3dpdGNoIG9uL29mZiB1YXJ0IGluIHBvd2Vyc2F2ZSBtb2RlICovCit9CisKKy8qCisgKiBOb3RlISB0aGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dC4KKyAqIEZJWE1FOiBObyBtb2RlbSBjdHJsIGxpbmVzIHlldC4KKyAqLworc3RhdGljIHZvaWQgaGFja2tpdF9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdV9pbnQgbWN0cmwpCit7CisjaWYgMAorCWlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIxVVRDUjApIHsKKwkJdV9pbnQgc2V0ID0gMCwgY2xlYXIgPSAwOworCisJCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJCXNldCB8PSBQVF9DVFJMMl9SUzFfUlRTOworCQllbHNlCisJCQljbGVhciB8PSBQVF9DVFJMMl9SUzFfUlRTOworCisJCWlmIChtY3RybCAmIFRJT0NNX0RUUikKKwkJCXNldCB8PSBQVF9DVFJMMl9SUzFfRFRSOworCQllbHNlCisJCQljbGVhciB8PSBQVF9DVFJMMl9SUzFfRFRSOworCisJCVBUQ1RSTDJfY2xlYXIoY2xlYXIpOworCQlQVENUUkwyX3NldChzZXQpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdV9pbnQgaGFja2tpdF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1X2ludCByZXQgPSAwOworI2lmIDAKKwl1X2ludCBpcnFzciA9IFBUX0lSUVNSOworCisJLyogbmVlZCAyIHJlYWRzIHRvIHJlYWQgY3VycmVudCB2YWx1ZSAqLworCWlycXNyID0gUFRfSVJRU1I7CisKKwkvKiBUT0RPOiBjaGVjayBJUlEgc291cmNlIHJlZ2lzdGVyIGZvciBtb2RlbS9jb20KKwkgc3RhdHVzIGxpbmVzIGFuZCBzZXQgdGhlbSBjb3JyZWN0bHkuICovCisjZW5kaWYKKworCXJldCA9IFRJT0NNX0NEIHwgVElPQ01fQ1RTIHwgVElPQ01fRFNSOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGhhY2traXRfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJCT0gIkJMT0IiLAorCQkuc2l6ZQkJPSAweDAwMDQwMDAwLAorCQkub2Zmc2V0CQk9IDB4MDAwMDAwMDAsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwgIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sIHsKKwkJLm5hbWUJCT0gImNvbmZpZyIsCisJCS5zaXplCQk9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sIHsKKwkJLm5hbWUJCT0gImtlcm5lbCIsCisJCS5zaXplCQk9IDB4MDAxMDAwMDAsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sIHsKKwkJLm5hbWUJCT0gImluaXRyZCIsCisJCS5zaXplCQk9IDB4MDAxODAwMDAsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sIHsKKwkJLm5hbWUJCT0gInJvb3RmcyIsCisJCS5zaXplCQk9IDB4NzAwMDAwLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9LCB7CisJCS5uYW1lCQk9ICJkYXRhIiwKKwkJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGhhY2traXRfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkucGFydHMJCT0gaGFja2tpdF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoaGFja2tpdF9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGFja2tpdF9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gU0ExMTAwX0NTMF9QSFlTLAorCS5lbmQJCT0gU0ExMTAwX0NTMF9QSFlTICsgU1pfMzJNLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoYWNra2l0X2luaXQodm9pZCkKK3sKKwlzYTExeDBfc2V0X2ZsYXNoX2RhdGEoJmhhY2traXRfZmxhc2hfZGF0YSwgJmhhY2traXRfZmxhc2hfcmVzb3VyY2UsIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV4cG9ydGVkIEZ1bmN0aW9ucworICovCisKK01BQ0hJTkVfU1RBUlQoSEFDS0tJVCwgIkhhY2tLaXQgQ3B1IEJvYXJkIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8oaGFja2tpdF9tYXBfaW8pCisJSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGhhY2traXRfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTkyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pcnEuYwpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgTmljb2xhcyBQaXRyZQorICoKKyAqIEdlbmVyaWMgSVJRIGhhbmRsaW5nIGZvciB0aGUgU0ExMXgwLCBHUElPIDExLTI3IElSUSBkZW11bHRpcGxleGluZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisKKy8qCisgKiBTQTExMDAgR1BJTyBlZGdlIGRldGVjdGlvbiBmb3IgSVJRczoKKyAqIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBGYWxsaW5nLUVkZ2UsIFJpc2luZy1FZGdlLCBvciBib3RoLgorICogVXNlIHRoaXMgaW5zdGVhZCBvZiBkaXJlY3RseSBzZXR0aW5nIEdSRVIvR0ZFUi4KKyAqLworc3RhdGljIGludCBHUElPX0lSUV9yaXNpbmdfZWRnZTsKK3N0YXRpYyBpbnQgR1BJT19JUlFfZmFsbGluZ19lZGdlOworc3RhdGljIGludCBHUElPX0lSUV9tYXNrID0gKDEgPDwgMTEpIC0gMTsKKworLyoKKyAqIFRvIGdldCB0aGUgR1BJTyBudW1iZXIgZnJvbSBhbiBJUlEgbnVtYmVyCisgKi8KKyNkZWZpbmUgR1BJT18xMV8yN19JUlEoaSkJKChpKSAtIDIxKQorI2RlZmluZSBHUElPMTFfMjdfTUFTSyhpcnEpCSgxIDw8IEdQSU9fMTFfMjdfSVJRKGlycSkpCisKK3N0YXRpYyBpbnQgc2ExMTAwX2dwaW9fdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCWlmIChpcnEgPD0gMTApCisJCW1hc2sgPSAxIDw8IGlycTsKKwllbHNlCisJCW1hc2sgPSBHUElPMTFfMjdfTUFTSyhpcnEpOworCisJaWYgKHR5cGUgPT0gSVJRVF9QUk9CRSkgeworCQlpZiAoKEdQSU9fSVJRX3Jpc2luZ19lZGdlIHwgR1BJT19JUlFfZmFsbGluZ19lZGdlKSAmIG1hc2spCisJCQlyZXR1cm4gMDsKKwkJdHlwZSA9IF9fSVJRVF9SSVNFREdFIHwgX19JUlFUX0ZBTEVER0U7CisJfQorCisJaWYgKHR5cGUgJiBfX0lSUVRfUklTRURHRSkgeworCQlHUElPX0lSUV9yaXNpbmdfZWRnZSB8PSBtYXNrOworCX0gZWxzZQorCQlHUElPX0lSUV9yaXNpbmdfZWRnZSAmPSB+bWFzazsKKwlpZiAodHlwZSAmIF9fSVJRVF9GQUxFREdFKSB7CisJCUdQSU9fSVJRX2ZhbGxpbmdfZWRnZSB8PSBtYXNrOworCX0gZWxzZQorCQlHUElPX0lSUV9mYWxsaW5nX2VkZ2UgJj0gfm1hc2s7CisKKwlHUkVSID0gR1BJT19JUlFfcmlzaW5nX2VkZ2UgJiBHUElPX0lSUV9tYXNrOworCUdGRVIgPSBHUElPX0lSUV9mYWxsaW5nX2VkZ2UgJiBHUElPX0lSUV9tYXNrOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHUElPIElSUXMgbXVzdCBiZSBhY2tub3dsZWRnZWQuICBUaGlzIGlzIGZvciBJUlFzIGZyb20gMCB0byAxMC4KKyAqLworc3RhdGljIHZvaWQgc2ExMTAwX2xvd19ncGlvX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQoreworCUdFRFIgPSAoMSA8PCBpcnEpOworfQorCitzdGF0aWMgdm9pZCBzYTExMDBfbG93X2dwaW9fbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCUlDTVIgJj0gfigxIDw8IGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhMTEwMF9sb3dfZ3Bpb191bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlJQ01SIHw9IDEgPDwgaXJxOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9sb3dfZ3Bpb193YWtlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBvbikKK3sKKwlpZiAob24pCisJCVBXRVIgfD0gMSA8PCBpcnE7CisJZWxzZQorCQlQV0VSICY9IH4oMSA8PCBpcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgc2ExMTAwX2xvd19ncGlvX2NoaXAgPSB7CisJLmFjawkJPSBzYTExMDBfbG93X2dwaW9fYWNrLAorCS5tYXNrCQk9IHNhMTEwMF9sb3dfZ3Bpb19tYXNrLAorCS51bm1hc2sJCT0gc2ExMTAwX2xvd19ncGlvX3VubWFzaywKKwkudHlwZQkJPSBzYTExMDBfZ3Bpb190eXBlLAorCS53YWtlCQk9IHNhMTEwMF9sb3dfZ3Bpb193YWtlLAorfTsKKworLyoKKyAqIElSUTExIChHUElPMTEgdGhyb3VnaCAyNykgaGFuZGxlci4gIFdlIGVudGVyIGhlcmUgd2l0aCB0aGUKKyAqIGlycV9jb250cm9sbGVyX2xvY2sgaGVsZCwgYW5kIElSUXMgZGlzYWJsZWQuICBEZWNvZGUgdGhlIElSUQorICogYW5kIGNhbGwgdGhlIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkCitzYTExMDBfaGlnaF9ncGlvX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwltYXNrID0gR0VEUiAmIDB4ZmZmZmY4MDA7CisJZG8geworCQkvKgorCQkgKiBjbGVhciBkb3duIGFsbCBjdXJyZW50bHkgYWN0aXZlIElSUSBzb3VyY2VzLgorCQkgKiBXZSB3aWxsIGJlIHByb2Nlc3NpbmcgdGhlbSBhbGwuCisJCSAqLworCQlHRURSID0gbWFzazsKKworCQlpcnEgPSBJUlFfR1BJTzExOworCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCW1hc2sgPj49IDExOworCQlkbyB7CisJCQlpZiAobWFzayAmIDEpCisJCQkJZGVzYy0+aGFuZGxlKGlycSwgZGVzYywgcmVncyk7CisJCQltYXNrID4+PSAxOworCQkJaXJxKys7CisJCQlkZXNjKys7CisJCX0gd2hpbGUgKG1hc2spOworCisJCW1hc2sgPSBHRURSICYgMHhmZmZmZjgwMDsKKwl9IHdoaWxlIChtYXNrKTsKK30KKworLyoKKyAqIExpa2UgR1BJTzAgdG8gMTAsIEdQSU8xMS0yNyBJUlFzIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHkuCisgKiBJbiBhZGRpdGlvbiwgdGhlIElSUXMgYXJlIGFsbCBjb2xsZWN0ZWQgdXAgaW50byBvbmUgYml0IGluIHRoZQorICogaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdm9pZCBzYTExMDBfaGlnaF9ncGlvX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gR1BJTzExXzI3X01BU0soaXJxKTsKKworCUdFRFIgPSBtYXNrOworfQorCitzdGF0aWMgdm9pZCBzYTExMDBfaGlnaF9ncGlvX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IEdQSU8xMV8yN19NQVNLKGlycSk7CisKKwlHUElPX0lSUV9tYXNrICY9IH5tYXNrOworCisJR1JFUiAmPSB+bWFzazsKKwlHRkVSICY9IH5tYXNrOworfQorCitzdGF0aWMgdm9pZCBzYTExMDBfaGlnaF9ncGlvX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gR1BJTzExXzI3X01BU0soaXJxKTsKKworCUdQSU9fSVJRX21hc2sgfD0gbWFzazsKKworCUdSRVIgPSBHUElPX0lSUV9yaXNpbmdfZWRnZSAmIEdQSU9fSVJRX21hc2s7CisJR0ZFUiA9IEdQSU9fSVJRX2ZhbGxpbmdfZWRnZSAmIEdQSU9fSVJRX21hc2s7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2hpZ2hfZ3Bpb193YWtlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBvbikKK3sKKwlpZiAob24pCisJCVBXRVIgfD0gR1BJTzExXzI3X01BU0soaXJxKTsKKwllbHNlCisJCVBXRVIgJj0gfkdQSU8xMV8yN19NQVNLKGlycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzYTExMDBfaGlnaF9ncGlvX2NoaXAgPSB7CisJLmFjawkJPSBzYTExMDBfaGlnaF9ncGlvX2FjaywKKwkubWFzawkJPSBzYTExMDBfaGlnaF9ncGlvX21hc2ssCisJLnVubWFzawkJPSBzYTExMDBfaGlnaF9ncGlvX3VubWFzaywKKwkudHlwZQkJPSBzYTExMDBfZ3Bpb190eXBlLAorCS53YWtlCQk9IHNhMTEwMF9oaWdoX2dwaW9fd2FrZSwKK307CisKKy8qCisgKiBXZSBkb24ndCBuZWVkIHRvIEFDSyBJUlFzIG9uIHRoZSBTQTExMDAgdW5sZXNzIHRoZXkncmUgR1BJT3MKKyAqIHRoaXMgaXMgZm9yIGludGVybmFsIElSUXMgaS5lLiBmcm9tIDExIHRvIDMxLgorICovCitzdGF0aWMgdm9pZCBzYTExMDBfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlJQ01SICY9IH4oMSA8PCBpcnEpOworfQorCitzdGF0aWMgdm9pZCBzYTExMDBfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCUlDTVIgfD0gKDEgPDwgaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHNhMTEwMF9ub3JtYWxfY2hpcCA9IHsKKwkuYWNrCQk9IHNhMTEwMF9tYXNrX2lycSwKKwkubWFzawkJPSBzYTExMDBfbWFza19pcnEsCisJLnVubWFzawkJPSBzYTExMDBfdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXJxX3Jlc291cmNlID0geworCS5uYW1lCT0gImlycXMiLAorCS5zdGFydAk9IDB4OTAwNTAwMDAsCisJLmVuZAk9IDB4OTAwNWZmZmYsCit9OworCitzdGF0aWMgc3RydWN0IHNhMTEwMGlycV9zdGF0ZSB7CisJdW5zaWduZWQgaW50CXNhdmVkOworCXVuc2lnbmVkIGludAlpY21yOworCXVuc2lnbmVkIGludAlpY2xyOworCXVuc2lnbmVkIGludAlpY2NyOworfSBzYTExMDBpcnFfc3RhdGU7CisKK3N0YXRpYyBpbnQgc2ExMTAwaXJxX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzYTExMDBpcnFfc3RhdGUgKnN0ID0gJnNhMTEwMGlycV9zdGF0ZTsKKworCXN0LT5zYXZlZCA9IDE7CisJc3QtPmljbXIgPSBJQ01SOworCXN0LT5pY2xyID0gSUNMUjsKKwlzdC0+aWNjciA9IElDQ1I7CisKKwkvKgorCSAqIERpc2FibGUgYWxsIEdQSU8tYmFzZWQgaW50ZXJydXB0cy4KKwkgKi8KKwlJQ01SICY9IH4oSUNfR1BJTzExXzI3fElDX0dQSU8xMHxJQ19HUElPOXxJQ19HUElPOHxJQ19HUElPN3wKKwkJICBJQ19HUElPNnxJQ19HUElPNXxJQ19HUElPNHxJQ19HUElPM3xJQ19HUElPMnwKKwkJICBJQ19HUElPMXxJQ19HUElPMCk7CisKKwkvKgorCSAqIFNldCB0aGUgYXBwcm9wcmlhdGUgZWRnZXMgZm9yIHdha2V1cC4KKwkgKi8KKwlHUkVSID0gUFdFUiAmIEdQSU9fSVJRX3Jpc2luZ19lZGdlOworCUdGRVIgPSBQV0VSICYgR1BJT19JUlFfZmFsbGluZ19lZGdlOworCQorCS8qCisJICogQ2xlYXIgYW55IHBlbmRpbmcgR1BJTyBpbnRlcnJ1cHRzLgorCSAqLworCUdFRFIgPSBHRURSOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwaXJxX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBpcnFfc3RhdGUgKnN0ID0gJnNhMTEwMGlycV9zdGF0ZTsKKworCWlmIChzdC0+c2F2ZWQpIHsKKwkJSUNDUiA9IHN0LT5pY2NyOworCQlJQ0xSID0gc3QtPmljbHI7CisKKwkJR1JFUiA9IEdQSU9fSVJRX3Jpc2luZ19lZGdlICYgR1BJT19JUlFfbWFzazsKKwkJR0ZFUiA9IEdQSU9fSVJRX2ZhbGxpbmdfZWRnZSAmIEdQSU9fSVJRX21hc2s7CisKKwkJSUNNUiA9IHN0LT5pY21yOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3Mgc2ExMTAwaXJxX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoInNhMTF4MC1pcnEiKSwKKwkuc3VzcGVuZAk9IHNhMTEwMGlycV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2ExMTAwaXJxX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBzYTExMDBpcnFfZGV2aWNlID0geworCS5pZAkJPSAwLAorCS5jbHMJCT0gJnNhMTEwMGlycV9zeXNjbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNhMTEwMGlycV9pbml0X2RldmljZWZzKHZvaWQpCit7CisJc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZzYTExMDBpcnFfc3lzY2xhc3MpOworCXJldHVybiBzeXNkZXZfcmVnaXN0ZXIoJnNhMTEwMGlycV9kZXZpY2UpOworfQorCitkZXZpY2VfaW5pdGNhbGwoc2ExMTAwaXJxX2luaXRfZGV2aWNlZnMpOworCit2b2lkIF9faW5pdCBzYTExMDBfaW5pdF9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZpcnFfcmVzb3VyY2UpOworCisJLyogZGlzYWJsZSBhbGwgSVJRcyAqLworCUlDTVIgPSAwOworCisJLyogYWxsIElSUXMgYXJlIElSUSwgbm90IEZJUSAqLworCUlDTFIgPSAwOworCisJLyogY2xlYXIgYWxsIEdQSU8gZWRnZSBkZXRlY3RzICovCisJR0ZFUiA9IDA7CisJR1JFUiA9IDA7CisJR0VEUiA9IC0xOworCisJLyoKKwkgKiBXaGF0ZXZlciB0aGUgZG9jIHNheXMsIHRoaXMgaGFzIHRvIGJlIHNldCBmb3IgdGhlIHdhaXQtb24taXJxCisJICogaW5zdHJ1Y3Rpb24gdG8gd29yay4uLiBvbiBhIFNBMTEwMCByZXYgOSBhdCBsZWFzdC4KKwkgKi8KKwlJQ0NSID0gMTsKKworCWZvciAoaXJxID0gMDsgaXJxIDw9IDEwOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmc2ExMTAwX2xvd19ncGlvX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJZm9yIChpcnEgPSAxMjsgaXJxIDw9IDMxOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmc2ExMTAwX25vcm1hbF9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworCX0KKworCWZvciAoaXJxID0gMzI7IGlycSA8PSA0ODsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJnNhMTEwMF9oaWdoX2dwaW9fY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwl9CisKKwkvKgorCSAqIEluc3RhbGwgaGFuZGxlciBmb3IgR1BJTyAxMS0yNyBlZGdlIGRldGVjdCBpbnRlcnJ1cHRzCisJICovCisJc2V0X2lycV9jaGlwKElSUV9HUElPMTFfMjcsICZzYTExMDBfbm9ybWFsX2NoaXApOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9HUElPMTFfMjcsIHNhMTEwMF9oaWdoX2dwaW9faGFuZGxlcik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlNzgyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfc2ExMTAwLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKworI2RlZmluZSBKT1JUVUNSX1ZBTAkweDIwMDAwNDAwCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2ExMTExX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CQk9IDB4NDAwMDAwMDAsCisJCS5lbmQJCT0gMHg0MDAwMWZmZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJCT0gSVJRX0dQSU8xLAorCQkuZW5kCQk9IElSUV9HUElPMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IHNhMTExMV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYTExMTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzYTExMTEiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sgPSAmc2ExMTExX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2ExMTExX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc2ExMTExX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2ExMTExX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGpvcm5hZGE3MjBfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAtRU5PREVWOworCisJaWYgKG1hY2hpbmVfaXNfam9ybmFkYTcyMCgpKSB7CisJCUdQRFIgfD0gR1BJT19HUElPMjA7CisJCVRVQ1IgPSBKT1JUVUNSX1ZBTDsJLyogc2V0IHRoZSBvc2NpbGxhdG9yIG91dCB0byB0aGUgU0EtMTEwMSAqLworCisJCUdQU1IgPSBHUElPX0dQSU8yMDsKKwkJdWRlbGF5KDEpOworCQlHUENSID0gR1BJT19HUElPMjA7CisJCXVkZWxheSgxKTsKKwkJR1BTUiA9IEdQSU9fR1BJTzIwOworCQl1ZGVsYXkoMjApOworCisJCS8qIExERDQgaXMgc3BlYWtlciwgTEREMyBpcyBtaWNyb3Bob25lICovCisJCVBQU1IgJj0gfihQUENfTEREMyB8IFBQQ19MREQ0KTsKKwkJUFBEUiB8PSBQUENfTEREMyB8IFBQQ19MREQ0OworCisJCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCX0KKwlyZXR1cm4gcmV0OworfQorCithcmNoX2luaXRjYWxsKGpvcm5hZGE3MjBfaW5pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgam9ybmFkYTcyMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICBsZW5ndGggICAgICB0eXBlICovCisgIHsgMHhmMDAwMDAwMCwgMHg0ODAwMDAwMCwgMHgwMDEwMDAwMCwgTVRfREVWSUNFIH0sIC8qIEVwc29uIHJlZ2lzdGVycyAqLworICB7IDB4ZjEwMDAwMDAsIDB4NDgyMDAwMDAsIDB4MDAxMDAwMDAsIE1UX0RFVklDRSB9LCAvKiBFcHNvbiBmcmFtZSBidWZmZXIgKi8KKyAgeyAweGY0MDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMTAwMDAwLCBNVF9ERVZJQ0UgfSAgLyogU0EtMTExMSAqLworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGpvcm5hZGE3MjBfbWFwX2lvKHZvaWQpCit7CisJc2ExMTAwX21hcF9pbygpOworCWlvdGFibGVfaW5pdChqb3JuYWRhNzIwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoam9ybmFkYTcyMF9pb19kZXNjKSk7CisJCisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMCwgMyk7CisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMSwgMSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoSk9STkFEQTcyMCwgIkhQIEpvcm5hZGEgNzIwIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8oam9ybmFkYTcyMF9tYXBfaW8pCisJSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzA4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2xhcnQuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9zYTExMDAuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworCisjd2FybmluZyAiaW5jbHVkZS9hc20vYXJjaC1zYTExMDAvaWRlLmggbmVlZHMgZml4aW5nIGZvciBsYXJ0IgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGxhcnRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgLyogdmlydHVhbCAgICAgcGh5c2ljYWwgICAgbGVuZ3RoICAgICAgdHlwZSAqLworICB7IDB4ZTgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDA0MDAwMDAsIE1UX0RFVklDRSB9LCAvKiBtYWluIGZsYXNoIG1lbW9yeSAqLworICB7IDB4ZWMwMDAwMDAsIDB4MDgwMDAwMDAsIDB4MDA0MDAwMDAsIE1UX0RFVklDRSB9ICAvKiBtYWluIGZsYXNoLCBhbHRlcm5hdGl2ZSBsb2NhdGlvbiAqLworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGxhcnRfbWFwX2lvKHZvaWQpCit7CisJc2ExMTAwX21hcF9pbygpOworCWlvdGFibGVfaW5pdChsYXJ0X2lvX2Rlc2MsIEFSUkFZX1NJWkUobGFydF9pb19kZXNjKSk7CisKKwlzYTExMDBfcmVnaXN0ZXJfdWFydCgwLCAzKTsKKwlzYTExMDBfcmVnaXN0ZXJfdWFydCgxLCAxKTsKKwlzYTExMDBfcmVnaXN0ZXJfdWFydCgyLCAyKTsKKworCUdBRlIgfD0gKEdQSU9fVUFSVF9UWEQgfCBHUElPX1VBUlRfUlhEKTsKKwlHUERSIHw9IEdQSU9fVUFSVF9UWEQ7CisJR1BEUiAmPSB+R1BJT19VQVJUX1JYRDsKKwlQUEFSIHw9IFBQQVJfVVBSOworfQorCitNQUNISU5FX1NUQVJUKExBUlQsICJMQVJUIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8obGFydF9tYXBfaW8pCisJSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1hc3NhYmV0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLWFzc2FiZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWFhOWRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1hc3NhYmV0LmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLWFzc2FiZXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBKb2huIERvcnNleSA8am9obitAY3MuY211LmVkdT4KKyAqCisgKiBPcmlnaW5hbCAobGVkcy1mb290YnJpZGdlLmMpIGJ5IFJ1c3NlbGwgS2luZworICoKKyAqIEFzc2FiZXQgdXNlcyB0aGUgTEVEcyBhcyBmb2xsb3dzOgorICogICAtIEdyZWVuIC0gdG9nZ2xlcyBzdGF0ZSBldmVyeSA1MCB0aW1lciBpbnRlcnJ1cHRzCisgKiAgIC0gUmVkICAgLSBvbiBpZiBzeXN0ZW0gaXMgbm90IGlkbGUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Fzc2FiZXQuaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworCisjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECTEKKyNkZWZpbmUgTEVEX1NUQVRFX0NMQUlNRUQJMgorCitzdGF0aWMgdW5zaWduZWQgaW50IGxlZF9zdGF0ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdfbGVkX3N0YXRlOworCisjZGVmaW5lIEFTU0FCRVRfQkNSX0xFRF9NQVNLCShBU1NBQkVUX0JDUl9MRURfR1JFRU4gfCBBU1NBQkVUX0JDUl9MRURfUkVEKQorCit2b2lkIGFzc2FiZXRfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXN3aXRjaCAoZXZ0KSB7CisJY2FzZSBsZWRfc3RhcnQ6CisJCWh3X2xlZF9zdGF0ZSA9IEFTU0FCRVRfQkNSX0xFRF9SRUQgfCBBU1NBQkVUX0JDUl9MRURfR1JFRU47CisJCWxlZF9zdGF0ZSA9IExFRF9TVEFURV9FTkFCTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX3N0b3A6CisJCWxlZF9zdGF0ZSAmPSB+TEVEX1NUQVRFX0VOQUJMRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IEFTU0FCRVRfQkNSX0xFRF9SRUQgfCBBU1NBQkVUX0JDUl9MRURfR1JFRU47CisJCUFTU0FCRVRfQkNSX2Zyb2IoQVNTQUJFVF9CQ1JfTEVEX01BU0ssIGh3X2xlZF9zdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBsZWRfY2xhaW06CisJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gQVNTQUJFVF9CQ1JfTEVEX1JFRCB8IEFTU0FCRVRfQkNSX0xFRF9HUkVFTjsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWxlYXNlOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSBBU1NBQkVUX0JDUl9MRURfUkVEIHwgQVNTQUJFVF9CQ1JfTEVEX0dSRUVOOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19MRURTX1RJTUVSCisJY2FzZSBsZWRfdGltZXI6CisJCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKwkJCWh3X2xlZF9zdGF0ZSBePSBBU1NBQkVUX0JDUl9MRURfR1JFRU47CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgfD0gQVNTQUJFVF9CQ1JfTEVEX1JFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlICY9IH5BU1NBQkVUX0JDUl9MRURfUkVEOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBsZWRfaGFsdGVkOgorCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfkFTU0FCRVRfQkNSX0xFRF9HUkVFTjsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9ncmVlbl9vZmY6CisJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCWh3X2xlZF9zdGF0ZSB8PSBBU1NBQkVUX0JDUl9MRURfR1JFRU47CisJCWJyZWFrOworCisJY2FzZSBsZWRfYW1iZXJfb246CisJCWJyZWFrOworCisJY2FzZSBsZWRfYW1iZXJfb2ZmOgorCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH5BU1NBQkVUX0JDUl9MRURfUkVEOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vZmY6CisJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCWh3X2xlZF9zdGF0ZSB8PSBBU1NBQkVUX0JDUl9MRURfUkVEOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmICAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpCisJCUFTU0FCRVRfQkNSX2Zyb2IoQVNTQUJFVF9CQ1JfTEVEX01BU0ssIGh3X2xlZF9zdGF0ZSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLWJhZGdlNC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1iYWRnZTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYThmODdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1iYWRnZTQuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtYmFkZ2U0LmMKKyAqCisgKiBBdXRob3I6IENocmlzdG9waGVyIEhvb3ZlciA8Y2hAaHBsLmhwLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKKworc3RhdGljIHVuc2lnbmVkIGludCBsZWRfc3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2xlZF9zdGF0ZTsKKworI2RlZmluZSBMRURfUkVECQlHUElPX0dQSU8oNykKKyNkZWZpbmUgTEVEX0dSRUVOICAgICAgIEdQSU9fR1BJTyg5KQorI2RlZmluZSBMRURfTUFTSwkoTEVEX1JFRHxMRURfR1JFRU4pCisKKyNkZWZpbmUgTEVEX0lETEUJTEVEX0dSRUVOCisjZGVmaW5lIExFRF9USU1FUglMRURfUkVECisKK3ZvaWQgYmFkZ2U0X2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisgICAgICAgIHN3aXRjaCAoZXZ0KSB7CisgICAgICAgIGNhc2UgbGVkX3N0YXJ0OgorCQlHUERSIHw9IExFRF9NQVNLOworICAgICAgICAgICAgICAgIGh3X2xlZF9zdGF0ZSA9IExFRF9NQVNLOworICAgICAgICAgICAgICAgIGxlZF9zdGF0ZSA9IExFRF9TVEFURV9FTkFCTEVEOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGVkX3N0b3A6CisgICAgICAgICAgICAgICAgbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxlZF9jbGFpbToKKyAgICAgICAgICAgICAgICBsZWRfc3RhdGUgfD0gTEVEX1NUQVRFX0NMQUlNRUQ7CisgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlID0gTEVEX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsZWRfcmVsZWFzZToKKyAgICAgICAgICAgICAgICBsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9DTEFJTUVEOworICAgICAgICAgICAgICAgIGh3X2xlZF9zdGF0ZSA9IExFRF9NQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKKyAgICAgICAgY2FzZSBsZWRfdGltZXI6CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlIF49IExFRF9USU1FUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xFRFNfQ1BVCisgICAgICAgIGNhc2UgbGVkX2lkbGVfc3RhcnQ6CisJCS8qIExFRCBvZmYgd2hlbiBzeXN0ZW0gaXMgaWRsZSAqLworICAgICAgICAgICAgICAgIGlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3X2xlZF9zdGF0ZSAmPSB+TEVEX0lETEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsZWRfaWRsZV9lbmQ6CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlIHw9IExFRF9JRExFOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgY2FzZSBsZWRfcmVkX29uOgorICAgICAgICAgICAgICAgIGlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3X2xlZF9zdGF0ZSAmPSB+TEVEX1JFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxlZF9yZWRfb2ZmOgorICAgICAgICAgICAgICAgIGlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3X2xlZF9zdGF0ZSB8PSBMRURfUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGVkX2dyZWVuX29uOgorICAgICAgICAgICAgICAgIGlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3X2xlZF9zdGF0ZSAmPSB+TEVEX0dSRUVOOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGVkX2dyZWVuX29mZjoKKyAgICAgICAgICAgICAgICBpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisgICAgICAgICAgICAgICAgICAgICAgICBod19sZWRfc3RhdGUgfD0gTEVEX0dSRUVOOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgR1BTUiA9IGh3X2xlZF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBHUENSID0gaHdfbGVkX3N0YXRlIF4gTEVEX01BU0s7CisgICAgICAgIH0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtY2VyZi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1jZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2MzVhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtY2VyZi5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1jZXJmLmMKKyAqCisgKiBBdXRob3I6ID8/PworICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJsZWRzLmgiCisKKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKKworc3RhdGljIHVuc2lnbmVkIGludCBsZWRfc3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2xlZF9zdGF0ZTsKKworI2RlZmluZSBMRURfRDAgICAgICAgICAgR1BJT19HUElPKDApCisjZGVmaW5lIExFRF9EMSAgICAgICAgICBHUElPX0dQSU8oMSkKKyNkZWZpbmUgTEVEX0QyICAgICAgICAgIEdQSU9fR1BJTygyKQorI2RlZmluZSBMRURfRDMgICAgICAgICAgR1BJT19HUElPKDMpCisjZGVmaW5lIExFRF9NQVNLICAgICAgICAoTEVEX0QwfExFRF9EMXxMRURfRDJ8TEVEX0QzKQorCit2b2lkIGNlcmZfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKyAgICAgICAgc3dpdGNoIChldnQpIHsKKyAgICAgICAgY2FzZSBsZWRfc3RhcnQ6CisgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlID0gTEVEX01BU0s7CisgICAgICAgICAgICAgICAgbGVkX3N0YXRlID0gTEVEX1NUQVRFX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsZWRfc3RvcDoKKyAgICAgICAgICAgICAgICBsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9FTkFCTEVEOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGVkX2NsYWltOgorICAgICAgICAgICAgICAgIGxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfQ0xBSU1FRDsKKyAgICAgICAgICAgICAgICBod19sZWRfc3RhdGUgPSBMRURfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsZWRfcmVsZWFzZToKKyAgICAgICAgICAgICAgICBsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9DTEFJTUVEOworICAgICAgICAgICAgICAgIGh3X2xlZF9zdGF0ZSA9IExFRF9NQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKKyAgICAgICAgY2FzZSBsZWRfdGltZXI6CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlIF49IExFRF9EMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xFRFNfQ1BVCisgICAgICAgIGNhc2UgbGVkX2lkbGVfc3RhcnQ6CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlICY9IH5MRURfRDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsZWRfaWRsZV9lbmQ6CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlIHw9IExFRF9EMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIGxlZF9ncmVlbl9vbjoKKyAgICAgICAgICAgICAgICBpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisgICAgICAgICAgICAgICAgICAgICAgICBod19sZWRfc3RhdGUgJj0gfkxFRF9EMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxlZF9ncmVlbl9vZmY6CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlIHw9IExFRF9EMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxlZF9hbWJlcl9vbjoKKyAgICAgICAgICAgICAgICBpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisgICAgICAgICAgICAgICAgICAgICAgICBod19sZWRfc3RhdGUgJj0gfkxFRF9EMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxlZF9hbWJlcl9vZmY6CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlIHw9IExFRF9EMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxlZF9yZWRfb246CisgICAgICAgICAgICAgICAgaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaHdfbGVkX3N0YXRlICY9IH5MRURfRDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsZWRfcmVkX29mZjoKKyAgICAgICAgICAgICAgICBpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisgICAgICAgICAgICAgICAgICAgICAgICBod19sZWRfc3RhdGUgfD0gTEVEX0QxOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgR1BTUiA9IGh3X2xlZF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBHUENSID0gaHdfbGVkX3N0YXRlIF4gTEVEX01BU0s7CisgICAgICAgIH0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtaGFja2tpdC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1oYWNra2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ZmExNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtaGFja2tpdC5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1oYWNra2l0LmMKKyAqCisgKiBiYXNlZCBvbiBsZWRzLWxhcnQuYworICoKKyAqIChDKSBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpLCBBcHJpbCAyMSwgMjAwMAorICogKEMpIFN0ZWZhbiBFbGV0emhvZmVyIDxzdGVmYW4uZWxldHpob2ZlckBlbGV0enRyaWNrLmRlPiwgMjAwMgorICoKKyAqIFRoZSBIYWNrS2l0IGhhcyB0d28gbGVkcyAoR1BJTyAyMi8yMykuIFRoZSByZWQgbGVkIChncGlvIDIyKSBpcyB1c2VkCisgKiBhcyBjcHUgbGVkLCB0aGUgZ3JlZW4gb25lIGlzIHVzZWQgYXMgdGltZXIgbGVkLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJsZWRzLmgiCisKKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKKworc3RhdGljIHVuc2lnbmVkIGludCBsZWRfc3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2xlZF9zdGF0ZTsKKworI2RlZmluZSBMRURfR1JFRU4gICAgR1BJT19HUElPMjMKKyNkZWZpbmUgTEVEX1JFRCAgICBHUElPX0dQSU8yMgorI2RlZmluZSBMRURfTUFTSyAgKExFRF9SRUQgfCBMRURfR1JFRU4pCisKK3ZvaWQgaGFja2tpdF9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3dpdGNoKGV2dCkgeworCQljYXNlIGxlZF9zdGFydDoKKwkJCS8qIHBpbiAyMi8yMyBhcmUgb3V0cHV0cyAqLworCQkJR1BEUiB8PSBMRURfTUFTSzsKKwkJCWh3X2xlZF9zdGF0ZSA9IExFRF9NQVNLOworCQkJbGVkX3N0YXRlID0gTEVEX1NUQVRFX0VOQUJMRUQ7CisJCQlicmVhazsKKworCQljYXNlIGxlZF9zdG9wOgorCQkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgbGVkX2NsYWltOgorCQkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9DTEFJTUVEOworCQkJaHdfbGVkX3N0YXRlID0gTEVEX01BU0s7CisJCQlicmVhazsKKworCQljYXNlIGxlZF9yZWxlYXNlOgorCQkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKKwkJCWh3X2xlZF9zdGF0ZSA9IExFRF9NQVNLOworCQkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfTEVEU19USU1FUgorCQljYXNlIGxlZF90aW1lcjoKKwkJCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKwkJCQlod19sZWRfc3RhdGUgXj0gTEVEX0dSRUVOOworCQkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19MRURTX0NQVQorCQljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQkJLyogVGhlIExBUlQgcGVvcGxlIGxpa2UgdGhlIExFRCB0byBiZSBvZmYgd2hlbiB0aGUKKwkJCSAgIHN5c3RlbSBpcyBpZGxlLi4uICovCisJCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQkJaHdfbGVkX3N0YXRlICY9IH5MRURfUkVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBsZWRfaWRsZV9lbmQ6CisJCQkvKiAuLi4gYW5kIG9uIGlmIHRoZSBzeXN0ZW0gaXMgbm90IGlkbGUgKi8KKwkJCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKwkJCQlod19sZWRfc3RhdGUgfD0gTEVEX1JFRDsKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJY2FzZSBsZWRfcmVkX29uOgorCQkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJCWh3X2xlZF9zdGF0ZSAmPSB+TEVEX1JFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgbGVkX3JlZF9vZmY6CisJCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQkJaHdfbGVkX3N0YXRlIHw9IExFRF9SRUQ7CisJCQlicmVhazsKKworCQljYXNlIGxlZF9ncmVlbl9vbjoKKwkJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCQlod19sZWRfc3RhdGUgJj0gfkxFRF9HUkVFTjsKKwkJCWJyZWFrOworCisJCWNhc2UgbGVkX2dyZWVuX29mZjoKKwkJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCQlod19sZWRfc3RhdGUgfD0gTEVEX0dSRUVOOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCS8qIE5vdyBzZXQgdGhlIEdQSU8gc3RhdGUsIG9yIG5vdGhpbmcgd2lsbCBoYXBwZW4gYXQgYWxsICovCisJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKSB7CisJCUdQU1IgPSBod19sZWRfc3RhdGU7CisJCUdQQ1IgPSBod19sZWRfc3RhdGUgXiBMRURfTUFTSzsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLWxhcnQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtbGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzUwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLWxhcnQuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtbGFydC5jCisgKgorICogKEMpIEVyaWsgTW91dyAoSi5BLksuTW91d0BpdHMudHVkZWxmdC5ubCksIEFwcmlsIDIxLCAyMDAwCisgKgorICogTEFSVCB1c2VzIHRoZSBMRUQgYXMgZm9sbG93czoKKyAqICAgLSBHUElPMjMgaXMgdGhlIExFRCwgb24gaWYgc3lzdGVtIGlzIG5vdCBpZGxlCisgKiAgWW91IGNhbiB1c2UgYm90aCBDT05GSUdfTEVEU19DUFUgYW5kIENPTkZJR19MRURTX1RJTUVSIGF0IHRoZSBzYW1lCisgKiAgdGltZSwgYnV0IGluIHRoYXQgY2FzZSB0aGUgdGltZXIgZXZlbnRzIHdpbGwgc3RpbGwgZGljdGF0ZSB0aGUKKyAqICBwYWNlIG9mIHRoZSBMRUQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImxlZHMuaCIKKworCisjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECTEKKyNkZWZpbmUgTEVEX1NUQVRFX0NMQUlNRUQJMgorCitzdGF0aWMgdW5zaWduZWQgaW50IGxlZF9zdGF0ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdfbGVkX3N0YXRlOworCisjZGVmaW5lIExFRF8yMyAgICBHUElPX0dQSU8yMworI2RlZmluZSBMRURfTUFTSyAgKExFRF8yMykKKwordm9pZCBsYXJ0X2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzd2l0Y2goZXZ0KSB7CisJY2FzZSBsZWRfc3RhcnQ6CisJCS8qIHBpbiAyMyBpcyBvdXRwdXQgcGluICovCisJCUdQRFIgfD0gTEVEXzIzOworCQlod19sZWRfc3RhdGUgPSBMRURfTUFTSzsKKwkJbGVkX3N0YXRlID0gTEVEX1NUQVRFX0VOQUJMRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfc3RvcDoKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9jbGFpbToKKwkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSBMRURfTUFTSzsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWxlYXNlOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSBMRURfTUFTSzsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfTEVEU19USU1FUgorCWNhc2UgbGVkX3RpbWVyOgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgXj0gTEVEXzIzOworCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xFRFNfQ1BVCisJY2FzZSBsZWRfaWRsZV9zdGFydDoKKwkJLyogVGhlIExBUlQgcGVvcGxlIGxpa2UgdGhlIExFRCB0byBiZSBvZmYgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICBzeXN0ZW0gaXMgaWRsZS4uLiAqLworCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgJj0gfkxFRF8yMzsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJLyogLi4uIGFuZCBvbiBpZiB0aGUgc3lzdGVtIGlzIG5vdCBpZGxlICovCisJCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKwkJCWh3X2xlZF9zdGF0ZSB8PSBMRURfMjM7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIGxlZF9yZWRfb246CisJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCWh3X2xlZF9zdGF0ZSAmPSB+TEVEXzIzOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vZmY6CisJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCWh3X2xlZF9zdGF0ZSB8PSBMRURfMjM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogTm93IHNldCB0aGUgR1BJTyBzdGF0ZSwgb3Igbm90aGluZyB3aWxsIGhhcHBlbiBhdCBhbGwgKi8KKwlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpIHsKKwkJR1BTUiA9IGh3X2xlZF9zdGF0ZTsKKwkJR1BDUiA9IGh3X2xlZF9zdGF0ZSBeIExFRF9NQVNLOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMtc2ltcGFkLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLXNpbXBhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjdhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLXNpbXBhZC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy1zaW1wYWQuYworICoKKyAqIEF1dGhvcjogSnVlcmdlbiBNZXNzZXJlciA8anVlcmdlbi5tZXNzZXJlckBzaWVtZW5zLmNoPgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc2ltcGFkLmg+CisKKyNpbmNsdWRlICJsZWRzLmgiCisKKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKKworc3RhdGljIHVuc2lnbmVkIGludCBsZWRfc3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2xlZF9zdGF0ZTsKKworI2RlZmluZQlMRURfR1JFRU4JKDEpCisjZGVmaW5lCUxFRF9NQVNLCSgxKQorCitleHRlcm4gdm9pZCBzZXRfY3MzX2JpdChpbnQgdmFsdWUpOworZXh0ZXJuIHZvaWQgY2xlYXJfY3MzX2JpdChpbnQgdmFsdWUpOyAgICAgCisKK3ZvaWQgc2ltcGFkX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KQoreworCXN3aXRjaCAoZXZ0KQorCXsKKwljYXNlIGxlZF9zdGFydDoKKwkgICAgICAgIGh3X2xlZF9zdGF0ZSA9IExFRF9HUkVFTjsKKwkJbGVkX3N0YXRlID0gTEVEX1NUQVRFX0VOQUJMRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfc3RvcDoKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9jbGFpbToKKwkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSBMRURfR1JFRU47CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVsZWFzZToKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gTEVEX0dSRUVOOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19MRURTX1RJTUVSCisJY2FzZSBsZWRfdGltZXI6CisJCWlmICghKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKSkKKwkJCWh3X2xlZF9zdGF0ZSBePSBMRURfR1JFRU47CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlicmVhazsKKworCWNhc2UgbGVkX2lkbGVfZW5kOgorCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBsZWRfaGFsdGVkOgorCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgfD0gTEVEX0dSRUVOOworCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH5MRURfR1JFRU47CisJCWJyZWFrOworCisJY2FzZSBsZWRfYW1iZXJfb246CisJCWJyZWFrOworCisJY2FzZSBsZWRfYW1iZXJfb2ZmOgorCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vbjoKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWRfb2ZmOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmICAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpCisJCXNldF9jczNfYml0KExFRDJfT04pOworCWVsc2UgCisJICAgICAgICBjbGVhcl9jczNfYml0KExFRDJfT04pOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmN2M1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGVkcy5jCisgKgorICogU0ExMTAwIExFRHMgZGlzcGF0Y2hlcgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTmljb2xhcyBQaXRyZQorICovCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlICJsZWRzLmgiCisKK3N0YXRpYyBpbnQgX19pbml0CitzYTExMDBfbGVkc19pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfYXNzYWJldCgpKQorCQlsZWRzX2V2ZW50ID0gYXNzYWJldF9sZWRzX2V2ZW50OworIAlpZiAobWFjaGluZV9pc19jb25zdXMoKSkKKyAJICAgICAgICBsZWRzX2V2ZW50ID0gY29uc3VzX2xlZHNfZXZlbnQ7CisJaWYgKG1hY2hpbmVfaXNfYmFkZ2U0KCkpCisJICAJbGVkc19ldmVudCA9IGJhZGdlNF9sZWRzX2V2ZW50OworCWlmIChtYWNoaW5lX2lzX2JydXR1cygpKQorCQlsZWRzX2V2ZW50ID0gYnJ1dHVzX2xlZHNfZXZlbnQ7CisJaWYgKG1hY2hpbmVfaXNfY2VyZigpKQorCQlsZWRzX2V2ZW50ID0gY2VyZl9sZWRzX2V2ZW50OworCWlmIChtYWNoaW5lX2lzX2ZsZXhhbmV0KCkpCisJCWxlZHNfZXZlbnQgPSBmbGV4YW5ldF9sZWRzX2V2ZW50OworCWlmIChtYWNoaW5lX2lzX2dyYXBoaWNzY2xpZW50KCkpCisJCWxlZHNfZXZlbnQgPSBncmFwaGljc2NsaWVudF9sZWRzX2V2ZW50OworCWlmIChtYWNoaW5lX2lzX2hhY2traXQoKSkKKwkJbGVkc19ldmVudCA9IGhhY2traXRfbGVkc19ldmVudDsKKwlpZiAobWFjaGluZV9pc19sYXJ0KCkpCisJCWxlZHNfZXZlbnQgPSBsYXJ0X2xlZHNfZXZlbnQ7CisJaWYgKG1hY2hpbmVfaXNfcGZzMTY4KCkpCisJCWxlZHNfZXZlbnQgPSBwZnMxNjhfbGVkc19ldmVudDsKKwlpZiAobWFjaGluZV9pc19ncmFwaGljc21hc3RlcigpKQorCQlsZWRzX2V2ZW50ID0gZ3JhcGhpY3NtYXN0ZXJfbGVkc19ldmVudDsKKwlpZiAobWFjaGluZV9pc19hZHNiaXRzeSgpKQorCQlsZWRzX2V2ZW50ID0gYWRzYml0c3lfbGVkc19ldmVudDsKKwlpZiAobWFjaGluZV9pc19wdF9zeXN0ZW0zKCkpCisJCWxlZHNfZXZlbnQgPSBzeXN0ZW0zX2xlZHNfZXZlbnQ7CisJaWYgKG1hY2hpbmVfaXNfc2ltcGFkKCkpCisJCWxlZHNfZXZlbnQgPSBzaW1wYWRfbGVkc19ldmVudDsgLyogd2hhdCBhYm91dCBtYWNoaW5lIHJlZ2lzdHJ5PyBpbmNsdWRpbmcgbGVkLCBhcG0uLi4gLXplY2tlICovCisKKwlsZWRzX2V2ZW50KGxlZF9zdGFydCk7CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwoc2ExMTAwX2xlZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLmggYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sZWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjYzlmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xlZHMuaApAQCAtMCwwICsxLDE0IEBACitleHRlcm4gdm9pZCBhc3NhYmV0X2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KTsKK2V4dGVybiB2b2lkIGJhZGdlNF9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBjb25zdXNfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpOworZXh0ZXJuIHZvaWQgYnJ1dHVzX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KTsKK2V4dGVybiB2b2lkIGNlcmZfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpOworZXh0ZXJuIHZvaWQgZmxleGFuZXRfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpOworZXh0ZXJuIHZvaWQgZ3JhcGhpY3NjbGllbnRfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpOworZXh0ZXJuIHZvaWQgaGFja2tpdF9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBsYXJ0X2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KTsKK2V4dGVybiB2b2lkIHBmczE2OF9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBncmFwaGljc21hc3Rlcl9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBhZHNiaXRzeV9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CitleHRlcm4gdm9pZCBzeXN0ZW0zX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KTsKK2V4dGVybiB2b2lkIHNpbXBhZF9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGV2dCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9uZXBvbnNldC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmVwb25zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDA1MzgzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmVwb25zZXQuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL25lcG9uc2V0LmMKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfc2ExMTAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXNzYWJldC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL25lcG9uc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NhMTExMS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisvKgorICogSW5zdGFsbCBoYW5kbGVyIGZvciBOZXBvbnNldCBJUlEuICBOb3RlIHRoYXQgd2UgaGF2ZSB0byBsb29wIGhlcmUKKyAqIHNpbmNlIHRoZSBFVEhFUk5FVCBhbmQgVVNBUiBJUlFzIGFyZSBsZXZlbCBiYXNlZCwgYW5kIHdlIG5lZWQgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBJUlEgc2lnbmFsIGlzIGRlYXNzZXJ0ZWQgYmVmb3JlIHJldHVybmluZy4gIFRoaXMKKyAqIGlzIHJhdGhlciB1bmZvcnR1bmF0ZS4KKyAqLworc3RhdGljIHZvaWQKK25lcG9uc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgaXJyOworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGlycWRlc2MgKmQ7CisKKwkJLyoKKwkJICogQWNrbm93bGVkZ2UgdGhlIHBhcmVudCBJUlEuCisJCSAqLworCQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKKworCQkvKgorCQkgKiBSZWFkIHRoZSBpbnRlcnJ1cHQgcmVhc29uIHJlZ2lzdGVyLiAgTGV0J3MgaGF2ZSBhbGwKKwkJICogYWN0aXZlIElSUSBiaXRzIGhpZ2guICBOb3RlOiB0aGVyZSBpcyBhIHR5cG8gaW4gdGhlCisJCSAqIE5lcG9uc2V0IHVzZXIncyBndWlkZSBmb3IgdGhlIFNBMTExMSBJUlIgbGV2ZWwuCisJCSAqLworCQlpcnIgPSBJUlIgXiAoSVJSX0VUSEVSTkVUIHwgSVJSX1VTQVIpOworCisJCWlmICgoaXJyICYgKElSUl9FVEhFUk5FVCB8IElSUl9VU0FSIHwgSVJSX1NBMTExMSkpID09IDApCisJCQlicmVhazsKKworCQkvKgorCQkgKiBTaW5jZSB0aGVyZSBpcyBubyBpbmRpdmlkdWFsIG1hc2ssIHdlIGhhdmUgdG8KKwkJICogbWFzayB0aGUgcGFyZW50IElSUS4gIFRoaXMgaXMgc2FmZSwgc2luY2Ugd2UnbGwKKwkJICogcmVjaGVjayB0aGUgcmVnaXN0ZXIgZm9yIGFueSBwZW5kaW5nIElSUXMuCisJCSAqLworCQlpZiAoaXJyICYgKElSUl9FVEhFUk5FVCB8IElSUl9VU0FSKSkgeworCQkJZGVzYy0+Y2hpcC0+bWFzayhpcnEpOworCisJCQlpZiAoaXJyICYgSVJSX0VUSEVSTkVUKSB7CisJCQkJZCA9IGlycV9kZXNjICsgSVJRX05FUE9OU0VUX1NNQzkxOTY7CisJCQkJZC0+aGFuZGxlKElSUV9ORVBPTlNFVF9TTUM5MTk2LCBkLCByZWdzKTsKKwkJCX0KKworCQkJaWYgKGlyciAmIElSUl9VU0FSKSB7CisJCQkJZCA9IGlycV9kZXNjICsgSVJRX05FUE9OU0VUX1VTQVI7CisJCQkJZC0+aGFuZGxlKElSUV9ORVBPTlNFVF9VU0FSLCBkLCByZWdzKTsKKwkJCX0KKworCQkJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CisJCX0KKworCQlpZiAoaXJyICYgSVJSX1NBMTExMSkgeworCQkJZCA9IGlycV9kZXNjICsgSVJRX05FUE9OU0VUX1NBMTExMTsKKwkJCWQtPmhhbmRsZShJUlFfTkVQT05TRVRfU0ExMTExLCBkLCByZWdzKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbmVwb25zZXRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVfaW50IG1jdHJsKQoreworCXVfaW50IG1kbV9jdGwwID0gTURNX0NUTF8wOworCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gX1NlcjFVVENSMCkgeworCQlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCisJCQltZG1fY3RsMCAmPSB+TURNX0NUTDBfUlRTMjsKKwkJZWxzZQorCQkJbWRtX2N0bDAgfD0gTURNX0NUTDBfUlRTMjsKKworCQlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCisJCQltZG1fY3RsMCAmPSB+TURNX0NUTDBfRFRSMjsKKwkJZWxzZQorCQkJbWRtX2N0bDAgfD0gTURNX0NUTDBfRFRSMjsKKwl9IGVsc2UgaWYgKHBvcnQtPm1hcGJhc2UgPT0gX1NlcjNVVENSMCkgeworCQlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCisJCQltZG1fY3RsMCAmPSB+TURNX0NUTDBfUlRTMTsKKwkJZWxzZQorCQkJbWRtX2N0bDAgfD0gTURNX0NUTDBfUlRTMTsKKworCQlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCisJCQltZG1fY3RsMCAmPSB+TURNX0NUTDBfRFRSMTsKKwkJZWxzZQorCQkJbWRtX2N0bDAgfD0gTURNX0NUTDBfRFRSMTsKKwl9CisKKwlNRE1fQ1RMXzAgPSBtZG1fY3RsMDsKK30KKworc3RhdGljIHVfaW50IG5lcG9uc2V0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVfaW50IHJldCA9IFRJT0NNX0NEIHwgVElPQ01fQ1RTIHwgVElPQ01fRFNSOworCXVfaW50IG1kbV9jdGwxID0gTURNX0NUTF8xOworCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gX1NlcjFVVENSMCkgeworCQlpZiAobWRtX2N0bDEgJiBNRE1fQ1RMMV9EQ0QyKQorCQkJcmV0ICY9IH5USU9DTV9DRDsKKwkJaWYgKG1kbV9jdGwxICYgTURNX0NUTDFfQ1RTMikKKwkJCXJldCAmPSB+VElPQ01fQ1RTOworCQlpZiAobWRtX2N0bDEgJiBNRE1fQ1RMMV9EU1IyKQorCQkJcmV0ICY9IH5USU9DTV9EU1I7CisJfSBlbHNlIGlmIChwb3J0LT5tYXBiYXNlID09IF9TZXIzVVRDUjApIHsKKwkJaWYgKG1kbV9jdGwxICYgTURNX0NUTDFfRENEMSkKKwkJCXJldCAmPSB+VElPQ01fQ0Q7CisJCWlmIChtZG1fY3RsMSAmIE1ETV9DVEwxX0NUUzEpCisJCQlyZXQgJj0gflRJT0NNX0NUUzsKKwkJaWYgKG1kbV9jdGwxICYgTURNX0NUTDFfRFNSMSkKKwkJCXJldCAmPSB+VElPQ01fRFNSOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2ExMTAwX3BvcnRfZm5zIG5lcG9uc2V0X3BvcnRfZm5zIF9faW5pdGRhdGEgPSB7CisJLnNldF9tY3RybAk9IG5lcG9uc2V0X3NldF9tY3RybCwKKwkuZ2V0X21jdHJsCT0gbmVwb25zZXRfZ2V0X21jdHJsLAorfTsKKworc3RhdGljIGludCBuZXBvbnNldF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc2ExMTAwX3JlZ2lzdGVyX3VhcnRfZm5zKCZuZXBvbnNldF9wb3J0X2Zucyk7CisKKwkvKgorCSAqIEluc3RhbGwgaGFuZGxlciBmb3IgR1BJTzI1LgorCSAqLworCXNldF9pcnFfdHlwZShJUlFfR1BJTzI1LCBJUlFUX1JJU0lORyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU8yNSwgbmVwb25zZXRfaXJxX2hhbmRsZXIpOworCisJLyoKKwkgKiBXZSB3b3VsZCBzZXQgSVJRX0dQSU8yNSB0byBiZSBhIHdha2UtdXAgSVJRLCBidXQKKwkgKiB1bmZvcnR1bmF0ZWx5IHNvbWV0aGluZyBvbiB0aGUgTmVwb25zZXQgYWN0aXZhdGVzCisJICogdGhpcyBJUlEgb24gc2xlZXAgKGV0aGVybmV0PykKKwkgKi8KKyNpZiAwCisJZW5hYmxlX2lycV93YWtlKElSUV9HUElPMjUpOworI2VuZGlmCisKKwkvKgorCSAqIFNldHVwIG90aGVyIE5lcG9uc2V0IElSUXMuICBTQTExMTEgd2lsbCBiZSBkb25lIGJ5IHRoZQorCSAqIGdlbmVyaWMgU0ExMTExIGNvZGUuCisJICovCisJc2V0X2lycV9oYW5kbGVyKElSUV9ORVBPTlNFVF9TTUM5MTk2LCBkb19zaW1wbGVfSVJRKTsKKwlzZXRfaXJxX2ZsYWdzKElSUV9ORVBPTlNFVF9TTUM5MTk2LCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJc2V0X2lycV9oYW5kbGVyKElSUV9ORVBPTlNFVF9VU0FSLCBkb19zaW1wbGVfSVJRKTsKKwlzZXRfaXJxX2ZsYWdzKElSUV9ORVBPTlNFVF9VU0FSLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisKKwkvKgorCSAqIERpc2FibGUgR1BJTyAwLzEgZHJpdmVycyBzbyB0aGUgYnV0dG9ucyB3b3JrIG9uIHRoZSBtb2R1bGUuCisJICovCisJTkNSXzAgPSBOQ1JfR1AwMV9PRkY7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKgorICogTERNIHBvd2VyIG1hbmFnZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQgbmVwb25zZXRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQoreworCS8qCisJICogU2F2ZSBzdGF0ZS4KKwkgKi8KKwlpZiAobGV2ZWwgPT0gU1VTUEVORF9TQVZFX1NUQVRFIHx8CisJICAgIGxldmVsID09IFNVU1BFTkRfRElTQUJMRSB8fAorCSAgICBsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKKwkJaWYgKCFkZXYtPnBvd2VyLnNhdmVkX3N0YXRlKQorCQkJZGV2LT5wb3dlci5zYXZlZF9zdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCksIEdGUF9LRVJORUwpOworCQlpZiAoIWRldi0+cG93ZXIuc2F2ZWRfc3RhdGUpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkqKHVuc2lnbmVkIGludCAqKWRldi0+cG93ZXIuc2F2ZWRfc3RhdGUgPSBOQ1JfMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXBvbnNldF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJaWYgKGxldmVsID09IFJFU1VNRV9SRVNUT1JFX1NUQVRFIHx8IGxldmVsID09IFJFU1VNRV9FTkFCTEUpIHsKKwkJaWYgKGRldi0+cG93ZXIuc2F2ZWRfc3RhdGUpIHsKKwkJCU5DUl8wID0gKih1bnNpZ25lZCBpbnQgKilkZXYtPnBvd2VyLnNhdmVkX3N0YXRlOworCQkJa2ZyZWUoZGV2LT5wb3dlci5zYXZlZF9zdGF0ZSk7CisJCQlkZXYtPnBvd2VyLnNhdmVkX3N0YXRlID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBuZXBvbnNldF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgbmVwb25zZXRfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG5lcG9uc2V0X2RldmljZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm5lcG9uc2V0IiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gbmVwb25zZXRfcHJvYmUsCisJLnN1c3BlbmQJPSBuZXBvbnNldF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbmVwb25zZXRfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuZXBvbnNldF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IDB4MTAwMDAwMDAsCisJCS5lbmQJPSAweDE3ZmZmZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmVwb25zZXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJuZXBvbnNldCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG5lcG9uc2V0X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbmVwb25zZXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYTExMTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDQwMDAwMDAwLAorCQkuZW5kCT0gMHg0MDAwMWZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9ORVBPTlNFVF9TQTExMTEsCisJCS5lbmQJPSBJUlFfTkVQT05TRVRfU0ExMTExLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHU2NCBzYTExMTFfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMTExX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2ExMTExIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrID0gJnNhMTExMV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNhMTExMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNhMTExMV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gInNtYzkxeC1yZWdzIiwKKwkJLnN0YXJ0CT0gU0ExMTAwX0NTM19QSFlTLAorCQkuZW5kCT0gU0ExMTAwX0NTM19QSFlTICsgMHgwMWZmZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9ORVBPTlNFVF9TTUM5MTk2LAorCQkuZW5kCT0gSVJRX05FUE9OU0VUX1NNQzkxOTYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkubmFtZQk9ICJzbWM5MXgtYXR0cmliIiwKKwkJLnN0YXJ0CT0gU0ExMTAwX0NTM19QSFlTICsgMHgwMjAwMDAwMCwKKwkJLmVuZAk9IFNBMTEwMF9DUzNfUEhZUyArIDB4MDNmZmZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZuZXBvbnNldF9kZXZpY2UsCisJJnNhMTExMV9kZXZpY2UsCisJJnNtYzkxeF9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZXBvbnNldF9pbml0KHZvaWQpCit7CisJZHJpdmVyX3JlZ2lzdGVyKCZuZXBvbnNldF9kZXZpY2VfZHJpdmVyKTsKKworCS8qCisJICogVGhlIE5lcG9uc2V0IGlzIG9ubHkgcHJlc2VudCBvbiB0aGUgQXNzYWJldCBtYWNoaW5lIHR5cGUuCisJICovCisJaWYgKCFtYWNoaW5lX2lzX2Fzc2FiZXQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBtZW1vcnkgYnVzIHJlcXVlc3QvZ3JhbnQgc2lnbmFscyBhcmUgc2V0dXAsCisJICogYW5kIHRoZSBncmFudCBpcyBoZWxkIGluIGl0cyBpbmFjdGl2ZSBzdGF0ZSwgd2hldGhlciBvciBub3QKKwkgKiB3ZSBhY3R1YWxseSBoYXZlIGEgTmVwb25zZXQgYXR0YWNoZWQuCisJICovCisJc2ExMTEwX21iX2Rpc2FibGUoKTsKKworCWlmICghbWFjaGluZV9oYXNfbmVwb25zZXQoKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiTmVwb25zZXQgZXhwYW5zaW9uIGJvYXJkIG5vdCBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKFdIT0FNSSAhPSAweDExKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5lcG9uc2V0IGJvYXJkIGRldGVjdGVkLCBidXQgIgorCQkJIndyb25nIElEOiAlMDJ4XG4iLCBXSE9BTUkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChuZXBvbnNldF9pbml0KTsKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBuZXBvbnNldF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyAvKiB2aXJ0dWFsICAgICBwaHlzaWNhbCAgICBsZW5ndGggdHlwZSAqLworICB7IDB4ZjMwMDAwMDAsIDB4MTAwMDAwMDAsIFNaXzFNLCBNVF9ERVZJQ0UgfSwgLyogU3lzdGVtIFJlZ2lzdGVycyAqLworICB7IDB4ZjQwMDAwMDAsIDB4NDAwMDAwMDAsIFNaXzFNLCBNVF9ERVZJQ0UgfSAgLyogU0EtMTExMSAqLworfTsKKwordm9pZCBfX2luaXQgbmVwb25zZXRfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KG5lcG9uc2V0X2lvX2Rlc2MsIEFSUkFZX1NJWkUobmVwb25zZXRfaW9fZGVzYykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDZiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfc2ExMTAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisKKy8qCisgKiBFdGhlcm5ldCBJUlEgbWFwcGluZ3MKKyAqLworCisjZGVmaW5lIFBMRUJfRVRIMF9QCQkoMHgyMDAwMDMwMCkJLyogRXRoZXJuZXQgMCBpbiBQQ01DSUEwIElPICovCisjZGVmaW5lIFBMRUJfRVRIMF9WCQkoMHhmNjAwMDMwMCkKKworI2RlZmluZSBHUElPX0VUSDBfSVJRCQlHUElPX0dQSU8oMjEpCisjZGVmaW5lIEdQSU9fRVRIMF9FTgkJR1BJT19HUElPKDI2KQorCisjZGVmaW5lIElSUV9HUElPX0VUSDBfSVJRCUlSUV9HUElPMjEKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAgUExFQl9FVEgwX1AsCisJCS5lbmQJPSAgUExFQl9FVEgwX1AgfCAweDAzZmZmZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2lmIDAgLyogQXV0b3Byb2JlIGluc3RlYWQsIHRvIGdldCByaXNpbmcvZmFsbGluZyBlZGdlIGNoYXJhY3RlcmlzdGljIHJpZ2h0ICovCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfR1BJT19FVEgwX0lSUSwKKwkJLmVuZAk9IElSUV9HUElPX0VUSDBfSVJRLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorI2VuZGlmCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNtYzkxeF9kZXZpY2UsCit9OworCisKKy8qCisgKiBQbGViJ3MgbWVtb3J5IG1hcAorICogaGFzIGZsYXNoIG1lbW9yeSAodHlwaWNhbGx5IDQgb3IgOCBtZWcpIHNlbGVjdGVkIGJ5CisgKiB0aGUgdHdvIFNBMTEwMCBsb3dlc3QgY2hpcCBzZWxlY3Qgb3V0cHV0cy4KKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwbGViX2ZsYXNoX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gU0ExMTAwX0NTMF9QSFlTLAorCQkuZW5kICAgPSBTQTExMDBfQ1MwX1BIWVMgKyBTWl84TSAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBTQTExMDBfQ1MxX1BIWVMsCisJCS5lbmQgICA9IFNBMTEwMF9DUzFfUEhZUyArIFNaXzhNIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGxlYl9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZQkJPSAiYmxvYiIsCisJCS5vZmZzZXQgCT0gMCwKKwkJLnNpemUJCT0gMHgwMDAyMDAwMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJrZXJuZWwiLAorCQkub2Zmc2V0IAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJCT0gMHgwMDBlMDAwMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJyb290ZnMiLAorCQkub2Zmc2V0IAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJCT0gMHgwMDMwMDAwMCwKKwl9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBwbGViX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lID0gImNmaV9wcm9iZSIsCisJLnBhcnRzID0gcGxlYl9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUocGxlYl9wYXJ0aXRpb25zKSwKK307CisKKworc3RhdGljIHZvaWQgX19pbml0IHBsZWJfaW5pdCh2b2lkKQoreworCXNhMTF4MF9zZXRfZmxhc2hfZGF0YSgmcGxlYl9mbGFzaF9kYXRhLCBwbGViX2ZsYXNoX3Jlc291cmNlcywKKwkJCSAgICAgIEFSUkFZX1NJWkUocGxlYl9mbGFzaF9yZXNvdXJjZXMpKTsKKworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0IHBsZWJfbWFwX2lvKHZvaWQpCit7CisJc2ExMTAwX21hcF9pbygpOworCisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMCwgMyk7CisgICAgICAgIHNhMTEwMF9yZWdpc3Rlcl91YXJ0KDEsIDEpOworCisgICAgICAgIEdBRlIgfD0gKEdQSU9fVUFSVF9UWEQgfCBHUElPX1VBUlRfUlhEKTsKKyAgICAgICAgR1BEUiB8PSBHUElPX1VBUlRfVFhEOworICAgICAgICBHUERSICY9IH5HUElPX1VBUlRfUlhEOworICAgICAgICBQUEFSIHw9IFBQQVJfVVBSOworCisJLyoKKwkgKiBGaXggZXhwYW5zaW9uIG1lbW9yeSB0aW1pbmcgZm9yIG5ldHdvcmsgY2FyZAorCSAqLworCU1FQ1IgPSAoKDI8PDEwKSB8ICgyPDw1KSB8ICgyPDwwKSk7CisKKwkvKgorCSAqIEVuYWJsZSB0aGUgU01DIGV0aGVybmV0IGNvbnRyb2xsZXIKKwkgKi8KKwlHUERSIHw9IEdQSU9fRVRIMF9FTjsJLyogc2V0IHRvIG91dHB1dCAqLworCUdQQ1IgID0gR1BJT19FVEgwX0VOOwkvKiBjbGVhciBNQ0xLIChlbmFibGUgc21jKSAqLworCisJR1BEUiAmPSB+R1BJT19FVEgwX0lSUTsKKworCXNldF9pcnFfdHlwZShHUElPX0VUSDBfSVJRLCBJUlFUX0ZBTExJTkcpOworfQorCitNQUNISU5FX1NUQVJUKFBMRUIsICJQTEVCIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCU1BUElPKHBsZWJfbWFwX2lvKQorCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAorCS5pbml0X21hY2hpbmUgICA9IHBsZWJfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzllYTVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcG0uYwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIFNBMTEwMCBQb3dlciBNYW5hZ2VtZW50IFJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIENsaWZmIEJyYWtlIDxjYnJha2VAYWNjZWxlbnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIEhpc3Rvcnk6CisgKgorICogMjAwMS0wMi0wNjoJQ2xpZmYgQnJha2UgICAgICAgICBJbml0aWFsIGNvZGUKKyAqCisgKiAyMDAxLTAyLTI1OglTdWtqYWUgQ2hvIDxzamNob0BlYXN0LmlzaS5lZHU+ICYKKyAqIAkJQ2hlc3RlciBLdW8gPGNoZXN0ZXJAbGludXgub3JnLnR3PgorICogCQkJU2F2ZSBtb3JlIHZhbHVlIGZvciB0aGUgcmVzdW1lIGZ1bmN0aW9uISBTdXBwb3J0CisgKiAJCQlCaXRzeS9Bc3NhYmV0L0ZyZWViaXJkIGJvYXJkCisgKgorICogMjAwMS0wOC0yOToJTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogCQkJQ2xlYW5lZCB1cCwgcHVzaGVkIHBsYXRmb3JtIGRlcGVuZGVudCBzdHVmZgorICogCQkJaW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGZpbGVzLgorICoKKyAqIDIwMDItMDUtMjc6CU5pY29sYXMgUGl0cmUJS2lsbGVkIHNsZWVwLmggYW5kIHRoZSBrbWFsbG9jZWQgc2F2ZSBhcnJheS4KKyAqIAkJCQlTdG9yYWdlIGlzIGxvY2FsIG9uIHRoZSBzdGFjayBub3cuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKK2V4dGVybiB2b2lkIHNhMTEwMF9jcHVfc3VzcGVuZCh2b2lkKTsKK2V4dGVybiB2b2lkIHNhMTEwMF9jcHVfcmVzdW1lKHZvaWQpOworCisjZGVmaW5lIFNBVkUoeCkJCXNsZWVwX3NhdmVbU0xFRVBfU0FWRV8jI3hdID0geAorI2RlZmluZSBSRVNUT1JFKHgpCXggPSBzbGVlcF9zYXZlW1NMRUVQX1NBVkVfIyN4XQorCisvKgorICogTGlzdCBvZiBnbG9iYWwgU0ExMXgwIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHByZXNlcnZlLgorICogTW9yZSBvbmVzIGxpa2UgQ1AgYW5kIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciB2YWx1ZXMgYXJlIHByZXNlcnZlZAorICogb24gdGhlIHN0YWNrIGFuZCB0aGVuIHRoZSBzdGFjayBwb2ludGVyIGlzIHN0b3JlZCBsYXN0IGluIHNsZWVwLlMuCisgKi8KK2VudW0gewlTTEVFUF9TQVZFX1NQID0gMCwKKworCVNMRUVQX1NBVkVfR1BEUiwgU0xFRVBfU0FWRV9HQUZSLAorCVNMRUVQX1NBVkVfUFBEUiwgU0xFRVBfU0FWRV9QUFNSLCBTTEVFUF9TQVZFX1BQQVIsIFNMRUVQX1NBVkVfUFNEUiwKKworCVNMRUVQX1NBVkVfU2VyMVNEQ1IwLAorCisJU0xFRVBfU0FWRV9TSVpFCit9OworCisKK3N0YXRpYyBpbnQgc2ExMXgwX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGdwaW8sIHNsZWVwX3NhdmVbU0xFRVBfU0FWRV9TSVpFXTsKKwlzdHJ1Y3QgdGltZXNwZWMgZGVsdGEsIHJ0YzsKKworCWlmIChzdGF0ZSAhPSBQTV9TVVNQRU5EX01FTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBwcmVzZXJ2ZSBjdXJyZW50IHRpbWUgKi8KKwlydGMudHZfc2VjID0gUkNOUjsKKwlydGMudHZfbnNlYyA9IDA7CisJc2F2ZV90aW1lX2RlbHRhKCZkZWx0YSwgJnJ0Yyk7CisJZ3BpbyA9IEdQTFI7CisKKwkvKiBzYXZlIHZpdGFsIHJlZ2lzdGVycyAqLworCVNBVkUoR1BEUik7CisJU0FWRShHQUZSKTsKKworCVNBVkUoUFBEUik7CisJU0FWRShQUFNSKTsKKwlTQVZFKFBQQVIpOworCVNBVkUoUFNEUik7CisKKwlTQVZFKFNlcjFTRENSMCk7CisKKwkvKiBDbGVhciBwcmV2aW91cyByZXNldCBzdGF0dXMgKi8KKwlSQ1NSID0gUkNTUl9IV1IgfCBSQ1NSX1NXUiB8IFJDU1JfV0RSIHwgUkNTUl9TTVI7CisKKwkvKiBzZXQgcmVzdW1lIHJldHVybiBhZGRyZXNzICovCisJUFNQUiA9IHZpcnRfdG9fcGh5cyhzYTExMDBfY3B1X3Jlc3VtZSk7CisKKwkvKiBnbyB6enogKi8KKwlzYTExMDBfY3B1X3N1c3BlbmQoKTsKKworCS8qCisJICogRW5zdXJlIG5vdCB0byBjb21lIGJhY2sgaGVyZSBpZiBpdCB3YXNuJ3QgaW50ZW5kZWQKKwkgKi8KKwlQU1BSID0gMDsKKworCS8qCisJICogRW5zdXJlIGludGVycnVwdCBzb3VyY2VzIGFyZSBkaXNhYmxlZDsgd2Ugd2lsbCByZS1pbml0CisJICogdGhlIGludGVycnVwdCBzdWJzeXN0ZW0gdmlhIHRoZSBkZXZpY2UgbWFuYWdlci4KKwkgKi8KKwlJQ0xSID0gMDsKKwlJQ0NSID0gMTsKKwlJQ01SID0gMDsKKworCS8qIHJlc3RvcmUgcmVnaXN0ZXJzICovCisJUkVTVE9SRShHUERSKTsKKwlSRVNUT1JFKEdBRlIpOworCisJUkVTVE9SRShQUERSKTsKKwlSRVNUT1JFKFBQU1IpOworCVJFU1RPUkUoUFBBUik7CisJUkVTVE9SRShQU0RSKTsKKworCVJFU1RPUkUoU2VyMVNEQ1IwKTsKKworCUdQU1IgPSBncGlvOworCUdQQ1IgPSB+Z3BpbzsKKworCS8qCisJICogQ2xlYXIgdGhlIHBlcmlwaGVyYWwgc2xlZXAtaG9sZCBiaXQuCisJICovCisJUFNTUiA9IFBTU1JfUEg7CisKKwkvKiByZXN0b3JlIGN1cnJlbnQgdGltZSAqLworCXJ0Yy50dl9zZWMgPSBSQ05SOworCXJlc3RvcmVfdGltZV9kZWx0YSgmZGVsdGEsICZydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc2xlZXBfcGh5c19zcCh2b2lkICpzcCkKK3sKKwlyZXR1cm4gdmlydF90b19waHlzKHNwKTsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBwcm9jZXNzZXMgYXJlIGZyb3plbiwgYnV0IGJlZm9yZSB3ZSBzaHV0IGRvd24gZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBzYTExeDBfcG1fcHJlcGFyZShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgZGV2aWNlcyBhcmUgcmUtc2V0dXAsIGJ1dCBiZWZvcmUgcHJvY2Vzc2VzIGFyZSB0aGF3ZWQuCisgKi8KK3N0YXRpYyBpbnQgc2ExMXgwX3BtX2ZpbmlzaChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdG8gUE1fRElTS19GSVJNV0FSRSBzbyB3ZSBjYW4gcXVpY2tseSB2ZXRvIHN1c3BlbmQtdG8tZGlzay4KKyAqLworc3RhdGljIHN0cnVjdCBwbV9vcHMgc2ExMXgwX3BtX29wcyA9IHsKKwkucG1fZGlza19tb2RlCT0gUE1fRElTS19GSVJNV0FSRSwKKwkucHJlcGFyZQk9IHNhMTF4MF9wbV9wcmVwYXJlLAorCS5lbnRlcgkJPSBzYTExeDBfcG1fZW50ZXIsCisJLmZpbmlzaAkJPSBzYTExeDBfcG1fZmluaXNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2ExMXgwX3BtX2luaXQodm9pZCkKK3sKKwlwbV9zZXRfb3BzKCZzYTExeDBfcG1fb3BzKTsKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChzYTExeDBfcG1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkZGQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfc2ExMTAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc2hhbm5vbi5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gc2hhbm5vbl9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZQkJPSAiQkxPQiBib290IGxvYWRlciIsCisJCS5vZmZzZXQJCT0gMCwKKwkJLnNpemUJCT0gMHgyMDAwMAorCX0sCisJeworCQkubmFtZQkJPSAia2VybmVsIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplCQk9IDB4ZTAwMDAKKwl9LAorCXsgCisJCS5uYW1lCQk9ICJpbml0cmQiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwJCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgc2hhbm5vbl9mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS5wYXJ0cwkJPSBzaGFubm9uX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShzaGFubm9uX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaGFubm9uX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSBTQTExMDBfQ1MwX1BIWVMsCisJLmVuZAkJPSBTQTExMDBfQ1MwX1BIWVMgKyBTWl80TSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHNoYW5ub25faW5pdCh2b2lkKQoreworCXNhMTF4MF9zZXRfZmxhc2hfZGF0YSgmc2hhbm5vbl9mbGFzaF9kYXRhLCAmc2hhbm5vbl9mbGFzaF9yZXNvdXJjZSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzaGFubm9uX21hcF9pbyh2b2lkKQoreworCXNhMTEwMF9tYXBfaW8oKTsKKworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDAsIDMpOworCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDEsIDEpOworCisJU2VyMVNEQ1IwIHw9IFNEQ1IwX1NVUzsKKwlHQUZSIHw9IChHUElPX1VBUlRfVFhEIHwgR1BJT19VQVJUX1JYRCk7CisJR1BEUiB8PSBHUElPX1VBUlRfVFhEIHwgU0hBTk5PTl9HUElPX0NPREVDX1JFU0VUOworCUdQRFIgJj0gfkdQSU9fVUFSVF9SWEQ7CisJUFBBUiB8PSBQUEFSX1VQUjsKKworCS8qIHJlc2V0IHRoZSBjb2RlYyAqLworCUdQQ1IgPSBTSEFOTk9OX0dQSU9fQ09ERUNfUkVTRVQ7CisJR1BTUiA9IFNIQU5OT05fR1BJT19DT0RFQ19SRVNFVDsKK30KKworTUFDSElORV9TVEFSVChTSEFOTk9OLCAiU2hhbm5vbiAoQUtBOiBUdXhzY3JlZW4pIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCisJTUFQSU8oc2hhbm5vbl9tYXBfaW8pCisJSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IHNoYW5ub25faW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTEzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IAorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9zYTExMDAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zaW1wYWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK2xvbmcgY3MzX3NoYWRvdzsKKworbG9uZyBnZXRfY3MzX3NoYWRvdyh2b2lkKQoreworCXJldHVybiBjczNfc2hhZG93OworfQorCit2b2lkIHNldF9jczMobG9uZyB2YWx1ZSkKK3sKKwkqKENTM0JVU1RZUEUgKikoQ1MzX0JBU0UpID0gY3MzX3NoYWRvdyA9IHZhbHVlOworfQorCit2b2lkIHNldF9jczNfYml0KGludCB2YWx1ZSkKK3sKKwljczNfc2hhZG93IHw9IHZhbHVlOworCSooQ1MzQlVTVFlQRSAqKShDUzNfQkFTRSkgPSBjczNfc2hhZG93OworfQorCit2b2lkIGNsZWFyX2NzM19iaXQoaW50IHZhbHVlKQoreworCWNzM19zaGFkb3cgJj0gfnZhbHVlOworCSooQ1MzQlVTVFlQRSAqKShDUzNfQkFTRSkgPSBjczNfc2hhZG93OworfQorCitFWFBPUlRfU1lNQk9MKHNldF9jczNfYml0KTsKK0VYUE9SVF9TWU1CT0woY2xlYXJfY3MzX2JpdCk7CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgc2ltcGFkX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworICAgICAgICAvKiB2aXJ0dWFsCXBoeXNpY2FsICAgIGxlbmd0aAl0eXBlICovCisJLyogTVEyMDAgKi8KKwl7IDB4ZjI4MDAwMDAsIDB4NGI4MDAwMDAsIDB4MDA4MDAwMDAsIE1UX0RFVklDRSB9LAorCS8qIFBhdWxlcyBDUzMsIHdyaXRlIG9ubHkgKi8KKwl7IDB4ZjEwMDAwMDAsIDB4MTgwMDAwMDAsIDB4MDAxMDAwMDAsIE1UX0RFVklDRSB9LAorfTsKKworCitzdGF0aWMgdm9pZCBzaW1wYWRfdWFydF9wbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1X2ludCBzdGF0ZSwgdV9pbnQgb2xkc3RhdGUpCit7CisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gKHVfaW50KSZTZXIxVVRDUjApIHsKKwkJaWYgKHN0YXRlKQorCQl7CisJCQljbGVhcl9jczNfYml0KFJTMjMyX09OKTsKKwkJCWNsZWFyX2NzM19iaXQoREVDVF9QT1dFUl9PTik7CisJCX1lbHNlCisJCXsKKwkJCXNldF9jczNfYml0KFJTMjMyX09OKTsKKwkJCXNldF9jczNfYml0KERFQ1RfUE9XRVJfT04pOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNhMTEwMF9wb3J0X2ZucyBzaW1wYWRfcG9ydF9mbnMgX19pbml0ZGF0YSA9IHsKKwkucG0JICAgPSBzaW1wYWRfdWFydF9wbSwKK307CisKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHNpbXBhZF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSAgICAgICA9ICJTSU1wYWQgYm9vdCBmaXJtd2FyZSIsCisJCS5zaXplICAgICAgID0gMHgwMDA4MDAwMCwKKwkJLm9mZnNldCAgICAgPSAwLAorCQkubWFza19mbGFncyA9IE1URF9XUklURUFCTEUsCisJfSwgeworCQkubmFtZSAgICAgICA9ICJTSU1wYWQga2VybmVsIiwKKwkJLnNpemUgICAgICAgPSAweDAwMTAwMDAsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAiU0lNcGFkIHJvb3QgamZmczIiLAorCQkuc2l6ZSAgICAgICA9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBzaW1wYWRfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUgICAgPSAiY2ZpX3Byb2JlIiwKKwkucGFydHMgICAgICAgPSBzaW1wYWRfcGFydGl0aW9ucywKKwkubnJfcGFydHMgICAgPSBBUlJBWV9TSVpFKHNpbXBhZF9wYXJ0aXRpb25zKSwKK307CisKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaW1wYWRfZmxhc2hfcmVzb3VyY2VzIFtdID0geworCXsKKwkJLnN0YXJ0ICAgICA9IFNBMTEwMF9DUzBfUEhZUywKKwkJLmVuZCAgICAgICA9IFNBMTEwMF9DUzBfUEhZUyArIFNaXzE2TSAtMSwKKwkJLmZsYWdzICAgICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ICAgICA9IFNBMTEwMF9DUzFfUEhZUywKKwkJLmVuZCAgICAgICA9IFNBMTEwMF9DUzFfUEhZUyArIFNaXzE2TSAtMSwKKwkJLmZsYWdzICAgICA9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKKworCitzdGF0aWMgdm9pZCBfX2luaXQgc2ltcGFkX21hcF9pbyh2b2lkKQoreworCXNhMTEwMF9tYXBfaW8oKTsKKworCWlvdGFibGVfaW5pdChzaW1wYWRfaW9fZGVzYywgQVJSQVlfU0laRShzaW1wYWRfaW9fZGVzYykpOworCisJc2V0X2NzM19iaXQgKEVOMSB8IEVOMCB8IExFRDJfT04gfCBESVNQTEFZX09OIHwgUlMyMzJfT04gfAorCQkgICAgICBFTkFCTEVfNVYgfCBSRVNFVF9TSU1DQVJEIHwgREVDVF9QT1dFUl9PTik7CisKKworICAgICAgICBzYTExMDBfcmVnaXN0ZXJfdWFydF9mbnMoJnNpbXBhZF9wb3J0X2Zucyk7CisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMCwgMyk7ICAvKiBzZXJpYWwgaW50ZXJmYWNlICovCisJc2ExMTAwX3JlZ2lzdGVyX3VhcnQoMSwgMSk7ICAvKiBERUNUICAgICAgICAgICAgICovCisKKwkvLyBSZWFzc2lnbiBVQVJUIDEgcGlucworCUdBRlIgfD0gR1BJT19VQVJUX1RYRCB8IEdQSU9fVUFSVF9SWEQ7CisJR1BEUiB8PSBHUElPX1VBUlRfVFhEIHwgR1BJT19MREQxMyB8IEdQSU9fTEREMTU7CisJR1BEUiAmPSB+R1BJT19VQVJUX1JYRDsKKwlQUEFSIHw9IFBQQVJfVVBSOworCisJLyoKKwkgKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzbGVlcCBtb2RlLgorCSAqLworCisKKwlQV0VSID0gUFdFUl9HUElPMHwgUFdFUl9SVEM7CisJUEdTUiA9IDB4ODE4OworCVBDRlIgPSAwOworCVBTRFIgPSAwOworCisJc2ExMXgwX3NldF9mbGFzaF9kYXRhKCZzaW1wYWRfZmxhc2hfZGF0YSwgc2ltcGFkX2ZsYXNoX3Jlc291cmNlcywKKwkJCSAgICAgIEFSUkFZX1NJWkUoc2ltcGFkX2ZsYXNoX3Jlc291cmNlcykpOworfQorCitzdGF0aWMgdm9pZCBzaW1wYWRfcG93ZXJfb2ZmKHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsgLy8gd2FzIGNsaQorCXNldF9jczMoMHg4MDApOyAgICAgICAgLyogb25seSBTRF9NRURJQVEgKi8KKworCS8qIGRpc2FibGUgaW50ZXJuYWwgb3NjaWxsYXRvciwgZmxvYXQgQ1MgbGluZXMgKi8KKwlQQ0ZSID0gKFBDRlJfT1BERSB8IFBDRlJfRlAgfCBQQ0ZSX0ZTKTsKKwkvKiBlbmFibGUgd2FrZS11cCBvbiBHUElPMCAoQXNzYWJldC4uLikgKi8KKwlQV0VSID0gR0ZFUiA9IEdSRVIgPSAxOworCS8qCisJICogc2V0IHNjcmF0Y2hwYWQgdG8gemVybywganVzdCBpbiBjYXNlIGl0IGlzIHVzZWQgYXMgYQorCSAqIHJlc3RhcnQgYWRkcmVzcyBieSB0aGUgYm9vdGxvYWRlci4KKwkgKi8KKwlQU1BSID0gMDsKKwlQR1NSID0gMDsKKwkvKiBlbnRlciBzbGVlcCBtb2RlICovCisJUE1DUiA9IFBNQ1JfU0Y7CisJd2hpbGUoMSk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7IC8qIHdlIHdvbid0IGV2ZXIgY2FsbCBpdCAqLworCisKK30KKworCisvKgorICogTWVkaWFRIFZpZGVvIERldmljZQorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzaW1wYWRfbXEyMDBmYiA9IHsKKwkubmFtZSA9ICJzaW1wYWQtbXEyMDAiLAorCS5pZCAgID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2ltcGFkX21xMjAwZmIKK307CisKKworCitzdGF0aWMgaW50IF9faW5pdCBzaW1wYWRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwbV9wb3dlcl9vZmYgPSBzaW1wYWRfcG93ZXJfb2ZmOworCisJcmV0ID0gcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CisJaWYocmV0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJzaW1wYWQ6IFVuYWJsZSB0byByZWdpc3RlciBtcTIwMCBmcmFtZWJ1ZmZlciBkZXZpY2UiKTsKKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHNpbXBhZF9pbml0KTsKKworCitNQUNISU5FX1NUQVJUKFNJTVBBRCwgIlNpbXBhZCIpCisJTUFJTlRBSU5FUigiSG9sZ2VyIEZyZXl0aGVyIikKKwlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQorICAgICAgICBCT09UX1BBUkFNUygweGMwMDAwMTAwKQorCU1BUElPKHNpbXBhZF9tYXBfaW8pCisJSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NsZWVwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhMWUyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NsZWVwLlMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBTQTExeDAgQXNzZW1ibGVyIFNsZWVwL1dha2VVcCBNYW5hZ2VtZW50IFJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIENsaWZmIEJyYWtlIDxjYnJha2VAYWNjZWxlbnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIEhpc3Rvcnk6CisgKgorICogMjAwMS0wMi0wNjogQ2xpZmYgQnJha2UgICAgICAgICBJbml0aWFsIGNvZGUKKyAqCisgKiAyMDAxLTA4LTI5OglOaWNvbGFzIFBpdHJlCVNpbXBsaWZpZWQuCisgKgorICogMjAwMi0wNS0yNzoJTmljb2xhcyBQaXRyZQlSZXZpc2l0ZWQsIG1vcmUgY2xlYW51cCBhbmQgc2ltcGxpZmljYXRpb24uCisgKgkJCQlTdG9yYWdlIGlzIG9uIHRoZSBzdGFjayBub3cuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKworCisJCS50ZXh0CisKKworCisvKgorICogc2ExMTAwX2NwdV9zdXNwZW5kKCkKKyAqCisgKiBDYXVzZXMgc2ExMXgwIHRvIGVudGVyIHNsZWVwIHN0YXRlCisgKgorICovCisKK0VOVFJZKHNhMTEwMF9jcHVfc3VzcGVuZCkKKworCXN0bWZkCXNwISwge3I0IC0gcjEyLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKworCUAgZ2V0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycworCW1yYyAJcDE1LCAwLCByNCwgYzMsIGMwLCAwCQlAIGRvbWFpbiBJRAorCW1yYyAJcDE1LCAwLCByNSwgYzIsIGMwLCAwCQlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgorCW1yYwlwMTUsIDAsIHI2LCBjMTMsIGMwLCAwCQlAIFBJRAorCW1yYyAJcDE1LCAwLCByNywgYzEsIGMwLCAwCQlAIGNvbnRyb2wgcmVnCisKKwlAIHN0b3JlIHRoZW0gcGx1cyBjdXJyZW50IHZpcnR1YWwgc3RhY2sgcHRyIG9uIHN0YWNrCisJbW92CXI4LCBzcAorCXN0bWZkCXNwISwge3I0IC0gcjh9CisKKwlAIHByZXNlcnZlIHBoeXMgYWRkcmVzcyBvZiBzdGFjaworCW1vdglyMCwgc3AKKwlibAlzbGVlcF9waHlzX3NwCisJbGRyCXIxLCA9c2xlZXBfc2F2ZV9zcAorCXN0cglyMCwgW3IxXQorCisJQCBjbGVhbiBkYXRhIGNhY2hlIGFuZCBpbnZhbGlkYXRlIFdCCisJYmwJdjR3Yl9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCisJQCBkaXNhYmxlIGNsb2NrIHN3aXRjaGluZworCW1jcglwMTUsIDAsIHIxLCBjMTUsIGMyLCAyCisKKyAgICAgICAgQCBBZGp1c3QgbWVtb3J5IHRpbWluZyBiZWZvcmUgbG93ZXJpbmcgQ1BVIGNsb2NrCisJQCBDbG9jayBzcGVlZCBhZGp1c3RtZW50IHdpdGhvdXQgY2hhbmdpbmcgbWVtb3J5IHRpbWluZyBtYWtlcworCUAgQ1BVIGhhbmcgaW4gc29tZSBjYXNlcworICAgICAgICBsZHIgICAgIHIwLCA9TURSRUZSCisgICAgICAgIGxkciAgICAgcjEsIFtyMF0KKyAgICAgICAgb3JyICAgICByMSwgcjEsICNNRFJFRlJfSzFEQjIKKyAgICAgICAgc3RyICAgICByMSwgW3IwXQorCisJQCBkZWxheSA5MHVzIGFuZCBzZXQgQ1BVIFBMTCB0byBsb3dlc3Qgc3BlZWQKKwlAIGZpeGVzIHJlc3VtZSBwcm9ibGVtIG9uIGhpZ2ggc3BlZWQgU0ExMTEwCisJbW92CXIwLCAjOTAKKwlibAlfX3VkZWxheQorCWxkcglyMCwgPVBQQ1IKKwltb3YJcjEsICMwCisJc3RyCXIxLCBbcjBdCisJbW92CXIwLCAjOTAKKwlibAlfX3VkZWxheQorCisJLyoKKwkgKiBTQTExMTAgU0RSQU0gY29udHJvbGxlciB3b3JrYXJvdW5kLiAgcmVnaXN0ZXIgdmFsdWVzOgorCSAqCisJICogcjAgID0gJk1TQzAKKwkgKiByMSAgPSAmTVNDMQorCSAqIHIyICA9ICZNU0MyCisJICogcjMgID0gTVNDMCB2YWx1ZQorCSAqIHI0ICA9IE1TQzEgdmFsdWUKKwkgKiByNSAgPSBNU0MyIHZhbHVlCisJICogcjYgID0gJk1EUkVGUgorCSAqIHI3ICA9IGZpcnN0IE1EUkVGUiB2YWx1ZQorCSAqIHI4ICA9IHNlY29uZCBNRFJFRlIgdmFsdWUKKwkgKiByOSAgPSAmTURDTkZHCisJICogcjEwID0gTURDTkZHIHZhbHVlCisJICogcjExID0gdGhpcmQgTURSRUZSIHZhbHVlCisJICogcjEyID0gJlBNQ1IKKwkgKiByMTMgPSBQTUNSIHZhbHVlICgxKQorCSAqLworCisJbGRyCXIwLCA9TVNDMAorCWxkcglyMSwgPU1TQzEKKwlsZHIJcjIsID1NU0MyCisKKyAgICAgICAgbGRyICAgICByMywgW3IwXQorICAgICAgICBiaWMgICAgIHIzLCByMywgI0ZNc2soTVNDX1JUKQorICAgICAgICBiaWMgICAgIHIzLCByMywgI0ZNc2soTVNDX1JUKTw8MTYKKworICAgICAgICBsZHIgICAgIHI0LCBbcjFdCisgICAgICAgIGJpYyAgICAgcjQsIHI0LCAjRk1zayhNU0NfUlQpCisgICAgICAgIGJpYyAgICAgcjQsIHI0LCAjRk1zayhNU0NfUlQpPDwxNgorCisgICAgICAgIGxkciAgICAgcjUsIFtyMl0KKyAgICAgICAgYmljICAgICByNSwgcjUsICNGTXNrKE1TQ19SVCkKKyAgICAgICAgYmljICAgICByNSwgcjUsICNGTXNrKE1TQ19SVCk8PDE2CisKKyAgICAgICAgbGRyICAgICByNiwgPU1EUkVGUgorCisgICAgICAgIGxkciAgICAgcjcsIFtyNl0KKyAgICAgICAgYmljICAgICByNywgcjcsICMweDAwMDBGRjAwCisgICAgICAgIGJpYyAgICAgcjcsIHI3LCAjMHgwMDAwMDBGMAorICAgICAgICBvcnIgICAgIHI4LCByNywgI01EUkVGUl9TTEZSU0gKKworICAgICAgICBsZHIgICAgIHI5LCA9TURDTkZHCisgICAgICAgIGxkciAgICAgcjEwLCBbcjldCisgICAgICAgIGJpYyAgICAgcjEwLCByMTAsICMoTURDTkZHX0RFMCtNRENORkdfREUxKQorICAgICAgICBiaWMgICAgIHIxMCwgcjEwLCAjKE1EQ05GR19ERTIrTURDTkZHX0RFMykKKworICAgICAgICBiaWMgICAgIHIxMSwgcjgsICNNRFJFRlJfU0xGUlNICisgICAgICAgIGJpYyAgICAgcjExLCByMTEsICNNRFJFRlJfRTFQSU4KKworICAgICAgICBsZHIgICAgIHIxMiwgPVBNQ1IKKworICAgICAgICBtb3YgICAgIHIxMywgI1BNQ1JfU0YKKworCWIJc2ExMTEwX3NkcmFtX2NvbnRyb2xsZXJfZml4CisKKwkuYWxpZ24gNQorc2ExMTEwX3NkcmFtX2NvbnRyb2xsZXJfZml4OgorCisJQCBTdGVwIDEgY2xlYXIgUlQgZmllbGQgb2YgYWxsIE1TQ3ggcmVnaXN0ZXJzCisJc3RyIAlyMywgW3IwXQorCXN0cglyNCwgW3IxXQorCXN0cglyNSwgW3IyXQorCisJQCBTdGVwIDIgY2xlYXIgRFJJIGZpZWxkIGluIE1EUkVGUgorCXN0cglyNywgW3I2XQorCisJQCBTdGVwIDMgc2V0IFNMRlJTSCBiaXQgaW4gTURSRUZSCisJc3RyCXI4LCBbcjZdCisKKwlAIFN0ZXAgNCBjbGVhciBERSBiaXMgaW4gTURDTkZHCisJc3RyCXIxMCwgW3I5XQorCisJQCBTdGVwIDUgY2xlYXIgRFJBTSByZWZyZXNoIGNvbnRyb2wgcmVnaXN0ZXIKKwlzdHIJcjExLCBbcjZdCisKKwlAIFdvdywgbm93IHRoZSBoYXJkd2FyZSBzdXNwZW5kIHJlcXVlc3QgcGlucyBjYW4gYmUgdXNlZCwgdGhhdCBtYWtlcyB0aGVtIGZ1bmN0aW9uYWwgZm9yCisJQCBhYm91dCA3IG5zIG91dCBvZiB0aGUJZW50aXJlIHRpbWUgdGhhdCB0aGUgQ1BVIGlzIHJ1bm5pbmchCisKKwlAIFN0ZXAgNiBzZXQgZm9yY2Ugc2xlZXAgYml0IGluIFBNQ1IKKworCXN0cglyMTMsIFtyMTJdCisKKzIwOgliCTIwYgkJCUAgbG9vcCB3YWl0aW5nIGZvciBzbGVlcAorCisvKgorICogY3B1X3NhMTEwMF9yZXN1bWUoKQorICoKKyAqIGVudHJ5IHBvaW50IGZyb20gYm9vdGxvYWRlciBpbnRvIGtlcm5lbCBkdXJpbmcgcmVzdW1lCisgKgorICogTm90ZTogWWVzLCBwYXJ0IG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpcyBsb2NhdGVkIGludG8gdGhlIC5kYXRhIHNlY3Rpb24uCisgKiAgICAgICBUaGlzIGlzIHRvIGFsbG93IHNsZWVwX3NhdmVfc3AgdG8gYmUgYWNjZXNzZWQgd2l0aCBhIHJlbGF0aXZlIGxvYWQKKyAqICAgICAgIHdoaWxlIHdlIGNhbid0IHJlbHkgb24gYW55IE1NVSB0cmFuc2xhdGlvbi4gIFdlIGNvdWxkIGhhdmUgcHV0CisgKiAgICAgICBzbGVlcF9zYXZlX3NwIGluIHRoZSAudGV4dCBzZWN0aW9uIGFzIHdlbGwsIGJ1dCBzb21lIHNldHVwcyBtaWdodAorICogICAgICAgaW5zaXN0IG9uIGl0IHRvIGJlIHRydWx5IHJlYWQtb25seS4KKyAqLworCisJLmRhdGEKKwkuYWxpZ24gNQorRU5UUlkoc2ExMTAwX2NwdV9yZXN1bWUpCisJbW92CXIwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgTU9ERV9TVkMKKwltc3IJY3Bzcl9jLCByMAkJCUAgc2V0IFNWQywgaXJxcyBvZmYKKworCWxkcglyMCwgc2xlZXBfc2F2ZV9zcAkJQCBzdGFjayBwaHlzIGFkZHIKKwlsZHIJcjIsID1yZXN1bWVfYWZ0ZXJfbW11CQlAIGl0cyBhYnNvbHV0ZSB2aXJ0dWFsIGFkZHJlc3MKKwlsZG1mZAlyMCwge3I0IC0gcjcsIHNwfQkJQCBDUCByZWdzICsgdmlydCBzdGFjayBwdHIKKworCW1vdglyMSwgIzAKKwltY3IJcDE1LCAwLCByMSwgYzgsIGM3LCAwICAgCUAgZmx1c2ggSStEIFRMQnMKKwltY3IJcDE1LCAwLCByMSwgYzcsIGM3LCAwCQlAIGZsdXNoIEkmRCBjYWNoZQorCW1jcglwMTUsIDAsIHIxLCBjOSwgYzAsIDAJCUAgaW52YWxpZGF0ZSBSQgorCW1jciAgICAgcDE1LCAwLCByMSwgYzksIGMwLCA1CQlAIGFsbG93IHVzZXIgc3BhY2UgdG8gdXNlIFJCCisKKwltY3IgCXAxNSwgMCwgcjQsIGMzLCBjMCwgMAkJQCBkb21haW4gSUQKKwltY3IgCXAxNSwgMCwgcjUsIGMyLCBjMCwgMAkJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKKwltY3IJcDE1LCAwLCByNiwgYzEzLCBjMCwgMAkJQCBQSUQKKwliCXJlc3VtZV90dXJuX29uX21tdQkJQCBjYWNoZSBhbGlnbiBleGVjdXRpb24KKworCS5hbGlnbiA1CityZXN1bWVfdHVybl9vbl9tbXU6CisJbWNyIAlwMTUsIDAsIHI3LCBjMSwgYzAsIDAJCUAgdHVybiBvbiBNTVUsIGNhY2hlcywgZXRjLgorCW5vcAorCW1vdglwYywgcjIJCQkJQCBqdW1wIHRvIHZpcnR1YWwgYWRkcgorCW5vcAorCW5vcAorCW5vcAorCitzbGVlcF9zYXZlX3NwOgorCS53b3JkCTAJCQkJQCBwcmVzZXJ2ZSBzdGFjayBwaHlzIHB0ciBoZXJlCisKKwkudGV4dAorcmVzdW1lX2FmdGVyX21tdToKKwltY3IgICAgIHAxNSwgMCwgcjEsIGMxNSwgYzEsIDIJCUAgZW5hYmxlIGNsb2NrIHN3aXRjaGluZworCWxkbWZkCXNwISwge3I0IC0gcjEyLCBwY30JCUAgcmV0dXJuIHRvIGNhbGxlcgorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NzcC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc3NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwNGRhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NzcC5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL3NzcC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgR2VuZXJpYyBTU1AgZHJpdmVyLiAgVGhpcyBwcm92aWRlcyB0aGUgZ2VuZXJpYyBjb3JlIGZvciBzaW1wbGUKKyAqICBJTy1iYXNlZCBTU1AgYXBwbGljYXRpb25zLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc3NwLmg+CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzc3BfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IFNlcjRTU1NSOworCisJaWYgKHN0YXR1cyAmIFNTU1JfUk9SKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNTUDogcmVjZWl2ZXIgb3ZlcnJ1blxuIik7CisJfQorCisJU2VyNFNTU1IgPSBTU1NSX1JPUjsKKworCXJldHVybiBzdGF0dXMgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCisvKioKKyAqIHNzcF93cml0ZV93b3JkIC0gd3JpdGUgYSB3b3JkIHRvIHRoZSBTU1AgcG9ydAorICogQGRhdGE6IDE2LWJpdCwgTVNCIGp1c3RpZmllZCBkYXRhIHRvIHdyaXRlLgorICoKKyAqIFdhaXQgZm9yIGEgZnJlZSBlbnRyeSBpbiB0aGUgU1NQIHRyYW5zbWl0IEZJRk8sIGFuZCB3cml0ZSBhIGRhdGEKKyAqIHdvcmQgdG8gdGhlIFNTUCBwb3J0LiAgV2FpdCBmb3IgdGhlIFNTUCBwb3J0IHRvIHN0YXJ0IHNlbmRpbmcKKyAqIHRoZSBkYXRhLgorICoKKyAqIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcuCisgKgorICogUmV0dXJuczoKKyAqICAgJS1FVElNRURPVVQJdGltZW91dCBvY2N1cnJlZCAoZm9yIGZ1dHVyZSkKKyAqICAgMAkJCXN1Y2Nlc3MKKyAqLworaW50IHNzcF93cml0ZV93b3JkKHUxNiBkYXRhKQoreworCXdoaWxlICghKFNlcjRTU1NSICYgU1NTUl9UTkYpKQorCQljcHVfcmVsYXgoKTsKKworCVNlcjRTU0RSID0gZGF0YTsKKworCXdoaWxlICghKFNlcjRTU1NSICYgU1NTUl9CU1kpKQorCQljcHVfcmVsYXgoKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNzcF9yZWFkX3dvcmQgLSByZWFkIGEgd29yZCBmcm9tIHRoZSBTU1AgcG9ydAorICoKKyAqIFdhaXQgZm9yIGEgZGF0YSB3b3JkIGluIHRoZSBTU1AgcmVjZWl2ZSBGSUZPLCBhbmQgcmV0dXJuIHRoZQorICogcmVjZWl2ZWQgZGF0YS4gIERhdGEgaXMgTFNCIGp1c3RpZmllZC4KKyAqCisgKiBOb3RlOiBDdXJyZW50bHksIGlmIGRhdGEgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHJlY2VpdmVkLCB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGV2ZXIuCisgKgorICogVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgbG9ja2luZy4KKyAqCisgKiBSZXR1cm5zOgorICogICAlLUVUSU1FRE9VVAl0aW1lb3V0IG9jY3VycmVkIChmb3IgZnV0dXJlKQorICogICAxNi1iaXQgZGF0YQlzdWNjZXNzCisgKi8KK2ludCBzc3BfcmVhZF93b3JkKHZvaWQpCit7CisJd2hpbGUgKCEoU2VyNFNTU1IgJiBTU1NSX1JORSkpCisJCWNwdV9yZWxheCgpOworCisJcmV0dXJuIFNlcjRTU0RSOworfQorCisvKioKKyAqIHNzcF9mbHVzaCAtIGZsdXNoIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBGSUZPcworICoKKyAqIFdhaXQgZm9yIHRoZSBTU1AgdG8gaWRsZSwgYW5kIGVuc3VyZSB0aGF0IHRoZSByZWNlaXZlIEZJRk8KKyAqIGlzIGVtcHR5LgorICoKKyAqIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcuCisgKi8KK3ZvaWQgc3NwX2ZsdXNoKHZvaWQpCit7CisJZG8geworCQl3aGlsZSAoU2VyNFNTU1IgJiBTU1NSX1JORSkgeworCQkJKHZvaWQpIFNlcjRTU0RSOworCQl9CisJfSB3aGlsZSAoU2VyNFNTU1IgJiBTU1NSX0JTWSk7Cit9CisKKy8qKgorICogc3NwX2VuYWJsZSAtIGVuYWJsZSB0aGUgU1NQIHBvcnQKKyAqCisgKiBUdXJuIG9uIHRoZSBTU1AgcG9ydC4KKyAqLwordm9pZCBzc3BfZW5hYmxlKHZvaWQpCit7CisJU2VyNFNTQ1IwIHw9IFNTQ1IwX1NTRTsKK30KKworLyoqCisgKiBzc3BfZGlzYWJsZSAtIHNodXQgZG93biB0aGUgU1NQIHBvcnQKKyAqCisgKiBUdXJuIG9mZiB0aGUgU1NQIHBvcnQsIG9wdGlvbmFsbHkgcG93ZXJpbmcgaXQgZG93bi4KKyAqLwordm9pZCBzc3BfZGlzYWJsZSh2b2lkKQoreworCVNlcjRTU0NSMCAmPSB+U1NDUjBfU1NFOworfQorCisvKioKKyAqIHNzcF9zYXZlX3N0YXRlIC0gc2F2ZSB0aGUgU1NQIGNvbmZpZ3VyYXRpb24KKyAqIEBzc3A6IHBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIHNhdmUgU1NQIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBTYXZlIHRoZSBjb25maWd1cmVkIFNTUCBzdGF0ZSBmb3Igc3VzcGVuZC4KKyAqLwordm9pZCBzc3Bfc2F2ZV9zdGF0ZShzdHJ1Y3Qgc3NwX3N0YXRlICpzc3ApCit7CisJc3NwLT5jcjAgPSBTZXI0U1NDUjA7CisJc3NwLT5jcjEgPSBTZXI0U1NDUjE7CisKKwlTZXI0U1NDUjAgJj0gflNTQ1IwX1NTRTsKK30KKworLyoqCisgKiBzc3BfcmVzdG9yZV9zdGF0ZSAtIHJlc3RvcmUgYSBwcmV2aW91c2x5IHNhdmVkIFNTUCBjb25maWd1cmF0aW9uCisgKiBAc3NwOiBwb2ludGVyIHRvIGNvbmZpZ3VyYXRpb24gc2F2ZWQgYnkgc3NwX3NhdmVfc3RhdGUKKyAqCisgKiBSZXN0b3JlIHRoZSBTU1AgY29uZmlndXJhdGlvbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHNzcF9zYXZlX3N0YXRlLgorICovCit2b2lkIHNzcF9yZXN0b3JlX3N0YXRlKHN0cnVjdCBzc3Bfc3RhdGUgKnNzcCkKK3sKKwlTZXI0U1NTUiA9IFNTU1JfUk9SOworCisJU2VyNFNTQ1IwID0gc3NwLT5jcjAgJiB+U1NDUjBfU1NFOworCVNlcjRTU0NSMSA9IHNzcC0+Y3IxOworCVNlcjRTU0NSMCA9IHNzcC0+Y3IwOworfQorCisvKioKKyAqIHNzcF9pbml0IC0gc2V0dXAgdGhlIFNTUCBwb3J0CisgKgorICogaW5pdGlhbGlzZSBhbmQgY2xhaW0gcmVzb3VyY2VzIGZvciB0aGUgU1NQIHBvcnQuCisgKgorICogUmV0dXJuczoKKyAqICAgJS1FTk9ERVYJaWYgdGhlIFNTUCBwb3J0IGlzIHVuYXZhaWxhYmxlCisgKiAgICUtRUJVU1kJaWYgdGhlIHJlc291cmNlcyBhcmUgYWxyZWFkeSBpbiB1c2UKKyAqICAgJTAJCW9uIHN1Y2Nlc3MKKyAqLworaW50IHNzcF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghKFBQQVIgJiBQUEFSX1NQUikgJiYgKFNlcjRNQ0NSMCAmIE1DQ1IwX01DRSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oX19QUkVHKFNlcjRTU0NSMCksIDB4MTgsICJTU1AiKSkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCVNlcjRTU1NSID0gU1NTUl9ST1I7CisKKwlyZXQgPSByZXF1ZXN0X2lycShJUlFfU2VyNFNTUCwgc3NwX2ludGVycnVwdCwgMCwgIlNTUCIsIE5VTEwpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3JlZ2lvbjsKKworCXJldHVybiAwOworCisgb3V0X3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNlcjRTU0NSMCksIDB4MTgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3NwX2V4aXQgLSB1bmRvIHRoZSBlZmZlY3RzIG9mIHNzcF9pbml0CisgKgorICogcmVsZWFzZSBhbmQgZnJlZSByZXNvdXJjZXMgZm9yIHRoZSBTU1AgcG9ydC4KKyAqLwordm9pZCBzc3BfZXhpdCh2b2lkKQoreworCVNlcjRTU0NSMCAmPSB+U1NDUjBfU1NFOworCisJZnJlZV9pcnEoSVJRX1NlcjRTU1AsIE5VTEwpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU2VyNFNTQ1IwKSwgMHgxOCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQTExeDAgU1NQIFBJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChzc3Bfd3JpdGVfd29yZCk7CitFWFBPUlRfU1lNQk9MKHNzcF9yZWFkX3dvcmQpOworRVhQT1JUX1NZTUJPTChzc3BfZmx1c2gpOworRVhQT1JUX1NZTUJPTChzc3BfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0woc3NwX2Rpc2FibGUpOworRVhQT1JUX1NZTUJPTChzc3Bfc2F2ZV9zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKHNzcF9yZXN0b3JlX3N0YXRlKTsKK0VYUE9SVF9TWU1CT0woc3NwX2luaXQpOworRVhQT1JUX1NZTUJPTChzc3BfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliMGMwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEZWJvcmFoIFdhbGxhY2guCisgKiBUd2lkZGxlcyAgKEMpIDE5OTkgCUh1Z28gRmllbm5lcyA8aHVnb0BlbXBlZy5jb20+CisgKiAKKyAqIDIwMDAvMDMvMjkgKEMpIE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqCVJld3JpdHRlbjogYmlnIGNsZWFudXAsIG11Y2ggc2ltcGxlciwgYmV0dGVyIEhaIGFjY3VyYWN5LgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgUlRDX0RFRl9ESVZJREVSCQkoMzI3NjggLSAxKQorI2RlZmluZSBSVENfREVGX1RSSU0gICAgICAgICAgICAwCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBzYTExMDBfZ2V0X3J0Y190aW1lKHZvaWQpCit7CisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCB3ZSBzaG91bGQgYmUgYWJsZSB0byBsZXQgUlRUUiBiZSB6ZXJvCisJICogYW5kIHRoZW4gYSBkZWZhdWx0IGRpdmlzZXIgZm9yIGEgMzIuNzY4S0h6IGNsb2NrIGlzIHVzZWQuCisJICogQXBwYXJlbnRseSB0aGlzIGRvZXNuJ3Qgd29yaywgYXQgbGVhc3QgZm9yIG15IFNBMTExMCByZXYgNS4KKwkgKiBJZiB0aGUgY2xvY2sgZGl2aWRlciBpcyB1bmluaXRpYWxpemVkIHRoZW4gcmVzZXQgaXQgdG8gdGhlCisJICogZGVmYXVsdCB2YWx1ZSB0byBnZXQgdGhlIDFIeiBjbG9jay4KKwkgKi8KKwlpZiAoUlRUUiA9PSAwKSB7CisJCVJUVFIgPSBSVENfREVGX0RJVklERVIgKyAoUlRDX0RFRl9UUklNIDw8IDE2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogdW5pbml0aWFsaXplZCBSZWFsIFRpbWUgQ2xvY2tcbiIpOworCQkvKiBUaGUgY3VycmVudCBSVEMgdmFsdWUgcHJvYmFibHkgZG9lc24ndCBtYWtlIHNlbnNlIGVpdGhlciAqLworCQlSQ05SID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBSQ05SOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9zZXRfcnRjKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUgPSB4dGltZS50dl9zZWM7CisKKwlpZiAoUlRTUiAmIFJUU1JfQUxFKSB7CisJCS8qIG1ha2Ugc3VyZSBub3QgdG8gZm9yd2FyZCB0aGUgY2xvY2sgb3ZlciBhbiBhbGFybSAqLworCQl1bnNpZ25lZCBsb25nIGFsYXJtID0gUlRBUjsKKwkJaWYgKGN1cnJlbnRfdGltZSA+PSBhbGFybSAmJiBhbGFybSA+PSBSQ05SKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJUkNOUiA9IGN1cnJlbnRfdGltZTsKKwlyZXR1cm4gMDsKK30KKworLyogSVJRcyBhcmUgZGlzYWJsZWQgYmVmb3JlIGVudGVyaW5nIGhlcmUgZnJvbSBkb19nZXR0aW1lb2ZkYXkoKSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2ExMTAwX2dldHRpbWVvZmZzZXQgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrc190b19tYXRjaCwgZWxhcHNlZCwgdXNlYzsKKworCS8qIEdldCB0aWNrcyBiZWZvcmUgbmV4dCB0aW1lciBtYXRjaCAqLworCXRpY2tzX3RvX21hdGNoID0gT1NNUjAgLSBPU0NSOworCisJLyogV2UgbmVlZCBlbGFwc2VkIHRpY2tzIHNpbmNlIGxhc3QgbWF0Y2ggKi8KKwllbGFwc2VkID0gTEFUQ0ggLSB0aWNrc190b19tYXRjaDsKKworCS8qIE5vdyBjb252ZXJ0IHRoZW0gdG8gdXNlYyAqLworCXVzZWMgPSAodW5zaWduZWQgbG9uZykoZWxhcHNlZCAqICh0aWNrX25zZWMgLyAxMDAwKSkvTEFUQ0g7CisKKwlyZXR1cm4gdXNlYzsKK30KKworLyoKKyAqIFdlIHdpbGwgYmUgZW50ZXJlZCB3aXRoIElSUXMgZW5hYmxlZC4KKyAqCisgKiBMb29wIHVudGlsIHdlIGdldCBhaGVhZCBvZiB0aGUgZnJlZSBydW5uaW5nIHRpbWVyLgorICogVGhpcyBlbnN1cmVzIGFuIGV4YWN0IGNsb2NrIHRpY2sgY291bnQgYW5kIHRpbWUgYWNjdXJhY3kuCisgKiBJUlFzIGFyZSBkaXNhYmxlZCBpbnNpZGUgdGhlIGxvb3AgdG8gZW5zdXJlIGNvaGVyZW5jZSBiZXR3ZWVuCisgKiBsb3N0X3RpY2tzICh1cGRhdGVkIGluIGRvX3RpbWVyKCkpIGFuZCB0aGUgbWF0Y2ggcmVnIHZhbHVlLCBzbyB3ZQorICogY2FuIHVzZSBkb19nZXR0aW1lb2ZkYXkoKSBmcm9tIGludGVycnVwdCBoYW5kbGVycy4KKyAqLworc3RhdGljIGlycXJldHVybl90CitzYTExMDBfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG5leHRfbWF0Y2g7CisKKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKworCWRvIHsKKwkJdGltZXJfdGljayhyZWdzKTsKKwkJT1NTUiA9IE9TU1JfTTA7ICAvKiBDbGVhciBtYXRjaCBvbiB0aW1lciAwICovCisJCW5leHRfbWF0Y2ggPSAoT1NNUjAgKz0gTEFUQ0gpOworCX0gd2hpbGUgKChzaWduZWQgbG9uZykobmV4dF9tYXRjaCAtIE9TQ1IpIDw9IDApOworCisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gc2ExMTAwX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiU0ExMXh4IFRpbWVyIFRpY2siLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBzYTExMDBfdGltZXJfaW50ZXJydXB0Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc2ExMTAwX3RpbWVyX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHY7CisKKwlzZXRfcnRjID0gc2ExMTAwX3NldF9ydGM7CisKKwl0di50dl9uc2VjID0gMDsKKwl0di50dl9zZWMgPSBzYTExMDBfZ2V0X3J0Y190aW1lKCk7CisJZG9fc2V0dGltZW9mZGF5KCZ0dik7CisKKwlPU01SMCA9IDA7CQkvKiBzZXQgaW5pdGlhbCBtYXRjaCBhdCAwICovCisJT1NTUiA9IDB4ZjsJCS8qIGNsZWFyIHN0YXR1cyBvbiBhbGwgdGltZXJzICovCisJc2V0dXBfaXJxKElSUV9PU1QwLCAmc2ExMTAwX3RpbWVyX2lycSk7CisJT0lFUiB8PSBPSUVSX0UwOwkvKiBlbmFibGUgbWF0Y2ggb24gdGltZXIgMCB0byBjYXVzZSBpbnRlcnJ1cHRzICovCisJT1NDUiA9IDA7CQkvKiBpbml0aWFsaXplIGZyZWUtcnVubmluZyB0aW1lciwgZm9yY2UgZmlyc3QgbWF0Y2ggKi8KK30KKworI2lmZGVmIENPTkZJR19QTQordW5zaWduZWQgbG9uZyBvc21yWzRdLCBvaWVyOworCitzdGF0aWMgdm9pZCBzYTExMDBfdGltZXJfc3VzcGVuZCh2b2lkKQoreworCW9zbXJbMF0gPSBPU01SMDsKKwlvc21yWzFdID0gT1NNUjE7CisJb3NtclsyXSA9IE9TTVIyOworCW9zbXJbM10gPSBPU01SMzsKKwlvaWVyID0gT0lFUjsKK30KKworc3RhdGljIHZvaWQgc2ExMTAwX3RpbWVyX3Jlc3VtZSh2b2lkKQoreworCU9TU1IgPSAweDBmOworCU9TTVIwID0gb3NtclswXTsKKwlPU01SMSA9IG9zbXJbMV07CisJT1NNUjIgPSBvc21yWzJdOworCU9TTVIzID0gb3NtclszXTsKKwlPSUVSID0gb2llcjsKKworCS8qCisJICogT1NNUjAgaXMgdGhlIHN5c3RlbSB0aW1lcjogbWFrZSBzdXJlIE9TQ1IgaXMgc3VmZmljaWVudGx5IGJlaGluZAorCSAqLworCU9TQ1IgPSBPU01SMCAtIExBVENIOworfQorI2Vsc2UKKyNkZWZpbmUgc2ExMTAwX3RpbWVyX3N1c3BlbmQgTlVMTAorI2RlZmluZSBzYTExMDBfdGltZXJfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdHJ1Y3Qgc3lzX3RpbWVyIHNhMTEwMF90aW1lciA9IHsKKwkuaW5pdAkJPSBzYTExMDBfdGltZXJfaW5pdCwKKwkuc3VzcGVuZAk9IHNhMTEwMF90aW1lcl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2ExMTAwX3RpbWVyX3Jlc3VtZSwKKwkub2Zmc2V0CQk9IHNhMTEwMF9nZXR0aW1lb2Zmc2V0LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXNoYXJrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmU5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CQkJOj0gY29yZS5vIGRtYS5vIGlycS5vIHBjaS5vCitvYmotbQkJCTo9CitvYmotbgkJCTo9CitvYmotCQkJOj0KKworb2JqLSQoQ09ORklHX0xFRFMpCSs9IGxlZHMubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1zaGFyay9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjBmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSwyIEBACisgICB6cmVsYWRkci15CTo9IDB4MDgwMDgwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWJjNWQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1zaGFyay9hcmNoLmMKKyAqCisgKiAgQXJjaGl0ZWN0dXJlIHNwZWNpZmljIHN0dWZmLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5pb2Jhc2UJCT0gMHgzZjgsCisJCS5pcnEJCT0gNCwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAorCQkucmVnc2hpZnQJPSAyLAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsKKwkJLmlvYmFzZQkJPSAweDJmOCwKKwkJLmlycQkJPSAzLAorCQkudWFydGNsawk9IDE4NDMyMDAsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5pb3R5cGUJCT0gVVBJT19QT1JULAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYXJrX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKG1hY2hpbmVfaXNfc2hhcmsoKSkKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK2FyY2hfaW5pdGNhbGwoc2hhcmtfaW5pdCk7CisKK2V4dGVybiB2b2lkIHNoYXJrX2luaXRfaXJxKHZvaWQpOworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHNoYXJrX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsgSU9fQkFTRQksIElPX1NUQVJUCSwgSU9fU0laRQksIE1UX0RFVklDRSB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc2hhcmtfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KHNoYXJrX2lvX2Rlc2MsIEFSUkFZX1NJWkUoc2hhcmtfaW9fZGVzYykpOworfQorCisjZGVmaW5lIElSUV9USU1FUiAwCisjZGVmaW5lIEhaX1RJTUUgKCgxMTkzMTgwICsgSFovMikgLyBIWikKKworc3RhdGljIGlycXJldHVybl90CitzaGFya190aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwl0aW1lcl90aWNrKHJlZ3MpOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBzaGFya190aW1lcl9pcnEgPSB7CisJLm5hbWUJCT0gIlNoYXJrIFRpbWVyIFRpY2siLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBzaGFya190aW1lcl9pbnRlcnJ1cHQKK307CisKKy8qCisgKiBTZXQgdXAgdGltZXIgaW50ZXJydXB0LCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNoYXJrX3RpbWVyX2luaXQodm9pZCkKK3sKKwlvdXRiKDB4MzQsIDB4NDMpOyAgICAgICAgICAgICAgIC8qIGJpbmFyeSwgbW9kZSAwLCBMU0IvTVNCLCBDaCAwICovCisJb3V0YihIWl9USU1FICYgMHhmZiwgMHg0MCk7ICAgICAvKiBMU0Igb2YgY291bnQgKi8KKwlvdXRiKEhaX1RJTUUgPj4gOCwgMHg0MCk7CisKKwlzZXR1cF9pcnEoSVJRX1RJTUVSLCAmc2hhcmtfdGltZXJfaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgc2hhcmtfdGltZXIgPSB7CisJLmluaXQJCT0gc2hhcmtfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoU0hBUkssICJTaGFyayIpCisJTUFJTlRBSU5FUigiQWxleGFuZGVyIFNjaHVseiIpCisJQk9PVF9NRU0oMHgwODAwMDAwMCwgMHg0MDAwMDAwMCwgMHhlMDAwMDAwMCkKKwlCT09UX1BBUkFNUygweDA4MDAzMDAwKQorCU1BUElPKHNoYXJrX21hcF9pbykKKwlJTklUSVJRKHNoYXJrX2luaXRfaXJxKQorCS50aW1lcgkJPSAmc2hhcmtfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9kbWEuYyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1OTg5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvZG1hLmMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXNoYXJrL2RtYS5jCisgKgorICogIGJ5IEFsZXhhbmRlciBTY2h1bHoKKyAqCisgKiAgZGVyaXZlZCBmcm9tOgorICogIGFyY2gvYXJtL2tlcm5lbC9kbWEtZWJzYTI4NS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFBoaWwgQmx1bmRlbGwKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2RtYS5oPgorCit2b2lkIF9faW5pdCBhcmNoX2RtYV9pbml0KGRtYV90ICpkbWEpCit7CisjaWZkZWYgQ09ORklHX0lTQV9ETUEKKwlpc2FfaW5pdF9kbWEoZG1hKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9pcnEuYyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiNjdiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaXJxLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1zaGFyay9pcnEuYworICoKKyAqIGJ5IEFsZXhhbmRlciBTY2h1bHoKKyAqCisgKiBkZXJpdmVkIGZyb20gbGludXgvYXJjaC9wcGMva2VybmVsL2k4MjU5LmMgYW5kOgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTExMC9pcnEuaAorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggUnVzc2VsbCBLaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisvKgorICogODI1OUEgUElDIGZ1bmN0aW9ucyB0byBoYW5kbGUgSVNBIGRldmljZXM6CisgKi8KKworLyoKKyAqIFRoaXMgY29udGFpbnMgdGhlIGlycSBtYXNrIGZvciBib3RoIDgyNTlBIGlycSBjb250cm9sbGVycywKKyAqIExldCB0aHJvdWdoIHRoZSBjYXNjYWRlLWludGVycnVwdCBuby4gMiAoZmYtKDE8PDIpPT1mYikKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FjaGVkX2lycV9tYXNrWzJdID0geyAweGZiLCAweGZmIH07CisKKy8qCisgKiBUaGVzZSBoYXZlIHRvIGJlIHByb3RlY3RlZCBieSB0aGUgaXJxIGNvbnRyb2xsZXIgc3BpbmxvY2sKKyAqIGJlZm9yZSBiZWluZyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNoYXJrX2Rpc2FibGVfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IG1hc2s7CisJaWYgKGlycTw4KSB7CisJICBtYXNrID0gMSA8PCBpcnE7CisJICBjYWNoZWRfaXJxX21hc2tbMF0gfD0gbWFzazsKKwkgIG91dGIoY2FjaGVkX2lycV9tYXNrWzFdLDB4QTEpOworCX0gZWxzZSB7CisJICBtYXNrID0gMSA8PCAoaXJxLTgpOworCSAgY2FjaGVkX2lycV9tYXNrWzFdIHw9IG1hc2s7CisJICBvdXRiKGNhY2hlZF9pcnFfbWFza1swXSwweDIxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNoYXJrX2VuYWJsZV84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlpZiAoaXJxPDgpIHsKKwkgIG1hc2sgPSB+KDEgPDwgaXJxKTsKKwkgIGNhY2hlZF9pcnFfbWFza1swXSAmPSBtYXNrOworCSAgb3V0YihjYWNoZWRfaXJxX21hc2tbMF0sMHgyMSk7CisJfSBlbHNlIHsKKwkgIG1hc2sgPSB+KDEgPDwgKGlycS04KSk7CisJICBjYWNoZWRfaXJxX21hc2tbMV0gJj0gbWFzazsKKwkgIG91dGIoY2FjaGVkX2lycV9tYXNrWzFdLDB4QTEpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hhcmtfYWNrXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKXt9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBib2d1c19pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoIkdvdCBpbnRlcnJ1cHQgJWkhXG4iLGlycSk7CisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjYXNjYWRlOworCitzdGF0aWMgc3RydWN0IGlycWNoaXAgZmJfY2hpcCA9IHsKKwkuYWNrCT0gc2hhcmtfYWNrXzgyNTlBX2lycSwKKwkubWFzawk9IHNoYXJrX2Rpc2FibGVfODI1OUFfaXJxLAorCS51bm1hc2sgPSBzaGFya19lbmFibGVfODI1OUFfaXJxLAorfTsKKwordm9pZCBfX2luaXQgc2hhcmtfaW5pdF9pcnEodm9pZCkKK3sKKwlpbnQgaXJxOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXAoaXJxLCAmZmJfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwl9CisKKwkvKiBpbml0IG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCW91dGIoMHgxMSwgMHgyMCk7IC8qIFN0YXJ0IGluaXQgc2VxdWVuY2UsIGVkZ2UgdHJpZ2dlcmVkIChsZXZlbDogMHgxOSkqLworCW91dGIoMHgwMCwgMHgyMSk7IC8qIFZlY3RvciBiYXNlICovCisJb3V0YigweDA0LCAweDIxKTsgLyogQ2FzY2FkZSAoc2xhdmUpIG9uIElSUTIgKi8KKwlvdXRiKDB4MDMsIDB4MjEpOyAvKiBTZWxlY3QgODA4NiBtb2RlICwgYXV0byBlb2kqLworCW91dGIoMHgwQSwgMHgyMCk7CisJLyogaW5pdCBzbGF2ZSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCW91dGIoMHgxMSwgMHhBMCk7IC8qIFN0YXJ0IGluaXQgc2VxdWVuY2UsIGVkZ2UgdHJpZ2dlcmVkICovCisJb3V0YigweDA4LCAweEExKTsgLyogVmVjdG9yIGJhc2UgKi8KKwlvdXRiKDB4MDIsIDB4QTEpOyAvKiBDYXNjYWRlIChzbGF2ZSkgb24gSVJRMiAqLworCW91dGIoMHgwMywgMHhBMSk7IC8qIFNlbGVjdCA4MDg2IG1vZGUsIGF1dG8gZW9pICovCisJb3V0YigweDBBLCAweEEwKTsKKwlvdXRiKGNhY2hlZF9pcnFfbWFza1sxXSwweEExKTsKKwlvdXRiKGNhY2hlZF9pcnFfbWFza1swXSwweDIxKTsKKwkvL3JlcXVlc3RfcmVnaW9uKDB4MjAsMHgyLCJwaWMxIik7CisJLy9yZXF1ZXN0X3JlZ2lvbigweEEwLDB4MiwicGljMiIpOworCisJY2FzY2FkZS5oYW5kbGVyID0gYm9ndXNfaW50OworCWNhc2NhZGUubmFtZSA9ICJjYXNjYWRlIjsKKwlzZXR1cF9pcnEoMiwmY2FzY2FkZSk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9sZWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkZWI3MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvbGVkcy5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogYXJjaC9hcm0va2VybmVsL2xlZHMtc2hhcmsuYworICogYnkgQWxleGFuZGVyIFNjaHVsegorICoKKyAqIGRlcml2ZWQgZnJvbToKKyAqIGFyY2gvYXJtL2tlcm5lbC9sZWRzLWZvb3RicmlkZ2UuYworICogQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogRElHSVRBTCBTaGFyayBMRUQgY29udHJvbCByb3V0aW5lcy4KKyAqCisgKiBUaGUgbGVkcyB1c2UgaXMgYXMgZm9sbG93czoKKyAqICAtIEdyZWVuIGZyb250IC0gdG9nZ2xlcyBzdGF0ZSBldmVyeSA1MCB0aW1lciBpbnRlcnJ1cHRzCisgKiAgLSBBbWJlciBmcm9udCAtIFVudXNlZCwgdGhpcyBpcyBhIGR1YWwgY29sb3IgbGVkIChBbWJlci9HcmVlbikKKyAqICAtIEFtYmVyIGJhY2sgIC0gT24gaWYgc3lzdGVtIGlzIG5vdCBpZGxlCisgKgorICogQ2hhbmdlbG9nOgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCisjZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKK3N0YXRpYyBjaGFyIGxlZF9zdGF0ZTsKK3N0YXRpYyBzaG9ydCBod19sZWRfc3RhdGU7CitzdGF0aWMgc2hvcnQgc2F2ZWRfc3RhdGU7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobGVkc19sb2NrKTsKKworc2hvcnQgc2VxdW9pYV9yZWFkKGludCBhZGRyKSB7CisgIG91dHcoYWRkciwweDI0KTsKKyAgcmV0dXJuIGludygweDI2KTsKK30KKwordm9pZCBzZXF1b2lhX3dyaXRlKHNob3J0IHZhbHVlLHNob3J0IGFkZHIpIHsKKyAgb3V0dyhhZGRyLDB4MjQpOworICBvdXR3KHZhbHVlLDB4MjYpOworfQorCitzdGF0aWMgdm9pZCBzZXF1b2lhX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGVkc19sb2NrLCBmbGFncyk7CisKKwlod19sZWRfc3RhdGUgPSBzZXF1b2lhX3JlYWQoMHgwOSk7CisKKwlzd2l0Y2ggKGV2dCkgeworCWNhc2UgbGVkX3N0YXJ0OgorCQlod19sZWRfc3RhdGUgfD0gU0VRVU9JQV9MRURfR1JFRU47CisJCWh3X2xlZF9zdGF0ZSB8PSBTRVFVT0lBX0xFRF9BTUJFUjsKKyNpZmRlZiBDT05GSUdfTEVEU19DUFUKKwkJaHdfbGVkX3N0YXRlIHw9IFNFUVVPSUFfTEVEX0JBQ0s7CisjZWxzZQorCQlod19sZWRfc3RhdGUgJj0gflNFUVVPSUFfTEVEX0JBQ0s7CisjZW5kaWYKKwkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9FTkFCTEVEOworCQlicmVhazsKKworCWNhc2UgbGVkX3N0b3A6CisJCWh3X2xlZF9zdGF0ZSAmPSB+U0VRVU9JQV9MRURfQkFDSzsKKwkJaHdfbGVkX3N0YXRlIHw9IFNFUVVPSUFfTEVEX0dSRUVOOworCQlod19sZWRfc3RhdGUgfD0gU0VRVU9JQV9MRURfQU1CRVI7CisJCWxlZF9zdGF0ZSAmPSB+TEVEX1NUQVRFX0VOQUJMRUQ7CisJCWJyZWFrOworCisJY2FzZSBsZWRfY2xhaW06CisJCWxlZF9zdGF0ZSB8PSBMRURfU1RBVEVfQ0xBSU1FRDsKKwkJc2F2ZWRfc3RhdGUgPSBod19sZWRfc3RhdGU7CisJCWh3X2xlZF9zdGF0ZSAmPSB+U0VRVU9JQV9MRURfQkFDSzsKKwkJaHdfbGVkX3N0YXRlIHw9IFNFUVVPSUFfTEVEX0dSRUVOOworCQlod19sZWRfc3RhdGUgfD0gU0VRVU9JQV9MRURfQU1CRVI7CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVsZWFzZToKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKKwkJaHdfbGVkX3N0YXRlID0gc2F2ZWRfc3RhdGU7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKKwljYXNlIGxlZF90aW1lcjoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlIF49IFNFUVVPSUFfTEVEX0dSRUVOOworCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xFRFNfQ1BVCisJY2FzZSBsZWRfaWRsZV9zdGFydDoKKwkJaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKQorCQkJaHdfbGVkX3N0YXRlICY9IH5TRVFVT0lBX0xFRF9CQUNLOworCQlicmVhazsKKworCWNhc2UgbGVkX2lkbGVfZW5kOgorCQlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpCisJCQlod19sZWRfc3RhdGUgfD0gU0VRVU9JQV9MRURfQkFDSzsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgbGVkX2dyZWVuX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gflNFUVVPSUFfTEVEX0dSRUVOOworCQlicmVhazsKKworCWNhc2UgbGVkX2dyZWVuX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IFNFUVVPSUFfTEVEX0dSRUVOOworCQlicmVhazsKKworCWNhc2UgbGVkX2FtYmVyX29uOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gflNFUVVPSUFfTEVEX0FNQkVSOworCQlicmVhazsKKworCWNhc2UgbGVkX2FtYmVyX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IFNFUVVPSUFfTEVEX0FNQkVSOworCQlicmVhazsKKworCWNhc2UgbGVkX3JlZF9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IFNFUVVPSUFfTEVEX0JBQ0s7CisJCWJyZWFrOworCisJY2FzZSBsZWRfcmVkX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH5TRVFVT0lBX0xFRF9CQUNLOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmICAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpCisJCXNlcXVvaWFfd3JpdGUoaHdfbGVkX3N0YXRlLDB4MDkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVkc19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxlZHNfaW5pdCh2b2lkKQoreworCWV4dGVybiB2b2lkICgqbGVkc19ldmVudCkobGVkX2V2ZW50X3QpOworCXNob3J0IHRlbXA7CisJCisJbGVkc19ldmVudCA9IHNlcXVvaWFfbGVkc19ldmVudDsKKworCS8qIE1ha2UgTEVEcyBpbmRlcGVuZGVudCBvZiBwb3dlci1zdGF0ZSAqLworCXJlcXVlc3RfcmVnaW9uKDB4MjQsNCwic2VxdW9pYSIpOworCXRlbXAgPSBzZXF1b2lhX3JlYWQoMHgwOSk7CisJdGVtcCB8PSAxPDwxMDsKKwlzZXF1b2lhX3dyaXRlKHRlbXAsMHgwOSk7CisJbGVkc19ldmVudChsZWRfc3RhcnQpOworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKGxlZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E3MTEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9wY2kuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtc2hhcmsvcGNpLmMKKyAqCisgKiAgUENJIGJpb3MtdHlwZSBpbml0aWFsaXNhdGlvbiBmb3IgUENJIG1hY2hpbmVzCisgKgorICogIEJpdHMgdGFrZW4gZnJvbSB2YXJpb3VzIHBsYWNlcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCitzdGF0aWMgaW50IF9faW5pdCBzaGFya19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoZGV2LT5idXMtPm51bWJlciA9PSAwKQorCQlpZiAoZGV2LT5kZXZmbiA9PSAwKSByZXR1cm4gMjU1OworCQllbHNlIHJldHVybiAxMTsKKwllbHNlIHJldHVybiAyNTU7Cit9CisKK2V4dGVybiB2b2lkIF9faW5pdCB2aWE4MmM1MDVfcHJlaW5pdCh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBod19wY2kgc2hhcmtfcGNpIF9faW5pdGRhdGEgPSB7CisJLnNldHVwCQk9IHZpYTgyYzUwNV9zZXR1cCwKKwkuc3dpenpsZSAgICAgCT0gcGNpX3N0ZF9zd2l6emxlLAorCS5tYXBfaXJxCT0gc2hhcmtfbWFwX2lycSwKKwkubnJfY29udHJvbGxlcnMgPSAxLAorCS5zY2FuCQk9IHZpYTgyYzUwNV9zY2FuX2J1cywKKwkucHJlaW5pdAk9IHZpYTgyYzUwNV9wcmVpbml0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2hhcmtfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19zaGFyaygpKQorCQlwY2lfY29tbW9uX2luaXQoJnNoYXJrX3BjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChzaGFya19wY2lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDc4N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZwpAQCAtMCwwICsxLDE2IEBACittZW51ICJWZXJzYXRpbGUgcGxhdGZvcm0gdHlwZSIKKwlkZXBlbmRzIG9uIEFSQ0hfVkVSU0FUSUxFCisKK2NvbmZpZyBBUkNIX1ZFUlNBVElMRV9QQgorCWJvb2wgIlN1cHBvcnQgVmVyc2F0aWxlL1BCIHBsYXRmb3JtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBWZXJzYXRpbGUvUEIgcGxhdGZvcm0uCisKK2NvbmZpZyBNQUNIX1ZFUlNBVElMRV9BQgorCWJvb2wgIlN1cHBvcnQgVmVyc2F0aWxlL0FCIHBsYXRmb3JtIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBWZXJzYXRpbGUvQVAgcGxhdGZvcm0uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2MDg4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworb2JqLXkJCQkJCTo9IGNvcmUubyBjbG9jay5vCitvYmotJChDT05GSUdfQVJDSF9WRVJTQVRJTEVfUEIpCQkrPSB2ZXJzYXRpbGVfcGIubworb2JqLSQoQ09ORklHX01BQ0hfVkVSU0FUSUxFX0FCKQkJKz0gdmVyc2F0aWxlX2FiLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTc1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsNCBAQAorICAgenJlbGFkZHIteQk6PSAweDAwMDA4MDAwCitwYXJhbXNfcGh5cy15CTo9IDB4MDAwMDAxMDAKK2luaXRyZF9waHlzLXkJOj0gMHgwMDgwMDAwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODAyNWMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY2xvY2suYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZC4KKyAqICBXcml0dGVuIGJ5IERlZXAgQmx1ZSBTb2x1dGlvbnMgTGltaXRlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2ljc3QzMDcuaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisKK3N0YXRpYyBMSVNUX0hFQUQoY2xvY2tzKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGNsb2Nrc19zZW0pOworCitzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCit7CisJc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CisKKwlkb3duKCZjbG9ja3Nfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKKwkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKKwkJCWNsayA9IHA7CisJCQlicmVhazsKKwkJfQorCX0KKwl1cCgmY2xvY2tzX3NlbSk7CisKKwlyZXR1cm4gY2xrOworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKKwordm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwltb2R1bGVfcHV0KGNsay0+b3duZXIpOworfQorRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKKworaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKKwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKKworaW50IGNsa191c2Uoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfdXNlKTsKKwordm9pZCBjbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQoreworfQorRVhQT1JUX1NZTUJPTChjbGtfdW51c2UpOworCit1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKKworbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gcmF0ZTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3JvdW5kX3JhdGUpOworCitpbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCByZXQgPSAtRUlPOworCisJaWYgKGNsay0+c2V0dmNvKSB7CisJCXN0cnVjdCBpY3N0MzA3X3ZjbyB2Y287CisKKwkJdmNvID0gaWNzdDMwN19raHpfdG9fdmNvKGNsay0+cGFyYW1zLCByYXRlIC8gMTAwMCk7CisJCWNsay0+cmF0ZSA9IGljc3QzMDdfa2h6KGNsay0+cGFyYW1zLCB2Y28pICogMTAwMDsKKworCQlwcmludGsoIkNsb2NrICVzOiBzZXR0aW5nIFZDTyByZWcgcGFyYW1zOiBTPSVkIFI9JWQgVj0lZFxuIiwKKwkJCWNsay0+bmFtZSwgdmNvLnMsIHZjby5yLCB2Y28udik7CisKKwkJY2xrLT5zZXR2Y28oY2xrLCB2Y28pOworCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjbGtfc2V0X3JhdGUpOworCisvKgorICogVGhlc2UgYXJlIGZpeGVkIGNsb2Nrcy4KKyAqLworc3RhdGljIHN0cnVjdCBjbGsga21pX2NsayA9IHsKKwkubmFtZQk9ICJLTUlSRUZDTEsiLAorCS5yYXRlCT0gMjQwMDAwMDAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0X2NsayA9IHsKKwkubmFtZQk9ICJVQVJUQ0xLIiwKKwkucmF0ZQk9IDI0MDAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jaV9jbGsgPSB7CisJLm5hbWUJPSAiTUNMSyIsCisJLnJhdGUJPSAzMzAwMDAwMCwKK307CisKK2ludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQoreworCWRvd24oJmNsb2Nrc19zZW0pOworCWxpc3RfYWRkKCZjbGstPm5vZGUsICZjbG9ja3MpOworCXVwKCZjbG9ja3Nfc2VtKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3JlZ2lzdGVyKTsKKwordm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCit7CisJZG93bigmY2xvY2tzX3NlbSk7CisJbGlzdF9kZWwoJmNsay0+bm9kZSk7CisJdXAoJmNsb2Nrc19zZW0pOworfQorRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IGNsa19pbml0KHZvaWQpCit7CisJY2xrX3JlZ2lzdGVyKCZrbWlfY2xrKTsKKwljbGtfcmVnaXN0ZXIoJnVhcnRfY2xrKTsKKwljbGtfcmVnaXN0ZXIoJm1tY2lfY2xrKTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwYjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZC4KKyAqICBXcml0dGVuIGJ5IERlZXAgQmx1ZSBTb2x1dGlvbnMgTGltaXRlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCitzdHJ1Y3QgbW9kdWxlOworc3RydWN0IGljc3QzMDdfcGFyYW1zOworCitzdHJ1Y3QgY2xrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJdW5zaWduZWQgbG9uZwkJcmF0ZTsKKwlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJY29uc3Qgc3RydWN0IGljc3QzMDdfcGFyYW1zICpwYXJhbXM7CisJdm9pZAkJCSpkYXRhOworCXZvaWQJCQkoKnNldHZjbykoc3RydWN0IGNsayAqLCBzdHJ1Y3QgaWNzdDMwN192Y28gdmNvKTsKK307CisKK2ludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKTsKK3ZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTRlMWJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0wLDAgKzEsOTE4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEFSTSBMaW1pdGVkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhX2NsY2QuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDMwNy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21tYy5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisKKy8qCisgKiBBbGwgSU8gYWRkcmVzc2VzIGFyZSBtYXBwZWQgb250byBWQSAweEZGRngueHh4eCwgd2hlcmUgeC54eHh4CisgKiBpcyB0aGUgKFBBID4+IDEyKS4KKyAqCisgKiBTZXR1cCBhIFZBIGZvciB0aGUgVmVyc2F0aWxlIFZlY3RvcmVkIEludGVycnVwdCBDb250cm9sbGVyLgorICovCisjZGVmaW5lIFZBX1ZJQ19CQVNFCQkgSU9fQUREUkVTUyhWRVJTQVRJTEVfVklDX0JBU0UpCisjZGVmaW5lIFZBX1NJQ19CQVNFCQkgSU9fQUREUkVTUyhWRVJTQVRJTEVfU0lDX0JBU0UpCisKK3N0YXRpYyB2b2lkIHZpY19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlycSAtPSBJUlFfVklDX1NUQVJUOworCXdyaXRlbCgxIDw8IGlycSwgVkFfVklDX0JBU0UgKyBWSUNfSVJRX0VOQUJMRV9DTEVBUik7Cit9CisKK3N0YXRpYyB2b2lkIHZpY191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxIC09IElSUV9WSUNfU1RBUlQ7CisJd3JpdGVsKDEgPDwgaXJxLCBWQV9WSUNfQkFTRSArIFZJQ19JUlFfRU5BQkxFKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHZpY19jaGlwID0geworCS5hY2sJPSB2aWNfbWFza19pcnEsCisJLm1hc2sJPSB2aWNfbWFza19pcnEsCisJLnVubWFzawk9IHZpY191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHZvaWQgc2ljX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxIC09IElSUV9TSUNfU1RBUlQ7CisJd3JpdGVsKDEgPDwgaXJxLCBWQV9TSUNfQkFTRSArIFNJQ19JUlFfRU5BQkxFX0NMRUFSKTsKK30KKworc3RhdGljIHZvaWQgc2ljX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnEgLT0gSVJRX1NJQ19TVEFSVDsKKwl3cml0ZWwoMSA8PCBpcnEsIFZBX1NJQ19CQVNFICsgU0lDX0lSUV9FTkFCTEVfU0VUKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIHNpY19jaGlwID0geworCS5hY2sJPSBzaWNfbWFza19pcnEsCisJLm1hc2sJPSBzaWNfbWFza19pcnEsCisJLnVubWFzawk9IHNpY191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHZvaWQKK3NpY19oYW5kbGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IHJlYWRsKFZBX1NJQ19CQVNFICsgU0lDX0lSUV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWRvX2JhZF9JUlEoaXJxLCBkZXNjLCByZWdzKTsKKwkJcmV0dXJuOworCX0KKworCWRvIHsKKwkJaXJxID0gZmZzKHN0YXR1cykgLSAxOworCQlzdGF0dXMgJj0gfigxIDw8IGlycSk7CisKKwkJaXJxICs9IElSUV9TSUNfU1RBUlQ7CisKKwkJZGVzYyA9IGlycV9kZXNjICsgaXJxOworCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwl9IHdoaWxlIChzdGF0dXMpOworfQorCisjaWYgMQorI2RlZmluZSBJUlFfTU1DSTBBCUlSUV9WSUNTT1VSQ0UyMgorI2RlZmluZSBJUlFfQUFDSQlJUlFfVklDU09VUkNFMjQKKyNkZWZpbmUgSVJRX0VUSAkJSVJRX1ZJQ1NPVVJDRTI1CisjZGVmaW5lIFBJQ19NQVNLCTB4RkZEMDAwMDAKKyNlbHNlCisjZGVmaW5lIElSUV9NTUNJMEEJSVJRX1NJQ19NTUNJMEEKKyNkZWZpbmUgSVJRX0FBQ0kJSVJRX1NJQ19BQUNJCisjZGVmaW5lIElSUV9FVEgJCUlSUV9TSUNfRVRICisjZGVmaW5lIFBJQ19NQVNLCTAKKyNlbmRpZgorCit2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdF9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgdmFsdWU7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGluaXRpYWxseS4gKi8KKworCXdyaXRlbCgwLCBWQV9WSUNfQkFTRSArIFZJQ19JTlRfU0VMRUNUKTsKKwl3cml0ZWwoMCwgVkFfVklDX0JBU0UgKyBWSUNfSVJRX0VOQUJMRSk7CisJd3JpdGVsKH4wLCBWQV9WSUNfQkFTRSArIFZJQ19JUlFfRU5BQkxFX0NMRUFSKTsKKwl3cml0ZWwoMCwgVkFfVklDX0JBU0UgKyBWSUNfSVJRX1NUQVRVUyk7CisJd3JpdGVsKDAsIFZBX1ZJQ19CQVNFICsgVklDX0lUQ1IpOworCXdyaXRlbCh+MCwgVkFfVklDX0JBU0UgKyBWSUNfSVJRX1NPRlRfQ0xFQVIpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgY2xlYXIgYWxsIGV4aXN0aW5nIGludGVycnVwdHMKKwkgKi8KKwl3cml0ZWwoMCwgVkFfVklDX0JBU0UgKyBWSUNfVkVDVF9BRERSKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTk7IGkrKykgeworCQl2YWx1ZSA9IHJlYWRsKFZBX1ZJQ19CQVNFICsgVklDX1ZFQ1RfQUREUik7CisJCXdyaXRlbCh2YWx1ZSwgVkFfVklDX0JBU0UgKyBWSUNfVkVDVF9BRERSKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl2YWx1ZSA9IHJlYWRsKFZBX1ZJQ19CQVNFICsgVklDX1ZFQ1RfQ05UTDAgKyAoaSAqIDQpKTsKKwkJd3JpdGVsKHZhbHVlIHwgVklDVmVjdENudGxfRW5hYmxlIHwgaSwgVkFfVklDX0JBU0UgKyBWSUNfVkVDVF9DTlRMMCArIChpICogNCkpOworCX0KKworCXdyaXRlbCgzMiwgVkFfVklDX0JBU0UgKyBWSUNfREVGX1ZFQ1RfQUREUik7CisKKwlmb3IgKGkgPSBJUlFfVklDX1NUQVJUOyBpIDw9IElSUV9WSUNfRU5EOyBpKyspIHsKKwkJaWYgKGkgIT0gSVJRX1ZJQ1NPVVJDRTMxKSB7CisJCQlzZXRfaXJxX2NoaXAoaSwgJnZpY19jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJCX0KKwl9CisKKwlzZXRfaXJxX2hhbmRsZXIoSVJRX1ZJQ1NPVVJDRTMxLCBzaWNfaGFuZGxlX2lycSk7CisJdmljX3VubWFza19pcnEoSVJRX1ZJQ1NPVVJDRTMxKTsKKworCS8qIERvIHNlY29uZCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCXdyaXRlbCh+MCwgVkFfU0lDX0JBU0UgKyBTSUNfSVJRX0VOQUJMRV9DTEVBUik7CisKKwlmb3IgKGkgPSBJUlFfU0lDX1NUQVJUOyBpIDw9IElSUV9TSUNfRU5EOyBpKyspIHsKKwkJaWYgKChQSUNfTUFTSyAmICgxIDw8IChpIC0gSVJRX1NJQ19TVEFSVCkpKSA9PSAwKSB7CisJCQlzZXRfaXJxX2NoaXAoaSwgJnNpY19jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEludGVycnVwdHMgb24gc2Vjb25kYXJ5IGNvbnRyb2xsZXIgZnJvbSAwIHRvIDggYXJlIHJvdXRlZCB0bworCSAqIHNvdXJjZSAzMSBvbiBQSUMuCisJICogSW50ZXJydXB0cyBmcm9tIDIxIHRvIDMxIGFyZSByb3V0ZWQgZGlyZWN0bHkgdG8gdGhlIFZJQyBvbgorCSAqIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvbiBwcmltYXJ5IGNvbnRyb2xsZXIuIFRoaXMgaXMgY29udHJvbGxlZAorCSAqIGJ5IHNldHRpbmcgUElDX0VOQUJMRXguCisJICovCisJd3JpdGVsKFBJQ19NQVNLLCBWQV9TSUNfQkFTRSArIFNJQ19JTlRfUElDX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdmVyc2F0aWxlX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgSU9fQUREUkVTUyhWRVJTQVRJTEVfU1lTX0JBU0UpLCAgIFZFUlNBVElMRV9TWVNfQkFTRSwgICBTWl80SywgICAgICBNVF9ERVZJQ0UgfSwKKyB7IElPX0FERFJFU1MoVkVSU0FUSUxFX1NJQ19CQVNFKSwgICBWRVJTQVRJTEVfU0lDX0JBU0UsICAgU1pfNEssICAgICAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKFZFUlNBVElMRV9WSUNfQkFTRSksICAgVkVSU0FUSUxFX1ZJQ19CQVNFLCAgIFNaXzRLLCAgICAgIE1UX0RFVklDRSB9LAorIHsgSU9fQUREUkVTUyhWRVJTQVRJTEVfU0NUTF9CQVNFKSwgIFZFUlNBVElMRV9TQ1RMX0JBU0UsICBTWl80SyAqIDksICBNVF9ERVZJQ0UgfSwKKyNpZmRlZiBDT05GSUdfTUFDSF9WRVJTQVRJTEVfQUIKKyB7IElPX0FERFJFU1MoVkVSU0FUSUxFX0dQSU8wX0JBU0UpLCBWRVJTQVRJTEVfR1BJTzBfQkFTRSwgU1pfNEssICAgICAgTVRfREVWSUNFIH0sCisgeyBJT19BRERSRVNTKFZFUlNBVElMRV9JQjJfQkFTRSksICAgVkVSU0FUSUxFX0lCMl9CQVNFLCAgIFNaXzY0TSwgICAgIE1UX0RFVklDRSB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFQlVHX0xMCisgeyBJT19BRERSRVNTKFZFUlNBVElMRV9VQVJUMF9CQVNFKSwgVkVSU0FUSUxFX1VBUlQwX0JBU0UsIFNaXzRLLCAgICAgIE1UX0RFVklDRSB9LAorI2VuZGlmCisjaWZkZWYgRklYTUUKKyB7IFBDSV9NRU1PUllfVkFERFIsCQkgICAgIFBIWVNfUENJX01FTV9CQVNFLCAgICBTWl8xNk0sICAgICBNVF9ERVZJQ0UgfSwKKyB7IFBDSV9DT05GSUdfVkFERFIsCQkgICAgIFBIWVNfUENJX0NPTkZJR19CQVNFLCBTWl8xNk0sICAgICBNVF9ERVZJQ0UgfSwKKyB7IFBDSV9WM19WQUREUiwJCSAgICAgUEhZU19QQ0lfVjNfQkFTRSwgICAgIFNaXzUxMkssICAgIE1UX0RFVklDRSB9LAorIHsgUENJX0lPX1ZBRERSLAkJICAgICBQSFlTX1BDSV9JT19CQVNFLCAgICAgU1pfNjRLLCAgICAgTVRfREVWSUNFIH0sCisjZW5kaWYKK307CisKK3ZvaWQgX19pbml0IHZlcnNhdGlsZV9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQodmVyc2F0aWxlX2lvX2Rlc2MsIEFSUkFZX1NJWkUodmVyc2F0aWxlX2lvX2Rlc2MpKTsKK30KKworI2RlZmluZSBWRVJTQVRJTEVfUkVGQ09VTlRFUgkoSU9fQUREUkVTUyhWRVJTQVRJTEVfU1lTX0JBU0UpICsgVkVSU0FUSUxFX1NZU18yNE1Iel9PRkZTRVQpCisKKy8qCisgKiBUaGlzIGlzIHRoZSBWZXJzYXRpbGUgc2NoZWRfY2xvY2sgaW1wbGVtZW50YXRpb24uICBUaGlzIGhhcworICogYSByZXNvbHV0aW9uIG9mIDQxLjducywgYW5kIGEgbWF4aW11bSB2YWx1ZSBvZiBhYm91dCAxNzlzLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdjsKKworCXYgPSAodW5zaWduZWQgbG9uZyBsb25nKXJlYWRsKFZFUlNBVElMRV9SRUZDT1VOVEVSKSAqIDEyNTsKKwlkb19kaXYodiwgMyk7CisKKwlyZXR1cm4gdjsKK30KKworCisjZGVmaW5lIFZFUlNBVElMRV9GTEFTSENUUkwgICAgKElPX0FERFJFU1MoVkVSU0FUSUxFX1NZU19CQVNFKSArIFZFUlNBVElMRV9TWVNfRkxBU0hfT0ZGU0VUKQorCitzdGF0aWMgaW50IHZlcnNhdGlsZV9mbGFzaF9pbml0KHZvaWQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFZFUlNBVElMRV9GTEFTSENUUkwpOworCXZhbCAmPSB+VkVSU0FUSUxFX0ZMQVNIUFJPR19GTFZQUEVOOworCV9fcmF3X3dyaXRlbCh2YWwsIFZFUlNBVElMRV9GTEFTSENUUkwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlcnNhdGlsZV9mbGFzaF9leGl0KHZvaWQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFZFUlNBVElMRV9GTEFTSENUUkwpOworCXZhbCAmPSB+VkVSU0FUSUxFX0ZMQVNIUFJPR19GTFZQUEVOOworCV9fcmF3X3dyaXRlbCh2YWwsIFZFUlNBVElMRV9GTEFTSENUUkwpOworfQorCitzdGF0aWMgdm9pZCB2ZXJzYXRpbGVfZmxhc2hfc2V0X3ZwcChpbnQgb24pCit7CisJdTMyIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFZFUlNBVElMRV9GTEFTSENUUkwpOworCWlmIChvbikKKwkJdmFsIHw9IFZFUlNBVElMRV9GTEFTSFBST0dfRkxWUFBFTjsKKwllbHNlCisJCXZhbCAmPSB+VkVSU0FUSUxFX0ZMQVNIUFJPR19GTFZQUEVOOworCV9fcmF3X3dyaXRlbCh2YWwsIFZFUlNBVElMRV9GTEFTSENUUkwpOworfQorCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgdmVyc2F0aWxlX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJCT0gNCwKKwkuaW5pdAkJCT0gdmVyc2F0aWxlX2ZsYXNoX2luaXQsCisJLmV4aXQJCQk9IHZlcnNhdGlsZV9mbGFzaF9leGl0LAorCS5zZXRfdnBwCQk9IHZlcnNhdGlsZV9mbGFzaF9zZXRfdnBwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2ZXJzYXRpbGVfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQkJPSBWRVJTQVRJTEVfRkxBU0hfQkFTRSwKKwkuZW5kCQkJPSBWRVJTQVRJTEVfRkxBU0hfQkFTRSArIFZFUlNBVElMRV9GTEFTSF9TSVpFLAorCS5mbGFncwkJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2ZXJzYXRpbGVfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQkJPSAiYXJtZmxhc2giLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnZlcnNhdGlsZV9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJCT0gMSwKKwkucmVzb3VyY2UJCT0gJnZlcnNhdGlsZV9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CQk9IFZFUlNBVElMRV9FVEhfQkFTRSwKKwkJLmVuZAkJPSBWRVJTQVRJTEVfRVRIX0JBU0UgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAkJPSBJUlFfRVRILAorCQkuZW5kCQk9IElSUV9FVEgsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic21jOTF4IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc21jOTF4X3Jlc291cmNlcywKK307CisKKyNkZWZpbmUgVkVSU0FUSUxFX1NZU01DSQkoSU9fQUREUkVTUyhWRVJTQVRJTEVfU1lTX0JBU0UpICsgVkVSU0FUSUxFX1NZU19NQ0lfT0ZGU0VUKQorCit1bnNpZ25lZCBpbnQgbW1jX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtYmFfZGV2aWNlICphZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGFtYmFfZGV2aWNlLCBkZXYpOworCXUzMiBtYXNrOworCisJaWYgKGFkZXYtPnJlcy5zdGFydCA9PSBWRVJTQVRJTEVfTU1DSTBfQkFTRSkKKwkJbWFzayA9IDE7CisJZWxzZQorCQltYXNrID0gMjsKKworCXJldHVybiByZWFkbChWRVJTQVRJTEVfU1lTTUNJKSAmIG1hc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbW1jX3BsYXRmb3JtX2RhdGEgbW1jMF9wbGF0X2RhdGEgPSB7CisJLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAorCS5zdGF0dXMJCT0gbW1jX3N0YXR1cywKK307CisKKy8qCisgKiBDbG9jayBoYW5kbGluZworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGljc3QzMDdfcGFyYW1zIHZlcnNhdGlsZV9vc2N2Y29fcGFyYW1zID0geworCS5yZWYJCT0gMjQwMDAsCisJLnZjb19tYXgJPSAyMDAwMDAsCisJLnZkX21pbgkJPSA0ICsgOCwKKwkudmRfbWF4CQk9IDUxMSArIDgsCisJLnJkX21pbgkJPSAxICsgMiwKKwkucmRfbWF4CQk9IDEyNyArIDIsCit9OworCitzdGF0aWMgdm9pZCB2ZXJzYXRpbGVfb3NjdmNvX3NldChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBpY3N0MzA3X3ZjbyB2Y28pCit7CisJdW5zaWduZWQgbG9uZyBzeXNfbG9jayA9IElPX0FERFJFU1MoVkVSU0FUSUxFX1NZU19CQVNFKSArIFZFUlNBVElMRV9TWVNfTE9DS19PRkZTRVQ7CisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9WRVJTQVRJTEVfUEIpCisJdW5zaWduZWQgbG9uZyBzeXNfb3NjID0gSU9fQUREUkVTUyhWRVJTQVRJTEVfU1lTX0JBU0UpICsgVkVSU0FUSUxFX1NZU19PU0M0X09GRlNFVDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01BQ0hfVkVSU0FUSUxFX0FCKQorCXVuc2lnbmVkIGxvbmcgc3lzX29zYyA9IElPX0FERFJFU1MoVkVSU0FUSUxFX1NZU19CQVNFKSArIFZFUlNBVElMRV9TWVNfT1NDMV9PRkZTRVQ7CisjZW5kaWYKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoc3lzX29zYykgJiB+MHg3ZmZmZjsKKwl2YWwgfD0gdmNvLnYgfCAodmNvLnIgPDwgOSkgfCAodmNvLnMgPDwgMTYpOworCisJd3JpdGVsKDB4YTA1Ziwgc3lzX2xvY2spOworCXdyaXRlbCh2YWwsIHN5c19vc2MpOworCXdyaXRlbCgwLCBzeXNfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZlcnNhdGlsZV9jbGNkX2NsayA9IHsKKwkubmFtZQk9ICJDTENEQ0xLIiwKKwkucGFyYW1zCT0gJnZlcnNhdGlsZV9vc2N2Y29fcGFyYW1zLAorCS5zZXR2Y28gPSB2ZXJzYXRpbGVfb3NjdmNvX3NldCwKK307CisKKy8qCisgKiBDTENEIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgU1lTX0NMQ0RfTU9ERV9NQVNLCSgzIDw8IDApCisjZGVmaW5lIFNZU19DTENEX01PREVfODg4CSgwIDw8IDApCisjZGVmaW5lIFNZU19DTENEX01PREVfNTU1MQkoMSA8PCAwKQorI2RlZmluZSBTWVNfQ0xDRF9NT0RFXzU2NV9STFNCCSgyIDw8IDApCisjZGVmaW5lIFNZU19DTENEX01PREVfNTY1X0JMU0IJKDMgPDwgMCkKKyNkZWZpbmUgU1lTX0NMQ0RfTkxDRElPT04JKDEgPDwgMikKKyNkZWZpbmUgU1lTX0NMQ0RfVkREUE9TU1dJVENICSgxIDw8IDMpCisjZGVmaW5lIFNZU19DTENEX1BXUjNWNVNXSVRDSAkoMSA8PCA0KQorI2RlZmluZSBTWVNfQ0xDRF9JRF9NQVNLCSgweDFmIDw8IDgpCisjZGVmaW5lIFNZU19DTENEX0lEX1NBTllPXzNfOAkoMHgwMCA8PCA4KQorI2RlZmluZSBTWVNfQ0xDRF9JRF9VTktOT1dOXzhfNAkoMHgwMSA8PCA4KQorI2RlZmluZSBTWVNfQ0xDRF9JRF9FUFNPTl8yXzIJKDB4MDIgPDwgOCkKKyNkZWZpbmUgU1lTX0NMQ0RfSURfU0FOWU9fMl81CSgweDA3IDw8IDgpCisjZGVmaW5lIFNZU19DTENEX0lEX1ZHQQkJKDB4MWYgPDwgOCkKKworc3RhdGljIHN0cnVjdCBjbGNkX3BhbmVsIHZnYSA9IHsKKwkubW9kZQkJPSB7CisJCS5uYW1lCQk9ICJWR0EiLAorCQkucmVmcmVzaAk9IDYwLAorCQkueHJlcwkJPSA2NDAsCisJCS55cmVzCQk9IDQ4MCwKKwkJLnBpeGNsb2NrCT0gMzk3MjEsCisJCS5sZWZ0X21hcmdpbgk9IDQwLAorCQkucmlnaHRfbWFyZ2luCT0gMjQsCisJCS51cHBlcl9tYXJnaW4JPSAzMiwKKwkJLmxvd2VyX21hcmdpbgk9IDExLAorCQkuaHN5bmNfbGVuCT0gOTYsCisJCS52c3luY19sZW4JPSAyLAorCQkuc3luYwkJPSAwLAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LAorCS53aWR0aAkJPSAtMSwKKwkuaGVpZ2h0CQk9IC0xLAorCS50aW0yCQk9IFRJTTJfQkNEIHwgVElNMl9JUEMsCisJLmNudGwJCT0gQ05UTF9MQ0RURlQgfCBDTlRMX0xDRFZDT01QKDEpLAorCS5icHAJCT0gMTYsCit9OworCitzdGF0aWMgc3RydWN0IGNsY2RfcGFuZWwgc2FueW9fM184X2luID0geworCS5tb2RlCQk9IHsKKwkJLm5hbWUJCT0gIlNhbnlvIFFWR0EiLAorCQkucmVmcmVzaAk9IDExNiwKKwkJLnhyZXMJCT0gMzIwLAorCQkueXJlcwkJPSAyNDAsCisJCS5waXhjbG9jawk9IDEwMDAwMCwKKwkJLmxlZnRfbWFyZ2luCT0gNiwKKwkJLnJpZ2h0X21hcmdpbgk9IDYsCisJCS51cHBlcl9tYXJnaW4JPSA1LAorCQkubG93ZXJfbWFyZ2luCT0gNSwKKwkJLmhzeW5jX2xlbgk9IDYsCisJCS52c3luY19sZW4JPSA2LAorCQkuc3luYwkJPSAwLAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LAorCS53aWR0aAkJPSAtMSwKKwkuaGVpZ2h0CQk9IC0xLAorCS50aW0yCQk9IFRJTTJfQkNELAorCS5jbnRsCQk9IENOVExfTENEVEZUIHwgQ05UTF9MQ0RWQ09NUCgxKSwKKwkuYnBwCQk9IDE2LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGNkX3BhbmVsIHNhbnlvXzJfNV9pbiA9IHsKKwkubW9kZQkJPSB7CisJCS5uYW1lCQk9ICJTYW55byBRVkdBIFBvcnRyYWl0IiwKKwkJLnJlZnJlc2gJPSAxMTYsCisJCS54cmVzCQk9IDI0MCwKKwkJLnlyZXMJCT0gMzIwLAorCQkucGl4Y2xvY2sJPSAxMDAwMDAsCisJCS5sZWZ0X21hcmdpbgk9IDIwLAorCQkucmlnaHRfbWFyZ2luCT0gMTAsCisJCS51cHBlcl9tYXJnaW4JPSAyLAorCQkubG93ZXJfbWFyZ2luCT0gMiwKKwkJLmhzeW5jX2xlbgk9IDEwLAorCQkudnN5bmNfbGVuCT0gMiwKKwkJLnN5bmMJCT0gRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorCX0sCisJLndpZHRoCQk9IC0xLAorCS5oZWlnaHQJCT0gLTEsCisJLnRpbTIJCT0gVElNMl9JVlMgfCBUSU0yX0lIUyB8IFRJTTJfSVBDLAorCS5jbnRsCQk9IENOVExfTENEVEZUIHwgQ05UTF9MQ0RWQ09NUCgxKSwKKwkuYnBwCQk9IDE2LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGNkX3BhbmVsIGVwc29uXzJfMl9pbiA9IHsKKwkubW9kZQkJPSB7CisJCS5uYW1lCQk9ICJFcHNvbiBRQ0lGIiwKKwkJLnJlZnJlc2gJPSAzOTAsCisJCS54cmVzCQk9IDE3NiwKKwkJLnlyZXMJCT0gMjIwLAorCQkucGl4Y2xvY2sJPSA2MjUwMCwKKwkJLmxlZnRfbWFyZ2luCT0gMywKKwkJLnJpZ2h0X21hcmdpbgk9IDIsCisJCS51cHBlcl9tYXJnaW4JPSAxLAorCQkubG93ZXJfbWFyZ2luCT0gMCwKKwkJLmhzeW5jX2xlbgk9IDMsCisJCS52c3luY19sZW4JPSAyLAorCQkuc3luYwkJPSAwLAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LAorCS53aWR0aAkJPSAtMSwKKwkuaGVpZ2h0CQk9IC0xLAorCS50aW0yCQk9IFRJTTJfQkNEIHwgVElNMl9JUEMsCisJLmNudGwJCT0gQ05UTF9MQ0RURlQgfCBDTlRMX0xDRFZDT01QKDEpLAorCS5icHAJCT0gMTYsCit9OworCisvKgorICogRGV0ZWN0IHdoaWNoIExDRCBwYW5lbCBpcyBjb25uZWN0ZWQsIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlCisgKiBjbGNkX3BhbmVsIHN0cnVjdHVyZS4gIE5vdGU6IHdlIGRvIG5vdCBoYXZlIGFueSBpbmZvcm1hdGlvbiBvbgorICogdGhlIHJlcXVpcmVkIHRpbWluZ3MgZm9yIHRoZSA4LjRpbiBwYW5lbCwgc28gd2UgcHJlc2VudGx5IGFzc3VtZQorICogVkdBIHRpbWluZ3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xjZF9wYW5lbCAqdmVyc2F0aWxlX2NsY2RfcGFuZWwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN5c19jbGNkID0gSU9fQUREUkVTUyhWRVJTQVRJTEVfU1lTX0JBU0UpICsgVkVSU0FUSUxFX1NZU19DTENEX09GRlNFVDsKKwlzdHJ1Y3QgY2xjZF9wYW5lbCAqcGFuZWwgPSAmdmdhOworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChzeXNfY2xjZCkgJiBTWVNfQ0xDRF9JRF9NQVNLOworCWlmICh2YWwgPT0gU1lTX0NMQ0RfSURfU0FOWU9fM184KQorCQlwYW5lbCA9ICZzYW55b18zXzhfaW47CisJZWxzZSBpZiAodmFsID09IFNZU19DTENEX0lEX1NBTllPXzJfNSkKKwkJcGFuZWwgPSAmc2FueW9fMl81X2luOworCWVsc2UgaWYgKHZhbCA9PSBTWVNfQ0xDRF9JRF9FUFNPTl8yXzIpCisJCXBhbmVsID0gJmVwc29uXzJfMl9pbjsKKwllbHNlIGlmICh2YWwgPT0gU1lTX0NMQ0RfSURfVkdBKQorCQlwYW5lbCA9ICZ2Z2E7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ0xDRDogdW5rbm93biBMQ0QgcGFuZWwgSUQgMHglMDh4LCB1c2luZyBWR0FcbiIsCisJCQl2YWwpOworCQlwYW5lbCA9ICZ2Z2E7CisJfQorCisJcmV0dXJuIHBhbmVsOworfQorCisvKgorICogRGlzYWJsZSBhbGwgZGlzcGxheSBjb25uZWN0b3JzIG9uIHRoZSBpbnRlcmZhY2UgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCB2ZXJzYXRpbGVfY2xjZF9kaXNhYmxlKHN0cnVjdCBjbGNkX2ZiICpmYikKK3sKKwl1bnNpZ25lZCBsb25nIHN5c19jbGNkID0gSU9fQUREUkVTUyhWRVJTQVRJTEVfU1lTX0JBU0UpICsgVkVSU0FUSUxFX1NZU19DTENEX09GRlNFVDsKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoc3lzX2NsY2QpOworCXZhbCAmPSB+U1lTX0NMQ0RfTkxDRElPT04gfCBTWVNfQ0xDRF9QV1IzVjVTV0lUQ0g7CisJd3JpdGVsKHZhbCwgc3lzX2NsY2QpOworCisjaWZkZWYgQ09ORklHX01BQ0hfVkVSU0FUSUxFX0FCCisJLyoKKwkgKiBJZiB0aGUgTENEIGlzIFNhbnlvIDJ4NSBpbiBvbiB0aGUgSUIyIGJvYXJkLCB0dXJuIHRoZSBiYWNrLWxpZ2h0IG9mZgorCSAqLworCWlmIChmYi0+cGFuZWwgPT0gJnNhbnlvXzJfNV9pbikgeworCQl1bnNpZ25lZCBsb25nIHZlcnNhdGlsZV9pYjJfY3RybCA9IElPX0FERFJFU1MoVkVSU0FUSUxFX0lCMl9DVFJMKTsKKwkJdW5zaWduZWQgbG9uZyBjdHJsOworCisJCWN0cmwgPSByZWFkbCh2ZXJzYXRpbGVfaWIyX2N0cmwpOworCQljdHJsICY9IH4weDAxOworCQl3cml0ZWwoY3RybCwgdmVyc2F0aWxlX2liMl9jdHJsKTsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIEVuYWJsZSB0aGUgcmVsZXZhbnQgY29ubmVjdG9yIG9uIHRoZSBpbnRlcmZhY2UgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCB2ZXJzYXRpbGVfY2xjZF9lbmFibGUoc3RydWN0IGNsY2RfZmIgKmZiKQoreworCXVuc2lnbmVkIGxvbmcgc3lzX2NsY2QgPSBJT19BRERSRVNTKFZFUlNBVElMRV9TWVNfQkFTRSkgKyBWRVJTQVRJTEVfU1lTX0NMQ0RfT0ZGU0VUOworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChzeXNfY2xjZCk7CisJdmFsICY9IH5TWVNfQ0xDRF9NT0RFX01BU0s7CisKKwlzd2l0Y2ggKGZiLT5mYi52YXIuZ3JlZW4ubGVuZ3RoKSB7CisJY2FzZSA1OgorCQl2YWwgfD0gU1lTX0NMQ0RfTU9ERV81NTUxOworCQlicmVhazsKKwljYXNlIDY6CisJCXZhbCB8PSBTWVNfQ0xDRF9NT0RFXzU2NV9CTFNCOworCQlicmVhazsKKwljYXNlIDg6CisJCXZhbCB8PSBTWVNfQ0xDRF9NT0RFXzg4ODsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIE1VWAorCSAqLworCXdyaXRlbCh2YWwsIHN5c19jbGNkKTsKKworCS8qCisJICogQW5kIG5vdyBlbmFibGUgdGhlIFBTVXMKKwkgKi8KKwl2YWwgfD0gU1lTX0NMQ0RfTkxDRElPT04gfCBTWVNfQ0xDRF9QV1IzVjVTV0lUQ0g7CisJd3JpdGVsKHZhbCwgc3lzX2NsY2QpOworCisjaWZkZWYgQ09ORklHX01BQ0hfVkVSU0FUSUxFX0FCCisJLyoKKwkgKiBJZiB0aGUgTENEIGlzIFNhbnlvIDJ4NSBpbiBvbiB0aGUgSUIyIGJvYXJkLCB0dXJuIHRoZSBiYWNrLWxpZ2h0IG9uCisJICovCisJaWYgKGZiLT5wYW5lbCA9PSAmc2FueW9fMl81X2luKSB7CisJCXVuc2lnbmVkIGxvbmcgdmVyc2F0aWxlX2liMl9jdHJsID0gSU9fQUREUkVTUyhWRVJTQVRJTEVfSUIyX0NUUkwpOworCQl1bnNpZ25lZCBsb25nIGN0cmw7CisKKwkJY3RybCA9IHJlYWRsKHZlcnNhdGlsZV9pYjJfY3RybCk7CisJCWN0cmwgfD0gMHgwMTsKKwkJd3JpdGVsKGN0cmwsIHZlcnNhdGlsZV9pYjJfY3RybCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZyYW1lc2l6ZSA9IFNaXzFNOworCitzdGF0aWMgaW50IHZlcnNhdGlsZV9jbGNkX3NldHVwKHN0cnVjdCBjbGNkX2ZiICpmYikKK3sKKwlkbWFfYWRkcl90IGRtYTsKKworCWZiLT5wYW5lbAkJPSB2ZXJzYXRpbGVfY2xjZF9wYW5lbCgpOworCisJZmItPmZiLnNjcmVlbl9iYXNlID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZSgmZmItPmRldi0+ZGV2LCBmcmFtZXNpemUsCisJCQkJCQkgICAgJmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmYi0+ZmIuc2NyZWVuX2Jhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDTENEOiB1bmFibGUgdG8gbWFwIGZyYW1lYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmItPmZiLmZpeC5zbWVtX3N0YXJ0CT0gZG1hOworCWZiLT5mYi5maXguc21lbV9sZW4JPSBmcmFtZXNpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzYXRpbGVfY2xjZF9tbWFwKHN0cnVjdCBjbGNkX2ZiICpmYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIGRtYV9tbWFwX3dyaXRlY29tYmluZSgmZmItPmRldi0+ZGV2LCB2bWEsCisJCQkJICAgICBmYi0+ZmIuc2NyZWVuX2Jhc2UsCisJCQkJICAgICBmYi0+ZmIuZml4LnNtZW1fc3RhcnQsCisJCQkJICAgICBmYi0+ZmIuZml4LnNtZW1fbGVuKTsKK30KKworc3RhdGljIHZvaWQgdmVyc2F0aWxlX2NsY2RfcmVtb3ZlKHN0cnVjdCBjbGNkX2ZiICpmYikKK3sKKwlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJmZiLT5kZXYtPmRldiwgZmItPmZiLmZpeC5zbWVtX2xlbiwKKwkJCSAgICAgIGZiLT5mYi5zY3JlZW5fYmFzZSwgZmItPmZiLmZpeC5zbWVtX3N0YXJ0KTsKK30KKworc3RhdGljIHN0cnVjdCBjbGNkX2JvYXJkIGNsY2RfcGxhdF9kYXRhID0geworCS5uYW1lCQk9ICJWZXJzYXRpbGUiLAorCS5jaGVjawkJPSBjbGNkZmJfY2hlY2ssCisJLmRlY29kZQkJPSBjbGNkZmJfZGVjb2RlLAorCS5kaXNhYmxlCT0gdmVyc2F0aWxlX2NsY2RfZGlzYWJsZSwKKwkuZW5hYmxlCQk9IHZlcnNhdGlsZV9jbGNkX2VuYWJsZSwKKwkuc2V0dXAJCT0gdmVyc2F0aWxlX2NsY2Rfc2V0dXAsCisJLm1tYXAJCT0gdmVyc2F0aWxlX2NsY2RfbW1hcCwKKwkucmVtb3ZlCQk9IHZlcnNhdGlsZV9jbGNkX3JlbW92ZSwKK307CisKKyNkZWZpbmUgQUFDSV9JUlEJeyBJUlFfQUFDSSwgTk9fSVJRIH0KKyNkZWZpbmUgQUFDSV9ETUEJeyAweDgwLCAweDgxIH0KKyNkZWZpbmUgTU1DSTBfSVJRCXsgSVJRX01NQ0kwQSxJUlFfU0lDX01NQ0kwQiB9CisjZGVmaW5lIE1NQ0kwX0RNQQl7IDB4ODQsIDAgfQorI2RlZmluZSBLTUkwX0lSUQl7IElSUV9TSUNfS01JMCwgTk9fSVJRIH0KKyNkZWZpbmUgS01JMF9ETUEJeyAwLCAwIH0KKyNkZWZpbmUgS01JMV9JUlEJeyBJUlFfU0lDX0tNSTEsIE5PX0lSUSB9CisjZGVmaW5lIEtNSTFfRE1BCXsgMCwgMCB9CisKKy8qCisgKiBUaGVzZSBkZXZpY2VzIGFyZSBjb25uZWN0ZWQgZGlyZWN0bHkgdG8gdGhlIG11bHRpLWxheWVyIEFIQiBzd2l0Y2gKKyAqLworI2RlZmluZSBTTUNfSVJRCQl7IE5PX0lSUSwgTk9fSVJRIH0KKyNkZWZpbmUgU01DX0RNQQkJeyAwLCAwIH0KKyNkZWZpbmUgTVBNQ19JUlEJeyBOT19JUlEsIE5PX0lSUSB9CisjZGVmaW5lIE1QTUNfRE1BCXsgMCwgMCB9CisjZGVmaW5lIENMQ0RfSVJRCXsgSVJRX0NMQ0RJTlQsIE5PX0lSUSB9CisjZGVmaW5lIENMQ0RfRE1BCXsgMCwgMCB9CisjZGVmaW5lIERNQUNfSVJRCXsgSVJRX0RNQUlOVCwgTk9fSVJRIH0KKyNkZWZpbmUgRE1BQ19ETUEJeyAwLCAwIH0KKworLyoKKyAqIFRoZXNlIGRldmljZXMgYXJlIGNvbm5lY3RlZCB2aWEgdGhlIGNvcmUgQVBCIGJyaWRnZQorICovCisjZGVmaW5lIFNDVExfSVJRCXsgTk9fSVJRLCBOT19JUlEgfQorI2RlZmluZSBTQ1RMX0RNQQl7IDAsIDAgfQorI2RlZmluZSBXQVRDSERPR19JUlEJeyBJUlFfV0RPR0lOVCwgTk9fSVJRIH0KKyNkZWZpbmUgV0FUQ0hET0dfRE1BCXsgMCwgMCB9CisjZGVmaW5lIEdQSU8wX0lSUQl7IElSUV9HUElPSU5UMCwgTk9fSVJRIH0KKyNkZWZpbmUgR1BJTzBfRE1BCXsgMCwgMCB9CisjZGVmaW5lIEdQSU8xX0lSUQl7IElSUV9HUElPSU5UMSwgTk9fSVJRIH0KKyNkZWZpbmUgR1BJTzFfRE1BCXsgMCwgMCB9CisjZGVmaW5lIFJUQ19JUlEJCXsgSVJRX1JUQ0lOVCwgTk9fSVJRIH0KKyNkZWZpbmUgUlRDX0RNQQkJeyAwLCAwIH0KKworLyoKKyAqIFRoZXNlIGRldmljZXMgYXJlIGNvbm5lY3RlZCB2aWEgdGhlIERNQSBBUEIgYnJpZGdlCisgKi8KKyNkZWZpbmUgU0NJX0lSUQkJeyBJUlFfU0NJSU5ULCBOT19JUlEgfQorI2RlZmluZSBTQ0lfRE1BCQl7IDcsIDYgfQorI2RlZmluZSBVQVJUMF9JUlEJeyBJUlFfVUFSVElOVDAsIE5PX0lSUSB9CisjZGVmaW5lIFVBUlQwX0RNQQl7IDE1LCAxNCB9CisjZGVmaW5lIFVBUlQxX0lSUQl7IElSUV9VQVJUSU5UMSwgTk9fSVJRIH0KKyNkZWZpbmUgVUFSVDFfRE1BCXsgMTMsIDEyIH0KKyNkZWZpbmUgVUFSVDJfSVJRCXsgSVJRX1VBUlRJTlQyLCBOT19JUlEgfQorI2RlZmluZSBVQVJUMl9ETUEJeyAxMSwgMTAgfQorI2RlZmluZSBTU1BfSVJRCQl7IElSUV9TU1BJTlQsIE5PX0lSUSB9CisjZGVmaW5lIFNTUF9ETUEJCXsgOSwgOCB9CisKKy8qIEZQR0EgUHJpbWVjZWxscyAqLworQU1CQV9ERVZJQ0UoYWFjaSwgICJmcGdhOjA0IiwgQUFDSSwgICAgIE5VTEwpOworQU1CQV9ERVZJQ0UobW1jMCwgICJmcGdhOjA1IiwgTU1DSTAsICAgICZtbWMwX3BsYXRfZGF0YSk7CitBTUJBX0RFVklDRShrbWkwLCAgImZwZ2E6MDYiLCBLTUkwLCAgICAgTlVMTCk7CitBTUJBX0RFVklDRShrbWkxLCAgImZwZ2E6MDciLCBLTUkxLCAgICAgTlVMTCk7CisKKy8qIERldkNoaXAgUHJpbWVjZWxscyAqLworQU1CQV9ERVZJQ0Uoc21jLCAgICJkZXY6MDAiLCAgU01DLCAgICAgIE5VTEwpOworQU1CQV9ERVZJQ0UobXBtYywgICJkZXY6MTAiLCAgTVBNQywgICAgIE5VTEwpOworQU1CQV9ERVZJQ0UoY2xjZCwgICJkZXY6MjAiLCAgQ0xDRCwgICAgICZjbGNkX3BsYXRfZGF0YSk7CitBTUJBX0RFVklDRShkbWFjLCAgImRldjozMCIsICBETUFDLCAgICAgTlVMTCk7CitBTUJBX0RFVklDRShzY3RsLCAgImRldjplMCIsICBTQ1RMLCAgICAgTlVMTCk7CitBTUJBX0RFVklDRSh3ZG9nLCAgImRldjplMSIsICBXQVRDSERPRywgTlVMTCk7CitBTUJBX0RFVklDRShncGlvMCwgImRldjplNCIsICBHUElPMCwgICAgTlVMTCk7CitBTUJBX0RFVklDRShncGlvMSwgImRldjplNSIsICBHUElPMSwgICAgTlVMTCk7CitBTUJBX0RFVklDRShydGMsICAgImRldjplOCIsICBSVEMsICAgICAgTlVMTCk7CitBTUJBX0RFVklDRShzY2kwLCAgImRldjpmMCIsICBTQ0ksICAgICAgTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MCwgImRldjpmMSIsICBVQVJUMCwgICAgTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MSwgImRldjpmMiIsICBVQVJUMSwgICAgTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MiwgImRldjpmMyIsICBVQVJUMiwgICAgTlVMTCk7CitBTUJBX0RFVklDRShzc3AwLCAgImRldjpmNCIsICBTU1AsICAgICAgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFtYmFfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJJmRtYWNfZGV2aWNlLAorCSZ1YXJ0MF9kZXZpY2UsCisJJnVhcnQxX2RldmljZSwKKwkmdWFydDJfZGV2aWNlLAorCSZzbWNfZGV2aWNlLAorCSZtcG1jX2RldmljZSwKKwkmY2xjZF9kZXZpY2UsCisJJnNjdGxfZGV2aWNlLAorCSZ3ZG9nX2RldmljZSwKKwkmZ3BpbzBfZGV2aWNlLAorCSZncGlvMV9kZXZpY2UsCisJJnJ0Y19kZXZpY2UsCisJJnNjaTBfZGV2aWNlLAorCSZzc3AwX2RldmljZSwKKwkmYWFjaV9kZXZpY2UsCisJJm1tYzBfZGV2aWNlLAorCSZrbWkwX2RldmljZSwKKwkma21pMV9kZXZpY2UsCit9OworCisjaWZkZWYgQ09ORklHX0xFRFMKKyNkZWZpbmUgVkFfTEVEU19CQVNFIChJT19BRERSRVNTKFZFUlNBVElMRV9TWVNfQkFTRSkgKyBWRVJTQVRJTEVfU1lTX0xFRF9PRkZTRVQpCisKK3N0YXRpYyB2b2lkIHZlcnNhdGlsZV9sZWRzX2V2ZW50KGxlZF9ldmVudF90IGxlZGV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gcmVhZGwoVkFfTEVEU19CQVNFKTsKKworCXN3aXRjaCAobGVkZXZ0KSB7CisJY2FzZSBsZWRfaWRsZV9zdGFydDoKKwkJdmFsID0gdmFsICYgflZFUlNBVElMRV9TWVNfTEVEMDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX2VuZDoKKwkJdmFsID0gdmFsIHwgVkVSU0FUSUxFX1NZU19MRUQwOworCQlicmVhazsKKworCWNhc2UgbGVkX3RpbWVyOgorCQl2YWwgPSB2YWwgXiBWRVJTQVRJTEVfU1lTX0xFRDE7CisJCWJyZWFrOworCisJY2FzZSBsZWRfaGFsdGVkOgorCQl2YWwgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXdyaXRlbCh2YWwsIFZBX0xFRFNfQkFTRSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorI2VuZGlmCS8qIENPTkZJR19MRURTICovCisKK3ZvaWQgX19pbml0IHZlcnNhdGlsZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwljbGtfcmVnaXN0ZXIoJnZlcnNhdGlsZV9jbGNkX2Nsayk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnZlcnNhdGlsZV9mbGFzaF9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21jOTF4X2RldmljZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKKwkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOworCQlhbWJhX2RldmljZV9yZWdpc3RlcihkLCAmaW9tZW1fcmVzb3VyY2UpOworCX0KKworI2lmZGVmIENPTkZJR19MRURTCisJbGVkc19ldmVudCA9IHZlcnNhdGlsZV9sZWRzX2V2ZW50OworI2VuZGlmCit9CisKKy8qCisgKiBXaGVyZSBpcyB0aGUgdGltZXIgKFZBKT8KKyAqLworI2RlZmluZSBUSU1FUjBfVkFfQkFTRQkJIElPX0FERFJFU1MoVkVSU0FUSUxFX1RJTUVSMF8xX0JBU0UpCisjZGVmaW5lIFRJTUVSMV9WQV9CQVNFCQkoSU9fQUREUkVTUyhWRVJTQVRJTEVfVElNRVIwXzFfQkFTRSkgKyAweDIwKQorI2RlZmluZSBUSU1FUjJfVkFfQkFTRQkJIElPX0FERFJFU1MoVkVSU0FUSUxFX1RJTUVSMl8zX0JBU0UpCisjZGVmaW5lIFRJTUVSM19WQV9CQVNFCQkoSU9fQUREUkVTUyhWRVJTQVRJTEVfVElNRVIyXzNfQkFTRSkgKyAweDIwKQorI2RlZmluZSBWQV9JQ19CQVNFCQkgSU9fQUREUkVTUyhWRVJTQVRJTEVfVklDX0JBU0UpIAorCisvKgorICogSG93IGxvbmcgaXMgdGhlIHRpbWVyIGludGVydmFsPworICovCisjZGVmaW5lIFRJTUVSX0lOVEVSVkFMCShUSUNLU19QRVJfdVNFQyAqIG1TRUNfMTApCisjaWYgVElNRVJfSU5URVJWQUwgPj0gMHgxMDAwMDAKKyNkZWZpbmUgVElNRVJfUkVMT0FECShUSU1FUl9JTlRFUlZBTCA+PiA4KQkJLyogRGl2aWRlIGJ5IDI1NiAqLworI2RlZmluZSBUSU1FUl9DVFJMCTB4ODgJCQkJLyogRW5hYmxlLCBDbG9jayAvIDI1NiAqLworI2RlZmluZSBUSUNLUzJVU0VDUyh4KQkoMjU2ICogKHgpIC8gVElDS1NfUEVSX3VTRUMpCisjZWxpZiBUSU1FUl9JTlRFUlZBTCA+PSAweDEwMDAwCisjZGVmaW5lIFRJTUVSX1JFTE9BRAkoVElNRVJfSU5URVJWQUwgPj4gNCkJCS8qIERpdmlkZSBieSAxNiAqLworI2RlZmluZSBUSU1FUl9DVFJMCTB4ODQJCQkJLyogRW5hYmxlLCBDbG9jayAvIDE2ICovCisjZGVmaW5lIFRJQ0tTMlVTRUNTKHgpCSgxNiAqICh4KSAvIFRJQ0tTX1BFUl91U0VDKQorI2Vsc2UKKyNkZWZpbmUgVElNRVJfUkVMT0FECShUSU1FUl9JTlRFUlZBTCkKKyNkZWZpbmUgVElNRVJfQ1RSTAkweDgwCQkJCS8qIEVuYWJsZSAqLworI2RlZmluZSBUSUNLUzJVU0VDUyh4KQkoKHgpIC8gVElDS1NfUEVSX3VTRUMpCisjZW5kaWYKKworI2RlZmluZSBUSU1FUl9DVFJMX0lFCSgxIDw8IDUpCS8qIEludGVycnVwdCBFbmFibGUgKi8KKworLyoKKyAqIFdoYXQgZG9lcyBpdCBsb29rIGxpa2U/CisgKi8KK3R5cGVkZWYgc3RydWN0IFRpbWVyU3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIFRpbWVyTG9hZDsKKwl1bnNpZ25lZCBsb25nIFRpbWVyVmFsdWU7CisJdW5zaWduZWQgbG9uZyBUaW1lckNvbnRyb2w7CisJdW5zaWduZWQgbG9uZyBUaW1lckNsZWFyOworfSBUaW1lclN0cnVjdF90OworCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgbXMgc2luY2UgbGFzdCBjbG9jayBpbnRlcnJ1cHQuICBOb3RlIHRoYXQgaW50ZXJydXB0cworICogd2lsbCBoYXZlIGJlZW4gZGlzYWJsZWQgYnkgZG9fZ2V0dGltZW9mZnNldCgpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZlcnNhdGlsZV9nZXR0aW1lb2Zmc2V0KHZvaWQpCit7CisJdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIwID0gKFRpbWVyU3RydWN0X3QgKilUSU1FUjBfVkFfQkFTRTsKKwl1bnNpZ25lZCBsb25nIHRpY2tzMSwgdGlja3MyLCBzdGF0dXM7CisKKwkvKgorCSAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlja3MuICBOb3RlIHRoYXQgdGhlcmUgaXMgYSByYWNlCisJICogY29uZGl0aW9uIGJldHdlZW4gdXMgcmVhZGluZyB0aGUgdGltZXIgYW5kIGNoZWNraW5nIGZvcgorCSAqIGFuIGludGVycnVwdC4gIFdlIGdldCBhcm91bmQgdGhpcyBieSBlbnN1cmluZyB0aGF0IHRoZQorCSAqIGNvdW50ZXIgaGFzIG5vdCByZWxvYWRlZCBiZXR3ZWVuIG91ciB0d28gcmVhZHMuCisJICovCisJdGlja3MyID0gdGltZXIwLT5UaW1lclZhbHVlICYgMHhmZmZmOworCWRvIHsKKwkJdGlja3MxID0gdGlja3MyOworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChWQV9JQ19CQVNFICsgVklDX0lSUV9SQVdfU1RBVFVTKTsKKwkJdGlja3MyID0gdGltZXIwLT5UaW1lclZhbHVlICYgMHhmZmZmOworCX0gd2hpbGUgKHRpY2tzMiA+IHRpY2tzMSk7CisKKwkvKgorCSAqIE51bWJlciBvZiB0aWNrcyBzaW5jZSBsYXN0IGludGVycnVwdC4KKwkgKi8KKwl0aWNrczEgPSBUSU1FUl9SRUxPQUQgLSB0aWNrczI7CisKKwkvKgorCSAqIEludGVycnVwdCBwZW5kaW5nPyAgSWYgc28sIHdlJ3ZlIHJlbG9hZGVkIG9uY2UgYWxyZWFkeS4KKwkgKgorCSAqIEZJWE1FOiBOZWVkIHRvIGNoZWNrIHRoaXMgaXMgZWZmZWN0aXZlbHkgdGltZXIgMCB0aGF0IGV4cGlyZXMKKwkgKi8KKwlpZiAoc3RhdHVzICYgSVJRTUFTS19USU1FUklOVDBfMSkKKwkJdGlja3MxICs9IFRJTUVSX1JFTE9BRDsKKworCS8qCisJICogQ29udmVydCB0aGUgdGlja3MgdG8gdXNlY3MKKwkgKi8KKwlyZXR1cm4gVElDS1MyVVNFQ1ModGlja3MxKTsKK30KKworLyoKKyAqIElSUSBoYW5kbGVyIGZvciB0aGUgdGltZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IHZlcnNhdGlsZV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjAgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMF9WQV9CQVNFOworCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwkvLyAuLi5jbGVhciB0aGUgaW50ZXJydXB0CisJdGltZXIwLT5UaW1lckNsZWFyID0gMTsKKworCXRpbWVyX3RpY2socmVncyk7CisKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB2ZXJzYXRpbGVfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJWZXJzYXRpbGUgVGltZXIgVGljayIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IHZlcnNhdGlsZV90aW1lcl9pbnRlcnJ1cHQKK307CisKKy8qCisgKiBTZXQgdXAgdGltZXIgaW50ZXJydXB0LCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHZlcnNhdGlsZV90aW1lcl9pbml0KHZvaWQpCit7CisJdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIwID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjBfVkFfQkFTRTsKKwl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjEgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMV9WQV9CQVNFOworCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMiA9ICh2b2xhdGlsZSBUaW1lclN0cnVjdF90ICopVElNRVIyX1ZBX0JBU0U7CisJdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIzID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjNfVkFfQkFTRTsKKworCS8qIAorCSAqIHNldCBjbG9jayBmcmVxdWVuY3k6IAorCSAqCVZFUlNBVElMRV9SRUZDTEsgaXMgMzJLSHoKKwkgKglWRVJTQVRJTEVfVElNQ0xLIGlzIDFNSHoKKwkgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKUlPX0FERFJFU1MoVkVSU0FUSUxFX1NDVExfQkFTRSkgfD0gCisJICAoKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSMV9FblNlbCkgfCAoVkVSU0FUSUxFX1RJTUNMSyA8PCBWRVJTQVRJTEVfVElNRVIyX0VuU2VsKSB8IAorCSAgIChWRVJTQVRJTEVfVElNQ0xLIDw8IFZFUlNBVElMRV9USU1FUjNfRW5TZWwpIHwgKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSNF9FblNlbCkpOworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRvIGEga25vd24gc3RhdGUgKGFsbCB0aW1lcnMgb2ZmKQorCSAqLworCXRpbWVyMC0+VGltZXJDb250cm9sID0gMDsKKwl0aW1lcjEtPlRpbWVyQ29udHJvbCA9IDA7CisJdGltZXIyLT5UaW1lckNvbnRyb2wgPSAwOworCXRpbWVyMy0+VGltZXJDb250cm9sID0gMDsKKworCXRpbWVyMC0+VGltZXJMb2FkICAgID0gVElNRVJfUkVMT0FEOworCXRpbWVyMC0+VGltZXJWYWx1ZSAgID0gVElNRVJfUkVMT0FEOworCXRpbWVyMC0+VGltZXJDb250cm9sID0gVElNRVJfQ1RSTCB8IDB4NDAgfCBUSU1FUl9DVFJMX0lFOyAgLyogcGVyaW9kaWMgKyBJRSAqLworCisJLyogCisJICogTWFrZSBpcnFzIGhhcHBlbiBmb3IgdGhlIHN5c3RlbSB0aW1lcgorCSAqLworCXNldHVwX2lycShJUlFfVElNRVJJTlQwXzEsICZ2ZXJzYXRpbGVfdGltZXJfaXJxKTsKK30KKworc3RydWN0IHN5c190aW1lciB2ZXJzYXRpbGVfdGltZXIgPSB7CisJLmluaXQJCT0gdmVyc2F0aWxlX3RpbWVyX2luaXQsCisJLm9mZnNldAkJPSB2ZXJzYXRpbGVfZ2V0dGltZW9mZnNldCwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YzIwNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1ZFUlNBVElMRV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfVkVSU0FUSUxFX0gKKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+CisKK2V4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgdmVyc2F0aWxlX21hcF9pbyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHZlcnNhdGlsZV90aW1lcjsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbW1jX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZGVmaW5lIEFNQkFfREVWSUNFKG5hbWUsYnVzaWQsYmFzZSxwbGF0KQkJCVwKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgbmFtZSMjX2RldmljZSA9IHsJCQlcCisJLmRldgkJPSB7CQkJCQlcCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IH4wLAkJCVwKKwkJLmJ1c19pZAk9IGJ1c2lkLAkJCQlcCisJCS5wbGF0Zm9ybV9kYXRhID0gcGxhdCwJCQkJXAorCX0sCQkJCQkJCVwKKwkucmVzCQk9IHsJCQkJCVwKKwkJLnN0YXJ0CT0gVkVSU0FUSUxFXyMjYmFzZSMjX0JBU0UsCQlcCisJCS5lbmQJPSAoVkVSU0FUSUxFXyMjYmFzZSMjX0JBU0UpICsgU1pfNEsgLSAxLFwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCQkJXAorCX0sCQkJCQkJCVwKKwkuZG1hX21hc2sJPSB+MCwJCQkJCVwKKwkuaXJxCQk9IGJhc2UjI19JUlEsCQkJCVwKKwkvKiAuZG1hCQk9IGJhc2UjI19ETUEsKi8JCQkJXAorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzMjA4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorCitNQUNISU5FX1NUQVJUKFZFUlNBVElMRV9BQiwgIkFSTS1WZXJzYXRpbGUgQUIiKQorCU1BSU5UQUlORVIoIkFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQiKQorCUJPT1RfTUVNKDB4MDAwMDAwMDAsIDB4MTAxZjEwMDAsIDB4ZjExZjEwMDApCisJQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKKwlNQVBJTyh2ZXJzYXRpbGVfbWFwX2lvKQorCUlOSVRJUlEodmVyc2F0aWxlX2luaXRfaXJxKQorCS50aW1lcgkJPSAmdmVyc2F0aWxlX3RpbWVyLAorCUlOSVRfTUFDSElORSh2ZXJzYXRpbGVfaW5pdCkKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDIwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisKKyNpZiAxCisjZGVmaW5lIElSUV9NTUNJMUEJSVJRX1ZJQ1NPVVJDRTIzCisjZWxzZQorI2RlZmluZSBJUlFfTU1DSTFBCUlSUV9TSUNfTU1DSTFBCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSBtbWMxX3BsYXRfZGF0YSA9IHsKKwkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLnN0YXR1cwkJPSBtbWNfc3RhdHVzLAorfTsKKworI2RlZmluZSBVQVJUM19JUlEJeyBJUlFfU0lDX1VBUlQzLCBOT19JUlEgfQorI2RlZmluZSBVQVJUM19ETUEJeyAweDg2LCAweDg3IH0KKyNkZWZpbmUgU0NJMV9JUlEJeyBJUlFfU0lDX1NDSTMsIE5PX0lSUSB9CisjZGVmaW5lIFNDSTFfRE1BCXsgMHg4OCwgMHg4OSB9CisjZGVmaW5lIE1NQ0kxX0lSUQl7IElSUV9NTUNJMUEsIElSUV9TSUNfTU1DSTFCIH0KKyNkZWZpbmUgTU1DSTFfRE1BCXsgMHg4NSwgMCB9CisKKy8qCisgKiBUaGVzZSBkZXZpY2VzIGFyZSBjb25uZWN0ZWQgdmlhIHRoZSBjb3JlIEFQQiBicmlkZ2UKKyAqLworI2RlZmluZSBHUElPMl9JUlEJeyBJUlFfR1BJT0lOVDIsIE5PX0lSUSB9CisjZGVmaW5lIEdQSU8yX0RNQQl7IDAsIDAgfQorI2RlZmluZSBHUElPM19JUlEJeyBJUlFfR1BJT0lOVDMsIE5PX0lSUSB9CisjZGVmaW5lIEdQSU8zX0RNQQl7IDAsIDAgfQorCisvKgorICogVGhlc2UgZGV2aWNlcyBhcmUgY29ubmVjdGVkIHZpYSB0aGUgRE1BIEFQQiBicmlkZ2UKKyAqLworCisvKiBGUEdBIFByaW1lY2VsbHMgKi8KK0FNQkFfREVWSUNFKHVhcnQzLCAiZnBnYTowOSIsIFVBUlQzLCAgICBOVUxMKTsKK0FNQkFfREVWSUNFKHNjaTEsICAiZnBnYTowYSIsIFNDSTEsICAgICBOVUxMKTsKK0FNQkFfREVWSUNFKG1tYzEsICAiZnBnYTowYiIsIE1NQ0kxLCAgICAmbW1jMV9wbGF0X2RhdGEpOworCisvKiBEZXZDaGlwIFByaW1lY2VsbHMgKi8KK0FNQkFfREVWSUNFKGdwaW8yLCAiZGV2OmU2IiwgIEdQSU8yLCAgICBOVUxMKTsKK0FNQkFfREVWSUNFKGdwaW8zLCAiZGV2OmU3IiwgIEdQSU8zLCAgICBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkmdWFydDNfZGV2aWNlLAorCSZncGlvMl9kZXZpY2UsCisJJmdwaW8zX2RldmljZSwKKwkmc2NpMV9kZXZpY2UsCisJJm1tYzFfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdmVyc2F0aWxlX3BiX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChtYWNoaW5lX2lzX3ZlcnNhdGlsZV9wYigpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtYmFfZGV2cyk7IGkrKykgeworCQkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOworCQkJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoZCwgJmlvbWVtX3Jlc291cmNlKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHZlcnNhdGlsZV9wYl9pbml0KTsKKworTUFDSElORV9TVEFSVChWRVJTQVRJTEVfUEIsICJBUk0tVmVyc2F0aWxlIFBCIikKKwlNQUlOVEFJTkVSKCJBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkIikKKwlCT09UX01FTSgweDAwMDAwMDAwLCAweDEwMWYxMDAwLCAweGYxMWYxMDAwKQorCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCisJTUFQSU8odmVyc2F0aWxlX21hcF9pbykKKwlJTklUSVJRKHZlcnNhdGlsZV9pbml0X2lycSkKKwkudGltZXIJCT0gJnZlcnNhdGlsZV90aW1lciwKKwlJTklUX01BQ0hJTkUodmVyc2F0aWxlX2luaXQpCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vS2NvbmZpZyBiL2FyY2gvYXJtL21tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2NzBjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTAsMCArMSw0MTEgQEAKK2NvbW1lbnQgIlByb2Nlc3NvciBUeXBlIgorCitjb25maWcgQ1BVXzMyCisJYm9vbAorCWRlZmF1bHQgeQorCisjIFNlbGVjdCBDUFUgdHlwZXMgZGVwZW5kaW5nIG9uIHRoZSBhcmNoaXRlY3R1cmUgc2VsZWN0ZWQuICBUaGlzIHNlbGVjdHMKKyMgd2hpY2ggQ1BVcyB3ZSBzdXBwb3J0IGluIHRoZSBrZXJuZWwgaW1hZ2UsIGFuZCB0aGUgY29tcGlsZXIgaW5zdHJ1Y3Rpb24KKyMgb3B0aW1pc2VyIGJlaGF2aW91ci4KKworIyBBUk02MTAKK2NvbmZpZyBDUFVfQVJNNjEwCisJYm9vbCAiU3VwcG9ydCBBUk02MTAgcHJvY2Vzc29yIgorCWRlcGVuZHMgb24gQVJDSF9SUEMKKwlzZWxlY3QgQ1BVXzMydjMKKwlzZWxlY3QgQ1BVX0NBQ0hFX1YzCisJc2VsZWN0IENQVV9DQUNIRV9WSVZUCisJc2VsZWN0IENQVV9DT1BZX1YzCisJc2VsZWN0IENQVV9UTEJfVjMKKwloZWxwCisJICBUaGUgQVJNNjEwIGlzIHRoZSBzdWNjZXNzb3IgdG8gdGhlIEFSTTMgcHJvY2Vzc29yCisJICBhbmQgd2FzIHByb2R1Y2VkIGJ5IFZMU0kgVGVjaG5vbG9neSBJbmMuCisKKwkgIFNheSBZIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBBUk02MTAgcHJvY2Vzc29yLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworIyBBUk03MTAKK2NvbmZpZyBDUFVfQVJNNzEwCisJYm9vbCAiU3VwcG9ydCBBUk03MTAgcHJvY2Vzc29yIiBpZiAhQVJDSF9DTFBTNzUwMCAmJiBBUkNIX1JQQworCWRlZmF1bHQgeSBpZiBBUkNIX0NMUFM3NTAwCisJc2VsZWN0IENQVV8zMnYzCisJc2VsZWN0IENQVV9DQUNIRV9WMworCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAorCXNlbGVjdCBDUFVfQ09QWV9WMworCXNlbGVjdCBDUFVfVExCX1YzCisJaGVscAorCSAgQSAzMi1iaXQgUklTQyBtaWNyb3Byb2Nlc3NvciBiYXNlZCBvbiB0aGUgQVJNNyBwcm9jZXNzb3IgY29yZQorCSAgZGVzaWduZWQgYnkgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuIFRoZSBBUk03MTAgaXMgdGhlCisJICBzdWNjZXNzb3IgdG8gdGhlIEFSTTYxMCBwcm9jZXNzb3IuIEl0IHdhcyByZWxlYXNlZCBpbgorCSAgSnVseSAxOTk0IGJ5IFZMU0kgVGVjaG5vbG9neSBJbmMuCisKKwkgIFNheSBZIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBBUk03MTAgcHJvY2Vzc29yLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworIyBBUk03MjBUCitjb25maWcgQ1BVX0FSTTcyMFQKKwlib29sICJTdXBwb3J0IEFSTTcyMFQgcHJvY2Vzc29yIiBpZiAhQVJDSF9DTFBTNzExWCAmJiAhQVJDSF9MNzIwMCAmJiAhQVJDSF9DREI4OTcxMiAmJiBBUkNIX0lOVEVHUkFUT1IKKwlkZWZhdWx0IHkgaWYgQVJDSF9DTFBTNzExWCB8fCBBUkNIX0w3MjAwIHx8IEFSQ0hfQ0RCODk3MTIgfHwgQVJDSF9INzIwWAorCXNlbGVjdCBDUFVfMzJ2NAorCXNlbGVjdCBDUFVfQUJSVF9MVjRUCisJc2VsZWN0IENQVV9DQUNIRV9WNAorCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAorCXNlbGVjdCBDUFVfQ09QWV9WNFdUCisJc2VsZWN0IENQVV9UTEJfVjRXVAorCWhlbHAKKwkgIEEgMzItYml0IFJJU0MgcHJvY2Vzc29yIHdpdGggOGtCeXRlIENhY2hlLCBXcml0ZSBCdWZmZXIgYW5kCisJICBNTVUgYnVpbHQgYXJvdW5kIGFuIEFSTTdURE1JIGNvcmUuCisKKwkgIFNheSBZIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBBUk03MjBUIHByb2Nlc3Nvci4KKwkgIE90aGVyd2lzZSwgc2F5IE4uCisKKyMgQVJNOTIwVAorY29uZmlnIENQVV9BUk05MjBUCisJYm9vbCAiU3VwcG9ydCBBUk05MjBUIHByb2Nlc3NvciIgaWYgIUFSQ0hfUzNDMjQxMAorCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfUzNDMjQxMCB8fCBBUkNIX0lNWAorCWRlZmF1bHQgeSBpZiBBUkNIX1MzQzI0MTAKKwlzZWxlY3QgQ1BVXzMydjQKKwlzZWxlY3QgQ1BVX0FCUlRfRVY0VAorCXNlbGVjdCBDUFVfQ0FDSEVfVjRXVAorCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAorCXNlbGVjdCBDUFVfQ09QWV9WNFdCCisJc2VsZWN0IENQVV9UTEJfVjRXQkkKKwloZWxwCisJICBUaGUgQVJNOTIwVCBpcyBsaWNlbnNlZCB0byBiZSBwcm9kdWNlZCBieSBudW1lcm91cyB2ZW5kb3JzLAorCSAgYW5kIGlzIHVzZWQgaW4gdGhlIE1hdmVyaWNrIEVQOTMxMiBhbmQgdGhlIFNhbXN1bmcgUzNDMjQxMC4KKworCSAgTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgTWF2ZXJpY2sgRVA5MzEyIGF0CisJICA8aHR0cDovL2xpbnV4ZGV2aWNlcy5jb20vcHJvZHVjdHMvUEQyMzgyODY2MDY4Lmh0bWw+LgorCisJICBTYXkgWSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgQVJNOTIwVCBwcm9jZXNzb3IuCisJICBPdGhlcndpc2UsIHNheSBOLgorCisjIEFSTTkyMlQKK2NvbmZpZyBDUFVfQVJNOTIyVAorCWJvb2wgIlN1cHBvcnQgQVJNOTIyVCBwcm9jZXNzb3IiIGlmIEFSQ0hfSU5URUdSQVRPUgorCWRlcGVuZHMgb24gQVJDSF9DQU1FTE9UIHx8IEFSQ0hfTEg3QTQwWCB8fCBBUkNIX0lOVEVHUkFUT1IKKwlkZWZhdWx0IHkgaWYgQVJDSF9DQU1FTE9UIHx8IEFSQ0hfTEg3QTQwWAorCXNlbGVjdCBDUFVfMzJ2NAorCXNlbGVjdCBDUFVfQUJSVF9FVjRUCisJc2VsZWN0IENQVV9DQUNIRV9WNFdUCisJc2VsZWN0IENQVV9DQUNIRV9WSVZUCisJc2VsZWN0IENQVV9DT1BZX1Y0V0IKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCSQorCWhlbHAKKwkgIFRoZSBBUk05MjJUIGlzIGEgdmVyc2lvbiBvZiB0aGUgQVJNOTIwVCwgYnV0IHdpdGggc21hbGxlcgorCSAgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgY2FjaGVzLiBJdCBpcyB1c2VkIGluIEFsdGVyYSdzCisJICBFeGNhbGlidXIgWEEgZGV2aWNlIGZhbWlseS4KKworCSAgU2F5IFkgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIEFSTTkyMlQgcHJvY2Vzc29yLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworIyBBUk05MjVUCitjb25maWcgQ1BVX0FSTTkyNVQKKyAJYm9vbCAiU3VwcG9ydCBBUk05MjVUIHByb2Nlc3NvciIgaWYgQVJDSF9PTUFQCisgCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMAorIAlkZWZhdWx0IHkgaWYgQVJDSF9PTUFQMTUxMAorCXNlbGVjdCBDUFVfMzJ2NAorCXNlbGVjdCBDUFVfQUJSVF9FVjRUCisJc2VsZWN0IENQVV9DQUNIRV9WNFdUCisJc2VsZWN0IENQVV9DQUNIRV9WSVZUCisJc2VsZWN0IENQVV9DT1BZX1Y0V0IKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCSQorIAloZWxwCisgCSAgVGhlIEFSTTkyNVQgaXMgYSBtaXggYmV0d2VlbiB0aGUgQVJNOTIwVCBhbmQgQVJNOTI2VCwgYnV0IHdpdGgKKwkgIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBhbmQgZGF0YSBjYWNoZXMuIEl0IGlzIHVzZWQgaW4gVEkncyBPTUFQCisgCSAgZGV2aWNlIGZhbWlseS4KKworIAkgIFNheSBZIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBBUk05MjVUIHByb2Nlc3Nvci4KKyAJICBPdGhlcndpc2UsIHNheSBOLgorCisjIEFSTTkyNlQKK2NvbmZpZyBDUFVfQVJNOTI2VAorCWJvb2wgIlN1cHBvcnQgQVJNOTI2VCBwcm9jZXNzb3IiIGlmIEFSQ0hfSU5URUdSQVRPUgorCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfVkVSU0FUSUxFX1BCIHx8IE1BQ0hfVkVSU0FUSUxFX0FCIHx8IEFSQ0hfT01BUDczMCB8fCBBUkNIX09NQVAxNlhYCisJZGVmYXVsdCB5IGlmIEFSQ0hfVkVSU0FUSUxFX1BCIHx8IE1BQ0hfVkVSU0FUSUxFX0FCIHx8IEFSQ0hfT01BUDczMCB8fCBBUkNIX09NQVAxNlhYCisJc2VsZWN0IENQVV8zMnY1CisJc2VsZWN0IENQVV9BQlJUX0VWNVRKCisJc2VsZWN0IENQVV9DQUNIRV9WSVZUCisJc2VsZWN0IENQVV9DT1BZX1Y0V0IKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCSQorCWhlbHAKKwkgIFRoaXMgaXMgYSB2YXJpYW50IG9mIHRoZSBBUk05MjAuICBJdCBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50CisJICBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgZm9yIGNhY2hlIGFuZCBUTEIgb3BlcmF0aW9ucy4gIEN1cmlvdXNseSwKKwkgIHRoZXJlIGlzIG5vIGRvY3VtZW50YXRpb24gb24gaXQgYXQgdGhlIEFSTSBjb3Jwb3JhdGUgd2Vic2l0ZS4KKworCSAgU2F5IFkgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIEFSTTkyNlQgcHJvY2Vzc29yLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworIyBBUk0xMDIwIC0gbmVlZHMgdmFsaWRhdGluZworY29uZmlnIENQVV9BUk0xMDIwCisJYm9vbCAiU3VwcG9ydCBBUk0xMDIwVCAocmV2IDApIHByb2Nlc3NvciIKKwlkZXBlbmRzIG9uIEFSQ0hfSU5URUdSQVRPUgorCXNlbGVjdCBDUFVfMzJ2NQorCXNlbGVjdCBDUFVfQUJSVF9FVjRUCisJc2VsZWN0IENQVV9DQUNIRV9WNFdUCisJc2VsZWN0IENQVV9DQUNIRV9WSVZUCisJc2VsZWN0IENQVV9DT1BZX1Y0V0IKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCSQorCWhlbHAKKwkgIFRoZSBBUk0xMDIwIGlzIHRoZSAzMksgY2FjaGVkIHZlcnNpb24gb2YgdGhlIEFSTTEwIHByb2Nlc3NvciwKKwkgIHdpdGggYW4gYWRkaXRpb24gb2YgYSBmbG9hdGluZy1wb2ludCB1bml0LgorCisJICBTYXkgWSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgQVJNMTAyMCBwcm9jZXNzb3IuCisJICBPdGhlcndpc2UsIHNheSBOLgorCisjIEFSTTEwMjBFIC0gbmVlZHMgdmFsaWRhdGluZworY29uZmlnIENQVV9BUk0xMDIwRQorCWJvb2wgIlN1cHBvcnQgQVJNMTAyMEUgcHJvY2Vzc29yIgorCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SCisJc2VsZWN0IENQVV8zMnY1CisJc2VsZWN0IENQVV9BQlJUX0VWNFQKKwlzZWxlY3QgQ1BVX0NBQ0hFX1Y0V1QKKwlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKKwlzZWxlY3QgQ1BVX0NPUFlfVjRXQgorCXNlbGVjdCBDUFVfVExCX1Y0V0JJCisJZGVwZW5kcyBvbiBuCisKKyMgQVJNMTAyMkUKK2NvbmZpZyBDUFVfQVJNMTAyMgorCWJvb2wgIlN1cHBvcnQgQVJNMTAyMkUgcHJvY2Vzc29yIgorCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SCisJc2VsZWN0IENQVV8zMnY1CisJc2VsZWN0IENQVV9BQlJUX0VWNFQKKwlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKKwlzZWxlY3QgQ1BVX0NPUFlfVjRXQiAjIGNhbiBwcm9iYWJseSBkbyBiZXR0ZXIKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCSQorCWhlbHAKKwkgIFRoZSBBUk0xMDIyRSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVJNdjVURSBhcmNoaXRlY3R1cmUKKwkgIGJhc2VkIHVwb24gdGhlIEFSTTEwIGludGVnZXIgY29yZSB3aXRoIGEgMTZLaUIgTDEgSGFydmFyZCBjYWNoZSwKKwkgIGVtYmVkZGVkIHRyYWNlIG1hY3JvY2VsbCwgYW5kIGEgZmxvYXRpbmctcG9pbnQgdW5pdC4KKworCSAgU2F5IFkgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIEFSTTEwMjJFIHByb2Nlc3Nvci4KKwkgIE90aGVyd2lzZSwgc2F5IE4uCisKKyMgQVJNMTAyNkVKLVMKK2NvbmZpZyBDUFVfQVJNMTAyNgorCWJvb2wgIlN1cHBvcnQgQVJNMTAyNkVKLVMgcHJvY2Vzc29yIgorCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SCisJc2VsZWN0IENQVV8zMnY1CisJc2VsZWN0IENQVV9BQlJUX0VWNVQgIyBCdXQgbmVlZCBKYXplbGxlLCBidXQgRVY1VEogaWdub3JlcyBiaXQgMTAKKwlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKKwlzZWxlY3QgQ1BVX0NPUFlfVjRXQiAjIGNhbiBwcm9iYWJseSBkbyBiZXR0ZXIKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCSQorCWhlbHAKKwkgIFRoZSBBUk0xMDI2RUotUyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVJNdjVURUogYXJjaGl0ZWN0dXJlCisJICBiYXNlZCB1cG9uIHRoZSBBUk0xMCBpbnRlZ2VyIGNvcmUuCisKKwkgIFNheSBZIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBBUk0xMDI2RUotUyBwcm9jZXNzb3IuCisJICBPdGhlcndpc2UsIHNheSBOLgorCisjIFNBMTEwCitjb25maWcgQ1BVX1NBMTEwCisJYm9vbCAiU3VwcG9ydCBTdHJvbmdBUk0oUikgU0EtMTEwIHByb2Nlc3NvciIgaWYgIUFSQ0hfRUJTQTExMCAmJiAhRk9PVEJSSURHRSAmJiAhQVJDSF9UQk9YICYmICFBUkNIX1NIQVJLICYmICFBUkNIX05FWFVTUENJICYmIEFSQ0hfUlBDCisJZGVmYXVsdCB5IGlmIEFSQ0hfRUJTQTExMCB8fCBGT09UQlJJREdFIHx8IEFSQ0hfVEJPWCB8fCBBUkNIX1NIQVJLIHx8IEFSQ0hfTkVYVVNQQ0kKKwlzZWxlY3QgQ1BVXzMydjMgaWYgQVJDSF9SUEMKKwlzZWxlY3QgQ1BVXzMydjQgaWYgIUFSQ0hfUlBDCisJc2VsZWN0IENQVV9BQlJUX0VWNAorCXNlbGVjdCBDUFVfQ0FDSEVfVjRXQgorCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAorCXNlbGVjdCBDUFVfQ09QWV9WNFdCCisJc2VsZWN0IENQVV9UTEJfVjRXQgorCWhlbHAKKwkgIFRoZSBJbnRlbCBTdHJvbmdBUk0oUikgU0EtMTEwIGlzIGEgMzItYml0IG1pY3JvcHJvY2Vzc29yIGFuZAorCSAgaXMgYXZhaWxhYmxlIGF0IGZpdmUgc3BlZWRzIHJhbmdpbmcgZnJvbSAxMDAgTUh6IHRvIDIzMyBNSHouCisJICBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9zdHJvbmcvc2ExMTAuaHRtPi4KKworCSAgU2F5IFkgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIFNBLTExMCBwcm9jZXNzb3IuCisJICBPdGhlcndpc2UsIHNheSBOLgorCisjIFNBMTEwMAorY29uZmlnIENQVV9TQTExMDAKKwlib29sCisJZGVwZW5kcyBvbiBBUkNIX1NBMTEwMAorCWRlZmF1bHQgeQorCXNlbGVjdCBDUFVfMzJ2NAorCXNlbGVjdCBDUFVfQUJSVF9FVjQKKwlzZWxlY3QgQ1BVX0NBQ0hFX1Y0V0IKKwlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCCisJc2VsZWN0IENQVV9NSU5JQ0FDSEUKKworIyBYU2NhbGUKK2NvbmZpZyBDUFVfWFNDQUxFCisJYm9vbAorCWRlcGVuZHMgb24gQVJDSF9JT1AzWFggfHwgQVJDSF9QWEEgfHwgQVJDSF9JWFA0WFggfHwgQVJDSF9JWFAyMDAwCisJZGVmYXVsdCB5CisJc2VsZWN0IENQVV8zMnY1CisJc2VsZWN0IENQVV9BQlJUX0VWNVQKKwlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKKwlzZWxlY3QgQ1BVX1RMQl9WNFdCSQorCXNlbGVjdCBDUFVfTUlOSUNBQ0hFCisKKyMgQVJNdjYKK2NvbmZpZyBDUFVfVjYKKwlib29sICJTdXBwb3J0IEFSTSBWNiBwcm9jZXNzb3IiCisJZGVwZW5kcyBvbiBBUkNIX0lOVEVHUkFUT1IKKwlzZWxlY3QgQ1BVXzMydjYKKwlzZWxlY3QgQ1BVX0FCUlRfRVY2CisJc2VsZWN0IENQVV9DQUNIRV9WNgorCXNlbGVjdCBDUFVfQ0FDSEVfVklQVAorCXNlbGVjdCBDUFVfQ09QWV9WNgorCXNlbGVjdCBDUFVfVExCX1Y2CisKKyMgRmlndXJlIG91dCB3aGF0IHByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdmVyc2lvbiB3ZSBzaG91bGQgYmUgdXNpbmcuCisjIFRoaXMgZGVmaW5lcyB0aGUgY29tcGlsZXIgaW5zdHJ1Y3Rpb24gc2V0IHdoaWNoIGRlcGVuZHMgb24gdGhlIG1hY2hpbmUgdHlwZS4KK2NvbmZpZyBDUFVfMzJ2MworCWJvb2wKKworY29uZmlnIENQVV8zMnY0CisJYm9vbAorCitjb25maWcgQ1BVXzMydjUKKwlib29sCisKK2NvbmZpZyBDUFVfMzJ2NgorCWJvb2wKKworIyBUaGUgYWJvcnQgbW9kZWwKK2NvbmZpZyBDUFVfQUJSVF9FVjQKKwlib29sCisKK2NvbmZpZyBDUFVfQUJSVF9FVjRUCisJYm9vbAorCitjb25maWcgQ1BVX0FCUlRfTFY0VAorCWJvb2wKKworY29uZmlnIENQVV9BQlJUX0VWNVQKKwlib29sCisKK2NvbmZpZyBDUFVfQUJSVF9FVjVUSgorCWJvb2wKKworY29uZmlnIENQVV9BQlJUX0VWNgorCWJvb2wKKworIyBUaGUgY2FjaGUgbW9kZWwKK2NvbmZpZyBDUFVfQ0FDSEVfVjMKKwlib29sCisKK2NvbmZpZyBDUFVfQ0FDSEVfVjQKKwlib29sCisKK2NvbmZpZyBDUFVfQ0FDSEVfVjRXVAorCWJvb2wKKworY29uZmlnIENQVV9DQUNIRV9WNFdCCisJYm9vbAorCitjb25maWcgQ1BVX0NBQ0hFX1Y2CisJYm9vbAorCitjb25maWcgQ1BVX0NBQ0hFX1ZJVlQKKwlib29sCisKK2NvbmZpZyBDUFVfQ0FDSEVfVklQVAorCWJvb2wKKworIyBUaGUgY29weS1wYWdlIG1vZGVsCitjb25maWcgQ1BVX0NPUFlfVjMKKwlib29sCisKK2NvbmZpZyBDUFVfQ09QWV9WNFdUCisJYm9vbAorCitjb25maWcgQ1BVX0NPUFlfVjRXQgorCWJvb2wKKworY29uZmlnIENQVV9DT1BZX1Y2CisJYm9vbAorCisjIFRoaXMgc2VsZWN0cyB0aGUgVExCIG1vZGVsCitjb25maWcgQ1BVX1RMQl9WMworCWJvb2wKKwloZWxwCisJICBBUk0gQXJjaGl0ZWN0dXJlIFZlcnNpb24gMyBUTEIuCisKK2NvbmZpZyBDUFVfVExCX1Y0V1QKKwlib29sCisJaGVscAorCSAgQVJNIEFyY2hpdGVjdHVyZSBWZXJzaW9uIDQgVExCIHdpdGggd3JpdGV0aHJvdWdoIGNhY2hlLgorCitjb25maWcgQ1BVX1RMQl9WNFdCCisJYm9vbAorCWhlbHAKKwkgIEFSTSBBcmNoaXRlY3R1cmUgVmVyc2lvbiA0IFRMQiB3aXRoIHdyaXRlYmFjayBjYWNoZS4KKworY29uZmlnIENQVV9UTEJfVjRXQkkKKwlib29sCisJaGVscAorCSAgQVJNIEFyY2hpdGVjdHVyZSBWZXJzaW9uIDQgVExCIHdpdGggd3JpdGViYWNrIGNhY2hlIGFuZCBpbnZhbGlkYXRlCisJICBpbnN0cnVjdGlvbiBjYWNoZSBlbnRyeS4KKworY29uZmlnIENQVV9UTEJfVjYKKwlib29sCisKK2NvbmZpZyBDUFVfTUlOSUNBQ0hFCisJYm9vbAorCWhlbHAKKwkgIFByb2Nlc3NvciBoYXMgYSBtaW5pY2FjaGUuCisKK2NvbW1lbnQgIlByb2Nlc3NvciBGZWF0dXJlcyIKKworY29uZmlnIEFSTV9USFVNQgorCWJvb2wgIlN1cHBvcnQgVGh1bWIgdXNlciBiaW5hcmllcyIKKwlkZXBlbmRzIG9uIENQVV9BUk03MjBUIHx8IENQVV9BUk05MjBUIHx8IENQVV9BUk05MjJUIHx8IENQVV9BUk05MjVUIHx8IENQVV9BUk05MjZUIHx8IENQVV9BUk0xMDIwIHx8IENQVV9BUk0xMDIwRSB8fCBDUFVfQVJNMTAyMiB8fCBDUFVfQVJNMTAyNiB8fCBDUFVfWFNDQUxFIHx8IENQVV9WNgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUga2VybmVsIHN1cHBvcnQgZm9yIHJ1bm5pbmcgdXNlciBzcGFjZQorCSAgVGh1bWIgYmluYXJpZXMuCisKKwkgIFRoZSBUaHVtYiBpbnN0cnVjdGlvbiBzZXQgaXMgYSBjb21wcmVzc2VkIGZvcm0gb2YgdGhlIHN0YW5kYXJkIEFSTQorCSAgaW5zdHJ1Y3Rpb24gc2V0IHJlc3VsdGluZyBpbiBzbWFsbGVyIGJpbmFyaWVzIGF0IHRoZSBleHBlbnNlIG9mCisJICBzbGlnaHRseSBsZXNzIGVmZmljaWVudCBjb2RlLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgYWxsIGlzLCBzYXlpbmcgWSBpcyBhIHNhZmUgY2hvaWNlLgorCitjb25maWcgQ1BVX0JJR19FTkRJQU4KKwlib29sICJCdWlsZCBiaWctZW5kaWFuIGtlcm5lbCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfQklHX0VORElBTgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSBwbGFuIG9uIHJ1bm5pbmcgYSBrZXJuZWwgaW4gYmlnLWVuZGlhbiBtb2RlLgorCSAgTm90ZSB0aGF0IHlvdXIgYm9hcmQgbXVzdCBiZSBwcm9wZXJseSBidWlsdCBhbmQgeW91ciBib2FyZAorCSAgcG9ydCBtdXN0IHByb3Blcmx5IGVuYWJsZSBhbnkgYmlnLWVuZGlhbiByZWxhdGVkIGZlYXR1cmVzCisJICBvZiB5b3VyIGNoaXBzZXQvYm9hcmQvcHJvY2Vzc29yLgorCitjb25maWcgQ1BVX0lDQUNIRV9ESVNBQkxFCisJYm9vbCAiRGlzYWJsZSBJLUNhY2hlIgorCWRlcGVuZHMgb24gQ1BVX0FSTTkyMFQgfHwgQ1BVX0FSTTkyMlQgfHwgQ1BVX0FSTTkyNVQgfHwgQ1BVX0FSTTkyNlQgfHwgQ1BVX0FSTTEwMjAKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgdGhlIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBjYWNoZS4gVW5sZXNzCisJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDUFVfRENBQ0hFX0RJU0FCTEUKKwlib29sICJEaXNhYmxlIEQtQ2FjaGUiCisJZGVwZW5kcyBvbiBDUFVfQVJNOTIwVCB8fCBDUFVfQVJNOTIyVCB8fCBDUFVfQVJNOTI1VCB8fCBDUFVfQVJNOTI2VCB8fCBDUFVfQVJNMTAyMAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZGlzYWJsZSB0aGUgcHJvY2Vzc29yIGRhdGEgY2FjaGUuIFVubGVzcworCSAgeW91IGhhdmUgYSByZWFzb24gbm90IHRvIG9yIGFyZSB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwlib29sICJGb3JjZSB3cml0ZSB0aHJvdWdoIEQtY2FjaGUiCisJZGVwZW5kcyBvbiAoQ1BVX0FSTTkyMFQgfHwgQ1BVX0FSTTkyMlQgfHwgQ1BVX0FSTTkyNVQgfHwgQ1BVX0FSTTkyNlQgfHwgQ1BVX0FSTTEwMjApICYmICFDUFVfRElTQUJMRV9EQ0FDSEUKKwlkZWZhdWx0IHkgaWYgQ1BVX0FSTTkyNVQKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHVzZSB0aGUgZGF0YSBjYWNoZSBpbiB3cml0ZXRocm91Z2ggbW9kZS4gVW5sZXNzIHlvdQorCSAgc3BlY2lmaWNhbGx5IHJlcXVpcmUgdGhpcyBvciBhcmUgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIENQVV9DQUNIRV9ST1VORF9ST0JJTgorCWJvb2wgIlJvdW5kIHJvYmluIEkgYW5kIEQgY2FjaGUgcmVwbGFjZW1lbnQgYWxnb3JpdGhtIgorCWRlcGVuZHMgb24gKENQVV9BUk05MjZUIHx8IENQVV9BUk0xMDIwKSAmJiAoIUNQVV9JQ0FDSEVfRElTQUJMRSB8fCAhQ1BVX0RDQUNIRV9ESVNBQkxFKQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gdXNlIHRoZSBwcmVkaWN0YWJsZSByb3VuZC1yb2JpbiBjYWNoZSByZXBsYWNlbWVudAorCSAgcG9saWN5LiAgVW5sZXNzIHlvdSBzcGVjaWZpY2FsbHkgcmVxdWlyZSB0aGlzIG9yIGFyZSB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQ1BVX0JQUkVESUNUX0RJU0FCTEUKKwlib29sICJEaXNhYmxlIGJyYW5jaCBwcmVkaWN0aW9uIgorCWRlcGVuZHMgb24gQ1BVX0FSTTEwMjAKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgYnJhbmNoIHByZWRpY3Rpb24uICBJZiB1bnN1cmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vTWFrZWZpbGUgYi9hcmNoL2FybS9tbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2YzMTZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKQEAgLTAsMCArMSw1NiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGFybS1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbWVtb3J5IG1hbmFnZXIuCisjCisKK29iai15CQkJCTo9IGNvbnNpc3RlbnQubyBleHRhYmxlLm8gZmF1bHQtYXJtdi5vIFwKKwkJCQkgICBmYXVsdC5vIGZsdXNoLm8gaW5pdC5vIGlvcmVtYXAubyBtbWFwLm8gXAorCQkJCSAgIG1tLWFybXYubworCitvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IHByb2Mtc3ltcy5vCisKK29iai0kKENPTkZJR19BTElHTk1FTlRfVFJBUCkJKz0gYWxpZ25tZW50Lm8KK29iai0kKENPTkZJR19ESVNDT05USUdNRU0pCSs9IGRpc2NvbnRpZy5vCisKK29iai0kKENPTkZJR19DUFVfQUJSVF9FVjQpCSs9IGFib3J0LWV2NC5vCitvYmotJChDT05GSUdfQ1BVX0FCUlRfRVY0VCkJKz0gYWJvcnQtZXY0dC5vCitvYmotJChDT05GSUdfQ1BVX0FCUlRfTFY0VCkJKz0gYWJvcnQtbHY0dC5vCitvYmotJChDT05GSUdfQ1BVX0FCUlRfRVY1VCkJKz0gYWJvcnQtZXY1dC5vCitvYmotJChDT05GSUdfQ1BVX0FCUlRfRVY1VEopCSs9IGFib3J0LWV2NXRqLm8KK29iai0kKENPTkZJR19DUFVfQUJSVF9FVjYpCSs9IGFib3J0LWV2Ni5vCisKK29iai0kKENPTkZJR19DUFVfQ0FDSEVfVjMpCSs9IGNhY2hlLXYzLm8KK29iai0kKENPTkZJR19DUFVfQ0FDSEVfVjQpCSs9IGNhY2hlLXY0Lm8KK29iai0kKENPTkZJR19DUFVfQ0FDSEVfVjRXVCkJKz0gY2FjaGUtdjR3dC5vCitvYmotJChDT05GSUdfQ1BVX0NBQ0hFX1Y0V0IpCSs9IGNhY2hlLXY0d2Iubworb2JqLSQoQ09ORklHX0NQVV9DQUNIRV9WNikJKz0gY2FjaGUtdjYubworCitvYmotJChDT05GSUdfQ1BVX0NPUFlfVjMpCSs9IGNvcHlwYWdlLXYzLm8KK29iai0kKENPTkZJR19DUFVfQ09QWV9WNFdUKQkrPSBjb3B5cGFnZS12NHd0Lm8KK29iai0kKENPTkZJR19DUFVfQ09QWV9WNFdCKQkrPSBjb3B5cGFnZS12NHdiLm8KK29iai0kKENPTkZJR19DUFVfQ09QWV9WNikJKz0gY29weXBhZ2UtdjYubyBtbXUubworb2JqLSQoQ09ORklHX0NQVV9TQTExMDApCSs9IGNvcHlwYWdlLXY0bWMubworb2JqLSQoQ09ORklHX0NQVV9YU0NBTEUpCSs9IGNvcHlwYWdlLXhzY2FsZS5vCisKK29iai0kKENPTkZJR19DUFVfTUlOSUNBQ0hFKQkrPSBtaW5pY2FjaGUubworCitvYmotJChDT05GSUdfQ1BVX1RMQl9WMykJKz0gdGxiLXYzLm8KK29iai0kKENPTkZJR19DUFVfVExCX1Y0V1QpCSs9IHRsYi12NC5vCitvYmotJChDT05GSUdfQ1BVX1RMQl9WNFdCKQkrPSB0bGItdjR3Yi5vCitvYmotJChDT05GSUdfQ1BVX1RMQl9WNFdCSSkJKz0gdGxiLXY0d2JpLm8KK29iai0kKENPTkZJR19DUFVfVExCX1Y2KQkrPSB0bGItdjYubworCitvYmotJChDT05GSUdfQ1BVX0FSTTYxMCkJKz0gcHJvYy1hcm02Xzcubworb2JqLSQoQ09ORklHX0NQVV9BUk03MTApCSs9IHByb2MtYXJtNl83Lm8KK29iai0kKENPTkZJR19DUFVfQVJNNzIwVCkJKz0gcHJvYy1hcm03MjAubworb2JqLSQoQ09ORklHX0NQVV9BUk05MjBUKQkrPSBwcm9jLWFybTkyMC5vCitvYmotJChDT05GSUdfQ1BVX0FSTTkyMlQpCSs9IHByb2MtYXJtOTIyLm8KK29iai0kKENPTkZJR19DUFVfQVJNOTI1VCkJKz0gcHJvYy1hcm05MjUubworb2JqLSQoQ09ORklHX0NQVV9BUk05MjZUKQkrPSBwcm9jLWFybTkyNi5vCitvYmotJChDT05GSUdfQ1BVX0FSTTEwMjApCSs9IHByb2MtYXJtMTAyMC5vCitvYmotJChDT05GSUdfQ1BVX0FSTTEwMjBFKQkrPSBwcm9jLWFybTEwMjBlLm8KK29iai0kKENPTkZJR19DUFVfQVJNMTAyMikJKz0gcHJvYy1hcm0xMDIyLm8KK29iai0kKENPTkZJR19DUFVfQVJNMTAyNikJKz0gcHJvYy1hcm0xMDI2Lm8KK29iai0kKENPTkZJR19DUFVfU0ExMTApCQkrPSBwcm9jLXNhMTEwLm8KK29iai0kKENPTkZJR19DUFVfU0ExMTAwKQkrPSBwcm9jLXNhMTEwMC5vCitvYmotJChDT05GSUdfQ1BVX1hTQ0FMRSkJKz0gcHJvYy14c2NhbGUubworb2JqLSQoQ09ORklHX0NQVV9WNikJCSs9IHByb2MtdjYubyBibG9ja29wcy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hYm9ydC1ldjQuUyBiL2FyY2gvYXJtL21tL2Fib3J0LWV2NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMThmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjQuUwpAQCAtMCwwICsxLDMwIEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKy8qCisgKiBGdW5jdGlvbjogdjRfZWFybHlfYWJvcnQKKyAqCisgKiBQYXJhbXMgIDogcjIgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KKyAqICAgICAgICAgOiByMyA9IHNhdmVkIFNQU1IKKyAqCisgKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0CisgKgkgICA6IHIxID0gRlNSLCBiaXQgMTEgPSB3cml0ZQorICoJICAgOiByMi1yOCA9IGNvcnJ1cHRlZAorICoJICAgOiByOSA9IHByZXNlcnZlZAorICoJICAgOiBzcCA9IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgKgorICogUHVycG9zZSA6IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IGFib3J0ZWQgaW5zdHJ1Y3Rpb24uCisgKiBOb3RlOiB3ZSByZWFkIHVzZXIgc3BhY2UuICBUaGlzIG1lYW5zIHdlIG1pZ2h0IGNhdXNlIGEgZGF0YQorICogYWJvcnQgaGVyZSBpZiB0aGUgSS1UTEIgYW5kIEQtVExCIGFyZW4ndCBzZWVpbmcgdGhlIHNhbWUKKyAqIHBpY3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXMgaGFwcGVuLiAgV2UgbGl2ZSB3aXRoIGl0LgorICovCisJLmFsaWduCTUKK0VOVFJZKHY0X2Vhcmx5X2Fib3J0KQorCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgorCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgorCWxkcglyMywgW3IyXQkJCUAgcmVhZCBhYm9ydGVkIEFSTSBpbnN0cnVjdGlvbgorCWJpYwlyMSwgcjEsICMxIDw8IDExIHwgMSA8PCAxMAlAIGNsZWFyIGJpdHMgMTEgYW5kIDEwIG9mIEZTUgorCXRzdAlyMywgIzEgPDwgMjAJCQlAIEwgPSAxIC0+IHdyaXRlPworCW9ycmVxCXIxLCByMSwgIzEgPDwgMTEJCUAgeWVzLgorCW1vdglwYywgbHIKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hYm9ydC1ldjR0LlMgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjR0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyODI1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2Fib3J0LWV2NHQuUwpAQCAtMCwwICsxLDMwIEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlICJhYm9ydC1tYWNyby5TIgorLyoKKyAqIEZ1bmN0aW9uOiB2NHRfZWFybHlfYWJvcnQKKyAqCisgKiBQYXJhbXMgIDogcjIgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KKyAqICAgICAgICAgOiByMyA9IHNhdmVkIFNQU1IKKyAqCisgKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0CisgKgkgICA6IHIxID0gRlNSLCBiaXQgMTEgPSB3cml0ZQorICoJICAgOiByMi1yOCA9IGNvcnJ1cHRlZAorICoJICAgOiByOSA9IHByZXNlcnZlZAorICoJICAgOiBzcCA9IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgKgorICogUHVycG9zZSA6IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IGFib3J0ZWQgaW5zdHJ1Y3Rpb24uCisgKiBOb3RlOiB3ZSByZWFkIHVzZXIgc3BhY2UuICBUaGlzIG1lYW5zIHdlIG1pZ2h0IGNhdXNlIGEgZGF0YQorICogYWJvcnQgaGVyZSBpZiB0aGUgSS1UTEIgYW5kIEQtVExCIGFyZW4ndCBzZWVpbmcgdGhlIHNhbWUKKyAqIHBpY3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXMgaGFwcGVuLiAgV2UgbGl2ZSB3aXRoIGl0LgorICovCisJLmFsaWduCTUKK0VOVFJZKHY0dF9lYXJseV9hYm9ydCkKKwltcmMJcDE1LCAwLCByMSwgYzUsIGMwLCAwCQlAIGdldCBGU1IKKwltcmMJcDE1LCAwLCByMCwgYzYsIGMwLCAwCQlAIGdldCBGQVIKKwlkb190aHVtYl9hYm9ydAorCWxkcmVxCXIzLCBbcjJdCQkJQCByZWFkIGFib3J0ZWQgQVJNIGluc3RydWN0aW9uCisJYmljCXIxLCByMSwgIzEgPDwgMTEgfCAxIDw8IDEwCUAgY2xlYXIgYml0cyAxMSBhbmQgMTAgb2YgRlNSCisJdHN0CXIzLCAjMSA8PCAyMAkJCUAgY2hlY2sgd3JpdGUKKwlvcnJlcQlyMSwgcjEsICMxIDw8IDExCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtZXY1dC5TIGIvYXJjaC9hcm0vbW0vYWJvcnQtZXY1dC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjUxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjV0LlMKQEAgLTAsMCArMSwzMSBAQAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSAiYWJvcnQtbWFjcm8uUyIKKy8qCisgKiBGdW5jdGlvbjogdjV0X2Vhcmx5X2Fib3J0CisgKgorICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCisgKiAgICAgICAgIDogcjMgPSBzYXZlZCBTUFNSCisgKgorICogUmV0dXJucyA6IHIwID0gYWRkcmVzcyBvZiBhYm9ydAorICoJICAgOiByMSA9IEZTUiwgYml0IDExID0gd3JpdGUKKyAqCSAgIDogcjItcjggPSBjb3JydXB0ZWQKKyAqCSAgIDogcjkgPSBwcmVzZXJ2ZWQKKyAqCSAgIDogc3AgPSBwb2ludGVyIHRvIHJlZ2lzdGVycworICoKKyAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhYm9ydGVkIGluc3RydWN0aW9uLgorICogTm90ZTogd2UgcmVhZCB1c2VyIHNwYWNlLiAgVGhpcyBtZWFucyB3ZSBtaWdodCBjYXVzZSBhIGRhdGEKKyAqIGFib3J0IGhlcmUgaWYgdGhlIEktVExCIGFuZCBELVRMQiBhcmVuJ3Qgc2VlaW5nIHRoZSBzYW1lCisgKiBwaWN0dXJlLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBkb2VzIGhhcHBlbi4gIFdlIGxpdmUgd2l0aCBpdC4KKyAqLworCS5hbGlnbgk1CitFTlRSWSh2NXRfZWFybHlfYWJvcnQpCisJbXJjCXAxNSwgMCwgcjEsIGM1LCBjMCwgMAkJQCBnZXQgRlNSCisJbXJjCXAxNSwgMCwgcjAsIGM2LCBjMCwgMAkJQCBnZXQgRkFSCisJZG9fdGh1bWJfYWJvcnQKKwlsZHJlcQlyMywgW3IyXQkJCUAgcmVhZCBhYm9ydGVkIEFSTSBpbnN0cnVjdGlvbgorCWJpYwlyMSwgcjEsICMxIDw8IDExCQlAIGNsZWFyIGJpdHMgMTEgb2YgRlNSCisJZG9fbGRyZF9hYm9ydAorCXRzdAlyMywgIzEgPDwgMjAJCQlAIGNoZWNrIHdyaXRlCisJb3JyZXEJcjEsIHIxLCAjMSA8PCAxMQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2Fib3J0LWV2NXRqLlMgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjV0ai5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTY4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjV0ai5TCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgImFib3J0LW1hY3JvLlMiCisvKgorICogRnVuY3Rpb246IHY1dGpfZWFybHlfYWJvcnQKKyAqCisgKiBQYXJhbXMgIDogcjIgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KKyAqICAgICAgICAgOiByMyA9IHNhdmVkIFNQU1IKKyAqCisgKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0CisgKgkgICA6IHIxID0gRlNSLCBiaXQgMTEgPSB3cml0ZQorICoJICAgOiByMi1yOCA9IGNvcnJ1cHRlZAorICoJICAgOiByOSA9IHByZXNlcnZlZAorICoJICAgOiBzcCA9IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgKgorICogUHVycG9zZSA6IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IGFib3J0ZWQgaW5zdHJ1Y3Rpb24uCisgKiBOb3RlOiB3ZSByZWFkIHVzZXIgc3BhY2UuICBUaGlzIG1lYW5zIHdlIG1pZ2h0IGNhdXNlIGEgZGF0YQorICogYWJvcnQgaGVyZSBpZiB0aGUgSS1UTEIgYW5kIEQtVExCIGFyZW4ndCBzZWVpbmcgdGhlIHNhbWUKKyAqIHBpY3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXMgaGFwcGVuLiAgV2UgbGl2ZSB3aXRoIGl0LgorICovCisJLmFsaWduCTUKK0VOVFJZKHY1dGpfZWFybHlfYWJvcnQpCisJbXJjCXAxNSwgMCwgcjEsIGM1LCBjMCwgMAkJQCBnZXQgRlNSCisJbXJjCXAxNSwgMCwgcjAsIGM2LCBjMCwgMAkJQCBnZXQgRkFSCisJYmljCXIxLCByMSwgIzEgPDwgMTEgfCAxIDw8IDEwCUAgY2xlYXIgYml0cyAxMSBhbmQgMTAgb2YgRlNSCisJdHN0CXIzLCAjUFNSX0pfQklUCQkJQCBKYXZhPworCW1vdm5lCXBjLCBscgorCWRvX3RodW1iX2Fib3J0CisJbGRyZXEJcjMsIFtyMl0JCQlAIHJlYWQgYWJvcnRlZCBBUk0gaW5zdHJ1Y3Rpb24KKwlkb19sZHJkX2Fib3J0CisJdHN0CXIzLCAjMSA8PCAyMAkJCUAgTCA9IDAgLT4gd3JpdGUKKwlvcnJlcQlyMSwgcjEsICMxIDw8IDExCQlAIHllcy4KKwltb3YJcGMsIGxyCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtZXY2LlMgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGIyY2JiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vYWJvcnQtZXY2LlMKQEAgLTAsMCArMSwyMyBAQAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisvKgorICogRnVuY3Rpb246IHY2X2Vhcmx5X2Fib3J0CisgKgorICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCisgKiAgICAgICAgIDogcjMgPSBzYXZlZCBTUFNSCisgKgorICogUmV0dXJucyA6IHIwID0gYWRkcmVzcyBvZiBhYm9ydAorICoJICAgOiByMSA9IEZTUiwgYml0IDExID0gd3JpdGUKKyAqCSAgIDogcjItcjggPSBjb3JydXB0ZWQKKyAqCSAgIDogcjkgPSBwcmVzZXJ2ZWQKKyAqCSAgIDogc3AgPSBwb2ludGVyIHRvIHJlZ2lzdGVycworICoKKyAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhYm9ydGVkIGluc3RydWN0aW9uLgorICovCisJLmFsaWduCTUKK0VOVFJZKHY2X2Vhcmx5X2Fib3J0KQorCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgorCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgorCW1vdglwYywgbHIKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hYm9ydC1sdjR0LlMgYi9hcmNoL2FybS9tbS9hYm9ydC1sdjR0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3NDNlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2Fib3J0LWx2NHQuUwpAQCAtMCwwICsxLDIyMCBAQAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisvKgorICogRnVuY3Rpb246IHY0dF9sYXRlX2Fib3J0CisgKgorICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCisgKiAgICAgICAgIDogcjMgPSBzYXZlZCBTUFNSCisgKgorICogUmV0dXJucyA6IHIwID0gYWRkcmVzcyBvZiBhYm9ydAorICoJICAgOiByMSA9IEZTUiwgYml0IDExID0gd3JpdGUKKyAqCSAgIDogcjItcjggPSBjb3JydXB0ZWQKKyAqCSAgIDogcjkgPSBwcmVzZXJ2ZWQKKyAqCSAgIDogc3AgPSBwb2ludGVyIHRvIHJlZ2lzdGVycworICoKKyAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhYm9ydGVkIGluc3RydWN0aW9uLgorICogTm90ZTogd2UgcmVhZCB1c2VyIHNwYWNlLiAgVGhpcyBtZWFucyB3ZSBtaWdodCBjYXVzZSBhIGRhdGEKKyAqIGFib3J0IGhlcmUgaWYgdGhlIEktVExCIGFuZCBELVRMQiBhcmVuJ3Qgc2VlaW5nIHRoZSBzYW1lCisgKiBwaWN0dXJlLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBkb2VzIGhhcHBlbi4gIFdlIGxpdmUgd2l0aCBpdC4KKyAqLworRU5UUlkodjR0X2xhdGVfYWJvcnQpCisJdHN0CXIzLCAjUFNSX1RfQklUCQkJQCBjaGVjayBmb3IgdGh1bWIgbW9kZQorCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgorCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgorCWJuZQkuZGF0YV90aHVtYl9hYm9ydAorCWxkcglyOCwgW3IyXQkJCUAgcmVhZCBhcm0gaW5zdHJ1Y3Rpb24KKwliaWMJcjEsIHIxLCAjMSA8PCAxMSB8IDEgPDwgMTAJQCBjbGVhciBiaXRzIDExIGFuZCAxMCBvZiBGU1IKKwl0c3QJcjgsICMxIDw8IDIwCQkJQCBMID0gMSAtPiB3cml0ZT8KKwlvcnJlcQlyMSwgcjEsICMxIDw8IDExCQlAIHllcy4KKwlhbmQJcjcsIHI4LCAjMTUgPDwgMjQKKwlhZGQJcGMsIHBjLCByNywgbHNyICMyMgkJQCBOb3cgYnJhbmNoIHRvIHRoZSByZWxldmFudCBwcm9jZXNzaW5nIHJvdXRpbmUKKwlub3AKKworLyogMCAqLwliCS5kYXRhX2FybV9sYXRlbGRyaHBvc3QJCUAgbGRyaAlyZCwgW3JuXSwgI20vcm0KKy8qIDEgKi8JYgkuZGF0YV9hcm1fbGF0ZWxkcmhwcmUJCUAgbGRyaAlyZCwgW3JuLCAjbS9ybV0KKy8qIDIgKi8JYgkuZGF0YV91bmtub3duCisvKiAzICovCWIJLmRhdGFfdW5rbm93bgorLyogNCAqLwliCS5kYXRhX2FybV9sYXRlbGRycG9zdGNvbnN0CUAgbGRyCXJkLCBbcm5dLCAjbQorLyogNSAqLwliCS5kYXRhX2FybV9sYXRlbGRycHJlY29uc3QJQCBsZHIJcmQsIFtybiwgI21dIAorLyogNiAqLwliCS5kYXRhX2FybV9sYXRlbGRycG9zdHJlZwlAIGxkcglyZCwgW3JuXSwgcm0KKy8qIDcgKi8JYgkuZGF0YV9hcm1fbGF0ZWxkcnByZXJlZwkJQCBsZHIJcmQsIFtybiwgcm1dCisvKiA4ICovCWIJLmRhdGFfYXJtX2xkbXN0bQkJQCBsZG0qYQlybiwgPHJsaXN0PgorLyogOSAqLwliCS5kYXRhX2FybV9sZG1zdG0JCUAgbGRtKmIJcm4sIDxybGlzdD4KKy8qIGEgKi8JYgkuZGF0YV91bmtub3duCisvKiBiICovCWIJLmRhdGFfdW5rbm93bgorLyogYyAqLwltb3YJcGMsIGxyCQkJCUAgbGRjCXJkLCBbcm5dLCAjbQlAIFNhbWUgYXMgbGRyCXJkLCBbcm5dLCAjbQorLyogZCAqLwltb3YJcGMsIGxyCQkJCUAgbGRjCXJkLCBbcm4sICNtXQorLyogZSAqLwliCS5kYXRhX3Vua25vd24KKy8qIGYgKi8KKy5kYXRhX3Vua25vd246CUAgUGFydCBvZiBqdW1wdGFibGUKKwltb3YJcjAsIHIyCisJbW92CXIxLCByOAorCW1vdglyMiwgc3AKKwlibAliYWRkYXRhYWJvcnQKKwliCXJldF9mcm9tX2V4Y2VwdGlvbgorCisuZGF0YV9hcm1fbGRtc3RtOgorCXRzdAlyOCwgIzEgPDwgMjEJCQlAIGNoZWNrIHdyaXRlYmFjayBiaXQKKwltb3ZlcQlwYywgbHIJCQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKKwltb3YJcjcsICMweDExCisJb3JyCXI3LCByNywgIzB4MTEwMAorCWFuZAlyNiwgcjgsIHI3CisJYW5kCXIyLCByOCwgcjcsIGxzbCAjMQorCWFkZAlyNiwgcjYsIHIyLCBsc3IgIzEKKwlhbmQJcjIsIHI4LCByNywgbHNsICMyCisJYWRkCXI2LCByNiwgcjIsIGxzciAjMgorCWFuZAlyMiwgcjgsIHI3LCBsc2wgIzMKKwlhZGQJcjYsIHI2LCByMiwgbHNyICMzCisJYWRkCXI2LCByNiwgcjYsIGxzciAjOAorCWFkZAlyNiwgcjYsIHI2LCBsc3IgIzQKKwlhbmQJcjYsIHI2LCAjMTUJCQlAIHI2ID0gbm8uIG9mIHJlZ2lzdGVycyB0byB0cmFuc2Zlci4KKwlhbmQJcjUsIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgorCWxkcglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKKwl0c3QJcjgsICMxIDw8IDIzCQkJQCBDaGVjayBVIGJpdAorCXN1Ym5lCXI3LCByNywgcjYsIGxzbCAjMgkJQCBVbmRvIGluY3JlbWVudAorCWFkZGVxCXI3LCByNywgcjYsIGxzbCAjMgkJQCBVbmRvIGRlY3JlbWVudAorCXN0cglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgUHV0IHJlZ2lzdGVyICdSbicKKwltb3YJcGMsIGxyCisKKy5kYXRhX2FybV9sYXRlbGRyaHByZToKKwl0c3QJcjgsICMxIDw8IDIxCQkJQCBDaGVjayB3cml0ZWJhY2sgYml0CisJbW92ZXEJcGMsIGxyCQkJCUAgTm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCisuZGF0YV9hcm1fbGF0ZWxkcmhwb3N0OgorCWFuZAlyNSwgcjgsICMweDAwZgkJCUAgZ2V0IFJtIC8gbG93IG5pYmJsZSBvZiBpbW1lZGlhdGUgdmFsdWUKKwl0c3QJcjgsICMxIDw8IDIyCQkJQCBpZiAoaW1tZWRpYXRlIG9mZnNldCkKKwlhbmRuZQlyNiwgcjgsICMweGYwMAkJCUAgeyBpbW1lZGlhdGUgaGlnaCBuaWJibGUKKwlvcnJuZQlyNiwgcjUsIHI2LCBsc3IgIzQJCUAgICBjb21iaW5lIG5pYmJsZXMgfSBlbHNlCisJbGRyZXEJcjYsIFtzcCwgcjUsIGxzbCAjMl0JCUAgeyBsb2FkIFJtIHZhbHVlIH0KKy5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm46CisJYW5kCXI1LCByOCwgIzE1IDw8IDE2CQlAIEV4dHJhY3QgJ24nIGZyb20gaW5zdHJ1Y3Rpb24KKwlsZHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIEdldCByZWdpc3RlciAnUm4nCisJdHN0CXI4LCAjMSA8PCAyMwkJCUAgQ2hlY2sgVSBiaXQKKwlzdWJuZQlyNywgcjcsIHI2CQkJQCBVbmRvIGluY3JtZW5ldAorCWFkZGVxCXI3LCByNywgcjYJCQlAIFVuZG8gZGVjcmVtZW50CisJc3RyCXI3LCBbc3AsIHI1LCBsc3IgIzE0XQkJQCBQdXQgcmVnaXN0ZXIgJ1JuJworCW1vdglwYywgbHIKKworLmRhdGFfYXJtX2xhdGVsZHJwcmVjb25zdDoKKwl0c3QJcjgsICMxIDw8IDIxCQkJQCBjaGVjayB3cml0ZWJhY2sgYml0CisJbW92ZXEJcGMsIGxyCQkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCisuZGF0YV9hcm1fbGF0ZWxkcnBvc3Rjb25zdDoKKwltb3ZzCXIyLCByOCwgbHNsICMyMAkJCUAgR2V0IG9mZnNldAorCW1vdmVxCXBjLCBscgkJCQlAIHplcm8gLT4gbm8gZml4dXAKKwlhbmQJcjUsIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgorCWxkcglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKKwl0c3QJcjgsICMxIDw8IDIzCQkJQCBDaGVjayBVIGJpdAorCXN1Ym5lCXI3LCByNywgcjIsIGxzciAjMjAJCUAgVW5kbyBpbmNyZW1lbnQKKwlhZGRlcQlyNywgcjcsIHIyLCBsc3IgIzIwCQlAIFVuZG8gZGVjcmVtZW50CisJc3RyCXI3LCBbc3AsIHI1LCBsc3IgIzE0XQkJQCBQdXQgcmVnaXN0ZXIgJ1JuJworCW1vdglwYywgbHIKKworLmRhdGFfYXJtX2xhdGVsZHJwcmVyZWc6CisJdHN0CXI4LCAjMSA8PCAyMQkJCUAgY2hlY2sgd3JpdGViYWNrIGJpdAorCW1vdmVxCXBjLCBscgkJCQlAIG5vIHdyaXRlYmFjayAtPiBubyBmaXh1cAorLmRhdGFfYXJtX2xhdGVsZHJwb3N0cmVnOgorCWFuZAlyNywgcjgsICMxNQkJCUAgRXh0cmFjdCAnbScgZnJvbSBpbnN0cnVjdGlvbgorCWxkcglyNiwgW3NwLCByNywgbHNsICMyXQkJQCBHZXQgcmVnaXN0ZXIgJ1JtJworCW1vdglyNSwgcjgsIGxzciAjNwkJCUAgZ2V0IHNoaWZ0IGNvdW50CisJYW5kcwlyNSwgcjUsICMzMQorCWFuZAlyNywgcjgsICMweDcwCQkJQCBnZXQgc2hpZnQgdHlwZQorCW9ycmVxCXI3LCByNywgIzgJCQlAIHNoaWZ0IGNvdW50ID0gMAorCWFkZAlwYywgcGMsIHI3CisJbm9wCisKKwltb3YJcjYsIHI2LCBsc2wgcjUJCQlAIDA6IExTTCAjITAKKwliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KKwliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4JQCAxOiBMU0wgIzAKKwlub3AKKwliCS5kYXRhX3Vua25vd24JCQlAIDI6IE1VTD8KKwlub3AKKwliCS5kYXRhX3Vua25vd24JCQlAIDM6IE1VTD8KKwlub3AKKwltb3YJcjYsIHI2LCBsc3IgcjUJCQlAIDQ6IExTUiAjITAKKwliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KKwltb3YJcjYsIHI2LCBsc3IgIzMyCQkJQCA1OiBMU1IgIzMyCisJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCisJYgkuZGF0YV91bmtub3duCQkJQCA2OiBNVUw/CisJbm9wCisJYgkuZGF0YV91bmtub3duCQkJQCA3OiBNVUw/CisJbm9wCisJbW92CXI2LCByNiwgYXNyIHI1CQkJQCA4OiBBU1IgIyEwCisJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCisJbW92CXI2LCByNiwgYXNyICMzMgkJCUAgOTogQVNSICMzMgorCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgorCWIJLmRhdGFfdW5rbm93bgkJCUAgQTogTVVMPworCW5vcAorCWIJLmRhdGFfdW5rbm93bgkJCUAgQjogTVVMPworCW5vcAorCW1vdglyNiwgcjYsIHJvciByNQkJCUAgQzogUk9SICMhMAorCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgorCW1vdglyNiwgcjYsIHJyeAkJCUAgRDogUlJYCisJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCisJYgkuZGF0YV91bmtub3duCQkJQCBFOiBNVUw/CisJbm9wCisJYgkuZGF0YV91bmtub3duCQkJQCBGOiBNVUw/CisKKy5kYXRhX3RodW1iX2Fib3J0OgorCWxkcmgJcjgsIFtyMl0JCQlAIHJlYWQgaW5zdHJ1Y3Rpb24KKwl0c3QJcjgsICMxIDw8IDExCQkJQCBMID0gMSAtPiB3cml0ZT8KKwlvcnJlcQlyMSwgcjEsICMxIDw8IDgJCQlAIHllcworCWFuZAlyNywgcjgsICMxNSA8PCAxMgorCWFkZAlwYywgcGMsIHI3LCBsc3IgIzEwCQlAIGxvb2t1cCBpbiB0YWJsZQorCW5vcAorCisvKiAwICovCWIJLmRhdGFfdW5rbm93bgorLyogMSAqLwliCS5kYXRhX3Vua25vd24KKy8qIDIgKi8JYgkuZGF0YV91bmtub3duCisvKiAzICovCWIJLmRhdGFfdW5rbm93bgorLyogNCAqLwliCS5kYXRhX3Vua25vd24KKy8qIDUgKi8JYgkuZGF0YV90aHVtYl9yZWcKKy8qIDYgKi8JbW92CXBjLCBscgorLyogNyAqLwltb3YJcGMsIGxyCisvKiA4ICovCW1vdglwYywgbHIKKy8qIDkgKi8JbW92CXBjLCBscgorLyogQSAqLwliCS5kYXRhX3Vua25vd24KKy8qIEIgKi8JYgkuZGF0YV90aHVtYl9wdXNocG9wCisvKiBDICovCWIJLmRhdGFfdGh1bWJfbGRtc3RtCisvKiBEICovCWIJLmRhdGFfdW5rbm93bgorLyogRSAqLwliCS5kYXRhX3Vua25vd24KKy8qIEYgKi8JYgkuZGF0YV91bmtub3duCisKKy5kYXRhX3RodW1iX3JlZzoKKwl0c3QJcjgsICMxIDw8IDkKKwltb3ZlcQlwYywgbHIKKwl0c3QJcjgsICMxIDw8IDEwCQkJQCBJZiAnUycgKHNpZ25lZCkgYml0IGlzIHNldAorCW1vdm5lCXIxLCAjMAkJCQlAIGl0IG11c3QgYmUgYSBsb2FkIGluc3RyCisJbW92CXBjLCBscgorCisuZGF0YV90aHVtYl9wdXNocG9wOgorCXRzdAlyOCwgIzEgPDwgMTAKKwliZXEJLmRhdGFfdW5rbm93bgorCWFuZAlyNiwgcjgsICMweDU1CQkJQCBod2VpZ2h0OChyOCkgKyBSIGJpdAorCWFuZAlyMiwgcjgsICMweGFhCisJYWRkCXI2LCByNiwgcjIsIGxzciAjMQorCWFuZAlyMiwgcjYsICMweGNjCisJYW5kCXI2LCByNiwgIzB4MzMKKwlhZGQJcjYsIHI2LCByMiwgbHNyICMyCisJbW92cwlyNywgcjgsIGxzciAjOQkJCUAgQyA9IHI4IGJpdCA4IChSIGJpdCkKKwlhZGMJcjYsIHI2LCByNiwgbHNyICM0CQlAIGhpZ2ggKyBsb3cgbmliYmxlICsgUiBiaXQKKwlhbmQJcjYsIHI2LCAjMTUJCQlAIG51bWJlciBvZiByZWdzIHRvIHRyYW5zZmVyCisJbGRyCXI3LCBbc3AsICMxMyA8PCAyXQorCXRzdAlyOCwgIzEgPDwgMTEKKwlhZGRlcQlyNywgcjcsIHI2LCBsc2wgIzIJCUAgaW5jcmVtZW50IFNQIGlmIFBVU0gKKwlzdWJuZQlyNywgcjcsIHI2LCBsc2wgIzIJCUAgZGVjcmVtZW50IFNQIGlmIFBPUAorCXN0cglyNywgW3NwLCAjMTMgPDwgMl0KKwltb3YJcGMsIGxyCisKKy5kYXRhX3RodW1iX2xkbXN0bToKKwlhbmQJcjYsIHI4LCAjMHg1NQkJCUAgaHdlaWdodDgocjgpCisJYW5kCXIyLCByOCwgIzB4YWEKKwlhZGQJcjYsIHI2LCByMiwgbHNyICMxCisJYW5kCXIyLCByNiwgIzB4Y2MKKwlhbmQJcjYsIHI2LCAjMHgzMworCWFkZAlyNiwgcjYsIHIyLCBsc3IgIzIKKwlhZGQJcjYsIHI2LCByNiwgbHNyICM0CisJYW5kCXI1LCByOCwgIzcgPDwgOAorCWxkcglyNywgW3NwLCByNSwgbHNyICM2XQorCWFuZAlyNiwgcjYsICMxNQkJCUAgbnVtYmVyIG9mIHJlZ3MgdG8gdHJhbnNmZXIKKwlzdWIJcjcsIHI3LCByNiwgbHNsICMyCQlAIGFsd2F5cyBkZWNyZW1lbnQKKwlzdHIJcjcsIFtzcCwgcjUsIGxzciAjNl0KKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hYm9ydC1tYWNyby5TIGIvYXJjaC9hcm0vbW0vYWJvcnQtbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2NiMWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vYWJvcnQtbWFjcm8uUwpAQCAtMCwwICsxLDQyIEBACisvKgorICogVGhlIEFSTSBMRFJEIGFuZCBUaHVtYiBMRFJTQiBpbnN0cnVjdGlvbnMgdXNlIGJpdCAyMC8xMSAoQVJNL1RodW1iKQorICogZGlmZmVyZW50bHkgdGhhbiBldmVyeSBvdGhlciBpbnN0cnVjdGlvbiwgc28gaXQgaXMgc2V0IHRvIDAgKHdyaXRlKQorICogZXZlbiB0aG91Z2ggdGhlIGluc3RydWN0aW9ucyBhcmUgcmVhZCBpbnN0cnVjdGlvbnMuIFRoaXMgbWVhbnMgdGhhdAorICogZHVyaW5nIGFuIGFib3J0IHRoZSBpbnN0cnVjdGlvbnMgd2lsbCBiZSB0cmVhdGVkIGFzIGEgd3JpdGUgYW5kIHRoZQorICogaGFuZGxlciB3aWxsIHJhaXNlIGEgc2lnbmFsIGZyb20gdW53cml0ZWFibGUgbG9jYXRpb25zIGlmIHRoZXkKKyAqIGZhdWx0LiBXZSBoYXZlIHRvIHNwZWNpZmljYWxseSBjaGVjayBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zCisgKiBmcm9tIHRoZSBhYm9ydCBoYW5kbGVycyB0byB0cmVhdCB0aGVtIHByb3Blcmx5LgorICoKKyAqLworCisJLm1hY3JvCWRvX3RodW1iX2Fib3J0CisJdHN0CXIzLCAjUFNSX1RfQklUCisJYmVxCW5vdF90aHVtYgorCWxkcmgJcjMsIFtyMl0JCQlAIFJlYWQgYWJvcnRlZCBUaHVtYiBpbnN0cnVjdGlvbgorCWFuZAlyMywgcjMsICMgMHhmZTAwCQlAIE1hc2sgb3Bjb2RlIGZpZWxkCisJY21wCXIzLCAjIDB4NTYwMAkJCUAgSXMgaXQgbGRyc2I/CisJb3JyZXEJcjMsIHIzLCAjMSA8PCAxMQkJQCBTZXQgTC1iaXQgaWYgeWVzCisJdHN0CXIzLCAjMSA8PCAxMQkJCUAgTCA9IDAgLT4gd3JpdGUKKwlvcnJlcQlyMSwgcjEsICMxIDw8IDExCQlAIHllcy4KKwltb3YJcGMsIGxyCitub3RfdGh1bWI6CisJLmVuZG0KKworLyoKKyAqIFdlIGNoZWNrIGZvciB0aGUgZm9sbG93aW5nIGluc3R1cmN0aW9uIGVuY29kaW5nIGZvciBMRFJELgorICoKKyAqIFsyNzoyNV0gPT0gMAorICogICBbNzo0XSA9PSAxMTAxCisgKiAgICBbMjBdID09IDAKKyAqLworIAkubWFjcm8JZG9fbGRyZF9hYm9ydAorIAl0c3QJcjMsICMweDBlMDAwMDAwCQkJQCBbMjc6MjVdID09IDAKKwlibmUJbm90X2xkcmQKKwlhbmQJcjIsIHIzLCAjMHgwMDAwMDBmMAkJQCBbNzo0XSA9PSAxMTAxCisJY21wCXIyLCAjMHgwMDAwMDBkMAorCWJuZQlub3RfbGRyZAorCXRzdAlyMywgIzEgPDwgMjAJCQlAIFsyMF0gPT0gMAorCW1vdmVxCXBjLCBscgorbm90X2xkcmQ6CisJLmVuZG0KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMgYi9hcmNoL2FybS9tbS9hbGlnbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWY0YThhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKQEAgLTAsMCArMSw3NTYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICBMaW51cyBUb3J2YWxkcworICogIE1vZGlmaWNhdGlvbnMgZm9yIEFSTSBwcm9jZXNzb3IgKGMpIDE5OTUtMjAwMSBSdXNzZWxsIEtpbmcKKyAqICBUaHVtYiBhbGlnbWVudCBmYXVsdCBmaXh1cHMgKGMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogIC0gQWRhcHRlZCBmcm9tIGdkYi9zaW0vYXJtL3RodW1iZW11LmMgLS0gVGh1bWIgaW5zdHJ1Y3Rpb24gZW11bGF0aW9uLgorICogICAgQ29weXJpZ2h0IChDKSAxOTk2LCBDeWdudXMgU29mdHdhcmUgVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgImZhdWx0LmgiCisKKy8qCisgKiAzMi1iaXQgbWlzYWxpZ25lZCB0cmFwIGhhbmRsZXIgKGMpIDE5OTggU2FuIE1laGF0IChDQ0MpIC1KdWx5IDE5OTgKKyAqIC9wcm9jL3N5cy9kZWJ1Zy9hbGlnbm1lbnQsIG1vZGlmaWVkIGFuZCBpbnRlZ3JhdGVkIGludG8KKyAqIExpbnV4IDIuMSBieSBSdXNzZWxsIEtpbmcKKyAqCisgKiBTcGVlZCBvcHRpbWlzYXRpb25zIGFuZCBiZXR0ZXIgZmF1bHQgaGFuZGxpbmcgYnkgUnVzc2VsbCBLaW5nLgorICoKKyAqICoqKiBOT1RFICoqKgorICogVGhpcyBjb2RlIGlzIG5vdCBwb3J0YWJsZSB0byBwcm9jZXNzb3JzIHdpdGggbGF0ZSBkYXRhIGFib3J0IGhhbmRsaW5nLgorICovCisjZGVmaW5lIENPRElOR19CSVRTKGkpCShpICYgMHgwZTAwMDAwMCkKKworI2RlZmluZSBMRFNUX0lfQklUKGkpCShpICYgKDEgPDwgMjYpKQkJLyogSW1tZWRpYXRlIGNvbnN0YW50CSovCisjZGVmaW5lIExEU1RfUF9CSVQoaSkJKGkgJiAoMSA8PCAyNCkpCQkvKiBQcmVpbmRleAkJKi8KKyNkZWZpbmUgTERTVF9VX0JJVChpKQkoaSAmICgxIDw8IDIzKSkJCS8qIEFkZCBvZmZzZXQJCSovCisjZGVmaW5lIExEU1RfV19CSVQoaSkJKGkgJiAoMSA8PCAyMSkpCQkvKiBXcml0ZWJhY2sJCSovCisjZGVmaW5lIExEU1RfTF9CSVQoaSkJKGkgJiAoMSA8PCAyMCkpCQkvKiBMb2FkCQkJKi8KKworI2RlZmluZSBMRFNUX1BfRVFfVShpKQkoKCgoaSkgXiAoKGkpID4+IDEpKSAmICgxIDw8IDIzKSkgPT0gMCkKKworI2RlZmluZSBMRFNUSF9JX0JJVChpKQkoaSAmICgxIDw8IDIyKSkJCS8qIGhhbGYtd29yZCBpbW1lZAkqLworI2RlZmluZSBMRE1fU19CSVQoaSkJKGkgJiAoMSA8PCAyMikpCQkvKiB3cml0ZSBDUFNSIGZyb20gU1BTUgkqLworCisjZGVmaW5lIFJOX0JJVFMoaSkJKChpID4+IDE2KSAmIDE1KQkvKiBSbgkJCSovCisjZGVmaW5lIFJEX0JJVFMoaSkJKChpID4+IDEyKSAmIDE1KQkvKiBSZAkJCSovCisjZGVmaW5lIFJNX0JJVFMoaSkJKGkgJiAxNSkJCS8qIFJtCQkJKi8KKworI2RlZmluZSBSRUdNQVNLX0JJVFMoaSkJKGkgJiAweGZmZmYpCisjZGVmaW5lIE9GRlNFVF9CSVRTKGkpCShpICYgMHgwZmZmKQorCisjZGVmaW5lIElTX1NISUZUKGkpCShpICYgMHgwZmYwKQorI2RlZmluZSBTSElGVF9CSVRTKGkpCSgoaSA+PiA3KSAmIDB4MWYpCisjZGVmaW5lIFNISUZUX1RZUEUoaSkJKGkgJiAweDYwKQorI2RlZmluZSBTSElGVF9MU0wJMHgwMAorI2RlZmluZSBTSElGVF9MU1IJMHgyMAorI2RlZmluZSBTSElGVF9BU1IJMHg0MAorI2RlZmluZSBTSElGVF9ST1JSUlgJMHg2MAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhaV91c2VyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWlfc3lzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWlfc2tpcHBlZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFpX2hhbGY7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhaV93b3JkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWlfbXVsdGk7CitzdGF0aWMgaW50IGFpX3VzZXJtb2RlOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBjb25zdCBjaGFyICp1c2VybW9kZV9hY3Rpb25bXSA9IHsKKwkiaWdub3JlZCIsCisJIndhcm4iLAorCSJmaXh1cCIsCisJImZpeHVwK3dhcm4iLAorCSJzaWduYWwiLAorCSJzaWduYWwrd2FybiIKK307CisKK3N0YXRpYyBpbnQKK3Byb2NfYWxpZ25tZW50X3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCisJCSAgICB2b2lkICpkYXRhKQoreworCWNoYXIgKnAgPSBwYWdlOworCWludCBsZW47CisKKwlwICs9IHNwcmludGYocCwgIlVzZXI6XHRcdCVsdVxuIiwgYWlfdXNlcik7CisJcCArPSBzcHJpbnRmKHAsICJTeXN0ZW06XHRcdCVsdVxuIiwgYWlfc3lzKTsKKwlwICs9IHNwcmludGYocCwgIlNraXBwZWQ6XHQlbHVcbiIsIGFpX3NraXBwZWQpOworCXAgKz0gc3ByaW50ZihwLCAiSGFsZjpcdFx0JWx1XG4iLCBhaV9oYWxmKTsKKwlwICs9IHNwcmludGYocCwgIldvcmQ6XHRcdCVsdVxuIiwgYWlfd29yZCk7CisJcCArPSBzcHJpbnRmKHAsICJNdWx0aTpcdFx0JWx1XG4iLCBhaV9tdWx0aSk7CisJcCArPSBzcHJpbnRmKHAsICJVc2VyIGZhdWx0czpcdCVpICglcylcbiIsIGFpX3VzZXJtb2RlLAorCQkJdXNlcm1vZGVfYWN0aW9uW2FpX3VzZXJtb2RlXSk7CisKKwlsZW4gPSAocCAtIHBhZ2UpIC0gb2ZmOworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJKmVvZiA9IChsZW4gPD0gY291bnQpID8gMSA6IDA7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcHJvY19hbGlnbm1lbnRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIG1vZGU7CisKKwlpZiAoY291bnQgPiAwKSB7CisJCWlmIChnZXRfdXNlcihtb2RlLCBidWZmZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChtb2RlID49ICcwJyAmJiBtb2RlIDw9ICc1JykKKwkJCSAgIGFpX3VzZXJtb2RlID0gbW9kZSAtICcwJzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwordW5pb24gb2Zmc2V0X3VuaW9uIHsKKwl1bnNpZ25lZCBsb25nIHVuOworCSAgc2lnbmVkIGxvbmcgc247Cit9OworCisjZGVmaW5lIFRZUEVfRVJST1IJMAorI2RlZmluZSBUWVBFX0ZBVUxUCTEKKyNkZWZpbmUgVFlQRV9MRFNUCTIKKyNkZWZpbmUgVFlQRV9ET05FCTMKKworI2lmZGVmIF9fQVJNRUJfXworI2RlZmluZSBCRQkJMQorI2RlZmluZSBGSVJTVF9CWVRFXzE2CSJtb3YJJTEsICUxLCByb3IgIzhcbiIKKyNkZWZpbmUgRklSU1RfQllURV8zMgkibW92CSUxLCAlMSwgcm9yICMyNFxuIgorI2RlZmluZSBORVhUX0JZVEUJInJvciAjMjQiCisjZWxzZQorI2RlZmluZSBCRQkJMAorI2RlZmluZSBGSVJTVF9CWVRFXzE2CisjZGVmaW5lIEZJUlNUX0JZVEVfMzIKKyNkZWZpbmUgTkVYVF9CWVRFCSJsc3IgIzgiCisjZW5kaWYKKworI2RlZmluZSBfX2dldDhfdW5hbGlnbmVkX2NoZWNrKGlucyx2YWwsYWRkcixlcnIpCVwKKwlfX2FzbV9fKAkJCQkJXAorCSIxOgkiaW5zIgklMSwgWyUyXSwgIzFcbiIJCQlcCisJIjI6XG4iCQkJCQkJXAorCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAorCSIJLmFsaWduCTJcbiIJCQkJXAorCSIzOgltb3YJJTAsICMxXG4iCQkJXAorCSIJYgkyYlxuIgkJCQlcCisJIgkucHJldmlvdXNcbiIJCQkJXAorCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCSIJLmFsaWduCTNcbiIJCQkJXAorCSIJLmxvbmcJMWIsIDNiXG4iCQkJXAorCSIJLnByZXZpb3VzXG4iCQkJCVwKKwk6ICI9ciIgKGVyciksICI9JnIiICh2YWwpLCAiPXIiIChhZGRyKQkJXAorCTogIjAiIChlcnIpLCAiMiIgKGFkZHIpKQorCisjZGVmaW5lIF9fZ2V0MTZfdW5hbGlnbmVkX2NoZWNrKGlucyx2YWwsYWRkcikJCQlcCisJZG8gewkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBlcnIgPSAwLCB2LCBhID0gYWRkcjsJCVwKKwkJX19nZXQ4X3VuYWxpZ25lZF9jaGVjayhpbnMsdixhLGVycik7CQlcCisJCXZhbCA9ICB2IDw8ICgoQkUpID8gOCA6IDApOwkJCVwKKwkJX19nZXQ4X3VuYWxpZ25lZF9jaGVjayhpbnMsdixhLGVycik7CQlcCisJCXZhbCB8PSB2IDw8ICgoQkUpID8gMCA6IDgpOwkJCVwKKwkJaWYgKGVycikJCQkJCVwKKwkJCWdvdG8gZmF1bHQ7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGdldDE2X3VuYWxpZ25lZF9jaGVjayh2YWwsYWRkcikgXAorCV9fZ2V0MTZfdW5hbGlnbmVkX2NoZWNrKCJsZHJiIix2YWwsYWRkcikKKworI2RlZmluZSBnZXQxNnRfdW5hbGlnbmVkX2NoZWNrKHZhbCxhZGRyKSBcCisJX19nZXQxNl91bmFsaWduZWRfY2hlY2soImxkcmJ0Iix2YWwsYWRkcikKKworI2RlZmluZSBfX2dldDMyX3VuYWxpZ25lZF9jaGVjayhpbnMsdmFsLGFkZHIpCQkJXAorCWRvIHsJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgZXJyID0gMCwgdiwgYSA9IGFkZHI7CQlcCisJCV9fZ2V0OF91bmFsaWduZWRfY2hlY2soaW5zLHYsYSxlcnIpOwkJXAorCQl2YWwgPSAgdiA8PCAoKEJFKSA/IDI0IDogIDApOwkJCVwKKwkJX19nZXQ4X3VuYWxpZ25lZF9jaGVjayhpbnMsdixhLGVycik7CQlcCisJCXZhbCB8PSB2IDw8ICgoQkUpID8gMTYgOiAgOCk7CQkJXAorCQlfX2dldDhfdW5hbGlnbmVkX2NoZWNrKGlucyx2LGEsZXJyKTsJCVwKKwkJdmFsIHw9IHYgPDwgKChCRSkgPyAgOCA6IDE2KTsJCQlcCisJCV9fZ2V0OF91bmFsaWduZWRfY2hlY2soaW5zLHYsYSxlcnIpOwkJXAorCQl2YWwgfD0gdiA8PCAoKEJFKSA/ICAwIDogMjQpOwkJCVwKKwkJaWYgKGVycikJCQkJCVwKKwkJCWdvdG8gZmF1bHQ7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGdldDMyX3VuYWxpZ25lZF9jaGVjayh2YWwsYWRkcikgXAorCV9fZ2V0MzJfdW5hbGlnbmVkX2NoZWNrKCJsZHJiIix2YWwsYWRkcikKKworI2RlZmluZSBnZXQzMnRfdW5hbGlnbmVkX2NoZWNrKHZhbCxhZGRyKSBcCisJX19nZXQzMl91bmFsaWduZWRfY2hlY2soImxkcmJ0Iix2YWwsYWRkcikKKworI2RlZmluZSBfX3B1dDE2X3VuYWxpZ25lZF9jaGVjayhpbnMsdmFsLGFkZHIpCQkJXAorCWRvIHsJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgZXJyID0gMCwgdiA9IHZhbCwgYSA9IGFkZHI7CVwKKwkJX19hc21fXyggRklSU1RfQllURV8xNgkJCQlcCisJCSIxOgkiaW5zIgklMSwgWyUyXSwgIzFcbiIJCQlcCisJCSIJbW92CSUxLCAlMSwgIk5FWFRfQllURSJcbiIJCVwKKwkJIjI6CSJpbnMiCSUxLCBbJTJdXG4iCQkJXAorCQkiMzpcbiIJCQkJCQlcCisJCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAorCQkiCS5hbGlnbgkyXG4iCQkJCVwKKwkJIjQ6CW1vdgklMCwgIzFcbiIJCQlcCisJCSIJYgkzYlxuIgkJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQlcCisJCSIJLmFsaWduCTNcbiIJCQkJXAorCQkiCS5sb25nCTFiLCA0YlxuIgkJCVwKKwkJIgkubG9uZwkyYiwgNGJcbiIJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJOiAiPXIiIChlcnIpLCAiPSZyIiAodiksICI9JnIiIChhKQkJXAorCQk6ICIwIiAoZXJyKSwgIjEiICh2KSwgIjIiIChhKSk7CQkJXAorCQlpZiAoZXJyKQkJCQkJXAorCQkJZ290byBmYXVsdDsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgcHV0MTZfdW5hbGlnbmVkX2NoZWNrKHZhbCxhZGRyKSAgXAorCV9fcHV0MTZfdW5hbGlnbmVkX2NoZWNrKCJzdHJiIix2YWwsYWRkcikKKworI2RlZmluZSBwdXQxNnRfdW5hbGlnbmVkX2NoZWNrKHZhbCxhZGRyKSBcCisJX19wdXQxNl91bmFsaWduZWRfY2hlY2soInN0cmJ0Iix2YWwsYWRkcikKKworI2RlZmluZSBfX3B1dDMyX3VuYWxpZ25lZF9jaGVjayhpbnMsdmFsLGFkZHIpCQkJXAorCWRvIHsJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgZXJyID0gMCwgdiA9IHZhbCwgYSA9IGFkZHI7CVwKKwkJX19hc21fXyggRklSU1RfQllURV8zMgkJCQlcCisJCSIxOgkiaW5zIgklMSwgWyUyXSwgIzFcbiIJCQlcCisJCSIJbW92CSUxLCAlMSwgIk5FWFRfQllURSJcbiIJCVwKKwkJIjI6CSJpbnMiCSUxLCBbJTJdLCAjMVxuIgkJCVwKKwkJIgltb3YJJTEsICUxLCAiTkVYVF9CWVRFIlxuIgkJXAorCQkiMzoJImlucyIJJTEsIFslMl0sICMxXG4iCQkJXAorCQkiCW1vdgklMSwgJTEsICJORVhUX0JZVEUiXG4iCQlcCisJCSI0OgkiaW5zIgklMSwgWyUyXVxuIgkJCVwKKwkJIjU6XG4iCQkJCQkJXAorCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkJIgkuYWxpZ24JMlxuIgkJCQlcCisJCSI2Ogltb3YJJTAsICMxXG4iCQkJXAorCQkiCWIJNWJcbiIJCQkJXAorCQkiCS5wcmV2aW91c1xuIgkJCQlcCisJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkiCS5hbGlnbgkzXG4iCQkJCVwKKwkJIgkubG9uZwkxYiwgNmJcbiIJCQlcCisJCSIJLmxvbmcJMmIsIDZiXG4iCQkJXAorCQkiCS5sb25nCTNiLCA2YlxuIgkJCVwKKwkJIgkubG9uZwk0YiwgNmJcbiIJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJOiAiPXIiIChlcnIpLCAiPSZyIiAodiksICI9JnIiIChhKQkJXAorCQk6ICIwIiAoZXJyKSwgIjEiICh2KSwgIjIiIChhKSk7CQkJXAorCQlpZiAoZXJyKQkJCQkJXAorCQkJZ290byBmYXVsdDsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgcHV0MzJfdW5hbGlnbmVkX2NoZWNrKHZhbCxhZGRyKQkgXAorCV9fcHV0MzJfdW5hbGlnbmVkX2NoZWNrKCJzdHJiIiwgdmFsLCBhZGRyKQorCisjZGVmaW5lIHB1dDMydF91bmFsaWduZWRfY2hlY2sodmFsLGFkZHIpIFwKKwlfX3B1dDMyX3VuYWxpZ25lZF9jaGVjaygic3RyYnQiLCB2YWwsIGFkZHIpCisKK3N0YXRpYyB2b2lkCitkb19hbGlnbm1lbnRfZmluaXNoX2xkc3QodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGluc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5pb24gb2Zmc2V0X3VuaW9uIG9mZnNldCkKK3sKKwlpZiAoIUxEU1RfVV9CSVQoaW5zdHIpKQorCQlvZmZzZXQudW4gPSAtb2Zmc2V0LnVuOworCisJaWYgKCFMRFNUX1BfQklUKGluc3RyKSkKKwkJYWRkciArPSBvZmZzZXQudW47CisKKwlpZiAoIUxEU1RfUF9CSVQoaW5zdHIpIHx8IExEU1RfV19CSVQoaW5zdHIpKQorCQlyZWdzLT51cmVnc1tSTl9CSVRTKGluc3RyKV0gPSBhZGRyOworfQorCitzdGF0aWMgaW50Citkb19hbGlnbm1lbnRfbGRyaHN0cmgodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGluc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgcmQgPSBSRF9CSVRTKGluc3RyKTsKKworCWlmICgoaW5zdHIgJiAweDAxZjAwZmYwKSA9PSAweDAxMDAwMDkwKQorCQlnb3RvIHN3cDsKKworCWlmICgoaW5zdHIgJiAweDkwKSAhPSAweDkwIHx8IChpbnN0ciAmIDB4NjApID09IDApCisJCWdvdG8gYmFkOworCisJYWlfaGFsZiArPSAxOworCisJaWYgKHVzZXJfbW9kZShyZWdzKSkKKwkJZ290byB1c2VyOworCisJaWYgKExEU1RfTF9CSVQoaW5zdHIpKSB7CisJCXVuc2lnbmVkIGxvbmcgdmFsOworCQlnZXQxNl91bmFsaWduZWRfY2hlY2sodmFsLCBhZGRyKTsKKworCQkvKiBzaWduZWQgaGFsZi13b3JkPyAqLworCQlpZiAoaW5zdHIgJiAweDQwKQorCQkJdmFsID0gKHNpZ25lZCBsb25nKSgoc2lnbmVkIHNob3J0KSB2YWwpOworCisJCXJlZ3MtPnVyZWdzW3JkXSA9IHZhbDsKKwl9IGVsc2UKKwkJcHV0MTZfdW5hbGlnbmVkX2NoZWNrKHJlZ3MtPnVyZWdzW3JkXSwgYWRkcik7CisKKwlyZXR1cm4gVFlQRV9MRFNUOworCisgdXNlcjoKKyAJaWYgKExEU1RfTF9CSVQoaW5zdHIpKSB7CisgCQl1bnNpZ25lZCBsb25nIHZhbDsKKyAJCWdldDE2dF91bmFsaWduZWRfY2hlY2sodmFsLCBhZGRyKTsKKworIAkJLyogc2lnbmVkIGhhbGYtd29yZD8gKi8KKyAJCWlmIChpbnN0ciAmIDB4NDApCisgCQkJdmFsID0gKHNpZ25lZCBsb25nKSgoc2lnbmVkIHNob3J0KSB2YWwpOworCisgCQlyZWdzLT51cmVnc1tyZF0gPSB2YWw7CisgCX0gZWxzZQorIAkJcHV0MTZ0X3VuYWxpZ25lZF9jaGVjayhyZWdzLT51cmVnc1tyZF0sIGFkZHIpOworCisgCXJldHVybiBUWVBFX0xEU1Q7CisKKyBzd3A6CisJcHJpbnRrKEtFUk5fRVJSICJBbGlnbm1lbnQgdHJhcDogbm90IGhhbmRsaW5nIHN3cCBpbnN0cnVjdGlvblxuIik7CisgYmFkOgorCXJldHVybiBUWVBFX0VSUk9SOworCisgZmF1bHQ6CisJcmV0dXJuIFRZUEVfRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2FsaWdubWVudF9sZHJzdHIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGluc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgcmQgPSBSRF9CSVRTKGluc3RyKTsKKworCWFpX3dvcmQgKz0gMTsKKworCWlmICgoIUxEU1RfUF9CSVQoaW5zdHIpICYmIExEU1RfV19CSVQoaW5zdHIpKSB8fCB1c2VyX21vZGUocmVncykpCisJCWdvdG8gdHJhbnM7CisKKwlpZiAoTERTVF9MX0JJVChpbnN0cikpIHsKKwkJdW5zaWduZWQgaW50IHZhbDsKKwkJZ2V0MzJfdW5hbGlnbmVkX2NoZWNrKHZhbCwgYWRkcik7CisJCXJlZ3MtPnVyZWdzW3JkXSA9IHZhbDsKKwl9IGVsc2UKKwkJcHV0MzJfdW5hbGlnbmVkX2NoZWNrKHJlZ3MtPnVyZWdzW3JkXSwgYWRkcik7CisJcmV0dXJuIFRZUEVfTERTVDsKKworIHRyYW5zOgorCWlmIChMRFNUX0xfQklUKGluc3RyKSkgeworCQl1bnNpZ25lZCBpbnQgdmFsOworCQlnZXQzMnRfdW5hbGlnbmVkX2NoZWNrKHZhbCwgYWRkcik7CisJCXJlZ3MtPnVyZWdzW3JkXSA9IHZhbDsKKwl9IGVsc2UKKwkJcHV0MzJ0X3VuYWxpZ25lZF9jaGVjayhyZWdzLT51cmVnc1tyZF0sIGFkZHIpOworCXJldHVybiBUWVBFX0xEU1Q7CisKKyBmYXVsdDoKKwlyZXR1cm4gVFlQRV9GQVVMVDsKK30KKworLyoKKyAqIExETS9TVE0gYWxpZ25tZW50IGhhbmRsZXIuCisgKgorICogVGhlcmUgYXJlIDQgdmFyaWFudHMgb2YgdGhpcyBpbnN0cnVjdGlvbjoKKyAqCisgKiBCID0gcm4gcG9pbnRlciBiZWZvcmUgaW5zdHJ1Y3Rpb24sIEEgPSBybiBwb2ludGVyIGFmdGVyIGluc3RydWN0aW9uCisgKiAgICAgICAgICAgICAgLS0tLS0tIGluY3JlYXNpbmcgYWRkcmVzcyAtLS0tLT4KKyAqCSAgICAgICAgfCAgICB8IHIwIHwgcjEgfCAuLi4gfCByeCB8ICAgIHwKKyAqIFBVID0gMDEgICAgICAgICAgICAgQiAgICAgICAgICAgICAgICAgICAgQQorICogUFUgPSAxMSAgICAgICAgQiAgICAgICAgICAgICAgICAgICAgQQorICogUFUgPSAwMCAgICAgICAgQSAgICAgICAgICAgICAgICAgICAgQgorICogUFUgPSAxMCAgICAgICAgICAgICBBICAgICAgICAgICAgICAgICAgICBCCisgKi8KK3N0YXRpYyBpbnQKK2RvX2FsaWdubWVudF9sZG1zdG0odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGluc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgcmQsIHJuLCBjb3JyZWN0aW9uLCBucl9yZWdzLCByZWdiaXRzOworCXVuc2lnbmVkIGxvbmcgZWFkZHIsIG5ld2FkZHI7CisKKwlpZiAoTERNX1NfQklUKGluc3RyKSkKKwkJZ290byBiYWQ7CisKKwljb3JyZWN0aW9uID0gNDsgLyogcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgKi8KKwlyZWdzLT5BUk1fcGMgKz0gY29ycmVjdGlvbjsKKworCWFpX211bHRpICs9IDE7CisKKwkvKiBjb3VudCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBpbiB0aGUgbWFzayB0byBiZSB0cmFuc2ZlcnJlZCAqLworCW5yX3JlZ3MgPSBod2VpZ2h0MTYoUkVHTUFTS19CSVRTKGluc3RyKSkgKiA0OworCisJcm4gPSBSTl9CSVRTKGluc3RyKTsKKwluZXdhZGRyID0gZWFkZHIgPSByZWdzLT51cmVnc1tybl07CisKKwlpZiAoIUxEU1RfVV9CSVQoaW5zdHIpKQorCQlucl9yZWdzID0gLW5yX3JlZ3M7CisJbmV3YWRkciArPSBucl9yZWdzOworCWlmICghTERTVF9VX0JJVChpbnN0cikpCisJCWVhZGRyID0gbmV3YWRkcjsKKworCWlmIChMRFNUX1BfRVFfVShpbnN0cikpCS8qIFUgPSBQICovCisJCWVhZGRyICs9IDQ7CisKKwkvKiAKKwkgKiBGb3IgYWxpZ25tZW50IGZhdWx0cyBvbiB0aGUgQVJNOTIyVC9BUk05MjBUIHRoZSBNTVUgIG1ha2VzCisJICogdGhlIEZTUiAoYW5kIGhlbmNlIGFkZHIpIGVxdWFsIHRvIHRoZSB1cGRhdGVkIGJhc2UgYWRkcmVzcworCSAqIG9mIHRoZSBtdWx0aXBsZSBhY2Nlc3MgcmF0aGVyIHRoYW4gdGhlIHJlc3RvcmVkIHZhbHVlLgorCSAqIFN3aXRjaCB0aGlzIG1lc3NhZ2Ugb2ZmIGlmIHdlJ3ZlIGdvdCBhIEFSTTkyWzAyXSwgb3RoZXJ3aXNlCisJICogW2xzXWRtIGFsaWdubWVudCBmYXVsdHMgYXJlIG5vaXN5IQorCSAqLworI2lmICEoZGVmaW5lZCBDT05GSUdfQ1BVX0FSTTkyMlQpICAmJiAhKGRlZmluZWQgQ09ORklHX0NQVV9BUk05MjBUKQorCS8qCisJICogVGhpcyBpcyBhICJoaW50IiAtIHdlIGFscmVhZHkgaGF2ZSBlYWRkciB3b3JrZWQgb3V0IGJ5IHRoZQorCSAqIHByb2Nlc3NvciBmb3IgdXMuCisJICovCisJaWYgKGFkZHIgIT0gZWFkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMRE1TVE06IFBDID0gJTA4bHgsIGluc3RyID0gJTA4bHgsICIKKwkJCSJhZGRyID0gJTA4bHgsIGVhZGRyID0gJTA4bHhcbiIsCisJCQkgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSwgaW5zdHIsIGFkZHIsIGVhZGRyKTsKKwkJc2hvd19yZWdzKHJlZ3MpOworCX0KKyNlbmRpZgorCisJaWYgKHVzZXJfbW9kZShyZWdzKSkgeworCQlmb3IgKHJlZ2JpdHMgPSBSRUdNQVNLX0JJVFMoaW5zdHIpLCByZCA9IDA7IHJlZ2JpdHM7CisJCSAgICAgcmVnYml0cyA+Pj0gMSwgcmQgKz0gMSkKKwkJCWlmIChyZWdiaXRzICYgMSkgeworCQkJCWlmIChMRFNUX0xfQklUKGluc3RyKSkgeworCQkJCQl1bnNpZ25lZCBpbnQgdmFsOworCQkJCQlnZXQzMnRfdW5hbGlnbmVkX2NoZWNrKHZhbCwgZWFkZHIpOworCQkJCQlyZWdzLT51cmVnc1tyZF0gPSB2YWw7CisJCQkJfSBlbHNlCisJCQkJCXB1dDMydF91bmFsaWduZWRfY2hlY2socmVncy0+dXJlZ3NbcmRdLCBlYWRkcik7CisJCQkJZWFkZHIgKz0gNDsKKwkJCX0KKwl9IGVsc2UgeworCQlmb3IgKHJlZ2JpdHMgPSBSRUdNQVNLX0JJVFMoaW5zdHIpLCByZCA9IDA7IHJlZ2JpdHM7CisJCSAgICAgcmVnYml0cyA+Pj0gMSwgcmQgKz0gMSkKKwkJCWlmIChyZWdiaXRzICYgMSkgeworCQkJCWlmIChMRFNUX0xfQklUKGluc3RyKSkgeworCQkJCQl1bnNpZ25lZCBpbnQgdmFsOworCQkJCQlnZXQzMl91bmFsaWduZWRfY2hlY2sodmFsLCBlYWRkcik7CisJCQkJCXJlZ3MtPnVyZWdzW3JkXSA9IHZhbDsKKwkJCQl9IGVsc2UKKwkJCQkJcHV0MzJfdW5hbGlnbmVkX2NoZWNrKHJlZ3MtPnVyZWdzW3JkXSwgZWFkZHIpOworCQkJCWVhZGRyICs9IDQ7CisJCQl9CisJfQorCisJaWYgKExEU1RfV19CSVQoaW5zdHIpKQorCQlyZWdzLT51cmVnc1tybl0gPSBuZXdhZGRyOworCWlmICghTERTVF9MX0JJVChpbnN0cikgfHwgIShSRUdNQVNLX0JJVFMoaW5zdHIpICYgKDEgPDwgMTUpKSkKKwkJcmVncy0+QVJNX3BjIC09IGNvcnJlY3Rpb247CisJcmV0dXJuIFRZUEVfRE9ORTsKKworZmF1bHQ6CisJcmVncy0+QVJNX3BjIC09IGNvcnJlY3Rpb247CisJcmV0dXJuIFRZUEVfRkFVTFQ7CisKK2JhZDoKKwlwcmludGsoS0VSTl9FUlIgIkFsaWdubWVudCB0cmFwOiBub3QgaGFuZGxpbmcgbGRtIHdpdGggcy1iaXQgc2V0XG4iKTsKKwlyZXR1cm4gVFlQRV9FUlJPUjsKK30KKworLyoKKyAqIENvbnZlcnQgVGh1bWIgbGQvc3QgaW5zdHJ1Y3Rpb24gZm9ybXMgdG8gZXF1aXZhbGVudCBBUk0gaW5zdHJ1Y3Rpb25zIHNvCisgKiB3ZSBjYW4gcmV1c2UgQVJNIHVzZXJsYW5kIGFsaWdubWVudCBmYXVsdCBmaXh1cHMgZm9yIFRodW1iLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gd2FzIGluaXRpYWxseSBiYXNlZCBvbiB0aGUgYWxnb3JpdGhtIGZvdW5kIGluCisgKiBnZGIvc2ltL2FybS90aHVtYmVtdS5jLiBJdCBpcyBiYXNpY2FsbHkganVzdCBhIGNvZGUgcmVkdWN0aW9uIG9mIHNhbWUKKyAqIHRvIGNvbnZlcnQgb25seSBUaHVtYiBsZC9zdCBpbnN0cnVjdGlvbiBmb3JtcyB0byBlcXVpdmFsZW50IEFSTSBmb3Jtcy4KKyAqCisgKiBOT1RFUzoKKyAqIDEuIENvbW1lbnRzIGJlbG93IHJlZmVyIHRvIEFSTSBBUk0gRERJMDEwMEUgVGh1bWIgSW5zdHJ1Y3Rpb24gc2VjdGlvbnMuCisgKiAyLiBJZiBmb3Igc29tZSByZWFzb24gd2UncmUgcGFzc2VkIGFuIG5vbi1sZC9zdCBUaHVtYiBpbnN0cnVjdGlvbiB0bworICogICAgZGVjb2RlLCB3ZSByZXR1cm4gMHhkZWFkYzBkZS4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVuZGVyIG5vcm1hbAorICogICAgY2lyY3Vtc3RhbmNlcyBidXQgaWYgaXQgZG9lcywgd2UndmUgZ290IG90aGVyIHByb2JsZW1zIHRvIGRlYWwgd2l0aAorICogICAgZWxzZXdoZXJlIGFuZCB3ZSBvYnZpb3VzbHkgY2FuJ3QgZml4IHRob3NlIHByb2JsZW1zIGhlcmUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3RodW1iMmFybSh1MTYgdGluc3RyKQoreworCXUzMiBMID0gKHRpbnN0ciAmICgxPDwxMSkpID4+IDExOworCisJc3dpdGNoICgodGluc3RyICYgMHhmODAwKSA+PiAxMSkgeworCS8qIDYuNS4xIEZvcm1hdCAxOiAqLworCWNhc2UgMHg2MDAwID4+IDExOgkJCQkvKiA3LjEuNTIgU1RSKDEpICovCisJY2FzZSAweDY4MDAgPj4gMTE6CQkJCS8qIDcuMS4yNiBMRFIoMSkgKi8KKwljYXNlIDB4NzAwMCA+PiAxMToJCQkJLyogNy4xLjU1IFNUUkIoMSkgKi8KKwljYXNlIDB4NzgwMCA+PiAxMToJCQkJLyogNy4xLjMwIExEUkIoMSkgKi8KKwkJcmV0dXJuIDB4ZTU4MDAwMDAgfAorCQkJKCh0aW5zdHIgJiAoMTw8MTIpKSA8PCAoMjItMTIpKSB8CS8qIGZpeHVwICovCisJCQkoTDw8MjApIHwJCQkJLyogTD09MT8gKi8KKwkJCSgodGluc3RyICYgKDc8PDApKSA8PCAoMTItMCkpIHwJCS8qIFJkICovCisJCQkoKHRpbnN0ciAmICg3PDwzKSkgPDwgKDE2LTMpKSB8CQkvKiBSbiAqLworCQkJKCh0aW5zdHIgJiAoMzE8PDYpKSA+PgkJCS8qIGltbWVkXzUgKi8KKwkJCQkoNiAtICgodGluc3RyICYgKDE8PDEyKSkgPyAwIDogMikpKTsKKwljYXNlIDB4ODAwMCA+PiAxMToJCQkJLyogNy4xLjU3IFNUUkgoMSkgKi8KKwljYXNlIDB4ODgwMCA+PiAxMToJCQkJLyogNy4xLjMyIExEUkgoMSkgKi8KKwkJcmV0dXJuIDB4ZTFjMDAwYjAgfAorCQkJKEw8PDIwKSB8CQkJCS8qIEw9PTE/ICovCisJCQkoKHRpbnN0ciAmICg3PDwwKSkgPDwgKDEyLTApKSB8CQkvKiBSZCAqLworCQkJKCh0aW5zdHIgJiAoNzw8MykpIDw8ICgxNi0zKSkgfAkJLyogUm4gKi8KKwkJCSgodGluc3RyICYgKDc8PDYpKSA+PiAoNi0xKSkgfAkgLyogaW1tZWRfNVsyOjBdICovCisJCQkoKHRpbnN0ciAmICgzPDw5KSkgPj4gKDktOCkpOwkgLyogaW1tZWRfNVs0OjNdICovCisKKwkvKiA2LjUuMSBGb3JtYXQgMjogKi8KKwljYXNlIDB4NTAwMCA+PiAxMToKKwljYXNlIDB4NTgwMCA+PiAxMToKKwkJeworCQkJc3RhdGljIGNvbnN0IHUzMiBzdWJzZXRbOF0gPSB7CisJCQkJMHhlNzgwMDAwMCwJCS8qIDcuMS41MyBTVFIoMikgKi8KKwkJCQkweGUxODAwMGIwLAkJLyogNy4xLjU4IFNUUkgoMikgKi8KKwkJCQkweGU3YzAwMDAwLAkJLyogNy4xLjU2IFNUUkIoMikgKi8KKwkJCQkweGUxOTAwMGQwLAkJLyogNy4xLjM0IExEUlNCICovCisJCQkJMHhlNzkwMDAwMCwJCS8qIDcuMS4yNyBMRFIoMikgKi8KKwkJCQkweGUxOTAwMGIwLAkJLyogNy4xLjMzIExEUkgoMikgKi8KKwkJCQkweGU3ZDAwMDAwLAkJLyogNy4xLjMxIExEUkIoMikgKi8KKwkJCQkweGUxOTAwMGYwCQkvKiA3LjEuMzUgTERSU0ggKi8KKwkJCX07CisJCQlyZXR1cm4gc3Vic2V0Wyh0aW5zdHIgJiAoNzw8OSkpID4+IDldIHwKKwkJCSAgICAoKHRpbnN0ciAmICg3PDwwKSkgPDwgKDEyLTApKSB8CS8qIFJkICovCisJCQkgICAgKCh0aW5zdHIgJiAoNzw8MykpIDw8ICgxNi0zKSkgfAkvKiBSbiAqLworCQkJICAgICgodGluc3RyICYgKDc8PDYpKSA+PiAoNi0wKSk7CS8qIFJtICovCisJCX0KKworCS8qIDYuNS4xIEZvcm1hdCAzOiAqLworCWNhc2UgMHg0ODAwID4+IDExOgkJCQkvKiA3LjEuMjggTERSKDMpICovCisJCS8qIE5PVEU6IFRoaXMgY2FzZSBpcyBub3QgdGVjaG5pY2FsbHkgcG9zc2libGUuIFdlJ3JlCisJCSAqIAkgbG9hZGluZyAzMi1iaXQgbWVtb3J5IGRhdGEgdmlhIFBDIHJlbGF0aXZlCisJCSAqCSBhZGRyZXNzaW5nIG1vZGUuIFNvIHdlIGNhbiBhbmQgc2hvdWxkIGVsaW1pbmF0ZQorCQkgKgkgdGhpcyBjYXNlLiBCdXQgSSdsbCBsZWF2ZSBpdCBoZXJlIGZvciBub3cuCisJCSAqLworCQlyZXR1cm4gMHhlNTlmMDAwMCB8CisJCSAgICAoKHRpbnN0ciAmICg3PDw4KSkgPDwgKDEyLTgpKSB8CQkvKiBSZCAqLworCQkgICAgKCh0aW5zdHIgJiAyNTUpIDw8ICgyLTApKTsJCQkvKiBpbW1lZF84ICovCisKKwkvKiA2LjUuMSBGb3JtYXQgNDogKi8KKwljYXNlIDB4OTAwMCA+PiAxMToJCQkJLyogNy4xLjU0IFNUUigzKSAqLworCWNhc2UgMHg5ODAwID4+IDExOgkJCQkvKiA3LjEuMjkgTERSKDQpICovCisJCXJldHVybiAweGU1OGQwMDAwIHwKKwkJCShMPDwyMCkgfAkJCQkvKiBMPT0xPyAqLworCQkJKCh0aW5zdHIgJiAoNzw8OCkpIDw8ICgxMi04KSkgfAkJLyogUmQgKi8KKwkJCSgodGluc3RyICYgMjU1KSA8PCAyKTsJCQkvKiBpbW1lZF84ICovCisKKwkvKiA2LjYuMSBGb3JtYXQgMTogKi8KKwljYXNlIDB4YzAwMCA+PiAxMToJCQkJLyogNy4xLjUxIFNUTUlBICovCisJY2FzZSAweGM4MDAgPj4gMTE6CQkJCS8qIDcuMS4yNSBMRE1JQSAqLworCQl7CisJCQl1MzIgUm4gPSAodGluc3RyICYgKDc8PDgpKSA+PiA4OworCQkJdTMyIFcgPSAoKEw8PFJuKSAmICh0aW5zdHImMjU1KSkgPyAwIDogMTw8MjE7CisKKwkJCXJldHVybiAweGU4ODAwMDAwIHwgVyB8IChMPDwyMCkgfCAoUm48PDE2KSB8CisJCQkJKHRpbnN0ciYyNTUpOworCQl9CisKKwkvKiA2LjYuMSBGb3JtYXQgMjogKi8KKwljYXNlIDB4YjAwMCA+PiAxMToJCQkJLyogNy4xLjQ4IFBVU0ggKi8KKwljYXNlIDB4YjgwMCA+PiAxMToJCQkJLyogNy4xLjQ3IFBPUCAqLworCQlpZiAoKHRpbnN0ciAmICgzIDw8IDkpKSA9PSAweDA0MDApIHsKKwkJCXN0YXRpYyBjb25zdCB1MzIgc3Vic2V0WzRdID0geworCQkJCTB4ZTkyZDAwMDAsCS8qIFNUTURCIHNwISx7cmVnaXN0ZXJzfSAqLworCQkJCTB4ZTkyZDQwMDAsCS8qIFNUTURCIHNwISx7cmVnaXN0ZXJzLGxyfSAqLworCQkJCTB4ZThiZDAwMDAsCS8qIExETUlBIHNwISx7cmVnaXN0ZXJzfSAqLworCQkJCTB4ZThiZDgwMDAJLyogTERNSUEgc3AhLHtyZWdpc3RlcnMscGN9ICovCisJCQl9OworCQkJcmV0dXJuIHN1YnNldFsoTDw8MSkgfCAoKHRpbnN0ciAmICgxPDw4KSkgPj4gOCldIHwKKwkJCSAgICAodGluc3RyICYgMjU1KTsJCS8qIHJlZ2lzdGVyX2xpc3QgKi8KKwkJfQorCQkvKiBFbHNlIGZhbGwgdGhyb3VnaCBmb3IgaWxsZWdhbCBpbnN0cnVjdGlvbiBjYXNlICovCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMHhkZWFkYzBkZTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2RvX2FsaWdubWVudCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuaW9uIG9mZnNldF91bmlvbiBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBpbnN0ciA9IDAsIGluc3RycHRyOworCWludCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBpbnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCXVuc2lnbmVkIGludCB0eXBlOworCW1tX3NlZ21lbnRfdCBmczsKKwl1bnNpZ25lZCBpbnQgZmF1bHQ7CisJdTE2IHRpbnN0ciA9IDA7CisKKwlpbnN0cnB0ciA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCWlmIHRodW1iX21vZGUocmVncykgeworCQlmYXVsdCA9IF9fZ2V0X3VzZXIodGluc3RyLCAodTE2ICopKGluc3RycHRyICYgfjEpKTsKKwkJaWYgKCEoZmF1bHQpKQorCQkJaW5zdHIgPSB0aHVtYjJhcm0odGluc3RyKTsKKwl9IGVsc2UKKwkJZmF1bHQgPSBfX2dldF91c2VyKGluc3RyLCAodTMyICopaW5zdHJwdHIpOworCXNldF9mcyhmcyk7CisKKwlpZiAoZmF1bHQpIHsKKwkJdHlwZSA9IFRZUEVfRkFVTFQ7CisgCQlnb3RvIGJhZF9vcl9mYXVsdDsKKwl9CisKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKQorCQlnb3RvIHVzZXI7CisKKwlhaV9zeXMgKz0gMTsKKworIGZpeHVwOgorCisJcmVncy0+QVJNX3BjICs9IHRodW1iX21vZGUocmVncykgPyAyIDogNDsKKworCXN3aXRjaCAoQ09ESU5HX0JJVFMoaW5zdHIpKSB7CisJY2FzZSAweDAwMDAwMDAwOgkvKiBsZHJoIG9yIHN0cmggKi8KKwkJaWYgKExEU1RIX0lfQklUKGluc3RyKSkKKwkJCW9mZnNldC51biA9IChpbnN0ciAmIDB4ZjAwKSA+PiA0IHwgKGluc3RyICYgMTUpOworCQllbHNlCisJCQlvZmZzZXQudW4gPSByZWdzLT51cmVnc1tSTV9CSVRTKGluc3RyKV07CisJCWhhbmRsZXIgPSBkb19hbGlnbm1lbnRfbGRyaHN0cmg7CisJCWJyZWFrOworCisJY2FzZSAweDA0MDAwMDAwOgkvKiBsZHIgb3Igc3RyIGltbWVkaWF0ZSAqLworCQlvZmZzZXQudW4gPSBPRkZTRVRfQklUUyhpbnN0cik7CisJCWhhbmRsZXIgPSBkb19hbGlnbm1lbnRfbGRyc3RyOworCQlicmVhazsKKworCWNhc2UgMHgwNjAwMDAwMDoJLyogbGRyIG9yIHN0ciByZWdpc3RlciAqLworCQlvZmZzZXQudW4gPSByZWdzLT51cmVnc1tSTV9CSVRTKGluc3RyKV07CisKKwkJaWYgKElTX1NISUZUKGluc3RyKSkgeworCQkJdW5zaWduZWQgaW50IHNoaWZ0dmFsID0gU0hJRlRfQklUUyhpbnN0cik7CisKKwkJCXN3aXRjaChTSElGVF9UWVBFKGluc3RyKSkgeworCQkJY2FzZSBTSElGVF9MU0w6CisJCQkJb2Zmc2V0LnVuIDw8PSBzaGlmdHZhbDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTSElGVF9MU1I6CisJCQkJb2Zmc2V0LnVuID4+PSBzaGlmdHZhbDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTSElGVF9BU1I6CisJCQkJb2Zmc2V0LnNuID4+PSBzaGlmdHZhbDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTSElGVF9ST1JSUlg6CisJCQkJaWYgKHNoaWZ0dmFsID09IDApIHsKKwkJCQkJb2Zmc2V0LnVuID4+PSAxOworCQkJCQlpZiAocmVncy0+QVJNX2Nwc3IgJiBQU1JfQ19CSVQpCisJCQkJCQlvZmZzZXQudW4gfD0gMSA8PCAzMTsKKwkJCQl9IGVsc2UKKwkJCQkJb2Zmc2V0LnVuID0gb2Zmc2V0LnVuID4+IHNoaWZ0dmFsIHwKKwkJCQkJCQkgIG9mZnNldC51biA8PCAoMzIgLSBzaGlmdHZhbCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaGFuZGxlciA9IGRvX2FsaWdubWVudF9sZHJzdHI7CisJCWJyZWFrOworCisJY2FzZSAweDA4MDAwMDAwOgkvKiBsZG0gb3Igc3RtICovCisJCWhhbmRsZXIgPSBkb19hbGlnbm1lbnRfbGRtc3RtOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdvdG8gYmFkOworCX0KKworCXR5cGUgPSBoYW5kbGVyKGFkZHIsIGluc3RyLCByZWdzKTsKKworCWlmICh0eXBlID09IFRZUEVfRVJST1IgfHwgdHlwZSA9PSBUWVBFX0ZBVUxUKQorCQlnb3RvIGJhZF9vcl9mYXVsdDsKKworCWlmICh0eXBlID09IFRZUEVfTERTVCkKKwkJZG9fYWxpZ25tZW50X2ZpbmlzaF9sZHN0KGFkZHIsIGluc3RyLCByZWdzLCBvZmZzZXQpOworCisJcmV0dXJuIDA7CisKKyBiYWRfb3JfZmF1bHQ6CisJaWYgKHR5cGUgPT0gVFlQRV9FUlJPUikKKwkJZ290byBiYWQ7CisJcmVncy0+QVJNX3BjIC09IHRodW1iX21vZGUocmVncykgPyAyIDogNDsKKwkvKgorCSAqIFdlIGdvdCBhIGZhdWx0IC0gZml4IGl0IHVwLCBvciBkaWUuCisJICovCisJZG9fYmFkX2FyZWEoY3VycmVudCwgY3VycmVudC0+bW0sIGFkZHIsIGZzciwgcmVncyk7CisJcmV0dXJuIDA7CisKKyBiYWQ6CisJLyoKKwkgKiBPb3BzLCB3ZSBkaWRuJ3QgaGFuZGxlIHRoZSBpbnN0cnVjdGlvbi4KKwkgKi8KKwlwcmludGsoS0VSTl9FUlIgIkFsaWdubWVudCB0cmFwOiBub3QgaGFuZGxpbmcgaW5zdHJ1Y3Rpb24gIgorCQkiJTAqbHggYXQgWzwlMDhseD5dXG4iLAorCQl0aHVtYl9tb2RlKHJlZ3MpID8gNCA6IDgsCisJCXRodW1iX21vZGUocmVncykgPyB0aW5zdHIgOiBpbnN0ciwgaW5zdHJwdHIpOworCWFpX3NraXBwZWQgKz0gMTsKKwlyZXR1cm4gMTsKKworIHVzZXI6CisJYWlfdXNlciArPSAxOworCisJaWYgKGFpX3VzZXJtb2RlICYgMSkKKwkJcHJpbnRrKCJBbGlnbm1lbnQgdHJhcDogJXMgKCVkKSBQQz0weCUwOGx4IEluc3RyPTB4JTAqbHggIgorCQkgICAgICAgIkFkZHJlc3M9MHglMDhseCBGU1IgMHglMDN4XG4iLCBjdXJyZW50LT5jb21tLAorCQkJY3VycmVudC0+cGlkLCBpbnN0cnB0ciwKKwkJICAgICAgICB0aHVtYl9tb2RlKHJlZ3MpID8gNCA6IDgsCisJCSAgICAgICAgdGh1bWJfbW9kZShyZWdzKSA/IHRpbnN0ciA6IGluc3RyLAorCQkgICAgICAgIGFkZHIsIGZzcik7CisKKwlpZiAoYWlfdXNlcm1vZGUgJiAyKQorCQlnb3RvIGZpeHVwOworCisJaWYgKGFpX3VzZXJtb2RlICYgNCkKKwkJZm9yY2Vfc2lnKFNJR0JVUywgY3VycmVudCk7CisJZWxzZQorCQlzZXRfY3IoY3Jfbm9fYWxpZ25tZW50KTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHN5c2N0bF9pbml0LCBvdGhlcndpc2Ugc3lzLyB3aWxsIGJlCisgKiBvdmVyd3JpdHRlbi4gIEFjdHVhbGx5LCB0aGlzIHNob3VsZG4ndCBiZSBpbiBzeXMvIGF0IGFsbCBzaW5jZQorICogaXQgaXNuJ3QgYSBzeXNjdGwsIGFuZCBpdCBkb2Vzbid0IGNvbnRhaW4gc3lzY3RsIGluZm9ybWF0aW9uLgorICogV2Ugbm93IGxvY2F0ZSBpdCBpbiAvcHJvYy9jcHUvYWxpZ25tZW50IGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFsaWdubWVudF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlczsKKworCXJlcyA9IHByb2NfbWtkaXIoImNwdSIsIE5VTEwpOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJhbGlnbm1lbnQiLCBTX0lXVVNSIHwgU19JUlVHTywgcmVzKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMtPnJlYWRfcHJvYyA9IHByb2NfYWxpZ25tZW50X3JlYWQ7CisJcmVzLT53cml0ZV9wcm9jID0gcHJvY19hbGlnbm1lbnRfd3JpdGU7CisjZW5kaWYKKworCWhvb2tfZmF1bHRfY29kZSgxLCBkb19hbGlnbm1lbnQsIFNJR0lMTCwgImFsaWdubWVudCBleGNlcHRpb24iKTsKKwlob29rX2ZhdWx0X2NvZGUoMywgZG9fYWxpZ25tZW50LCBTSUdJTEwsICJhbGlnbm1lbnQgZXhjZXB0aW9uIik7CisKKwlyZXR1cm4gMDsKK30KKworZnNfaW5pdGNhbGwoYWxpZ25tZW50X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYmxvY2tvcHMuYyBiL2FyY2gvYXJtL21tL2Jsb2Nrb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2YzZlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2Jsb2Nrb3BzLmMKQEAgLTAsMCArMSwxODQgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorCitleHRlcm4gc3RydWN0IGNwdV9jYWNoZV9mbnMgYmxrX2NhY2hlX2ZuczsKKworI2RlZmluZSBIQVJWQVJEX0NBQ0hFCisKKy8qCisgKglibGtfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZShrYWRkcikKKyAqCisgKglFbnN1cmUgdGhhdCB0aGUgZGF0YSBoZWxkIGluIHRoZSBwYWdlIGthZGRyIGlzIHdyaXR0ZW4gYmFjaworICoJdG8gdGhlIHBhZ2UgaW4gcXVlc3Rpb24uCisgKgorICoJLSBrYWRkciAgIC0ga2VybmVsIGFkZHJlc3MgKGd1YXJhbnRlZWQgdG8gYmUgcGFnZSBhbGlnbmVkKQorICovCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpCitibGtfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSh2b2lkICprYWRkcikKK3sKKwlhc20oCisJImFkZAlyMSwgcjAsICUwCQkJCQkJCVxuXAorMToJLndvcmQJMHhlYzQwMWYwZQlAIG1jcnIJcDE1LCAwLCByMCwgcjEsIGMxNCwgMAlAIGJsb2NraW5nCVxuXAorCW1vdglyMCwgIzAJCQkJCQkJCVxuXAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCQkJCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJCQkJCVxuXAorCW1vdglwYywgbHIiCisJOgorCTogIkkiIChQQUdFX1NJWkUpKTsKK30KKworLyoKKyAqCWJsa19kbWFfaW52X3JhbmdlKHN0YXJ0LGVuZCkKKyAqCisgKglJbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbjsgd2Ugd2lsbAorICoJYmUgcGVyZm9ybWluZyBhIERNQSBvcGVyYXRpb24gaW4gdGhpcyByZWdpb24gYW5kIHdlIHdhbnQgdG8KKyAqCXB1cmdlIG9sZCBkYXRhIGluIHRoZSBjYWNoZS4KKyAqCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpCitibGtfZG1hX2ludl9yYW5nZV91bmlmaWVkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWFzbSgKKwkidHN0CXIwLCAlMAkJCQkJCQkJXG5cCisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGMxMSwgMQkJQCBjbGVhbiB1bmlmaWVkIGxpbmUJCVxuXAorCXRzdAlyMSwgJTAJCQkJCQkJCVxuXAorCW1jcm5lCXAxNSwgMCwgcjEsIGM3LCBjMTUsIDEJCUAgY2xlYW4gJiBpbnZhbGlkYXRlIHVuaWZpZWQgbGluZVxuXAorCS53b3JkCTB4ZWM0MDFmMDYJQCBtY3JyCXAxNSwgMCwgcjEsIHIwLCBjNiwgMAlAIGJsb2NraW5nCVxuXAorCW1vdglyMCwgIzAJCQkJCQkJCVxuXAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlcgkJXG5cCisJbW92CXBjLCBsciIKKwk6CisJOiAiSSIgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpCitibGtfZG1hX2ludl9yYW5nZV9oYXJ2YXJkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWFzbSgKKwkidHN0CXIwLCAlMAkJCQkJCQkJXG5cCisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGxpbmUJCQlcblwKKwl0c3QJcjEsICUwCQkJCQkJCQlcblwKKwltY3JuZQlwMTUsIDAsIHIxLCBjNywgYzE0LCAxCQlAIGNsZWFuICYgaW52YWxpZGF0ZSBEIGxpbmUJXG5cCisJLndvcmQJMHhlYzQwMWYwNglAIG1jcnIJcDE1LCAwLCByMSwgcjAsIGM2LCAwCUAgYmxvY2tpbmcJXG5cCisJbW92CXIwLCAjMAkJCQkJCQkJXG5cCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyCQlcblwKKwltb3YJcGMsIGxyIgorCToKKwk6ICJJIiAoTDFfQ0FDSEVfQllURVMgLSAxKSk7Cit9CisKKy8qCisgKglibGtfZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gZW5kICAgICAtIHZpcnR1YWwgZW5kIGFkZHJlc3Mgb2YgcmVnaW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5ha2VkKSkKK2Jsa19kbWFfY2xlYW5fcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJYXNtKAorCSIud29yZAkweGVjNDAxZjBjCUAgbWNycglwMTUsIDAsIHIxLCByMCwgYzEyLCAwCUAgYmxvY2tpbmcJXG5cCisJbW92CXIwLCAjMAkJCQkJCQkJXG5cCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyCQlcblwKKwltb3YJcGMsIGxyIik7Cit9CisKKy8qCisgKglibGtfZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gZW5kICAgICAtIHZpcnR1YWwgZW5kIGFkZHJlc3Mgb2YgcmVnaW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5ha2VkKSkKK2Jsa19kbWFfZmx1c2hfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJYXNtKAorCSIud29yZAkweGVjNDAxZjBlCUAgbWNycglwMTUsIDAsIHIxLCByMCwgYzE0LCAwCUAgYmxvY2tpbmcJXG5cCisJbW92CXBjLCBsciIpOworfQorCitzdGF0aWMgaW50IGJsb2Nrb3BzX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKK3sKKwlyZWdzLT5BUk1fcjQgfD0gcmVncy0+QVJNX3IyOworCXJlZ3MtPkFSTV9wYyArPSA0OworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqZnVuY1tdID0geworCSJQcmVmZXRjaCBkYXRhIHJhbmdlIiwKKwkiQ2xlYW4rSW52YWxpZGF0ZSBkYXRhIHJhbmdlIiwKKwkiQ2xlYW4gZGF0YSByYW5nZSIsCisJIkludmFsaWRhdGUgZGF0YSByYW5nZSIsCisJIkludmFsaWRhdGUgaW5zdHIgcmFuZ2UiCit9OworCitzdGF0aWMgc3RydWN0IHVuZGVmX2hvb2sgYmxvY2tvcHNfaG9vayBfX2luaXRkYXRhID0geworCS5pbnN0cl9tYXNrCT0gMHgwZmZmZmZkMCwKKwkuaW5zdHJfdmFsCT0gMHgwYzQwMWYwMCwKKwkuY3Bzcl9tYXNrCT0gUFNSX1RfQklULAorCS5jcHNyX3ZhbAk9IDAsCisJLmZuCQk9IGJsb2Nrb3BzX3RyYXAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBibG9ja29wc19jaGVjayh2b2lkKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBlcnIgYXNtKCJyNCIpID0gMDsKKwl1bnNpZ25lZCBpbnQgZXJyX3BvcyA9IDE7CisJdW5zaWduZWQgaW50IGNhY2hlX3R5cGU7CisJaW50IGk7CisKKwlhc20oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDEiIDogIj1yIiAoY2FjaGVfdHlwZSkpOworCisJcHJpbnRrKCJDaGVja2luZyBWNiBibG9jayBjYWNoZSBvcGVyYXRpb25zOlxuIik7CisJcmVnaXN0ZXJfdW5kZWZfaG9vaygmYmxvY2tvcHNfaG9vayk7CisKKwlfX2FzbV9fICgibW92CXIwLCAlMFxuXHQiCisJCSJtb3YJcjEsICUxXG5cdCIKKwkJIm1vdglyMiwgIzFcblx0IgorCQkiLndvcmQJMHhlYzQwMWYyYyBAIG1jcnIgcDE1LCAwLCByMSwgcjAsIGMxMiwgMlxuXHQiCisJCSJtb3YJcjIsICMyXG5cdCIKKwkJIi53b3JkCTB4ZWM0MDFmMGUgQCBtY3JyIHAxNSwgMCwgcjEsIHIwLCBjMTQsIDBcblx0IgorCQkibW92CXIyLCAjNFxuXHQiCisJCSIud29yZAkweGVjNDAxZjBjIEAgbWNyciBwMTUsIDAsIHIxLCByMCwgYzEyLCAwXG5cdCIKKwkJIm1vdglyMiwgIzhcblx0IgorCQkiLndvcmQJMHhlYzQwMWYwNiBAIG1jcnIgcDE1LCAwLCByMSwgcjAsIGM2LCAwXG5cdCIKKwkJIm1vdglyMiwgIzE2XG5cdCIKKwkJIi53b3JkCTB4ZWM0MDFmMDUgQCBtY3JyIHAxNSwgMCwgcjEsIHIwLCBjNSwgMFxuXHQiCisJCToKKwkJOiAiciIgKFBBR0VfT0ZGU0VUKSwgInIiIChQQUdFX09GRlNFVCArIDEyOCkKKwkJOiAicjAiLCAicjEiLCAicjIiKTsKKworCXVucmVnaXN0ZXJfdW5kZWZfaG9vaygmYmxvY2tvcHNfaG9vayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmdW5jKTsgaSsrLCBlcnJfcG9zIDw8PSAxKQorCQlwcmludGsoIiUzMHM6ICVzc3VwcG9ydGVkXG4iLCBmdW5jW2ldLCBlcnIgJiBlcnJfcG9zID8gIm5vdCAiIDogIiIpOworCisJaWYgKChlcnIgJiA4KSA9PSAwKSB7CisJCXByaW50aygiIC0tPiBVc2luZyAlcyBibG9jayBjYWNoZSBpbnZhbGlkYXRlXG4iLAorCQkJY2FjaGVfdHlwZSAmICgxIDw8IDI0KSA/ICJoYXJ2YXJkIiA6ICJ1bmlmaWVkIik7CisJCWlmIChjYWNoZV90eXBlICYgKDEgPDwgMjQpKQorCQkJY3B1X2NhY2hlLmRtYV9pbnZfcmFuZ2UgPSBibGtfZG1hX2ludl9yYW5nZV9oYXJ2YXJkOworCQllbHNlCisJCQljcHVfY2FjaGUuZG1hX2ludl9yYW5nZSA9IGJsa19kbWFfaW52X3JhbmdlX3VuaWZpZWQ7CisJfQorCWlmICgoZXJyICYgNCkgPT0gMCkgeworCQlwcmludGsoIiAtLT4gVXNpbmcgYmxvY2sgY2FjaGUgY2xlYW5cbiIpOworCQljcHVfY2FjaGUuZG1hX2NsZWFuX3JhbmdlICAgICAgICA9IGJsa19kbWFfY2xlYW5fcmFuZ2U7CisJfQorCWlmICgoZXJyICYgMikgPT0gMCkgeworCQlwcmludGsoIiAtLT4gVXNpbmcgYmxvY2sgY2FjaGUgY2xlYW4raW52YWxpZGF0ZVxuIik7CisJCWNwdV9jYWNoZS5kbWFfZmx1c2hfcmFuZ2UgICAgICAgID0gYmxrX2RtYV9mbHVzaF9yYW5nZTsKKwkJY3B1X2NhY2hlLmZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UgPSBibGtfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChibG9ja29wc19jaGVjayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12My5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTk5NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjMuUwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9jYWNoZS12My5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIFJ1c3NlbGwga2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKKworLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfYWxsKCkKKyAqCisgKglJbnZhbGlkYXRlIGFsbCBjYWNoZSBlbnRyaWVzIGluIGEgcGFydGljdWxhciBhZGRyZXNzCisgKglzcGFjZS4KKyAqCisgKgktIG1tCS0gbW1fc3RydWN0IGRlc2NyaWJpbmcgYWRkcmVzcyBzcGFjZQorICovCitFTlRSWSh2M19mbHVzaF91c2VyX2NhY2hlX2FsbCkKKwkvKiBGQUxMVEhST1VHSCAqLworLyoKKyAqCWZsdXNoX2tlcm5fY2FjaGVfYWxsKCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgZW50aXJlIGNhY2hlLgorICovCitFTlRSWSh2M19mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglJbnZhbGlkYXRlIGEgcmFuZ2Ugb2YgY2FjaGUgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkCisgKglhZGRyZXNzIHNwYWNlLgorICoKKyAqCS0gc3RhcnQgLSBzdGFydCBhZGRyZXNzIChtYXkgbm90IGJlIGFsaWduZWQpCisgKgktIGVuZAktIGVuZCBhZGRyZXNzIChleGNsdXNpdmUsIG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZmxhZ3MJLSB2bWFfYXJlYV9zdHJ1Y3QgZmxhZ3MgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHYzX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UpCisJbW92CWlwLCAjMAorCW1jcmVxCXAxNSwgMCwgaXAsIGM3LCBjMCwgMAkJQCBmbHVzaCBJRCBjYWNoZQorCW1vdglwYywgbHIKKworLyoKKyAqCWNvaGVyZW50X2tlcm5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2M19jb2hlcmVudF9rZXJuX3JhbmdlKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKgljb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydCAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCSAtIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkodjNfY29oZXJlbnRfdXNlcl9yYW5nZSkKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF9rZXJuX2RjYWNoZV9wYWdlKHZvaWQgKnBhZ2UpCisgKgorICoJRW5zdXJlIG5vIEQgY2FjaGUgYWxpYXNpbmcgb2NjdXJzLCBlaXRoZXIgd2l0aCBpdHNlbGYgb3IKKyAqCXRoZSBJIGNhY2hlCisgKgorICoJLSBhZGRyCS0gcGFnZSBhbGlnbmVkIGFkZHJlc3MKKyAqLworRU5UUlkodjNfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZG1hX2ludl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUludmFsaWRhdGUgKGRpc2NhcmQpIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoJTWF5IG5vdCB3cml0ZSBiYWNrIGFueSBlbnRyaWVzLiAgSWYgJ3N0YXJ0JyBvciAnZW5kJworICoJYXJlIG5vdCBjYWNoZSBsaW5lIGFsaWduZWQsIHRob3NlIGxpbmVzIG11c3QgYmUgd3JpdHRlbgorICoJYmFjay4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2M19kbWFfaW52X3JhbmdlKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKglkbWFfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2M19kbWFfZmx1c2hfcmFuZ2UpCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDAJCUAgZmx1c2ggSUQgY2FjaGUKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJQ2xlYW4gKHdyaXRlIGJhY2spIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAkgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKHYzX2RtYV9jbGVhbl9yYW5nZSkKKwltb3YJcGMsIGxyCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2M19jYWNoZV9mbnMsICNvYmplY3QKK0VOVFJZKHYzX2NhY2hlX2ZucykKKwkubG9uZwl2M19mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCXYzX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJdjNfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQorCS5sb25nCXYzX2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwl2M19jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJdjNfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZQorCS5sb25nCXYzX2RtYV9pbnZfcmFuZ2UKKwkubG9uZwl2M19kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwl2M19kbWFfZmx1c2hfcmFuZ2UKKwkuc2l6ZQl2M19jYWNoZV9mbnMsIC4gLSB2M19jYWNoZV9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLXY0LlMgYi9hcmNoL2FybS9tbS9jYWNoZS12NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWQ1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9jYWNoZS12NC5TCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL2NhY2hlLXY0LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgUnVzc2VsbCBraW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9hbGwoKQorICoKKyAqCUludmFsaWRhdGUgYWxsIGNhY2hlIGVudHJpZXMgaW4gYSBwYXJ0aWN1bGFyIGFkZHJlc3MKKyAqCXNwYWNlLgorICoKKyAqCS0gbW0JLSBtbV9zdHJ1Y3QgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHY0X2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorCS8qIEZBTExUSFJPVUdIICovCisvKgorICoJZmx1c2hfa2Vybl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK0VOVFJZKHY0X2ZsdXNoX2tlcm5fY2FjaGVfYWxsKQorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3LCAwCQlAIGZsdXNoIElEIGNhY2hlCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglJbnZhbGlkYXRlIGEgcmFuZ2Ugb2YgY2FjaGUgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkCisgKglhZGRyZXNzIHNwYWNlLgorICoKKyAqCS0gc3RhcnQgLSBzdGFydCBhZGRyZXNzIChtYXkgbm90IGJlIGFsaWduZWQpCisgKgktIGVuZAktIGVuZCBhZGRyZXNzIChleGNsdXNpdmUsIG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZmxhZ3MJLSB2bWFfYXJlYV9zdHJ1Y3QgZmxhZ3MgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHY0X2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UpCisJbW92CWlwLCAjMAorCW1jcmVxCXAxNSwgMCwgaXAsIGM3LCBjNywgMAkJQCBmbHVzaCBJRCBjYWNoZQorCW1vdglwYywgbHIKKworLyoKKyAqCWNvaGVyZW50X2tlcm5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2NF9jb2hlcmVudF9rZXJuX3JhbmdlKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKgljb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydCAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCSAtIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkodjRfY29oZXJlbnRfdXNlcl9yYW5nZSkKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF9rZXJuX2RjYWNoZV9wYWdlKHZvaWQgKnBhZ2UpCisgKgorICoJRW5zdXJlIG5vIEQgY2FjaGUgYWxpYXNpbmcgb2NjdXJzLCBlaXRoZXIgd2l0aCBpdHNlbGYgb3IKKyAqCXRoZSBJIGNhY2hlCisgKgorICoJLSBhZGRyCS0gcGFnZSBhbGlnbmVkIGFkZHJlc3MKKyAqLworRU5UUlkodjRfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZG1hX2ludl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUludmFsaWRhdGUgKGRpc2NhcmQpIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoJTWF5IG5vdCB3cml0ZSBiYWNrIGFueSBlbnRyaWVzLiAgSWYgJ3N0YXJ0JyBvciAnZW5kJworICoJYXJlIG5vdCBjYWNoZSBsaW5lIGFsaWduZWQsIHRob3NlIGxpbmVzIG11c3QgYmUgd3JpdHRlbgorICoJYmFjay4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2NF9kbWFfaW52X3JhbmdlKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKglkbWFfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2NF9kbWFfZmx1c2hfcmFuZ2UpCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJCUAgZmx1c2ggSUQgY2FjaGUKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJQ2xlYW4gKHdyaXRlIGJhY2spIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAkgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKHY0X2RtYV9jbGVhbl9yYW5nZSkKKwltb3YJcGMsIGxyCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2NF9jYWNoZV9mbnMsICNvYmplY3QKK0VOVFJZKHY0X2NhY2hlX2ZucykKKwkubG9uZwl2NF9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCXY0X2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJdjRfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQorCS5sb25nCXY0X2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwl2NF9jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJdjRfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZQorCS5sb25nCXY0X2RtYV9pbnZfcmFuZ2UKKwkubG9uZwl2NF9kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwl2NF9kbWFfZmx1c2hfcmFuZ2UKKwkuc2l6ZQl2NF9jYWNoZV9mbnMsIC4gLSB2NF9jYWNoZV9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLXY0d2IuUyBiL2FyY2gvYXJtL21tL2NhY2hlLXY0d2IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQwNTViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjR3Yi5TCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL2NhY2hlLXY0d2IuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBSdXNzZWxsIGtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvbmUgZGF0YSBjYWNoZSBsaW5lLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU5FU0laRQkzMgorCisvKgorICogVGhlIHRvdGFsIHNpemUgb2YgdGhlIGRhdGEgY2FjaGUuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0ExMTApCisjIGRlZmluZSBDQUNIRV9EU0laRQkxNjM4NAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NBMTEwMCkKKyMgZGVmaW5lIENBQ0hFX0RTSVpFCTgxOTIKKyNlbHNlCisjIGVycm9yIFVua25vd24gY2FjaGUgc2l6ZQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzaXplIGF0IHdoaWNoIGl0IGJlY29tZXMgbW9yZSBlZmZpY2llbnQgdG8KKyAqIGNsZWFuIHRoZSB3aG9sZSBjYWNoZSwgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGluZGl2aWR1YWwKKyAqIGNhY2hlIGxpbmUgbWFpbnRhaW5lbmNlIGluc3RydWN0aW9ucy4KKyAqCisgKiAgU2l6ZSAgQ2xlYW4gKHRpY2tzKSBEaXJ0eSAodGlja3MpCisgKiAgIDQwOTYgICAyMSAgMjAgIDIxICAgIDUzICA1NSAgNTQKKyAqICAgODE5MiAgIDQwICA0MSAgNDAgICAxMDYgMTAwIDEwMgorICogIDE2Mzg0ICAgNzcgIDc3ICA3NiAgIDE0MCAxNDAgMTM4CisgKiAgMzI3NjggIDE1MCAxNDkgMTUwICAgMjE0IDIxNiAyMTIgPC0tLQorICogIDY1NTM2ICAyOTYgMjk3IDI5NiAgIDM1MSAzNTggMzYxCisgKiAxMzEwNzIgIDU5MSA1OTEgNTkxICAgNjU2IDY1NyA2NTEKKyAqICBXaG9sZSAgMTMyIDEzNiAxMzIgICAyMjEgMjE3IDIwNyA8LS0tCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTUlUCShDQUNIRV9EU0laRSAqIDQpCisKKy8qCisgKglmbHVzaF91c2VyX2NhY2hlX2FsbCgpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgYWxsIGNhY2hlIGVudHJpZXMgaW4gYSBwYXJ0aWN1bGFyIGFkZHJlc3MKKyAqCXNwYWNlLgorICovCitFTlRSWSh2NHdiX2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorCS8qIEZBTExUSFJPVUdIICovCisvKgorICoJZmx1c2hfa2Vybl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK0VOVFJZKHY0d2JfZmx1c2hfa2Vybl9jYWNoZV9hbGwpCisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCitfX2ZsdXNoX3dob2xlX2NhY2hlOgorCW1vdglyMCwgI0ZMVVNIX0JBU0UKKwlhZGQJcjEsIHIwLCAjQ0FDSEVfRFNJWkUKKzE6CWxkcglyMiwgW3IwXSwgIzMyCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlcgorCW1vdglwYywgbHIKKworLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCwgZmxhZ3MpCisgKgorICoJSW52YWxpZGF0ZSBhIHJhbmdlIG9mIGNhY2hlIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZAorICoJYWRkcmVzcyBzcGFjZS4KKyAqCisgKgktIHN0YXJ0IC0gc3RhcnQgYWRkcmVzcyAoaW5jbHVzaXZlLCBwYWdlIGFsaWduZWQpCisgKgktIGVuZAktIGVuZCBhZGRyZXNzIChleGNsdXNpdmUsIHBhZ2UgYWxpZ25lZCkKKyAqCS0gZmxhZ3MJLSB2bWFfYXJlYV9zdHJ1Y3QgZmxhZ3MgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHY0d2JfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwlzdWIJcjMsIHIxLCByMAkJCUAgY2FsY3VsYXRlIHRvdGFsIHNpemUKKwl0c3QJcjIsICNWTV9FWEVDCQkJQCBleGVjdXRhYmxlIHJlZ2lvbj8KKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisKKwljbXAJcjMsICNDQUNIRV9ETElNSVQJCUAgdG90YWwgc2l6ZSA+PSBsaW1pdD8KKwliaHMJX19mbHVzaF93aG9sZV9jYWNoZQkJQCBmbHVzaCB3aG9sZSBEIGNhY2hlCisKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJdHN0CXIyLCAjVk1fRVhFQworCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSh2b2lkICpwYWdlKQorICoKKyAqCUVuc3VyZSBubyBEIGNhY2hlIGFsaWFzaW5nIG9jY3VycywgZWl0aGVyIHdpdGggaXRzZWxmIG9yCisgKgl0aGUgSSBjYWNoZQorICoKKyAqCS0gYWRkcgktIHBhZ2UgYWxpZ25lZCBhZGRyZXNzCisgKi8KK0VOVFJZKHY0d2JfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSkKKwlhZGQJcjEsIHIwLCAjUEFHRV9TWgorCS8qIGZhbGwgdGhyb3VnaCAqLworCisvKgorICoJY29oZXJlbnRfa2Vybl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUVuc3VyZSBjb2hlcmVuY3kgYmV0d2VlbiB0aGUgSWNhY2hlIGFuZCB0aGUgRGNhY2hlIGluIHRoZQorICoJcmVnaW9uIGRlc2NyaWJlZCBieSBzdGFydC4gIElmIHlvdSBoYXZlIG5vbi1zbm9vcGluZworICoJSGFydmFyZCBjYWNoZXMsIHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCS0gc3RhcnQgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAkgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKHY0d2JfY29oZXJlbnRfa2Vybl9yYW5nZSkKKwkvKiBmYWxsIHRocm91Z2ggKi8KKworLyoKKyAqCWNvaGVyZW50X3VzZXJfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2NHdiX2NvaGVyZW50X3VzZXJfcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKworLyoKKyAqCWRtYV9pbnZfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglJbnZhbGlkYXRlIChkaXNjYXJkKSB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCU1heSBub3Qgd3JpdGUgYmFjayBhbnkgZW50cmllcy4gIElmICdzdGFydCcgb3IgJ2VuZCcKKyAqCWFyZSBub3QgY2FjaGUgbGluZSBhbGlnbmVkLCB0aG9zZSBsaW5lcyBtdXN0IGJlIHdyaXR0ZW4KKyAqCWJhY2suCisgKgorICoJLSBzdGFydCAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCSAtIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkodjR3Yl9kbWFfaW52X3JhbmdlKQorCXRzdAlyMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCXRzdAlyMSwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIxLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiB3cml0ZSBidWZmZXIKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiAod3JpdGUgYmFjaykgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKgorICoJLSBzdGFydCAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCSAtIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkodjR3Yl9kbWFfY2xlYW5fcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlcgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAkgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKgorICoJVGhpcyBpcyBhY3R1YWxseSB0aGUgc2FtZSBhcyB2NHdiX2NvaGVyZW50X2tlcm5fcmFuZ2UoKQorICovCisJLmdsb2JsCXY0d2JfZG1hX2ZsdXNoX3JhbmdlCisJLnNldAl2NHdiX2RtYV9mbHVzaF9yYW5nZSwgdjR3Yl9jb2hlcmVudF9rZXJuX3JhbmdlCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2NHdiX2NhY2hlX2ZucywgI29iamVjdAorRU5UUlkodjR3Yl9jYWNoZV9mbnMpCisJLmxvbmcJdjR3Yl9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCXY0d2JfZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwkubG9uZwl2NHdiX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwkubG9uZwl2NHdiX2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwl2NHdiX2NvaGVyZW50X3VzZXJfcmFuZ2UKKwkubG9uZwl2NHdiX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UKKwkubG9uZwl2NHdiX2RtYV9pbnZfcmFuZ2UKKwkubG9uZwl2NHdiX2RtYV9jbGVhbl9yYW5nZQorCS5sb25nCXY0d2JfZG1hX2ZsdXNoX3JhbmdlCisJLnNpemUJdjR3Yl9jYWNoZV9mbnMsIC4gLSB2NHdiX2NhY2hlX2ZucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtdjR3dC5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjR3dC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliY2FiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9jYWNoZS12NHd0LlMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vY2FjaGUtdjR3dC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIFJ1c3NlbGwga2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFSTXY0IHdyaXRlIHRocm91Z2ggY2FjaGUgb3BlcmF0aW9ucyBzdXBwb3J0LgorICoKKyAqICBXZSBhc3N1bWUgdGhhdCB0aGUgd3JpdGUgYnVmZmVyIGlzIG5vdCBlbmFibGVkLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvbmUgZGF0YSBjYWNoZSBsaW5lLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU5FU0laRQkzMgorCisvKgorICogVGhlIG51bWJlciBvZiBkYXRhIGNhY2hlIHNlZ21lbnRzLgorICovCisjZGVmaW5lIENBQ0hFX0RTRUdNRU5UUwk4CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGxpbmVzIGluIGEgY2FjaGUgc2VnbWVudC4KKyAqLworI2RlZmluZSBDQUNIRV9ERU5UUklFUwk2NAorCisvKgorICogVGhpcyBpcyB0aGUgc2l6ZSBhdCB3aGljaCBpdCBiZWNvbWVzIG1vcmUgZWZmaWNpZW50IHRvCisgKiBjbGVhbiB0aGUgd2hvbGUgY2FjaGUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbmRpdmlkdWFsCisgKiBjYWNoZSBsaW5lIG1haW50YWluZW5jZSBpbnN0cnVjdGlvbnMuCisgKgorICogKioqIFRoaXMgbmVlZHMgYmVuY2htYXJraW5nCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTUlUCTE2Mzg0CisKKy8qCisgKglmbHVzaF91c2VyX2NhY2hlX2FsbCgpCisgKgorICoJSW52YWxpZGF0ZSBhbGwgY2FjaGUgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgYWRkcmVzcworICoJc3BhY2UuCisgKi8KK0VOVFJZKHY0d3RfZmx1c2hfdXNlcl9jYWNoZV9hbGwpCisJLyogRkFMTFRIUk9VR0ggKi8KKy8qCisgKglmbHVzaF9rZXJuX2NhY2hlX2FsbCgpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgdGhlIGVudGlyZSBjYWNoZS4KKyAqLworRU5UUlkodjR3dF9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwltb3YJcjIsICNWTV9FWEVDCisJbW92CWlwLCAjMAorX19mbHVzaF93aG9sZV9jYWNoZToKKwl0c3QJcjIsICNWTV9FWEVDCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDAJCUAgaW52YWxpZGF0ZSBEIGNhY2hlCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSBhIHJhbmdlIG9mIGNhY2hlIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZAorICoJYWRkcmVzcyBzcGFjZS4KKyAqCisgKgktIHN0YXJ0IC0gc3RhcnQgYWRkcmVzcyAoaW5jbHVzaXZlLCBwYWdlIGFsaWduZWQpCisgKgktIGVuZAktIGVuZCBhZGRyZXNzIChleGNsdXNpdmUsIHBhZ2UgYWxpZ25lZCkKKyAqCS0gZmxhZ3MJLSB2bWFfYXJlYV9zdHJ1Y3QgZmxhZ3MgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHY0d3RfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwlzdWIJcjMsIHIxLCByMAkJCUAgY2FsY3VsYXRlIHRvdGFsIHNpemUKKwljbXAJcjMsICNDQUNIRV9ETElNSVQKKwliaHMJX19mbHVzaF93aG9sZV9jYWNoZQorCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCXRzdAlyMiwgI1ZNX0VYRUMKKwltY3JuZQlwMTUsIDAsIHIwLCBjNywgYzUsIDEJCUAgaW52YWxpZGF0ZSBJIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltb3YJcGMsIGxyCisKKy8qCisgKgljb2hlcmVudF9rZXJuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydCAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCSAtIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkodjR3dF9jb2hlcmVudF9rZXJuX3JhbmdlKQorCS8qIEZBTExUUkhPVUdIICovCisKKy8qCisgKgljb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydCAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCSAtIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkodjR3dF9jb2hlcmVudF91c2VyX3JhbmdlKQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSh2b2lkICpwYWdlKQorICoKKyAqCUVuc3VyZSBubyBEIGNhY2hlIGFsaWFzaW5nIG9jY3VycywgZWl0aGVyIHdpdGggaXRzZWxmIG9yCisgKgl0aGUgSSBjYWNoZQorICoKKyAqCS0gYWRkcgktIHBhZ2UgYWxpZ25lZCBhZGRyZXNzCisgKi8KK0VOVFJZKHY0d3RfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSkKKwltb3YJcjIsICMwCisJbWNyCXAxNSwgMCwgcjIsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKwlhZGQJcjEsIHIwLCAjUEFHRV9TWgorCS8qIGZhbGx0aHJvdWdoICovCisKKy8qCisgKglkbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJSW52YWxpZGF0ZSAoZGlzY2FyZCkgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKglNYXkgbm90IHdyaXRlIGJhY2sgYW55IGVudHJpZXMuICBJZiAnc3RhcnQnIG9yICdlbmQnCisgKglhcmUgbm90IGNhY2hlIGxpbmUgYWxpZ25lZCwgdGhvc2UgbGluZXMgbXVzdCBiZSB3cml0dGVuCisgKgliYWNrLgorICoKKyAqCS0gc3RhcnQgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAkgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKHY0d3RfZG1hX2ludl9yYW5nZSkKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKglkbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh2NHd0X2RtYV9jbGVhbl9yYW5nZSkKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCisJLmdsb2JsCXY0d3RfZG1hX2ZsdXNoX3JhbmdlCisJLmVxdQl2NHd0X2RtYV9mbHVzaF9yYW5nZSwgdjR3dF9kbWFfaW52X3JhbmdlCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2NHd0X2NhY2hlX2ZucywgI29iamVjdAorRU5UUlkodjR3dF9jYWNoZV9mbnMpCisJLmxvbmcJdjR3dF9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCXY0d3RfZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwkubG9uZwl2NHd0X2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwkubG9uZwl2NHd0X2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwl2NHd0X2NvaGVyZW50X3VzZXJfcmFuZ2UKKwkubG9uZwl2NHd0X2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UKKwkubG9uZwl2NHd0X2RtYV9pbnZfcmFuZ2UKKwkubG9uZwl2NHd0X2RtYV9jbGVhbl9yYW5nZQorCS5sb25nCXY0d3RfZG1hX2ZsdXNoX3JhbmdlCisJLnNpemUJdjR3dF9jYWNoZV9mbnMsIC4gLSB2NHd0X2NhY2hlX2ZucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtdjYuUyBiL2FyY2gvYXJtL21tL2NhY2hlLXY2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjMTBhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY2LlMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vY2FjaGUtdjYuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBpcyB0aGUgInNoZWxsIiBvZiB0aGUgQVJNdjYgcHJvY2Vzc29yIHN1cHBvcnQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKKyNkZWZpbmUgSEFSVkFSRF9DQUNIRQorI2RlZmluZSBDQUNIRV9MSU5FX1NJWkUJCTMyCisjZGVmaW5lIERfQ0FDSEVfTElORV9TSVpFCTMyCisKKy8qCisgKgl2Nl9mbHVzaF9jYWNoZV9hbGwoKQorICoKKyAqCUZsdXNoIHRoZSBlbnRpcmUgY2FjaGUuCisgKgorICoJSXQgaXMgYXNzdW1lZCB0aGF0OgorICovCitFTlRSWSh2Nl9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwltb3YJcjAsICMwCisjaWZkZWYgSEFSVkFSRF9DQUNIRQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAwCQlAIEQgY2FjaGUgY2xlYW4raW52YWxpZGF0ZQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCUAgSStCVEIgY2FjaGUgaW52YWxpZGF0ZQorI2Vsc2UKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNSwgMAkJQCBDYWNoZSBjbGVhbitpbnZhbGlkYXRlCisjZW5kaWYKKwltb3YJcGMsIGxyCisKKy8qCisgKgl2Nl9mbHVzaF9jYWNoZV9hbGwoKQorICoKKyAqCUZsdXNoIGFsbCBUTEIgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgYWRkcmVzcyBzcGFjZQorICoKKyAqCS0gbW0gICAgLSBtbV9zdHJ1Y3QgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHY2X2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorCS8qRkFMTFRIUk9VR0gqLworCisvKgorICoJdjZfZmx1c2hfY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCwgZmxhZ3MpCisgKgorICoJRmx1c2ggYSByYW5nZSBvZiBUTEIgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJLSBzdGFydCAtIHN0YXJ0IGFkZHJlc3MgKG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZW5kICAgLSBlbmQgYWRkcmVzcyAoZXhjbHVzaXZlLCBtYXkgbm90IGJlIGFsaWduZWQpCisgKgktIGZsYWdzCS0gdm1fYXJlYV9zdHJ1Y3QgZmxhZ3MgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKgorICoJSXQgaXMgYXNzdW1lZCB0aGF0OgorICoJLSB3ZSBoYXZlIGEgVklQVCBjYWNoZS4KKyAqLworRU5UUlkodjZfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwltb3YJcGMsIGxyCisKKy8qCisgKgl2Nl9jb2hlcmVudF9rZXJuX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCisgKglFbnN1cmUgdGhhdCB0aGUgSSBhbmQgRCBjYWNoZXMgYXJlIGNvaGVyZW50IHdpdGhpbiBzcGVjaWZpZWQKKyAqCXJlZ2lvbi4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBjb2RlIGhhcyBiZWVuIHdyaXR0ZW4gdG8KKyAqCWEgbWVtb3J5IHJlZ2lvbiwgYW5kIHdpbGwgYmUgZXhlY3V0ZWQuCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIHRoZSBJY2FjaGUgZG9lcyBub3QgcmVhZCBkYXRhIGZyb20gdGhlIHdyaXRlIGJ1ZmZlcgorICovCitFTlRSWSh2Nl9jb2hlcmVudF9rZXJuX3JhbmdlKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKgl2Nl9jb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCisgKglFbnN1cmUgdGhhdCB0aGUgSSBhbmQgRCBjYWNoZXMgYXJlIGNvaGVyZW50IHdpdGhpbiBzcGVjaWZpZWQKKyAqCXJlZ2lvbi4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBjb2RlIGhhcyBiZWVuIHdyaXR0ZW4gdG8KKyAqCWEgbWVtb3J5IHJlZ2lvbiwgYW5kIHdpbGwgYmUgZXhlY3V0ZWQuCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIHRoZSBJY2FjaGUgZG9lcyBub3QgcmVhZCBkYXRhIGZyb20gdGhlIHdyaXRlIGJ1ZmZlcgorICovCitFTlRSWSh2Nl9jb2hlcmVudF91c2VyX3JhbmdlKQorCWJpYwlyMCwgcjAsICNDQUNIRV9MSU5FX1NJWkUgLSAxCisxOgorI2lmZGVmIEhBUlZBUkRfQ0FDSEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGxpbmUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBsaW5lCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCA3CQlAIGludmFsaWRhdGUgQlRCIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0xJTkVfU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNpZmRlZiBIQVJWQVJEX0NBQ0hFCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlcgorI2VuZGlmCisJbW92CXBjLCBscgorCisvKgorICoJdjZfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZShrYWRkcikKKyAqCisgKglFbnN1cmUgdGhhdCB0aGUgZGF0YSBoZWxkIGluIHRoZSBwYWdlIGthZGRyIGlzIHdyaXR0ZW4gYmFjaworICoJdG8gdGhlIHBhZ2UgaW4gcXVlc3Rpb24uCisgKgorICoJLSBrYWRkciAgIC0ga2VybmVsIGFkZHJlc3MgKGd1YXJhbnRlZWQgdG8gYmUgcGFnZSBhbGlnbmVkKQorICovCitFTlRSWSh2Nl9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlKQorCWFkZAlyMSwgcjAsICNQQUdFX1NaCisxOgorI2lmZGVmIEhBUlZBUkRfQ0FDSEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiAmIGludmFsaWRhdGUgRCBsaW5lCisjZWxzZQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzE1LCAxCQlAIGNsZWFuICYgaW52YWxpZGF0ZSB1bmlmaWVkIGxpbmUKKyNlbmRpZgkKKwlhZGQJcjAsIHIwLCAjRF9DQUNIRV9MSU5FX1NJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjaWZkZWYgSEFSVkFSRF9DQUNIRQorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAorI2VuZGlmCisJbW92CXBjLCBscgorCisKKy8qCisgKgl2Nl9kbWFfaW52X3JhbmdlKHN0YXJ0LGVuZCkKKyAqCisgKglJbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbjsgd2Ugd2lsbAorICoJYmUgcGVyZm9ybWluZyBhIERNQSBvcGVyYXRpb24gaW4gdGhpcyByZWdpb24gYW5kIHdlIHdhbnQgdG8KKyAqCXB1cmdlIG9sZCBkYXRhIGluIHRoZSBjYWNoZS4KKyAqCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCitFTlRSWSh2Nl9kbWFfaW52X3JhbmdlKQorCXRzdAlyMCwgI0RfQ0FDSEVfTElORV9TSVpFIC0gMQorCWJpYwlyMCwgcjAsICNEX0NBQ0hFX0xJTkVfU0laRSAtIDEKKyNpZmRlZiBIQVJWQVJEX0NBQ0hFCisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGxpbmUKKyNlbHNlCisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGMxMSwgMQkJQCBjbGVhbiB1bmlmaWVkIGxpbmUKKyNlbmRpZgorCXRzdAlyMSwgI0RfQ0FDSEVfTElORV9TSVpFIC0gMQorCWJpYwlyMSwgcjEsICNEX0NBQ0hFX0xJTkVfU0laRSAtIDEKKyNpZmRlZiBIQVJWQVJEX0NBQ0hFCisJbWNybmUJcDE1LCAwLCByMSwgYzcsIGMxNCwgMQkJQCBjbGVhbiAmIGludmFsaWRhdGUgRCBsaW5lCisjZWxzZQorCW1jcm5lCXAxNSwgMCwgcjEsIGM3LCBjMTUsIDEJCUAgY2xlYW4gJiBpbnZhbGlkYXRlIHVuaWZpZWQgbGluZQorI2VuZGlmCisxOgorI2lmZGVmIEhBUlZBUkRfQ0FDSEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBsaW5lCisjZWxzZQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDEJCUAgaW52YWxpZGF0ZSB1bmlmaWVkIGxpbmUKKyNlbmRpZgorCWFkZAlyMCwgcjAsICNEX0NBQ0hFX0xJTkVfU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyCisJbW92CXBjLCBscgorCisvKgorICoJdjZfZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gZW5kICAgICAtIHZpcnR1YWwgZW5kIGFkZHJlc3Mgb2YgcmVnaW9uCisgKi8KK0VOVFJZKHY2X2RtYV9jbGVhbl9yYW5nZSkKKwliaWMJcjAsIHIwLCAjRF9DQUNIRV9MSU5FX1NJWkUgLSAxCisxOgorI2lmZGVmIEhBUlZBUkRfQ0FDSEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGxpbmUKKyNlbHNlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTEsIDEJCUAgY2xlYW4gdW5pZmllZCBsaW5lCisjZW5kaWYKKwlhZGQJcjAsIHIwLCAjRF9DQUNIRV9MSU5FX1NJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlcgorCW1vdglwYywgbHIKKworLyoKKyAqCXY2X2RtYV9mbHVzaF9yYW5nZShzdGFydCxlbmQpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCitFTlRSWSh2Nl9kbWFfZmx1c2hfcmFuZ2UpCisJYmljCXIwLCByMCwgI0RfQ0FDSEVfTElORV9TSVpFIC0gMQorMToKKyNpZmRlZiBIQVJWQVJEX0NBQ0hFCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4gJiBpbnZhbGlkYXRlIEQgbGluZQorI2Vsc2UKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNSwgMQkJQCBjbGVhbiAmIGludmFsaWRhdGUgbGluZQorI2VuZGlmCisJYWRkCXIwLCByMCwgI0RfQ0FDSEVfTElORV9TSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiB3cml0ZSBidWZmZXIKKwltb3YJcGMsIGxyCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2Nl9jYWNoZV9mbnMsICNvYmplY3QKK0VOVFJZKHY2X2NhY2hlX2ZucykKKwkubG9uZwl2Nl9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCXY2X2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJdjZfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQorCS5sb25nCXY2X2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwl2Nl9jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJdjZfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZQorCS5sb25nCXY2X2RtYV9pbnZfcmFuZ2UKKwkubG9uZwl2Nl9kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwl2Nl9kbWFfZmx1c2hfcmFuZ2UKKwkuc2l6ZQl2Nl9jYWNoZV9mbnMsIC4gLSB2Nl9jYWNoZV9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYyBiL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM1NmNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY29uc2lzdGVudC5jCkBAIC0wLDAgKzEsNDUxIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBETUEgdW5jYWNoZWQgbWFwcGluZyBzdXBwb3J0LgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCisjZGVmaW5lIENPTlNJU1RFTlRfQkFTRQkoMHhmZmMwMDAwMCkKKyNkZWZpbmUgQ09OU0lTVEVOVF9FTkQJKDB4ZmZlMDAwMDApCisjZGVmaW5lIENPTlNJU1RFTlRfT0ZGU0VUKHgpCSgoKHVuc2lnbmVkIGxvbmcpKHgpIC0gQ09OU0lTVEVOVF9CQVNFKSA+PiBQQUdFX1NISUZUKQorCisvKgorICogVGhpcyBpcyB0aGUgcGFnZSB0YWJsZSAoMk1CKSBjb3ZlcmluZyB1bmNhY2hlZCwgRE1BIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnMKKyAqLworc3RhdGljIHB0ZV90ICpjb25zaXN0ZW50X3B0ZTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29uc2lzdGVudF9sb2NrKTsKKworLyoKKyAqIFZNIHJlZ2lvbiBoYW5kbGluZyBzdXBwb3J0LgorICoKKyAqIFRoaXMgc2hvdWxkIGJlY29tZSBzb21ldGhpbmcgZ2VuZXJpYywgaGFuZGxpbmcgVk0gcmVnaW9uIGFsbG9jYXRpb25zIGZvcgorICogdm1hbGxvYyBhbmQgc2ltaWxhciAoaW9yZW1hcCwgbW9kdWxlIHNwYWNlLCBldGMpLgorICoKKyAqIEkgZW52aXNhZ2Ugdm1hbGxvYygpJ3Mgc3VwcG9ydGluZyB2bV9zdHJ1Y3QgYmVjb21pbmc6CisgKgorICogIHN0cnVjdCB2bV9zdHJ1Y3QgeworICogICAgc3RydWN0IHZtX3JlZ2lvbglyZWdpb247CisgKiAgICB1bnNpZ25lZCBsb25nCWZsYWdzOworICogICAgc3RydWN0IHBhZ2UJKipwYWdlczsKKyAqICAgIHVuc2lnbmVkIGludAlucl9wYWdlczsKKyAqICAgIHVuc2lnbmVkIGxvbmcJcGh5c19hZGRyOworICogIH07CisgKgorICogZ2V0X3ZtX2FyZWEoKSB3b3VsZCB0aGVuIGNhbGwgdm1fcmVnaW9uX2FsbG9jIHdpdGggYW4gYXBwcm9wcmlhdGUKKyAqIHN0cnVjdCB2bV9yZWdpb24gaGVhZCAoZWcpOgorICoKKyAqICBzdHJ1Y3Qgdm1fcmVnaW9uIHZtYWxsb2NfaGVhZCA9IHsKKyAqCS52bV9saXN0CT0gTElTVF9IRUFEX0lOSVQodm1hbGxvY19oZWFkLnZtX2xpc3QpLAorICoJLnZtX3N0YXJ0CT0gVk1BTExPQ19TVEFSVCwKKyAqCS52bV9lbmQJCT0gVk1BTExPQ19FTkQsCisgKiAgfTsKKyAqCisgKiBIb3dldmVyLCB2bWFsbG9jX2hlYWQudm1fc3RhcnQgaXMgdmFyaWFibGUgKHR5cGljYWxseSwgaXQgaXMgZGVwZW5kZW50IG9uCisgKiB0aGUgYW1vdW50IG9mIFJBTSBmb3VuZCBhdCBib290IHRpbWUuKSAgSSB3b3VsZCBpbWFnaW5lIHRoYXQgZ2V0X3ZtX2FyZWEoKQorICogd291bGQgaGF2ZSB0byBpbml0aWFsaXNlIHRoaXMgZWFjaCB0aW1lIHByaW9yIHRvIGNhbGxpbmcgdm1fcmVnaW9uX2FsbG9jKCkuCisgKi8KK3N0cnVjdCB2bV9yZWdpb24geworCXN0cnVjdCBsaXN0X2hlYWQJdm1fbGlzdDsKKwl1bnNpZ25lZCBsb25nCQl2bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nCQl2bV9lbmQ7CisJc3RydWN0IHBhZ2UJCSp2bV9wYWdlczsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fcmVnaW9uIGNvbnNpc3RlbnRfaGVhZCA9IHsKKwkudm1fbGlzdAk9IExJU1RfSEVBRF9JTklUKGNvbnNpc3RlbnRfaGVhZC52bV9saXN0KSwKKwkudm1fc3RhcnQJPSBDT05TSVNURU5UX0JBU0UsCisJLnZtX2VuZAkJPSBDT05TSVNURU5UX0VORCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fcmVnaW9uICoKK3ZtX3JlZ2lvbl9hbGxvYyhzdHJ1Y3Qgdm1fcmVnaW9uICpoZWFkLCBzaXplX3Qgc2l6ZSwgaW50IGdmcCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBoZWFkLT52bV9zdGFydCwgZW5kID0gaGVhZC0+dm1fZW5kIC0gc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2bV9yZWdpb24gKmMsICpuZXc7CisKKwluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1fcmVnaW9uKSwgZ2ZwKTsKKwlpZiAoIW5ldykKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZoZWFkLT52bV9saXN0LCB2bV9saXN0KSB7CisJCWlmICgoYWRkciArIHNpemUpIDwgYWRkcikKKwkJCWdvdG8gbm9zcGM7CisJCWlmICgoYWRkciArIHNpemUpIDw9IGMtPnZtX3N0YXJ0KQorCQkJZ290byBmb3VuZDsKKwkJYWRkciA9IGMtPnZtX2VuZDsKKwkJaWYgKGFkZHIgPiBlbmQpCisJCQlnb3RvIG5vc3BjOworCX0KKworIGZvdW5kOgorCS8qCisJICogSW5zZXJ0IHRoaXMgZW50cnkgX2JlZm9yZV8gdGhlIG9uZSB3ZSBmb3VuZC4KKwkgKi8KKwlsaXN0X2FkZF90YWlsKCZuZXctPnZtX2xpc3QsICZjLT52bV9saXN0KTsKKwluZXctPnZtX3N0YXJ0ID0gYWRkcjsKKwluZXctPnZtX2VuZCA9IGFkZHIgKyBzaXplOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIG5ldzsKKworIG5vc3BjOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOworCWtmcmVlKG5ldyk7Cisgb3V0OgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZtX3JlZ2lvbiAqdm1fcmVnaW9uX2ZpbmQoc3RydWN0IHZtX3JlZ2lvbiAqaGVhZCwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXN0cnVjdCB2bV9yZWdpb24gKmM7CisJCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaGVhZC0+dm1fbGlzdCwgdm1fbGlzdCkgeworCQlpZiAoYy0+dm1fc3RhcnQgPT0gYWRkcikKKwkJCWdvdG8gb3V0OworCX0KKwljID0gTlVMTDsKKyBvdXQ6CisJcmV0dXJuIGM7Cit9CisKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisjZXJyb3IgQVJNIENvaGVyZW50IERNQSBhbGxvY2F0b3IgZG9lcyBub3QgKHlldCkgc3VwcG9ydCBodWdlIFRMQgorI2VuZGlmCisKK3N0YXRpYyB2b2lkICoKK19fZG1hX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmhhbmRsZSwgaW50IGdmcCwKKwkgICAgcGdwcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3Qgdm1fcmVnaW9uICpjOworCXVuc2lnbmVkIGxvbmcgb3JkZXI7CisJdTY0IG1hc2sgPSBJU0FfRE1BX1RIUkVTSE9MRCwgbGltaXQ7CisKKwlpZiAoIWNvbnNpc3RlbnRfcHRlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vdCBpbml0aWFsaXNlZFxuIiwgX19mdW5jX18pOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkZXYpIHsKKwkJbWFzayA9IGRldi0+Y29oZXJlbnRfZG1hX21hc2s7CisKKwkJLyoKKwkJICogU2FuaXR5IGNoZWNrIHRoZSBETUEgbWFzayAtIGl0IG11c3QgYmUgbm9uLXplcm8sIGFuZAorCQkgKiBtdXN0IGJlIGFibGUgdG8gYmUgc2F0aXNmaWVkIGJ5IGEgRE1BIGFsbG9jYXRpb24uCisJCSAqLworCQlpZiAobWFzayA9PSAwKSB7CisJCQlkZXZfd2FybihkZXYsICJjb2hlcmVudCBETUEgbWFzayBpcyB1bnNldFxuIik7CisJCQlnb3RvIG5vX3BhZ2U7CisJCX0KKworCQlpZiAoKH5tYXNrKSAmIElTQV9ETUFfVEhSRVNIT0xEKSB7CisJCQlkZXZfd2FybihkZXYsICJjb2hlcmVudCBETUEgbWFzayAlI2xseCBpcyBzbWFsbGVyICIKKwkJCQkgInRoYW4gc3lzdGVtIEdGUF9ETUEgbWFzayAlI2xseFxuIiwKKwkJCQkgbWFzaywgKHVuc2lnbmVkIGxvbmcgbG9uZylJU0FfRE1BX1RIUkVTSE9MRCk7CisJCQlnb3RvIG5vX3BhZ2U7CisJCX0KKwl9CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayB0aGUgYWxsb2NhdGlvbiBzaXplLgorCSAqLworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCWxpbWl0ID0gKG1hc2sgKyAxKSAmIH5tYXNrOworCWlmICgobGltaXQgJiYgc2l6ZSA+PSBsaW1pdCkgfHwKKwkgICAgc2l6ZSA+PSAoQ09OU0lTVEVOVF9FTkQgLSBDT05TSVNURU5UX0JBU0UpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvaGVyZW50IGFsbG9jYXRpb24gdG9vIGJpZyAiCisJCSAgICAgICAiKHJlcXVlc3RlZCAlI3ggbWFzayAlI2xseClcbiIsIHNpemUsIG1hc2spOworCQlnb3RvIG5vX3BhZ2U7CisJfQorCisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlpZiAobWFzayAhPSAweGZmZmZmZmZmKQorCQlnZnAgfD0gR0ZQX0RNQTsKKworCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnAsIG9yZGVyKTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gbm9fcGFnZTsKKworCS8qCisJICogSW52YWxpZGF0ZSBhbnkgZGF0YSB0aGF0IG1pZ2h0IGJlIGx1cmtpbmcgaW4gdGhlCisJICoga2VybmVsIGRpcmVjdC1tYXBwZWQgcmVnaW9uIGZvciBkZXZpY2UgRE1BLgorCSAqLworCXsKKwkJdW5zaWduZWQgbG9uZyBrYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhwYWdlKSwgMCwgc2l6ZSk7CisJCWRtYWNfZmx1c2hfcmFuZ2Uoa2FkZHIsIGthZGRyICsgc2l6ZSk7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgY29uc2lzdGVudCBtYXBwaW5nIHJlZ2lvbi4KKwkgKi8KKwljID0gdm1fcmVnaW9uX2FsbG9jKCZjb25zaXN0ZW50X2hlYWQsIHNpemUsCisJCQkgICAgZ2ZwICYgfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKSk7CisJaWYgKGMpIHsKKwkJcHRlX3QgKnB0ZSA9IGNvbnNpc3RlbnRfcHRlICsgQ09OU0lTVEVOVF9PRkZTRVQoYy0+dm1fc3RhcnQpOworCQlzdHJ1Y3QgcGFnZSAqZW5kID0gcGFnZSArICgxIDw8IG9yZGVyKTsKKworCQljLT52bV9wYWdlcyA9IHBhZ2U7CisKKwkJLyoKKwkJICogU2V0IHRoZSAiZG1hIGhhbmRsZSIKKwkJICovCisJCSpoYW5kbGUgPSBwYWdlX3RvX2RtYShkZXYsIHBhZ2UpOworCisJCWRvIHsKKwkJCUJVR19PTighcHRlX25vbmUoKnB0ZSkpOworCisJCQlzZXRfcGFnZV9jb3VudChwYWdlLCAxKTsKKwkJCS8qCisJCQkgKiB4ODYgZG9lcyBub3QgbWFyayB0aGUgcGFnZXMgcmVzZXJ2ZWQuLi4KKwkJCSAqLworCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCQkJc2V0X3B0ZShwdGUsIG1rX3B0ZShwYWdlLCBwcm90KSk7CisJCQlwYWdlKys7CisJCQlwdGUrKzsKKwkJfSB3aGlsZSAoc2l6ZSAtPSBQQUdFX1NJWkUpOworCisJCS8qCisJCSAqIEZyZWUgdGhlIG90aGVyd2lzZSB1bnVzZWQgcGFnZXMuCisJCSAqLworCQl3aGlsZSAocGFnZSA8IGVuZCkgeworCQkJc2V0X3BhZ2VfY291bnQocGFnZSwgMSk7CisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJCXBhZ2UrKzsKKwkJfQorCisJCXJldHVybiAodm9pZCAqKWMtPnZtX3N0YXJ0OworCX0KKworCWlmIChwYWdlKQorCQlfX2ZyZWVfcGFnZXMocGFnZSwgb3JkZXIpOworIG5vX3BhZ2U6CisJKmhhbmRsZSA9IH4wOworCXJldHVybiBOVUxMOworfQorCisvKgorICogQWxsb2NhdGUgRE1BLWNvaGVyZW50IG1lbW9yeSBzcGFjZSBhbmQgcmV0dXJuIGJvdGggdGhlIGtlcm5lbCByZW1hcHBlZAorICogdmlydHVhbCBhbmQgYnVzIGFkZHJlc3MgZm9yIHRoYXQgc3BhY2UuCisgKi8KK3ZvaWQgKgorZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmhhbmRsZSwgaW50IGdmcCkKK3sKKwlyZXR1cm4gX19kbWFfYWxsb2MoZGV2LCBzaXplLCBoYW5kbGUsIGdmcCwKKwkJCSAgIHBncHJvdF9ub25jYWNoZWQocGdwcm90X2tlcm5lbCkpOworfQorRVhQT1JUX1NZTUJPTChkbWFfYWxsb2NfY29oZXJlbnQpOworCisvKgorICogQWxsb2NhdGUgYSB3cml0ZWNvbWJpbmluZyByZWdpb24sIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzCisgKiBkbWFfYWxsb2NfY29oZXJlbnQgYWJvdmUuCisgKi8KK3ZvaWQgKgorZG1hX2FsbG9jX3dyaXRlY29tYmluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpoYW5kbGUsIGludCBnZnApCit7CisJcmV0dXJuIF9fZG1hX2FsbG9jKGRldiwgc2l6ZSwgaGFuZGxlLCBnZnAsCisJCQkgICBwZ3Byb3Rfd3JpdGVjb21iaW5lKHBncHJvdF9rZXJuZWwpKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2FsbG9jX3dyaXRlY29tYmluZSk7CisKK3N0YXRpYyBpbnQgZG1hX21tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB1c2VyX3NpemUsIGtlcm5fc2l6ZTsKKwlzdHJ1Y3Qgdm1fcmVnaW9uICpjOworCWludCByZXQgPSAtRU5YSU87CisKKwl1c2VyX3NpemUgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOworCWMgPSB2bV9yZWdpb25fZmluZCgmY29uc2lzdGVudF9oZWFkLCAodW5zaWduZWQgbG9uZyljcHVfYWRkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisKKwlpZiAoYykgeworCQl1bnNpZ25lZCBsb25nIG9mZiA9IHZtYS0+dm1fcGdvZmY7CisKKwkJa2Vybl9zaXplID0gKGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCisJCWlmIChvZmYgPCBrZXJuX3NpemUgJiYKKwkJICAgIHVzZXJfc2l6ZSA8PSAoa2Vybl9zaXplIC0gb2ZmKSkgeworCQkJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwkJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJCSAgICAgIHBhZ2VfdG9fcGZuKGMtPnZtX3BhZ2VzKSArIG9mZiwKKwkJCQkJICAgICAgdXNlcl9zaXplIDw8IFBBR0VfU0hJRlQsCisJCQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBkbWFfbW1hcF9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkgICAgICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlyZXR1cm4gZG1hX21tYXAoZGV2LCB2bWEsIGNwdV9hZGRyLCBkbWFfYWRkciwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9tbWFwX2NvaGVyZW50KTsKKworaW50IGRtYV9tbWFwX3dyaXRlY29tYmluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlyZXR1cm4gZG1hX21tYXAoZGV2LCB2bWEsIGNwdV9hZGRyLCBkbWFfYWRkciwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9tbWFwX3dyaXRlY29tYmluZSk7CisKKy8qCisgKiBmcmVlIGEgcGFnZSBhcyBkZWZpbmVkIGJ5IHRoZSBhYm92ZSBtYXBwaW5nLgorICovCit2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3Qgdm1fcmVnaW9uICpjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGFkZHI7CisJcHRlX3QgKnB0ZXA7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKKworCWMgPSB2bV9yZWdpb25fZmluZCgmY29uc2lzdGVudF9oZWFkLCAodW5zaWduZWQgbG9uZyljcHVfYWRkcik7CisJaWYgKCFjKQorCQlnb3RvIG5vX2FyZWE7CisKKwlpZiAoKGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0KSAhPSBzaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZyZWVpbmcgd3JvbmcgY29oZXJlbnQgc2l6ZSAoJWxkICE9ICVkKVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjLT52bV9lbmQgLSBjLT52bV9zdGFydCwgc2l6ZSk7CisJCWR1bXBfc3RhY2soKTsKKwkJc2l6ZSA9IGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0OworCX0KKworCXB0ZXAgPSBjb25zaXN0ZW50X3B0ZSArIENPTlNJU1RFTlRfT0ZGU0VUKGMtPnZtX3N0YXJ0KTsKKwlhZGRyID0gYy0+dm1fc3RhcnQ7CisJZG8geworCQlwdGVfdCBwdGUgPSBwdGVwX2dldF9hbmRfY2xlYXIoJmluaXRfbW0sIGFkZHIsIHB0ZXApOworCQl1bnNpZ25lZCBsb25nIHBmbjsKKworCQlwdGVwKys7CisJCWFkZHIgKz0gUEFHRV9TSVpFOworCisJCWlmICghcHRlX25vbmUocHRlKSAmJiBwdGVfcHJlc2VudChwdGUpKSB7CisJCQlwZm4gPSBwdGVfcGZuKHB0ZSk7CisKKwkJCWlmIChwZm5fdmFsaWQocGZuKSkgeworCQkJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKworCQkJCS8qCisJCQkJICogeDg2IGRvZXMgbm90IG1hcmsgdGhlIHBhZ2VzIHJlc2VydmVkLi4uCisJCQkJICovCisJCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwkJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBiYWQgcGFnZSBpbiBrZXJuZWwgcGFnZSB0YWJsZVxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwl9IHdoaWxlIChzaXplIC09IFBBR0VfU0laRSk7CisKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKGMtPnZtX3N0YXJ0LCBjLT52bV9lbmQpOworCisJbGlzdF9kZWwoJmMtPnZtX2xpc3QpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisKKwlrZnJlZShjKTsKKwlyZXR1cm47CisKKyBub19hcmVhOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyeWluZyB0byBmcmVlIGludmFsaWQgY29oZXJlbnQgYXJlYTogJXBcbiIsCisJICAgICAgIF9fZnVuY19fLCBjcHVfYWRkcik7CisJZHVtcF9zdGFjaygpOworfQorRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0aW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjb25zaXN0ZW50X2luaXQodm9pZCkKK3sKKwlwZ2RfdCAqcGdkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOworCisJZG8geworCQlwZ2QgPSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCBDT05TSVNURU5UX0JBU0UpOworCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHBnZCwgQ09OU0lTVEVOVF9CQVNFKTsKKwkJaWYgKCFwbWQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIHBtZCB0YWJsZXNcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlXQVJOX09OKCFwbWRfbm9uZSgqcG1kKSk7CisKKwkJcHRlID0gcHRlX2FsbG9jX2tlcm5lbCgmaW5pdF9tbSwgcG1kLCBDT05TSVNURU5UX0JBU0UpOworCQlpZiAoIXB0ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gcHRlIHRhYmxlc1xuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJY29uc2lzdGVudF9wdGUgPSBwdGU7CisJfSB3aGlsZSAoMCk7CisKKwlzcGluX3VubG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworY29yZV9pbml0Y2FsbChjb25zaXN0ZW50X2luaXQpOworCisvKgorICogTWFrZSBhbiBhcmVhIGNvbnNpc3RlbnQgZm9yIGRldmljZXMuCisgKi8KK3ZvaWQgY29uc2lzdGVudF9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpdmFkZHI7CisJdW5zaWduZWQgbG9uZyBlbmQgICA9IHN0YXJ0ICsgc2l6ZTsKKworCXN3aXRjaCAoZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CQkvKiBpbnZhbGlkYXRlIG9ubHkgKi8KKwkJZG1hY19pbnZfcmFuZ2Uoc3RhcnQsIGVuZCk7CisJCWJyZWFrOworCWNhc2UgRE1BX1RPX0RFVklDRToJCS8qIHdyaXRlYmFjayBvbmx5ICovCisJCWRtYWNfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCk7CisJCWJyZWFrOworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CQkvKiB3cml0ZWJhY2sgYW5kIGludmFsaWRhdGUgKi8KKwkJZG1hY19mbHVzaF9yYW5nZShzdGFydCwgZW5kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChjb25zaXN0ZW50X3N5bmMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjMuUyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXYzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0MGYxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXYzLlMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvY29weXBhZ2UuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBU00gb3B0aW1pc2VkIHN0cmluZyBmdW5jdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKworCQkudGV4dAorCQkuYWxpZ24JNQorLyoKKyAqIEFSTXYzIG9wdGltaXNlZCBjb3B5X3VzZXJfcGFnZQorICoKKyAqIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGhhbmRsZSBjYWNoZSBzdHVmZi4uLgorICovCitFTlRSWSh2M19jb3B5X3VzZXJfcGFnZSkKKwlzdG1mZAlzcCEsIHtyNCwgbHJ9CQkJQAkyCisJbW92CXIyLCAjUEFHRV9TWi82NAkJCUAJMQorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0KzEKKzE6CXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0CisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMQorCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0CisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMQorCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0CisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKKwlzdWJzCXIyLCByMiwgIzEJCQlACTEKKwlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAJNAorCWxkbW5laWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKKwlibmUJMWIJCQkJQAkxCisJTE9BRFJFR1MoZmQsIHNwISwge3I0LCBwY30pCQlACTMKKworCS5hbGlnbgk1CisvKgorICogQVJNdjMgb3B0aW1pc2VkIGNsZWFyX3VzZXJfcGFnZQorICoKKyAqIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGhhbmRsZSBjYWNoZSBzdHVmZi4uLgorICovCitFTlRSWSh2M19jbGVhcl91c2VyX3BhZ2UpCisJc3RyCWxyLCBbc3AsICMtNF0hCisJbW92CXIxLCAjUEFHRV9TWi82NAkJCUAgMQorCW1vdglyMiwgIzAJCQkJQCAxCisJbW92CXIzLCAjMAkJCQlAIDEKKwltb3YJaXAsICMwCQkJCUAgMQorCW1vdglsciwgIzAJCQkJQCAxCisxOglzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0CisJc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKwlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCXN1YnMJcjEsIHIxLCAjMQkJCUAgMQorCWJuZQkxYgkJCQlAIDEKKwlsZHIJcGMsIFtzcF0sICM0CisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2M191c2VyX2ZucywgI29iamVjdAorRU5UUlkodjNfdXNlcl9mbnMpCisJLmxvbmcJdjNfY2xlYXJfdXNlcl9wYWdlCisJLmxvbmcJdjNfY29weV91c2VyX3BhZ2UKKwkuc2l6ZQl2M191c2VyX2ZucywgLiAtIHYzX3VzZXJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1YWYzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UtYXJtdjRtYy5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFTTSBvcHRpbWlzZWQgc3RyaW5nIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisKKwkudGV4dAorCS5hbGlnbgk1CisvKgorICogQVJNdjQgbWluaS1kY2FjaGUgb3B0aW1pc2VkIGNvcHlfdXNlcl9wYWdlCisgKgorICogV2UgZmx1c2ggdGhlIGRlc3RpbmF0aW9uIGNhY2hlIGxpbmVzIGp1c3QgYmVmb3JlIHdlIHdyaXRlIHRoZSBkYXRhIGludG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGFkZHJlc3MuICBTaW5jZSB0aGUgRGNhY2hlIGlzIHJlYWQtYWxsb2NhdGUsIHRoaXMgcmVtb3ZlcyB0aGUKKyAqIERjYWNoZSBhbGlhc2luZyBpc3N1ZS4gIFRoZSB3cml0ZXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHdyaXRlIGJ1ZmZlciwKKyAqIGFuZCBtZXJnZWQgYXMgYXBwcm9wcmlhdGUuCisgKgorICogTm90ZTogV2UgcmVseSBvbiBhbGwgQVJNdjQgcHJvY2Vzc29ycyBpbXBsZW1lbnRpbmcgdGhlICJpbnZhbGlkYXRlIEQgbGluZSIKKyAqIGluc3RydWN0aW9uLiAgSWYgeW91ciBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcGx5IHRoaXMsIHlvdSBoYXZlIHRvIHdyaXRlIHlvdXIKKyAqIG93biBjb3B5X3VzZXJfcGFnZSB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgorICovCitFTlRSWSh2NF9tY19jb3B5X3VzZXJfcGFnZSkKKwlzdG1mZAlzcCEsIHtyNCwgbHJ9CQkJQCAyCisJbW92CXI0LCByMAorCW1vdglyMCwgcjEKKwlibAltYXBfcGFnZV9taW5pY2FjaGUKKwltb3YJcjEsICNQQUdFX1NaLzY0CQkJQCAxCisJbGRtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKzE6CW1jcglwMTUsIDAsIHI0LCBjNywgYzYsIDEJCUAgMSAgIGludmFsaWRhdGUgRCBsaW5lCisJc3RtaWEJcjQhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKwlsZG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNCsxCisJc3RtaWEJcjQhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKwlsZG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCW1jcglwMTUsIDAsIHI0LCBjNywgYzYsIDEJCUAgMSAgIGludmFsaWRhdGUgRCBsaW5lCisJc3RtaWEJcjQhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKwlsZG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCXN1YnMJcjEsIHIxLCAjMQkJCUAgMQorCXN0bWlhCXI0ISwge3IyLCByMywgaXAsIGxyfQkJQCA0CisJbGRtbmVpYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCWJuZQkxYgkJCQlAIDEKKwlsZG1mZAlzcCEsIHtyNCwgcGN9CQkJQCAzCisKKwkuYWxpZ24JNQorLyoKKyAqIEFSTXY0IG9wdGltaXNlZCBjbGVhcl91c2VyX3BhZ2UKKyAqCisgKiBTYW1lIHN0b3J5IGFzIGFib3ZlLgorICovCitFTlRSWSh2NF9tY19jbGVhcl91c2VyX3BhZ2UpCisJc3RyCWxyLCBbc3AsICMtNF0hCisJbW92CXIxLCAjUEFHRV9TWi82NAkJCUAgMQorCW1vdglyMiwgIzAJCQkJQCAxCisJbW92CXIzLCAjMAkJCQlAIDEKKwltb3YJaXAsICMwCQkJCUAgMQorCW1vdglsciwgIzAJCQkJQCAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0CisJc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0CisJc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKwlzdWJzCXIxLCByMSwgIzEJCQlAIDEKKwlibmUJMWIJCQkJQCAxCisJbGRyCXBjLCBbc3BdLCAjNAorCisJX19JTklUREFUQQorCisJLnR5cGUJdjRfbWNfdXNlcl9mbnMsICNvYmplY3QKK0VOVFJZKHY0X21jX3VzZXJfZm5zKQorCS5sb25nCXY0X21jX2NsZWFyX3VzZXJfcGFnZQorCS5sb25nCXY0X21jX2NvcHlfdXNlcl9wYWdlCisJLnNpemUJdjRfbWNfdXNlcl9mbnMsIC4gLSB2NF9tY191c2VyX2ZucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5TIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGMzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHdiLlMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9saWIvY29weXBhZ2UuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBU00gb3B0aW1pc2VkIHN0cmluZyBmdW5jdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorCisJLnRleHQKKwkuYWxpZ24JNQorLyoKKyAqIEFSTXY0IG9wdGltaXNlZCBjb3B5X3VzZXJfcGFnZQorICoKKyAqIFdlIGZsdXNoIHRoZSBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lcyBqdXN0IGJlZm9yZSB3ZSB3cml0ZSB0aGUgZGF0YSBpbnRvIHRoZQorICogY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgU2luY2UgdGhlIERjYWNoZSBpcyByZWFkLWFsbG9jYXRlLCB0aGlzIHJlbW92ZXMgdGhlCisgKiBEY2FjaGUgYWxpYXNpbmcgaXNzdWUuICBUaGUgd3JpdGVzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB3cml0ZSBidWZmZXIsCisgKiBhbmQgbWVyZ2VkIGFzIGFwcHJvcHJpYXRlLgorICoKKyAqIE5vdGU6IFdlIHJlbHkgb24gYWxsIEFSTXY0IHByb2Nlc3NvcnMgaW1wbGVtZW50aW5nIHRoZSAiaW52YWxpZGF0ZSBEIGxpbmUiCisgKiBpbnN0cnVjdGlvbi4gIElmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBseSB0aGlzLCB5b3UgaGF2ZSB0byB3cml0ZSB5b3VyCisgKiBvd24gY29weV91c2VyX3BhZ2UgdGhhdCBkb2VzIHRoZSByaWdodCB0aGluZy4KKyAqLworRU5UUlkodjR3Yl9jb3B5X3VzZXJfcGFnZSkKKwlzdG1mZAlzcCEsIHtyNCwgbHJ9CQkJQCAyCisJbW92CXIyLCAjUEFHRV9TWi82NAkJCUAgMQorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0CisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQorCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0CisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQrMQorCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0CisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQorCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0CisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKKwlzdWJzCXIyLCByMiwgIzEJCQlAIDEKKwlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAorCWxkbW5laWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKKwlibmUJMWIJCQkJQCAxCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDQJCUAgMSAgIGRyYWluIFdCCisJbGRtZmQJIHNwISwge3I0LCBwY30JCQlAIDMKKworCS5hbGlnbgk1CisvKgorICogQVJNdjQgb3B0aW1pc2VkIGNsZWFyX3VzZXJfcGFnZQorICoKKyAqIFNhbWUgc3RvcnkgYXMgYWJvdmUuCisgKi8KK0VOVFJZKHY0d2JfY2xlYXJfdXNlcl9wYWdlKQorCXN0cglsciwgW3NwLCAjLTRdIQorCW1vdglyMSwgI1BBR0VfU1ovNjQJCQlAIDEKKwltb3YJcjIsICMwCQkJCUAgMQorCW1vdglyMywgIzAJCQkJQCAxCisJbW92CWlwLCAjMAkJCQlAIDEKKwltb3YJbHIsICMwCQkJCUAgMQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmUKKwlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmUKKwlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0CisJc3VicwlyMSwgcjEsICMxCQkJQCAxCisJYm5lCTFiCQkJCUAgMQorCW1jcglwMTUsIDAsIHIxLCBjNywgYzEwLCA0CQlAIDEgICBkcmFpbiBXQgorCWxkcglwYywgW3NwXSwgIzQKKworCV9fSU5JVERBVEEKKworCS50eXBlCXY0d2JfdXNlcl9mbnMsICNvYmplY3QKK0VOVFJZKHY0d2JfdXNlcl9mbnMpCisJLmxvbmcJdjR3Yl9jbGVhcl91c2VyX3BhZ2UKKwkubG9uZwl2NHdiX2NvcHlfdXNlcl9wYWdlCisJLnNpemUJdjR3Yl91c2VyX2ZucywgLiAtIHY0d2JfdXNlcl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d3QuUyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d3QuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzY3OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3dC5TCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2NvcHlwYWdlLXY0LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQVNNIG9wdGltaXNlZCBzdHJpbmcgZnVuY3Rpb25zCisgKgorICogIFRoaXMgaXMgZm9yIENQVXMgd2l0aCBhIHdyaXRldGhyb3VnaCBjYWNoZSBhbmQgJ2ZsdXNoIElEIGNhY2hlJyBpcworICogIHRoZSBvbmx5IHN1cHBvcnRlZCBjYWNoZSBvcGVyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKworCS50ZXh0CisJLmFsaWduCTUKKy8qCisgKiBBUk12NCBvcHRpbWlzZWQgY29weV91c2VyX3BhZ2UKKyAqCisgKiBTaW5jZSB3ZSBoYXZlIHdyaXRldGhyb3VnaCBjYWNoZXMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKKyAqIGRpcnR5IGRhdGEgaW4gdGhlIGNhY2hlLiAgSG93ZXZlciwgd2UgZG8gaGF2ZSB0byBlbnN1cmUgdGhhdAorICogc3Vic2VxdWVudCByZWFkcyBhcmUgdXAgdG8gZGF0ZS4KKyAqLworRU5UUlkodjR3dF9jb3B5X3VzZXJfcGFnZSkKKwlzdG1mZAlzcCEsIHtyNCwgbHJ9CQkJQCAyCisJbW92CXIyLCAjUEFHRV9TWi82NAkJCUAgMQorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0CisxOglzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0KzEKKwlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0CisJc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKKwlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAorCXN1YnMJcjIsIHIyLCAjMQkJCUAgMQorCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0CisJbGRtbmVpYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAorCWJuZQkxYgkJCQlAIDEKKwltY3IJcDE1LCAwLCByMiwgYzcsIGM3LCAwCQlAIGZsdXNoIElEIGNhY2hlCisJbGRtZmQJc3AhLCB7cjQsIHBjfQkJCUAgMworCisJLmFsaWduCTUKKy8qCisgKiBBUk12NCBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCisgKgorICogU2FtZSBzdG9yeSBhcyBhYm92ZS4KKyAqLworRU5UUlkodjR3dF9jbGVhcl91c2VyX3BhZ2UpCisJc3RyCWxyLCBbc3AsICMtNF0hCisJbW92CXIxLCAjUEFHRV9TWi82NAkJCUAgMQorCW1vdglyMiwgIzAJCQkJQCAxCisJbW92CXIzLCAjMAkJCQlAIDEKKwltb3YJaXAsICMwCQkJCUAgMQorCW1vdglsciwgIzAJCQkJQCAxCisxOglzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0CisJc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKKwlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAorCXN1YnMJcjEsIHIxLCAjMQkJCUAgMQorCWJuZQkxYgkJCQlAIDEKKwltY3IJcDE1LCAwLCByMiwgYzcsIGM3LCAwCQlAIGZsdXNoIElEIGNhY2hlCisJbGRyCXBjLCBbc3BdLCAjNAorCisJX19JTklUREFUQQorCisJLnR5cGUJdjR3dF91c2VyX2ZucywgI29iamVjdAorRU5UUlkodjR3dF91c2VyX2ZucykKKwkubG9uZwl2NHd0X2NsZWFyX3VzZXJfcGFnZQorCS5sb25nCXY0d3RfY29weV91c2VyX3BhZ2UKKwkuc2l6ZQl2NHd0X3VzZXJfZm5zLCAuIC0gdjR3dF91c2VyX2ZucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0YWM4MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2lmIFNITUxCQSA+IDE2Mzg0CisjZXJyb3IgRklYIE1FCisjZW5kaWYKKworI2RlZmluZSBmcm9tX2FkZHJlc3MJKDB4ZmZmZjgwMDApCisjZGVmaW5lIGZyb21fcGdwcm90CVBBR0VfS0VSTkVMCisjZGVmaW5lIHRvX2FkZHJlc3MJKDB4ZmZmZmMwMDApCisjZGVmaW5lIHRvX3BncHJvdAlQQUdFX0tFUk5FTAorCitzdGF0aWMgcHRlX3QgKmZyb21fcHRlOworc3RhdGljIHB0ZV90ICp0b19wdGU7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHY2X2xvY2spOworCisjZGVmaW5lIERDQUNIRV9DT0xPVVIodmFkZHIpICgodmFkZHIgJiAoU0hNTEJBIC0gMSkpID4+IFBBR0VfU0hJRlQpCisKKy8qCisgKiBDb3B5IHRoZSB1c2VyIHBhZ2UuICBObyBhbGlhc2luZyB0byBkZWFsIHdpdGggc28gd2UgY2FuIGp1c3QKKyAqIGF0dGFjayB0aGUga2VybmVsJ3MgZXhpc3RpbmcgbWFwcGluZyBvZiB0aGVzZSBwYWdlcy4KKyAqLwordm9pZCB2Nl9jb3B5X3VzZXJfcGFnZV9ub25hbGlhc2luZyh2b2lkICprdG8sIGNvbnN0IHZvaWQgKmtmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCWNvcHlfcGFnZShrdG8sIGtmcm9tKTsKK30KKworLyoKKyAqIENsZWFyIHRoZSB1c2VyIHBhZ2UuICBObyBhbGlhc2luZyB0byBkZWFsIHdpdGggc28gd2UgY2FuIGp1c3QKKyAqIGF0dGFjayB0aGUga2VybmVsJ3MgZXhpc3RpbmcgbWFwcGluZyBvZiB0aGlzIHBhZ2UuCisgKi8KK3ZvaWQgdjZfY2xlYXJfdXNlcl9wYWdlX25vbmFsaWFzaW5nKHZvaWQgKmthZGRyLCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCWNsZWFyX3BhZ2Uoa2FkZHIpOworfQorCisvKgorICogQ29weSB0aGUgcGFnZSwgdGFraW5nIGFjY291bnQgb2YgdGhlIGNhY2hlIGNvbG91ci4KKyAqLwordm9pZCB2Nl9jb3B5X3VzZXJfcGFnZV9hbGlhc2luZyh2b2lkICprdG8sIGNvbnN0IHZvaWQgKmtmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBEQ0FDSEVfQ09MT1VSKHZhZGRyKTsKKwl1bnNpZ25lZCBsb25nIGZyb20sIHRvOworCisJLyoKKwkgKiBEaXNjYXJkIGRhdGEgaW4gdGhlIGtlcm5lbCBtYXBwaW5nIGZvciB0aGUgbmV3IHBhZ2UuCisJICogRklYTUU6IG5lZWRzIHRoaXMgTUNSUiB0byBiZSBzdXBwb3J0ZWQuCisJICovCisJX19hc21fXygibWNycglwMTUsIDAsICUxLCAlMCwgYzYJQCAweGVjNDAxZjA2IgorCSAgIDoKKwkgICA6ICJyIiAoa3RvKSwKKwkgICAgICJyIiAoKHVuc2lnbmVkIGxvbmcpa3RvICsgUEFHRV9TSVpFIC0gTDFfQ0FDSEVfQllURVMpCisJICAgOiAiY2MiKTsKKworCS8qCisJICogTm93IGNvcHkgdGhlIHBhZ2UgdXNpbmcgdGhlIHNhbWUgY2FjaGUgY29sb3VyIGFzIHRoZQorCSAqIHBhZ2VzIHVsdGltYXRlIGRlc3RpbmF0aW9uLgorCSAqLworCXNwaW5fbG9jaygmdjZfbG9jayk7CisKKwlzZXRfcHRlKGZyb21fcHRlICsgb2Zmc2V0LCBwZm5fcHRlKF9fcGEoa2Zyb20pID4+IFBBR0VfU0hJRlQsIGZyb21fcGdwcm90KSk7CisJc2V0X3B0ZSh0b19wdGUgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrdG8pID4+IFBBR0VfU0hJRlQsIHRvX3BncHJvdCkpOworCisJZnJvbSA9IGZyb21fYWRkcmVzcyArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7CisJdG8gICA9IHRvX2FkZHJlc3MgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOworCisJZmx1c2hfdGxiX2tlcm5lbF9wYWdlKGZyb20pOworCWZsdXNoX3RsYl9rZXJuZWxfcGFnZSh0byk7CisKKwljb3B5X3BhZ2UoKHZvaWQgKil0bywgKHZvaWQgKilmcm9tKTsKKworCXNwaW5fdW5sb2NrKCZ2Nl9sb2NrKTsKK30KKworLyoKKyAqIENsZWFyIHRoZSB1c2VyIHBhZ2UuICBXZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgYWxpYXNpbmcgaXNzdWVzLAorICogc28gcmVtYXAgdGhlIGtlcm5lbCBwYWdlIGludG8gdGhlIHNhbWUgY2FjaGUgY29sb3VyIGFzIHRoZSB1c2VyCisgKiBwYWdlLgorICovCit2b2lkIHY2X2NsZWFyX3VzZXJfcGFnZV9hbGlhc2luZyh2b2lkICprYWRkciwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gRENBQ0hFX0NPTE9VUih2YWRkcik7CisJdW5zaWduZWQgbG9uZyB0byA9IHRvX2FkZHJlc3MgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOworCisJLyoKKwkgKiBEaXNjYXJkIGRhdGEgaW4gdGhlIGtlcm5lbCBtYXBwaW5nIGZvciB0aGUgbmV3IHBhZ2UKKwkgKiBGSVhNRTogbmVlZHMgdGhpcyBNQ1JSIHRvIGJlIHN1cHBvcnRlZC4KKwkgKi8KKwlfX2FzbV9fKCJtY3JyCXAxNSwgMCwgJTEsICUwLCBjNglAIDB4ZWM0MDFmMDYiCisJICAgOgorCSAgIDogInIiIChrYWRkciksCisJICAgICAiciIgKCh1bnNpZ25lZCBsb25nKWthZGRyICsgUEFHRV9TSVpFIC0gTDFfQ0FDSEVfQllURVMpCisJICAgOiAiY2MiKTsKKworCS8qCisJICogTm93IGNsZWFyIHRoZSBwYWdlIHVzaW5nIHRoZSBzYW1lIGNhY2hlIGNvbG91ciBhcworCSAqIHRoZSBwYWdlcyB1bHRpbWF0ZSBkZXN0aW5hdGlvbi4KKwkgKi8KKwlzcGluX2xvY2soJnY2X2xvY2spOworCisJc2V0X3B0ZSh0b19wdGUgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCwgdG9fcGdwcm90KSk7CisJZmx1c2hfdGxiX2tlcm5lbF9wYWdlKHRvKTsKKwljbGVhcl9wYWdlKCh2b2lkICopdG8pOworCisJc3Bpbl91bmxvY2soJnY2X2xvY2spOworfQorCitzdHJ1Y3QgY3B1X3VzZXJfZm5zIHY2X3VzZXJfZm5zIF9faW5pdGRhdGEgPSB7CisJLmNwdV9jbGVhcl91c2VyX3BhZ2UJPSB2Nl9jbGVhcl91c2VyX3BhZ2Vfbm9uYWxpYXNpbmcsCisJLmNwdV9jb3B5X3VzZXJfcGFnZQk9IHY2X2NvcHlfdXNlcl9wYWdlX25vbmFsaWFzaW5nLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdjZfdXNlcnBhZ2VfaW5pdCh2b2lkKQoreworCWlmIChjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkpIHsKKwkJcGdkX3QgKnBnZDsKKwkJcG1kX3QgKnBtZDsKKworCQlwZ2QgPSBwZ2Rfb2Zmc2V0X2soZnJvbV9hZGRyZXNzKTsKKwkJcG1kID0gcG1kX2FsbG9jKCZpbml0X21tLCBwZ2QsIGZyb21fYWRkcmVzcyk7CisJCWlmICghcG1kKQorCQkJQlVHKCk7CisJCWZyb21fcHRlID0gcHRlX2FsbG9jX2tlcm5lbCgmaW5pdF9tbSwgcG1kLCBmcm9tX2FkZHJlc3MpOworCQlpZiAoIWZyb21fcHRlKQorCQkJQlVHKCk7CisKKwkJdG9fcHRlID0gcHRlX2FsbG9jX2tlcm5lbCgmaW5pdF9tbSwgcG1kLCB0b19hZGRyZXNzKTsKKwkJaWYgKCF0b19wdGUpCisJCQlCVUcoKTsKKworCQljcHVfdXNlci5jcHVfY2xlYXJfdXNlcl9wYWdlID0gdjZfY2xlYXJfdXNlcl9wYWdlX2FsaWFzaW5nOworCQljcHVfdXNlci5jcHVfY29weV91c2VyX3BhZ2UgPSB2Nl9jb3B5X3VzZXJfcGFnZV9hbGlhc2luZzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbCh2Nl91c2VycGFnZV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2NhbGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI3NzMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLlMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbGliL2NvcHlwYWdlLXhzY2FsZS5TCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisKKy8qCisgKiBHZW5lcmFsIG5vdGU6CisgKiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgd3JpdGUtYWxsb2NhdGUgY2FjaGUgYmVoYXZpb3VyIGZvciB0aGVzZSBmdW5jdGlvbnMKKyAqICBzaW5jZSB0aGF0IHdpbGwganVzdCBlYXQgdGhyb3VnaCA4SyBvZiB0aGUgY2FjaGUuCisgKi8KKworCS50ZXh0CisJLmFsaWduCTUKKy8qCisgKiBYU2NhbGUgb3B0aW1pc2VkIGNvcHlfdXNlcl9wYWdlCisgKiAgcjAgPSBkZXN0aW5hdGlvbgorICogIHIxID0gc291cmNlCisgKiAgcjIgPSB2aXJ0dWFsIHVzZXIgYWRkcmVzcyBvZiB1bHRpbWF0ZSBkZXN0aW5hdGlvbiBwYWdlCisgKgorICogVGhlIHNvdXJjZSBwYWdlIG1heSBoYXZlIHNvbWUgY2xlYW4gZW50cmllcyBpbiB0aGUgY2FjaGUgYWxyZWFkeSwgYnV0IHdlCisgKiBjYW4gc2FmZWx5IGlnbm9yZSB0aGVtIC0gYnJlYWtfY293KCkgd2lsbCBmbHVzaCB0aGVtIG91dCBvZiB0aGUgY2FjaGUKKyAqIGlmIHdlIGV2ZW50dWFsbHkgZW5kIHVwIHVzaW5nIG91ciBjb3BpZWQgcGFnZS4KKyAqCisgKiBXaGF0IHdlIGNvdWxkIGRvIGlzIHVzZSB0aGUgbWluaS1jYWNoZSB0byBidWZmZXIgcmVhZHMgZnJvbSB0aGUgc291cmNlCisgKiBwYWdlLiAgV2UgcmVseSBvbiB0aGUgbWluaS1jYWNoZSBiZWluZyBzbWFsbGVyIHRoYW4gb25lIHBhZ2UsIHNvIHdlJ2xsCisgKiBjeWNsZSB0aHJvdWdoIHRoZSBjb21wbGV0ZSBjYWNoZSBhbnl3YXkuCisgKi8KK0VOVFJZKHhzY2FsZV9tY19jb3B5X3VzZXJfcGFnZSkKKwlzdG1mZAlzcCEsIHtyNCwgcjUsIGxyfQorCW1vdglyNSwgcjAKKwltb3YJcjAsIHIxCisJYmwJbWFwX3BhZ2VfbWluaWNhY2hlCisJbW92CXIxLCByNQorCW1vdglsciwgI1BBR0VfU1ovNjQtMQorCisJLyoKKwkgKiBTdHJhbmdlbHkgZW5vdWdoLCBiZXN0IHBlcmZvcm1hbmNlIGlzIGFjaGlldmVkCisJICogd2hlbiBwcmVmZXRjaGluZyBkZXN0aW5hdGlvbiBhcyB3ZWxsLiAgKE5QKQorCSAqLworCXBsZAlbcjAsICMwXQorCXBsZAlbcjAsICMzMl0KKwlwbGQJW3IxLCAjMF0KKwlwbGQJW3IxLCAjMzJdCisKKzE6CXBsZAlbcjAsICM2NF0KKwlwbGQJW3IwLCAjOTZdCisJcGxkCVtyMSwgIzY0XQorCXBsZAlbcjEsICM5Nl0KKworMjoJbGRyZAlyMiwgW3IwXSwgIzgKKwlsZHJkCXI0LCBbcjBdLCAjOAorCW1vdglpcCwgcjEKKwlzdHJkCXIyLCBbcjFdLCAjOAorCWxkcmQJcjIsIFtyMF0sICM4CisJc3RyZAlyNCwgW3IxXSwgIzgKKwlsZHJkCXI0LCBbcjBdLCAjOAorCXN0cmQJcjIsIFtyMV0sICM4CisJc3RyZAlyNCwgW3IxXSwgIzgKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGxpbmUKKwlsZHJkCXIyLCBbcjBdLCAjOAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGxpbmUKKwlsZHJkCXI0LCBbcjBdLCAjOAorCW1vdglpcCwgcjEKKwlzdHJkCXIyLCBbcjFdLCAjOAorCWxkcmQJcjIsIFtyMF0sICM4CisJc3RyZAlyNCwgW3IxXSwgIzgKKwlsZHJkCXI0LCBbcjBdLCAjOAorCXN0cmQJcjIsIFtyMV0sICM4CisJc3RyZAlyNCwgW3IxXSwgIzgKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGxpbmUKKwlzdWJzCWxyLCBsciwgIzEKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBsaW5lCisJYmd0CTFiCisJYmVxCTJiCisKKwlsZG1mZAlzcCEsIHtyNCwgcjUsIHBjfQorCisJLmFsaWduCTUKKy8qCisgKiBYU2NhbGUgb3B0aW1pc2VkIGNsZWFyX3VzZXJfcGFnZQorICogIHIwID0gZGVzdGluYXRpb24KKyAqICByMSA9IHZpcnR1YWwgdXNlciBhZGRyZXNzIG9mIHVsdGltYXRlIGRlc3RpbmF0aW9uIHBhZ2UKKyAqLworRU5UUlkoeHNjYWxlX21jX2NsZWFyX3VzZXJfcGFnZSkKKwltb3YJcjEsICNQQUdFX1NaLzMyCisJbW92CXIyLCAjMAorCW1vdglyMywgIzAKKzE6CW1vdglpcCwgcjAKKwlzdHJkCXIyLCBbcjBdLCAjOAorCXN0cmQJcjIsIFtyMF0sICM4CisJc3RyZAlyMiwgW3IwXSwgIzgKKwlzdHJkCXIyLCBbcjBdLCAjOAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgbGluZQorCXN1YnMJcjEsIHIxLCAjMQorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGxpbmUKKwlibmUJMWIKKwltb3YJcGMsIGxyCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl4c2NhbGVfbWNfdXNlcl9mbnMsICNvYmplY3QKK0VOVFJZKHhzY2FsZV9tY191c2VyX2ZucykKKwkubG9uZwl4c2NhbGVfbWNfY2xlYXJfdXNlcl9wYWdlCisJLmxvbmcJeHNjYWxlX21jX2NvcHlfdXNlcl9wYWdlCisJLnNpemUJeHNjYWxlX21jX3VzZXJfZm5zLCAuIC0geHNjYWxlX21jX3VzZXJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9kaXNjb250aWcuYyBiL2FyY2gvYXJtL21tL2Rpc2NvbnRpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDk3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9kaXNjb250aWcuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbW0vZGlzY29udGlnLmMKKyAqCisgKiBEaXNjb250aWd1b3VzIG1lbW9yeSBzdXBwb3J0LgorICoKKyAqIEluaXRpYWwgY29kZTogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgTmljb2xhcyBQaXRyZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworI2lmIE1BWF9OVU1OT0RFUyAhPSA0ICYmIE1BWF9OVU1OT0RFUyAhPSAxNgorIyBlcnJvciBGaXggTWUgUGxlYXNlCisjZW5kaWYKKworLyoKKyAqIE91ciBub2RlX2RhdGEgc3RydWN0dXJlIGZvciBkaXNjb250aWd1b3VzIG1lbW9yeS4KKyAqLworCitzdGF0aWMgYm9vdG1lbV9kYXRhX3Qgbm9kZV9ib290bWVtX2RhdGFbTUFYX05VTU5PREVTXTsKKworcGdfZGF0YV90IGRpc2NvbnRpZ19ub2RlX2RhdGFbTUFYX05VTU5PREVTXSA9IHsKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbMF0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbMV0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbMl0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbM10gfSwKKyNpZiBNQVhfTlVNTk9ERVMgPT0gMTYKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbNF0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbNV0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbNl0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbN10gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbOF0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbOV0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbMTBdIH0sCisgIHsgLmJkYXRhID0gJm5vZGVfYm9vdG1lbV9kYXRhWzExXSB9LAorICB7IC5iZGF0YSA9ICZub2RlX2Jvb3RtZW1fZGF0YVsxMl0gfSwKKyAgeyAuYmRhdGEgPSAmbm9kZV9ib290bWVtX2RhdGFbMTNdIH0sCisgIHsgLmJkYXRhID0gJm5vZGVfYm9vdG1lbV9kYXRhWzE0XSB9LAorICB7IC5iZGF0YSA9ICZub2RlX2Jvb3RtZW1fZGF0YVsxNV0gfSwKKyNlbmRpZgorfTsKKworRVhQT1JUX1NZTUJPTChkaXNjb250aWdfbm9kZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2V4dGFibGUuYyBiL2FyY2gvYXJtL21tL2V4dGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkyYzNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vZXh0YWJsZS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vZXh0YWJsZS5jCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitpbnQgZml4dXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOworCisJZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKTsKKwlpZiAoZml4dXApCisJCXJlZ3MtPkFSTV9wYyA9IGZpeHVwLT5maXh1cDsKKworCXJldHVybiBmaXh1cCAhPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jIGIvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqICBNb2RpZmljYXRpb25zIGZvciBBUk0gcHJvY2Vzc29yIChjKSAxOTk1LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3B0ZV9tYXNrID0gTF9QVEVfQ0FDSEVBQkxFOworCisvKgorICogV2UgdGFrZSB0aGUgZWFzeSB3YXkgb3V0IG9mIHRoaXMgcHJvYmxlbSAtIHdlIG1ha2UgdGhlCisgKiBQVEUgdW5jYWNoZWFibGUuICBIb3dldmVyLCB3ZSBsZWF2ZSB0aGUgd3JpdGUgYnVmZmVyIG9uLgorICovCitzdGF0aWMgaW50IGFkanVzdF9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlwZ2RfdCAqcGdkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZSwgZW50cnk7CisJaW50IHJldCA9IDA7CisKKwlwZ2QgPSBwZ2Rfb2Zmc2V0KHZtYS0+dm1fbW0sIGFkZHJlc3MpOworCWlmIChwZ2Rfbm9uZSgqcGdkKSkKKwkJZ290byBub19wZ2Q7CisJaWYgKHBnZF9iYWQoKnBnZCkpCisJCWdvdG8gYmFkX3BnZDsKKworCXBtZCA9IHBtZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsKKwlpZiAocG1kX25vbmUoKnBtZCkpCisJCWdvdG8gbm9fcG1kOworCWlmIChwbWRfYmFkKCpwbWQpKQorCQlnb3RvIGJhZF9wbWQ7CisKKwlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpOworCWVudHJ5ID0gKnB0ZTsKKworCS8qCisJICogSWYgdGhpcyBwYWdlIGlzbid0IHByZXNlbnQsIG9yIGlzIGFscmVhZHkgc2V0dXAgdG8KKwkgKiBmYXVsdCAoaWUsIGlzIG9sZCksIHdlIGNhbiBzYWZlbHkgaWdub3JlIGFueSBpc3N1ZXMuCisJICovCisJaWYgKHB0ZV9wcmVzZW50KGVudHJ5KSAmJiBwdGVfdmFsKGVudHJ5KSAmIHNoYXJlZF9wdGVfbWFzaykgeworCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihlbnRyeSkpOworCQlwdGVfdmFsKGVudHJ5KSAmPSB+c2hhcmVkX3B0ZV9tYXNrOworCQlzZXRfcHRlKHB0ZSwgZW50cnkpOworCQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOworCQlyZXQgPSAxOworCX0KKwlwdGVfdW5tYXAocHRlKTsKKwlyZXR1cm4gcmV0OworCitiYWRfcGdkOgorCXBnZF9FUlJPUigqcGdkKTsKKwlwZ2RfY2xlYXIocGdkKTsKK25vX3BnZDoKKwlyZXR1cm4gMDsKKworYmFkX3BtZDoKKwlwbWRfRVJST1IoKnBtZCk7CisJcG1kX2NsZWFyKHBtZCk7Citub19wbWQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCittYWtlX2NvaGVyZW50KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgZGlydHkpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbXBudDsKKwlzdHJ1Y3QgcHJpb190cmVlX2l0ZXIgaXRlcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlwZ29mZl90IHBnb2ZmOworCWludCBhbGlhc2VzID0gMDsKKworCWlmICghbWFwcGluZykKKwkJcmV0dXJuOworCisJcGdvZmYgPSB2bWEtPnZtX3Bnb2ZmICsgKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYW55IHNoYXJlZCBtYXBwaW5ncyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtbQorCSAqIHNwYWNlLCB0aGVuIHdlIG5lZWQgdG8gaGFuZGxlIHRoZW0gc3BlY2lhbGx5IHRvIG1haW50YWluCisJICogY2FjaGUgY29oZXJlbmN5LgorCSAqLworCWZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZyk7CisJdm1hX3ByaW9fdHJlZV9mb3JlYWNoKG1wbnQsICZpdGVyLCAmbWFwcGluZy0+aV9tbWFwLCBwZ29mZiwgcGdvZmYpIHsKKwkJLyoKKwkJICogSWYgdGhpcyBWTUEgaXMgbm90IGluIG91ciBNTSwgd2UgY2FuIGlnbm9yZSBpdC4KKwkJICogTm90ZSB0aGF0IHdlIGludGVudGlvbmFsbHkgbWFzayBvdXQgdGhlIFZNQQorCQkgKiB0aGF0IHdlIGFyZSBmaXhpbmcgdXAuCisJCSAqLworCQlpZiAobXBudC0+dm1fbW0gIT0gbW0gfHwgbXBudCA9PSB2bWEpCisJCQljb250aW51ZTsKKwkJaWYgKCEobXBudC0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkpCisJCQljb250aW51ZTsKKwkJb2Zmc2V0ID0gKHBnb2ZmIC0gbXBudC0+dm1fcGdvZmYpIDw8IFBBR0VfU0hJRlQ7CisJCWFsaWFzZXMgKz0gYWRqdXN0X3B0ZShtcG50LCBtcG50LT52bV9zdGFydCArIG9mZnNldCk7CisJfQorCWZsdXNoX2RjYWNoZV9tbWFwX3VubG9jayhtYXBwaW5nKTsKKwlpZiAoYWxpYXNlcykKKwkJYWRqdXN0X3B0ZSh2bWEsIGFkZHIpOworCWVsc2UKKwkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKK30KKworLyoKKyAqIFRha2UgY2FyZSBvZiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgdGhpbmdzIHdoZW4gcGxhY2luZyBhIG5ldyBQVEUgaW50bworICogYSBwYWdlIHRhYmxlLCBvciBjaGFuZ2luZyBhbiBleGlzdGluZyBQVEUuICBCYXNpY2FsbHksIHRoZXJlIGFyZSB0d28KKyAqIHRoaW5ncyB0aGF0IHdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mOgorICoKKyAqICAxLiBJZiBQR19kY2FjaGVfZGlydHkgaXMgc2V0IGZvciB0aGUgcGFnZSwgd2UgbmVlZCB0byBlbnN1cmUKKyAqICAgICB0aGF0IGFueSBjYWNoZSBlbnRyaWVzIGZvciB0aGUga2VybmVscyB2aXJ0dWFsIG1lbW9yeQorICogICAgIHJhbmdlIGFyZSB3cml0dGVuIGJhY2sgdG8gdGhlIHBhZ2UuCisgKiAgMi4gSWYgd2UgaGF2ZSBtdWx0aXBsZSBzaGFyZWQgbWFwcGluZ3Mgb2YgdGhlIHNhbWUgc3BhY2UgaW4KKyAqICAgICBhbiBvYmplY3QsIHdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBjYWNoZSBhbGlhc2luZyBpc3N1ZXMuCisgKgorICogTm90ZSB0aGF0IHRoZSBwYWdlX3RhYmxlX2xvY2sgd2lsbCBiZSBoZWxkLgorICovCit2b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRlKQoreworCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKCFwZm5fdmFsaWQocGZuKSkKKwkJcmV0dXJuOworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCWlmIChwYWdlX21hcHBpbmcocGFnZSkpIHsKKwkJaW50IGRpcnR5ID0gdGVzdF9hbmRfY2xlYXJfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJnBhZ2UtPmZsYWdzKTsKKworCQlpZiAoZGlydHkpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIG91ciBmaXJzdCB1c2Vyc3BhY2UgbWFwcGluZyBvZiB0aGlzIHBhZ2UuCisJCQkgKiBFbnN1cmUgdGhhdCB0aGUgcGh5c2ljYWwgcGFnZSBpcyBjb2hlcmVudCB3aXRoCisJCQkgKiB0aGUga2VybmVsIG1hcHBpbmcuCisJCQkgKgorCQkJICogRklYTUU6IG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uIFZJVlQgYW5kIGFsaWFzaW5nCisJCQkgKiAgICAgICAgVklQVCBjYWNoZSBhcmNoaXRlY3R1cmVzLiAgV2UgY2FuIGRvIHRoYXQKKwkJCSAqCSAgYnkgY2hvb3Npbmcgd2hldGhlciB0byBzZXQgdGhpcyBiaXQuLi4KKwkJCSAqLworCQkJX19jcHVjX2ZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJCX0KKworCQlpZiAoY2FjaGVfaXNfdml2dCgpKQorCQkJbWFrZV9jb2hlcmVudCh2bWEsIGFkZHIsIHBhZ2UsIGRpcnR5KTsKKwl9Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoZSB3cml0ZSBidWZmZXIgaGFzIHBoeXNpY2FsIGFkZHJlc3MgYWxpYXNpbmcKKyAqIGlzc3Vlcy4gIElmIGl0IGhhcywgd2UgbmVlZCB0byBhdm9pZCB0aGVtIGZvciB0aGUgY2FzZSB3aGVyZQorICogd2UgaGF2ZSBzZXZlcmFsIHNoYXJlZCBtYXBwaW5ncyBvZiB0aGUgc2FtZSBvYmplY3QgaW4gdXNlcgorICogc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNoZWNrX3dyaXRlYnVmZmVyKHVuc2lnbmVkIGxvbmcgKnAxLCB1bnNpZ25lZCBsb25nICpwMikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHplcm8gPSAwLCBvbmUgPSAxLCB2YWw7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCW1iKCk7CisJKnAxID0gb25lOworCW1iKCk7CisJKnAyID0gemVybzsKKwltYigpOworCXZhbCA9ICpwMTsKKwltYigpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyZXR1cm4gdmFsICE9IHplcm87Cit9CisKK3ZvaWQgX19pbml0IGNoZWNrX3dyaXRlYnVmZmVyX2J1Z3Modm9pZCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwljb25zdCBjaGFyICpyZWFzb247CisJdW5zaWduZWQgbG9uZyB2ID0gMTsKKworCXByaW50ayhLRVJOX0lORk8gIkNQVTogVGVzdGluZyB3cml0ZSBidWZmZXIgY29oZXJlbmN5OiAiKTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlKSB7CisJCXVuc2lnbmVkIGxvbmcgKnAxLCAqcDI7CisJCXBncHJvdF90IHByb3QgPSBfX3BncHJvdChMX1BURV9QUkVTRU5UfExfUFRFX1lPVU5HfAorCQkJCQkgTF9QVEVfRElSVFl8TF9QVEVfV1JJVEV8CisJCQkJCSBMX1BURV9CVUZGRVJBQkxFKTsKKworCQlwMSA9IHZtYXAoJnBhZ2UsIDEsIFZNX0lPUkVNQVAsIHByb3QpOworCQlwMiA9IHZtYXAoJnBhZ2UsIDEsIFZNX0lPUkVNQVAsIHByb3QpOworCisJCWlmIChwMSAmJiBwMikgeworCQkJdiA9IGNoZWNrX3dyaXRlYnVmZmVyKHAxLCBwMik7CisJCQlyZWFzb24gPSAiZW5hYmxpbmcgd29yay1hcm91bmQiOworCQl9IGVsc2UgeworCQkJcmVhc29uID0gInVuYWJsZSB0byBtYXAgbWVtb3J5XG4iOworCQl9CisKKwkJdnVubWFwKHAxKTsKKwkJdnVubWFwKHAyKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJfSBlbHNlIHsKKwkJcmVhc29uID0gInVuYWJsZSB0byBncmFiIHBhZ2VcbiI7CisJfQorCisJaWYgKHYpIHsKKwkJcHJpbnRrKCJmYWlsZWQsICVzXG4iLCByZWFzb24pOworCQlzaGFyZWRfcHRlX21hc2sgfD0gTF9QVEVfQlVGRkVSQUJMRTsKKwl9IGVsc2UgeworCQlwcmludGsoIm9rXG4iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mYXVsdC5jIGIvYXJjaC9hcm0vbW0vZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWJlMWMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vZmF1bHQuYwpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9mYXVsdC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqICBNb2RpZmljYXRpb25zIGZvciBBUk0gcHJvY2Vzc29yIChjKSAxOTk1LTIwMDQgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImZhdWx0LmgiCisKKy8qCisgKiBUaGlzIGlzIHVzZWZ1bCB0byBkdW1wIG91dCB0aGUgcGFnZSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoCisgKiAnYWRkcicgaW4gbW0gJ21tJy4KKyAqLwordm9pZCBzaG93X3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXBnZF90ICpwZ2Q7CisKKwlpZiAoIW1tKQorCQltbSA9ICZpbml0X21tOworCisJcHJpbnRrKEtFUk5fQUxFUlQgInBnZCA9ICVwXG4iLCBtbS0+cGdkKTsKKwlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKKwlwcmludGsoS0VSTl9BTEVSVCAiWyUwOGx4XSAqcGdkPSUwOGx4IiwgYWRkciwgcGdkX3ZhbCgqcGdkKSk7CisKKwlkbyB7CisJCXBtZF90ICpwbWQ7CisJCXB0ZV90ICpwdGU7CisKKwkJaWYgKHBnZF9ub25lKCpwZ2QpKQorCQkJYnJlYWs7CisKKwkJaWYgKHBnZF9iYWQoKnBnZCkpIHsKKwkJCXByaW50aygiKGJhZCkiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHIpOworI2lmIFBUUlNfUEVSX1BNRCAhPSAxCisJCXByaW50aygiLCAqcG1kPSUwOGx4IiwgcG1kX3ZhbCgqcG1kKSk7CisjZW5kaWYKKworCQlpZiAocG1kX25vbmUoKnBtZCkpCisJCQlicmVhazsKKworCQlpZiAocG1kX2JhZCgqcG1kKSkgeworCQkJcHJpbnRrKCIoYmFkKSIpOworCQkJYnJlYWs7CisJCX0KKworI2lmbmRlZiBDT05GSUdfSElHSE1FTQorCQkvKiBXZSBtdXN0IG5vdCBtYXAgdGhpcyBpZiB3ZSBoYXZlIGhpZ2htZW0gZW5hYmxlZCAqLworCQlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOworCQlwcmludGsoIiwgKnB0ZT0lMDhseCIsIHB0ZV92YWwoKnB0ZSkpOworCQlwcmludGsoIiwgKnBwdGU9JTA4bHgiLCBwdGVfdmFsKHB0ZVstUFRSU19QRVJfUFRFXSkpOworCQlwdGVfdW5tYXAocHRlKTsKKyNlbmRpZgorCX0gd2hpbGUoMCk7CisKKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisgKiBPb3BzLiAgVGhlIGtlcm5lbCB0cmllZCB0byBhY2Nlc3Mgc29tZSBwYWdlIHRoYXQgd2Fzbid0IHByZXNlbnQuCisgKi8KK3N0YXRpYyB2b2lkCitfX2RvX2tlcm5lbF9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLAorCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICogQXJlIHdlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGlzIGtlcm5lbCBmYXVsdD8KKwkgKi8KKwlpZiAoZml4dXBfZXhjZXB0aW9uKHJlZ3MpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE5vIGhhbmRsZXIsIHdlJ2xsIGhhdmUgdG8gdGVybWluYXRlIHRoaW5ncyB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLgorCSAqLworCWJ1c3Rfc3BpbmxvY2tzKDEpOworCXByaW50ayhLRVJOX0FMRVJUCisJCSJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCAlcyBhdCB2aXJ0dWFsIGFkZHJlc3MgJTA4bHhcbiIsCisJCShhZGRyIDwgUEFHRV9TSVpFKSA/ICJOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiIDoKKwkJInBhZ2luZyByZXF1ZXN0IiwgYWRkcik7CisKKwlzaG93X3B0ZShtbSwgYWRkcik7CisJZGllKCJPb3BzIiwgcmVncywgZnNyKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKKwlkb19leGl0KFNJR0tJTEwpOworfQorCisvKgorICogU29tZXRoaW5nIHRyaWVkIHRvIGFjY2VzcyBtZW1vcnkgdGhhdCBpc24ndCBpbiBvdXIgbWVtb3J5IG1hcC4uCisgKiBVc2VyIG1vZGUgYWNjZXNzZXMganVzdCBjYXVzZSBhIFNJR1NFR1YKKyAqLworc3RhdGljIHZvaWQKK19fZG9fdXNlcl9mYXVsdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLAorCQl1bnNpZ25lZCBpbnQgZnNyLCBpbnQgY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNpZ2luZm8gc2k7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfVVNFUgorCWlmICh1c2VyX2RlYnVnICYgVURCR19TRUdWKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5oYW5kbGVkIHBhZ2UgZmF1bHQgYXQgMHglMDhseCwgY29kZSAweCUwM3hcbiIsCisJCSAgICAgICB0c2stPmNvbW0sIGFkZHIsIGZzcik7CisJCXNob3dfcHRlKHRzay0+bW0sIGFkZHIpOworCQlzaG93X3JlZ3MocmVncyk7CisJfQorI2VuZGlmCisKKwl0c2stPnRocmVhZC5hZGRyZXNzID0gYWRkcjsKKwl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZnNyOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxNDsKKwlzaS5zaV9zaWdubyA9IFNJR1NFR1Y7CisJc2kuc2lfZXJybm8gPSAwOworCXNpLnNpX2NvZGUgPSBjb2RlOworCXNpLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilhZGRyOworCWZvcmNlX3NpZ19pbmZvKFNJR1NFR1YsICZzaSwgdHNrKTsKK30KKwordm9pZAorZG9fYmFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJICAgIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICogSWYgd2UgYXJlIGluIGtlcm5lbCBtb2RlIGF0IHRoaXMgcG9pbnQsIHdlCisJICogaGF2ZSBubyBjb250ZXh0IHRvIGhhbmRsZSB0aGlzIGZhdWx0IHdpdGguCisJICovCisJaWYgKHVzZXJfbW9kZShyZWdzKSkKKwkJX19kb191c2VyX2ZhdWx0KHRzaywgYWRkciwgZnNyLCBTRUdWX01BUEVSUiwgcmVncyk7CisJZWxzZQorCQlfX2RvX2tlcm5lbF9mYXVsdChtbSwgYWRkciwgZnNyLCByZWdzKTsKK30KKworI2RlZmluZSBWTV9GQVVMVF9CQURNQVAJCSgtMjApCisjZGVmaW5lIFZNX0ZBVUxUX0JBREFDQ0VTUwkoLTIxKQorCitzdGF0aWMgaW50CitfX2RvX3BhZ2VfZmF1bHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGZzciwKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJaW50IGZhdWx0LCBtYXNrOworCisJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCWZhdWx0ID0gVk1fRkFVTFRfQkFETUFQOworCWlmICghdm1hKQorCQlnb3RvIG91dDsKKwlpZiAodm1hLT52bV9zdGFydCA+IGFkZHIpCisJCWdvdG8gY2hlY2tfc3RhY2s7CisKKwkvKgorCSAqIE9rLCB3ZSBoYXZlIGEgZ29vZCB2bV9hcmVhIGZvciB0aGlzCisJICogbWVtb3J5IGFjY2Vzcywgc28gd2UgY2FuIGhhbmRsZSBpdC4KKwkgKi8KK2dvb2RfYXJlYToKKwlpZiAoZnNyICYgKDEgPDwgMTEpKSAvKiB3cml0ZT8gKi8KKwkJbWFzayA9IFZNX1dSSVRFOworCWVsc2UKKwkJbWFzayA9IFZNX1JFQUR8Vk1fRVhFQzsKKworCWZhdWx0ID0gVk1fRkFVTFRfQkFEQUNDRVNTOworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBtYXNrKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIGZvciBhbnkgcmVhc29uIGF0IGFsbCB3ZSBjb3VsZG4ndCBoYW5kbGUKKwkgKiB0aGUgZmF1bHQsIG1ha2Ugc3VyZSB3ZSBleGl0IGdyYWNlZnVsbHkgcmF0aGVyCisJICogdGhhbiBlbmRsZXNzbHkgcmVkbyB0aGUgZmF1bHQuCisJICovCitzdXJ2aXZlOgorCWZhdWx0ID0gaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHIgJiBQQUdFX01BU0ssIGZzciAmICgxIDw8IDExKSk7CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgIm5vcm1hbCIgY2FzZXMgZmlyc3QgLSBzdWNjZXNzZnVsIGFuZCBzaWdidXMKKwkgKi8KKwlzd2l0Y2ggKGZhdWx0KSB7CisJY2FzZSBWTV9GQVVMVF9NQUpPUjoKKwkJdHNrLT5tYWpfZmx0Kys7CisJCXJldHVybiBmYXVsdDsKKwljYXNlIFZNX0ZBVUxUX01JTk9SOgorCQl0c2stPm1pbl9mbHQrKzsKKwljYXNlIFZNX0ZBVUxUX1NJR0JVUzoKKwkJcmV0dXJuIGZhdWx0OworCX0KKworCWlmICh0c2stPnBpZCAhPSAxKQorCQlnb3RvIG91dDsKKworCS8qCisJICogSWYgd2UgYXJlIG91dCBvZiBtZW1vcnkgZm9yIHBpZDEsCisJICogc2xlZXAgZm9yIGEgd2hpbGUgYW5kIHJldHJ5CisJICovCisJeWllbGQoKTsKKwlnb3RvIHN1cnZpdmU7CisKK2NoZWNrX3N0YWNrOgorCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOICYmICFleHBhbmRfc3RhY2sodm1hLCBhZGRyKSkKKwkJZ290byBnb29kX2FyZWE7CitvdXQ6CisJcmV0dXJuIGZhdWx0OworfQorCitzdGF0aWMgaW50Citkb19wYWdlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGZzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJaW50IGZhdWx0OworCisJdHNrID0gY3VycmVudDsKKwltbSAgPSB0c2stPm1tOworCisJLyoKKwkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyCisJICogY29udGV4dCwgd2UgbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuLgorCSAqLworCWlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhbW0pCisJCWdvdG8gbm9fY29udGV4dDsKKworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlmYXVsdCA9IF9fZG9fcGFnZV9mYXVsdChtbSwgYWRkciwgZnNyLCB0c2spOworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgIm5vcm1hbCIgY2FzZSBmaXJzdAorCSAqLworCWlmIChmYXVsdCA+IDApCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBoYWQgc29tZSBtZW1vcnksIGJ1dCB3ZXJlIHVuYWJsZSB0bworCSAqIHN1Y2Nlc3NmdWxseSBmaXggdXAgdGhpcyBwYWdlIGZhdWx0LgorCSAqLworCWlmIChmYXVsdCA9PSAwKQorCQlnb3RvIGRvX3NpZ2J1czsKKworCS8qCisJICogSWYgd2UgYXJlIGluIGtlcm5lbCBtb2RlIGF0IHRoaXMgcG9pbnQsIHdlCisJICogaGF2ZSBubyBjb250ZXh0IHRvIGhhbmRsZSB0aGlzIGZhdWx0IHdpdGguCisJICovCisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCWdvdG8gbm9fY29udGV4dDsKKworCWlmIChmYXVsdCA9PSBWTV9GQVVMVF9PT00pIHsKKwkJLyoKKwkJICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8KKwkJICogdXMgdGhhdCBtYWRlIHVzIHVuYWJsZSB0byBoYW5kbGUgdGhlIHBhZ2UgZmF1bHQgZ3JhY2VmdWxseS4KKwkJICovCisJCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgdHNrLT5jb21tKTsKKwkJZG9fZXhpdChTSUdLSUxMKTsKKwl9IGVsc2UKKwkJX19kb191c2VyX2ZhdWx0KHRzaywgYWRkciwgZnNyLCBmYXVsdCA9PSBWTV9GQVVMVF9CQURBQ0NFU1MgPworCQkJCVNFR1ZfQUNDRVJSIDogU0VHVl9NQVBFUlIsIHJlZ3MpOworCXJldHVybiAwOworCisKKy8qCisgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgb3Igc29tZSBvdGhlciB0aGluZyBoYXBwZW5lZCB0byB1cyB0aGF0IG1hZGUKKyAqIHVzIHVuYWJsZSB0byBoYW5kbGUgdGhlIHBhZ2UgZmF1bHQgZ3JhY2VmdWxseS4KKyAqLworZG9fc2lnYnVzOgorCS8qCisJICogU2VuZCBhIHNpZ2J1cywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIHdlcmUgaW4ga2VybmVsCisJICogb3IgdXNlciBtb2RlLgorCSAqLworCXRzay0+dGhyZWFkLmFkZHJlc3MgPSBhZGRyOworCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBmc3I7CisJdHNrLT50aHJlYWQudHJhcF9ubyA9IDE0OworCWZvcmNlX3NpZyhTSUdCVVMsIHRzayk7CisjaWZkZWYgQ09ORklHX0RFQlVHX1VTRVIKKwlpZiAodXNlcl9kZWJ1ZyAmIFVEQkdfQlVTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2lnYnVzIGF0IDB4JTA4bHgsIHBjPTB4JTA4bHhcbiIsCisJCQljdXJyZW50LT5jb21tLCBhZGRyLCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKTsKKwl9CisjZW5kaWYKKworCS8qIEtlcm5lbCBtb2RlPyBIYW5kbGUgZXhjZXB0aW9ucyBvciBkaWUgKi8KKwlpZiAodXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm4gMDsKKworbm9fY29udGV4dDoKKwlfX2RvX2tlcm5lbF9mYXVsdChtbSwgYWRkciwgZnNyLCByZWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpcnN0IExldmVsIFRyYW5zbGF0aW9uIEZhdWx0IEhhbmRsZXIKKyAqCisgKiBXZSBlbnRlciBoZXJlIGJlY2F1c2UgdGhlIGZpcnN0IGxldmVsIHBhZ2UgdGFibGUgZG9lc24ndCBjb250YWluCisgKiBhIHZhbGlkIGVudHJ5IGZvciB0aGUgYWRkcmVzcy4KKyAqCisgKiBJZiB0aGUgYWRkcmVzcyBpcyBpbiBrZXJuZWwgc3BhY2UgKD49IFRBU0tfU0laRSksIHRoZW4gd2UgYXJlCisgKiBwcm9iYWJseSBmYXVsdGluZyBpbiB0aGUgdm1hbGxvYygpIGFyZWEuCisgKgorICogSWYgdGhlIGluaXRfdGFzaydzIGZpcnN0IGxldmVsIHBhZ2UgdGFibGVzIGNvbnRhaW5zIHRoZSByZWxldmFudAorICogZW50cnksIHdlIGNvcHkgdGhlIGl0IHRvIHRoaXMgdGFzay4gIElmIG5vdCwgd2Ugc2VuZCB0aGUgcHJvY2VzcworICogYSBzaWduYWwsIGZpeHVwIHRoZSBleGNlcHRpb24sIG9yIG9vcHMgdGhlIGtlcm5lbC4KKyAqCisgKiBOT1RFISBXZSBNVVNUIE5PVCB0YWtlIGFueSBsb2NrcyBmb3IgdGhpcyBjYXNlLiBXZSBtYXkgYmUgaW4gYW4KKyAqIGludGVycnVwdCBvciBhIGNyaXRpY2FsIHJlZ2lvbiwgYW5kIHNob3VsZCBvbmx5IGNvcHkgdGhlIGluZm9ybWF0aW9uCisgKiBmcm9tIHRoZSBtYXN0ZXIgcGFnZSB0YWJsZSwgbm90aGluZyBtb3JlLgorICovCitzdGF0aWMgaW50Citkb190cmFuc2xhdGlvbl9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsCisJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJdW5zaWduZWQgaW50IGluZGV4OworCXBnZF90ICpwZ2QsICpwZ2RfazsKKwlwbWRfdCAqcG1kLCAqcG1kX2s7CisKKwlpZiAoYWRkciA8IFRBU0tfU0laRSkKKwkJcmV0dXJuIGRvX3BhZ2VfZmF1bHQoYWRkciwgZnNyLCByZWdzKTsKKworCWluZGV4ID0gcGdkX2luZGV4KGFkZHIpOworCisJLyoKKwkgKiBGSVhNRTogQ1AxNSBDMSBpcyB3cml0ZSBvbmx5IG9uIEFSTXYzIGFyY2hpdGVjdHVyZXMuCisJICovCisJcGdkID0gY3B1X2dldF9wZ2QoKSArIGluZGV4OworCXBnZF9rID0gaW5pdF9tbS5wZ2QgKyBpbmRleDsKKworCWlmIChwZ2Rfbm9uZSgqcGdkX2spKQorCQlnb3RvIGJhZF9hcmVhOworCisJaWYgKCFwZ2RfcHJlc2VudCgqcGdkKSkKKwkJc2V0X3BnZChwZ2QsICpwZ2Rfayk7CisKKwlwbWRfayA9IHBtZF9vZmZzZXQocGdkX2ssIGFkZHIpOworCXBtZCAgID0gcG1kX29mZnNldChwZ2QsIGFkZHIpOworCisJaWYgKHBtZF9ub25lKCpwbWRfaykpCisJCWdvdG8gYmFkX2FyZWE7CisKKwljb3B5X3BtZChwbWQsIHBtZF9rKTsKKwlyZXR1cm4gMDsKKworYmFkX2FyZWE6CisJdHNrID0gY3VycmVudDsKKworCWRvX2JhZF9hcmVhKHRzaywgdHNrLT5hY3RpdmVfbW0sIGFkZHIsIGZzciwgcmVncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIHNlY3Rpb24gcGVybWlzc2lvbiBmYXVsdHMgbmVlZCB0byBiZSBoYW5kbGVkIGdyYWNlZnVsbHkuCisgKiBUaGV5IGNhbiBoYXBwZW4gZHVlIHRvIGEgX197Z2V0LHB1dH1fdXNlciBkdXJpbmcgYW4gb29wcy4KKyAqLworc3RhdGljIGludAorZG9fc2VjdF9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlkb19iYWRfYXJlYSh0c2ssIHRzay0+YWN0aXZlX21tLCBhZGRyLCBmc3IsIHJlZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBhYm9ydCBoYW5kbGVyIGFsd2F5cyByZXR1cm5zICJmYXVsdCIuCisgKi8KK3N0YXRpYyBpbnQKK2RvX2JhZCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGZzcl9pbmZvIHsKKwlpbnQJKCpmbikodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisJaW50CXNpZzsKKwljb25zdCBjaGFyICpuYW1lOworfSBmc3JfaW5mb1tdID0geworCS8qCisJICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHN0YW5kYXJkIEFSTXYzIGFuZCBBUk12NCBhYm9ydHMuICBBUk12NQorCSAqIGRlZmluZXMgdGhlc2UgdG8gYmUgInByZWNpc2UiIGFib3J0cy4KKwkgKi8KKwl7IGRvX2JhZCwJCVNJR1NFR1YsICJ2ZWN0b3IgZXhjZXB0aW9uIgkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0lMTCwJICJhbGlnbm1lbnQgZXhjZXB0aW9uIgkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0tJTEwsICJ0ZXJtaW5hbCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHSUxMLAkgImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgImV4dGVybmFsIGFib3J0IG9uIGxpbmVmZXRjaCIJICAgfSwKKwl7IGRvX3RyYW5zbGF0aW9uX2ZhdWx0LAlTSUdTRUdWLCAic2VjdGlvbiB0cmFuc2xhdGlvbiBmYXVsdCIJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywJICJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCisJeyBkb19wYWdlX2ZhdWx0LAlTSUdTRUdWLCAicGFnZSB0cmFuc2xhdGlvbiBmYXVsdCIJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywJICJleHRlcm5hbCBhYm9ydCBvbiBub24tbGluZWZldGNoIiB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgInNlY3Rpb24gZG9tYWluIGZhdWx0IgkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywJICJleHRlcm5hbCBhYm9ydCBvbiBub24tbGluZWZldGNoIiB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgInBhZ2UgZG9tYWluIGZhdWx0IgkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywJICJleHRlcm5hbCBhYm9ydCBvbiB0cmFuc2xhdGlvbiIgICB9LAorCXsgZG9fc2VjdF9mYXVsdCwJU0lHU0VHViwgInNlY3Rpb24gcGVybWlzc2lvbiBmYXVsdCIJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywJICJleHRlcm5hbCBhYm9ydCBvbiB0cmFuc2xhdGlvbiIgICB9LAorCXsgZG9fcGFnZV9mYXVsdCwJU0lHU0VHViwgInBhZ2UgcGVybWlzc2lvbiBmYXVsdCIJICAgfSwKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgYXJlICJpbXByZWNpc2UiIGFib3J0cywgd2hpY2ggYXJlIHNpZ25hbGxlZCBieSBiaXQKKwkgKiAxMCBvZiB0aGUgRlNSLCBhbmQgbWF5IG5vdCBiZSByZWNvdmVyYWJsZS4gIFRoZXNlIGFyZSBvbmx5CisJICogc3VwcG9ydGVkIGlmIHRoZSBDUFUgYWJvcnQgaGFuZGxlciBzdXBwb3J0cyBiaXQgMTAuCisJICovCisJeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAxNiIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMTciCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDE4IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAxOSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgImxvY2sgYWJvcnQiCQkJICAgfSwgLyogeHNjYWxlICovCisJeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAyMSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgImltcHJlY2lzZSBleHRlcm5hbCBhYm9ydCIJICAgfSwgLyogeHNjYWxlICovCisJeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAyMyIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgImRjYWNoZSBwYXJpdHkgZXJyb3IiCQkgICB9LCAvKiB4c2NhbGUgKi8KKwl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDI1IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAyNiIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMjciCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDI4IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAyOSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMzAiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDMxIgkJCSAgIH0KK307CisKK3ZvaWQgX19pbml0Citob29rX2ZhdWx0X2NvZGUoaW50IG5yLCBpbnQgKCpmbikodW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKSwKKwkJaW50IHNpZywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAobnIgPj0gMCAmJiBuciA8IEFSUkFZX1NJWkUoZnNyX2luZm8pKSB7CisJCWZzcl9pbmZvW25yXS5mbiAgID0gZm47CisJCWZzcl9pbmZvW25yXS5zaWcgID0gc2lnOworCQlmc3JfaW5mb1tucl0ubmFtZSA9IG5hbWU7CisJfQorfQorCisvKgorICogRGlzcGF0Y2ggYSBkYXRhIGFib3J0IHRvIHRoZSByZWxldmFudCBoYW5kbGVyLgorICovCithc21saW5rYWdlIHZvaWQKK2RvX0RhdGFBYm9ydCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbnN0IHN0cnVjdCBmc3JfaW5mbyAqaW5mID0gZnNyX2luZm8gKyAoZnNyICYgMTUpICsgKChmc3IgJiAoMSA8PCAxMCkpID4+IDYpOworCisJaWYgKCFpbmYtPmZuKGFkZHIsIGZzciwgcmVncykpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0FMRVJUICJVbmhhbmRsZWQgZmF1bHQ6ICVzICgweCUwM3gpIGF0IDB4JTA4bHhcbiIsCisJCWluZi0+bmFtZSwgZnNyLCBhZGRyKTsKKwlmb3JjZV9zaWcoaW5mLT5zaWcsIGN1cnJlbnQpOworCXNob3dfcHRlKGN1cnJlbnQtPm1tLCBhZGRyKTsKKwlkaWVfaWZfa2VybmVsKCJPb3BzIiwgcmVncywgMCk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZAorZG9fUHJlZmV0Y2hBYm9ydCh1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRvX3RyYW5zbGF0aW9uX2ZhdWx0KGFkZHIsIDAsIHJlZ3MpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mYXVsdC5oIGIvYXJjaC9hcm0vbW0vZmF1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I1OWU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vZmF1bHQuaApAQCAtMCwwICsxLDYgQEAKK3ZvaWQgZG9fYmFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3ZvaWQgc2hvd19wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKK3Vuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nIGFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmx1c2guYyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkZTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9mbHVzaC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgdm9pZCBfX2ZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPmFjdGl2ZV9tbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm1wbnQ7CisJc3RydWN0IHByaW9fdHJlZV9pdGVyIGl0ZXI7CisJcGdvZmZfdCBwZ29mZjsKKworCS8qCisJICogV3JpdGViYWNrIGFueSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUga2VybmVsIG1hcHBpbmcgb2YgdGhpcworCSAqIHBhZ2UuICBUaGlzIGVuc3VyZXMgdGhhdCBkYXRhIGluIHRoZSBwaHlzaWNhbCBwYWdlIGlzIG11dHVhbGx5CisJICogY29oZXJlbnQgd2l0aCB0aGUga2VybmVscyBtYXBwaW5nLgorCSAqLworCV9fY3B1Y19mbHVzaF9kY2FjaGVfcGFnZShwYWdlX2FkZHJlc3MocGFnZSkpOworCisJLyoKKwkgKiBJZiB0aGVyZSdzIG5vIG1hcHBpbmcgcG9pbnRlciBoZXJlLCB0aGVuIHRoaXMgcGFnZSBpc24ndAorCSAqIHZpc2libGUgdG8gdXNlcnNwYWNlIHlldCwgc28gdGhlcmUgYXJlIG5vIGNhY2hlIGxpbmVzCisJICogYXNzb2NpYXRlZCB3aXRoIGFueSBvdGhlciBhbGlhc2VzLgorCSAqLworCWlmICghbWFwcGluZykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGVyZSBhcmUgcG9zc2libGUgdXNlciBzcGFjZSBtYXBwaW5ncyBvZiB0aGlzIHBhZ2U6CisJICogLSBWSVZUIGNhY2hlOiB3ZSBuZWVkIHRvIGFsc28gd3JpdGUgYmFjayBhbmQgaW52YWxpZGF0ZSBhbGwgdXNlcgorCSAqICAgZGF0YSBpbiB0aGUgY3VycmVudCBWTSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuCisJICogLSBhbGlhc2luZyBWSVBUOiB3ZSBvbmx5IG5lZWQgdG8gZmluZCBvbmUgbWFwcGluZyBvZiB0aGlzIHBhZ2UuCisJICovCisJcGdvZmYgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIFBBR0VfU0hJRlQpOworCisJZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKTsKKwl2bWFfcHJpb190cmVlX2ZvcmVhY2gobXBudCwgJml0ZXIsICZtYXBwaW5nLT5pX21tYXAsIHBnb2ZmLCBwZ29mZikgeworCQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCQkvKgorCQkgKiBJZiB0aGlzIFZNQSBpcyBub3QgaW4gb3VyIE1NLCB3ZSBjYW4gaWdub3JlIGl0LgorCQkgKi8KKwkJaWYgKG1wbnQtPnZtX21tICE9IG1tKQorCQkJY29udGludWU7CisJCWlmICghKG1wbnQtPnZtX2ZsYWdzICYgVk1fTUFZU0hBUkUpKQorCQkJY29udGludWU7CisJCW9mZnNldCA9IChwZ29mZiAtIG1wbnQtPnZtX3Bnb2ZmKSA8PCBQQUdFX1NISUZUOworCQlmbHVzaF9jYWNoZV9wYWdlKG1wbnQsIG1wbnQtPnZtX3N0YXJ0ICsgb2Zmc2V0LCBwYWdlX3RvX3BmbihwYWdlKSk7CisJCWlmIChjYWNoZV9pc192aXB0KCkpCisJCQlicmVhazsKKwl9CisJZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpOworfQorCisvKgorICogRW5zdXJlIGNhY2hlIGNvaGVyZW5jeSBiZXR3ZWVuIGtlcm5lbCBtYXBwaW5nIGFuZCB1c2Vyc3BhY2UgbWFwcGluZworICogb2YgdGhpcyBwYWdlLgorICoKKyAqIFdlIGhhdmUgdGhyZWUgY2FzZXMgdG8gY29uc2lkZXI6CisgKiAgLSBWSVBUIG5vbi1hbGlhc2luZyBjYWNoZTogZnVsbHkgY29oZXJlbnQgc28gbm90aGluZyByZXF1aXJlZC4KKyAqICAtIFZJVlQ6IGZ1bGx5IGFsaWFzaW5nLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBldmVyeSBhbGlhcyBpbiBvdXIKKyAqICAgICAgICAgIGN1cnJlbnQgVk0gdmlldy4KKyAqICAtIFZJUFQgYWxpYXNpbmc6IG5lZWQgdG8gaGFuZGxlIG9uZSBhbGlhcyBpbiBvdXIgY3VycmVudCBWTSB2aWV3LgorICoKKyAqIElmIHdlIG5lZWQgdG8gaGFuZGxlIGFsaWFzaW5nOgorICogIElmIHRoZSBwYWdlIG9ubHkgZXhpc3RzIGluIHRoZSBwYWdlIGNhY2hlIGFuZCB0aGVyZSBhcmUgbm8gdXNlcgorICogIHNwYWNlIG1hcHBpbmdzLCB3ZSBjYW4gYmUgbGF6eSBhbmQgcmVtZW1iZXIgdGhhdCB3ZSBtYXkgaGF2ZSBkaXJ0eQorICogIGtlcm5lbCBjYWNoZSBsaW5lcyBmb3IgbGF0ZXIuICBPdGhlcndpc2UsIHdlIGFzc3VtZSB3ZSBoYXZlCisgKiAgYWxpYXNpbmcgbWFwcGluZ3MuCisgKi8KK3ZvaWQgZmx1c2hfZGNhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisKKwlpZiAoY2FjaGVfaXNfdmlwdF9ub25hbGlhc2luZygpKQorCQlyZXR1cm47CisKKwlpZiAobWFwcGluZyAmJiAhbWFwcGluZ19tYXBwZWQobWFwcGluZykpCisJCXNldF9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmcGFnZS0+ZmxhZ3MpOworCWVsc2UKKwkJX19mbHVzaF9kY2FjaGVfcGFnZShtYXBwaW5nLCBwYWdlKTsKK30KK0VYUE9SVF9TWU1CT0woZmx1c2hfZGNhY2hlX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vaW5pdC5jIGIvYXJjaC9hcm0vbW0vaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTU2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9pbml0LmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vaW5pdC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vdGxiLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNkZWZpbmUgVEFCTEVfU0laRQkoMiAqIFBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCkpCisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7CisKK2V4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOworZXh0ZXJuIHZvaWQgX3N0ZXh0LCBfdGV4dCwgX2V0ZXh0LCBfX2RhdGFfc3RhcnQsIF9lbmQsIF9faW5pdF9iZWdpbiwgX19pbml0X2VuZDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBoeXNfaW5pdHJkX3N0YXJ0OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGh5c19pbml0cmRfc2l6ZTsKKworLyoKKyAqIFRoZSBzb2xlIHVzZSBvZiB0aGlzIGlzIHRvIHBhc3MgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIGRhdGEgZnJvbSBwYWdpbmdfaW5pdCB0byBtZW1faW5pdC4KKyAqLworc3RhdGljIHN0cnVjdCBtZW1pbmZvIG1lbWluZm8gX19pbml0ZGF0YSA9IHsgMCwgfTsKKworLyoKKyAqIGVtcHR5X3plcm9fcGFnZSBpcyBhIHNwZWNpYWwgcGFnZSB0aGF0IGlzIHVzZWQgZm9yCisgKiB6ZXJvLWluaXRpYWxpemVkIGRhdGEgYW5kIENPVy4KKyAqLworc3RydWN0IHBhZ2UgKmVtcHR5X3plcm9fcGFnZTsKKwordm9pZCBzaG93X21lbSh2b2lkKQoreworCWludCBmcmVlID0gMCwgdG90YWwgPSAwLCByZXNlcnZlZCA9IDA7CisJaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDAsIHNsYWIgPSAwLCBub2RlOworCisJcHJpbnRrKCJNZW0taW5mbzpcbiIpOworCXNob3dfZnJlZV9hcmVhcygpOworCXByaW50aygiRnJlZSBzd2FwOiAgICAgICAlNmxka0JcbiIsIG5yX3N3YXBfcGFnZXM8PChQQUdFX1NISUZULTEwKSk7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlLCAqZW5kOworCisJCXBhZ2UgPSBOT0RFX01FTV9NQVAobm9kZSk7CisJCWVuZCAgPSBwYWdlICsgTk9ERV9EQVRBKG5vZGUpLT5ub2RlX3NwYW5uZWRfcGFnZXM7CisKKwkJZG8geworCQkJdG90YWwrKzsKKwkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCisJCQkJcmVzZXJ2ZWQrKzsKKwkJCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCisJCQkJY2FjaGVkKys7CisJCQllbHNlIGlmIChQYWdlU2xhYihwYWdlKSkKKwkJCQlzbGFiKys7CisJCQllbHNlIGlmICghcGFnZV9jb3VudChwYWdlKSkKKwkJCQlmcmVlKys7CisJCQllbHNlCisJCQkJc2hhcmVkICs9IHBhZ2VfY291bnQocGFnZSkgLSAxOworCQkJcGFnZSsrOworCQl9IHdoaWxlIChwYWdlIDwgZW5kKTsKKwl9CisKKwlwcmludGsoIiVkIHBhZ2VzIG9mIFJBTVxuIiwgdG90YWwpOworCXByaW50aygiJWQgZnJlZSBwYWdlc1xuIiwgZnJlZSk7CisJcHJpbnRrKCIlZCByZXNlcnZlZCBwYWdlc1xuIiwgcmVzZXJ2ZWQpOworCXByaW50aygiJWQgc2xhYiBwYWdlc1xuIiwgc2xhYik7CisJcHJpbnRrKCIlZCBwYWdlcyBzaGFyZWRcbiIsIHNoYXJlZCk7CisJcHJpbnRrKCIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgY2FjaGVkKTsKK30KKworc3RydWN0IG5vZGVfaW5mbyB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBlbmQ7CisJaW50IGJvb3RtYXBfcGFnZXM7Cit9OworCisjZGVmaW5lIE9fUEZOX0RPV04oeCkJKCh4KSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBWX1BGTl9ET1dOKHgpCU9fUEZOX0RPV04oX19wYSh4KSkKKworI2RlZmluZSBPX1BGTl9VUCh4KQkoUEFHRV9BTElHTih4KSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBWX1BGTl9VUCh4KQlPX1BGTl9VUChfX3BhKHgpKQorCisjZGVmaW5lIFBGTl9TSVpFKHgpCSgoeCkgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgUEZOX1JBTkdFKHMsZSkJUEZOX1NJWkUoUEFHRV9BTElHTigodW5zaWduZWQgbG9uZykoZSkpIC0gXAorCQkJCSgoKHVuc2lnbmVkIGxvbmcpKHMpKSAmIFBBR0VfTUFTSykpCisKKy8qCisgKiBGSVhNRTogV2UgcmVhbGx5IHdhbnQgdG8gYXZvaWQgYWxsb2NhdGluZyB0aGUgYm9vdG1hcCBiaXRtYXAKKyAqIG92ZXIgdGhlIHRvcCBvZiB0aGUgaW5pdHJkLiAgSG9wZWZ1bGx5LCB0aGlzIGlzIGxvY2F0ZWQgdG93YXJkcworICogdGhlIHN0YXJ0IG9mIGEgYmFuaywgc28gaWYgd2UgYWxsb2NhdGUgdGhlIGJvb3RtYXAgYml0bWFwIGF0CisgKiB0aGUgZW5kLCB3ZSB3b24ndCBjbGFzaC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQKK2ZpbmRfYm9vdG1hcF9wZm4oaW50IG5vZGUsIHN0cnVjdCBtZW1pbmZvICptaSwgdW5zaWduZWQgaW50IGJvb3RtYXBfcGFnZXMpCit7CisJdW5zaWduZWQgaW50IHN0YXJ0X3BmbiwgYmFuaywgYm9vdG1hcF9wZm47CisKKwlzdGFydF9wZm4gICA9IFZfUEZOX1VQKCZfZW5kKTsKKwlib290bWFwX3BmbiA9IDA7CisKKwlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgbWktPm5yX2JhbmtzOyBiYW5rICsrKSB7CisJCXVuc2lnbmVkIGludCBzdGFydCwgZW5kOworCisJCWlmIChtaS0+YmFua1tiYW5rXS5ub2RlICE9IG5vZGUpCisJCQljb250aW51ZTsKKworCQlzdGFydCA9IE9fUEZOX1VQKG1pLT5iYW5rW2JhbmtdLnN0YXJ0KTsKKwkJZW5kICAgPSBPX1BGTl9ET1dOKG1pLT5iYW5rW2JhbmtdLnNpemUgKworCQkJCSAgIG1pLT5iYW5rW2JhbmtdLnN0YXJ0KTsKKworCQlpZiAoZW5kIDwgc3RhcnRfcGZuKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0YXJ0IDwgc3RhcnRfcGZuKQorCQkJc3RhcnQgPSBzdGFydF9wZm47CisKKwkJaWYgKGVuZCA8PSBzdGFydCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChlbmQgLSBzdGFydCA+PSBib290bWFwX3BhZ2VzKSB7CisJCQlib290bWFwX3BmbiA9IHN0YXJ0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYm9vdG1hcF9wZm4gPT0gMCkKKwkJQlVHKCk7CisKKwlyZXR1cm4gYm9vdG1hcF9wZm47Cit9CisKKy8qCisgKiBTY2FuIHRoZSBtZW1vcnkgaW5mbyBzdHJ1Y3R1cmUgYW5kIHB1bGwgb3V0OgorICogIC0gdGhlIGVuZCBvZiBtZW1vcnkKKyAqICAtIHRoZSBudW1iZXIgb2Ygbm9kZXMKKyAqICAtIHRoZSBwZm4gcmFuZ2Ugb2YgZWFjaCBub2RlCisgKiAgLSB0aGUgbnVtYmVyIG9mIGJvb3RtZW0gYml0bWFwIHBhZ2VzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0CitmaW5kX21lbWVuZF9hbmRfbm9kZXMoc3RydWN0IG1lbWluZm8gKm1pLCBzdHJ1Y3Qgbm9kZV9pbmZvICpucCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgYm9vdG1lbV9wYWdlcyA9IDAsIG1lbWVuZF9wZm4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCW5wW2ldLnN0YXJ0ID0gLTFVOworCQlucFtpXS5lbmQgPSAwOworCQlucFtpXS5ib290bWFwX3BhZ2VzID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCQlpbnQgbm9kZTsKKworCQlpZiAobWktPmJhbmtbaV0uc2l6ZSA9PSAwKSB7CisJCQkvKgorCQkJICogTWFyayB0aGlzIGJhbmsgd2l0aCBhbiBpbnZhbGlkIG5vZGUgbnVtYmVyCisJCQkgKi8KKwkJCW1pLT5iYW5rW2ldLm5vZGUgPSAtMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbm9kZSA9IG1pLT5iYW5rW2ldLm5vZGU7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlIGhhdmVuJ3QgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisJCSAqIHRoYXQgd2UgaGF2ZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uICBJZiB3ZSBoYXZlLCB3ZSdyZSBpbgorCQkgKiB0cm91YmxlLiAgKG1heWJlIHdlIG91Z2h0IHRvIGxpbWl0LCBpbnN0ZWFkIG9mIGJ1Z2dpbmc/KQorCQkgKi8KKwkJaWYgKG5vZGUgPj0gTUFYX05VTU5PREVTKQorCQkJQlVHKCk7CisJCW5vZGVfc2V0X29ubGluZShub2RlKTsKKworCQkvKgorCQkgKiBHZXQgdGhlIHN0YXJ0IGFuZCBlbmQgcGZucyBmb3IgdGhpcyBiYW5rCisJCSAqLworCQlzdGFydCA9IE9fUEZOX1VQKG1pLT5iYW5rW2ldLnN0YXJ0KTsKKwkJZW5kICAgPSBPX1BGTl9ET1dOKG1pLT5iYW5rW2ldLnN0YXJ0ICsgbWktPmJhbmtbaV0uc2l6ZSk7CisKKwkJaWYgKG5wW25vZGVdLnN0YXJ0ID4gc3RhcnQpCisJCQlucFtub2RlXS5zdGFydCA9IHN0YXJ0OworCisJCWlmIChucFtub2RlXS5lbmQgPCBlbmQpCisJCQlucFtub2RlXS5lbmQgPSBlbmQ7CisKKwkJaWYgKG1lbWVuZF9wZm4gPCBlbmQpCisJCQltZW1lbmRfcGZuID0gZW5kOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMgd2UgcmVxdWlyZSB0bworCSAqIHN0b3JlIHRoZSBib290bWVtIGJpdG1hcHMuCisJICovCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkgeworCQlpZiAobnBbaV0uZW5kID09IDApCisJCQljb250aW51ZTsKKworCQlucFtpXS5ib290bWFwX3BhZ2VzID0gYm9vdG1lbV9ib290bWFwX3BhZ2VzKG5wW2ldLmVuZCAtCisJCQkJCQkJICAgIG5wW2ldLnN0YXJ0KTsKKwkJYm9vdG1lbV9wYWdlcyArPSBucFtpXS5ib290bWFwX3BhZ2VzOworCX0KKworCWhpZ2hfbWVtb3J5ID0gX192YShtZW1lbmRfcGZuIDw8IFBBR0VfU0hJRlQpOworCisJLyoKKwkgKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSB1c2VkIGJ5IHRoZSBMaW51eCBtZW1vcnkKKwkgKiBtYW5hZ2VyIGFueSBtb3JlLiAgSWYgd2UgY2FuIGdldCByaWQgb2YgaXQsIHdlCisJICogYWxzbyBnZXQgcmlkIG9mIHNvbWUgb2YgdGhlIHN0dWZmIGFib3ZlIGFzIHdlbGwuCisJICovCisJbWF4X2xvd19wZm4gPSBtZW1lbmRfcGZuIC0gT19QRk5fRE9XTihQSFlTX09GRlNFVCk7CisJbWF4X3BmbiA9IG1lbWVuZF9wZm4gLSBPX1BGTl9ET1dOKFBIWVNfT0ZGU0VUKTsKKworCXJldHVybiBib290bWVtX3BhZ2VzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjaGVja19pbml0cmQoc3RydWN0IG1lbWluZm8gKm1pKQoreworCWludCBpbml0cmRfbm9kZSA9IC0yOworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCXVuc2lnbmVkIGxvbmcgZW5kID0gcGh5c19pbml0cmRfc3RhcnQgKyBwaHlzX2luaXRyZF9zaXplOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgaW5pdHJkIGlzIHdpdGhpbiBhIHZhbGlkIGFyZWEgb2YKKwkgKiBtZW1vcnkuCisJICovCisJaWYgKHBoeXNfaW5pdHJkX3NpemUpIHsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJaW5pdHJkX25vZGUgPSAtMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYmFua19lbmQ7CisKKwkJCWJhbmtfZW5kID0gbWktPmJhbmtbaV0uc3RhcnQgKyBtaS0+YmFua1tpXS5zaXplOworCisJCQlpZiAobWktPmJhbmtbaV0uc3RhcnQgPD0gcGh5c19pbml0cmRfc3RhcnQgJiYKKwkJCSAgICBlbmQgPD0gYmFua19lbmQpCisJCQkJaW5pdHJkX25vZGUgPSBtaS0+YmFua1tpXS5ub2RlOworCQl9CisJfQorCisJaWYgKGluaXRyZF9ub2RlID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW5pdHJkICgweCUwOGx4IC0gMHglMDhseCkgZXh0ZW5kcyBiZXlvbmQgIgorCQkgICAgICAgInBoeXNpY2FsIG1lbW9yeSAtIGRpc2FibGluZyBpbml0cmRcbiIsCisJCSAgICAgICBwaHlzX2luaXRyZF9zdGFydCwgZW5kKTsKKwkJcGh5c19pbml0cmRfc3RhcnQgPSBwaHlzX2luaXRyZF9zaXplID0gMDsKKwl9CisjZW5kaWYKKworCXJldHVybiBpbml0cmRfbm9kZTsKK30KKworLyoKKyAqIFJlc2VydmUgdGhlIHZhcmlvdXMgcmVnaW9ucyBvZiBub2RlIDAKKyAqLworc3RhdGljIF9faW5pdCB2b2lkIHJlc2VydmVfbm9kZV96ZXJvKHVuc2lnbmVkIGludCBib290bWFwX3BmbiwgdW5zaWduZWQgaW50IGJvb3RtYXBfcGFnZXMpCit7CisJcGdfZGF0YV90ICpwZ2RhdCA9IE5PREVfREFUQSgwKTsKKwl1bnNpZ25lZCBsb25nIHJlc19zaXplID0gMDsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIGtlcm5lbCB0ZXh0IGFuZCBkYXRhIHdpdGggYm9vdG1lbS4KKwkgKiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBiZSBpbiBub2RlIDAuCisJICovCisjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYSgmX19kYXRhX3N0YXJ0KSwgJl9lbmQgLSAmX19kYXRhX3N0YXJ0KTsKKyNlbHNlCisJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoJl9zdGV4dCksICZfZW5kIC0gJl9zdGV4dCk7CisjZW5kaWYKKworCS8qCisJICogUmVzZXJ2ZSB0aGUgcGFnZSB0YWJsZXMuICBUaGVzZSBhcmUgYWxyZWFkeSBpbiB1c2UsCisJICogYW5kIGNhbiBvbmx5IGJlIGluIG5vZGUgMC4KKwkgKi8KKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYShzd2FwcGVyX3BnX2RpciksCisJCQkgICAgIFBUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOworCisJLyoKKwkgKiBBbmQgZG9uJ3QgZm9yZ2V0IHRvIHJlc2VydmUgdGhlIGFsbG9jYXRvciBiaXRtYXAsCisJICogd2hpY2ggd2lsbCBiZSBmcmVlZCBsYXRlci4KKwkgKi8KKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgYm9vdG1hcF9wZm4gPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKworCS8qCisJICogSG1tLi4uIFRoaXMgc2hvdWxkIGdvIGVsc2V3aGVyZSwgYnV0IHdlIHJlYWxseSByZWFsbHkgbmVlZCB0bworCSAqIHN0b3AgdGhpbmdzIGFsbG9jYXRpbmcgdGhlIGxvdyBtZW1vcnk7IGlkZWFsbHkgd2UgbmVlZCBhIGJldHRlcgorCSAqIGltcGxlbWVudGF0aW9uIG9mIEdGUF9ETUEgd2hpY2ggZG9lcyBub3QgYXNzdW1lIHRoYXQgRE1BLWFibGUKKwkgKiBtZW1vcnkgc3RhcnRzIGF0IHplcm8uCisJICovCisJaWYgKG1hY2hpbmVfaXNfaW50ZWdyYXRvcigpIHx8IG1hY2hpbmVfaXNfY2ludGVncmF0b3IoKSkKKwkJcmVzX3NpemUgPSBfX3BhKHN3YXBwZXJfcGdfZGlyKSAtIFBIWVNfT0ZGU0VUOworCisJLyoKKwkgKiBUaGVzZSBzaG91bGQgbGlrZXdpc2UgZ28gZWxzZXdoZXJlLiAgVGhleSBwcmUtcmVzZXJ2ZSB0aGUKKwkgKiBzY3JlZW4gbWVtb3J5IHJlZ2lvbiBhdCB0aGUgc3RhcnQgb2YgbWFpbiBzeXN0ZW0gbWVtb3J5LgorCSAqLworCWlmIChtYWNoaW5lX2lzX2VkYjcyMTEoKSkKKwkJcmVzX3NpemUgPSAweDAwMDIwMDAwOworCWlmIChtYWNoaW5lX2lzX3A3MjB0KCkpCisJCXJlc19zaXplID0gMHgwMDAxNDAwMDsKKworI2lmZGVmIENPTkZJR19TQTExMTEKKwkvKgorCSAqIEJlY2F1c2Ugb2YgdGhlIFNBMTExMSBETUEgYnVnLCB3ZSB3YW50IHRvIHByZXNlcnZlIG91cgorCSAqIHByZWNpb3VzIERNQS1hYmxlIG1lbW9yeS4uLgorCSAqLworCXJlc19zaXplID0gX19wYShzd2FwcGVyX3BnX2RpcikgLSBQSFlTX09GRlNFVDsKKyNlbmRpZgorCWlmIChyZXNfc2l6ZSkKKwkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIFBIWVNfT0ZGU0VULCByZXNfc2l6ZSk7Cit9CisKKy8qCisgKiBSZWdpc3RlciBhbGwgYXZhaWxhYmxlIFJBTSBpbiB0aGlzIG5vZGUgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2Jvb3RtZW1fbm9kZV9iYW5rKGludCBub2RlLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJcGdfZGF0YV90ICpwZ2RhdCA9IE5PREVfREFUQShub2RlKTsKKwlpbnQgYmFuazsKKworCWZvciAoYmFuayA9IDA7IGJhbmsgPCBtaS0+bnJfYmFua3M7IGJhbmsrKykKKwkJaWYgKG1pLT5iYW5rW2JhbmtdLm5vZGUgPT0gbm9kZSkKKwkJCWZyZWVfYm9vdG1lbV9ub2RlKHBnZGF0LCBtaS0+YmFua1tiYW5rXS5zdGFydCwKKwkJCQkJICBtaS0+YmFua1tiYW5rXS5zaXplKTsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIGJvb3RtZW0gYWxsb2NhdG9yIGZvciBhbGwgbm9kZXMuICBUaGlzIGlzIGNhbGxlZAorICogZWFybHkgZHVyaW5nIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBib290bWVtX2luaXQoc3RydWN0IG1lbWluZm8gKm1pKQoreworCXN0cnVjdCBub2RlX2luZm8gbm9kZV9pbmZvW01BWF9OVU1OT0RFU10sICpucCA9IG5vZGVfaW5mbzsKKwl1bnNpZ25lZCBpbnQgYm9vdG1hcF9wYWdlcywgYm9vdG1hcF9wZm4sIG1hcF9wZzsKKwlpbnQgbm9kZSwgaW5pdHJkX25vZGU7CisKKwlib290bWFwX3BhZ2VzID0gZmluZF9tZW1lbmRfYW5kX25vZGVzKG1pLCBucCk7CisJYm9vdG1hcF9wZm4gICA9IGZpbmRfYm9vdG1hcF9wZm4oMCwgbWksIGJvb3RtYXBfcGFnZXMpOworCWluaXRyZF9ub2RlICAgPSBjaGVja19pbml0cmQobWkpOworCisJbWFwX3BnID0gYm9vdG1hcF9wZm47CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIGJvb3RtZW0gbm9kZXMuCisJICoKKwkgKiBXaGF0IHdlIHJlYWxseSB3YW50IHRvIGRvIGlzOgorCSAqCisJICogICB1bm1hcF9hbGxfcmVnaW9uc19leGNlcHRfa2VybmVsKCk7CisJICogICBmb3JfZWFjaF9ub2RlX2luX3JldmVyc2Vfb3JkZXIobm9kZSkgeworCSAqICAgICBtYXBfbm9kZShub2RlKTsKKwkgKiAgICAgYWxsb2NhdGVfYm9vdG1lbV9tYXAobm9kZSk7CisJICogICAgIGluaXRfYm9vdG1lbV9ub2RlKG5vZGUpOworCSAqICAgICBmcmVlX2Jvb3RtZW1fbm9kZShub2RlKTsKKwkgKiAgIH0KKwkgKgorCSAqIGJ1dCB0aGlzIGlzIGEgMi41LXR5cGUgY2hhbmdlLiAgRm9yIG5vdywgd2UganVzdCBzZXQKKwkgKiB0aGUgbm9kZXMgdXAgaW4gcmV2ZXJzZSBvcmRlci4KKwkgKgorCSAqICh3ZSBjb3VsZCBhbHNvIGRvIHdpdGggcm9sbGluZyBib290bWVtX2luaXQgYW5kIHBhZ2luZ19pbml0CisJICogaW50byBvbmUgZ2VuZXJpYyAibWVtb3J5X2luaXQiIHR5cGUgZnVuY3Rpb24pLgorCSAqLworCW5wICs9IG51bV9vbmxpbmVfbm9kZXMoKSAtIDE7CisJZm9yIChub2RlID0gbnVtX29ubGluZV9ub2RlcygpIC0gMTsgbm9kZSA+PSAwOyBub2RlLS0sIG5wLS0pIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIG5vIHBhZ2VzIGluIHRoaXMgbm9kZSwgaWdub3JlIGl0LgorCQkgKiBOb3RlIHRoYXQgbm9kZSAwIG11c3QgYWx3YXlzIGhhdmUgc29tZSBwYWdlcy4KKwkJICovCisJCWlmIChucC0+ZW5kID09IDAgfHwgIW5vZGVfb25saW5lKG5vZGUpKSB7CisJCQlpZiAobm9kZSA9PSAwKQorCQkJCUJVRygpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBJbml0aWFsaXNlIHRoZSBib290bWVtIGFsbG9jYXRvci4KKwkJICovCisJCWluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwgbWFwX3BnLCBucC0+c3RhcnQsIG5wLT5lbmQpOworCQlmcmVlX2Jvb3RtZW1fbm9kZV9iYW5rKG5vZGUsIG1pKTsKKwkJbWFwX3BnICs9IG5wLT5ib290bWFwX3BhZ2VzOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgbm9kZSAwLCB3ZSBuZWVkIHRvIHJlc2VydmUgc29tZSBhcmVhcyBBU0FQIC0KKwkJICogd2UgbWF5IHVzZSBib290bWVtIG9uIG5vZGUgMCB0byBzZXR1cCB0aGUgb3RoZXIgbm9kZXMuCisJCSAqLworCQlpZiAobm9kZSA9PSAwKQorCQkJcmVzZXJ2ZV9ub2RlX3plcm8oYm9vdG1hcF9wZm4sIGJvb3RtYXBfcGFnZXMpOworCX0KKworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaWYgKHBoeXNfaW5pdHJkX3NpemUgJiYgaW5pdHJkX25vZGUgPj0gMCkgeworCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoaW5pdHJkX25vZGUpLCBwaHlzX2luaXRyZF9zdGFydCwKKwkJCQkgICAgIHBoeXNfaW5pdHJkX3NpemUpOworCQlpbml0cmRfc3RhcnQgPSBfX3BoeXNfdG9fdmlydChwaHlzX2luaXRyZF9zdGFydCk7CisJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBwaHlzX2luaXRyZF9zaXplOworCX0KKyNlbmRpZgorCisJQlVHX09OKG1hcF9wZyAhPSBib290bWFwX3BmbiArIGJvb3RtYXBfcGFnZXMpOworfQorCisvKgorICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcywgaW5pdGlhbGlzZXMgdGhlIHpvbmUgbWVtb3J5CisgKiBtYXBzLCBhbmQgc2V0cyB1cCB0aGUgemVybyBwYWdlLCBiYWQgcGFnZSBhbmQgYmFkIHBhZ2UgdGFibGVzLgorICovCit2b2lkIF9faW5pdCBwYWdpbmdfaW5pdChzdHJ1Y3QgbWVtaW5mbyAqbWksIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKm1kZXNjKQoreworCXZvaWQgKnplcm9fcGFnZTsKKwlpbnQgbm9kZTsKKworCWJvb3RtZW1faW5pdChtaSk7CisKKwltZW1jcHkoJm1lbWluZm8sIG1pLCBzaXplb2YobWVtaW5mbykpOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0aGUgemVybyBwYWdlLiAgTm90ZSB0aGF0IHdlIGNvdW50IG9uIHRoaXMgZ29pbmcgb2suCisJICovCisJemVyb19wYWdlID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoUEFHRV9TSVpFKTsKKworCS8qCisJICogaW5pdGlhbGlzZSB0aGUgcGFnZSB0YWJsZXMuCisJICovCisJbWVtdGFibGVfaW5pdChtaSk7CisJaWYgKG1kZXNjLT5tYXBfaW8pCisJCW1kZXNjLT5tYXBfaW8oKTsKKwlmbHVzaF90bGJfYWxsKCk7CisKKwkvKgorCSAqIGluaXRpYWxpc2UgdGhlIHpvbmVzIHdpdGhpbiBlYWNoIG5vZGUKKwkgKi8KKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CisJCXVuc2lnbmVkIGxvbmcgem9uZV9zaXplW01BWF9OUl9aT05FU107CisJCXVuc2lnbmVkIGxvbmcgemhvbGVfc2l6ZVtNQVhfTlJfWk9ORVNdOworCQlzdHJ1Y3QgYm9vdG1lbV9kYXRhICpiZGF0YTsKKwkJcGdfZGF0YV90ICpwZ2RhdDsKKwkJaW50IGk7CisKKwkJLyoKKwkJICogSW5pdGlhbGlzZSB0aGUgem9uZSBzaXplIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCQl6b25lX3NpemVbaV0gID0gMDsKKwkJCXpob2xlX3NpemVbaV0gPSAwOworCQl9CisKKwkJcGdkYXQgPSBOT0RFX0RBVEEobm9kZSk7CisJCWJkYXRhID0gcGdkYXQtPmJkYXRhOworCisJCS8qCisJCSAqIFRoZSBzaXplIG9mIHRoaXMgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGRldGVybWluZWQuCisJCSAqIElmIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgZmFuY3kgd2l0aCB0aGUgYWxsb2NhdGlvbgorCQkgKiBvZiB0aGlzIG1lbW9yeSB0byB0aGUgem9uZXMsIG5vdyBpcyB0aGUgdGltZSB0byBkbworCQkgKiBpdC4KKwkJICovCisJCXpvbmVfc2l6ZVswXSA9IGJkYXRhLT5ub2RlX2xvd19wZm4gLQorCQkJCShiZGF0YS0+bm9kZV9ib290X3N0YXJ0ID4+IFBBR0VfU0hJRlQpOworCisJCS8qCisJCSAqIElmIHRoaXMgem9uZSBoYXMgemVybyBzaXplLCBza2lwIGl0LgorCQkgKi8KKwkJaWYgKCF6b25lX3NpemVbMF0pCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBGb3IgZWFjaCBiYW5rIGluIHRoaXMgbm9kZSwgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZQorCQkgKiBob2xlcy4gIGhvbGVzID0gbm9kZV9zaXplIC0gc3VtKGJhbmtfc2l6ZXNfaW5fbm9kZSkKKwkJICovCisJCXpob2xlX3NpemVbMF0gPSB6b25lX3NpemVbMF07CisJCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmFua3M7IGkrKykgeworCQkJaWYgKG1pLT5iYW5rW2ldLm5vZGUgIT0gbm9kZSkKKwkJCQljb250aW51ZTsKKworCQkJemhvbGVfc2l6ZVswXSAtPSBtaS0+YmFua1tpXS5zaXplID4+IFBBR0VfU0hJRlQ7CisJCX0KKworCQkvKgorCQkgKiBBZGp1c3QgdGhlIHNpemVzIGFjY29yZGluZyB0byBhbnkgc3BlY2lhbAorCQkgKiByZXF1aXJlbWVudHMgZm9yIHRoaXMgbWFjaGluZSB0eXBlLgorCQkgKi8KKwkJYXJjaF9hZGp1c3Rfem9uZXMobm9kZSwgem9uZV9zaXplLCB6aG9sZV9zaXplKTsKKworCQlmcmVlX2FyZWFfaW5pdF9ub2RlKG5vZGUsIHBnZGF0LCB6b25lX3NpemUsCisJCQkJYmRhdGEtPm5vZGVfYm9vdF9zdGFydCA+PiBQQUdFX1NISUZULCB6aG9sZV9zaXplKTsKKwl9CisKKwkvKgorCSAqIGZpbmlzaCBvZmYgdGhlIGJhZCBwYWdlcyBvbmNlCisJICogdGhlIG1lbV9tYXAgaXMgaW5pdGlhbGlzZWQKKwkgKi8KKwltZW16ZXJvKHplcm9fcGFnZSwgUEFHRV9TSVpFKTsKKwllbXB0eV96ZXJvX3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoemVyb19wYWdlKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShlbXB0eV96ZXJvX3BhZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIGNoYXIgKnMpCit7CisJdW5zaWduZWQgaW50IHNpemUgPSAoZW5kIC0gYWRkcikgPj4gMTA7CisKKwlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlzZXRfcGFnZV9jb3VudChwYWdlLCAxKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQl0b3RhbHJhbV9wYWdlcysrOworCX0KKworCWlmIChzaXplICYmIHMpCisJCXByaW50ayhLRVJOX0lORk8gIkZyZWVpbmcgJXMgbWVtb3J5OiAlZEtcbiIsIHMsIHNpemUpOworfQorCisvKgorICogbWVtX2luaXQoKSBtYXJrcyB0aGUgZnJlZSBhcmVhcyBpbiB0aGUgbWVtX21hcCBhbmQgdGVsbHMgdXMgaG93IG11Y2gKKyAqIG1lbW9yeSBpcyBmcmVlLiAgVGhpcyBpcyBkb25lIGFmdGVyIHZhcmlvdXMgcGFydHMgb2YgdGhlIHN5c3RlbSBoYXZlCisgKiBjbGFpbWVkIHRoZWlyIG1lbW9yeSBhZnRlciB0aGUga2VybmVsIGltYWdlLgorICovCit2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjb2RlcGFnZXMsIGRhdGFwYWdlcywgaW5pdHBhZ2VzOworCWludCBpLCBub2RlOworCisJY29kZXBhZ2VzID0gJl9ldGV4dCAtICZfdGV4dDsKKwlkYXRhcGFnZXMgPSAmX2VuZCAtICZfX2RhdGFfc3RhcnQ7CisJaW5pdHBhZ2VzID0gJl9faW5pdF9lbmQgLSAmX19pbml0X2JlZ2luOworCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KKwltYXhfbWFwbnIgICA9IHZpcnRfdG9fcGFnZShoaWdoX21lbW9yeSkgLSBtZW1fbWFwOworI2VuZGlmCisKKwkvKgorCSAqIFdlIG1heSBoYXZlIG5vbi1jb250aWd1b3VzIG1lbW9yeS4KKwkgKi8KKwlpZiAobWVtaW5mby5ucl9iYW5rcyAhPSAxKQorCQljcmVhdGVfbWVtbWFwX2hvbGVzKCZtZW1pbmZvKTsKKworCS8qIHRoaXMgd2lsbCBwdXQgYWxsIHVudXNlZCBsb3cgbWVtb3J5IG9udG8gdGhlIGZyZWVsaXN0cyAqLworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJcGdfZGF0YV90ICpwZ2RhdCA9IE5PREVfREFUQShub2RlKTsKKworCQlpZiAocGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlcyAhPSAwKQorCQkJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbV9ub2RlKHBnZGF0KTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU0ExMTExCisJLyogbm93IHRoYXQgb3VyIERNQSBtZW1vcnkgaXMgYWN0dWFsbHkgc28gZGVzaWduYXRlZCwgd2UgY2FuIGZyZWUgaXQgKi8KKwlmcmVlX2FyZWEoUEFHRV9PRkZTRVQsICh1bnNpZ25lZCBsb25nKXN3YXBwZXJfcGdfZGlyLCBOVUxMKTsKKyNlbmRpZgorCisJLyoKKwkgKiBTaW5jZSBvdXIgbWVtb3J5IG1heSBub3QgYmUgY29udGlndW91cywgY2FsY3VsYXRlIHRoZQorCSAqIHJlYWwgbnVtYmVyIG9mIHBhZ2VzIHdlIGhhdmUgaW4gdGhpcyBzeXN0ZW0KKwkgKi8KKwlwcmludGsoS0VSTl9JTkZPICJNZW1vcnk6Iik7CisKKwludW1fcGh5c3BhZ2VzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtaW5mby5ucl9iYW5rczsgaSsrKSB7CisJCW51bV9waHlzcGFnZXMgKz0gbWVtaW5mby5iYW5rW2ldLnNpemUgPj4gUEFHRV9TSElGVDsKKwkJcHJpbnRrKCIgJWxkTUIiLCBtZW1pbmZvLmJhbmtbaV0uc2l6ZSA+PiAyMCk7CisJfQorCisJcHJpbnRrKCIgPSAlbHVNQiB0b3RhbFxuIiwgbnVtX3BoeXNwYWdlcyA+PiAoMjAgLSBQQUdFX1NISUZUKSk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJNZW1vcnk6ICVsdUtCIGF2YWlsYWJsZSAoJWRLIGNvZGUsICIKKwkJIiVkSyBkYXRhLCAlZEsgaW5pdClcbiIsCisJCSh1bnNpZ25lZCBsb25nKSBucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQtMTApLAorCQljb2RlcGFnZXMgPj4gMTAsIGRhdGFwYWdlcyA+PiAxMCwgaW5pdHBhZ2VzID4+IDEwKTsKKworCWlmIChQQUdFX1NJWkUgPj0gMTYzODQgJiYgbnVtX3BoeXNwYWdlcyA8PSAxMjgpIHsKKwkJZXh0ZXJuIGludCBzeXNjdGxfb3ZlcmNvbW1pdF9tZW1vcnk7CisJCS8qCisJCSAqIE9uIGEgbWFjaGluZSB0aGlzIHNtYWxsIHdlIHdvbid0IGdldAorCQkgKiBhbnl3aGVyZSB3aXRob3V0IG92ZXJjb21taXQsIHNvIHR1cm4KKwkJICogaXQgb24gYnkgZGVmYXVsdC4KKwkJICovCisJCXN5c2N0bF9vdmVyY29tbWl0X21lbW9yeSA9IE9WRVJDT01NSVRfQUxXQVlTOworCX0KK30KKwordm9pZCBmcmVlX2luaXRtZW0odm9pZCkKK3sKKwlpZiAoIW1hY2hpbmVfaXNfaW50ZWdyYXRvcigpICYmICFtYWNoaW5lX2lzX2NpbnRlZ3JhdG9yKCkpIHsKKwkJZnJlZV9hcmVhKCh1bnNpZ25lZCBsb25nKSgmX19pbml0X2JlZ2luKSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfZW5kKSwKKwkJCSAgImluaXQiKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKworc3RhdGljIGludCBrZWVwX2luaXRyZDsKKwordm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaWYgKCFrZWVwX2luaXRyZCkKKwkJZnJlZV9hcmVhKHN0YXJ0LCBlbmQsICJpbml0cmQiKTsKK30KKworc3RhdGljIGludCBfX2luaXQga2VlcGluaXRyZF9zZXR1cChjaGFyICpfX3VudXNlZCkKK3sKKwlrZWVwX2luaXRyZCA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImtlZXBpbml0cmQiLCBrZWVwaW5pdHJkX3NldHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vaW9yZW1hcC5jIGIvYXJjaC9hcm0vbW0vaW9yZW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmI4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9pb3JlbWFwLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vaW9yZW1hcC5jCisgKgorICogUmUtbWFwIElPIG1lbW9yeSB0byBrZXJuZWwgYWRkcmVzcyBzcGFjZSBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQuCisgKgorICogKEMpIENvcHlyaWdodCAxOTk1IDE5OTYgTGludXMgVG9ydmFsZHMKKyAqCisgKiBIYWNrZWQgZm9yIEFSTSBieSBQaGlsIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogSGFja2VkIHRvIGFsbG93IGFsbCBhcmNoaXRlY3R1cmVzIHRvIGJ1aWxkLCBhbmQgdmFyaW91cyBjbGVhbnVwcworICogYnkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBhbGxvd3MgYSBkcml2ZXIgdG8gcmVtYXAgYW4gYXJiaXRyYXJ5IHJlZ2lvbiBvZiBidXMgbWVtb3J5IGludG8KKyAqIHZpcnR1YWwgc3BhY2UuICBPbmUgc2hvdWxkICpvbmx5KiB1c2UgcmVhZGwsIHdyaXRlbCwgbWVtY3B5X3RvaW8gYW5kCisgKiBzbyBvbiB3aXRoIHN1Y2ggcmVtYXBwZWQgYXJlYXMuCisgKgorICogQmVjYXVzZSB0aGUgQVJNIG9ubHkgaGFzIGEgMzItYml0IGFkZHJlc3Mgc3BhY2Ugd2UgY2FuJ3QgYWRkcmVzcyB0aGUKKyAqIHdob2xlIG9mIHRoZSAocGh5c2ljYWwpIFBDSSBzcGFjZSBhdCBvbmNlLiAgUENJIGh1Z2UtbW9kZSBhZGRyZXNzaW5nCisgKiBhbGxvd3MgdXMgdG8gY2lyY3VtdmVudCB0aGlzIHJlc3RyaWN0aW9uIGJ5IHNwbGl0dGluZyBQQ0kgc3BhY2UgaW50bworICogdHdvIDJHQiBjaHVua3MgYW5kIG1hcHBpbmcgb25seSBvbmUgYXQgYSB0aW1lIGludG8gcHJvY2Vzc29yIG1lbW9yeS4KKyAqIFdlIHVzZSBNTVUgcHJvdGVjdGlvbiBkb21haW5zIHRvIHRyYXAgYW55IGF0dGVtcHQgdG8gYWNjZXNzIHRoZSBiYW5rCisgKiB0aGF0IGlzIG5vdCBjdXJyZW50bHkgbWFwcGVkLiAgKFRoaXMgaXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgeWV0LikKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbWFwX2FyZWFfcHRlKHB0ZV90ICogcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkgICAgICAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHBncHJvdF90IHBncHJvdCkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZDsKKworCWFkZHJlc3MgJj0gflBNRF9NQVNLOworCWVuZCA9IGFkZHJlc3MgKyBzaXplOworCWlmIChlbmQgPiBQTURfU0laRSkKKwkJZW5kID0gUE1EX1NJWkU7CisJQlVHX09OKGFkZHJlc3MgPj0gZW5kKTsKKwlkbyB7CisJCWlmICghcHRlX25vbmUoKnB0ZSkpCisJCQlnb3RvIGJhZDsKKworCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwaHlzX2FkZHIgPj4gUEFHRV9TSElGVCwgcGdwcm90KSk7CisJCWFkZHJlc3MgKz0gUEFHRV9TSVpFOworCQlwaHlzX2FkZHIgKz0gUEFHRV9TSVpFOworCQlwdGUrKzsKKwl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7CisJcmV0dXJuOworCisgYmFkOgorCXByaW50aygicmVtYXBfYXJlYV9wdGU6IHBhZ2UgYWxyZWFkeSBleGlzdHNcbiIpOworCUJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGludAorcmVtYXBfYXJlYV9wbWQocG1kX3QgKiBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAorCSAgICAgICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwlwZ3Byb3RfdCBwZ3Byb3Q7CisKKwlhZGRyZXNzICY9IH5QR0RJUl9NQVNLOworCWVuZCA9IGFkZHJlc3MgKyBzaXplOworCisJaWYgKGVuZCA+IFBHRElSX1NJWkUpCisJCWVuZCA9IFBHRElSX1NJWkU7CisKKwlwaHlzX2FkZHIgLT0gYWRkcmVzczsKKwlCVUdfT04oYWRkcmVzcyA+PSBlbmQpOworCisJcGdwcm90ID0gX19wZ3Byb3QoTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfRElSVFkgfCBMX1BURV9XUklURSB8IGZsYWdzKTsKKwlkbyB7CisJCXB0ZV90ICogcHRlID0gcHRlX2FsbG9jX2tlcm5lbCgmaW5pdF9tbSwgcG1kLCBhZGRyZXNzKTsKKwkJaWYgKCFwdGUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmVtYXBfYXJlYV9wdGUocHRlLCBhZGRyZXNzLCBlbmQgLSBhZGRyZXNzLCBhZGRyZXNzICsgcGh5c19hZGRyLCBwZ3Byb3QpOworCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKKwkJcG1kKys7CisJfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CityZW1hcF9hcmVhX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBzaXplOworCWludCBlcnIgPSAwOworCXBnZF90ICogZGlyOworCisJcGh5c19hZGRyIC09IGFkZHJlc3M7CisJZGlyID0gcGdkX29mZnNldCgmaW5pdF9tbSwgYWRkcmVzcyk7CisJQlVHX09OKGFkZHJlc3MgPj0gZW5kKTsKKwlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKKwlkbyB7CisJCXBtZF90ICpwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIGRpciwgYWRkcmVzcyk7CisJCWlmICghcG1kKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlbWFwX2FyZWFfcG1kKHBtZCwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywKKwkJCQkJIHBoeXNfYWRkciArIGFkZHJlc3MsIGZsYWdzKSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJYWRkcmVzcyA9IChhZGRyZXNzICsgUEdESVJfU0laRSkgJiBQR0RJUl9NQVNLOworCQlkaXIrKzsKKwl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7CisKKwlzcGluX3VubG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOworCWZsdXNoX2NhY2hlX3ZtYXAoc3RhcnQsIGVuZCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFJlbWFwIGFuIGFyYml0cmFyeSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBOZWVkZWQgd2hlbiB0aGUga2VybmVsIHdhbnRzIHRvIGFjY2VzcyBoaWdoIGFkZHJlc3NlcworICogZGlyZWN0bHkuCisgKgorICogTk9URSEgV2UgbmVlZCB0byBhbGxvdyBub24tcGFnZS1hbGlnbmVkIG1hcHBpbmdzIHRvbzogd2Ugd2lsbCBvYnZpb3VzbHkKKyAqIGhhdmUgdG8gY29udmVydCB0aGVtIGludG8gYW4gb2Zmc2V0IGluIGEgcGFnZS1hbGlnbmVkIG1hcHBpbmcsIGJ1dCB0aGUKKyAqIGNhbGxlciBzaG91bGRuJ3QgbmVlZCB0byBrbm93IHRoYXQgc21hbGwgZGV0YWlsLgorICoKKyAqICdmbGFncycgYXJlIHRoZSBleHRyYSBMX1BURV8gZmxhZ3MgdGhhdCB5b3Ugd2FudCB0byBzcGVjaWZ5IGZvciB0aGlzCisgKiBtYXBwaW5nLiAgU2VlIGluY2x1ZGUvYXNtLWFybS9wcm9jLWFybXYvcGd0YWJsZS5oIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCit2b2lkIF9faW9tZW0gKgorX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJdm9pZCAqIGFkZHI7CisJc3RydWN0IHZtX3N0cnVjdCAqIGFyZWE7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxhc3RfYWRkcjsKKworCS8qIERvbid0IGFsbG93IHdyYXBhcm91bmQgb3IgemVybyBzaXplICovCisJbGFzdF9hZGRyID0gcGh5c19hZGRyICsgc2l6ZSAtIDE7CisJaWYgKCFzaXplIHx8IGxhc3RfYWRkciA8IHBoeXNfYWRkcikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIE1hcHBpbmdzIGhhdmUgdG8gYmUgcGFnZS1hbGlnbmVkCisJICovCisJb2Zmc2V0ID0gcGh5c19hZGRyICYgflBBR0VfTUFTSzsKKwlwaHlzX2FkZHIgJj0gUEFHRV9NQVNLOworCXNpemUgPSBQQUdFX0FMSUdOKGxhc3RfYWRkciArIDEpIC0gcGh5c19hZGRyOworCisJLyoKKwkgKiBPaywgZ28gZm9yIGl0Li4KKwkgKi8KKwlhcmVhID0gZ2V0X3ZtX2FyZWEoc2l6ZSwgVk1fSU9SRU1BUCk7CisJaWYgKCFhcmVhKQorCQlyZXR1cm4gTlVMTDsKKwlhZGRyID0gYXJlYS0+YWRkcjsKKwlpZiAocmVtYXBfYXJlYV9wYWdlcygodW5zaWduZWQgbG9uZykgYWRkciwgcGh5c19hZGRyLCBzaXplLCBmbGFncykpIHsKKwkJdmZyZWUoYWRkcik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAob2Zmc2V0ICsgKGNoYXIgKilhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKKwordm9pZCBfX2lvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQoreworCXZmcmVlKCh2b2lkICopIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZykgYWRkcikpOworfQorRVhQT1JUX1NZTUJPTChfX2lvdW5tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbWluaWNhY2hlLmMgYi9hcmNoL2FybS9tbS9taW5pY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRmMmFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vbWluaWNhY2hlLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9taW5pY2FjaGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGhhbmRsZXMgdGhlIG1pbmkgZGF0YSBjYWNoZSwgYXMgZm91bmQgb24gU0ExMXgwIGFuZCBYU2NhbGUKKyAqIHByb2Nlc3NvcnMuICBXaGVuIHdlIGNvcHkgYSB1c2VyIHBhZ2UgcGFnZSwgd2UgbWFwIGl0IGluIHN1Y2ggYSB3YXkKKyAqIHRoYXQgYWNjZXNzZXMgdG8gdGhpcyBwYWdlIHdpbGwgbm90IHRvdWNoIHRoZSBtYWluIGRhdGEgY2FjaGUsIGJ1dAorICogd2lsbCBiZSBjYWNoZWQgaW4gdGhlIG1pbmkgZGF0YSBjYWNoZS4gIFRoaXMgcHJldmVudHMgdXMgdGhyYXNoaW5nCisgKiB0aGUgbWFpbiBkYXRhIGNhY2hlIG9uIHBhZ2UgZmF1bHRzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKy8qCisgKiAweGZmZmY4MDAwIHRvIDB4ZmZmZmZmZmYgaXMgcmVzZXJ2ZWQgZm9yIGFueSBBUk0gYXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpYyBoYWNrcyBmb3IgY29weWluZyBwYWdlcyBlZmZpY2llbnRseS4KKyAqLworI2RlZmluZSBtaW5pY2FjaGVfYWRkcmVzcyAoMHhmZmZmODAwMCkKKyNkZWZpbmUgbWluaWNhY2hlX3BncHJvdCBfX3BncHJvdChMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBcCisJCQkJICBMX1BURV9DQUNIRUFCTEUpCisKK3N0YXRpYyBwdGVfdCAqbWluaWNhY2hlX3B0ZTsKKworLyoKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gdGhlIGNvcHlfdXNlcl9wYWdlCisgKiBhc20gY29kZTsgYW55dGhpbmcgZWxzZSB3aWxsIHJlcXVpcmUgc3BlY2lhbCBsb2NraW5nIHRvIHByZXZlbnQgdGhlCisgKiBtaW5pLWNhY2hlIHNwYWNlIGJlaW5nIHJlLXVzZWQuICAoTm90ZTogcHJvYmFibHkgcHJlZW1wdCB1bnNhZmUpLgorICoKKyAqIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGUgbWluaWNhY2hlIGlzIDJLLCBhbmQgd2UnbGwgYmUgcHVzaGluZworICogNEsgb2YgZGF0YSB0aHJvdWdoIGl0LCBzbyB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIHRvIHNwZWNpZmljYWxseQorICogZmx1c2ggdGhlIG1pbmljYWNoZSB3aGVuIHdlIGNoYW5nZSB0aGUgbWFwcGluZy4KKyAqCisgKiBOb3RlIGFsc286IGFzc2VydChQQUdFX09GRlNFVCA8PSB2aXJ0IDwgaGlnaF9tZW1vcnkpLgorICogVW5zYWZlOiBwcmVlbXB0LCBrbWFwLgorICovCit1bnNpZ25lZCBsb25nIG1hcF9wYWdlX21pbmljYWNoZSh1bnNpZ25lZCBsb25nIHZpcnQpCit7CisJc2V0X3B0ZShtaW5pY2FjaGVfcHRlLCBwZm5fcHRlKF9fcGEodmlydCkgPj4gUEFHRV9TSElGVCwgbWluaWNhY2hlX3BncHJvdCkpOworCWZsdXNoX3RsYl9rZXJuZWxfcGFnZShtaW5pY2FjaGVfYWRkcmVzcyk7CisKKwlyZXR1cm4gbWluaWNhY2hlX2FkZHJlc3M7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1pbmljYWNoZV9pbml0KHZvaWQpCit7CisJcGdkX3QgKnBnZDsKKwlwbWRfdCAqcG1kOworCisJc3Bpbl9sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CisKKwlwZ2QgPSBwZ2Rfb2Zmc2V0X2sobWluaWNhY2hlX2FkZHJlc3MpOworCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgcGdkLCBtaW5pY2FjaGVfYWRkcmVzcyk7CisJaWYgKCFwbWQpCisJCUJVRygpOworCW1pbmljYWNoZV9wdGUgPSBwdGVfYWxsb2Nfa2VybmVsKCZpbml0X21tLCBwbWQsIG1pbmljYWNoZV9hZGRyZXNzKTsKKwlpZiAoIW1pbmljYWNoZV9wdGUpCisJCUJVRygpOworCisJc3Bpbl91bmxvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKG1pbmljYWNoZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tLWFybXYuYyBiL2FyY2gvYXJtL21tL21tLWFybXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE4N2RiOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL21tLWFybXYuYwpAQCAtMCwwICsxLDc2MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9tbS1hcm12LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgUGFnZSB0YWJsZSBzbHVkZ2UgZm9yIEFSTSB2MyBhbmQgdjQgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisKKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2RlZmluZSBDUE9MSUNZX1VOQ0FDSEVECTAKKyNkZWZpbmUgQ1BPTElDWV9CVUZGRVJFRAkxCisjZGVmaW5lIENQT0xJQ1lfV1JJVEVUSFJPVUdICTIKKyNkZWZpbmUgQ1BPTElDWV9XUklURUJBQ0sJMworI2RlZmluZSBDUE9MSUNZX1dSSVRFQUxMT0MJNAorCitzdGF0aWMgdW5zaWduZWQgaW50IGNhY2hlcG9saWN5IF9faW5pdGRhdGEgPSBDUE9MSUNZX1dSSVRFQkFDSzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZWNjX21hc2sgX19pbml0ZGF0YSA9IDA7CitwZ3Byb3RfdCBwZ3Byb3Rfa2VybmVsOworCitFWFBPUlRfU1lNQk9MKHBncHJvdF9rZXJuZWwpOworCitzdHJ1Y3QgY2FjaGVwb2xpY3kgeworCWNvbnN0IGNoYXIJcG9saWN5WzE2XTsKKwl1bnNpZ25lZCBpbnQJY3JfbWFzazsKKwl1bnNpZ25lZCBpbnQJcG1kOworCXVuc2lnbmVkIGludAlwdGU7Cit9OworCitzdGF0aWMgc3RydWN0IGNhY2hlcG9saWN5IGNhY2hlX3BvbGljaWVzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5wb2xpY3kJCT0gInVuY2FjaGVkIiwKKwkJLmNyX21hc2sJPSBDUl9XfENSX0MsCisJCS5wbWQJCT0gUE1EX1NFQ1RfVU5DQUNIRUQsCisJCS5wdGUJCT0gMCwKKwl9LCB7CisJCS5wb2xpY3kJCT0gImJ1ZmZlcmVkIiwKKwkJLmNyX21hc2sJPSBDUl9DLAorCQkucG1kCQk9IFBNRF9TRUNUX0JVRkZFUkVELAorCQkucHRlCQk9IFBURV9CVUZGRVJBQkxFLAorCX0sIHsKKwkJLnBvbGljeQkJPSAid3JpdGV0aHJvdWdoIiwKKwkJLmNyX21hc2sJPSAwLAorCQkucG1kCQk9IFBNRF9TRUNUX1dULAorCQkucHRlCQk9IFBURV9DQUNIRUFCTEUsCisJfSwgeworCQkucG9saWN5CQk9ICJ3cml0ZWJhY2siLAorCQkuY3JfbWFzawk9IDAsCisJCS5wbWQJCT0gUE1EX1NFQ1RfV0IsCisJCS5wdGUJCT0gUFRFX0JVRkZFUkFCTEV8UFRFX0NBQ0hFQUJMRSwKKwl9LCB7CisJCS5wb2xpY3kJCT0gIndyaXRlYWxsb2MiLAorCQkuY3JfbWFzawk9IDAsCisJCS5wbWQJCT0gUE1EX1NFQ1RfV0JXQSwKKwkJLnB0ZQkJPSBQVEVfQlVGRkVSQUJMRXxQVEVfQ0FDSEVBQkxFLAorCX0KK307CisKKy8qCisgKiBUaGVzZSBhcmUgdXNlZnVsIGZvciBpZGVudGlmaW5nIGNhY2hlIGNvaGVyZW5jeQorICogcHJvYmxlbXMgYnkgYWxsb3dpbmcgdGhlIGNhY2hlIG9yIHRoZSBjYWNoZSBhbmQKKyAqIHdyaXRlYnVmZmVyIHRvIGJlIHR1cm5lZCBvZmYuICAoTm90ZTogdGhlIHdyaXRlCisgKiBidWZmZXIgc2hvdWxkIG5vdCBiZSBvbiBhbmQgdGhlIGNhY2hlIG9mZikuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9jYWNoZXBvbGljeShjaGFyICoqcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhY2hlX3BvbGljaWVzKTsgaSsrKSB7CisJCWludCBsZW4gPSBzdHJsZW4oY2FjaGVfcG9saWNpZXNbaV0ucG9saWN5KTsKKworCQlpZiAobWVtY21wKCpwLCBjYWNoZV9wb2xpY2llc1tpXS5wb2xpY3ksIGxlbikgPT0gMCkgeworCQkJY2FjaGVwb2xpY3kgPSBpOworCQkJY3JfYWxpZ25tZW50ICY9IH5jYWNoZV9wb2xpY2llc1tpXS5jcl9tYXNrOworCQkJY3Jfbm9fYWxpZ25tZW50ICY9IH5jYWNoZV9wb2xpY2llc1tpXS5jcl9tYXNrOworCQkJKnAgKz0gbGVuOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gQVJSQVlfU0laRShjYWNoZV9wb2xpY2llcykpCisJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IHVua25vd24gb3IgdW5zdXBwb3J0ZWQgY2FjaGUgcG9saWN5XG4iKTsKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKwlzZXRfY3IoY3JfYWxpZ25tZW50KTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X25vY2FjaGUoY2hhciAqKl9fdW51c2VkKQoreworCWNoYXIgKnAgPSAiYnVmZmVyZWQiOworCXByaW50ayhLRVJOX1dBUk5JTkcgIm5vY2FjaGUgaXMgZGVwcmVjYXRlZDsgdXNlIGNhY2hlcG9saWN5PSVzXG4iLCBwKTsKKwllYXJseV9jYWNoZXBvbGljeSgmcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9ub3dyaXRlKGNoYXIgKipfX3VudXNlZCkKK3sKKwljaGFyICpwID0gInVuY2FjaGVkIjsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJub3diIGlzIGRlcHJlY2F0ZWQ7IHVzZSBjYWNoZXBvbGljeT0lc1xuIiwgcCk7CisJZWFybHlfY2FjaGVwb2xpY3koJnApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfZWNjKGNoYXIgKipwKQoreworCWlmIChtZW1jbXAoKnAsICJvbiIsIDIpID09IDApIHsKKwkJZWNjX21hc2sgPSBQTURfUFJPVEVDVElPTjsKKwkJKnAgKz0gMjsKKwl9IGVsc2UgaWYgKG1lbWNtcCgqcCwgIm9mZiIsIDMpID09IDApIHsKKwkJZWNjX21hc2sgPSAwOworCQkqcCArPSAzOworCX0KK30KKworX19lYXJseV9wYXJhbSgibm9jYWNoZSIsIGVhcmx5X25vY2FjaGUpOworX19lYXJseV9wYXJhbSgibm93YiIsIGVhcmx5X25vd3JpdGUpOworX19lYXJseV9wYXJhbSgiY2FjaGVwb2xpY3k9IiwgZWFybHlfY2FjaGVwb2xpY3kpOworX19lYXJseV9wYXJhbSgiZWNjPSIsIGVhcmx5X2VjYyk7CisKK3N0YXRpYyBpbnQgX19pbml0IG5vYWxpZ25fc2V0dXAoY2hhciAqX191bnVzZWQpCit7CisJY3JfYWxpZ25tZW50ICY9IH5DUl9BOworCWNyX25vX2FsaWdubWVudCAmPSB+Q1JfQTsKKwlzZXRfY3IoY3JfYWxpZ25tZW50KTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibm9hbGlnbiIsIG5vYWxpZ25fc2V0dXApOworCisjZGVmaW5lIEZJUlNUX0tFUk5FTF9QR0RfTlIJKEZJUlNUX1VTRVJfUEdEX05SICsgVVNFUl9QVFJTX1BFUl9QR0QpCisKKy8qCisgKiBuZWVkIHRvIGdldCBhIDE2ayBwYWdlIGZvciBsZXZlbCAxCisgKi8KK3BnZF90ICpnZXRfcGdkX3Nsb3coc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcGdkX3QgKm5ld19wZ2QsICppbml0X3BnZDsKKwlwbWRfdCAqbmV3X3BtZCwgKmluaXRfcG1kOworCXB0ZV90ICpuZXdfcHRlLCAqaW5pdF9wdGU7CisKKwluZXdfcGdkID0gKHBnZF90ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAyKTsKKwlpZiAoIW5ld19wZ2QpCisJCWdvdG8gbm9fcGdkOworCisJbWVtemVybyhuZXdfcGdkLCBGSVJTVF9LRVJORUxfUEdEX05SICogc2l6ZW9mKHBnZF90KSk7CisKKwlpbml0X3BnZCA9IHBnZF9vZmZzZXRfaygwKTsKKworCWlmICghdmVjdG9yc19oaWdoKCkpIHsKKwkJLyoKKwkJICogVGhpcyBsb2NrIGlzIGhlcmUganVzdCB0byBzYXRpc2Z5IHBtZF9hbGxvYyBhbmQgcHRlX2xvY2sKKwkJICovCisJCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisKKwkJLyoKKwkJICogT24gQVJNLCBmaXJzdCBwYWdlIG11c3QgYWx3YXlzIGJlIGFsbG9jYXRlZCBzaW5jZSBpdAorCQkgKiBjb250YWlucyB0aGUgbWFjaGluZSB2ZWN0b3JzLgorCQkgKi8KKwkJbmV3X3BtZCA9IHBtZF9hbGxvYyhtbSwgbmV3X3BnZCwgMCk7CisJCWlmICghbmV3X3BtZCkKKwkJCWdvdG8gbm9fcG1kOworCisJCW5ld19wdGUgPSBwdGVfYWxsb2NfbWFwKG1tLCBuZXdfcG1kLCAwKTsKKwkJaWYgKCFuZXdfcHRlKQorCQkJZ290byBub19wdGU7CisKKwkJaW5pdF9wbWQgPSBwbWRfb2Zmc2V0KGluaXRfcGdkLCAwKTsKKwkJaW5pdF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9uZXN0ZWQoaW5pdF9wbWQsIDApOworCQlzZXRfcHRlKG5ld19wdGUsICppbml0X3B0ZSk7CisJCXB0ZV91bm1hcF9uZXN0ZWQoaW5pdF9wdGUpOworCQlwdGVfdW5tYXAobmV3X3B0ZSk7CisKKwkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCX0KKworCS8qCisJICogQ29weSBvdmVyIHRoZSBrZXJuZWwgYW5kIElPIFBHRCBlbnRyaWVzCisJICovCisJbWVtY3B5KG5ld19wZ2QgKyBGSVJTVF9LRVJORUxfUEdEX05SLCBpbml0X3BnZCArIEZJUlNUX0tFUk5FTF9QR0RfTlIsCisJCSAgICAgICAoUFRSU19QRVJfUEdEIC0gRklSU1RfS0VSTkVMX1BHRF9OUikgKiBzaXplb2YocGdkX3QpKTsKKworCWNsZWFuX2RjYWNoZV9hcmVhKG5ld19wZ2QsIFBUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOworCisJcmV0dXJuIG5ld19wZ2Q7CisKK25vX3B0ZToKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcG1kX2ZyZWUobmV3X3BtZCk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXdfcGdkLCAyKTsKKwlyZXR1cm4gTlVMTDsKKworbm9fcG1kOgorCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW5ld19wZ2QsIDIpOworCXJldHVybiBOVUxMOworCitub19wZ2Q6CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZnJlZV9wZ2Rfc2xvdyhwZ2RfdCAqcGdkKQoreworCXBtZF90ICpwbWQ7CisJc3RydWN0IHBhZ2UgKnB0ZTsKKworCWlmICghcGdkKQorCQlyZXR1cm47CisKKwkvKiBwZ2QgaXMgYWx3YXlzIHByZXNlbnQgYW5kIGdvb2QgKi8KKwlwbWQgPSAocG1kX3QgKilwZ2Q7CisJaWYgKHBtZF9ub25lKCpwbWQpKQorCQlnb3RvIGZyZWU7CisJaWYgKHBtZF9iYWQoKnBtZCkpIHsKKwkJcG1kX0VSUk9SKCpwbWQpOworCQlwbWRfY2xlYXIocG1kKTsKKwkJZ290byBmcmVlOworCX0KKworCXB0ZSA9IHBtZF9wYWdlKCpwbWQpOworCXBtZF9jbGVhcihwbWQpOworCWRlY19wYWdlX3N0YXRlKG5yX3BhZ2VfdGFibGVfcGFnZXMpOworCXB0ZV9mcmVlKHB0ZSk7CisJcG1kX2ZyZWUocG1kKTsKK2ZyZWU6CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcGdkLCAyKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIFNFQ1RJT04gUEdEIGJldHdlZW4gVklSVCBhbmQgUEhZUyBpbiBkb21haW4KKyAqIERPTUFJTiB3aXRoIHByb3RlY3Rpb24gUFJPVC4gIFRoaXMgb3BlcmF0ZXMgb24gaGFsZi0KKyAqIHBnZGlyIGVudHJ5IGluY3JlbWVudHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWxsb2NfaW5pdF9zZWN0aW9uKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBwaHlzLCBpbnQgcHJvdCkKK3sKKwlwbWRfdCAqcG1kcDsKKworCXBtZHAgPSBwbWRfb2Zmc2V0KHBnZF9vZmZzZXRfayh2aXJ0KSwgdmlydCk7CisJaWYgKHZpcnQgJiAoMSA8PCAyMCkpCisJCXBtZHArKzsKKworCSpwbWRwID0gX19wbWQocGh5cyB8IHByb3QpOworCWZsdXNoX3BtZF9lbnRyeShwbWRwKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIFNVUEVSIFNFQ1RJT04gUEdEIGJldHdlZW4gVklSVCBhbmQgUEhZUyB3aXRoIHByb3RlY3Rpb24gUFJPVAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FsbG9jX2luaXRfc3VwZXJzZWN0aW9uKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBwaHlzLCBpbnQgcHJvdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7CisJCWFsbG9jX2luaXRfc2VjdGlvbih2aXJ0LCBwaHlzICYgU1VQRVJTRUNUSU9OX01BU0ssCisJCQkJICAgcHJvdCB8IFBNRF9TRUNUX1NVUEVSKTsKKworCQl2aXJ0ICs9IChQR0RJUl9TSVpFIC8gMik7CisJCXBoeXMgKz0gKFBHRElSX1NJWkUgLyAyKTsKKwl9Cit9CisKKy8qCisgKiBBZGQgYSBQQUdFIG1hcHBpbmcgYmV0d2VlbiBWSVJUIGFuZCBQSFlTIGluIGRvbWFpbgorICogRE9NQUlOIHdpdGggcHJvdGVjdGlvbiBQUk9ULiAgTm90ZSB0aGF0IGR1ZSB0byB0aGUKKyAqIHdheSB3ZSBtYXAgdGhlIFBURXMsIHdlIG11c3QgYWxsb2NhdGUgdHdvIFBURV9TSVpFJ2QKKyAqIGJsb2NrcyAtIG9uZSBmb3IgdGhlIExpbnV4IHB0ZSB0YWJsZSwgYW5kIG9uZSBmb3IKKyAqIHRoZSBoYXJkd2FyZSBwdGUgdGFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWxsb2NfaW5pdF9wYWdlKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBpbnQgcHJvdF9sMSwgcGdwcm90X3QgcHJvdCkKK3sKKwlwbWRfdCAqcG1kcDsKKwlwdGVfdCAqcHRlcDsKKworCXBtZHAgPSBwbWRfb2Zmc2V0KHBnZF9vZmZzZXRfayh2aXJ0KSwgdmlydCk7CisKKwlpZiAocG1kX25vbmUoKnBtZHApKSB7CisJCXVuc2lnbmVkIGxvbmcgcG1kdmFsOworCQlwdGVwID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoMiAqIFBUUlNfUEVSX1BURSAqCisJCQkJCSAgICAgICBzaXplb2YocHRlX3QpKTsKKworCQlwbWR2YWwgPSBfX3BhKHB0ZXApIHwgcHJvdF9sMTsKKwkJcG1kcFswXSA9IF9fcG1kKHBtZHZhbCk7CisJCXBtZHBbMV0gPSBfX3BtZChwbWR2YWwgKyAyNTYgKiBzaXplb2YocHRlX3QpKTsKKwkJZmx1c2hfcG1kX2VudHJ5KHBtZHApOworCX0KKwlwdGVwID0gcHRlX29mZnNldF9rZXJuZWwocG1kcCwgdmlydCk7CisKKwlzZXRfcHRlKHB0ZXAsIHBmbl9wdGUocGh5cyA+PiBQQUdFX1NISUZULCBwcm90KSk7Cit9CisKKy8qCisgKiBDbGVhciBhbnkgUEdEIG1hcHBpbmcuICBPbiBhIHR3by1sZXZlbCBwYWdlIHRhYmxlIHN5c3RlbSwKKyAqIHRoZSBjbGVhcmFuY2UgaXMgZG9uZSBieSB0aGUgbWlkZGxlLWxldmVsIGZ1bmN0aW9ucyAocG1kKQorICogcmF0aGVyIHRoYW4gdGhlIHRvcC1sZXZlbCAocGdkKSBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgdmlydCkKK3sKKwlwbWRfY2xlYXIocG1kX29mZnNldChwZ2Rfb2Zmc2V0X2sodmlydCksIHZpcnQpKTsKK30KKworc3RydWN0IG1lbV90eXBlcyB7CisJdW5zaWduZWQgaW50CXByb3RfcHRlOworCXVuc2lnbmVkIGludAlwcm90X2wxOworCXVuc2lnbmVkIGludAlwcm90X3NlY3Q7CisJdW5zaWduZWQgaW50CWRvbWFpbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX3R5cGVzIG1lbV90eXBlc1tdIF9faW5pdGRhdGEgPSB7CisJW01UX0RFVklDRV0gPSB7CisJCS5wcm90X3B0ZSAgPSBMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9ESVJUWSB8CisJCQkJTF9QVEVfV1JJVEUsCisJCS5wcm90X2wxICAgPSBQTURfVFlQRV9UQUJMRSwKKwkJLnByb3Rfc2VjdCA9IFBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9VTkNBQ0hFRCB8CisJCQkJUE1EX1NFQ1RfQVBfV1JJVEUsCisJCS5kb21haW4gICAgPSBET01BSU5fSU8sCisJfSwKKwlbTVRfQ0FDSEVDTEVBTl0gPSB7CisJCS5wcm90X3NlY3QgPSBQTURfVFlQRV9TRUNULAorCQkuZG9tYWluICAgID0gRE9NQUlOX0tFUk5FTCwKKwl9LAorCVtNVF9NSU5JQ0xFQU5dID0geworCQkucHJvdF9zZWN0ID0gUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX01JTklDQUNIRSwKKwkJLmRvbWFpbiAgICA9IERPTUFJTl9LRVJORUwsCisJfSwKKwlbTVRfTE9XX1ZFQ1RPUlNdID0geworCQkucHJvdF9wdGUgID0gTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfRElSVFkgfAorCQkJCUxfUFRFX0VYRUMsCisJCS5wcm90X2wxICAgPSBQTURfVFlQRV9UQUJMRSwKKwkJLmRvbWFpbiAgICA9IERPTUFJTl9VU0VSLAorCX0sCisJW01UX0hJR0hfVkVDVE9SU10gPSB7CisJCS5wcm90X3B0ZSAgPSBMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9ESVJUWSB8CisJCQkJTF9QVEVfVVNFUiB8IExfUFRFX0VYRUMsCisJCS5wcm90X2wxICAgPSBQTURfVFlQRV9UQUJMRSwKKwkJLmRvbWFpbiAgICA9IERPTUFJTl9VU0VSLAorCX0sCisJW01UX01FTU9SWV0gPSB7CisJCS5wcm90X3NlY3QgPSBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUsCisJCS5kb21haW4gICAgPSBET01BSU5fS0VSTkVMLAorCX0sCisJW01UX1JPTV0gPSB7CisJCS5wcm90X3NlY3QgPSBQTURfVFlQRV9TRUNULAorCQkuZG9tYWluICAgID0gRE9NQUlOX0tFUk5FTCwKKwl9LAorCVtNVF9JWFAyMDAwX0RFVklDRV0gPSB7IC8qIElYUDI0MDAgcmVxdWlyZXMgWENCPTEwMSBmb3Igb24tY2hpcCBJL08gKi8KKwkJLnByb3RfcHRlICA9IExfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX0RJUlRZIHwKKwkJCQlMX1BURV9XUklURSwKKwkJLnByb3RfbDEgICA9IFBNRF9UWVBFX1RBQkxFLAorCQkucHJvdF9zZWN0ID0gUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX1VOQ0FDSEVEIHwKKwkJCQlQTURfU0VDVF9BUF9XUklURSB8IFBNRF9TRUNUX0JVRkZFUkFCTEUgfAorCQkJCVBNRF9TRUNUX1RFWCgxKSwKKwkJLmRvbWFpbiAgICA9IERPTUFJTl9JTywKKwl9Cit9OworCisvKgorICogQWRqdXN0IHRoZSBQTUQgc2VjdGlvbiBlbnRyaWVzIGFjY29yZGluZyB0byB0aGUgQ1BVIGluIHVzZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGJ1aWxkX21lbV90eXBlX3RhYmxlKHZvaWQpCit7CisJc3RydWN0IGNhY2hlcG9saWN5ICpjcDsKKwl1bnNpZ25lZCBpbnQgY3IgPSBnZXRfY3IoKTsKKwlpbnQgY3B1X2FyY2ggPSBjcHVfYXJjaGl0ZWN0dXJlKCk7CisJaW50IGk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUpCisJaWYgKGNhY2hlcG9saWN5ID4gQ1BPTElDWV9CVUZGRVJFRCkKKwkJY2FjaGVwb2xpY3kgPSBDUE9MSUNZX0JVRkZFUkVEOworI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gpCisJaWYgKGNhY2hlcG9saWN5ID4gQ1BPTElDWV9XUklURVRIUk9VR0gpCisJCWNhY2hlcG9saWN5ID0gQ1BPTElDWV9XUklURVRIUk9VR0g7CisjZW5kaWYKKwlpZiAoY3B1X2FyY2ggPCBDUFVfQVJDSF9BUk12NSkgeworCQlpZiAoY2FjaGVwb2xpY3kgPj0gQ1BPTElDWV9XUklURUFMTE9DKQorCQkJY2FjaGVwb2xpY3kgPSBDUE9MSUNZX1dSSVRFQkFDSzsKKwkJZWNjX21hc2sgPSAwOworCX0KKworCWlmIChjcHVfYXJjaCA8PSBDUFVfQVJDSF9BUk12NSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZW1fdHlwZXMpOyBpKyspIHsKKwkJCWlmIChtZW1fdHlwZXNbaV0ucHJvdF9sMSkKKwkJCQltZW1fdHlwZXNbaV0ucHJvdF9sMSB8PSBQTURfQklUNDsKKwkJCWlmIChtZW1fdHlwZXNbaV0ucHJvdF9zZWN0KQorCQkJCW1lbV90eXBlc1tpXS5wcm90X3NlY3QgfD0gUE1EX0JJVDQ7CisJCX0KKwl9CisKKwkvKgorCSAqIEFSTXY2IGFuZCBhYm92ZSBoYXZlIGV4dGVuZGVkIHBhZ2UgdGFibGVzLgorCSAqLworCWlmIChjcHVfYXJjaCA+PSBDUFVfQVJDSF9BUk12NiAmJiAoY3IgJiBDUl9YUCkpIHsKKwkJLyoKKwkJICogYml0IDQgYmVjb21lcyBYTiB3aGljaCB3ZSBtdXN0IGNsZWFyIGZvciB0aGUKKwkJICoga2VybmVsIG1lbW9yeSBtYXBwaW5nLgorCQkgKi8KKwkJbWVtX3R5cGVzW01UX01FTU9SWV0ucHJvdF9zZWN0ICY9IH5QTURfQklUNDsKKwkJbWVtX3R5cGVzW01UX1JPTV0ucHJvdF9zZWN0ICY9IH5QTURfQklUNDsKKwkJLyoKKwkJICogTWFyayBjYWNoZSBjbGVhbiBhcmVhcyByZWFkIG9ubHkgZnJvbSBTVkMgbW9kZQorCQkgKiBhbmQgbm8gYWNjZXNzIGZyb20gdXNlcnNwYWNlLgorCQkgKi8KKwkJbWVtX3R5cGVzW01UX01JTklDTEVBTl0ucHJvdF9zZWN0IHw9IFBNRF9TRUNUX0FQWHxQTURfU0VDVF9BUF9XUklURTsKKwkJbWVtX3R5cGVzW01UX0NBQ0hFQ0xFQU5dLnByb3Rfc2VjdCB8PSBQTURfU0VDVF9BUFh8UE1EX1NFQ1RfQVBfV1JJVEU7CisJfQorCisJY3AgPSAmY2FjaGVfcG9saWNpZXNbY2FjaGVwb2xpY3ldOworCisJaWYgKGNwdV9hcmNoID49IENQVV9BUkNIX0FSTXY1KSB7CisJCW1lbV90eXBlc1tNVF9MT1dfVkVDVE9SU10ucHJvdF9wdGUgfD0gY3AtPnB0ZSAmIFBURV9DQUNIRUFCTEU7CisJCW1lbV90eXBlc1tNVF9ISUdIX1ZFQ1RPUlNdLnByb3RfcHRlIHw9IGNwLT5wdGUgJiBQVEVfQ0FDSEVBQkxFOworCX0gZWxzZSB7CisJCW1lbV90eXBlc1tNVF9MT1dfVkVDVE9SU10ucHJvdF9wdGUgfD0gY3AtPnB0ZTsKKwkJbWVtX3R5cGVzW01UX0hJR0hfVkVDVE9SU10ucHJvdF9wdGUgfD0gY3AtPnB0ZTsKKwkJbWVtX3R5cGVzW01UX01JTklDTEVBTl0ucHJvdF9zZWN0ICY9IH5QTURfU0VDVF9URVgoMSk7CisJfQorCisJbWVtX3R5cGVzW01UX0xPV19WRUNUT1JTXS5wcm90X2wxIHw9IGVjY19tYXNrOworCW1lbV90eXBlc1tNVF9ISUdIX1ZFQ1RPUlNdLnByb3RfbDEgfD0gZWNjX21hc2s7CisJbWVtX3R5cGVzW01UX01FTU9SWV0ucHJvdF9zZWN0IHw9IGVjY19tYXNrIHwgY3AtPnBtZDsKKwltZW1fdHlwZXNbTVRfUk9NXS5wcm90X3NlY3QgfD0gY3AtPnBtZDsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgdiA9IHBncHJvdF92YWwocHJvdGVjdGlvbl9tYXBbaV0pOworCQl2ICY9ICh+KFBURV9CVUZGRVJBQkxFfFBURV9DQUNIRUFCTEUpKSB8IGNwLT5wdGU7CisJCXByb3RlY3Rpb25fbWFwW2ldID0gX19wZ3Byb3Qodik7CisJfQorCisJcGdwcm90X2tlcm5lbCA9IF9fcGdwcm90KExfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8CisJCQkJIExfUFRFX0RJUlRZIHwgTF9QVEVfV1JJVEUgfAorCQkJCSBMX1BURV9FWEVDIHwgY3AtPnB0ZSk7CisKKwlzd2l0Y2ggKGNwLT5wbWQpIHsKKwljYXNlIFBNRF9TRUNUX1dUOgorCQltZW1fdHlwZXNbTVRfQ0FDSEVDTEVBTl0ucHJvdF9zZWN0IHw9IFBNRF9TRUNUX1dUOworCQlicmVhazsKKwljYXNlIFBNRF9TRUNUX1dCOgorCWNhc2UgUE1EX1NFQ1RfV0JXQToKKwkJbWVtX3R5cGVzW01UX0NBQ0hFQ0xFQU5dLnByb3Rfc2VjdCB8PSBQTURfU0VDVF9XQjsKKwkJYnJlYWs7CisJfQorCXByaW50aygiTWVtb3J5IHBvbGljeTogRUNDICVzYWJsZWQsIERhdGEgY2FjaGUgJXNcbiIsCisJCWVjY19tYXNrID8gImVuIiA6ICJkaXMiLCBjcC0+cG9saWN5KTsKK30KKworI2RlZmluZSB2ZWN0b3JzX2Jhc2UoKQkodmVjdG9yc19oaWdoKCkgPyAweGZmZmYwMDAwIDogMCkKKworLyoKKyAqIENyZWF0ZSB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cmllcyBhbmQgYW55IG5lY2Vzc2FyeQorICogcGFnZSB0YWJsZXMgZm9yIHRoZSBtYXBwaW5nIHNwZWNpZmllZCBieSBgbWQnLiAgV2UKKyAqIGFyZSBhYmxlIHRvIGNvcGUgaGVyZSB3aXRoIHZhcnlpbmcgc2l6ZXMgYW5kIGFkZHJlc3MKKyAqIG9mZnNldHMsIGFuZCB3ZSB0YWtlIGZ1bGwgYWR2YW50YWdlIG9mIHNlY3Rpb25zIGFuZAorICogc3VwZXJzZWN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGNyZWF0ZV9tYXBwaW5nKHN0cnVjdCBtYXBfZGVzYyAqbWQpCit7CisJdW5zaWduZWQgbG9uZyB2aXJ0LCBsZW5ndGg7CisJaW50IHByb3Rfc2VjdCwgcHJvdF9sMSwgZG9tYWluOworCXBncHJvdF90IHByb3RfcHRlOworCWxvbmcgb2ZmOworCisJaWYgKG1kLT52aXJ0dWFsICE9IHZlY3RvcnNfYmFzZSgpICYmIG1kLT52aXJ0dWFsIDwgVEFTS19TSVpFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJVRzogbm90IGNyZWF0aW5nIG1hcHBpbmcgZm9yICIKKwkJICAgICAgICIweCUwOGx4IGF0IDB4JTA4bHggaW4gdXNlciByZWdpb25cbiIsCisJCSAgICAgICBtZC0+cGh5c2ljYWwsIG1kLT52aXJ0dWFsKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgobWQtPnR5cGUgPT0gTVRfREVWSUNFIHx8IG1kLT50eXBlID09IE1UX1JPTSkgJiYKKwkgICAgbWQtPnZpcnR1YWwgPj0gUEFHRV9PRkZTRVQgJiYgbWQtPnZpcnR1YWwgPCBWTUFMTE9DX0VORCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVUc6IG1hcHBpbmcgZm9yIDB4JTA4bHggYXQgMHglMDhseCAiCisJCSAgICAgICAib3ZlcmxhcHMgdm1hbGxvYyBzcGFjZVxuIiwKKwkJICAgICAgIG1kLT5waHlzaWNhbCwgbWQtPnZpcnR1YWwpOworCX0KKworCWRvbWFpbgkgID0gbWVtX3R5cGVzW21kLT50eXBlXS5kb21haW47CisJcHJvdF9wdGUgID0gX19wZ3Byb3QobWVtX3R5cGVzW21kLT50eXBlXS5wcm90X3B0ZSk7CisJcHJvdF9sMSAgID0gbWVtX3R5cGVzW21kLT50eXBlXS5wcm90X2wxIHwgUE1EX0RPTUFJTihkb21haW4pOworCXByb3Rfc2VjdCA9IG1lbV90eXBlc1ttZC0+dHlwZV0ucHJvdF9zZWN0IHwgUE1EX0RPTUFJTihkb21haW4pOworCisJdmlydCAgID0gbWQtPnZpcnR1YWw7CisJb2ZmICAgID0gbWQtPnBoeXNpY2FsIC0gdmlydDsKKwlsZW5ndGggPSBtZC0+bGVuZ3RoOworCisJaWYgKG1lbV90eXBlc1ttZC0+dHlwZV0ucHJvdF9sMSA9PSAwICYmCisJICAgICh2aXJ0ICYgMHhmZmZmZiB8fCAodmlydCArIG9mZikgJiAweGZmZmZmIHx8ICh2aXJ0ICsgbGVuZ3RoKSAmIDB4ZmZmZmYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJVRzogbWFwIGZvciAweCUwOGx4IGF0IDB4JTA4bHggY2FuIG5vdCAiCisJCSAgICAgICAiYmUgbWFwcGVkIHVzaW5nIHBhZ2VzLCBpZ25vcmluZy5cbiIsCisJCSAgICAgICBtZC0+cGh5c2ljYWwsIG1kLT52aXJ0dWFsKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICgodmlydCAmIDB4ZmZmZmYgfHwgKHZpcnQgKyBvZmYpICYgMHhmZmZmZikgJiYgbGVuZ3RoID49IFBBR0VfU0laRSkgeworCQlhbGxvY19pbml0X3BhZ2UodmlydCwgdmlydCArIG9mZiwgcHJvdF9sMSwgcHJvdF9wdGUpOworCisJCXZpcnQgICArPSBQQUdFX1NJWkU7CisJCWxlbmd0aCAtPSBQQUdFX1NJWkU7CisJfQorCisJLyogTi5CLglBUk12NiBzdXBlcnNlY3Rpb25zIGFyZSBvbmx5IGRlZmluZWQgdG8gd29yayB3aXRoIGRvbWFpbiAwLgorCSAqCVNpbmNlIGRvbWFpbiBhc3NpZ25tZW50cyBjYW4gaW4gZmFjdCBiZSBhcmJpdHJhcnksIHRoZQorCSAqCSdkb21haW4gPT0gMCcgY2hlY2sgYmVsb3cgaXMgcmVxdWlyZWQgdG8gaW5zdXJlIHRoYXQgQVJNdjYKKwkgKglzdXBlcnNlY3Rpb25zIGFyZSBvbmx5IGFsbG9jYXRlZCBmb3IgZG9tYWluIDAgcmVnYXJkbGVzcworCSAqCW9mIHRoZSBhY3R1YWwgZG9tYWluIGFzc2lnbm1lbnRzIGluIHVzZS4KKwkgKi8KKwlpZiAoY3B1X2FyY2hpdGVjdHVyZSgpID49IENQVV9BUkNIX0FSTXY2ICYmIGRvbWFpbiA9PSAwKSB7CisJCS8qIEFsaWduIHRvIHN1cGVyc2VjdGlvbiBib3VuZGFyeSAqLworCQl3aGlsZSAoKHZpcnQgJiB+U1VQRVJTRUNUSU9OX01BU0sgfHwgKHZpcnQgKyBvZmYpICYKKwkJCX5TVVBFUlNFQ1RJT05fTUFTSykgJiYgbGVuZ3RoID49IChQR0RJUl9TSVpFIC8gMikpIHsKKwkJCWFsbG9jX2luaXRfc2VjdGlvbih2aXJ0LCB2aXJ0ICsgb2ZmLCBwcm90X3NlY3QpOworCisJCQl2aXJ0ICAgKz0gKFBHRElSX1NJWkUgLyAyKTsKKwkJCWxlbmd0aCAtPSAoUEdESVJfU0laRSAvIDIpOworCQl9CisKKwkJd2hpbGUgKGxlbmd0aCA+PSBTVVBFUlNFQ1RJT05fU0laRSkgeworCQkJYWxsb2NfaW5pdF9zdXBlcnNlY3Rpb24odmlydCwgdmlydCArIG9mZiwgcHJvdF9zZWN0KTsKKworCQkJdmlydCAgICs9IFNVUEVSU0VDVElPTl9TSVpFOworCQkJbGVuZ3RoIC09IFNVUEVSU0VDVElPTl9TSVpFOworCQl9CisJfQorCisJLyoKKwkgKiBBIHNlY3Rpb24gbWFwcGluZyBjb3ZlcnMgaGFsZiBhICJwZ2RpciIgZW50cnkuCisJICovCisJd2hpbGUgKGxlbmd0aCA+PSAoUEdESVJfU0laRSAvIDIpKSB7CisJCWFsbG9jX2luaXRfc2VjdGlvbih2aXJ0LCB2aXJ0ICsgb2ZmLCBwcm90X3NlY3QpOworCisJCXZpcnQgICArPSAoUEdESVJfU0laRSAvIDIpOworCQlsZW5ndGggLT0gKFBHRElSX1NJWkUgLyAyKTsKKwl9CisKKwl3aGlsZSAobGVuZ3RoID49IFBBR0VfU0laRSkgeworCQlhbGxvY19pbml0X3BhZ2UodmlydCwgdmlydCArIG9mZiwgcHJvdF9sMSwgcHJvdF9wdGUpOworCisJCXZpcnQgICArPSBQQUdFX1NJWkU7CisJCWxlbmd0aCAtPSBQQUdFX1NJWkU7CisJfQorfQorCisvKgorICogSW4gb3JkZXIgdG8gc29mdC1ib290LCB3ZSBuZWVkIHRvIGluc2VydCBhIDE6MSBtYXBwaW5nIGluIHBsYWNlIG9mCisgKiB0aGUgdXNlci1tb2RlIHBhZ2VzLiAgVGhpcyB3aWxsIHRoZW4gZW5zdXJlIHRoYXQgd2UgaGF2ZSBwcmVkaWN0YWJsZQorICogcmVzdWx0cyB3aGVuIHR1cm5pbmcgdGhlIG1tdSBvZmYKKyAqLwordm9pZCBzZXR1cF9tbV9mb3JfcmVib290KGNoYXIgbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBtZHZhbDsKKwlwZ2RfdCAqcGdkOworCXBtZF90ICpwbWQ7CisJaW50IGk7CisJaW50IGNwdV9hcmNoID0gY3B1X2FyY2hpdGVjdHVyZSgpOworCisJaWYgKGN1cnJlbnQtPm1tICYmIGN1cnJlbnQtPm1tLT5wZ2QpCisJCXBnZCA9IGN1cnJlbnQtPm1tLT5wZ2Q7CisJZWxzZQorCQlwZ2QgPSBpbml0X21tLnBnZDsKKworCWZvciAoaSA9IDA7IGkgPCBGSVJTVF9VU0VSX1BHRF9OUiArIFVTRVJfUFRSU19QRVJfUEdEOyBpKyspIHsKKwkJcG1kdmFsID0gKGkgPDwgUEdESVJfU0hJRlQpIHwKKwkJCSBQTURfU0VDVF9BUF9XUklURSB8IFBNRF9TRUNUX0FQX1JFQUQgfAorCQkJIFBNRF9UWVBFX1NFQ1Q7CisJCWlmIChjcHVfYXJjaCA8PSBDUFVfQVJDSF9BUk12NSkKKwkJCXBtZHZhbCB8PSBQTURfQklUNDsKKwkJcG1kID0gcG1kX29mZnNldChwZ2QgKyBpLCBpIDw8IFBHRElSX1NISUZUKTsKKwkJcG1kWzBdID0gX19wbWQocG1kdmFsKTsKKwkJcG1kWzFdID0gX19wbWQocG1kdmFsICsgKDEgPDwgKFBHRElSX1NISUZUIC0gMSkpKTsKKwkJZmx1c2hfcG1kX2VudHJ5KHBtZCk7CisJfQorfQorCitleHRlcm4gdm9pZCBfc3RleHQsIF9ldGV4dDsKKworLyoKKyAqIFNldHVwIGluaXRpYWwgbWFwcGluZ3MuICBXZSB1c2UgdGhlIHBhZ2Ugd2UgYWxsb2NhdGVkIGZvciB6ZXJvIHBhZ2UgdG8gaG9sZAorICogdGhlIG1hcHBpbmdzLCB3aGljaCB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSB0aGUgdmVjdG9ycyBpbiB0cmFwc19pbml0KCkuCisgKiBUaGUgbWFwcGluZ3MgbXVzdCBiZSBpbiB2aXJ0dWFsIGFkZHJlc3Mgb3JkZXIuCisgKi8KK3ZvaWQgX19pbml0IG1lbXRhYmxlX2luaXQoc3RydWN0IG1lbWluZm8gKm1pKQoreworCXN0cnVjdCBtYXBfZGVzYyAqaW5pdF9tYXBzLCAqcCwgKnE7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKKwlpbnQgaTsKKworCWJ1aWxkX21lbV90eXBlX3RhYmxlKCk7CisKKwlpbml0X21hcHMgPSBwID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoUEFHRV9TSVpFKTsKKworI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCisJcC0+cGh5c2ljYWwgICA9IENPTkZJR19YSVBfUEhZU19BRERSICYgUE1EX01BU0s7CisJcC0+dmlydHVhbCAgICA9ICh1bnNpZ25lZCBsb25nKSZfc3RleHQgJiBQTURfTUFTSzsKKwlwLT5sZW5ndGggICAgID0gKCh1bnNpZ25lZCBsb25nKSZfZXRleHQgLSBwLT52aXJ0dWFsICsgflBNRF9NQVNLKSAmIFBNRF9NQVNLOworCXAtPnR5cGUgICAgICAgPSBNVF9ST007CisJcCArKzsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9iYW5rczsgaSsrKSB7CisJCWlmIChtaS0+YmFua1tpXS5zaXplID09IDApCisJCQljb250aW51ZTsKKworCQlwLT5waHlzaWNhbCAgID0gbWktPmJhbmtbaV0uc3RhcnQ7CisJCXAtPnZpcnR1YWwgICAgPSBfX3BoeXNfdG9fdmlydChwLT5waHlzaWNhbCk7CisJCXAtPmxlbmd0aCAgICAgPSBtaS0+YmFua1tpXS5zaXplOworCQlwLT50eXBlICAgICAgID0gTVRfTUVNT1JZOworCQlwICsrOworCX0KKworI2lmZGVmIEZMVVNIX0JBU0UKKwlwLT5waHlzaWNhbCAgID0gRkxVU0hfQkFTRV9QSFlTOworCXAtPnZpcnR1YWwgICAgPSBGTFVTSF9CQVNFOworCXAtPmxlbmd0aCAgICAgPSBQR0RJUl9TSVpFOworCXAtPnR5cGUgICAgICAgPSBNVF9DQUNIRUNMRUFOOworCXAgKys7CisjZW5kaWYKKworI2lmZGVmIEZMVVNIX0JBU0VfTUlOSUNBQ0hFCisJcC0+cGh5c2ljYWwgICA9IEZMVVNIX0JBU0VfUEhZUyArIFBHRElSX1NJWkU7CisJcC0+dmlydHVhbCAgICA9IEZMVVNIX0JBU0VfTUlOSUNBQ0hFOworCXAtPmxlbmd0aCAgICAgPSBQR0RJUl9TSVpFOworCXAtPnR5cGUgICAgICAgPSBNVF9NSU5JQ0xFQU47CisJcCArKzsKKyNlbmRpZgorCisJLyoKKwkgKiBHbyB0aHJvdWdoIHRoZSBpbml0aWFsIG1hcHBpbmdzLCBidXQgY2xlYXIgb3V0IGFueQorCSAqIHBnZGlyIGVudHJpZXMgdGhhdCBhcmUgbm90IGluIHRoZSBkZXNjcmlwdGlvbi4KKwkgKi8KKwlxID0gaW5pdF9tYXBzOworCWRvIHsKKwkJaWYgKGFkZHJlc3MgPCBxLT52aXJ0dWFsIHx8IHEgPT0gcCkgeworCQkJY2xlYXJfbWFwcGluZyhhZGRyZXNzKTsKKwkJCWFkZHJlc3MgKz0gUEdESVJfU0laRTsKKwkJfSBlbHNlIHsKKwkJCWNyZWF0ZV9tYXBwaW5nKHEpOworCisJCQlhZGRyZXNzID0gcS0+dmlydHVhbCArIHEtPmxlbmd0aDsKKwkJCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBHRElSX1NJWkUgLSAxKSAmIFBHRElSX01BU0s7CisKKwkJCXEgKys7CisJCX0KKwl9IHdoaWxlIChhZGRyZXNzICE9IDApOworCisJLyoKKwkgKiBDcmVhdGUgYSBtYXBwaW5nIGZvciB0aGUgbWFjaGluZSB2ZWN0b3JzIGF0IHRoZSBoaWdoLXZlY3RvcnMKKwkgKiBsb2NhdGlvbiAoMHhmZmZmMDAwMCkuICBJZiB3ZSBhcmVuJ3QgdXNpbmcgaGlnaC12ZWN0b3JzLCBhbHNvCisJICogY3JlYXRlIGEgbWFwcGluZyBhdCB0aGUgbG93LXZlY3RvcnMgdmlydHVhbCBhZGRyZXNzLgorCSAqLworCWluaXRfbWFwcy0+cGh5c2ljYWwgICA9IHZpcnRfdG9fcGh5cyhpbml0X21hcHMpOworCWluaXRfbWFwcy0+dmlydHVhbCAgICA9IDB4ZmZmZjAwMDA7CisJaW5pdF9tYXBzLT5sZW5ndGggICAgID0gUEFHRV9TSVpFOworCWluaXRfbWFwcy0+dHlwZSAgICAgICA9IE1UX0hJR0hfVkVDVE9SUzsKKwljcmVhdGVfbWFwcGluZyhpbml0X21hcHMpOworCisJaWYgKCF2ZWN0b3JzX2hpZ2goKSkgeworCQlpbml0X21hcHMtPnZpcnR1YWwgPSAwOworCQlpbml0X21hcHMtPnR5cGUgPSBNVF9MT1dfVkVDVE9SUzsKKwkJY3JlYXRlX21hcHBpbmcoaW5pdF9tYXBzKTsKKwl9CisKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKwlmbHVzaF90bGJfYWxsKCk7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBtYXBwaW5ncworICovCit2b2lkIF9faW5pdCBpb3RhYmxlX2luaXQoc3RydWN0IG1hcF9kZXNjICppb19kZXNjLCBpbnQgbnIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKwkJY3JlYXRlX21hcHBpbmcoaW9fZGVzYyArIGkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZyZWVfbWVtbWFwKGludCBub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQoreworCXN0cnVjdCBwYWdlICpzdGFydF9wZywgKmVuZF9wZzsKKwl1bnNpZ25lZCBsb25nIHBnLCBwZ2VuZDsKKworCS8qCisJICogQ29udmVydCBzdGFydF9wZm4vZW5kX3BmbiB0byBhIHN0cnVjdCBwYWdlIHBvaW50ZXIuCisJICovCisJc3RhcnRfcGcgPSBwZm5fdG9fcGFnZShzdGFydF9wZm4pOworCWVuZF9wZyA9IHBmbl90b19wYWdlKGVuZF9wZm4pOworCisJLyoKKwkgKiBDb252ZXJ0IHRvIHBoeXNpY2FsIGFkZHJlc3NlcywgYW5kCisJICogcm91bmQgc3RhcnQgdXB3YXJkcyBhbmQgZW5kIGRvd253YXJkcy4KKwkgKi8KKwlwZyA9IFBBR0VfQUxJR04oX19wYShzdGFydF9wZykpOworCXBnZW5kID0gX19wYShlbmRfcGcpICYgUEFHRV9NQVNLOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgZnJlZSBwYWdlcyBiZXR3ZWVuIHRoZXNlLAorCSAqIGZyZWUgdGhlIHNlY3Rpb24gb2YgdGhlIG1lbW1hcCBhcnJheS4KKwkgKi8KKwlpZiAocGcgPCBwZ2VuZCkKKwkJZnJlZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLCBwZywgcGdlbmQgLSBwZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3VudXNlZF9tZW1tYXBfbm9kZShpbnQgbm9kZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCXVuc2lnbmVkIGxvbmcgYmFua19zdGFydCwgcHJldl9iYW5rX2VuZCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKgorCSAqIFtGSVhNRV0gVGhpcyByZWxpZXMgb24gZWFjaCBiYW5rIGJlaW5nIGluIGFkZHJlc3Mgb3JkZXIuICBUaGlzCisJICogbWF5IG5vdCBiZSB0aGUgY2FzZSwgZXNwZWNpYWxseSBpZiB0aGUgdXNlciBoYXMgcHJvdmlkZWQgdGhlCisJICogaW5mb3JtYXRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspIHsKKwkJaWYgKG1pLT5iYW5rW2ldLnNpemUgPT0gMCB8fCBtaS0+YmFua1tpXS5ub2RlICE9IG5vZGUpCisJCQljb250aW51ZTsKKworCQliYW5rX3N0YXJ0ID0gbWktPmJhbmtbaV0uc3RhcnQgPj4gUEFHRV9TSElGVDsKKwkJaWYgKGJhbmtfc3RhcnQgPCBwcmV2X2JhbmtfZW5kKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk1FTTogdW5vcmRlcmVkIG1lbW9yeSBiYW5rcy4gICIKKwkJCQkiTm90IGZyZWVpbmcgbWVtbWFwLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhZCBhIHByZXZpb3VzIGJhbmssIGFuZCB0aGVyZSBpcyBhIHNwYWNlCisJCSAqIGJldHdlZW4gdGhlIGN1cnJlbnQgYmFuayBhbmQgdGhlIHByZXZpb3VzLCBmcmVlIGl0LgorCQkgKi8KKwkJaWYgKHByZXZfYmFua19lbmQgJiYgcHJldl9iYW5rX2VuZCAhPSBiYW5rX3N0YXJ0KQorCQkJZnJlZV9tZW1tYXAobm9kZSwgcHJldl9iYW5rX2VuZCwgYmFua19zdGFydCk7CisKKwkJcHJldl9iYW5rX2VuZCA9IFBBR0VfQUxJR04obWktPmJhbmtbaV0uc3RhcnQgKworCQkJCQkgICBtaS0+YmFua1tpXS5zaXplKSA+PiBQQUdFX1NISUZUOworCX0KK30KKworLyoKKyAqIFRoZSBtZW1fbWFwIGFycmF5IGNhbiBnZXQgdmVyeSBiaWcuICBGcmVlCisgKiB0aGUgdW51c2VkIGFyZWEgb2YgdGhlIG1lbW9yeSBtYXAuCisgKi8KK3ZvaWQgX19pbml0IGNyZWF0ZV9tZW1tYXBfaG9sZXMoc3RydWN0IG1lbWluZm8gKm1pKQoreworCWludCBub2RlOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKKwkJZnJlZV91bnVzZWRfbWVtbWFwX25vZGUobm9kZSwgbWkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW1hcC5jIGIvYXJjaC9hcm0vbW0vbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzRiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9tbWFwLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vbW1hcC5jCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NobS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIENPTE9VUl9BTElHTihhZGRyLHBnb2ZmKQkJXAorCSgoKChhZGRyKStTSE1MQkEtMSkmfihTSE1MQkEtMSkpICsJXAorCSAoKChwZ29mZik8PFBBR0VfU0hJRlQpICYgKFNITUxCQS0xKSkpCisKKy8qCisgKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHNoYXJlZCBtYXBwaW5ncyBhcmUgY29ycmVjdGx5IGFsaWduZWQgdG8KKyAqIGF2b2lkIGFsaWFzaW5nIGlzc3VlcyB3aXRoIFZJUFQgY2FjaGVzLiAgV2UgbmVlZCB0byBlbnN1cmUgdGhhdAorICogYSBzcGVjaWZpYyBwYWdlIG9mIGFuIG9iamVjdCBpcyBhbHdheXMgbWFwcGVkIGF0IGEgbXVsdGlwbGUgb2YKKyAqIFNITUxCQSBieXRlcy4KKyAqCisgKiBXZSB1bmNvbmRpdGlvbmFsbHkgcHJvdmlkZSB0aGlzIGZ1bmN0aW9uIGZvciBhbGwgY2FzZXMsIGhvd2V2ZXIKKyAqIGluIHRoZSBWSVZUIGNhc2UsIHdlIG9wdGltaXNlIG91dCB0aGUgYWxpZ25tZW50IHJ1bGVzLgorICovCit1bnNpZ25lZCBsb25nCithcmNoX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworI2lmZGVmIENPTkZJR19DUFVfVjYKKwl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZTsKKwlpbnQgZG9fYWxpZ24gPSAwLCBhbGlhc2luZyA9IDA7CisKKwkvKgorCSAqIFdlIG9ubHkgbmVlZCB0byBkbyBjb2xvdXIgYWxpZ25tZW50IGlmIGVpdGhlciB0aGUgSSBvciBECisJICogY2FjaGVzIGFsaWFzLiAgVGhpcyBpcyBpbmRpY2F0ZWQgYnkgYml0cyA5IGFuZCAyMSBvZiB0aGUKKwkgKiBjYWNoZSB0eXBlIHJlZ2lzdGVyLgorCSAqLworCWNhY2hlX3R5cGUgPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7CisJaWYgKGNhY2hlX3R5cGUgIT0gcmVhZF9jcHVpZChDUFVJRF9JRCkpIHsKKwkJYWxpYXNpbmcgPSAoY2FjaGVfdHlwZSB8IGNhY2hlX3R5cGUgPj4gMTIpICYgKDEgPDwgMTEpOworCQlpZiAoYWxpYXNpbmcpCisJCQlkb19hbGlnbiA9IGZpbHAgfHwgZmxhZ3MgJiBNQVBfU0hBUkVEOworCX0KKyNlbHNlCisjZGVmaW5lIGRvX2FsaWduIDAKKyNkZWZpbmUgYWxpYXNpbmcgMAorI2VuZGlmCisKKwkvKgorCSAqIFdlIHNob3VsZCBlbmZvcmNlIHRoZSBNQVBfRklYRUQgY2FzZS4gIEhvd2V2ZXIsIGN1cnJlbnRseQorCSAqIHRoZSBnZW5lcmljIGtlcm5lbCBjb2RlIGRvZXNuJ3QgYWxsb3cgdXMgdG8gaGFuZGxlIHRoaXMuCisJICovCisJaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7CisJCWlmIChhbGlhc2luZyAmJiBmbGFncyAmIE1BUF9TSEFSRUQgJiYgYWRkciAmIChTSE1MQkEgLSAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gYWRkcjsKKwl9CisKKwlpZiAobGVuID4gVEFTS19TSVpFKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRyKSB7CisJCWlmIChkb19hbGlnbikKKwkJCWFkZHIgPSBDT0xPVVJfQUxJR04oYWRkciwgcGdvZmYpOworCQllbHNlCisJCQlhZGRyID0gUEFHRV9BTElHTihhZGRyKTsKKworCQl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisJCWlmIChUQVNLX1NJWkUgLSBsZW4gPj0gYWRkciAmJgorCQkgICAgKCF2bWEgfHwgYWRkciArIGxlbiA8PSB2bWEtPnZtX3N0YXJ0KSkKKwkJCXJldHVybiBhZGRyOworCX0KKwlzdGFydF9hZGRyID0gYWRkciA9IG1tLT5mcmVlX2FyZWFfY2FjaGU7CisKK2Z1bGxfc2VhcmNoOgorCWlmIChkb19hbGlnbikKKwkJYWRkciA9IENPTE9VUl9BTElHTihhZGRyLCBwZ29mZik7CisJZWxzZQorCQlhZGRyID0gUEFHRV9BTElHTihhZGRyKTsKKworCWZvciAodm1hID0gZmluZF92bWEobW0sIGFkZHIpOyA7IHZtYSA9IHZtYS0+dm1fbmV4dCkgeworCQkvKiBBdCB0aGlzIHBvaW50OiAgKCF2bWEgfHwgYWRkciA8IHZtYS0+dm1fZW5kKS4gKi8KKwkJaWYgKFRBU0tfU0laRSAtIGxlbiA8IGFkZHIpIHsKKwkJCS8qCisJCQkgKiBTdGFydCBhIG5ldyBzZWFyY2ggLSBqdXN0IGluIGNhc2Ugd2UgbWlzc2VkCisJCQkgKiBzb21lIGhvbGVzLgorCQkJICovCisJCQlpZiAoc3RhcnRfYWRkciAhPSBUQVNLX1VOTUFQUEVEX0JBU0UpIHsKKwkJCQlzdGFydF9hZGRyID0gYWRkciA9IFRBU0tfVU5NQVBQRURfQkFTRTsKKwkJCQlnb3RvIGZ1bGxfc2VhcmNoOworCQkJfQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYgKCF2bWEgfHwgYWRkciArIGxlbiA8PSB2bWEtPnZtX3N0YXJ0KSB7CisJCQkvKgorCQkJICogUmVtZW1iZXIgdGhlIHBsYWNlIHdoZXJlIHdlIHN0b3BwZWQgdGhlIHNlYXJjaDoKKwkJCSAqLworCQkJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IGFkZHIgKyBsZW47CisJCQlyZXR1cm4gYWRkcjsKKwkJfQorCQlhZGRyID0gdm1hLT52bV9lbmQ7CisJCWlmIChkb19hbGlnbikKKwkJCWFkZHIgPSBDT0xPVVJfQUxJR04oYWRkciwgcGdvZmYpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW11LmMgYi9hcmNoL2FybS9tbS9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDkwMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vbW11LmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9tbXUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZCwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCit1bnNpZ25lZCBpbnQgY3B1X2xhc3RfYXNpZCA9IHsgMSA8PCBBU0lEX0JJVFMgfTsKKworLyoKKyAqIFdlIGZvcmsoKWVkIGEgcHJvY2VzcywgYW5kIHdlIG5lZWQgYSBuZXcgY29udGV4dCBmb3IgdGhlIGNoaWxkCisgKiB0byBydW4gaW4uICBXZSByZXNlcnZlIHZlcnNpb24gMCBmb3IgaW5pdGlhbCB0YXNrcyBzbyB3ZSB3aWxsCisgKiBhbHdheXMgYWxsb2NhdGUgYW4gQVNJRC4KKyAqLwordm9pZCBfX2luaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCW1tLT5jb250ZXh0LmlkID0gMDsKK30KKwordm9pZCBfX25ld19jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVuc2lnbmVkIGludCBhc2lkOworCisJYXNpZCA9ICsrY3B1X2xhc3RfYXNpZDsKKwlpZiAoYXNpZCA9PSAwKQorCQlhc2lkID0gY3B1X2xhc3RfYXNpZCA9IDEgPDwgQVNJRF9CSVRTOworCisJLyoKKwkgKiBJZiB3ZSd2ZSB1c2VkIHVwIGFsbCBvdXIgQVNJRHMsIHdlIG5lZWQKKwkgKiB0byBzdGFydCBhIG5ldyB2ZXJzaW9uIGFuZCBmbHVzaCB0aGUgVExCLgorCSAqLworCWlmICgoYXNpZCAmIH5BU0lEX01BU0spID09IDApCisJCWZsdXNoX3RsYl9hbGwoKTsKKworCW1tLT5jb250ZXh0LmlkID0gYXNpZDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzMjUyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TCkBAIC0wLDAgKzEsNTMwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TOiBNTVUgZnVuY3Rpb25zIGZvciBBUk0xMDIwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICoKKyAqIFRoZXNlIGFyZSB0aGUgbG93IGxldmVsIGFzc2VtYmxlciBmb3IgcGVyZm9ybWluZyBjYWNoZSBhbmQgVExCCisgKiBmdW5jdGlvbnMgb24gdGhlIGFybTEwMjAuCisgKgorICogIENPTkZJR19DUFVfQVJNMTAyMF9DUFVfSURMRSAtPiBub2hsdAorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisvKgorICogVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIG9mIGFuIGFyZWEgd2hpY2ggd2lsbCBiZSBpbnZhbGlkYXRlZAorICogdXNpbmcgdGhlIHNpbmdsZSBpbnZhbGlkYXRlIGVudHJ5IGluc3RydWN0aW9ucy4gIEFueXRoaW5nIGxhcmdlcgorICogdGhhbiB0aGlzLCBhbmQgd2UgZ28gZm9yIHRoZSB3aG9sZSBjYWNoZS4KKyAqCisgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBjaG9zZW4gc3VjaCB0aGF0IHdlIGNob29zZSB0aGUgY2hlYXBlc3QKKyAqIGFsdGVybmF0aXZlLgorICovCisjZGVmaW5lIE1BWF9BUkVBX1NJWkUJMzI3NjgKKworLyoKKyAqIFRoZSBzaXplIG9mIG9uZSBkYXRhIGNhY2hlIGxpbmUuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTkVTSVpFCTMyCisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGRhdGEgY2FjaGUgc2VnbWVudHMuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRFNFR01FTlRTCTE2CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGxpbmVzIGluIGEgY2FjaGUgc2VnbWVudC4KKyAqLworI2RlZmluZSBDQUNIRV9ERU5UUklFUwk2NAorCisvKgorICogVGhpcyBpcyB0aGUgc2l6ZSBhdCB3aGljaCBpdCBiZWNvbWVzIG1vcmUgZWZmaWNpZW50IHRvCisgKiBjbGVhbiB0aGUgd2hvbGUgY2FjaGUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbmRpdmlkdWFsCisgKiBjYWNoZSBsaW5lIG1haW50YWluZW5jZSBpbnN0cnVjdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTUlUCTMyNzY4CisKKwkudGV4dAorLyoKKyAqIGNwdV9hcm0xMDIwX3Byb2NfaW5pdCgpCisgKi8KK0VOVFJZKGNwdV9hcm0xMDIwX3Byb2NfaW5pdCkKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtMTAyMF9wcm9jX2ZpbigpCisgKi8KK0VOVFJZKGNwdV9hcm0xMDIwX3Byb2NfZmluKQorCXN0bWZkCXNwISwge2xyfQorCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCisJbXNyCWNwc3JfYywgaXAKKwlibAlhcm0xMDIwX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCXIwLCByMCwgIzB4MTAwMCAJCUAgLi4uaS4uLi4uLi4uLi4uLgorCWJpYwlyMCwgcjAsICMweDAwMGUgCQlAIC4uLi4uLi4uLi4uLndjYS4KKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCisJbGRtZmQJc3AhLCB7cGN9CisKKy8qCisgKiBjcHVfYXJtMTAyMF9yZXNldChsb2MpCisgKgorICogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIHN5c3RlbS4JUHV0IHRoZSBDUFUgaW50byB0aGUKKyAqIHNhbWUgc3RhdGUgYXMgaXQgd291bGQgYmUgaWYgaXQgaGFkIGJlZW4gcmVzZXQsIGFuZCBicmFuY2gKKyAqIHRvIHdoYXQgd291bGQgYmUgdGhlIHJlc2V0IHZlY3Rvci4KKyAqCisgKiBsb2M6IGxvY2F0aW9uIHRvIGp1bXAgdG8gZm9yIHNvZnQgcmVzZXQKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMF9yZXNldCkKKwltb3YJaXAsICMwCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNywgMAkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCisJbXJjCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCWlwLCBpcCwgIzB4MDAwZiAJCUAgLi4uLi4uLi4uLi4ud2NhbQorCWJpYwlpcCwgaXAsICMweDExMDAgCQlAIC4uLmkuLi5zLi4uLi4uLi4KKwltY3IJcDE1LCAwLCBpcCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwltb3YJcGMsIHIwCisKKy8qCisgKiBjcHVfYXJtMTAyMF9kb19pZGxlKCkKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMF9kb19pZGxlKQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDQJCUAgV2FpdCBmb3IgaW50ZXJydXB0CisJbW92CXBjLCBscgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ0FDSEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCS5hbGlnbgk1CisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9hbGwoKQorICoKKyAqCUludmFsaWRhdGUgYWxsIGNhY2hlIGVudHJpZXMgaW4gYSBwYXJ0aWN1bGFyIGFkZHJlc3MKKyAqCXNwYWNlLgorICovCitFTlRSWShhcm0xMDIwX2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorCS8qIEZBTExUSFJPVUdIICovCisvKgorICoJZmx1c2hfa2Vybl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK0VOVFJZKGFybTEwMjBfZmx1c2hfa2Vybl9jYWNoZV9hbGwpCisJbW92CXIyLCAjVk1fRVhFQworCW1vdglpcCwgIzAKK19fZmx1c2hfd2hvbGVfY2FjaGU6CisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglyMSwgIyhDQUNIRV9EU0VHTUVOVFMgLSAxKSA8PCA1CUAgMTYgc2VnbWVudHMKKzE6CW9ycglyMywgcjEsICMoQ0FDSEVfREVOVFJJRVMgLSAxKSA8PCAyNiBAIDY0IGVudHJpZXMKKzI6CW1jcglwMTUsIDAsIHIzLCBjNywgYzE0LCAyCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBpbmRleAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJc3VicwlyMywgcjMsICMxIDw8IDI2CisJYmNzCTJiCQkJCUAgZW50cmllcyA2MyB0byAwCisJc3VicwlyMSwgcjEsICMxIDw8IDUKKwliY3MJMWIJCQkJQCBzZWdtZW50cyAxNSB0byAwCisjZW5kaWYKKwl0c3QJcjIsICNWTV9FWEVDCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisjZW5kaWYKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglJbnZhbGlkYXRlIGEgcmFuZ2Ugb2YgY2FjaGUgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkCisgKglhZGRyZXNzIHNwYWNlLgorICoKKyAqCS0gc3RhcnQJLSBzdGFydCBhZGRyZXNzIChpbmNsdXNpdmUpCisgKgktIGVuZAktIGVuZCBhZGRyZXNzIChleGNsdXNpdmUpCisgKgktIGZsYWdzCS0gdm1fZmxhZ3MgZm9yIHRoaXMgc3BhY2UKKyAqLworRU5UUlkoYXJtMTAyMF9mbHVzaF91c2VyX2NhY2hlX3JhbmdlKQorCW1vdglpcCwgIzAKKwlzdWIJcjMsIHIxLCByMAkJCUAgY2FsY3VsYXRlIHRvdGFsIHNpemUKKwljbXAJcjMsICNDQUNIRV9ETElNSVQKKwliaHMJX19mbHVzaF93aG9sZV9jYWNoZQorCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGVudHJ5CisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJdHN0CXIyLCAjVk1fRVhFQworI2lmbmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorI2VuZGlmCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWNvaGVyZW50X2tlcm5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtMTAyMF9jb2hlcmVudF9rZXJuX3JhbmdlKQorCS8qIEZBTExUUkhPVUdIICovCisKKy8qCisgKgljb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTEwMjBfY29oZXJlbnRfdXNlcl9yYW5nZSkKKwltb3YJaXAsICMwCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAorMToKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorI2VuZGlmCisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWZsdXNoX2tlcm5fZGNhY2hlX3BhZ2Uodm9pZCAqcGFnZSkKKyAqCisgKglFbnN1cmUgbm8gRCBjYWNoZSBhbGlhc2luZyBvY2N1cnMsIGVpdGhlciB3aXRoIGl0c2VsZiBvcgorICoJdGhlIEkgY2FjaGUKKyAqCisgKgktIHBhZ2UJLSBwYWdlIGFsaWduZWQgYWRkcmVzcworICovCitFTlRSWShhcm0xMDIwX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYWRkCXIxLCByMCwgI1BBR0VfU1oKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBlbnRyeQorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNlbmRpZgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2ludl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUludmFsaWRhdGUgKGRpc2NhcmQpIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoJTWF5IG5vdCB3cml0ZSBiYWNrIGFueSBlbnRyaWVzLiAgSWYgJ3N0YXJ0JyBvciAnZW5kJworICoJYXJlIG5vdCBjYWNoZSBsaW5lIGFsaWduZWQsIHRob3NlIGxpbmVzIG11c3QgYmUgd3JpdHRlbgorICoJYmFjay4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqCisgKiAoc2FtZSBhcyB2NHdiKQorICovCitFTlRSWShhcm0xMDIwX2RtYV9pbnZfcmFuZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJdHN0CXIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwl0c3QJcjEsICNDQUNIRV9ETElORVNJWkUgLSAxCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAorCW1jcm5lCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNlbmRpZgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJQ2xlYW4gdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKgorICogKHNhbWUgYXMgdjR3YikKKyAqLworRU5UUlkoYXJtMTAyMF9kbWFfY2xlYW5fcmFuZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWShhcm0xMDIwX2RtYV9mbHVzaF9yYW5nZSkKKwltb3YJaXAsICMwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworRU5UUlkoYXJtMTAyMF9jYWNoZV9mbnMpCisJLmxvbmcJYXJtMTAyMF9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCWFybTEwMjBfZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwkubG9uZwlhcm0xMDIwX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwkubG9uZwlhcm0xMDIwX2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwlhcm0xMDIwX2NvaGVyZW50X3VzZXJfcmFuZ2UKKwkubG9uZwlhcm0xMDIwX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UKKwkubG9uZwlhcm0xMDIwX2RtYV9pbnZfcmFuZ2UKKwkubG9uZwlhcm0xMDIwX2RtYV9jbGVhbl9yYW5nZQorCS5sb25nCWFybTEwMjBfZG1hX2ZsdXNoX3JhbmdlCisKKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjBfZGNhY2hlX2NsZWFuX2FyZWEpCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltb3YJaXAsICMwCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJc3VicwlyMSwgcjEsICNDQUNIRV9ETElORVNJWkUKKwliaGkJMWIKKyNlbmRpZgorCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQYWdlVGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBjcHVfYXJtMTAyMF9zd2l0Y2hfbW0ocGdkKQorICoKKyAqIFNldCB0aGUgdHJhbnNsYXRpb24gYmFzZSBwb2ludGVyIHRvIGJlIGFzIGRlc2NyaWJlZCBieSBwZ2QuCisgKgorICogcGdkOiBuZXcgcGFnZSB0YWJsZXMKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMF9zd2l0Y2hfbW0pCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMywgYzcsIGMxMCwgNAorCW1vdglyMSwgIzB4RgkJCUAgMTYgc2VnbWVudHMKKzE6CW1vdglyMywgIzB4M0YJCQlAIDY0IGVudHJpZXMKKzI6CW1vdglpcCwgcjMsIExTTCAjMjYgCQlAIHNoaWZ0IHVwIGVudHJ5CisJb3JyCWlwLCBpcCwgcjEsIExTTCAjNQkJQCBzaGlmdCBpbi91cCBpbmRleAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzE0LCAyCQlAIENsZWFuICYgSW52YWwgRENhY2hlIGVudHJ5CisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CisJc3VicwlyMywgcjMsICMxCisJY21wCXIzLCAjMAorCWJnZQkyYgkJCQlAIGVudHJpZXMgM0YgdG8gMAorCXN1YnMJcjEsIHIxLCAjMQorCWNtcAlyMSwgIzAKKwliZ2UJMWIJCQkJQCBzZWdtZW50cyAxNSB0byAwCisKKyNlbmRpZgorCW1vdglyMSwgIzAKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCW1jcglwMTUsIDAsIHIxLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMSwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1jcglwMTUsIDAsIHIwLCBjMiwgYzAsIDAJCUAgbG9hZCBwYWdlIHRhYmxlIHBvaW50ZXIKKwltY3IJcDE1LCAwLCByMSwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSAmIEQgVExCcworCW1vdglwYywgbHIKKyAgICAgICAgCisvKgorICogY3B1X2FybTEwMjBfc2V0X3B0ZShwdGVwLCBwdGUpCisgKgorICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMF9zZXRfcHRlKQorCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKKwliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSworCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAorCisJdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KKwlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVworCisJdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KKwlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVworCisJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/CisJbW92bmUJcjIsICMwCisKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwllb3IJcjMsIHIxLCAjMHgwYQkJCUAgQyAmIHNtYWxsIHBhZ2U/CisJdHN0CXIzLCAjMHgwYgorCWJpY2VxCXIyLCByMiwgIzQKKyNlbmRpZgorCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCW1vdglyMCwgcjAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKwlfX0lOSVQKKworCS50eXBlCV9fYXJtMTAyMF9zZXR1cCwgI2Z1bmN0aW9uCitfX2FybTEwMjBfc2V0dXA6CisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcJCUAgaW52YWxpZGF0ZSBJLEQgY2FjaGVzIG9uIHY0CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyIG9uIHY0CisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNwkJQCBpbnZhbGlkYXRlIEksRCBUTEJzIG9uIHY0CisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMAkJQCBnZXQgY29udHJvbCByZWdpc3RlciB2NAorCWxkcglyNSwgYXJtMTAyMF9jcjFfY2xlYXIKKwliaWMJcjAsIHIwLCByNQorCWxkcglyNSwgYXJtMTAyMF9jcjFfc2V0CisJb3JyCXIwLCByMCwgcjUKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOCisJb3JyCXIwLCByMCwgIzB4NDAwMCAJCUAgLlIuLiAuLi4uIC4uLi4gLi4uLgorI2VuZGlmCisJbW92CXBjLCBscgorCS5zaXplCV9fYXJtMTAyMF9zZXR1cCwgLiAtIF9fYXJtMTAyMF9zZXR1cAorCisJLyoKKwkgKiAgUgorCSAqIC5SVkkgWkZSUyBCTERQIFdDQU0KKwkgKiAuMC4xIDEwMDEgLi4xMSAwMTAxCS8qIEZJWE1FOiB3aHkgbm8gViBiaXQ/ICovCisJICovCisJLnR5cGUJYXJtMTAyMF9jcjFfY2xlYXIsICNvYmplY3QKKwkudHlwZQlhcm0xMDIwX2NyMV9zZXQsICNvYmplY3QKK2FybTEwMjBfY3IxX2NsZWFyOgorCS53b3JkCTB4NTkzZgorYXJtMTAyMF9jcjFfc2V0OgorCS53b3JkCTB4MTkzNQorCisJX19JTklUREFUQQorCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCS50eXBlCWFybTEwMjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorYXJtMTAyMF9wcm9jZXNzb3JfZnVuY3Rpb25zOgorCS53b3JkCXY0dF9lYXJseV9hYm9ydAorCS53b3JkCWNwdV9hcm0xMDIwX3Byb2NfaW5pdAorCS53b3JkCWNwdV9hcm0xMDIwX3Byb2NfZmluCisJLndvcmQJY3B1X2FybTEwMjBfcmVzZXQKKwkud29yZAljcHVfYXJtMTAyMF9kb19pZGxlCisJLndvcmQJY3B1X2FybTEwMjBfZGNhY2hlX2NsZWFuX2FyZWEKKwkud29yZAljcHVfYXJtMTAyMF9zd2l0Y2hfbW0KKwkud29yZAljcHVfYXJtMTAyMF9zZXRfcHRlCisJLnNpemUJYXJtMTAyMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyMF9wcm9jZXNzb3JfZnVuY3Rpb25zCisKKwkuc2VjdGlvbiAiLnJvZGF0YSIKKworCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKK2NwdV9hcmNoX25hbWU6CisJLmFzY2l6CSJhcm12NXQiCisJLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKKworCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAorY3B1X2VsZl9uYW1lOgorCS5hc2NpegkidjUiCisJLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCisKKwkudHlwZQljcHVfYXJtMTAyMF9uYW1lLCAjb2JqZWN0CitjcHVfYXJtMTAyMF9uYW1lOgorCS5hc2NpaQkiQVJNMTAyMCIKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCS5hc2NpaQkiaSIKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJLmFzY2lpCSJkIgorI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCS5hc2NpaQkiKHd0KSIKKyNlbHNlCisJLmFzY2lpCSIod2IpIgorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFCisJLmFzY2lpCSJCIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTgorCS5hc2NpaQkiUlIiCisjZW5kaWYKKwkuYXNjaWkJIlwwIgorCS5zaXplCWNwdV9hcm0xMDIwX25hbWUsIC4gLSBjcHVfYXJtMTAyMF9uYW1lCisKKwkuYWxpZ24KKworCS5zZWN0aW9uICIucHJvYy5pbmZvIiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKwkudHlwZQlfX2FybTEwMjBfcHJvY19pbmZvLCNvYmplY3QKK19fYXJtMTAyMF9wcm9jX2luZm86CisJLmxvbmcJMHg0MTA0YTIwMAkJCUAgQVJNIDEwMjBUIChBcmNoaXRlY3R1cmUgdjVUKQorCS5sb25nCTB4ZmYwZmZmZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAorCQlQTURfU0VDVF9BUF9SRUFECisJYglfX2FybTEwMjBfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCisJLmxvbmcJY3B1X2FybTEwMjBfbmFtZQorCS5sb25nCWFybTEwMjBfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl2NHdiX3VzZXJfZm5zCisJLmxvbmcJYXJtMTAyMF9jYWNoZV9mbnMKKwkuc2l6ZQlfX2FybTEwMjBfcHJvY19pbmZvLCAuIC0gX19hcm0xMDIwX3Byb2NfaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmEyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TOiBNTVUgZnVuY3Rpb25zIGZvciBBUk0xMDIwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICoKKyAqIFRoZXNlIGFyZSB0aGUgbG93IGxldmVsIGFzc2VtYmxlciBmb3IgcGVyZm9ybWluZyBjYWNoZSBhbmQgVExCCisgKiBmdW5jdGlvbnMgb24gdGhlIGFybTEwMjBlLgorICoKKyAqICBDT05GSUdfQ1BVX0FSTTEwMjBfQ1BVX0lETEUgLT4gbm9obHQKKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworLyoKKyAqIFRoaXMgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhbiBhcmVhIHdoaWNoIHdpbGwgYmUgaW52YWxpZGF0ZWQKKyAqIHVzaW5nIHRoZSBzaW5nbGUgaW52YWxpZGF0ZSBlbnRyeSBpbnN0cnVjdGlvbnMuICBBbnl0aGluZyBsYXJnZXIKKyAqIHRoYW4gdGhpcywgYW5kIHdlIGdvIGZvciB0aGUgd2hvbGUgY2FjaGUuCisgKgorICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgY2hvc2VuIHN1Y2ggdGhhdCB3ZSBjaG9vc2UgdGhlIGNoZWFwZXN0CisgKiBhbHRlcm5hdGl2ZS4KKyAqLworI2RlZmluZSBNQVhfQVJFQV9TSVpFCTMyNzY4CisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvbmUgZGF0YSBjYWNoZSBsaW5lLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU5FU0laRQkzMgorCisvKgorICogVGhlIG51bWJlciBvZiBkYXRhIGNhY2hlIHNlZ21lbnRzLgorICovCisjZGVmaW5lIENBQ0hFX0RTRUdNRU5UUwkxNgorCisvKgorICogVGhlIG51bWJlciBvZiBsaW5lcyBpbiBhIGNhY2hlIHNlZ21lbnQuCisgKi8KKyNkZWZpbmUgQ0FDSEVfREVOVFJJRVMJNjQKKworLyoKKyAqIFRoaXMgaXMgdGhlIHNpemUgYXQgd2hpY2ggaXQgYmVjb21lcyBtb3JlIGVmZmljaWVudCB0bworICogY2xlYW4gdGhlIHdob2xlIGNhY2hlLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgaW5kaXZpZHVhbAorICogY2FjaGUgbGluZSBtYWludGFpbmVuY2UgaW5zdHJ1Y3Rpb25zLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU1JVAkzMjc2OAorCisJLnRleHQKKy8qCisgKiBjcHVfYXJtMTAyMGVfcHJvY19pbml0KCkKKyAqLworRU5UUlkoY3B1X2FybTEwMjBlX3Byb2NfaW5pdCkKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtMTAyMGVfcHJvY19maW4oKQorICovCitFTlRSWShjcHVfYXJtMTAyMGVfcHJvY19maW4pCisJc3RtZmQJc3AhLCB7bHJ9CisJbW92CWlwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKKwltc3IJY3Bzcl9jLCBpcAorCWJsCWFybTEwMjBlX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCXIwLCByMCwgIzB4MTAwMCAJCUAgLi4uaS4uLi4uLi4uLi4uLgorCWJpYwlyMCwgcjAsICMweDAwMGUgCQlAIC4uLi4uLi4uLi4uLndjYS4KKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCisJbGRtZmQJc3AhLCB7cGN9CisKKy8qCisgKiBjcHVfYXJtMTAyMGVfcmVzZXQobG9jKQorICoKKyAqIFBlcmZvcm0gYSBzb2Z0IHJlc2V0IG9mIHRoZSBzeXN0ZW0uCVB1dCB0aGUgQ1BVIGludG8gdGhlCisgKiBzYW1lIHN0YXRlIGFzIGl0IHdvdWxkIGJlIGlmIGl0IGhhZCBiZWVuIHJlc2V0LCBhbmQgYnJhbmNoCisgKiB0byB3aGF0IHdvdWxkIGJlIHRoZSByZXNldCB2ZWN0b3IuCisgKgorICogbG9jOiBsb2NhdGlvbiB0byBqdW1wIHRvIGZvciBzb2Z0IHJlc2V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjBlX3Jlc2V0KQorCW1vdglpcCwgIzAKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM3LCAwCQlAIGludmFsaWRhdGUgSSxEIGNhY2hlcworCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltcmMJcDE1LCAwLCBpcCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwliaWMJaXAsIGlwLCAjMHgwMDBmIAkJQCAuLi4uLi4uLi4uLi53Y2FtCisJYmljCWlwLCBpcCwgIzB4MTEwMCAJCUAgLi4uaS4uLnMuLi4uLi4uLgorCW1jcglwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCW1vdglwYywgcjAKKworLyoKKyAqIGNwdV9hcm0xMDIwZV9kb19pZGxlKCkKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMGVfZG9faWRsZSkKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0CQlAIFdhaXQgZm9yIGludGVycnVwdAorCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENBQ0hFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKwkuYWxpZ24JNQorLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfYWxsKCkKKyAqCisgKglJbnZhbGlkYXRlIGFsbCBjYWNoZSBlbnRyaWVzIGluIGEgcGFydGljdWxhciBhZGRyZXNzCisgKglzcGFjZS4KKyAqLworRU5UUlkoYXJtMTAyMGVfZmx1c2hfdXNlcl9jYWNoZV9hbGwpCisJLyogRkFMTFRIUk9VR0ggKi8KKy8qCisgKglmbHVzaF9rZXJuX2NhY2hlX2FsbCgpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgdGhlIGVudGlyZSBjYWNoZS4KKyAqLworRU5UUlkoYXJtMTAyMGVfZmx1c2hfa2Vybl9jYWNoZV9hbGwpCisJbW92CXIyLCAjVk1fRVhFQworCW1vdglpcCwgIzAKK19fZmx1c2hfd2hvbGVfY2FjaGU6CisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglyMSwgIyhDQUNIRV9EU0VHTUVOVFMgLSAxKSA8PCA1CUAgMTYgc2VnbWVudHMKKzE6CW9ycglyMywgcjEsICMoQ0FDSEVfREVOVFJJRVMgLSAxKSA8PCAyNiBAIDY0IGVudHJpZXMKKzI6CW1jcglwMTUsIDAsIHIzLCBjNywgYzE0LCAyCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBpbmRleAorCXN1YnMJcjMsIHIzLCAjMSA8PCAyNgorCWJjcwkyYgkJCQlAIGVudHJpZXMgNjMgdG8gMAorCXN1YnMJcjEsIHIxLCAjMSA8PCA1CisJYmNzCTFiCQkJCUAgc2VnbWVudHMgMTUgdG8gMAorI2VuZGlmCisJdHN0CXIyLCAjVk1fRVhFQworI2lmbmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorI2VuZGlmCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCwgZmxhZ3MpCisgKgorICoJSW52YWxpZGF0ZSBhIHJhbmdlIG9mIGNhY2hlIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZAorICoJYWRkcmVzcyBzcGFjZS4KKyAqCisgKgktIHN0YXJ0CS0gc3RhcnQgYWRkcmVzcyAoaW5jbHVzaXZlKQorICoJLSBlbmQJLSBlbmQgYWRkcmVzcyAoZXhjbHVzaXZlKQorICoJLSBmbGFncwktIHZtX2ZsYWdzIGZvciB0aGlzIHNwYWNlCisgKi8KK0VOVFJZKGFybTEwMjBlX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UpCisJbW92CWlwLCAjMAorCXN1YglyMywgcjEsIHIwCQkJQCBjYWxjdWxhdGUgdG90YWwgc2l6ZQorCWNtcAlyMywgI0NBQ0hFX0RMSU1JVAorCWJocwlfX2ZsdXNoX3dob2xlX2NhY2hlCisKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNlbmRpZgorCXRzdAlyMiwgI1ZNX0VYRUMKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKyNlbmRpZgorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKgljb2hlcmVudF9rZXJuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTEwMjBlX2NvaGVyZW50X2tlcm5fcmFuZ2UpCisJLyogRkFMTFRIUk9VR0ggKi8KKy8qCisgKgljb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTEwMjBlX2NvaGVyZW50X3VzZXJfcmFuZ2UpCisJbW92CWlwLCAjMAorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorI2VuZGlmCisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWZsdXNoX2tlcm5fZGNhY2hlX3BhZ2Uodm9pZCAqcGFnZSkKKyAqCisgKglFbnN1cmUgbm8gRCBjYWNoZSBhbGlhc2luZyBvY2N1cnMsIGVpdGhlciB3aXRoIGl0c2VsZiBvcgorICoJdGhlIEkgY2FjaGUKKyAqCisgKgktIHBhZ2UJLSBwYWdlIGFsaWduZWQgYWRkcmVzcworICovCitFTlRSWShhcm0xMDIwZV9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlKQorCW1vdglpcCwgIzAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCWFkZAlyMSwgcjAsICNQQUdFX1NaCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJSW52YWxpZGF0ZSAoZGlzY2FyZCkgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKglNYXkgbm90IHdyaXRlIGJhY2sgYW55IGVudHJpZXMuICBJZiAnc3RhcnQnIG9yICdlbmQnCisgKglhcmUgbm90IGNhY2hlIGxpbmUgYWxpZ25lZCwgdGhvc2UgbGluZXMgbXVzdCBiZSB3cml0dGVuCisgKgliYWNrLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqIChzYW1lIGFzIHY0d2IpCisgKi8KK0VOVFJZKGFybTEwMjBlX2RtYV9pbnZfcmFuZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJdHN0CXIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJdHN0CXIxLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqCisgKiAoc2FtZSBhcyB2NHdiKQorICovCitFTlRSWShhcm0xMDIwZV9kbWFfY2xlYW5fcmFuZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtMTAyMGVfZG1hX2ZsdXNoX3JhbmdlKQorCW1vdglpcCwgIzAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKK0VOVFJZKGFybTEwMjBlX2NhY2hlX2ZucykKKwkubG9uZwlhcm0xMDIwZV9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCWFybTEwMjBlX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJYXJtMTAyMGVfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQorCS5sb25nCWFybTEwMjBlX2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwlhcm0xMDIwZV9jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJYXJtMTAyMGVfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZQorCS5sb25nCWFybTEwMjBlX2RtYV9pbnZfcmFuZ2UKKwkubG9uZwlhcm0xMDIwZV9kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwlhcm0xMDIwZV9kbWFfZmx1c2hfcmFuZ2UKKworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMGVfZGNhY2hlX2NsZWFuX2FyZWEpCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltb3YJaXAsICMwCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCXN1YnMJcjEsIHIxLCAjQ0FDSEVfRExJTkVTSVpFCisJYmhpCTFiCisjZW5kaWYKKwltb3YJcGMsIGxyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFnZVRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogY3B1X2FybTEwMjBlX3N3aXRjaF9tbShwZ2QpCisgKgorICogU2V0IHRoZSB0cmFuc2xhdGlvbiBiYXNlIHBvaW50ZXIgdG8gYmUgYXMgZGVzY3JpYmVkIGJ5IHBnZC4KKyAqCisgKiBwZ2Q6IG5ldyBwYWdlIHRhYmxlcworICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm0xMDIwZV9zd2l0Y2hfbW0pCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMywgYzcsIGMxMCwgNAorCW1vdglyMSwgIzB4RgkJCUAgMTYgc2VnbWVudHMKKzE6CW1vdglyMywgIzB4M0YJCQlAIDY0IGVudHJpZXMKKzI6CW1vdglpcCwgcjMsIExTTCAjMjYgCQlAIHNoaWZ0IHVwIGVudHJ5CisJb3JyCWlwLCBpcCwgcjEsIExTTCAjNQkJQCBzaGlmdCBpbi91cCBpbmRleAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzE0LCAyCQlAIENsZWFuICYgSW52YWwgRENhY2hlIGVudHJ5CisJbW92CWlwLCAjMAorCXN1YnMJcjMsIHIzLCAjMQorCWNtcAlyMywgIzAKKwliZ2UJMmIJCQkJQCBlbnRyaWVzIDNGIHRvIDAKKwlzdWJzCXIxLCByMSwgIzEKKwljbXAJcjEsICMwCisJYmdlCTFiCQkJCUAgc2VnbWVudHMgMTUgdG8gMAorCisjZW5kaWYKKwltb3YJcjEsICMwCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMSwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJbWNyCXAxNSwgMCwgcjEsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltb3YJcGMsIGxyCisgICAgICAgIAorLyoKKyAqIGNwdV9hcm0xMDIwZV9zZXRfcHRlKHB0ZXAsIHB0ZSkKKyAqCisgKiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dAorICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm0xMDIwZV9zZXRfcHRlKQorCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKKwliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSworCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAorCisJdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KKwlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVworCisJdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KKwlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVworCisJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/CisJbW92bmUJcjIsICMwCisKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwllb3IJcjMsIHIxLCAjMHgwYQkJCUAgQyAmIHNtYWxsIHBhZ2U/CisJdHN0CXIzLCAjMHgwYgorCWJpY2VxCXIyLCByMiwgIzQKKyNlbmRpZgorCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCW1vdglyMCwgcjAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKyNlbmRpZgorCW1vdglwYywgbHIKKworCV9fSU5JVAorCisJLnR5cGUJX19hcm0xMDIwZV9zZXR1cCwgI2Z1bmN0aW9uCitfX2FybTEwMjBlX3NldHVwOgorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3CQlAIGludmFsaWRhdGUgSSxEIGNhY2hlcyBvbiB2NAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlciBvbiB2NAorCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcJCUAgaW52YWxpZGF0ZSBJLEQgVExCcyBvbiB2NAorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAJCUAgZ2V0IGNvbnRyb2wgcmVnaXN0ZXIgdjQKKwlsZHIJcjUsIGFybTEwMjBlX2NyMV9jbGVhcgorCWJpYwlyMCwgcjAsIHI1CisJbGRyCXI1LCBhcm0xMDIwZV9jcjFfc2V0CisJb3JyCXIwLCByMCwgcjUKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOCisJb3JyCXIwLCByMCwgIzB4NDAwMCAJCUAgLlIuLiAuLi4uIC4uLi4gLi4uLgorI2VuZGlmCisJbW92CXBjLCBscgorCS5zaXplCV9fYXJtMTAyMGVfc2V0dXAsIC4gLSBfX2FybTEwMjBlX3NldHVwCisKKwkvKgorCSAqICBSCisJICogLlJWSSBaRlJTIEJMRFAgV0NBTQorCSAqIC4wLjEgMTAwMSAuLjExIDAxMDEJLyogRklYTUU6IHdoeSBubyBWIGJpdD8gKi8KKwkgKi8KKwkudHlwZQlhcm0xMDIwZV9jcjFfY2xlYXIsICNvYmplY3QKKwkudHlwZQlhcm0xMDIwZV9jcjFfc2V0LCAjb2JqZWN0Cithcm0xMDIwZV9jcjFfY2xlYXI6CisJLndvcmQJMHg1ZjNmCithcm0xMDIwZV9jcjFfc2V0OgorCS53b3JkCTB4MTkzNQorCisJX19JTklUREFUQQorCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCS50eXBlCWFybTEwMjBlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKK2FybTEwMjBlX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CisJLndvcmQJdjR0X2Vhcmx5X2Fib3J0CisJLndvcmQJY3B1X2FybTEwMjBlX3Byb2NfaW5pdAorCS53b3JkCWNwdV9hcm0xMDIwZV9wcm9jX2ZpbgorCS53b3JkCWNwdV9hcm0xMDIwZV9yZXNldAorCS53b3JkCWNwdV9hcm0xMDIwZV9kb19pZGxlCisJLndvcmQJY3B1X2FybTEwMjBlX2RjYWNoZV9jbGVhbl9hcmVhCisJLndvcmQJY3B1X2FybTEwMjBlX3N3aXRjaF9tbQorCS53b3JkCWNwdV9hcm0xMDIwZV9zZXRfcHRlCisJLnNpemUJYXJtMTAyMGVfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTEwMjBlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKworCS5zZWN0aW9uICIucm9kYXRhIgorCisJLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAorY3B1X2FyY2hfbmFtZToKKwkuYXNjaXoJImFybXY1dGUiCisJLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKKworCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAorY3B1X2VsZl9uYW1lOgorCS5hc2NpegkidjUiCisJLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCisKKwkudHlwZQljcHVfYXJtMTAyMGVfbmFtZSwgI29iamVjdAorY3B1X2FybTEwMjBlX25hbWU6CisJLmFzY2lpCSJBUk0xMDIwRSIKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCS5hc2NpaQkiaSIKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJLmFzY2lpCSJkIgorI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCS5hc2NpaQkiKHd0KSIKKyNlbHNlCisJLmFzY2lpCSIod2IpIgorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFCisJLmFzY2lpCSJCIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTgorCS5hc2NpaQkiUlIiCisjZW5kaWYKKwkuYXNjaWkJIlwwIgorCS5zaXplCWNwdV9hcm0xMDIwZV9uYW1lLCAuIC0gY3B1X2FybTEwMjBlX25hbWUKKworCS5hbGlnbgorCisJLnNlY3Rpb24gIi5wcm9jLmluZm8iLCAjYWxsb2MsICNleGVjaW5zdHIKKworCS50eXBlCV9fYXJtMTAyMGVfcHJvY19pbmZvLCNvYmplY3QKK19fYXJtMTAyMGVfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwNWEyMDAJCQlAIEFSTSAxMDIwVEUgKEFyY2hpdGVjdHVyZSB2NVRFKQorCS5sb25nCTB4ZmYwZmZmZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9CSVQ0IHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX19hcm0xMDIwZV9zZXR1cAorCS5sb25nCWNwdV9hcmNoX25hbWUKKwkubG9uZwljcHVfZWxmX25hbWUKKwkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfVEhVTUIgfCBIV0NBUF9FRFNQCisJLmxvbmcJY3B1X2FybTEwMjBlX25hbWUKKwkubG9uZwlhcm0xMDIwZV9wcm9jZXNzb3JfZnVuY3Rpb25zCisJLmxvbmcJdjR3YmlfdGxiX2ZucworCS5sb25nCXY0d2JfdXNlcl9mbnMKKwkubG9uZwlhcm0xMDIwZV9jYWNoZV9mbnMKKwkuc2l6ZQlfX2FybTEwMjBlX3Byb2NfaW5mbywgLiAtIF9fYXJtMTAyMGVfcHJvY19pbmZvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2VkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUwpAQCAtMCwwICsxLDQ5NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUzogTU1VIGZ1bmN0aW9ucyBmb3IgQVJNMTAyMkUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIEFSTSBMaW1pdGVkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqIFRoZXNlIGFyZSB0aGUgbG93IGxldmVsIGFzc2VtYmxlciBmb3IgcGVyZm9ybWluZyBjYWNoZSBhbmQgVExCCisgKiBmdW5jdGlvbnMgb24gdGhlIEFSTTEwMjJFLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCisvKgorICogVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIG9mIGFuIGFyZWEgd2hpY2ggd2lsbCBiZSBpbnZhbGlkYXRlZAorICogdXNpbmcgdGhlIHNpbmdsZSBpbnZhbGlkYXRlIGVudHJ5IGluc3RydWN0aW9ucy4gIEFueXRoaW5nIGxhcmdlcgorICogdGhhbiB0aGlzLCBhbmQgd2UgZ28gZm9yIHRoZSB3aG9sZSBjYWNoZS4KKyAqCisgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBjaG9zZW4gc3VjaCB0aGF0IHdlIGNob29zZSB0aGUgY2hlYXBlc3QKKyAqIGFsdGVybmF0aXZlLgorICovCisjZGVmaW5lIE1BWF9BUkVBX1NJWkUJMzI3NjgKKworLyoKKyAqIFRoZSBzaXplIG9mIG9uZSBkYXRhIGNhY2hlIGxpbmUuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTkVTSVpFCTMyCisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGRhdGEgY2FjaGUgc2VnbWVudHMuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRFNFR01FTlRTCTE2CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGxpbmVzIGluIGEgY2FjaGUgc2VnbWVudC4KKyAqLworI2RlZmluZSBDQUNIRV9ERU5UUklFUwk2NAorCisvKgorICogVGhpcyBpcyB0aGUgc2l6ZSBhdCB3aGljaCBpdCBiZWNvbWVzIG1vcmUgZWZmaWNpZW50IHRvCisgKiBjbGVhbiB0aGUgd2hvbGUgY2FjaGUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbmRpdmlkdWFsCisgKiBjYWNoZSBsaW5lIG1haW50YWluZW5jZSBpbnN0cnVjdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTUlUCTMyNzY4CisKKwkudGV4dAorLyoKKyAqIGNwdV9hcm0xMDIyX3Byb2NfaW5pdCgpCisgKi8KK0VOVFJZKGNwdV9hcm0xMDIyX3Byb2NfaW5pdCkKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtMTAyMl9wcm9jX2ZpbigpCisgKi8KK0VOVFJZKGNwdV9hcm0xMDIyX3Byb2NfZmluKQorCXN0bWZkCXNwISwge2xyfQorCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCisJbXNyCWNwc3JfYywgaXAKKwlibAlhcm0xMDIyX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCXIwLCByMCwgIzB4MTAwMCAJCUAgLi4uaS4uLi4uLi4uLi4uLgorCWJpYwlyMCwgcjAsICMweDAwMGUgCQlAIC4uLi4uLi4uLi4uLndjYS4KKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCisJbGRtZmQJc3AhLCB7cGN9CisKKy8qCisgKiBjcHVfYXJtMTAyMl9yZXNldChsb2MpCisgKgorICogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIHN5c3RlbS4JUHV0IHRoZSBDUFUgaW50byB0aGUKKyAqIHNhbWUgc3RhdGUgYXMgaXQgd291bGQgYmUgaWYgaXQgaGFkIGJlZW4gcmVzZXQsIGFuZCBicmFuY2gKKyAqIHRvIHdoYXQgd291bGQgYmUgdGhlIHJlc2V0IHZlY3Rvci4KKyAqCisgKiBsb2M6IGxvY2F0aW9uIHRvIGp1bXAgdG8gZm9yIHNvZnQgcmVzZXQKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMl9yZXNldCkKKwltb3YJaXAsICMwCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNywgMAkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCisJbXJjCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCWlwLCBpcCwgIzB4MDAwZiAJCUAgLi4uLi4uLi4uLi4ud2NhbQorCWJpYwlpcCwgaXAsICMweDExMDAgCQlAIC4uLmkuLi5zLi4uLi4uLi4KKwltY3IJcDE1LCAwLCBpcCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwltb3YJcGMsIHIwCisKKy8qCisgKiBjcHVfYXJtMTAyMl9kb19pZGxlKCkKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtMTAyMl9kb19pZGxlKQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDQJCUAgV2FpdCBmb3IgaW50ZXJydXB0CisJbW92CXBjLCBscgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ0FDSEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCS5hbGlnbgk1CisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9hbGwoKQorICoKKyAqCUludmFsaWRhdGUgYWxsIGNhY2hlIGVudHJpZXMgaW4gYSBwYXJ0aWN1bGFyIGFkZHJlc3MKKyAqCXNwYWNlLgorICovCitFTlRSWShhcm0xMDIyX2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorCS8qIEZBTExUSFJPVUdIICovCisvKgorICoJZmx1c2hfa2Vybl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK0VOVFJZKGFybTEwMjJfZmx1c2hfa2Vybl9jYWNoZV9hbGwpCisJbW92CXIyLCAjVk1fRVhFQworCW1vdglpcCwgIzAKK19fZmx1c2hfd2hvbGVfY2FjaGU6CisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltb3YJcjEsICMoQ0FDSEVfRFNFR01FTlRTIC0gMSkgPDwgNQlAIDE2IHNlZ21lbnRzCisxOglvcnIJcjMsIHIxLCAjKENBQ0hFX0RFTlRSSUVTIC0gMSkgPDwgMjYgQCA2NCBlbnRyaWVzCisyOgltY3IJcDE1LCAwLCByMywgYzcsIGMxNCwgMgkJQCBjbGVhbitpbnZhbGlkYXRlIEQgaW5kZXgKKwlzdWJzCXIzLCByMywgIzEgPDwgMjYKKwliY3MJMmIJCQkJQCBlbnRyaWVzIDYzIHRvIDAKKwlzdWJzCXIxLCByMSwgIzEgPDwgNQorCWJjcwkxYgkJCQlAIHNlZ21lbnRzIDE1IHRvIDAKKyNlbmRpZgorCXRzdAlyMiwgI1ZNX0VYRUMKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKyNlbmRpZgorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF91c2VyX2NhY2hlX3JhbmdlKHN0YXJ0LCBlbmQsIGZsYWdzKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBjYWNoZSBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQKKyAqCWFkZHJlc3Mgc3BhY2UuCisgKgorICoJLSBzdGFydAktIHN0YXJ0IGFkZHJlc3MgKGluY2x1c2l2ZSkKKyAqCS0gZW5kCS0gZW5kIGFkZHJlc3MgKGV4Y2x1c2l2ZSkKKyAqCS0gZmxhZ3MJLSB2bV9mbGFncyBmb3IgdGhpcyBzcGFjZQorICovCitFTlRSWShhcm0xMDIyX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UpCisJbW92CWlwLCAjMAorCXN1YglyMywgcjEsIHIwCQkJQCBjYWxjdWxhdGUgdG90YWwgc2l6ZQorCWNtcAlyMywgI0NBQ0hFX0RMSU1JVAorCWJocwlfX2ZsdXNoX3dob2xlX2NhY2hlCisKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNlbmRpZgorCXRzdAlyMiwgI1ZNX0VYRUMKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKyNlbmRpZgorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKgljb2hlcmVudF9rZXJuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTEwMjJfY29oZXJlbnRfa2Vybl9yYW5nZSkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJY29oZXJlbnRfdXNlcl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUVuc3VyZSBjb2hlcmVuY3kgYmV0d2VlbiB0aGUgSWNhY2hlIGFuZCB0aGUgRGNhY2hlIGluIHRoZQorICoJcmVnaW9uIGRlc2NyaWJlZCBieSBzdGFydC4gIElmIHlvdSBoYXZlIG5vbi1zbm9vcGluZworICoJSGFydmFyZCBjYWNoZXMsIHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWShhcm0xMDIyX2NvaGVyZW50X3VzZXJfcmFuZ2UpCisJbW92CWlwLCAjMAorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorI2VuZGlmCisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWZsdXNoX2tlcm5fZGNhY2hlX3BhZ2Uodm9pZCAqcGFnZSkKKyAqCisgKglFbnN1cmUgbm8gRCBjYWNoZSBhbGlhc2luZyBvY2N1cnMsIGVpdGhlciB3aXRoIGl0c2VsZiBvcgorICoJdGhlIEkgY2FjaGUKKyAqCisgKgktIHBhZ2UJLSBwYWdlIGFsaWduZWQgYWRkcmVzcworICovCitFTlRSWShhcm0xMDIyX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYWRkCXIxLCByMCwgI1BBR0VfU1oKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9pbnZfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglJbnZhbGlkYXRlIChkaXNjYXJkKSB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCU1heSBub3Qgd3JpdGUgYmFjayBhbnkgZW50cmllcy4gIElmICdzdGFydCcgb3IgJ2VuZCcKKyAqCWFyZSBub3QgY2FjaGUgbGluZSBhbGlnbmVkLCB0aG9zZSBsaW5lcyBtdXN0IGJlIHdyaXR0ZW4KKyAqCWJhY2suCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKgorICogKHNhbWUgYXMgdjR3YikKKyAqLworRU5UUlkoYXJtMTAyMl9kbWFfaW52X3JhbmdlKQorCW1vdglpcCwgIzAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCXRzdAlyMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCXRzdAlyMSwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIxLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNlbmRpZgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJQ2xlYW4gdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKgorICogKHNhbWUgYXMgdjR3YikKKyAqLworRU5UUlkoYXJtMTAyMl9kbWFfY2xlYW5fcmFuZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtMTAyMl9kbWFfZmx1c2hfcmFuZ2UpCisJbW92CWlwLCAjMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworRU5UUlkoYXJtMTAyMl9jYWNoZV9mbnMpCisJLmxvbmcJYXJtMTAyMl9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCS5sb25nCWFybTEwMjJfZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwkubG9uZwlhcm0xMDIyX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwkubG9uZwlhcm0xMDIyX2NvaGVyZW50X2tlcm5fcmFuZ2UKKwkubG9uZwlhcm0xMDIyX2NvaGVyZW50X3VzZXJfcmFuZ2UKKwkubG9uZwlhcm0xMDIyX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UKKwkubG9uZwlhcm0xMDIyX2RtYV9pbnZfcmFuZ2UKKwkubG9uZwlhcm0xMDIyX2RtYV9jbGVhbl9yYW5nZQorCS5sb25nCWFybTEwMjJfZG1hX2ZsdXNoX3JhbmdlCisKKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjJfZGNhY2hlX2NsZWFuX2FyZWEpCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltb3YJaXAsICMwCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCXN1YnMJcjEsIHIxLCAjQ0FDSEVfRExJTkVTSVpFCisJYmhpCTFiCisjZW5kaWYKKwltb3YJcGMsIGxyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFnZVRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogY3B1X2FybTEwMjJfc3dpdGNoX21tKHBnZCkKKyAqCisgKiBTZXQgdGhlIHRyYW5zbGF0aW9uIGJhc2UgcG9pbnRlciB0byBiZSBhcyBkZXNjcmliZWQgYnkgcGdkLgorICoKKyAqIHBnZDogbmV3IHBhZ2UgdGFibGVzCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjJfc3dpdGNoX21tKQorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJbW92CXIxLCAjKENBQ0hFX0RTRUdNRU5UUyAtIDEpIDw8IDUJQCAxNiBzZWdtZW50cworMToJb3JyCXIzLCByMSwgIyhDQUNIRV9ERU5UUklFUyAtIDEpIDw8IDI2IEAgNjQgZW50cmllcworMjoJbWNyCXAxNSwgMCwgcjMsIGM3LCBjMTQsIDIJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGluZGV4CisJc3VicwlyMywgcjMsICMxIDw8IDI2CisJYmNzCTJiCQkJCUAgZW50cmllcyA2MyB0byAwCisJc3VicwlyMSwgcjEsICMxIDw8IDUKKwliY3MJMWIJCQkJQCBzZWdtZW50cyAxNSB0byAwCisjZW5kaWYKKwltb3YJcjEsICMwCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMSwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJbWNyCXAxNSwgMCwgcjEsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltb3YJcGMsIGxyCisgICAgICAgIAorLyoKKyAqIGNwdV9hcm0xMDIyX3NldF9wdGUocHRlcCwgcHRlKQorICoKKyAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjJfc2V0X3B0ZSkKKwlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCisKKwllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQorCisJYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCisJYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKKwlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKKworCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/CisJb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKKworCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/CisJb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKKworCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nPworCW1vdm5lCXIyLCAjMAorCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJZW9yCXIzLCByMSwgIzB4MGEJCQlAIEMgJiBzbWFsbCBwYWdlPworCXRzdAlyMywgIzB4MGIKKwliaWNlcQlyMiwgcjIsICM0CisjZW5kaWYKKwlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwltb3YJcjAsIHIwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisjZW5kaWYKKwltb3YJcGMsIGxyCisKKwlfX0lOSVQKKworCS50eXBlCV9fYXJtMTAyMl9zZXR1cCwgI2Z1bmN0aW9uCitfX2FybTEwMjJfc2V0dXA6CisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcJCUAgaW52YWxpZGF0ZSBJLEQgY2FjaGVzIG9uIHY0CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyIG9uIHY0CisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNwkJQCBpbnZhbGlkYXRlIEksRCBUTEJzIG9uIHY0CisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMAkJQCBnZXQgY29udHJvbCByZWdpc3RlciB2NAorCWxkcglyNSwgYXJtMTAyMl9jcjFfY2xlYXIKKwliaWMJcjAsIHIwLCByNQorCWxkcglyNSwgYXJtMTAyMl9jcjFfc2V0CisJb3JyCXIwLCByMCwgcjUKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOCisJb3JyCXIwLCByMCwgIzB4NDAwMCAJCUAgLlIuLi4uLi4uLi4uLi4uLgorI2VuZGlmCisJbW92CXBjLCBscgorCS5zaXplCV9fYXJtMTAyMl9zZXR1cCwgLiAtIF9fYXJtMTAyMl9zZXR1cAorCisJLyoKKwkgKiAgUgorCSAqIC5SVkkgWkZSUyBCTERQIFdDQU0KKwkgKiAuMDExIDEwMDEgLi4xMSAwMTAxCisJICogCisJICovCisJLnR5cGUJYXJtMTAyMl9jcjFfY2xlYXIsICNvYmplY3QKKwkudHlwZQlhcm0xMDIyX2NyMV9zZXQsICNvYmplY3QKK2FybTEwMjJfY3IxX2NsZWFyOgorCS53b3JkCTB4N2YzZgorYXJtMTAyMl9jcjFfc2V0OgorCS53b3JkCTB4MzkzNQorCisJX19JTklUREFUQQorCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCS50eXBlCWFybTEwMjJfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorYXJtMTAyMl9wcm9jZXNzb3JfZnVuY3Rpb25zOgorCS53b3JkCXY0dF9lYXJseV9hYm9ydAorCS53b3JkCWNwdV9hcm0xMDIyX3Byb2NfaW5pdAorCS53b3JkCWNwdV9hcm0xMDIyX3Byb2NfZmluCisJLndvcmQJY3B1X2FybTEwMjJfcmVzZXQKKwkud29yZAljcHVfYXJtMTAyMl9kb19pZGxlCisJLndvcmQJY3B1X2FybTEwMjJfZGNhY2hlX2NsZWFuX2FyZWEKKwkud29yZAljcHVfYXJtMTAyMl9zd2l0Y2hfbW0KKwkud29yZAljcHVfYXJtMTAyMl9zZXRfcHRlCisJLnNpemUJYXJtMTAyMl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyMl9wcm9jZXNzb3JfZnVuY3Rpb25zCisKKwkuc2VjdGlvbiAiLnJvZGF0YSIKKworCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKK2NwdV9hcmNoX25hbWU6CisJLmFzY2l6CSJhcm12NXRlIgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY1IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1X2FybTEwMjJfbmFtZSwgI29iamVjdAorY3B1X2FybTEwMjJfbmFtZToKKwkuYXNjaWkJImFybTEwMjIiCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwkuYXNjaWkJImkiCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCS5hc2NpaQkiZCIKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwkuYXNjaWkJIih3dCkiCisjZWxzZQorCS5hc2NpaQkiKHdiKSIKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRQorCS5hc2NpaQkiQiIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVfQ0FDSEVfUk9VTkRfUk9CSU4KKwkuYXNjaWkJIlJSIgorI2VuZGlmCisJLmFzY2lpCSJcMCIKKwkuc2l6ZQljcHVfYXJtMTAyMl9uYW1lLCAuIC0gY3B1X2FybTEwMjJfbmFtZQorCisJLmFsaWduCisKKwkuc2VjdGlvbiAiLnByb2MuaW5mbyIsICNhbGxvYywgI2V4ZWNpbnN0cgorCisJLnR5cGUJX19hcm0xMDIyX3Byb2NfaW5mbywjb2JqZWN0CitfX2FybTEwMjJfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwNWEyMjAJCQlAIEFSTSAxMDIyRSAodjVURSkKKwkubG9uZwkweGZmMGZmZmYwCisJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAorCQlQTURfQklUNCB8IFwKKwkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQKKwliCV9fYXJtMTAyMl9zZXR1cAorCS5sb25nCWNwdV9hcmNoX25hbWUKKwkubG9uZwljcHVfZWxmX25hbWUKKwkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfVEhVTUIgfCBIV0NBUF9FRFNQCisJLmxvbmcJY3B1X2FybTEwMjJfbmFtZQorCS5sb25nCWFybTEwMjJfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl2NHdiX3VzZXJfZm5zCisJLmxvbmcJYXJtMTAyMl9jYWNoZV9mbnMKKwkuc2l6ZQlfX2FybTEwMjJfcHJvY19pbmZvLCAuIC0gX19hcm0xMDIyX3Byb2NfaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDgxMTBjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlM6IE1NVSBmdW5jdGlvbnMgZm9yIEFSTTEwMjZFSi1TCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGxvdyBsZXZlbCBhc3NlbWJsZXIgZm9yIHBlcmZvcm1pbmcgY2FjaGUgYW5kIFRMQgorICogZnVuY3Rpb25zIG9uIHRoZSBBUk0xMDI2RUotUy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworLyoKKyAqIFRoaXMgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhbiBhcmVhIHdoaWNoIHdpbGwgYmUgaW52YWxpZGF0ZWQKKyAqIHVzaW5nIHRoZSBzaW5nbGUgaW52YWxpZGF0ZSBlbnRyeSBpbnN0cnVjdGlvbnMuICBBbnl0aGluZyBsYXJnZXIKKyAqIHRoYW4gdGhpcywgYW5kIHdlIGdvIGZvciB0aGUgd2hvbGUgY2FjaGUuCisgKgorICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgY2hvc2VuIHN1Y2ggdGhhdCB3ZSBjaG9vc2UgdGhlIGNoZWFwZXN0CisgKiBhbHRlcm5hdGl2ZS4KKyAqLworI2RlZmluZSBNQVhfQVJFQV9TSVpFCTMyNzY4CisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvbmUgZGF0YSBjYWNoZSBsaW5lLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU5FU0laRQkzMgorCisvKgorICogVGhlIG51bWJlciBvZiBkYXRhIGNhY2hlIHNlZ21lbnRzLgorICovCisjZGVmaW5lIENBQ0hFX0RTRUdNRU5UUwkxNgorCisvKgorICogVGhlIG51bWJlciBvZiBsaW5lcyBpbiBhIGNhY2hlIHNlZ21lbnQuCisgKi8KKyNkZWZpbmUgQ0FDSEVfREVOVFJJRVMJNjQKKworLyoKKyAqIFRoaXMgaXMgdGhlIHNpemUgYXQgd2hpY2ggaXQgYmVjb21lcyBtb3JlIGVmZmljaWVudCB0bworICogY2xlYW4gdGhlIHdob2xlIGNhY2hlLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgaW5kaXZpZHVhbAorICogY2FjaGUgbGluZSBtYWludGFpbmVuY2UgaW5zdHJ1Y3Rpb25zLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU1JVAkzMjc2OAorCisJLnRleHQKKy8qCisgKiBjcHVfYXJtMTAyNl9wcm9jX2luaXQoKQorICovCitFTlRSWShjcHVfYXJtMTAyNl9wcm9jX2luaXQpCisJbW92CXBjLCBscgorCisvKgorICogY3B1X2FybTEwMjZfcHJvY19maW4oKQorICovCitFTlRSWShjcHVfYXJtMTAyNl9wcm9jX2ZpbikKKwlzdG1mZAlzcCEsIHtscn0KKwltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQorCW1zcgljcHNyX2MsIGlwCisJYmwJYXJtMTAyNl9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlyMCwgcjAsICMweDEwMDAgCQlAIC4uLmkuLi4uLi4uLi4uLi4KKwliaWMJcjAsIHIwLCAjMHgwMDBlIAkJQCAuLi4uLi4uLi4uLi53Y2EuCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcworCWxkbWZkCXNwISwge3BjfQorCisvKgorICogY3B1X2FybTEwMjZfcmVzZXQobG9jKQorICoKKyAqIFBlcmZvcm0gYSBzb2Z0IHJlc2V0IG9mIHRoZSBzeXN0ZW0uCVB1dCB0aGUgQ1BVIGludG8gdGhlCisgKiBzYW1lIHN0YXRlIGFzIGl0IHdvdWxkIGJlIGlmIGl0IGhhZCBiZWVuIHJlc2V0LCBhbmQgYnJhbmNoCisgKiB0byB3aGF0IHdvdWxkIGJlIHRoZSByZXNldCB2ZWN0b3IuCisgKgorICogbG9jOiBsb2NhdGlvbiB0byBqdW1wIHRvIGZvciBzb2Z0IHJlc2V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjZfcmVzZXQpCisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLEQgY2FjaGVzCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSAmIEQgVExCcworCW1yYwlwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlpcCwgaXAsICMweDAwMGYgCQlAIC4uLi4uLi4uLi4uLndjYW0KKwliaWMJaXAsIGlwLCAjMHgxMTAwIAkJQCAuLi5pLi4ucy4uLi4uLi4uCisJbWNyCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJbW92CXBjLCByMAorCisvKgorICogY3B1X2FybTEwMjZfZG9faWRsZSgpCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjZfZG9faWRsZSkKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0CQlAIFdhaXQgZm9yIGludGVycnVwdAorCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENBQ0hFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKwkuYWxpZ24JNQorLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfYWxsKCkKKyAqCisgKglJbnZhbGlkYXRlIGFsbCBjYWNoZSBlbnRyaWVzIGluIGEgcGFydGljdWxhciBhZGRyZXNzCisgKglzcGFjZS4KKyAqLworRU5UUlkoYXJtMTAyNl9mbHVzaF91c2VyX2NhY2hlX2FsbCkKKwkvKiBGQUxMVEhST1VHSCAqLworLyoKKyAqCWZsdXNoX2tlcm5fY2FjaGVfYWxsKCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgZW50aXJlIGNhY2hlLgorICovCitFTlRSWShhcm0xMDI2X2ZsdXNoX2tlcm5fY2FjaGVfYWxsKQorCW1vdglyMiwgI1ZNX0VYRUMKKwltb3YJaXAsICMwCitfX2ZsdXNoX3dob2xlX2NhY2hlOgorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisxOgltcmMJcDE1LCAwLCByMTUsIGM3LCBjMTQsIDMJCUAgdGVzdCwgY2xlYW4sIGludmFsaWRhdGUKKwlibmUJMWIKKyNlbmRpZgorCXRzdAlyMiwgI1ZNX0VYRUMKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKyNlbmRpZgorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF91c2VyX2NhY2hlX3JhbmdlKHN0YXJ0LCBlbmQsIGZsYWdzKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBjYWNoZSBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQKKyAqCWFkZHJlc3Mgc3BhY2UuCisgKgorICoJLSBzdGFydAktIHN0YXJ0IGFkZHJlc3MgKGluY2x1c2l2ZSkKKyAqCS0gZW5kCS0gZW5kIGFkZHJlc3MgKGV4Y2x1c2l2ZSkKKyAqCS0gZmxhZ3MJLSB2bV9mbGFncyBmb3IgdGhpcyBzcGFjZQorICovCitFTlRSWShhcm0xMDI2X2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UpCisJbW92CWlwLCAjMAorCXN1YglyMywgcjEsIHIwCQkJQCBjYWxjdWxhdGUgdG90YWwgc2l6ZQorCWNtcAlyMywgI0NBQ0hFX0RMSU1JVAorCWJocwlfX2ZsdXNoX3dob2xlX2NhY2hlCisKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNlbmRpZgorCXRzdAlyMiwgI1ZNX0VYRUMKKyNpZm5kZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKyNlbmRpZgorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKgljb2hlcmVudF9rZXJuX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTEwMjZfY29oZXJlbnRfa2Vybl9yYW5nZSkKKwkvKiBGQUxMVEhST1VHSCAqLworLyoKKyAqCWNvaGVyZW50X3VzZXJfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtMTAyNl9jb2hlcmVudF91c2VyX3JhbmdlKQorCW1vdglpcCwgIzAKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorMToKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkJQCBpbnZhbGlkYXRlIEkgZW50cnkKKyNlbmRpZgorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF9rZXJuX2RjYWNoZV9wYWdlKHZvaWQgKnBhZ2UpCisgKgorICoJRW5zdXJlIG5vIEQgY2FjaGUgYWxpYXNpbmcgb2NjdXJzLCBlaXRoZXIgd2l0aCBpdHNlbGYgb3IKKyAqCXRoZSBJIGNhY2hlCisgKgorICoJLSBwYWdlCS0gcGFnZSBhbGlnbmVkIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtMTAyNl9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlKQorCW1vdglpcCwgIzAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCWFkZAlyMSwgcjAsICNQQUdFX1NaCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJSW52YWxpZGF0ZSAoZGlzY2FyZCkgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKglNYXkgbm90IHdyaXRlIGJhY2sgYW55IGVudHJpZXMuICBJZiAnc3RhcnQnIG9yICdlbmQnCisgKglhcmUgbm90IGNhY2hlIGxpbmUgYWxpZ25lZCwgdGhvc2UgbGluZXMgbXVzdCBiZSB3cml0dGVuCisgKgliYWNrLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqIChzYW1lIGFzIHY0d2IpCisgKi8KK0VOVFJZKGFybTEwMjZfZG1hX2ludl9yYW5nZSkKKwltb3YJaXAsICMwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwl0c3QJcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwl0c3QJcjEsICNDQUNIRV9ETElORVNJWkUgLSAxCisJbWNybmUJcDE1LCAwLCByMSwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9jbGVhbl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqIChzYW1lIGFzIHY0d2IpCisgKi8KK0VOVFJZKGFybTEwMjZfZG1hX2NsZWFuX3JhbmdlKQorCW1vdglpcCwgIzAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKyNlbmRpZgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTEwMjZfZG1hX2ZsdXNoX3JhbmdlKQorCW1vdglpcCwgIzAKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKK0VOVFJZKGFybTEwMjZfY2FjaGVfZm5zKQorCS5sb25nCWFybTEwMjZfZmx1c2hfa2Vybl9jYWNoZV9hbGwKKwkubG9uZwlhcm0xMDI2X2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJYXJtMTAyNl9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCisJLmxvbmcJYXJtMTAyNl9jb2hlcmVudF9rZXJuX3JhbmdlCisJLmxvbmcJYXJtMTAyNl9jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJYXJtMTAyNl9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlCisJLmxvbmcJYXJtMTAyNl9kbWFfaW52X3JhbmdlCisJLmxvbmcJYXJtMTAyNl9kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwlhcm0xMDI2X2RtYV9mbHVzaF9yYW5nZQorCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm0xMDI2X2RjYWNoZV9jbGVhbl9hcmVhKQorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJbW92CWlwLCAjMAorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwlzdWJzCXIxLCByMSwgI0NBQ0hFX0RMSU5FU0laRQorCWJoaQkxYgorI2VuZGlmCisJbW92CXBjLCBscgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhZ2VUYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAqIGNwdV9hcm0xMDI2X3N3aXRjaF9tbShwZ2QpCisgKgorICogU2V0IHRoZSB0cmFuc2xhdGlvbiBiYXNlIHBvaW50ZXIgdG8gYmUgYXMgZGVzY3JpYmVkIGJ5IHBnZC4KKyAqCisgKiBwZ2Q6IG5ldyBwYWdlIHRhYmxlcworICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm0xMDI2X3N3aXRjaF9tbSkKKwltb3YJcjEsICMwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKzE6CW1yYwlwMTUsIDAsIHIxNSwgYzcsIGMxNCwgMwkJQCB0ZXN0LCBjbGVhbiwgaW52YWxpZGF0ZQorCWJuZQkxYgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMSwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJbWNyCXAxNSwgMCwgcjEsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltb3YJcGMsIGxyCisgICAgICAgIAorLyoKKyAqIGNwdV9hcm0xMDI2X3NldF9wdGUocHRlcCwgcHRlKQorICoKKyAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTEwMjZfc2V0X3B0ZSkKKwlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCisKKwllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQorCisJYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCisJYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKKwlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKKworCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/CisJb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKKworCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/CisJb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKKworCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nPworCW1vdm5lCXIyLCAjMAorCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJZW9yCXIzLCByMSwgIzB4MGEJCQlAIEMgJiBzbWFsbCBwYWdlPworCXRzdAlyMywgIzB4MGIKKwliaWNlcQlyMiwgcjIsICM0CisjZW5kaWYKKwlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwltb3YJcjAsIHIwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisjZW5kaWYKKwltb3YJcGMsIGxyCisKKworCV9fSU5JVAorCisJLnR5cGUJX19hcm0xMDI2X3NldHVwLCAjZnVuY3Rpb24KK19fYXJtMTAyNl9zZXR1cDoKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNwkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMgb24gdjQKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiB3cml0ZSBidWZmZXIgb24gdjQKKwltY3IJcDE1LCAwLCByMCwgYzgsIGM3CQlAIGludmFsaWRhdGUgSSxEIFRMQnMgb24gdjQKKwltY3IJcDE1LCAwLCByNCwgYzIsIGMwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJbW92CXIwLCAjNAkJCQlAIGV4cGxpY2l0bHkgZGlzYWJsZSB3cml0ZWJhY2sKKwltY3IJcDE1LCA3LCByMCwgYzE1LCBjMCwgMAorI2VuZGlmCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMAkJQCBnZXQgY29udHJvbCByZWdpc3RlciB2NAorCWxkcglyNSwgYXJtMTAyNl9jcjFfY2xlYXIKKwliaWMJcjAsIHIwLCByNQorCWxkcglyNSwgYXJtMTAyNl9jcjFfc2V0CisJb3JyCXIwLCByMCwgcjUKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOCisJb3JyCXIwLCByMCwgIzB4NDAwMCAJCUAgLlIuLiAuLi4uIC4uLi4gLi4uLgorI2VuZGlmCisJbW92CXBjLCBscgorCS5zaXplCV9fYXJtMTAyNl9zZXR1cCwgLiAtIF9fYXJtMTAyNl9zZXR1cAorCisJLyoKKwkgKiAgUgorCSAqIC5SVkkgWkZSUyBCTERQIFdDQU0KKwkgKiAuMDExIDEwMDEgLi4xMSAwMTAxCisJICogCisJICovCisJLnR5cGUJYXJtMTAyNl9jcjFfY2xlYXIsICNvYmplY3QKKwkudHlwZQlhcm0xMDI2X2NyMV9zZXQsICNvYmplY3QKK2FybTEwMjZfY3IxX2NsZWFyOgorCS53b3JkCTB4N2YzZgorYXJtMTAyNl9jcjFfc2V0OgorCS53b3JkCTB4MzkzNQorCisJX19JTklUREFUQQorCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCS50eXBlCWFybTEwMjZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zOgorCS53b3JkCXY1dF9lYXJseV9hYm9ydAorCS53b3JkCWNwdV9hcm0xMDI2X3Byb2NfaW5pdAorCS53b3JkCWNwdV9hcm0xMDI2X3Byb2NfZmluCisJLndvcmQJY3B1X2FybTEwMjZfcmVzZXQKKwkud29yZAljcHVfYXJtMTAyNl9kb19pZGxlCisJLndvcmQJY3B1X2FybTEwMjZfZGNhY2hlX2NsZWFuX2FyZWEKKwkud29yZAljcHVfYXJtMTAyNl9zd2l0Y2hfbW0KKwkud29yZAljcHVfYXJtMTAyNl9zZXRfcHRlCisJLnNpemUJYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zCisKKwkuc2VjdGlvbiAucm9kYXRhCisKKwkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0CitjcHVfYXJjaF9uYW1lOgorCS5hc2NpegkiYXJtdjV0ZWoiCisJLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKKworCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAorY3B1X2VsZl9uYW1lOgorCS5hc2NpegkidjUiCisJLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCisJLmFsaWduCisKKwkudHlwZQljcHVfYXJtMTAyNl9uYW1lLCAjb2JqZWN0CitjcHVfYXJtMTAyNl9uYW1lOgorCS5hc2NpaQkiQVJNMTAyNkVKLVMiCisjaWZuZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwkuYXNjaWkJImkiCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCS5hc2NpaQkiZCIKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwkuYXNjaWkJIih3dCkiCisjZWxzZQorCS5hc2NpaQkiKHdiKSIKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRQorCS5hc2NpaQkiQiIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVfQ0FDSEVfUk9VTkRfUk9CSU4KKwkuYXNjaWkJIlJSIgorI2VuZGlmCisJLmFzY2lpCSJcMCIKKwkuc2l6ZQljcHVfYXJtMTAyNl9uYW1lLCAuIC0gY3B1X2FybTEwMjZfbmFtZQorCisJLmFsaWduCisKKwkuc2VjdGlvbiAiLnByb2MuaW5mbyIsICNhbGxvYywgI2V4ZWNpbnN0cgorCisJLnR5cGUJX19hcm0xMDI2X3Byb2NfaW5mbywjb2JqZWN0CitfX2FybTEwMjZfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwNmEyNjAJCQlAIEFSTSAxMDI2RUotUyAodjVURUopCisJLmxvbmcJMHhmZjBmZmZmMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX0JJVDQgfCBcCisJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAorCQlQTURfU0VDVF9BUF9SRUFECisJYglfX2FybTEwMjZfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1B8SFdDQVBfSkFWQQorCS5sb25nCWNwdV9hcm0xMDI2X25hbWUKKwkubG9uZwlhcm0xMDI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJdjR3Yl91c2VyX2ZucworCS5sb25nCWFybTEwMjZfY2FjaGVfZm5zCisJLnNpemUJX19hcm0xMDI2X3Byb2NfaW5mbywgLiAtIF9fYXJtMTAyNl9wcm9jX2luZm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZTIxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL3Byb2MtYXJtNiw3LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhlc2UgYXJlIHRoZSBsb3cgbGV2ZWwgYXNzZW1ibGVyIGZvciBwZXJmb3JtaW5nIGNhY2hlIGFuZCBUTEIKKyAqICBmdW5jdGlvbnMgb24gdGhlIEFSTTYxMCAmIEFSTTcxMC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworRU5UUlkoY3B1X2FybTZfZGNhY2hlX2NsZWFuX2FyZWEpCitFTlRSWShjcHVfYXJtN19kY2FjaGVfY2xlYW5fYXJlYSkKKwkJbW92CXBjLCBscgorCisvKgorICogRnVuY3Rpb246IGFybTZfN19kYXRhX2Fib3J0ICgpCisgKgorICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCisgKgkgICA6IHNwID0gcG9pbnRlciB0byByZWdpc3RlcnMKKyAqCisgKiBQdXJwb3NlIDogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgYWJvcnRlZCBpbnN0cnVjdGlvbgorICoKKyAqIFJldHVybnMgOiByMCA9IGFkZHJlc3Mgb2YgYWJvcnQKKyAqCSAgIDogcjEgPSBGU1IKKyAqLworCitFTlRSWShjcHVfYXJtN19kYXRhX2Fib3J0KQorCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgorCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgorCWxkcglyOCwgW3IwXQkJCUAgcmVhZCBhcm0gaW5zdHJ1Y3Rpb24KKwl0c3QJcjgsICMxIDw8IDIwCQkJQCBMID0gMSAtPiB3cml0ZT8KKwlvcnJlcQlyMSwgcjEsICMxIDw8IDgJCQlAIHllcy4KKwlhbmQJcjcsIHI4LCAjMTUgPDwgMjQKKwlhZGQJcGMsIHBjLCByNywgbHNyICMyMgkJQCBOb3cgYnJhbmNoIHRvIHRoZSByZWxldmFudCBwcm9jZXNzaW5nIHJvdXRpbmUKKwlub3AKKworLyogMCAqLwliCS5kYXRhX3Vua25vd24KKy8qIDEgKi8JbW92CXBjLCBscgkJCQlAIHN3cAorLyogMiAqLwliCS5kYXRhX3Vua25vd24KKy8qIDMgKi8JYgkuZGF0YV91bmtub3duCisvKiA0ICovCWIJLmRhdGFfYXJtX2xhdGVsZHJwb3N0Y29uc3QJQCBsZHIJcmQsIFtybl0sICNtCisvKiA1ICovCWIJLmRhdGFfYXJtX2xhdGVsZHJwcmVjb25zdAlAIGxkcglyZCwgW3JuLCAjbV0KKy8qIDYgKi8JYgkuZGF0YV9hcm1fbGF0ZWxkcnBvc3RyZWcJQCBsZHIJcmQsIFtybl0sIHJtCisvKiA3ICovCWIJLmRhdGFfYXJtX2xhdGVsZHJwcmVyZWcJCUAgbGRyCXJkLCBbcm4sIHJtXQorLyogOCAqLwliCS5kYXRhX2FybV9sZG1zdG0JCUAgbGRtKmEJcm4sIDxybGlzdD4KKy8qIDkgKi8JYgkuZGF0YV9hcm1fbGRtc3RtCQlAIGxkbSpiCXJuLCA8cmxpc3Q+CisvKiBhICovCWIJLmRhdGFfdW5rbm93bgorLyogYiAqLwliCS5kYXRhX3Vua25vd24KKy8qIGMgKi8JbW92CXBjLCBscgkJCQlAIGxkYwlyZCwgW3JuXSwgI20JQCBTYW1lIGFzIGxkcglyZCwgW3JuXSwgI20KKy8qIGQgKi8JbW92CXBjLCBscgkJCQlAIGxkYwlyZCwgW3JuLCAjbV0KKy8qIGUgKi8JYgkuZGF0YV91bmtub3duCisvKiBmICovCisuZGF0YV91bmtub3duOglAIFBhcnQgb2YganVtcHRhYmxlCisJbW92CXIwLCByMgorCW1vdglyMSwgcjgKKwltb3YJcjIsIHNwCisJYmwJYmFkZGF0YWFib3J0CisJYglyZXRfZnJvbV9leGNlcHRpb24KKworRU5UUlkoY3B1X2FybTZfZGF0YV9hYm9ydCkKKwltcmMJcDE1LCAwLCByMSwgYzUsIGMwLCAwCQlAIGdldCBGU1IKKwltcmMJcDE1LCAwLCByMCwgYzYsIGMwLCAwCQlAIGdldCBGQVIKKwlsZHIJcjgsIFtyMl0JCQlAIHJlYWQgYXJtIGluc3RydWN0aW9uCisJdHN0CXI4LCAjMSA8PCAyMAkJCUAgTCA9IDEgLT4gd3JpdGU/CisJb3JyZXEJcjEsIHIxLCAjMSA8PCA4CQkJQCB5ZXMuCisJYW5kCXI3LCByOCwgIzE0IDw8IDI0CisJdGVxCXI3LCAjOCA8PCAyNAkJCUAgd2FzIGl0IGxkbS9zdG0KKwltb3ZuZQlwYywgbHIKKworLmRhdGFfYXJtX2xkbXN0bToKKwl0c3QJcjgsICMxIDw8IDIxCQkJQCBjaGVjayB3cml0ZWJhY2sgYml0CisJbW92ZXEJcGMsIGxyCQkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCisJbW92CXI3LCAjMHgxMQorCW9ycglyNywgcjcsICMweDExMDAKKwlhbmQJcjYsIHI4LCByNworCWFuZAlyMiwgcjgsIHI3LCBsc2wgIzEKKwlhZGQJcjYsIHI2LCByMiwgbHNyICMxCisJYW5kCXIyLCByOCwgcjcsIGxzbCAjMgorCWFkZAlyNiwgcjYsIHIyLCBsc3IgIzIKKwlhbmQJcjIsIHI4LCByNywgbHNsICMzCisJYWRkCXI2LCByNiwgcjIsIGxzciAjMworCWFkZAlyNiwgcjYsIHI2LCBsc3IgIzgKKwlhZGQJcjYsIHI2LCByNiwgbHNyICM0CisJYW5kCXI2LCByNiwgIzE1CQkJQCByNiA9IG5vLiBvZiByZWdpc3RlcnMgdG8gdHJhbnNmZXIuCisJYW5kCXI1LCByOCwgIzE1IDw8IDE2CQlAIEV4dHJhY3QgJ24nIGZyb20gaW5zdHJ1Y3Rpb24KKwlsZHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIEdldCByZWdpc3RlciAnUm4nCisJdHN0CXI4LCAjMSA8PCAyMwkJCUAgQ2hlY2sgVSBiaXQKKwlzdWJuZQlyNywgcjcsIHI2LCBsc2wgIzIJCUAgVW5kbyBpbmNyZW1lbnQKKwlhZGRlcQlyNywgcjcsIHI2LCBsc2wgIzIJCUAgVW5kbyBkZWNyZW1lbnQKKwlzdHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIFB1dCByZWdpc3RlciAnUm4nCisJbW92CXBjLCBscgorCisuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuOgorCWFuZAlyNSwgcjgsICMxNSA8PCAxNgkJQCBFeHRyYWN0ICduJyBmcm9tIGluc3RydWN0aW9uCisJbGRyCXI3LCBbc3AsIHI1LCBsc3IgIzE0XQkJQCBHZXQgcmVnaXN0ZXIgJ1JuJworCXRzdAlyOCwgIzEgPDwgMjMJCQlAIENoZWNrIFUgYml0CisJc3VibmUJcjcsIHI3LCByNgkJCUAgVW5kbyBpbmNybWVuZXQKKwlhZGRlcQlyNywgcjcsIHI2CQkJQCBVbmRvIGRlY3JlbWVudAorCXN0cglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgUHV0IHJlZ2lzdGVyICdSbicKKwltb3YJcGMsIGxyCisKKy5kYXRhX2FybV9sYXRlbGRycHJlY29uc3Q6CisJdHN0CXI4LCAjMSA8PCAyMQkJCUAgY2hlY2sgd3JpdGViYWNrIGJpdAorCW1vdmVxCXBjLCBscgkJCQlAIG5vIHdyaXRlYmFjayAtPiBubyBmaXh1cAorLmRhdGFfYXJtX2xhdGVsZHJwb3N0Y29uc3Q6CisJbW92cwlyMiwgcjgsIGxzbCAjMjAJCQlAIEdldCBvZmZzZXQKKwltb3ZlcQlwYywgbHIJCQkJQCB6ZXJvIC0+IG5vIGZpeHVwCisJYW5kCXI1LCByOCwgIzE1IDw8IDE2CQlAIEV4dHJhY3QgJ24nIGZyb20gaW5zdHJ1Y3Rpb24KKwlsZHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIEdldCByZWdpc3RlciAnUm4nCisJdHN0CXI4LCAjMSA8PCAyMwkJCUAgQ2hlY2sgVSBiaXQKKwlzdWJuZQlyNywgcjcsIHIyLCBsc3IgIzIwCQlAIFVuZG8gaW5jcmVtZW50CisJYWRkZXEJcjcsIHI3LCByMiwgbHNyICMyMAkJQCBVbmRvIGRlY3JlbWVudAorCXN0cglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgUHV0IHJlZ2lzdGVyICdSbicKKwltb3YJcGMsIGxyCisKKy5kYXRhX2FybV9sYXRlbGRycHJlcmVnOgorCXRzdAlyOCwgIzEgPDwgMjEJCQlAIGNoZWNrIHdyaXRlYmFjayBiaXQKKwltb3ZlcQlwYywgbHIJCQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKKy5kYXRhX2FybV9sYXRlbGRycG9zdHJlZzoKKwlhbmQJcjcsIHI4LCAjMTUJCQlAIEV4dHJhY3QgJ20nIGZyb20gaW5zdHJ1Y3Rpb24KKwlsZHIJcjYsIFtzcCwgcjcsIGxzbCAjMl0JCUAgR2V0IHJlZ2lzdGVyICdSbScKKwltb3YJcjUsIHI4LCBsc3IgIzcJCQlAIGdldCBzaGlmdCBjb3VudAorCWFuZHMJcjUsIHI1LCAjMzEKKwlhbmQJcjcsIHI4LCAjMHg3MAkJCUAgZ2V0IHNoaWZ0IHR5cGUKKwlvcnJlcQlyNywgcjcsICM4CQkJQCBzaGlmdCBjb3VudCA9IDAKKwlhZGQJcGMsIHBjLCByNworCW5vcAorCisJbW92CXI2LCByNiwgbHNsIHI1CQkJQCAwOiBMU0wgIyEwCisJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCisJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCUAgMTogTFNMICMwCisJbm9wCisJYgkuZGF0YV91bmtub3duCQkJQCAyOiBNVUw/CisJbm9wCisJYgkuZGF0YV91bmtub3duCQkJQCAzOiBNVUw/CisJbm9wCisJbW92CXI2LCByNiwgbHNyIHI1CQkJQCA0OiBMU1IgIyEwCisJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCisJbW92CXI2LCByNiwgbHNyICMzMgkJCUAgNTogTFNSICMzMgorCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgorCWIJLmRhdGFfdW5rbm93bgkJCUAgNjogTVVMPworCW5vcAorCWIJLmRhdGFfdW5rbm93bgkJCUAgNzogTVVMPworCW5vcAorCW1vdglyNiwgcjYsIGFzciByNQkJCUAgODogQVNSICMhMAorCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgorCW1vdglyNiwgcjYsIGFzciAjMzIJCQlAIDk6IEFTUiAjMzIKKwliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KKwliCS5kYXRhX3Vua25vd24JCQlAIEE6IE1VTD8KKwlub3AKKwliCS5kYXRhX3Vua25vd24JCQlAIEI6IE1VTD8KKwlub3AKKwltb3YJcjYsIHI2LCByb3IgcjUJCQlAIEM6IFJPUiAjITAKKwliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KKwltb3YJcjYsIHI2LCBycngJCQlAIEQ6IFJSWAorCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgorCWIJLmRhdGFfdW5rbm93bgkJCUAgRTogTVVMPworCW5vcAorCWIJLmRhdGFfdW5rbm93bgkJCUAgRjogTVVMPworCisvKgorICogRnVuY3Rpb246IGFybTZfN19wcm9jX2luaXQgKHZvaWQpCisgKgkgICA6IGFybTZfN19wcm9jX2ZpbiAodm9pZCkKKyAqCisgKiBOb3RlcyAgIDogVGhpcyBwcm9jZXNzb3IgZG9lcyBub3QgcmVxdWlyZSB0aGVzZQorICovCitFTlRSWShjcHVfYXJtNl9wcm9jX2luaXQpCitFTlRSWShjcHVfYXJtN19wcm9jX2luaXQpCisJCW1vdglwYywgbHIKKworRU5UUlkoY3B1X2FybTZfcHJvY19maW4pCitFTlRSWShjcHVfYXJtN19wcm9jX2ZpbikKKwkJbW92CXIwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKKwkJbXNyCWNwc3JfYywgcjAKKwkJbW92CXIwLCAjMHgzMQkJCUAgLi4uLlMuLkRQLi4uTQorCQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCisJCW1vdglwYywgbHIKKworRU5UUlkoY3B1X2FybTZfZG9faWRsZSkKK0VOVFJZKGNwdV9hcm03X2RvX2lkbGUpCisJCW1vdglwYywgbHIKKworLyoKKyAqIEZ1bmN0aW9uOiBhcm02Xzdfc3dpdGNoX21tKHVuc2lnbmVkIGxvbmcgcGdkX3BoeXMpCisgKiBQYXJhbXMgIDogcGdkX3BoeXMJUGh5c2ljYWwgYWRkcmVzcyBvZiBwYWdlIHRhYmxlCisgKiBQdXJwb3NlIDogUGVyZm9ybSBhIHRhc2sgc3dpdGNoLCBzYXZpbmcgdGhlIG9sZCBwcm9jZXNzZXMgc3RhdGUsIGFuZCByZXN0b3JpbmcKKyAqCSAgICAgdGhlIG5ldy4KKyAqLworRU5UUlkoY3B1X2FybTZfc3dpdGNoX21tKQorRU5UUlkoY3B1X2FybTdfc3dpdGNoX21tKQorCQltb3YJcjEsICMwCisJCW1jcglwMTUsIDAsIHIxLCBjNywgYzAsIDAJCUAgZmx1c2ggY2FjaGUKKwkJbWNyCXAxNSwgMCwgcjAsIGMyLCBjMCwgMAkJQCB1cGRhdGUgcGFnZSB0YWJsZSBwdHIKKwkJbWNyCXAxNSwgMCwgcjEsIGM1LCBjMCwgMAkJQCBmbHVzaCBUTEJzCisJCW1vdglwYywgbHIKKworLyoKKyAqIEZ1bmN0aW9uOiBhcm02Xzdfc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQorICogUGFyYW1zICA6IHIwID0gQWRkcmVzcyB0byBzZXQKKyAqCSAgIDogcjEgPSB2YWx1ZSB0byBzZXQKKyAqIFB1cnBvc2UgOiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dCBvZiBhbnkgV0IgY2FjaGUKKyAqLworCQkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTZfc2V0X3B0ZSkKK0VOVFJZKGNwdV9hcm03X3NldF9wdGUpCisJCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCQllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQorCisJCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSworCQliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSworCQlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKKworCQl0c3QJcjEsICNMX1BURV9VU0VSCQkJQCBVc2VyPworCQlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVworCisJCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/CisJCW9ycmVxCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VTk9fU1JXCisKKwkJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmcKKwkJbW92bmUJcjIsICMwCisKKwkJc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCisJCW1vdglwYywgbHIKKworLyoKKyAqIEZ1bmN0aW9uOiBfYXJtNl83X3Jlc2V0CisgKiBQYXJhbXMgIDogcjAgPSBhZGRyZXNzIHRvIGp1bXAgdG8KKyAqIE5vdGVzICAgOiBUaGlzIHNldHMgdXAgZXZlcnl0aGluZyBmb3IgYSByZXNldAorICovCitFTlRSWShjcHVfYXJtNl9yZXNldCkKK0VOVFJZKGNwdV9hcm03X3Jlc2V0KQorCQltb3YJcjEsICMwCisJCW1jcglwMTUsIDAsIHIxLCBjNywgYzAsIDAJCUAgZmx1c2ggY2FjaGUKKwkJbWNyCXAxNSwgMCwgcjEsIGM1LCBjMCwgMAkJQCBmbHVzaCBUTEIKKwkJbW92CXIxLCAjMHgzMAorCQltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIHR1cm4gb2ZmIE1NVSBldGMKKwkJbW92CXBjLCByMAorCisJCV9fSU5JVAorCisJCS50eXBlCV9fYXJtNl9zZXR1cCwgI2Z1bmN0aW9uCitfX2FybTZfc2V0dXA6CW1vdglyMCwgIzAKKwkJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMAkJQCBmbHVzaCBjYWNoZXMgb24gdjMKKwkJbWNyCXAxNSwgMCwgcjAsIGM1LCBjMAkJQCBmbHVzaCBUTEJzIG9uIHYzCisJCW1vdglyMCwgIzB4M2QJCQlAIC4gLi5SUyBCTERQIFdDQU0KKwkJb3JyCXIwLCByMCwgIzB4MTAwCQkJQCAuIC4uMDEgMDAxMSAxMTAxCisJCW1vdglwYywgbHIKKwkJLnNpemUJX19hcm02X3NldHVwLCAuIC0gX19hcm02X3NldHVwCisKKwkJLnR5cGUJX19hcm03X3NldHVwLCAjZnVuY3Rpb24KK19fYXJtN19zZXR1cDoJbW92CXIwLCAjMAorCQltY3IJcDE1LCAwLCByMCwgYzcsIGMwCQlAIGZsdXNoIGNhY2hlcyBvbiB2MworCQltY3IJcDE1LCAwLCByMCwgYzUsIGMwCQlAIGZsdXNoIFRMQnMgb24gdjMKKwkJbWNyCXAxNSwgMCwgcjAsIGMzLCBjMAkJQCBsb2FkIGRvbWFpbiBhY2Nlc3MgcmVnaXN0ZXIKKwkJbW92CXIwLCAjMHg3ZAkJCUAgLiAuLlJTIEJMRFAgV0NBTQorCQlvcnIJcjAsIHIwLCAjMHgxMDAJCQlAIC4gLi4wMSAwMTExIDExMDEKKwkJbW92CXBjLCBscgorCQkuc2l6ZQlfX2FybTdfc2V0dXAsIC4gLSBfX2FybTdfc2V0dXAKKworCQlfX0lOSVREQVRBCisKKy8qCisgKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCisgKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQorICovCisJCS50eXBlCWFybTZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorRU5UUlkoYXJtNl9wcm9jZXNzb3JfZnVuY3Rpb25zKQorCQkud29yZAljcHVfYXJtNl9kYXRhX2Fib3J0CisJCS53b3JkCWNwdV9hcm02X3Byb2NfaW5pdAorCQkud29yZAljcHVfYXJtNl9wcm9jX2ZpbgorCQkud29yZAljcHVfYXJtNl9yZXNldAorCQkud29yZAljcHVfYXJtNl9kb19pZGxlCisJCS53b3JkCWNwdV9hcm02X2RjYWNoZV9jbGVhbl9hcmVhCisJCS53b3JkCWNwdV9hcm02X3N3aXRjaF9tbQorCQkud29yZAljcHVfYXJtNl9zZXRfcHRlCisJCS5zaXplCWFybTZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTZfcHJvY2Vzc29yX2Z1bmN0aW9ucworCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCQkudHlwZQlhcm03X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKK0VOVFJZKGFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucykKKwkJLndvcmQJY3B1X2FybTdfZGF0YV9hYm9ydAorCQkud29yZAljcHVfYXJtN19wcm9jX2luaXQKKwkJLndvcmQJY3B1X2FybTdfcHJvY19maW4KKwkJLndvcmQJY3B1X2FybTdfcmVzZXQKKwkJLndvcmQJY3B1X2FybTdfZG9faWRsZQorCQkud29yZAljcHVfYXJtN19kY2FjaGVfY2xlYW5fYXJlYQorCQkud29yZAljcHVfYXJtN19zd2l0Y2hfbW0KKwkJLndvcmQJY3B1X2FybTdfc2V0X3B0ZQorCQkuc2l6ZQlhcm03X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm03X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKworCQkuc2VjdGlvbiAiLnJvZGF0YSIKKworCQkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0CitjcHVfYXJjaF9uYW1lOgkuYXNjaXoJImFybXYzIgorCQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQorCisJCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAorY3B1X2VsZl9uYW1lOgkuYXNjaXoJInYzIgorCQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKKworCQkudHlwZQljcHVfYXJtNl9uYW1lLCAjb2JqZWN0CitjcHVfYXJtNl9uYW1lOgkuYXNjaXoJIkFSTTYiCisJCS5zaXplCWNwdV9hcm02X25hbWUsIC4gLSBjcHVfYXJtNl9uYW1lCisKKwkJLnR5cGUJY3B1X2FybTYxMF9uYW1lLCAjb2JqZWN0CitjcHVfYXJtNjEwX25hbWU6CisJCS5hc2NpegkiQVJNNjEwIgorCQkuc2l6ZQljcHVfYXJtNjEwX25hbWUsIC4gLSBjcHVfYXJtNjEwX25hbWUKKworCQkudHlwZQljcHVfYXJtN19uYW1lLCAjb2JqZWN0CitjcHVfYXJtN19uYW1lOgkuYXNjaXoJIkFSTTciCisJCS5zaXplCWNwdV9hcm03X25hbWUsIC4gLSBjcHVfYXJtN19uYW1lCisKKwkJLnR5cGUJY3B1X2FybTcxMF9uYW1lLCAjb2JqZWN0CitjcHVfYXJtNzEwX25hbWU6CisJCS5hc2NpegkiQVJNNzEwIgorCQkuc2l6ZQljcHVfYXJtNzEwX25hbWUsIC4gLSBjcHVfYXJtNzEwX25hbWUKKworCQkuYWxpZ24KKworCQkuc2VjdGlvbiAiLnByb2MuaW5mbyIsICNhbGxvYywgI2V4ZWNpbnN0cgorCisJCS50eXBlCV9fYXJtNl9wcm9jX2luZm8sICNvYmplY3QKK19fYXJtNl9wcm9jX2luZm86CisJCS5sb25nCTB4NDE1NjA2MDAKKwkJLmxvbmcJMHhmZmZmZmZmMAorCQkubG9uZwkweDAwMDAwYzFlCisJCWIJX19hcm02X3NldHVwCisJCS5sb25nCWNwdV9hcmNoX25hbWUKKwkJLmxvbmcJY3B1X2VsZl9uYW1lCisJCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQXzI2QklUCisJCS5sb25nCWNwdV9hcm02X25hbWUKKwkJLmxvbmcJYXJtNl9wcm9jZXNzb3JfZnVuY3Rpb25zCisJCS5sb25nCXYzX3RsYl9mbnMKKwkJLmxvbmcJdjNfdXNlcl9mbnMKKwkJLmxvbmcJdjNfY2FjaGVfZm5zCisJCS5zaXplCV9fYXJtNl9wcm9jX2luZm8sIC4gLSBfX2FybTZfcHJvY19pbmZvCisKKwkJLnR5cGUJX19hcm02MTBfcHJvY19pbmZvLCAjb2JqZWN0CitfX2FybTYxMF9wcm9jX2luZm86CisJCS5sb25nCTB4NDE1NjA2MTAKKwkJLmxvbmcJMHhmZmZmZmZmMAorCQkubG9uZwkweDAwMDAwYzFlCisJCWIJX19hcm02X3NldHVwCisJCS5sb25nCWNwdV9hcmNoX25hbWUKKwkJLmxvbmcJY3B1X2VsZl9uYW1lCisJCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQXzI2QklUCisJCS5sb25nCWNwdV9hcm02MTBfbmFtZQorCQkubG9uZwlhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkJLmxvbmcJdjNfdGxiX2ZucworCQkubG9uZwl2M191c2VyX2ZucworCQkubG9uZwl2M19jYWNoZV9mbnMKKwkJLnNpemUJX19hcm02MTBfcHJvY19pbmZvLCAuIC0gX19hcm02MTBfcHJvY19pbmZvCisKKwkJLnR5cGUJX19hcm03X3Byb2NfaW5mbywgI29iamVjdAorX19hcm03X3Byb2NfaW5mbzoKKwkJLmxvbmcJMHg0MTAwNzAwMAorCQkubG9uZwkweGZmZmZmZjAwCisJCS5sb25nCTB4MDAwMDBjMWUKKwkJYglfX2FybTdfc2V0dXAKKwkJLmxvbmcJY3B1X2FyY2hfbmFtZQorCQkubG9uZwljcHVfZWxmX25hbWUKKwkJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfMjZCSVQKKwkJLmxvbmcJY3B1X2FybTdfbmFtZQorCQkubG9uZwlhcm03X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkJLmxvbmcJdjNfdGxiX2ZucworCQkubG9uZwl2M191c2VyX2ZucworCQkubG9uZwl2M19jYWNoZV9mbnMKKwkJLnNpemUJX19hcm03X3Byb2NfaW5mbywgLiAtIF9fYXJtN19wcm9jX2luZm8KKworCQkudHlwZQlfX2FybTcxMF9wcm9jX2luZm8sICNvYmplY3QKK19fYXJtNzEwX3Byb2NfaW5mbzoKKwkJLmxvbmcJMHg0MTAwNzEwMAorCQkubG9uZwkweGZmZjhmZjAwCisJCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCisJCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCisJCQlQTURfQklUNCB8IFwKKwkJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAorCQkJUE1EX1NFQ1RfQVBfUkVBRAorCQliCV9fYXJtN19zZXR1cAorCQkubG9uZwljcHVfYXJjaF9uYW1lCisJCS5sb25nCWNwdV9lbGZfbmFtZQorCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF8yNkJJVAorCQkubG9uZwljcHVfYXJtNzEwX25hbWUKKwkJLmxvbmcJYXJtN19wcm9jZXNzb3JfZnVuY3Rpb25zCisJCS5sb25nCXYzX3RsYl9mbnMKKwkJLmxvbmcJdjNfdXNlcl9mbnMKKwkJLmxvbmcJdjNfY2FjaGVfZm5zCisJCS5zaXplCV9fYXJtNzEwX3Byb2NfaW5mbywgLiAtIF9fYXJtNzEwX3Byb2NfaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjZmE2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUzogTU1VIGZ1bmN0aW9ucyBmb3IgQVJNNzIwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBTdGV2ZSBIaWxsIChzamhpbGxAY290dy5jb20pCisgKiAgICAgICAgICAgICAgICAgICAgIFJvYiBTY290dCAocnNjb3R0QG10cm9iLmZkbnMubmV0KQorICogIENvcHlyaWdodCAoQykgMjAwMCBBUk0gTGltaXRlZCwgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGxvdyBsZXZlbCBhc3NlbWJsZXIgZm9yIHBlcmZvcm1pbmcgY2FjaGUgYW5kIFRMQgorICogZnVuY3Rpb25zIG9uIHRoZSBBUk03MjBULiAgVGhlIEFSTTcyMFQgaGFzIGEgd3JpdGV0aHJvdWdoIElEQworICogY2FjaGUsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2xlYW4gaXQuCisgKgorICogIENoYW5nZWxvZzoKKyAqICAgMDUtMDktMjAwMCBTSkgJQ3JlYXRlZCBieSBtb3ZpbmcgNzIwIHNwZWNpZmljIGZ1bmN0aW9ucworICoJCQlvdXQgb2YgJ3Byb2MtYXJtNiw3LlMnIHBlciBSTUsgZGlzY3Vzc2lvbgorICogICAwNy0yNS0yMDAwIFNKSAlBZGRlZCBpZGxlIGZ1bmN0aW9uLgorICogICAwOC0yNS0yMDAwCURCUwlVcGRhdGVkIGZvciBpbnRlZ3JhdGlvbiBvZiBBUk0gTHRkIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKy8qCisgKiBGdW5jdGlvbjogYXJtNzIwX3Byb2NfaW5pdCAodm9pZCkKKyAqCSAgIDogYXJtNzIwX3Byb2NfZmluICh2b2lkKQorICoKKyAqIE5vdGVzICAgOiBUaGlzIHByb2Nlc3NvciBkb2VzIG5vdCByZXF1aXJlIHRoZXNlCisgKi8KK0VOVFJZKGNwdV9hcm03MjBfZGNhY2hlX2NsZWFuX2FyZWEpCitFTlRSWShjcHVfYXJtNzIwX3Byb2NfaW5pdCkKKwkJbW92CXBjLCBscgorCitFTlRSWShjcHVfYXJtNzIwX3Byb2NfZmluKQorCQlzdG1mZAlzcCEsIHtscn0KKwkJbW92CWlwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKKwkJbXNyCWNwc3JfYywgaXAKKwkJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCQliaWMJcjAsIHIwLCAjMHgxMDAwCQkJQCAuLi5pLi4uLi4uLi4uLi4uCisJCWJpYwlyMCwgcjAsICMweDAwMGUJCQlAIC4uLi4uLi4uLi4uLndjYS4KKwkJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcworCQltY3IJcDE1LCAwLCByMSwgYzcsIGM3LCAwCQlAIGludmFsaWRhdGUgY2FjaGUKKwkJbGRtZmQJc3AhLCB7cGN9CisKKy8qCisgKiBGdW5jdGlvbjogYXJtNzIwX3Byb2NfZG9faWRsZSh2b2lkKQorICogUGFyYW1zICA6IHIwID0gdW51c2VkCisgKiBQdXJwb3NlIDogcHV0IHRoZSBwcm9jZXNzZXIgaW4gcHJvcGVyIGlkbGUgbW9kZQorICovCitFTlRSWShjcHVfYXJtNzIwX2RvX2lkbGUpCisJCW1vdglwYywgbHIKKworLyoKKyAqIEZ1bmN0aW9uOiBhcm03MjBfc3dpdGNoX21tKHVuc2lnbmVkIGxvbmcgcGdkX3BoeXMpCisgKiBQYXJhbXMgIDogcGdkX3BoeXMJUGh5c2ljYWwgYWRkcmVzcyBvZiBwYWdlIHRhYmxlCisgKiBQdXJwb3NlIDogUGVyZm9ybSBhIHRhc2sgc3dpdGNoLCBzYXZpbmcgdGhlIG9sZCBwcm9jZXNzJyBzdGF0ZSBhbmQgcmVzdG9yaW5nCisgKgkgICAgIHRoZSBuZXcuCisgKi8KK0VOVFJZKGNwdV9hcm03MjBfc3dpdGNoX21tKQorCQltb3YJcjEsICMwCisJCW1jcglwMTUsIDAsIHIxLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBjYWNoZQorCQltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIHVwZGF0ZSBwYWdlIHRhYmxlIHB0cgorCQltY3IJcDE1LCAwLCByMSwgYzgsIGM3LCAwCQlAIGZsdXNoIFRMQiAodjQpCisJCW1vdglwYywgbHIKKworLyoKKyAqIEZ1bmN0aW9uOiBhcm03MjBfc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQorICogUGFyYW1zICA6IHIwID0gQWRkcmVzcyB0byBzZXQKKyAqCSAgIDogcjEgPSB2YWx1ZSB0byBzZXQKKyAqIFB1cnBvc2UgOiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dCBvZiBhbnkgV0IgY2FjaGUKKyAqLworCQkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTcyMF9zZXRfcHRlKQorCQlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCisKKwkJZW9yCXIxLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKKworCQliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKKwkJYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKKwkJb3JyCXIyLCByMiwgI1BURV9UWVBFX1NNQUxMCisKKwkJdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KKwkJb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKKworCQl0c3QJcjEsICNMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCUAgV3JpdGUgYW5kIERpcnR5PworCQlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVworCisJCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nCisJCW1vdm5lCXIyLCAjMAorCisJCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCQltb3YJcGMsIGxyCisKKy8qCisgKiBGdW5jdGlvbjogYXJtNzIwX3Jlc2V0CisgKiBQYXJhbXMgIDogcjAgPSBhZGRyZXNzIHRvIGp1bXAgdG8KKyAqIE5vdGVzICAgOiBUaGlzIHNldHMgdXAgZXZlcnl0aGluZyBmb3IgYSByZXNldAorICovCitFTlRSWShjcHVfYXJtNzIwX3Jlc2V0KQorCQltb3YJaXAsICMwCisJCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBjYWNoZQorCQltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCQlAIGZsdXNoIFRMQiAodjQpCisJCW1yYwlwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgZ2V0IGN0cmwgcmVnaXN0ZXIKKwkJYmljCWlwLCBpcCwgIzB4MDAwZgkJCUAgLi4uLi4uLi4uLi4ud2NhbQorCQliaWMJaXAsIGlwLCAjMHgyMTAwCQkJQCAuLnYuLi4ucy4uLi4uLi4uCisJCW1jcglwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCQltb3YJcGMsIHIwCisKKwlfX0lOSVQKKworCS50eXBlCV9fYXJtNzEwX3NldHVwLCAjZnVuY3Rpb24KK19fYXJtNzEwX3NldHVwOgorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3LCAwCQlAIGludmFsaWRhdGUgY2FjaGVzCisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNywgMAkJQCBmbHVzaCBUTEIgKHY0KQorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAJCUAgZ2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwlsZHIJcjUsIGFybTcxMF9jcjFfY2xlYXIKKwliaWMJcjAsIHIwLCByNQorCWxkcglyNSwgYXJtNzEwX2NyMV9zZXQKKwlvcnIJcjAsIHIwLCByNQorCW1vdglwYywgbHIJCQkJQCBfX3JldCAoaGVhZC5TKQorCS5zaXplCV9fYXJtNzEwX3NldHVwLCAuIC0gX19hcm03MTBfc2V0dXAKKworCS8qCisJICogIFIKKwkgKiAuUlZJIFpGUlMgQkxEUCBXQ0FNCisJICogLi4uLiAwMDAxIC4uMTEgMTEwMQorCSAqIAorCSAqLworCS50eXBlCWFybTcxMF9jcjFfY2xlYXIsICNvYmplY3QKKwkudHlwZQlhcm03MTBfY3IxX3NldCwgI29iamVjdAorYXJtNzEwX2NyMV9jbGVhcjoKKwkud29yZAkweDBmM2YKK2FybTcxMF9jcjFfc2V0OgorCS53b3JkCTB4MDEzZAorCisJLnR5cGUJX19hcm03MjBfc2V0dXAsICNmdW5jdGlvbgorX19hcm03MjBfc2V0dXA6CisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBjYWNoZXMKKwltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCQlAIGZsdXNoIFRMQiAodjQpCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMAkJQCBnZXQgY29udHJvbCByZWdpc3RlcgorCWxkcglyNSwgYXJtNzIwX2NyMV9jbGVhcgorCWJpYwlyMCwgcjAsIHI1CisJbGRyCXI1LCBhcm03MjBfY3IxX3NldAorCW9ycglyMCwgcjAsIHI1CisJbW92CXBjLCBscgkJCQlAIF9fcmV0IChoZWFkLlMpCisJLnNpemUJX19hcm03MjBfc2V0dXAsIC4gLSBfX2FybTcyMF9zZXR1cAorCisJLyoKKwkgKiAgUgorCSAqIC5SVkkgWkZSUyBCTERQIFdDQU0KKwkgKiAuLjEuIDEwMDEgLi4xMSAxMTAxCisJICogCisJICovCisJLnR5cGUJYXJtNzIwX2NyMV9jbGVhciwgI29iamVjdAorCS50eXBlCWFybTcyMF9jcjFfc2V0LCAjb2JqZWN0Cithcm03MjBfY3IxX2NsZWFyOgorCS53b3JkCTB4MmYzZgorYXJtNzIwX2NyMV9zZXQ6CisJLndvcmQJMHgyMTNkCisKKwkJX19JTklUREFUQQorCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCQkudHlwZQlhcm03MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorRU5UUlkoYXJtNzIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCisJCS53b3JkCXY0dF9sYXRlX2Fib3J0CisJCS53b3JkCWNwdV9hcm03MjBfcHJvY19pbml0CisJCS53b3JkCWNwdV9hcm03MjBfcHJvY19maW4KKwkJLndvcmQJY3B1X2FybTcyMF9yZXNldAorCQkud29yZAljcHVfYXJtNzIwX2RvX2lkbGUKKwkJLndvcmQJY3B1X2FybTcyMF9kY2FjaGVfY2xlYW5fYXJlYQorCQkud29yZAljcHVfYXJtNzIwX3N3aXRjaF9tbQorCQkud29yZAljcHVfYXJtNzIwX3NldF9wdGUKKwkJLnNpemUJYXJtNzIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm03MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucworCisJCS5zZWN0aW9uICIucm9kYXRhIgorCisJCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKK2NwdV9hcmNoX25hbWU6CS5hc2NpegkiYXJtdjR0IgorCQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQorCisJCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAorY3B1X2VsZl9uYW1lOgkuYXNjaXoJInY0IgorCQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKKworCQkudHlwZQljcHVfYXJtNzEwX25hbWUsICNvYmplY3QKK2NwdV9hcm03MTBfbmFtZToKKwkJLmFzY2l6CSJBUk03MTBUIgorCQkuc2l6ZQljcHVfYXJtNzEwX25hbWUsIC4gLSBjcHVfYXJtNzEwX25hbWUKKworCQkudHlwZQljcHVfYXJtNzIwX25hbWUsICNvYmplY3QKK2NwdV9hcm03MjBfbmFtZToKKwkJLmFzY2l6CSJBUk03MjBUIgorCQkuc2l6ZQljcHVfYXJtNzIwX25hbWUsIC4gLSBjcHVfYXJtNzIwX25hbWUKKworCQkuYWxpZ24KKworLyoKKyAqIFNlZSBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcHJvY2luZm8uaCBmb3IgYSBkZWZpbml0aW9uIG9mIHRoaXMgc3RydWN0dXJlLgorICovCisJCisJCS5zZWN0aW9uICIucHJvYy5pbmZvIiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKwkJLnR5cGUJX19hcm03MTBfcHJvY19pbmZvLCAjb2JqZWN0CitfX2FybTcxMF9wcm9jX2luZm86CisJCS5sb25nCTB4NDE4MDcxMDAJCQkJQCBjcHVfdmFsCisJCS5sb25nCTB4ZmZmZmZmMDAJCQkJQCBjcHVfbWFzaworCQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAorCQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQkJUE1EX0JJVDQgfCBcCisJCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJCVBNRF9TRUNUX0FQX1JFQUQKKwkJYglfX2FybTcxMF9zZXR1cAkJCQlAIGNwdV9mbHVzaAorCQkubG9uZwljcHVfYXJjaF9uYW1lCQkJCUAgYXJjaF9uYW1lCisJCS5sb25nCWNwdV9lbGZfbmFtZQkJCQlAIGVsZl9uYW1lCisJCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQglAIGVsZl9od2NhcAorCQkubG9uZwljcHVfYXJtNzEwX25hbWUJCQkJQCBuYW1lCisJCS5sb25nCWFybTcyMF9wcm9jZXNzb3JfZnVuY3Rpb25zCisJCS5sb25nCXY0X3RsYl9mbnMKKwkJLmxvbmcJdjR3dF91c2VyX2ZucworCQkubG9uZwl2NF9jYWNoZV9mbnMKKwkJLnNpemUJX19hcm03MTBfcHJvY19pbmZvLCAuIC0gX19hcm03MTBfcHJvY19pbmZvCisKKwkJLnR5cGUJX19hcm03MjBfcHJvY19pbmZvLCAjb2JqZWN0CitfX2FybTcyMF9wcm9jX2luZm86CisJCS5sb25nCTB4NDE4MDcyMDAJCQkJQCBjcHVfdmFsCisJCS5sb25nCTB4ZmZmZmZmMDAJCQkJQCBjcHVfbWFzaworCQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAorCQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQkJUE1EX0JJVDQgfCBcCisJCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJCVBNRF9TRUNUX0FQX1JFQUQKKwkJYglfX2FybTcyMF9zZXR1cAkJCQlAIGNwdV9mbHVzaAorCQkubG9uZwljcHVfYXJjaF9uYW1lCQkJCUAgYXJjaF9uYW1lCisJCS5sb25nCWNwdV9lbGZfbmFtZQkJCQlAIGVsZl9uYW1lCisJCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQglAIGVsZl9od2NhcAorCQkubG9uZwljcHVfYXJtNzIwX25hbWUJCQkJQCBuYW1lCisJCS5sb25nCWFybTcyMF9wcm9jZXNzb3JfZnVuY3Rpb25zCisJCS5sb25nCXY0X3RsYl9mbnMKKwkJLmxvbmcJdjR3dF91c2VyX2ZucworCQkubG9uZwl2NF9jYWNoZV9mbnMKKwkJLnNpemUJX19hcm03MjBfcHJvY19pbmZvLCAuIC0gX19hcm03MjBfcHJvY19pbmZvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ5MGEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TOiBNTVUgZnVuY3Rpb25zIGZvciBBUk05MjAKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgQVJNIExpbWl0ZWQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGxvdyBsZXZlbCBhc3NlbWJsZXIgZm9yIHBlcmZvcm1pbmcgY2FjaGUgYW5kIFRMQgorICogZnVuY3Rpb25zIG9uIHRoZSBhcm05MjAuCisgKgorICogIENPTkZJR19DUFVfQVJNOTIwX0NQVV9JRExFIC0+IG5vaGx0CisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvbmUgZGF0YSBjYWNoZSBsaW5lLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU5FU0laRQkzMgorCisvKgorICogVGhlIG51bWJlciBvZiBkYXRhIGNhY2hlIHNlZ21lbnRzLgorICovCisjZGVmaW5lIENBQ0hFX0RTRUdNRU5UUwk4CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGxpbmVzIGluIGEgY2FjaGUgc2VnbWVudC4KKyAqLworI2RlZmluZSBDQUNIRV9ERU5UUklFUwk2NAorCisvKgorICogVGhpcyBpcyB0aGUgc2l6ZSBhdCB3aGljaCBpdCBiZWNvbWVzIG1vcmUgZWZmaWNpZW50IHRvCisgKiBjbGVhbiB0aGUgd2hvbGUgY2FjaGUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbmRpdmlkdWFsCisgKiBjYWNoZSBsaW5lIG1haW50YWluZW5jZSBpbnN0cnVjdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTUlUCTY1NTM2CisKKworCS50ZXh0CisvKgorICogY3B1X2FybTkyMF9wcm9jX2luaXQoKQorICovCitFTlRSWShjcHVfYXJtOTIwX3Byb2NfaW5pdCkKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtOTIwX3Byb2NfZmluKCkKKyAqLworRU5UUlkoY3B1X2FybTkyMF9wcm9jX2ZpbikKKwlzdG1mZAlzcCEsIHtscn0KKwltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQorCW1zcgljcHNyX2MsIGlwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCWJsCWFybTkyMF9mbHVzaF9rZXJuX2NhY2hlX2FsbAorI2Vsc2UKKwlibAl2NHd0X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisjZW5kaWYKKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwliaWMJcjAsIHIwLCAjMHgxMDAwCQkJQCAuLi5pLi4uLi4uLi4uLi4uCisJYmljCXIwLCByMCwgIzB4MDAwZQkJCUAgLi4uLi4uLi4uLi4ud2NhLgorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKKwlsZG1mZAlzcCEsIHtwY30KKworLyoKKyAqIGNwdV9hcm05MjBfcmVzZXQobG9jKQorICoKKyAqIFBlcmZvcm0gYSBzb2Z0IHJlc2V0IG9mIHRoZSBzeXN0ZW0uICBQdXQgdGhlIENQVSBpbnRvIHRoZQorICogc2FtZSBzdGF0ZSBhcyBpdCB3b3VsZCBiZSBpZiBpdCBoYWQgYmVlbiByZXNldCwgYW5kIGJyYW5jaAorICogdG8gd2hhdCB3b3VsZCBiZSB0aGUgcmVzZXQgdmVjdG9yLgorICoKKyAqIGxvYzogbG9jYXRpb24gdG8ganVtcCB0byBmb3Igc29mdCByZXNldAorICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm05MjBfcmVzZXQpCisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLEQgY2FjaGVzCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSAmIEQgVExCcworCW1yYwlwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlpcCwgaXAsICMweDAwMGYJCQlAIC4uLi4uLi4uLi4uLndjYW0KKwliaWMJaXAsIGlwLCAjMHgxMTAwCQkJQCAuLi5pLi4ucy4uLi4uLi4uCisJbWNyCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJbW92CXBjLCByMAorCisvKgorICogY3B1X2FybTkyMF9kb19pZGxlKCkKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtOTIwX2RvX2lkbGUpCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNAkJQCBXYWl0IGZvciBpbnRlcnJ1cHQKKwltb3YJcGMsIGxyCisKKworI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKworLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfYWxsKCkKKyAqCisgKglJbnZhbGlkYXRlIGFsbCBjYWNoZSBlbnRyaWVzIGluIGEgcGFydGljdWxhciBhZGRyZXNzCisgKglzcGFjZS4KKyAqLworRU5UUlkoYXJtOTIwX2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKglmbHVzaF9rZXJuX2NhY2hlX2FsbCgpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgdGhlIGVudGlyZSBjYWNoZS4KKyAqLworRU5UUlkoYXJtOTIwX2ZsdXNoX2tlcm5fY2FjaGVfYWxsKQorCW1vdglyMiwgI1ZNX0VYRUMKKwltb3YJaXAsICMwCitfX2ZsdXNoX3dob2xlX2NhY2hlOgorCW1vdglyMSwgIyhDQUNIRV9EU0VHTUVOVFMgLSAxKSA8PCA1CUAgOCBzZWdtZW50cworMToJb3JyCXIzLCByMSwgIyhDQUNIRV9ERU5UUklFUyAtIDEpIDw8IDI2IEAgNjQgZW50cmllcworMjoJbWNyCXAxNSwgMCwgcjMsIGM3LCBjMTQsIDIJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGluZGV4CisJc3VicwlyMywgcjMsICMxIDw8IDI2CisJYmNzCTJiCQkJCUAgZW50cmllcyA2MyB0byAwCisJc3VicwlyMSwgcjEsICMxIDw8IDUKKwliY3MJMWIJCQkJQCBzZWdtZW50cyA3IHRvIDAKKwl0c3QJcjIsICNWTV9FWEVDCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF91c2VyX2NhY2hlX3JhbmdlKHN0YXJ0LCBlbmQsIGZsYWdzKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBjYWNoZSBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQKKyAqCWFkZHJlc3Mgc3BhY2UuCisgKgorICoJLSBzdGFydAktIHN0YXJ0IGFkZHJlc3MgKGluY2x1c2l2ZSkKKyAqCS0gZW5kCS0gZW5kIGFkZHJlc3MgKGV4Y2x1c2l2ZSkKKyAqCS0gZmxhZ3MJLSB2bV9mbGFncyBmb3IgYWRkcmVzcyBzcGFjZQorICovCitFTlRSWShhcm05MjBfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwltb3YJaXAsICMwCisJc3ViCXIzLCByMSwgcjAJCQlAIGNhbGN1bGF0ZSB0b3RhbCBzaXplCisJY21wCXIzLCAjQ0FDSEVfRExJTUlUCisJYmhzCV9fZmx1c2hfd2hvbGVfY2FjaGUKKworMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGVudHJ5CisJdHN0CXIyLCAjVk1fRVhFQworCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkJQCBpbnZhbGlkYXRlIEkgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCXRzdAlyMiwgI1ZNX0VYRUMKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJY29oZXJlbnRfa2Vybl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUVuc3VyZSBjb2hlcmVuY3kgYmV0d2VlbiB0aGUgSWNhY2hlIGFuZCB0aGUgRGNhY2hlIGluIHRoZQorICoJcmVnaW9uIGRlc2NyaWJlZCBieSBzdGFydCwgZW5kLiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyMF9jb2hlcmVudF9rZXJuX3JhbmdlKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKgljb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LCBlbmQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtOTIwX2NvaGVyZW50X3VzZXJfcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF9rZXJuX2RjYWNoZV9wYWdlKHZvaWQgKnBhZ2UpCisgKgorICoJRW5zdXJlIG5vIEQgY2FjaGUgYWxpYXNpbmcgb2NjdXJzLCBlaXRoZXIgd2l0aCBpdHNlbGYgb3IKKyAqCXRoZSBJIGNhY2hlCisgKgorICoJLSBhZGRyCS0gcGFnZSBhbGlnbmVkIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtOTIwX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UpCisJYWRkCXIxLCByMCwgI1BBR0VfU1oKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJSW52YWxpZGF0ZSAoZGlzY2FyZCkgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKglNYXkgbm90IHdyaXRlIGJhY2sgYW55IGVudHJpZXMuICBJZiAnc3RhcnQnIG9yICdlbmQnCisgKglhcmUgbm90IGNhY2hlIGxpbmUgYWxpZ25lZCwgdGhvc2UgbGluZXMgbXVzdCBiZSB3cml0dGVuCisgKgliYWNrLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqIChzYW1lIGFzIHY0d2IpCisgKi8KK0VOVFJZKGFybTkyMF9kbWFfaW52X3JhbmdlKQorCXRzdAlyMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCXRzdAlyMSwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIxLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9jbGVhbl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqIChzYW1lIGFzIHY0d2IpCisgKi8KK0VOVFJZKGFybTkyMF9kbWFfY2xlYW5fcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyMF9kbWFfZmx1c2hfcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKK0VOVFJZKGFybTkyMF9jYWNoZV9mbnMpCisJLmxvbmcJYXJtOTIwX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJLmxvbmcJYXJtOTIwX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJYXJtOTIwX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwkubG9uZwlhcm05MjBfY29oZXJlbnRfa2Vybl9yYW5nZQorCS5sb25nCWFybTkyMF9jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJYXJtOTIwX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UKKwkubG9uZwlhcm05MjBfZG1hX2ludl9yYW5nZQorCS5sb25nCWFybTkyMF9kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwlhcm05MjBfZG1hX2ZsdXNoX3JhbmdlCisKKyNlbmRpZgorCisKK0VOVFJZKGNwdV9hcm05MjBfZGNhY2hlX2NsZWFuX2FyZWEpCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCXN1YnMJcjEsIHIxLCAjQ0FDSEVfRExJTkVTSVpFCisJYmhpCTFiCisJbW92CXBjLCBscgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhZ2VUYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAqIGNwdV9hcm05MjBfc3dpdGNoX21tKHBnZCkKKyAqCisgKiBTZXQgdGhlIHRyYW5zbGF0aW9uIGJhc2UgcG9pbnRlciB0byBiZSBhcyBkZXNjcmliZWQgYnkgcGdkLgorICoKKyAqIHBnZDogbmV3IHBhZ2UgdGFibGVzCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTkyMF9zd2l0Y2hfbW0pCisJbW92CWlwLCAjMAorI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDAJCUAgaW52YWxpZGF0ZSBEIGNhY2hlCisjZWxzZQorQCAmJiAnQ2xlYW4gJiBJbnZhbGlkYXRlIHdob2xlIERDYWNoZScKK0AgJiYgUmUtd3JpdHRlbiB0byB1c2UgSW5kZXggT3BzLgorQCAmJiBVc2VzIHJlZ2lzdGVycyByMSwgcjMgYW5kIGlwCisKKwltb3YJcjEsICMoQ0FDSEVfRFNFR01FTlRTIC0gMSkgPDwgNQlAIDggc2VnbWVudHMKKzE6CW9ycglyMywgcjEsICMoQ0FDSEVfREVOVFJJRVMgLSAxKSA8PCAyNiBAIDY0IGVudHJpZXMKKzI6CW1jcglwMTUsIDAsIHIzLCBjNywgYzE0LCAyCQlAIGNsZWFuICYgaW52YWxpZGF0ZSBEIGluZGV4CisJc3VicwlyMywgcjMsICMxIDw8IDI2CisJYmNzCTJiCQkJCUAgZW50cmllcyA2MyB0byAwCisJc3VicwlyMSwgcjEsICMxIDw8IDUKKwliY3MJMWIJCQkJQCBzZWdtZW50cyA3IHRvIDAKKyNlbmRpZgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtOTIwX3NldF9wdGUocHRlcCwgcHRlKQorICoKKyAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTkyMF9zZXRfcHRlKQorCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKKwliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSworCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAorCisJdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KKwlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVworCisJdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KKwlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVworCisJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/CisJbW92bmUJcjIsICMwCisKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwllb3IJcjMsIHIyLCAjMHgwYQkJCUAgQyAmIHNtYWxsIHBhZ2U/CisJdHN0CXIzLCAjMHgwYgorCWJpY2VxCXIyLCByMiwgIzQKKyNlbmRpZgorCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCW1vdglyMCwgcjAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKwlfX0lOSVQKKworCS50eXBlCV9fYXJtOTIwX3NldHVwLCAjZnVuY3Rpb24KK19fYXJtOTIwX3NldHVwOgorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3CQlAIGludmFsaWRhdGUgSSxEIGNhY2hlcyBvbiB2NAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlciBvbiB2NAorCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcJCUAgaW52YWxpZGF0ZSBJLEQgVExCcyBvbiB2NAorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAJCUAgZ2V0IGNvbnRyb2wgcmVnaXN0ZXIgdjQKKwlsZHIJcjUsIGFybTkyMF9jcjFfY2xlYXIKKwliaWMJcjAsIHIwLCByNQorCWxkcglyNSwgYXJtOTIwX2NyMV9zZXQKKwlvcnIJcjAsIHIwLCByNQorCW1vdglwYywgbHIKKwkuc2l6ZQlfX2FybTkyMF9zZXR1cCwgLiAtIF9fYXJtOTIwX3NldHVwCisKKwkvKgorCSAqICBSCisJICogLlJWSSBaRlJTIEJMRFAgV0NBTQorCSAqIC4uMTEgMDAwMSAuLjExIDAxMDEKKwkgKiAKKwkgKi8KKwkudHlwZQlhcm05MjBfY3IxX2NsZWFyLCAjb2JqZWN0CisJLnR5cGUJYXJtOTIwX2NyMV9zZXQsICNvYmplY3QKK2FybTkyMF9jcjFfY2xlYXI6CisJLndvcmQJMHgzZjNmCithcm05MjBfY3IxX3NldDoKKwkud29yZAkweDMxMzUKKworCV9fSU5JVERBVEEKKworLyoKKyAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKKyAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCisgKi8KKwkudHlwZQlhcm05MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorYXJtOTIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CisJLndvcmQJdjR0X2Vhcmx5X2Fib3J0CisJLndvcmQJY3B1X2FybTkyMF9wcm9jX2luaXQKKwkud29yZAljcHVfYXJtOTIwX3Byb2NfZmluCisJLndvcmQJY3B1X2FybTkyMF9yZXNldAorCS53b3JkICAgY3B1X2FybTkyMF9kb19pZGxlCisJLndvcmQJY3B1X2FybTkyMF9kY2FjaGVfY2xlYW5fYXJlYQorCS53b3JkCWNwdV9hcm05MjBfc3dpdGNoX21tCisJLndvcmQJY3B1X2FybTkyMF9zZXRfcHRlCisJLnNpemUJYXJtOTIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm05MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucworCisJLnNlY3Rpb24gIi5yb2RhdGEiCisKKwkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0CitjcHVfYXJjaF9uYW1lOgorCS5hc2NpegkiYXJtdjR0IgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY0IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1X2FybTkyMF9uYW1lLCAjb2JqZWN0CitjcHVfYXJtOTIwX25hbWU6CisJLmFzY2lpCSJBUk05MjBUIgorI2lmbmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJLmFzY2lpCSJpIgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwkuYXNjaWkJImQiCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJLmFzY2lpCSIod3QpIgorI2Vsc2UKKwkuYXNjaWkJIih3YikiCisjZW5kaWYKKyNlbmRpZgorCS5hc2NpaQkiXDAiCisJLnNpemUJY3B1X2FybTkyMF9uYW1lLCAuIC0gY3B1X2FybTkyMF9uYW1lCisKKwkuYWxpZ24KKworCS5zZWN0aW9uICIucHJvYy5pbmZvIiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKwkudHlwZQlfX2FybTkyMF9wcm9jX2luZm8sI29iamVjdAorX19hcm05MjBfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwMDkyMDAKKwkubG9uZwkweGZmMDBmZmYwCisJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAorCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAorCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCisJCVBNRF9CSVQ0IHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX19hcm05MjBfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCisJLmxvbmcJY3B1X2FybTkyMF9uYW1lCisJLmxvbmcJYXJtOTIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJdjR3Yl91c2VyX2ZucworI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwkubG9uZwlhcm05MjBfY2FjaGVfZm5zCisjZWxzZQorCS5sb25nCXY0d3RfY2FjaGVfZm5zCisjZW5kaWYKKwkuc2l6ZQlfX2FybTkyMF9wcm9jX2luZm8sIC4gLSBfX2FybTkyMF9wcm9jX2luZm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmMzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlM6IE1NVSBmdW5jdGlvbnMgZm9yIEFSTTkyMgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGxvdyBsZXZlbCBhc3NlbWJsZXIgZm9yIHBlcmZvcm1pbmcgY2FjaGUgYW5kIFRMQgorICogZnVuY3Rpb25zIG9uIHRoZSBhcm05MjIuCisgKgorICogIENPTkZJR19DUFVfQVJNOTIyX0NQVV9JRExFIC0+IG5vaGx0CisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvbmUgZGF0YSBjYWNoZSBsaW5lLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU5FU0laRQkzMgorCisvKgorICogVGhlIG51bWJlciBvZiBkYXRhIGNhY2hlIHNlZ21lbnRzLgorICovCisjZGVmaW5lIENBQ0hFX0RTRUdNRU5UUwk0CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGxpbmVzIGluIGEgY2FjaGUgc2VnbWVudC4KKyAqLworI2RlZmluZSBDQUNIRV9ERU5UUklFUwk2NAorCisvKgorICogVGhpcyBpcyB0aGUgc2l6ZSBhdCB3aGljaCBpdCBiZWNvbWVzIG1vcmUgZWZmaWNpZW50IHRvCisgKiBjbGVhbiB0aGUgd2hvbGUgY2FjaGUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbmRpdmlkdWFsCisgKiBjYWNoZSBsaW5lIG1haW50YWluZW5jZSBpbnN0cnVjdGlvbnMuICAoSSB0aGluayB0aGlzIHNob3VsZAorICogYmUgMzI3NjgpLgorICovCisjZGVmaW5lIENBQ0hFX0RMSU1JVAk4MTkyCisKKworCS50ZXh0CisvKgorICogY3B1X2FybTkyMl9wcm9jX2luaXQoKQorICovCitFTlRSWShjcHVfYXJtOTIyX3Byb2NfaW5pdCkKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtOTIyX3Byb2NfZmluKCkKKyAqLworRU5UUlkoY3B1X2FybTkyMl9wcm9jX2ZpbikKKwlzdG1mZAlzcCEsIHtscn0KKwltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQorCW1zcgljcHNyX2MsIGlwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCWJsCWFybTkyMl9mbHVzaF9rZXJuX2NhY2hlX2FsbAorI2Vsc2UKKwlibAl2NHd0X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisjZW5kaWYKKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwliaWMJcjAsIHIwLCAjMHgxMDAwCQkJQCAuLi5pLi4uLi4uLi4uLi4uCisJYmljCXIwLCByMCwgIzB4MDAwZQkJCUAgLi4uLi4uLi4uLi4ud2NhLgorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKKwlsZG1mZAlzcCEsIHtwY30KKworLyoKKyAqIGNwdV9hcm05MjJfcmVzZXQobG9jKQorICoKKyAqIFBlcmZvcm0gYSBzb2Z0IHJlc2V0IG9mIHRoZSBzeXN0ZW0uICBQdXQgdGhlIENQVSBpbnRvIHRoZQorICogc2FtZSBzdGF0ZSBhcyBpdCB3b3VsZCBiZSBpZiBpdCBoYWQgYmVlbiByZXNldCwgYW5kIGJyYW5jaAorICogdG8gd2hhdCB3b3VsZCBiZSB0aGUgcmVzZXQgdmVjdG9yLgorICoKKyAqIGxvYzogbG9jYXRpb24gdG8ganVtcCB0byBmb3Igc29mdCByZXNldAorICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm05MjJfcmVzZXQpCisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLEQgY2FjaGVzCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSAmIEQgVExCcworCW1yYwlwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlpcCwgaXAsICMweDAwMGYJCQlAIC4uLi4uLi4uLi4uLndjYW0KKwliaWMJaXAsIGlwLCAjMHgxMTAwCQkJQCAuLi5pLi4ucy4uLi4uLi4uCisJbWNyCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJbW92CXBjLCByMAorCisvKgorICogY3B1X2FybTkyMl9kb19pZGxlKCkKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtOTIyX2RvX2lkbGUpCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNAkJQCBXYWl0IGZvciBpbnRlcnJ1cHQKKwltb3YJcGMsIGxyCisKKworI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKworLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfYWxsKCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSBhbGwgY2FjaGUgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIKKyAqCWFkZHJlc3Mgc3BhY2UuCisgKi8KK0VOVFJZKGFybTkyMl9mbHVzaF91c2VyX2NhY2hlX2FsbCkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZmx1c2hfa2Vybl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK0VOVFJZKGFybTkyMl9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwltb3YJcjIsICNWTV9FWEVDCisJbW92CWlwLCAjMAorX19mbHVzaF93aG9sZV9jYWNoZToKKwltb3YJcjEsICMoQ0FDSEVfRFNFR01FTlRTIC0gMSkgPDwgNQlAIDggc2VnbWVudHMKKzE6CW9ycglyMywgcjEsICMoQ0FDSEVfREVOVFJJRVMgLSAxKSA8PCAyNiBAIDY0IGVudHJpZXMKKzI6CW1jcglwMTUsIDAsIHIzLCBjNywgYzE0LCAyCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBpbmRleAorCXN1YnMJcjMsIHIzLCAjMSA8PCAyNgorCWJjcwkyYgkJCQlAIGVudHJpZXMgNjMgdG8gMAorCXN1YnMJcjEsIHIxLCAjMSA8PCA1CisJYmNzCTFiCQkJCUAgc2VnbWVudHMgNyB0byAwCisJdHN0CXIyLCAjVk1fRVhFQworCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSBhIHJhbmdlIG9mIGNhY2hlIGVudHJpZXMgaW4gdGhlCisgKglzcGVjaWZpZWQgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gc3RhcnQgYWRkcmVzcyAoaW5jbHVzaXZlKQorICoJLSBlbmQJLSBlbmQgYWRkcmVzcyAoZXhjbHVzaXZlKQorICoJLSBmbGFncwktIHZtX2ZsYWdzIGRlc2NyaWJpbmcgYWRkcmVzcyBzcGFjZQorICovCitFTlRSWShhcm05MjJfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwltb3YJaXAsICMwCisJc3ViCXIzLCByMSwgcjAJCQlAIGNhbGN1bGF0ZSB0b3RhbCBzaXplCisJY21wCXIzLCAjQ0FDSEVfRExJTUlUCisJYmhzCV9fZmx1c2hfd2hvbGVfY2FjaGUKKworMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGVudHJ5CisJdHN0CXIyLCAjVk1fRVhFQworCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkJQCBpbnZhbGlkYXRlIEkgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCXRzdAlyMiwgI1ZNX0VYRUMKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJY29oZXJlbnRfa2Vybl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUVuc3VyZSBjb2hlcmVuY3kgYmV0d2VlbiB0aGUgSWNhY2hlIGFuZCB0aGUgRGNhY2hlIGluIHRoZQorICoJcmVnaW9uIGRlc2NyaWJlZCBieSBzdGFydCwgZW5kLiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyMl9jb2hlcmVudF9rZXJuX3JhbmdlKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKgljb2hlcmVudF91c2VyX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJRW5zdXJlIGNvaGVyZW5jeSBiZXR3ZWVuIHRoZSBJY2FjaGUgYW5kIHRoZSBEY2FjaGUgaW4gdGhlCisgKglyZWdpb24gZGVzY3JpYmVkIGJ5IHN0YXJ0LCBlbmQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtOTIyX2NvaGVyZW50X3VzZXJfcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF9rZXJuX2RjYWNoZV9wYWdlKHZvaWQgKnBhZ2UpCisgKgorICoJRW5zdXJlIG5vIEQgY2FjaGUgYWxpYXNpbmcgb2NjdXJzLCBlaXRoZXIgd2l0aCBpdHNlbGYgb3IKKyAqCXRoZSBJIGNhY2hlCisgKgorICoJLSBhZGRyCS0gcGFnZSBhbGlnbmVkIGFkZHJlc3MKKyAqLworRU5UUlkoYXJtOTIyX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UpCisJYWRkCXIxLCByMCwgI1BBR0VfU1oKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJSW52YWxpZGF0ZSAoZGlzY2FyZCkgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKglNYXkgbm90IHdyaXRlIGJhY2sgYW55IGVudHJpZXMuICBJZiAnc3RhcnQnIG9yICdlbmQnCisgKglhcmUgbm90IGNhY2hlIGxpbmUgYWxpZ25lZCwgdGhvc2UgbGluZXMgbXVzdCBiZSB3cml0dGVuCisgKgliYWNrLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqIChzYW1lIGFzIHY0d2IpCisgKi8KK0VOVFJZKGFybTkyMl9kbWFfaW52X3JhbmdlKQorCXRzdAlyMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCXRzdAlyMSwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIxLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9jbGVhbl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqIChzYW1lIGFzIHY0d2IpCisgKi8KK0VOVFJZKGFybTkyMl9kbWFfY2xlYW5fcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyMl9kbWFfZmx1c2hfcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKK0VOVFJZKGFybTkyMl9jYWNoZV9mbnMpCisJLmxvbmcJYXJtOTIyX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJLmxvbmcJYXJtOTIyX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJYXJtOTIyX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwkubG9uZwlhcm05MjJfY29oZXJlbnRfa2Vybl9yYW5nZQorCS5sb25nCWFybTkyMl9jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJYXJtOTIyX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UKKwkubG9uZwlhcm05MjJfZG1hX2ludl9yYW5nZQorCS5sb25nCWFybTkyMl9kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwlhcm05MjJfZG1hX2ZsdXNoX3JhbmdlCisKKyNlbmRpZgorCisKK0VOVFJZKGNwdV9hcm05MjJfZGNhY2hlX2NsZWFuX2FyZWEpCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwlzdWJzCXIxLCByMSwgI0NBQ0hFX0RMSU5FU0laRQorCWJoaQkxYgorI2VuZGlmCisJbW92CXBjLCBscgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhZ2VUYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAqIGNwdV9hcm05MjJfc3dpdGNoX21tKHBnZCkKKyAqCisgKiBTZXQgdGhlIHRyYW5zbGF0aW9uIGJhc2UgcG9pbnRlciB0byBiZSBhcyBkZXNjcmliZWQgYnkgcGdkLgorICoKKyAqIHBnZDogbmV3IHBhZ2UgdGFibGVzCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTkyMl9zd2l0Y2hfbW0pCisJbW92CWlwLCAjMAorI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDAJCUAgaW52YWxpZGF0ZSBEIGNhY2hlCisjZWxzZQorQCAmJiAnQ2xlYW4gJiBJbnZhbGlkYXRlIHdob2xlIERDYWNoZScKK0AgJiYgUmUtd3JpdHRlbiB0byB1c2UgSW5kZXggT3BzLgorQCAmJiBVc2VzIHJlZ2lzdGVycyByMSwgcjMgYW5kIGlwCisKKwltb3YJcjEsICMoQ0FDSEVfRFNFR01FTlRTIC0gMSkgPDwgNQlAIDQgc2VnbWVudHMKKzE6CW9ycglyMywgcjEsICMoQ0FDSEVfREVOVFJJRVMgLSAxKSA8PCAyNiBAIDY0IGVudHJpZXMKKzI6CW1jcglwMTUsIDAsIHIzLCBjNywgYzE0LCAyCQlAIGNsZWFuICYgaW52YWxpZGF0ZSBEIGluZGV4CisJc3VicwlyMywgcjMsICMxIDw8IDI2CisJYmNzCTJiCQkJCUAgZW50cmllcyA2MyB0byAwCisJc3VicwlyMSwgcjEsICMxIDw8IDUKKwliY3MJMWIJCQkJQCBzZWdtZW50cyA3IHRvIDAKKyNlbmRpZgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtOTIyX3NldF9wdGUocHRlcCwgcHRlKQorICoKKyAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTkyMl9zZXRfcHRlKQorCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKKwliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSworCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAorCisJdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KKwlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVworCisJdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KKwlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVworCisJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/CisJbW92bmUJcjIsICMwCisKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwllb3IJcjMsIHIyLCAjMHgwYQkJCUAgQyAmIHNtYWxsIHBhZ2U/CisJdHN0CXIzLCAjMHgwYgorCWJpY2VxCXIyLCByMiwgIzQKKyNlbmRpZgorCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCW1vdglyMCwgcjAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKwlfX0lOSVQKKworCS50eXBlCV9fYXJtOTIyX3NldHVwLCAjZnVuY3Rpb24KK19fYXJtOTIyX3NldHVwOgorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3CQlAIGludmFsaWRhdGUgSSxEIGNhY2hlcyBvbiB2NAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlciBvbiB2NAorCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcJCUAgaW52YWxpZGF0ZSBJLEQgVExCcyBvbiB2NAorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAJCUAgZ2V0IGNvbnRyb2wgcmVnaXN0ZXIgdjQKKwlsZHIJcjUsIGFybTkyMl9jcjFfY2xlYXIKKwliaWMJcjAsIHIwLCByNQorCWxkcglyNSwgYXJtOTIyX2NyMV9zZXQKKwlvcnIJcjAsIHIwLCByNQorCW1vdglwYywgbHIKKwkuc2l6ZQlfX2FybTkyMl9zZXR1cCwgLiAtIF9fYXJtOTIyX3NldHVwCisKKwkvKgorCSAqICBSCisJICogLlJWSSBaRlJTIEJMRFAgV0NBTQorCSAqIC4uMTEgMDAwMSAuLjExIDAxMDEKKwkgKiAKKwkgKi8KKwkudHlwZQlhcm05MjJfY3IxX2NsZWFyLCAjb2JqZWN0CisJLnR5cGUJYXJtOTIyX2NyMV9zZXQsICNvYmplY3QKK2FybTkyMl9jcjFfY2xlYXI6CisJLndvcmQJMHgzZjNmCithcm05MjJfY3IxX3NldDoKKwkud29yZAkweDMxMzUKKworCV9fSU5JVERBVEEKKworLyoKKyAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKKyAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCisgKi8KKwkudHlwZQlhcm05MjJfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorYXJtOTIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CisJLndvcmQJdjR0X2Vhcmx5X2Fib3J0CisJLndvcmQJY3B1X2FybTkyMl9wcm9jX2luaXQKKwkud29yZAljcHVfYXJtOTIyX3Byb2NfZmluCisJLndvcmQJY3B1X2FybTkyMl9yZXNldAorCS53b3JkICAgY3B1X2FybTkyMl9kb19pZGxlCisJLndvcmQJY3B1X2FybTkyMl9kY2FjaGVfY2xlYW5fYXJlYQorCS53b3JkCWNwdV9hcm05MjJfc3dpdGNoX21tCisJLndvcmQJY3B1X2FybTkyMl9zZXRfcHRlCisJLnNpemUJYXJtOTIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm05MjJfcHJvY2Vzc29yX2Z1bmN0aW9ucworCisJLnNlY3Rpb24gIi5yb2RhdGEiCisKKwkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0CitjcHVfYXJjaF9uYW1lOgorCS5hc2NpegkiYXJtdjR0IgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY0IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1X2FybTkyMl9uYW1lLCAjb2JqZWN0CitjcHVfYXJtOTIyX25hbWU6CisJLmFzY2lpCSJBUk05MjJUIgorI2lmbmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJLmFzY2lpCSJpIgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwkuYXNjaWkJImQiCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJLmFzY2lpCSIod3QpIgorI2Vsc2UKKwkuYXNjaWkJIih3YikiCisjZW5kaWYKKyNlbmRpZgorCS5hc2NpaQkiXDAiCisJLnNpemUJY3B1X2FybTkyMl9uYW1lLCAuIC0gY3B1X2FybTkyMl9uYW1lCisKKwkuYWxpZ24KKworCS5zZWN0aW9uICIucHJvYy5pbmZvIiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKwkudHlwZQlfX2FybTkyMl9wcm9jX2luZm8sI29iamVjdAorX19hcm05MjJfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwMDkyMjAKKwkubG9uZwkweGZmMDBmZmYwCisJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAorCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAorCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCisJCVBNRF9CSVQ0IHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX19hcm05MjJfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCisJLmxvbmcJY3B1X2FybTkyMl9uYW1lCisJLmxvbmcJYXJtOTIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJdjR3Yl91c2VyX2ZucworI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwkubG9uZwlhcm05MjJfY2FjaGVfZm5zCisjZWxzZQorCS5sb25nCXY0d3RfY2FjaGVfZm5zCisjZW5kaWYKKwkuc2l6ZQlfX2FybTkyMl9wcm9jX2luZm8sIC4gLSBfX2FybTkyMl9wcm9jX2luZm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDlhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL2FybTkyNS5TOiBNTVUgZnVuY3Rpb25zIGZvciBBUk05MjUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgQVJNIExpbWl0ZWQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFJpZGdlUnVuLCBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqICBVcGRhdGUgZm9yIExpbnV4LTIuNiBhbmQgY2FjaGUgZmx1c2ggaW1wcm92ZW1lbnRzCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGxvdyBsZXZlbCBhc3NlbWJsZXIgZm9yIHBlcmZvcm1pbmcgY2FjaGUgYW5kIFRMQgorICogZnVuY3Rpb25zIG9uIHRoZSBhcm05MjUuCisgKgorICogIENPTkZJR19DUFVfQVJNOTI1X0NQVV9JRExFIC0+IG5vaGx0CisgKgorICogU29tZSBhZGRpdGlvbmFsIG5vdGVzIGJhc2VkIG9uIGRlY2lwaGVyaW5nIHRoZSBUSSBUUk0gb24gT01BUC01OTEwOgorICoKKyAqIE5PVEUxOiBUaGUgVEk5MjVUIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgYml0ICJELWNhY2hlIGNsZWFuIGFuZCBmbHVzaAorICoJICBlbnRyeSBtb2RlIiBtdXN0IGJlIDAgdG8gZmx1c2ggdGhlIGVudHJpZXMgaW4gYm90aCBzZWdtZW50cworICoJICBhdCBvbmNlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlLiBTZWUgVFJNIDItMjAgYW5kIDItMjQgZm9yCisgKgkgIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogTk9URTI6IERlZmF1bHQgaXMgdGhlICJELWNhY2hlIGNsZWFuIGFuZCBmbHVzaCBlbnRyeSBtb2RlIi4gSXQgbG9va3MKKyAqCSAgbGlrZSB0aGUgIlRyYW5zcGFyZW50IG1vZGUiIG11c3QgYmUgb24gZm9yIHBhcnRpYWwgY2FjaGUgZmx1c2hlcworICoJICB0byB3b3JrIGluIHRoaXMgbW9kZS4gVGhpcyBtb2RlIG9ubHkgd29ya3Mgd2l0aCAxNi1iaXQgZXh0ZXJuYWwKKyAqCSAgbWVtb3J5LiBTZWUgVFJNIDItMjQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogTk9URTM6IFdyaXRlLWJhY2sgY2FjaGUgZmx1c2hpbmcgc2VlbXMgdG8gYmUgZmxha2V5IHdpdGggZGV2aWNlcyB1c2luZworICogICAgICAgIGRpcmVjdCBtZW1vcnkgYWNjZXNzLCBzdWNoIGFzIFVTQiBPSENJLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB1c2UKKyAqICAgICAgICB3cml0ZS10aHJvdWdoIGNhY2hlIHdpdGggQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIICh0aGlzIGlzCisgKiAgICAgICAgdGhlIGRlZmF1bHQgZm9yIE9NQVAtMTUxMCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKKworLyoKKyAqIFRoZSBzaXplIG9mIG9uZSBkYXRhIGNhY2hlIGxpbmUuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTkVTSVpFCTE2CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGRhdGEgY2FjaGUgc2VnbWVudHMuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRFNFR01FTlRTCTIKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgbGluZXMgaW4gYSBjYWNoZSBzZWdtZW50LgorICovCisjZGVmaW5lIENBQ0hFX0RFTlRSSUVTCTI1NgorCisvKgorICogVGhpcyBpcyB0aGUgc2l6ZSBhdCB3aGljaCBpdCBiZWNvbWVzIG1vcmUgZWZmaWNpZW50IHRvCisgKiBjbGVhbiB0aGUgd2hvbGUgY2FjaGUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbmRpdmlkdWFsCisgKiBjYWNoZSBsaW5lIG1haW50YWluZW5jZSBpbnN0cnVjdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTUlUCTgxOTIKKworCS50ZXh0CisvKgorICogY3B1X2FybTkyNV9wcm9jX2luaXQoKQorICovCitFTlRSWShjcHVfYXJtOTI1X3Byb2NfaW5pdCkKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfYXJtOTI1X3Byb2NfZmluKCkKKyAqLworRU5UUlkoY3B1X2FybTkyNV9wcm9jX2ZpbikKKwlzdG1mZAlzcCEsIHtscn0KKwltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQorCW1zcgljcHNyX2MsIGlwCisJYmwJYXJtOTI1X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCXIwLCByMCwgIzB4MTAwMAkJCUAgLi4uaS4uLi4uLi4uLi4uLgorCWJpYwlyMCwgcjAsICMweDAwMGUJCQlAIC4uLi4uLi4uLi4uLndjYS4KKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCisJbGRtZmQJc3AhLCB7cGN9CisKKy8qCisgKiBjcHVfYXJtOTI1X3Jlc2V0KGxvYykKKyAqCisgKiBQZXJmb3JtIGEgc29mdCByZXNldCBvZiB0aGUgc3lzdGVtLiAgUHV0IHRoZSBDUFUgaW50byB0aGUKKyAqIHNhbWUgc3RhdGUgYXMgaXQgd291bGQgYmUgaWYgaXQgaGFkIGJlZW4gcmVzZXQsIGFuZCBicmFuY2gKKyAqIHRvIHdoYXQgd291bGQgYmUgdGhlIHJlc2V0IHZlY3Rvci4KKyAqCisgKiBsb2M6IGxvY2F0aW9uIHRvIGp1bXAgdG8gZm9yIHNvZnQgcmVzZXQKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtOTI1X3Jlc2V0KQorCS8qIFNlbmQgc29mdHdhcmUgcmVzZXQgdG8gTVBVIGFuZCBEU1AgKi8KKwltb3YJaXAsICMweGZmMDAwMDAwCisJb3JyCWlwLCBpcCwgIzB4MDBmZTAwMDAKKwlvcnIJaXAsIGlwLCAjMHgwMDAwY2UwMAorCW1vdglyNCwgIzEKKwlzdHJoCXI0LCBbaXAsICMweDEwXQorCisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLEQgY2FjaGVzCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSAmIEQgVExCcworCW1yYwlwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlpcCwgaXAsICMweDAwMGYJCQlAIC4uLi4uLi4uLi4uLndjYW0KKwliaWMJaXAsIGlwLCAjMHgxMTAwCQkJQCAuLi5pLi4ucy4uLi4uLi4uCisJbWNyCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJbW92CXBjLCByMAorCisvKgorICogY3B1X2FybTkyNV9kb19pZGxlKCkKKyAqCisgKiBDYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkCisgKi8KKwkuYWxpZ24JMTAKK0VOVFJZKGNwdV9hcm05MjVfZG9faWRsZSkKKwltb3YJcjAsICMwCisJbXJjCXAxNSwgMCwgcjEsIGMxLCBjMCwgMAkJQCBSZWFkIGNvbnRyb2wgcmVnaXN0ZXIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBEcmFpbiB3cml0ZSBidWZmZXIKKwliaWMJcjIsIHIxLCAjMSA8PCAxMgorCW1jcglwMTUsIDAsIHIyLCBjMSwgYzAsIDAJCUAgRGlzYWJsZSBJIGNhY2hlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNAkJQCBXYWl0IGZvciBpbnRlcnJ1cHQKKwltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIFJlc3RvcmUgSUNhY2hlIGVuYWJsZQorCW1vdglwYywgbHIKKworLyoKKyAqCWZsdXNoX3VzZXJfY2FjaGVfYWxsKCkKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSBhbGwgY2FjaGUgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIKKyAqCWFkZHJlc3Mgc3BhY2UuCisgKi8KK0VOVFJZKGFybTkyNV9mbHVzaF91c2VyX2NhY2hlX2FsbCkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZmx1c2hfa2Vybl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK0VOVFJZKGFybTkyNV9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwltb3YJcjIsICNWTV9FWEVDCisJbW92CWlwLCAjMAorX19mbHVzaF93aG9sZV9jYWNoZToKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM2LCAwCQlAIGludmFsaWRhdGUgRCBjYWNoZQorI2Vsc2UKKwkvKiBGbHVzaCBlbnRyaWVzIGluIGJvdGggc2VnbWVudHMgYXQgb25jZSwgc2VlIE5PVEUxIGFib3ZlICovCisJbW92CXIzLCAjKENBQ0hFX0RFTlRSSUVTIC0gMSkgPDwgNAlAIDI1NiBlbnRyaWVzIGluIHNlZ21lbnQKKzI6CW1jcglwMTUsIDAsIHIzLCBjNywgYzE0LCAyCQlAIGNsZWFuK2ludmFsaWRhdGUgRCBpbmRleAorCXN1YnMJcjMsIHIzLCAjMSA8PCA0CisJYmNzCTJiCQkJCUAgZW50cmllcyAyNTUgdG8gMAorI2VuZGlmCisJdHN0CXIyLCAjVk1fRVhFQworCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSBhIHJhbmdlIG9mIGNhY2hlIGVudHJpZXMgaW4gdGhlCisgKglzcGVjaWZpZWQgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gc3RhcnQgYWRkcmVzcyAoaW5jbHVzaXZlKQorICoJLSBlbmQJLSBlbmQgYWRkcmVzcyAoZXhjbHVzaXZlKQorICoJLSBmbGFncwktIHZtX2ZsYWdzIGRlc2NyaWJpbmcgYWRkcmVzcyBzcGFjZQorICovCitFTlRSWShhcm05MjVfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwltb3YJaXAsICMwCisJc3ViCXIzLCByMSwgcjAJCQlAIGNhbGN1bGF0ZSB0b3RhbCBzaXplCisJY21wCXIzLCAjQ0FDSEVfRExJTUlUCisJYmd0CV9fZmx1c2hfd2hvbGVfY2FjaGUKKzE6CXRzdAlyMiwgI1ZNX0VYRUMKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkJQCBpbnZhbGlkYXRlIEkgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlIEQgZW50cnkKKwltY3JuZQlwMTUsIDAsIHIwLCBjNywgYzUsIDEJCUAgaW52YWxpZGF0ZSBJIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorI2Vsc2UKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGVudHJ5CisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGVudHJ5CisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKyNlbmRpZgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwl0c3QJcjIsICNWTV9FWEVDCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWNvaGVyZW50X2tlcm5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQsIGVuZC4gIElmIHlvdSBoYXZlIG5vbi1zbm9vcGluZworICoJSGFydmFyZCBjYWNoZXMsIHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWShhcm05MjVfY29oZXJlbnRfa2Vybl9yYW5nZSkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJY29oZXJlbnRfdXNlcl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUVuc3VyZSBjb2hlcmVuY3kgYmV0d2VlbiB0aGUgSWNhY2hlIGFuZCB0aGUgRGNhY2hlIGluIHRoZQorICoJcmVnaW9uIGRlc2NyaWJlZCBieSBzdGFydCwgZW5kLiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyNV9jb2hlcmVudF91c2VyX3JhbmdlKQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkJQCBpbnZhbGlkYXRlIEkgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSh2b2lkICpwYWdlKQorICoKKyAqCUVuc3VyZSBubyBEIGNhY2hlIGFsaWFzaW5nIG9jY3VycywgZWl0aGVyIHdpdGggaXRzZWxmIG9yCisgKgl0aGUgSSBjYWNoZQorICoKKyAqCS0gYWRkcgktIHBhZ2UgYWxpZ25lZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyNV9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlKQorCWFkZAlyMSwgcjAsICNQQUdFX1NaCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2ludl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUludmFsaWRhdGUgKGRpc2NhcmQpIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoJTWF5IG5vdCB3cml0ZSBiYWNrIGFueSBlbnRyaWVzLiAgSWYgJ3N0YXJ0JyBvciAnZW5kJworICoJYXJlIG5vdCBjYWNoZSBsaW5lIGFsaWduZWQsIHRob3NlIGxpbmVzIG11c3QgYmUgd3JpdHRlbgorICoJYmFjay4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqCisgKiAoc2FtZSBhcyB2NHdiKQorICovCitFTlRSWShhcm05MjVfZG1hX2ludl9yYW5nZSkKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJdHN0CXIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCXRzdAlyMSwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIxLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKyNlbmRpZgorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqCisgKiAoc2FtZSBhcyB2NHdiKQorICovCitFTlRSWShhcm05MjVfZG1hX2NsZWFuX3JhbmdlKQorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWShhcm05MjVfZG1hX2ZsdXNoX3JhbmdlKQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKyNlbHNlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorI2VuZGlmCisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworRU5UUlkoYXJtOTI1X2NhY2hlX2ZucykKKwkubG9uZwlhcm05MjVfZmx1c2hfa2Vybl9jYWNoZV9hbGwKKwkubG9uZwlhcm05MjVfZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwkubG9uZwlhcm05MjVfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQorCS5sb25nCWFybTkyNV9jb2hlcmVudF9rZXJuX3JhbmdlCisJLmxvbmcJYXJtOTI1X2NvaGVyZW50X3VzZXJfcmFuZ2UKKwkubG9uZwlhcm05MjVfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZQorCS5sb25nCWFybTkyNV9kbWFfaW52X3JhbmdlCisJLmxvbmcJYXJtOTI1X2RtYV9jbGVhbl9yYW5nZQorCS5sb25nCWFybTkyNV9kbWFfZmx1c2hfcmFuZ2UKKworRU5UUlkoY3B1X2FybTkyNV9kY2FjaGVfY2xlYW5fYXJlYSkKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCXN1YnMJcjEsIHIxLCAjQ0FDSEVfRExJTkVTSVpFCisJYmhpCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQYWdlVGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBjcHVfYXJtOTI1X3N3aXRjaF9tbShwZ2QpCisgKgorICogU2V0IHRoZSB0cmFuc2xhdGlvbiBiYXNlIHBvaW50ZXIgdG8gYmUgYXMgZGVzY3JpYmVkIGJ5IHBnZC4KKyAqCisgKiBwZ2Q6IG5ldyBwYWdlIHRhYmxlcworICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm05MjVfc3dpdGNoX21tKQorCW1vdglpcCwgIzAKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM2LCAwCQlAIGludmFsaWRhdGUgRCBjYWNoZQorI2Vsc2UKKwkvKiBGbHVzaCBlbnRyaWVzIGluIGJvdGhlIHNlZ21lbnRzIGF0IG9uY2UsIHNlZSBOT1RFMSBhYm92ZSAqLworCW1vdglyMywgIyhDQUNIRV9ERU5UUklFUyAtIDEpIDw8IDQJQCAyNTYgZW50cmllcyBpbiBzZWdtZW50CisyOgltY3IJcDE1LCAwLCByMywgYzcsIGMxNCwgMgkJQCBjbGVhbiAmIGludmFsaWRhdGUgRCBpbmRleAorCXN1YnMJcjMsIHIzLCAjMSA8PCA0CisJYmNzCTJiCQkJCUAgZW50cmllcyAyNTUgdG8gMAorI2VuZGlmCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1jcglwMTUsIDAsIHIwLCBjMiwgYzAsIDAJCUAgbG9hZCBwYWdlIHRhYmxlIHBvaW50ZXIKKwltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSAmIEQgVExCcworCW1vdglwYywgbHIKKworLyoKKyAqIGNwdV9hcm05MjVfc2V0X3B0ZShwdGVwLCBwdGUpCisgKgorICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfYXJtOTI1X3NldF9wdGUpCisJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgorCisJZW9yCXIxLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKKworCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSworCWJpYwlyMiwgcjIsICNQVEVfVFlQRV9NQVNLCisJb3JyCXIyLCByMiwgI1BURV9UWVBFX1NNQUxMCisKKwl0c3QJcjEsICNMX1BURV9VU0VSCQkJQCBVc2VyPworCW9ycm5lCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VUk9fU1JXCisKKwl0c3QJcjEsICNMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCUAgV3JpdGUgYW5kIERpcnR5PworCW9ycmVxCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VTk9fU1JXCisKKwl0c3QJcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBQcmVzZW50IGFuZCBZb3VuZz8KKwltb3ZuZQlyMiwgIzAKKworI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCWVvcglyMywgcjIsICMweDBhCQkJQCBDICYgc21hbGwgcGFnZT8KKwl0c3QJcjMsICMweDBiCisJYmljZXEJcjIsIHIyLCAjNAorI2VuZGlmCisJc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCisJbW92CXIwLCByMAorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworCV9fSU5JVAorCisJLnR5cGUJX19hcm05MjVfc2V0dXAsICNmdW5jdGlvbgorX19hcm05MjVfc2V0dXA6CisJbW92CXIwLCAjMAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9JQ0FDSEVfU1RSRUFNSU5HX0RJU0FCTEUpCisgICAgICAgIG9yciAgICAgcjAscjAsIzEgPDwgNworI2VuZGlmCisKKwkvKiBUcmFuc3BhcmVudCBvbiwgRC1jYWNoZSBjbGVhbiAmIGZsdXNoIG1vZGUuIFNlZSAgTk9URTIgYWJvdmUgKi8KKyAgICAgICAgb3JyICAgICByMCxyMCwjMSA8PCAxCQkJQCB0cmFuc3BhcmVudCBtb2RlIG9uCisgICAgICAgIG1jciAgICAgcDE1LCAwLCByMCwgYzE1LCBjMSwgMCAgICAgICAgICBAIHdyaXRlIFRJIGNvbmZpZyByZWdpc3RlcgorCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcJCUAgaW52YWxpZGF0ZSBJLEQgY2FjaGVzIG9uIHY0CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyIG9uIHY0CisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNwkJQCBpbnZhbGlkYXRlIEksRCBUTEJzIG9uIHY0CisKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltb3YJcjAsICM0CQkJCUAgZGlzYWJsZSB3cml0ZS1iYWNrIG9uIGNhY2hlcyBleHBsaWNpdGx5CisJbWNyCXAxNSwgNywgcjAsIGMxNSwgYzAsIDAKKyNlbmRpZgorCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMAkJQCBnZXQgY29udHJvbCByZWdpc3RlciB2NAorCWxkcglyNSwgYXJtOTI1X2NyMV9jbGVhcgorCWJpYwlyMCwgcjAsIHI1CisJbGRyCXI1LCBhcm05MjVfY3IxX3NldAorCW9ycglyMCwgcjAsIHI1CisjaWZkZWYgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTgorCW9ycglyMCwgcjAsICMweDQwMDAJCQlAIC4xLi4gLi4uLiAuLi4uIC4uLi4KKyNlbmRpZgorCW1vdglwYywgbHIKKwkuc2l6ZQlfX2FybTkyNV9zZXR1cCwgLiAtIF9fYXJtOTI1X3NldHVwCisKKwkvKgorCSAqICBSCisJICogLlJWSSBaRlJTIEJMRFAgV0NBTQorCSAqIC4wMTEgMDAwMSAuLjExIDExMDEKKwkgKiAKKwkgKi8KKwkudHlwZQlhcm05MjVfY3IxX2NsZWFyLCAjb2JqZWN0CisJLnR5cGUJYXJtOTI1X2NyMV9zZXQsICNvYmplY3QKK2FybTkyNV9jcjFfY2xlYXI6CisJLndvcmQJMHg3ZjNmCithcm05MjVfY3IxX3NldDoKKwkud29yZAkweDMxM2QKKworCV9fSU5JVERBVEEKKworLyoKKyAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKKyAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCisgKi8KKwkudHlwZQlhcm05MjVfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CisJLndvcmQJdjR0X2Vhcmx5X2Fib3J0CisJLndvcmQJY3B1X2FybTkyNV9wcm9jX2luaXQKKwkud29yZAljcHVfYXJtOTI1X3Byb2NfZmluCisJLndvcmQJY3B1X2FybTkyNV9yZXNldAorCS53b3JkICAgY3B1X2FybTkyNV9kb19pZGxlCisJLndvcmQJY3B1X2FybTkyNV9kY2FjaGVfY2xlYW5fYXJlYQorCS53b3JkCWNwdV9hcm05MjVfc3dpdGNoX21tCisJLndvcmQJY3B1X2FybTkyNV9zZXRfcHRlCisJLnNpemUJYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm05MjVfcHJvY2Vzc29yX2Z1bmN0aW9ucworCisJLnNlY3Rpb24gIi5yb2RhdGEiCisKKwkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0CitjcHVfYXJjaF9uYW1lOgorCS5hc2NpegkiYXJtdjR0IgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY0IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1X2FybTkyNV9uYW1lLCAjb2JqZWN0CitjcHVfYXJtOTI1X25hbWU6CisJLmFzY2lpCSJBUk05MjVUIgorI2lmbmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJLmFzY2lpCSJpIgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwkuYXNjaWkJImQiCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJLmFzY2lpCSIod3QpIgorI2Vsc2UKKwkuYXNjaWkJIih3YikiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOCisJLmFzY2lpCSJSUiIKKyNlbmRpZgorI2VuZGlmCisJLmFzY2lpCSJcMCIKKwkuc2l6ZQljcHVfYXJtOTI1X25hbWUsIC4gLSBjcHVfYXJtOTI1X25hbWUKKworCS5hbGlnbgorCisJLnNlY3Rpb24gIi5wcm9jLmluZm8iLCAjYWxsb2MsICNleGVjaW5zdHIKKworCS50eXBlCV9fYXJtOTI1X3Byb2NfaW5mbywjb2JqZWN0CitfX2FybTkyNV9wcm9jX2luZm86CisJLmxvbmcJMHg1NDAyOTI1MAorCS5sb25nCTB4ZmZmZmZmZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9CSVQ0IHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX19hcm05MjVfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCisJLmxvbmcJY3B1X2FybTkyNV9uYW1lCisJLmxvbmcJYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJdjR3Yl91c2VyX2ZucworCS5sb25nCWFybTkyNV9jYWNoZV9mbnMKKwkuc2l6ZQlfX2FybTkyNV9wcm9jX2luZm8sIC4gLSBfX2FybTkyNV9wcm9jX2luZm8KKworCS50eXBlCV9fYXJtOTE1X3Byb2NfaW5mbywjb2JqZWN0CitfX2FybTkxNV9wcm9jX2luZm86CisJLmxvbmcJMHg1NDAyOTE1MAorCS5sb25nCTB4ZmZmZmZmZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9CSVQ0IHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX19hcm05MjVfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCisJLmxvbmcJY3B1X2FybTkyNV9uYW1lCisJLmxvbmcJYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJdjR3Yl91c2VyX2ZucworCS5sb25nCWFybTkyNV9jYWNoZV9mbnMKKwkuc2l6ZQlfX2FybTkyNV9wcm9jX2luZm8sIC4gLSBfX2FybTkyNV9wcm9jX2luZm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTVjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCkBAIC0wLDAgKzEsNDk1IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlM6IE1NVSBmdW5jdGlvbnMgZm9yIEFSTTkyNkVKLVMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgQVJNIExpbWl0ZWQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGxvdyBsZXZlbCBhc3NlbWJsZXIgZm9yIHBlcmZvcm1pbmcgY2FjaGUgYW5kIFRMQgorICogZnVuY3Rpb25zIG9uIHRoZSBhcm05MjYuCisgKgorICogIENPTkZJR19DUFVfQVJNOTI2X0NQVV9JRExFIC0+IG5vaGx0CisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gYXJlYSB3aGljaCB3aWxsIGJlIGludmFsaWRhdGVkCisgKiB1c2luZyB0aGUgc2luZ2xlIGludmFsaWRhdGUgZW50cnkgaW5zdHJ1Y3Rpb25zLiAgQW55dGhpbmcgbGFyZ2VyCisgKiB0aGFuIHRoaXMsIGFuZCB3ZSBnbyBmb3IgdGhlIHdob2xlIGNhY2hlLgorICoKKyAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIGNob3NlbiBzdWNoIHRoYXQgd2UgY2hvb3NlIHRoZSBjaGVhcGVzdAorICogYWx0ZXJuYXRpdmUuCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTUlUCTE2Mzg0CisKKy8qCisgKiB0aGUgY2FjaGUgbGluZSBzaXplIG9mIHRoZSBJIGFuZCBEIGNhY2hlCisgKi8KKyNkZWZpbmUgQ0FDSEVfRExJTkVTSVpFCTMyCisKKwkudGV4dAorLyoKKyAqIGNwdV9hcm05MjZfcHJvY19pbml0KCkKKyAqLworRU5UUlkoY3B1X2FybTkyNl9wcm9jX2luaXQpCisJbW92CXBjLCBscgorCisvKgorICogY3B1X2FybTkyNl9wcm9jX2ZpbigpCisgKi8KK0VOVFJZKGNwdV9hcm05MjZfcHJvY19maW4pCisJc3RtZmQJc3AhLCB7bHJ9CisJbW92CWlwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKKwltc3IJY3Bzcl9jLCBpcAorCWJsCWFybTkyNl9mbHVzaF9rZXJuX2NhY2hlX2FsbAorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlyMCwgcjAsICMweDEwMDAJCQlAIC4uLmkuLi4uLi4uLi4uLi4KKwliaWMJcjAsIHIwLCAjMHgwMDBlCQkJQCAuLi4uLi4uLi4uLi53Y2EuCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcworCWxkbWZkCXNwISwge3BjfQorCisvKgorICogY3B1X2FybTkyNl9yZXNldChsb2MpCisgKgorICogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIHN5c3RlbS4gIFB1dCB0aGUgQ1BVIGludG8gdGhlCisgKiBzYW1lIHN0YXRlIGFzIGl0IHdvdWxkIGJlIGlmIGl0IGhhZCBiZWVuIHJlc2V0LCBhbmQgYnJhbmNoCisgKiB0byB3aGF0IHdvdWxkIGJlIHRoZSByZXNldCB2ZWN0b3IuCisgKgorICogbG9jOiBsb2NhdGlvbiB0byBqdW1wIHRvIGZvciBzb2Z0IHJlc2V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X2FybTkyNl9yZXNldCkKKwltb3YJaXAsICMwCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNywgMAkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCisJbXJjCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCWlwLCBpcCwgIzB4MDAwZgkJCUAgLi4uLi4uLi4uLi4ud2NhbQorCWJpYwlpcCwgaXAsICMweDExMDAJCQlAIC4uLmkuLi5zLi4uLi4uLi4KKwltY3IJcDE1LCAwLCBpcCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwltb3YJcGMsIHIwCisKKy8qCisgKiBjcHVfYXJtOTI2X2RvX2lkbGUoKQorICoKKyAqIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQKKyAqLworCS5hbGlnbgkxMAorRU5UUlkoY3B1X2FybTkyNl9kb19pZGxlKQorCW1vdglyMCwgIzAKKwltcmMJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIFJlYWQgY29udHJvbCByZWdpc3RlcgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIERyYWluIHdyaXRlIGJ1ZmZlcgorCWJpYwlyMiwgcjEsICMxIDw8IDEyCisJbWNyCXAxNSwgMCwgcjIsIGMxLCBjMCwgMAkJQCBEaXNhYmxlIEkgY2FjaGUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0CQlAIFdhaXQgZm9yIGludGVycnVwdAorCW1jcglwMTUsIDAsIHIxLCBjMSwgYzAsIDAJCUAgUmVzdG9yZSBJQ2FjaGUgZW5hYmxlCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIGFsbCBjYWNoZSBlbnRyaWVzIGluIGEgcGFydGljdWxhcgorICoJYWRkcmVzcyBzcGFjZS4KKyAqLworRU5UUlkoYXJtOTI2X2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorCS8qIEZBTExUSFJPVUdIICovCisKKy8qCisgKglmbHVzaF9rZXJuX2NhY2hlX2FsbCgpCisgKgorICoJQ2xlYW4gYW5kIGludmFsaWRhdGUgdGhlIGVudGlyZSBjYWNoZS4KKyAqLworRU5UUlkoYXJtOTI2X2ZsdXNoX2tlcm5fY2FjaGVfYWxsKQorCW1vdglyMiwgI1ZNX0VYRUMKKwltb3YJaXAsICMwCitfX2ZsdXNoX3dob2xlX2NhY2hlOgorI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDAJCUAgaW52YWxpZGF0ZSBEIGNhY2hlCisjZWxzZQorMToJbXJjCXAxNSwgMCwgcjE1LCBjNywgYzE0LCAzIAlAIHRlc3QsY2xlYW4saW52YWxpZGF0ZQorCWJuZQkxYgorI2VuZGlmCisJdHN0CXIyLCAjVk1fRVhFQworCW1jcm5lCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfdXNlcl9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSBhIHJhbmdlIG9mIGNhY2hlIGVudHJpZXMgaW4gdGhlCisgKglzcGVjaWZpZWQgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gc3RhcnQgYWRkcmVzcyAoaW5jbHVzaXZlKQorICoJLSBlbmQJLSBlbmQgYWRkcmVzcyAoZXhjbHVzaXZlKQorICoJLSBmbGFncwktIHZtX2ZsYWdzIGRlc2NyaWJpbmcgYWRkcmVzcyBzcGFjZQorICovCitFTlRSWShhcm05MjZfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwltb3YJaXAsICMwCisJc3ViCXIzLCByMSwgcjAJCQlAIGNhbGN1bGF0ZSB0b3RhbCBzaXplCisJY21wCXIzLCAjQ0FDSEVfRExJTUlUCisJYmd0CV9fZmx1c2hfd2hvbGVfY2FjaGUKKzE6CXRzdAlyMiwgI1ZNX0VYRUMKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkJQCBpbnZhbGlkYXRlIEkgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlIEQgZW50cnkKKwltY3JuZQlwMTUsIDAsIHIwLCBjNywgYzUsIDEJCUAgaW52YWxpZGF0ZSBJIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorI2Vsc2UKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGVudHJ5CisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGVudHJ5CisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKyNlbmRpZgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwl0c3QJcjIsICNWTV9FWEVDCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWNvaGVyZW50X2tlcm5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQsIGVuZC4gIElmIHlvdSBoYXZlIG5vbi1zbm9vcGluZworICoJSGFydmFyZCBjYWNoZXMsIHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWShhcm05MjZfY29oZXJlbnRfa2Vybl9yYW5nZSkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJY29oZXJlbnRfdXNlcl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUVuc3VyZSBjb2hlcmVuY3kgYmV0d2VlbiB0aGUgSWNhY2hlIGFuZCB0aGUgRGNhY2hlIGluIHRoZQorICoJcmVnaW9uIGRlc2NyaWJlZCBieSBzdGFydCwgZW5kLiAgSWYgeW91IGhhdmUgbm9uLXNub29waW5nCisgKglIYXJ2YXJkIGNhY2hlcywgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgKgorICoJLSBzdGFydAktIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyNl9jb2hlcmVudF91c2VyX3JhbmdlKQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkJQCBpbnZhbGlkYXRlIEkgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSh2b2lkICpwYWdlKQorICoKKyAqCUVuc3VyZSBubyBEIGNhY2hlIGFsaWFzaW5nIG9jY3VycywgZWl0aGVyIHdpdGggaXRzZWxmIG9yCisgKgl0aGUgSSBjYWNoZQorICoKKyAqCS0gYWRkcgktIHBhZ2UgYWxpZ25lZCBhZGRyZXNzCisgKi8KK0VOVFJZKGFybTkyNl9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlKQorCWFkZAlyMSwgcjAsICNQQUdFX1NaCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisvKgorICoJZG1hX2ludl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUludmFsaWRhdGUgKGRpc2NhcmQpIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoJTWF5IG5vdCB3cml0ZSBiYWNrIGFueSBlbnRyaWVzLiAgSWYgJ3N0YXJ0JyBvciAnZW5kJworICoJYXJlIG5vdCBjYWNoZSBsaW5lIGFsaWduZWQsIHRob3NlIGxpbmVzIG11c3QgYmUgd3JpdHRlbgorICoJYmFjay4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqCisgKiAoc2FtZSBhcyB2NHdiKQorICovCitFTlRSWShhcm05MjZfZG1hX2ludl9yYW5nZSkKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJdHN0CXIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCXRzdAlyMSwgI0NBQ0hFX0RMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIxLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKyNlbmRpZgorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0CS0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAktIHZpcnR1YWwgZW5kIGFkZHJlc3MKKyAqCisgKiAoc2FtZSBhcyB2NHdiKQorICovCitFTlRSWShhcm05MjZfZG1hX2NsZWFuX3JhbmdlKQorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwliaWMJcjAsIHIwLCAjQ0FDSEVfRExJTkVTSVpFIC0gMQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQJLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kCS0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWShhcm05MjZfZG1hX2ZsdXNoX3JhbmdlKQorCWJpYwlyMCwgcjAsICNDQUNIRV9ETElORVNJWkUgLSAxCisxOgorI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbitpbnZhbGlkYXRlIEQgZW50cnkKKyNlbHNlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorI2VuZGlmCisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworRU5UUlkoYXJtOTI2X2NhY2hlX2ZucykKKwkubG9uZwlhcm05MjZfZmx1c2hfa2Vybl9jYWNoZV9hbGwKKwkubG9uZwlhcm05MjZfZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwkubG9uZwlhcm05MjZfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQorCS5sb25nCWFybTkyNl9jb2hlcmVudF9rZXJuX3JhbmdlCisJLmxvbmcJYXJtOTI2X2NvaGVyZW50X3VzZXJfcmFuZ2UKKwkubG9uZwlhcm05MjZfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZQorCS5sb25nCWFybTkyNl9kbWFfaW52X3JhbmdlCisJLmxvbmcJYXJtOTI2X2RtYV9jbGVhbl9yYW5nZQorCS5sb25nCWFybTkyNl9kbWFfZmx1c2hfcmFuZ2UKKworRU5UUlkoY3B1X2FybTkyNl9kY2FjaGVfY2xlYW5fYXJlYSkKKyNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQorCXN1YnMJcjEsIHIxLCAjQ0FDSEVfRExJTkVTSVpFCisJYmhpCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQYWdlVGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBjcHVfYXJtOTI2X3N3aXRjaF9tbShwZ2QpCisgKgorICogU2V0IHRoZSB0cmFuc2xhdGlvbiBiYXNlIHBvaW50ZXIgdG8gYmUgYXMgZGVzY3JpYmVkIGJ5IHBnZC4KKyAqCisgKiBwZ2Q6IG5ldyBwYWdlIHRhYmxlcworICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm05MjZfc3dpdGNoX21tKQorCW1vdglpcCwgIzAKKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM2LCAwCQlAIGludmFsaWRhdGUgRCBjYWNoZQorI2Vsc2UKK0AgJiYgJ0NsZWFuICYgSW52YWxpZGF0ZSB3aG9sZSBEQ2FjaGUnCisxOgltcmMJcDE1LCAwLCByMTUsIGM3LCBjMTQsIDMgCUAgdGVzdCxjbGVhbixpbnZhbGlkYXRlCisJYm5lCTFiCisjZW5kaWYKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM1LCAwCQlAIGludmFsaWRhdGUgSSBjYWNoZQorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbWNyCXAxNSwgMCwgcjAsIGMyLCBjMCwgMAkJQCBsb2FkIHBhZ2UgdGFibGUgcG9pbnRlcgorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCisJbW92CXBjLCBscgorCisvKgorICogY3B1X2FybTkyNl9zZXRfcHRlKHB0ZXAsIHB0ZSkKKyAqCisgKiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dAorICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9hcm05MjZfc2V0X3B0ZSkKKwlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCisKKwllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQorCisJYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCisJYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKKwlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKKworCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/CisJb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKKworCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/CisJb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKKworCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nPworCW1vdm5lCXIyLCAjMAorCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJZW9yCXIzLCByMiwgIzB4MGEJCQlAIEMgJiBzbWFsbCBwYWdlPworCXRzdAlyMywgIzB4MGIKKwliaWNlcQlyMiwgcjIsICM0CisjZW5kaWYKKwlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwltb3YJcjAsIHIwCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKyNlbmRpZgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisJX19JTklUCisKKwkudHlwZQlfX2FybTkyNl9zZXR1cCwgI2Z1bmN0aW9uCitfX2FybTkyNl9zZXR1cDoKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNwkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMgb24gdjQKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiB3cml0ZSBidWZmZXIgb24gdjQKKwltY3IJcDE1LCAwLCByMCwgYzgsIGM3CQlAIGludmFsaWRhdGUgSSxEIFRMQnMgb24gdjQKKworCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJbW92CXIwLCAjNAkJCQlAIGRpc2FibGUgd3JpdGUtYmFjayBvbiBjYWNoZXMgZXhwbGljaXRseQorCW1jcglwMTUsIDcsIHIwLCBjMTUsIGMwLCAwCisjZW5kaWYgCisKKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwCQlAIGdldCBjb250cm9sIHJlZ2lzdGVyIHY0CisJbGRyCXI1LCBhcm05MjZfY3IxX2NsZWFyCisJYmljCXIwLCByMCwgcjUKKwlsZHIJcjUsIGFybTkyNl9jcjFfc2V0CisJb3JyCXIwLCByMCwgcjUKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOCisJb3JyCXIwLCByMCwgIzB4NDAwMAkJCUAgLjEuLiAuLi4uIC4uLi4gLi4uLgorI2VuZGlmCisJbW92CXBjLCBscgorCS5zaXplCV9fYXJtOTI2X3NldHVwLCAuIC0gX19hcm05MjZfc2V0dXAKKworCS8qCisJICogIFIKKwkgKiAuUlZJIFpGUlMgQkxEUCBXQ0FNCisJICogLjAxMSAwMDAxIC4uMTEgMDEwMQorCSAqIAorCSAqLworCS50eXBlCWFybTkyNl9jcjFfY2xlYXIsICNvYmplY3QKKwkudHlwZQlhcm05MjZfY3IxX3NldCwgI29iamVjdAorYXJtOTI2X2NyMV9jbGVhcjoKKwkud29yZAkweDdmM2YKK2FybTkyNl9jcjFfc2V0OgorCS53b3JkCTB4MzEzNQorCisJX19JTklUREFUQQorCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCS50eXBlCWFybTkyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Cithcm05MjZfcHJvY2Vzc29yX2Z1bmN0aW9uczoKKwkud29yZAl2NXRqX2Vhcmx5X2Fib3J0CisJLndvcmQJY3B1X2FybTkyNl9wcm9jX2luaXQKKwkud29yZAljcHVfYXJtOTI2X3Byb2NfZmluCisJLndvcmQJY3B1X2FybTkyNl9yZXNldAorCS53b3JkCWNwdV9hcm05MjZfZG9faWRsZQorCS53b3JkCWNwdV9hcm05MjZfZGNhY2hlX2NsZWFuX2FyZWEKKwkud29yZAljcHVfYXJtOTI2X3N3aXRjaF9tbQorCS53b3JkCWNwdV9hcm05MjZfc2V0X3B0ZQorCS5zaXplCWFybTkyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtOTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKworCS5zZWN0aW9uICIucm9kYXRhIgorCisJLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAorY3B1X2FyY2hfbmFtZToKKwkuYXNjaXoJImFybXY1dGVqIgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY1IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1X2FybTkyNl9uYW1lLCAjb2JqZWN0CitjcHVfYXJtOTI2X25hbWU6CisJLmFzY2lpCSJBUk05MjZFSi1TIgorI2lmbmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJLmFzY2lpCSJpIgorI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwkuYXNjaWkJImQiCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJLmFzY2lpCSIod3QpIgorI2Vsc2UKKwkuYXNjaWkJIih3YikiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOCisJLmFzY2lpCSJSUiIKKyNlbmRpZgorI2VuZGlmCisJLmFzY2lpCSJcMCIKKwkuc2l6ZQljcHVfYXJtOTI2X25hbWUsIC4gLSBjcHVfYXJtOTI2X25hbWUKKworCS5hbGlnbgorCisJLnNlY3Rpb24gIi5wcm9jLmluZm8iLCAjYWxsb2MsICNleGVjaW5zdHIKKworCS50eXBlCV9fYXJtOTI2X3Byb2NfaW5mbywjb2JqZWN0CitfX2FybTkyNl9wcm9jX2luZm86CisJLmxvbmcJMHg0MTA2OTI2MAkJCUAgQVJNOTI2RUotUyAodjVURUopCisJLmxvbmcJMHhmZjBmZmZmMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfQklUNCB8IFwKKwkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQKKwliCV9fYXJtOTI2X3NldHVwCisJLmxvbmcJY3B1X2FyY2hfbmFtZQorCS5sb25nCWNwdV9lbGZfbmFtZQorCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQfEhXQ0FQX0pBVkEKKwkubG9uZwljcHVfYXJtOTI2X25hbWUKKwkubG9uZwlhcm05MjZfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl2NHdiX3VzZXJfZm5zCisJLmxvbmcJYXJtOTI2X2NhY2hlX2ZucworCS5zaXplCV9fYXJtOTI2X3Byb2NfaW5mbywgLiAtIF9fYXJtOTI2X3Byb2NfaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzN2ZlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFdlIG5lZWQgY29uc3RhbnRzLmggZm9yOgorICogIFZNQV9WTV9NTQorICogIFZNQV9WTV9GTEFHUworICogIFZNX0VYRUMKKyAqLworI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKworLyoKKyAqIHZtYV92bV9tbSAtIGdldCBtbSBwb2ludGVyIGZyb20gdm1hIHBvaW50ZXIgKHZtYS0+dm1fbW0pCisgKi8KKwkubWFjcm8Jdm1hX3ZtX21tLCByZCwgcm4KKwlsZHIJXHJkLCBbXHJuLCAjVk1BX1ZNX01NXQorCS5lbmRtCisKKy8qCisgKiB2bWFfdm1fZmxhZ3MgLSBnZXQgdm1hLT52bV9mbGFncworICovCisJLm1hY3JvCXZtYV92bV9mbGFncywgcmQsIHJuCisJbGRyCVxyZCwgW1xybiwgI1ZNQV9WTV9GTEFHU10KKwkuZW5kbQorCisJLm1hY3JvCXRza19tbSwgcmQsIHJuCisJbGRyCVxyZCwgW1xybiwgI1RJX1RBU0tdCisJbGRyCVxyZCwgW1xyZCwgI1RTS19BQ1RJVkVfTU1dCisJLmVuZG0KKworLyoKKyAqIGFjdF9tbSAtIGdldCBjdXJyZW50LT5hY3RpdmVfbW0KKyAqLworCS5tYWNybwlhY3RfbW0sIHJkCisJYmljCVxyZCwgc3AsICM4MTI4CisJYmljCVxyZCwgXHJkLCAjNjMKKwlsZHIJXHJkLCBbXHJkLCAjVElfVEFTS10KKwlsZHIJXHJkLCBbXHJkLCAjVFNLX0FDVElWRV9NTV0KKwkuZW5kbQorCisvKgorICogbW1pZCAtIGdldCBjb250ZXh0IGlkIGZyb20gbW0gcG9pbnRlciAobW0tPmNvbnRleHQuaWQpCisgKi8KKwkubWFjcm8JbW1pZCwgcmQsIHJuCisJbGRyCVxyZCwgW1xybiwgI01NX0NPTlRFWFRfSURdCisJLmVuZG0KKworLyoKKyAqIG1hc2tfYXNpZCAtIG1hc2sgdGhlIEFTSUQgZnJvbSB0aGUgY29udGV4dCBJRAorICovCisJLm1hY3JvCWFzaWQsIHJkLCBybgorCWFuZAlccmQsIFxybiwgIzI1NQorCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwY2FlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgTU1VIGZ1bmN0aW9ucyBmb3IgU0ExMTAKKyAqCisgKiAgVGhlc2UgYXJlIHRoZSBsb3cgbGV2ZWwgYXNzZW1ibGVyIGZvciBwZXJmb3JtaW5nIGNhY2hlIGFuZCBUTEIKKyAqICBmdW5jdGlvbnMgb24gdGhlIFN0cm9uZ0FSTS0xMTAuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKKy8qCisgKiB0aGUgY2FjaGUgbGluZSBzaXplIG9mIHRoZSBJIGFuZCBEIGNhY2hlCisgKi8KKyNkZWZpbmUgRENBQ0hFTElORVNJWkUJMzIKKyNkZWZpbmUgRkxVU0hfT0ZGU0VUCTMyNzY4CisKKwkubWFjcm8gZmx1c2hfMTEwX2RjYWNoZQlyZCwgcmEsIHJlCisJbGRyCVxyZCwgPWZsdXNoX2Jhc2UKKwlsZHIJXHJhLCBbXHJkXQorCWVvcglccmEsIFxyYSwgI0ZMVVNIX09GRlNFVAorCXN0cglccmEsIFtccmRdCisJYWRkCVxyZSwgXHJhLCAjMTYzODQJCUAgb25seSBuZWNlc3NhcnkgZm9yIDE2aworMTAwMToJbGRyCVxyZCwgW1xyYV0sICNEQ0FDSEVMSU5FU0laRQorCXRlcQlccmUsIFxyYQorCWJuZQkxMDAxYgorCS5lbmRtCisKKwkuZGF0YQorZmx1c2hfYmFzZToKKwkubG9uZwlGTFVTSF9CQVNFCisJLnRleHQKKworLyoKKyAqIGNwdV9zYTExMF9wcm9jX2luaXQoKQorICovCitFTlRSWShjcHVfc2ExMTBfcHJvY19pbml0KQorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMSwgMgkJQCBFbmFibGUgY2xvY2sgc3dpdGNoaW5nCisJbW92CXBjLCBscgorCisvKgorICogY3B1X3NhMTEwX3Byb2NfZmluKCkKKyAqLworRU5UUlkoY3B1X3NhMTEwX3Byb2NfZmluKQorCXN0bWZkCXNwISwge2xyfQorCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCisJbXNyCWNwc3JfYywgaXAKKwlibAl2NHdiX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCUAgY2xlYW4gY2FjaGVzCisxOgltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzIsIDIJCUAgRGlzYWJsZSBjbG9jayBzd2l0Y2hpbmcKKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwliaWMJcjAsIHIwLCAjMHgxMDAwCQkJQCAuLi5pLi4uLi4uLi4uLi4uCisJYmljCXIwLCByMCwgIzB4MDAwZQkJCUAgLi4uLi4uLi4uLi4ud2NhLgorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKKwlsZG1mZAlzcCEsIHtwY30KKworLyoKKyAqIGNwdV9zYTExMF9yZXNldChsb2MpCisgKgorICogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIHN5c3RlbS4gIFB1dCB0aGUgQ1BVIGludG8gdGhlCisgKiBzYW1lIHN0YXRlIGFzIGl0IHdvdWxkIGJlIGlmIGl0IGhhZCBiZWVuIHJlc2V0LCBhbmQgYnJhbmNoCisgKiB0byB3aGF0IHdvdWxkIGJlIHRoZSByZXNldCB2ZWN0b3IuCisgKgorICogbG9jOiBsb2NhdGlvbiB0byBqdW1wIHRvIGZvciBzb2Z0IHJlc2V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X3NhMTEwX3Jlc2V0KQorCW1vdglpcCwgIzAKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM3LCAwCQlAIGludmFsaWRhdGUgSSxEIGNhY2hlcworCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltcmMJcDE1LCAwLCBpcCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwliaWMJaXAsIGlwLCAjMHgwMDBmCQkJQCAuLi4uLi4uLi4uLi53Y2FtCisJYmljCWlwLCBpcCwgIzB4MTEwMAkJCUAgLi4uaS4uLnMuLi4uLi4uLgorCW1jcglwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCW1vdglwYywgcjAKKworLyoKKyAqIGNwdV9zYTExMF9kb19pZGxlKHR5cGUpCisgKgorICogQ2F1c2UgdGhlIHByb2Nlc3NvciB0byBpZGxlCisgKgorICogdHlwZTogY2FsbCB0eXBlOgorICogICAwID0gc2xvdyBpZGxlCisgKiAgIDEgPSBmYXN0IGlkbGUKKyAqICAgMiA9IHN3aXRjaCB0byBzbG93IHByb2Nlc3NvciBjbG9jaworICogICAzID0gc3dpdGNoIHRvIGZhc3QgcHJvY2Vzc29yIGNsb2NrCisgKi8KKwkuYWxpZ24JNQorCitFTlRSWShjcHVfc2ExMTBfZG9faWRsZSkKKwltY3IJcDE1LCAwLCBpcCwgYzE1LCBjMiwgMgkJQCBkaXNhYmxlIGNsb2NrIHN3aXRjaGluZworCWxkcglyMSwgPVVOQ0FDSEVBQkxFX0FERFIJCUAgbG9hZCBmcm9tIHVuY2FjaGVhYmxlIGxvYworCWxkcglyMSwgW3IxLCAjMF0JCQlAIGZvcmNlIHN3aXRjaCB0byBNQ0xLCisJbW92CXIwLCByMAkJCQlAIHNhZmV0eQorCW1vdglyMCwgcjAJCQkJQCBzYWZldHkKKwltb3YJcjAsIHIwCQkJCUAgc2FmZXR5CisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzgsIDIJCUAgV2FpdCBmb3IgaW50ZXJydXB0LCBjYWNoZSBhbGlnbmVkCisJbW92CXIwLCByMAkJCQlAIHNhZmV0eQorCW1vdglyMCwgcjAJCQkJQCBzYWZldHkKKwltb3YJcjAsIHIwCQkJCUAgc2FmZXR5CisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzEsIDIJCUAgZW5hYmxlIGNsb2NrIHN3aXRjaGluZworCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENBQ0hFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBjcHVfc2ExMTBfZGNhY2hlX2NsZWFuX2FyZWEoYWRkcixzeikKKyAqCisgKiBDbGVhbiB0aGUgc3BlY2lmaWVkIGVudHJ5IG9mIGFueSBjYWNoZXMgc3VjaCB0aGF0IHRoZSBNTVUKKyAqIHRyYW5zbGF0aW9uIGZldGNoZXMgd2lsbCBvYnRhaW4gY29ycmVjdCBkYXRhLgorICoKKyAqIGFkZHI6IGNhY2hlLXVuYWxpZ25lZCB2aXJ0dWFsIGFkZHJlc3MKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfc2ExMTBfZGNhY2hlX2NsZWFuX2FyZWEpCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0RDQUNIRUxJTkVTSVpFCisJc3VicwlyMSwgcjEsICNEQ0FDSEVMSU5FU0laRQorCWJoaQkxYgorCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQYWdlVGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBjcHVfc2ExMTBfc3dpdGNoX21tKHBnZCkKKyAqCisgKiBTZXQgdGhlIHRyYW5zbGF0aW9uIGJhc2UgcG9pbnRlciB0byBiZSBhcyBkZXNjcmliZWQgYnkgcGdkLgorICoKKyAqIHBnZDogbmV3IHBhZ2UgdGFibGVzCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X3NhMTEwX3N3aXRjaF9tbSkKKwlmbHVzaF8xMTBfZGNhY2hlCXIzLCBpcCwgcjEKKwltb3YJcjEsICMwCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKwltY3IJcDE1LCAwLCByMSwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1jcglwMTUsIDAsIHIwLCBjMiwgYzAsIDAJCUAgbG9hZCBwYWdlIHRhYmxlIHBvaW50ZXIKKwltY3IJcDE1LCAwLCByMSwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSAmIEQgVExCcworCW1vdglwYywgbHIKKworLyoKKyAqIGNwdV9zYTExMF9zZXRfcHRlKHB0ZXAsIHB0ZSkKKyAqCisgKiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dAorICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV9zYTExMF9zZXRfcHRlKQorCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKKwliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSworCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAorCisJdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KKwlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVworCisJdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KKwlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVworCisJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/CisJbW92bmUJcjIsICMwCisKKwlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwltb3YJcjAsIHIwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisJX19JTklUCisKKwkudHlwZQlfX3NhMTEwX3NldHVwLCAjZnVuY3Rpb24KK19fc2ExMTBfc2V0dXA6CisJbW92CXIxMCwgIzAKKwltY3IJcDE1LCAwLCByMTAsIGM3LCBjNwkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMgb24gdjQKKwltY3IJcDE1LCAwLCByMTAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyIG9uIHY0CisJbWNyCXAxNSwgMCwgcjEwLCBjOCwgYzcJCUAgaW52YWxpZGF0ZSBJLEQgVExCcyBvbiB2NAorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAJCUAgZ2V0IGNvbnRyb2wgcmVnaXN0ZXIgdjQKKwlsZHIJcjUsIHNhMTEwX2NyMV9jbGVhcgorCWJpYwlyMCwgcjAsIHI1CisJbGRyCXI1LCBzYTExMF9jcjFfc2V0CisJb3JyCXIwLCByMCwgcjUKKwltb3YJcGMsIGxyCisJLnNpemUJX19zYTExMF9zZXR1cCwgLiAtIF9fc2ExMTBfc2V0dXAKKworCS8qCisJICogIFIKKwkgKiAuUlZJIFpGUlMgQkxEUCBXQ0FNCisJICogLi4wMSAwMDAxIC4uMTEgMTEwMQorCSAqIAorCSAqLworCS50eXBlCXNhMTEwX2NyMV9jbGVhciwgI29iamVjdAorCS50eXBlCXNhMTEwX2NyMV9zZXQsICNvYmplY3QKK3NhMTEwX2NyMV9jbGVhcjoKKwkud29yZAkweDNmM2YKK3NhMTEwX2NyMV9zZXQ6CisJLndvcmQJMHgxMTNkCisKKwlfX0lOSVREQVRBCisKKy8qCisgKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCisgKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQorICovCisKKwkudHlwZQlzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CitFTlRSWShzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zKQorCS53b3JkCXY0X2Vhcmx5X2Fib3J0CisJLndvcmQJY3B1X3NhMTEwX3Byb2NfaW5pdAorCS53b3JkCWNwdV9zYTExMF9wcm9jX2ZpbgorCS53b3JkCWNwdV9zYTExMF9yZXNldAorCS53b3JkCWNwdV9zYTExMF9kb19pZGxlCisJLndvcmQJY3B1X3NhMTEwX2RjYWNoZV9jbGVhbl9hcmVhCisJLndvcmQJY3B1X3NhMTEwX3N3aXRjaF9tbQorCS53b3JkCWNwdV9zYTExMF9zZXRfcHRlCisJLnNpemUJc2ExMTBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIHNhMTEwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKworCS5zZWN0aW9uICIucm9kYXRhIgorCisJLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAorY3B1X2FyY2hfbmFtZToKKwkuYXNjaXoJImFybXY0IgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY0IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1X3NhMTEwX25hbWUsICNvYmplY3QKK2NwdV9zYTExMF9uYW1lOgorCS5hc2NpegkiU3Ryb25nQVJNLTExMCIKKwkuc2l6ZQljcHVfc2ExMTBfbmFtZSwgLiAtIGNwdV9zYTExMF9uYW1lCisKKwkuYWxpZ24KKworCS5zZWN0aW9uICIucHJvYy5pbmZvIiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKwkudHlwZQlfX3NhMTEwX3Byb2NfaW5mbywjb2JqZWN0CitfX3NhMTEwX3Byb2NfaW5mbzoKKwkubG9uZwkweDQ0MDFhMTAwCisJLmxvbmcJMHhmZmZmZmZmMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX19zYTExMF9zZXR1cAorCS5sb25nCWNwdV9hcmNoX25hbWUKKwkubG9uZwljcHVfZWxmX25hbWUKKwkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfMjZCSVQgfCBIV0NBUF9GQVNUX01VTFQKKwkubG9uZwljcHVfc2ExMTBfbmFtZQorCS5sb25nCXNhMTEwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiX3RsYl9mbnMKKwkubG9uZwl2NHdiX3VzZXJfZm5zCisJLmxvbmcJdjR3Yl9jYWNoZV9mbnMKKwkuc2l6ZQlfX3NhMTEwX3Byb2NfaW5mbywgLiAtIF9fc2ExMTBfcHJvY19pbmZvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ3Y2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIE1NVSBmdW5jdGlvbnMgZm9yIFNBMTEwCisgKgorICogIFRoZXNlIGFyZSB0aGUgbG93IGxldmVsIGFzc2VtYmxlciBmb3IgcGVyZm9ybWluZyBjYWNoZSBhbmQgVExCCisgKiAgZnVuY3Rpb25zIG9uIHRoZSBTdHJvbmdBUk0tMTEwMCBhbmQgU3Ryb25nQVJNLTExMTAuCisgKgorICogIE5vdGUgdGhhdCBTQTExMDAgYW5kIFNBMTExMCBzaGFyZSBldmVyeXRoaW5nIGJ1dCB0aGVpciBuYW1lIGFuZCBDUFUgSUQuCisgKgorICogIDEyLWp1bi0yMDAwLCBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpOgorICogICAgRmx1c2ggdGhlIHJlYWQgYnVmZmVyIGF0IGNvbnRleHQgc3dpdGNoZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKgorICogdGhlIGNhY2hlIGxpbmUgc2l6ZSBvZiB0aGUgSSBhbmQgRCBjYWNoZQorICovCisjZGVmaW5lIERDQUNIRUxJTkVTSVpFCTMyCisjZGVmaW5lIEZMVVNIX09GRlNFVAkzMjc2OAorCisJLm1hY3JvIGZsdXNoXzExMDBfZGNhY2hlIHJkLCByYSwgcmUKKwlsZHIJXHJkLCA9Zmx1c2hfYmFzZQorCWxkcglccmEsIFtccmRdCisJZW9yCVxyYSwgXHJhLCAjRkxVU0hfT0ZGU0VUCisJc3RyCVxyYSwgW1xyZF0KKwlhZGQJXHJlLCBccmEsICM4MTkyCQkJQCBvbmx5IG5lY2Vzc2FyeSBmb3IgOGsKKzEwMDE6CWxkcglccmQsIFtccmFdLCAjRENBQ0hFTElORVNJWkUKKwl0ZXEJXHJlLCBccmEKKwlibmUJMTAwMWIKKyNpZmRlZiBGTFVTSF9CQVNFX01JTklDQUNIRQorCWFkZAlccmEsIFxyYSwgI0ZMVVNIX0JBU0VfTUlOSUNBQ0hFIC0gRkxVU0hfQkFTRQorCWFkZAlccmUsIFxyYSwgIzUxMgkJCUAgb25seSA1MTIgYnl0ZXMKKzEwMDI6CWxkcglccmQsIFtccmFdLCAjRENBQ0hFTElORVNJWkUKKwl0ZXEJXHJlLCBccmEKKwlibmUJMTAwMmIKKyNlbmRpZgorCS5lbmRtCisKKwkuZGF0YQorZmx1c2hfYmFzZToKKwkubG9uZwlGTFVTSF9CQVNFCisJLnRleHQKKworCV9fSU5JVAorCisvKgorICogY3B1X3NhMTEwMF9wcm9jX2luaXQoKQorICovCitFTlRSWShjcHVfc2ExMTAwX3Byb2NfaW5pdCkKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzEsIDIJCUAgRW5hYmxlIGNsb2NrIHN3aXRjaGluZworCW1jcglwMTUsIDAsIHIwLCBjOSwgYzAsIDUJCUAgQWxsb3cgcmVhZC1idWZmZXIgb3BlcmF0aW9ucyBmcm9tIHVzZXJsYW5kCisJbW92CXBjLCBscgorCisJLnByZXZpb3VzCisKKy8qCisgKiBjcHVfc2ExMTAwX3Byb2NfZmluKCkKKyAqCisgKiBQcmVwYXJlIHRoZSBDUFUgZm9yIHJlc2V0OgorICogIC0gRGlzYWJsZSBpbnRlcnJ1cHRzCisgKiAgLSBDbGVhbiBhbmQgdHVybiBvZmYgY2FjaGVzLgorICovCitFTlRSWShjcHVfc2ExMTAwX3Byb2NfZmluKQorCXN0bWZkCXNwISwge2xyfQorCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCisJbXNyCWNwc3JfYywgaXAKKwlmbHVzaF8xMTAwX2RjYWNoZSByMCwgcjEsIHIyCQlAIGNsZWFuIGNhY2hlcworCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMiwgMgkJQCBEaXNhYmxlIGNsb2NrIHN3aXRjaGluZworCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlyMCwgcjAsICMweDEwMDAJCQlAIC4uLmkuLi4uLi4uLi4uLi4KKwliaWMJcjAsIHIwLCAjMHgwMDBlCQkJQCAuLi4uLi4uLi4uLi53Y2EuCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcworCWxkbWZkCXNwISwge3BjfQorCisvKgorICogY3B1X3NhMTEwMF9yZXNldChsb2MpCisgKgorICogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIHN5c3RlbS4gIFB1dCB0aGUgQ1BVIGludG8gdGhlCisgKiBzYW1lIHN0YXRlIGFzIGl0IHdvdWxkIGJlIGlmIGl0IGhhZCBiZWVuIHJlc2V0LCBhbmQgYnJhbmNoCisgKiB0byB3aGF0IHdvdWxkIGJlIHRoZSByZXNldCB2ZWN0b3IuCisgKgorICogbG9jOiBsb2NhdGlvbiB0byBqdW1wIHRvIGZvciBzb2Z0IHJlc2V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X3NhMTEwMF9yZXNldCkKKwltb3YJaXAsICMwCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNywgMAkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCisJbXJjCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCWlwLCBpcCwgIzB4MDAwZgkJCUAgLi4uLi4uLi4uLi4ud2NhbQorCWJpYwlpcCwgaXAsICMweDExMDAJCQlAIC4uLmkuLi5zLi4uLi4uLi4KKwltY3IJcDE1LCAwLCBpcCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwltb3YJcGMsIHIwCisKKy8qCisgKiBjcHVfc2ExMTAwX2RvX2lkbGUodHlwZSkKKyAqCisgKiBDYXVzZSB0aGUgcHJvY2Vzc29yIHRvIGlkbGUKKyAqCisgKiB0eXBlOiBjYWxsIHR5cGU6CisgKiAgIDAgPSBzbG93IGlkbGUKKyAqICAgMSA9IGZhc3QgaWRsZQorICogICAyID0gc3dpdGNoIHRvIHNsb3cgcHJvY2Vzc29yIGNsb2NrCisgKiAgIDMgPSBzd2l0Y2ggdG8gZmFzdCBwcm9jZXNzb3IgY2xvY2sKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfc2ExMTAwX2RvX2lkbGUpCisJbW92CXIwLCByMAkJCQlAIDQgbm9wIHBhZGRpbmcKKwltb3YJcjAsIHIwCisJbW92CXIwLCByMAorCW1vdglyMCwgcjAJCQkJQCA0IG5vcCBwYWRkaW5nCisJbW92CXIwLCByMAorCW1vdglyMCwgcjAKKwltb3YJcjAsICMwCisJbGRyCXIxLCA9VU5DQUNIRUFCTEVfQUREUgkJQCBwdHIgdG8gdW5jYWNoZWFibGUgYWRkcmVzcworCUAgLS0tIGFsaWduZWQgdG8gYSBjYWNoZSBsaW5lCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzIsIDIJCUAgZGlzYWJsZSBjbG9jayBzd2l0Y2hpbmcKKwlsZHIJcjEsIFtyMSwgIzBdCQkJQCBmb3JjZSBzd2l0Y2ggdG8gTUNMSworCW1jcglwMTUsIDAsIHIwLCBjMTUsIGM4LCAyCQlAIHdhaXQgZm9yIGludGVycnVwdAorCW1vdglyMCwgcjAJCQkJQCBzYWZldHkKKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMSwgMgkJQCBlbmFibGUgY2xvY2sgc3dpdGNoaW5nCisJbW92CXBjLCBscgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ0FDSEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAqIGNwdV9zYTExMDBfZGNhY2hlX2NsZWFuX2FyZWEoYWRkcixzeikKKyAqCisgKiBDbGVhbiB0aGUgc3BlY2lmaWVkIGVudHJ5IG9mIGFueSBjYWNoZXMgc3VjaCB0aGF0IHRoZSBNTVUKKyAqIHRyYW5zbGF0aW9uIGZldGNoZXMgd2lsbCBvYnRhaW4gY29ycmVjdCBkYXRhLgorICoKKyAqIGFkZHI6IGNhY2hlLXVuYWxpZ25lZCB2aXJ0dWFsIGFkZHJlc3MKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfc2ExMTAwX2RjYWNoZV9jbGVhbl9hcmVhKQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCWFkZAlyMCwgcjAsICNEQ0FDSEVMSU5FU0laRQorCXN1YnMJcjEsIHIxLCAjRENBQ0hFTElORVNJWkUKKwliaGkJMWIKKwltb3YJcGMsIGxyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFnZVRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogY3B1X3NhMTEwMF9zd2l0Y2hfbW0ocGdkKQorICoKKyAqIFNldCB0aGUgdHJhbnNsYXRpb24gYmFzZSBwb2ludGVyIHRvIGJlIGFzIGRlc2NyaWJlZCBieSBwZ2QuCisgKgorICogcGdkOiBuZXcgcGFnZSB0YWJsZXMKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfc2ExMTAwX3N3aXRjaF9tbSkKKwlmbHVzaF8xMTAwX2RjYWNoZSByMywgaXAsIHIxCisJbW92CWlwLCAjMAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisJbWNyCXAxNSwgMCwgaXAsIGM5LCBjMCwgMAkJQCBpbnZhbGlkYXRlIFJCCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltb3YJcGMsIGxyCisKKy8qCisgKiBjcHVfc2ExMTAwX3NldF9wdGUocHRlcCwgcHRlKQorICoKKyAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CisgKi8KKwkuYWxpZ24JNQorRU5UUlkoY3B1X3NhMTEwMF9zZXRfcHRlKQorCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKKwliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSworCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAorCisJdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KKwlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVworCisJdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KKwlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVworCisJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/CisJbW92bmUJcjIsICMwCisKKwlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwltb3YJcjAsIHIwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJbW92CXBjLCBscgorCisJX19JTklUCisKKwkudHlwZQlfX3NhMTEwMF9zZXR1cCwgI2Z1bmN0aW9uCitfX3NhMTEwMF9zZXR1cDoKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNwkJQCBpbnZhbGlkYXRlIEksRCBjYWNoZXMgb24gdjQKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiB3cml0ZSBidWZmZXIgb24gdjQKKwltY3IJcDE1LCAwLCByMCwgYzgsIGM3CQlAIGludmFsaWRhdGUgSSxEIFRMQnMgb24gdjQKKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwCQlAIGdldCBjb250cm9sIHJlZ2lzdGVyIHY0CisJbGRyCXI1LCBzYTExMDBfY3IxX2NsZWFyCisJYmljCXIwLCByMCwgcjUKKwlsZHIJcjUsIHNhMTEwMF9jcjFfc2V0CisJb3JyCXIwLCByMCwgcjUKKwltb3YJcGMsIGxyCisJLnNpemUJX19zYTExMDBfc2V0dXAsIC4gLSBfX3NhMTEwMF9zZXR1cAorCisJLyoKKwkgKiAgUgorCSAqIC5SVkkgWkZSUyBCTERQIFdDQU0KKwkgKiAuLjExIDAwMDEgLi4xMSAxMTAxCisJICogCisJICovCisJLnR5cGUJc2ExMTAwX2NyMV9jbGVhciwgI29iamVjdAorCS50eXBlCXNhMTEwMF9jcjFfc2V0LCAjb2JqZWN0CitzYTExMDBfY3IxX2NsZWFyOgorCS53b3JkCTB4M2YzZgorc2ExMTAwX2NyMV9zZXQ6CisJLndvcmQJMHgzMTNkCisKKwlfX0lOSVREQVRBCisKKy8qCisgKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCisgKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQorICovCisKKy8qCisgKiBTQTExMDAgYW5kIFNBMTExMCBzaGFyZSB0aGUgc2FtZSBmdW5jdGlvbiBjYWxscworICovCisJLnR5cGUJc2ExMTAwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKK0VOVFJZKHNhMTEwMF9wcm9jZXNzb3JfZnVuY3Rpb25zKQorCS53b3JkCXY0X2Vhcmx5X2Fib3J0CisJLndvcmQJY3B1X3NhMTEwMF9wcm9jX2luaXQKKwkud29yZAljcHVfc2ExMTAwX3Byb2NfZmluCisJLndvcmQJY3B1X3NhMTEwMF9yZXNldAorCS53b3JkCWNwdV9zYTExMDBfZG9faWRsZQorCS53b3JkCWNwdV9zYTExMDBfZGNhY2hlX2NsZWFuX2FyZWEKKwkud29yZAljcHVfc2ExMTAwX3N3aXRjaF9tbQorCS53b3JkCWNwdV9zYTExMDBfc2V0X3B0ZQorCS5zaXplCXNhMTEwMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gc2ExMTAwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKworCS5zZWN0aW9uICIucm9kYXRhIgorCisJLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAorY3B1X2FyY2hfbmFtZToKKwkuYXNjaXoJImFybXY0IgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY0IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1X3NhMTEwMF9uYW1lLCAjb2JqZWN0CitjcHVfc2ExMTAwX25hbWU6CisJLmFzY2l6CSJTdHJvbmdBUk0tMTEwMCIKKwkuc2l6ZQljcHVfc2ExMTAwX25hbWUsIC4gLSBjcHVfc2ExMTAwX25hbWUKKworCS50eXBlCWNwdV9zYTExMTBfbmFtZSwgI29iamVjdAorY3B1X3NhMTExMF9uYW1lOgorCS5hc2NpegkiU3Ryb25nQVJNLTExMTAiCisJLnNpemUJY3B1X3NhMTExMF9uYW1lLCAuIC0gY3B1X3NhMTExMF9uYW1lCisKKwkuYWxpZ24KKworCS5zZWN0aW9uICIucHJvYy5pbmZvIiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKwkudHlwZQlfX3NhMTEwMF9wcm9jX2luZm8sI29iamVjdAorX19zYTExMDBfcHJvY19pbmZvOgorCS5sb25nCTB4NDQwMWExMTAKKwkubG9uZwkweGZmZmZmZmYwCisJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAorCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAorCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCisJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAorCQlQTURfU0VDVF9BUF9SRUFECisJYglfX3NhMTEwMF9zZXR1cAorCS5sb25nCWNwdV9hcmNoX25hbWUKKwkubG9uZwljcHVfZWxmX25hbWUKKwkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfMjZCSVQgfCBIV0NBUF9GQVNUX01VTFQKKwkubG9uZwljcHVfc2ExMTAwX25hbWUKKwkubG9uZwlzYTExMDBfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JfdGxiX2ZucworCS5sb25nCXY0X21jX3VzZXJfZm5zCisJLmxvbmcJdjR3Yl9jYWNoZV9mbnMKKwkuc2l6ZQlfX3NhMTEwMF9wcm9jX2luZm8sIC4gLSBfX3NhMTEwMF9wcm9jX2luZm8KKworCS50eXBlCV9fc2ExMTEwX3Byb2NfaW5mbywjb2JqZWN0CitfX3NhMTExMF9wcm9jX2luZm86CisJLmxvbmcJMHg2OTAxYjExMAorCS5sb25nCTB4ZmZmZmZmZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCisJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQKKwliCV9fc2ExMTAwX3NldHVwCisJLmxvbmcJY3B1X2FyY2hfbmFtZQorCS5sb25nCWNwdV9lbGZfbmFtZQorCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF8yNkJJVCB8IEhXQ0FQX0ZBU1RfTVVMVAorCS5sb25nCWNwdV9zYTExMTBfbmFtZQorCS5sb25nCXNhMTEwMF9wcm9jZXNzb3JfZnVuY3Rpb25zCisJLmxvbmcJdjR3Yl90bGJfZm5zCisJLmxvbmcJdjRfbWNfdXNlcl9mbnMKKwkubG9uZwl2NHdiX2NhY2hlX2ZucworCS5zaXplCV9fc2ExMTEwX3Byb2NfaW5mbywgLiAtIF9fc2ExMTEwX3Byb2NfaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zeW1zLmMgYi9hcmNoL2FybS9tbS9wcm9jLXN5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVmMGZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zeW1zLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9wcm9jLXN5bXMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKyNpZm5kZWYgTVVMVElfQ1BVCitFWFBPUlRfU1lNQk9MKGNwdV9kY2FjaGVfY2xlYW5fYXJlYSk7CitFWFBPUlRfU1lNQk9MKGNwdV9zZXRfcHRlKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MKHByb2Nlc3Nvcik7CisjZW5kaWYKKworI2lmbmRlZiBNVUxUSV9DQUNIRQorRVhQT1JUX1NZTUJPTChfX2NwdWNfZmx1c2hfa2Vybl9hbGwpOworRVhQT1JUX1NZTUJPTChfX2NwdWNfZmx1c2hfdXNlcl9hbGwpOworRVhQT1JUX1NZTUJPTChfX2NwdWNfZmx1c2hfdXNlcl9yYW5nZSk7CitFWFBPUlRfU1lNQk9MKF9fY3B1Y19jb2hlcmVudF9rZXJuX3JhbmdlKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MKGNwdV9jYWNoZSk7CisjZW5kaWYKKworLyoKKyAqIE5vIG1vZHVsZSBzaG91bGQgbmVlZCB0byB0b3VjaCB0aGUgVExCIChhbmQgY3VycmVudGx5CisgKiBubyBtb2R1bGVzIGRvLiAgV2UgZXhwb3J0IHRoaXMgZm9yICJsb2Fka2VybmVsIiBzdXBwb3J0CisgKiAoYm9vdGluZyBhIG5ldyBrZXJuZWwgZnJvbSB3aXRoaW4gYSBydW5uaW5nIGtlcm5lbC4pCisgKi8KKyNpZmRlZiBNVUxUSV9UTEIKK0VYUE9SVF9TWU1CT0woY3B1X3RsYik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE3M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL3Byb2MtdjYuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBpcyB0aGUgInNoZWxsIiBvZiB0aGUgQVJNdjYgcHJvY2Vzc29yIHN1cHBvcnQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKKworI2RlZmluZSBEX0NBQ0hFX0xJTkVfU0laRQkzMgorCisJLm1hY3JvCWNwc2llLCBmbGFncworCS5pZmMgXGZsYWdzLCBmCisJLmxvbmcJMHhmMTA4MDA0MAorCS5leGl0bQorCS5lbmRpZgorCS5pZmMgXGZsYWdzLCBpCisJLmxvbmcJMHhmMTA4MDA4MAorCS5leGl0bQorCS5lbmRpZgorCS5pZmMgXGZsYWdzLCBpZgorCS5sb25nCTB4ZjEwODAwYzAKKwkuZXhpdG0KKwkuZW5kaWYKKwkuZXJyCisJLmVuZG0KKworCS5tYWNybwljcHNpZCwgZmxhZ3MKKwkuaWZjIFxmbGFncywgZgorCS5sb25nCTB4ZjEwYzAwNDAKKwkuZXhpdG0KKwkuZW5kaWYKKwkuaWZjIFxmbGFncywgaQorCS5sb25nCTB4ZjEwYzAwODAKKwkuZXhpdG0KKwkuZW5kaWYKKwkuaWZjIFxmbGFncywgaWYKKwkubG9uZwkweGYxMGMwMGMwCisJLmV4aXRtCisJLmVuZGlmCisJLmVycgorCS5lbmRtCisKK0VOVFJZKGNwdV92Nl9wcm9jX2luaXQpCisJbW92CXBjLCBscgorCitFTlRSWShjcHVfdjZfcHJvY19maW4pCisJbW92CXBjLCBscgorCisvKgorICoJY3B1X3Y2X3Jlc2V0KGxvYykKKyAqCisgKglQZXJmb3JtIGEgc29mdCByZXNldCBvZiB0aGUgc3lzdGVtLiAgUHV0IHRoZSBDUFUgaW50byB0aGUKKyAqCXNhbWUgc3RhdGUgYXMgaXQgd291bGQgYmUgaWYgaXQgaGFkIGJlZW4gcmVzZXQsIGFuZCBicmFuY2gKKyAqCXRvIHdoYXQgd291bGQgYmUgdGhlIHJlc2V0IHZlY3Rvci4KKyAqCisgKgktIGxvYyAgIC0gbG9jYXRpb24gdG8ganVtcCB0byBmb3Igc29mdCByZXNldAorICoKKyAqCUl0IGlzIGFzc3VtZWQgdGhhdDoKKyAqLworCS5hbGlnbgk1CitFTlRSWShjcHVfdjZfcmVzZXQpCisJbW92CXBjLCByMAorCisvKgorICoJY3B1X3Y2X2RvX2lkbGUoKQorICoKKyAqCUlkbGUgdGhlIHByb2Nlc3NvciAoZWcsIHdhaXQgZm9yIGludGVycnVwdCkuCisgKgorICoJSVJRcyBhcmUgYWxyZWFkeSBkaXNhYmxlZC4KKyAqLworRU5UUlkoY3B1X3Y2X2RvX2lkbGUpCisJbWNyCXAxNSwgMCwgcjEsIGM3LCBjMCwgNAkJQCB3YWl0IGZvciBpbnRlcnJ1cHQKKwltb3YJcGMsIGxyCisKK0VOVFJZKGNwdV92Nl9kY2FjaGVfY2xlYW5fYXJlYSkKKyNpZm5kZWYgVExCX0NBTl9SRUFEX0ZST01fTDFfQ0FDSEUKKzE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjRF9DQUNIRV9MSU5FX1NJWkUKKwlzdWJzCXIxLCByMSwgI0RfQ0FDSEVfTElORV9TSVpFCisJYmhpCTFiCisjZW5kaWYKKwltb3YJcGMsIGxyCisKKy8qCisgKgljcHVfYXJtOTI2X3N3aXRjaF9tbShwZ2RfcGh5cywgdHNrKQorICoKKyAqCVNldCB0aGUgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBwb2ludGVyIHRvIGJlIHBnZF9waHlzCisgKgorICoJLSBwZ2RfcGh5cyAtIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbmV3IFRUQgorICoKKyAqCUl0IGlzIGFzc3VtZWQgdGhhdDoKKyAqCS0gd2UgYXJlIG5vdCB1c2luZyBzcGxpdCBwYWdlIHRhYmxlcworICovCitFTlRSWShjcHVfdjZfc3dpdGNoX21tKQorCW1vdglyMiwgIzAKKwlsZHIJcjEsIFtyMSwgI01NX0NPTlRFWFRfSURdCUAgZ2V0IG1tLT5jb250ZXh0LmlkCisJbWNyICAgICBwMTUsIDAsIHIyLCBjNywgYzUsIDYgICAgICAgICAgIEAgZmx1c2ggQlRBQy9CVEIKKwltY3IJcDE1LCAwLCByMiwgYzcsIGMxMCwgNAkJQCBkcmFpbiB3cml0ZSBidWZmZXIKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIHNldCBUVEIgMAorCW1jcglwMTUsIDAsIHIxLCBjMTMsIGMwLCAxCQlAIHNldCBjb250ZXh0IElECisJbW92CXBjLCBscgorCisjZGVmaW5lIG5HCSgxIDw8IDExKQorI2RlZmluZSBBUFgJKDEgPDwgOSkKKyNkZWZpbmUgQVAxCSgxIDw8IDUpCisjZGVmaW5lIEFQMAkoMSA8PCA0KQorI2RlZmluZSBYTgkoMSA8PCAwKQorCisvKgorICoJY3B1X3Y2X3NldF9wdGUocHRlcCwgcHRlKQorICoKKyAqCVNldCBhIGxldmVsIDIgdHJhbnNsYXRpb24gdGFibGUgZW50cnkuCisgKgorICoJLSBwdGVwICAtIHBvaW50ZXIgdG8gbGV2ZWwgMiB0cmFuc2xhdGlvbiB0YWJsZSBlbnRyeQorICoJCSAgKGhhcmR3YXJlIHZlcnNpb24gaXMgc3RvcmVkIGF0IC0xMDI0IGJ5dGVzKQorICoJLSBwdGUgICAtIFBURSB2YWx1ZSB0byBzdG9yZQorICoKKyAqCVBlcm1pc3Npb25zOgorICoJICBZVVdEICBBUFggQVAxIEFQMAlTVkMJVXNlcgorICoJICAweHh4ICAgMCAgIDAgICAwCW5vIGFjYwlubyBhY2MKKyAqCSAgMTAweCAgIDEgICAwICAgMQlyL28Jbm8gYWNjCisgKgkgIDEweDAgICAxICAgMCAgIDEJci9vCW5vIGFjYworICoJICAxMDExICAgMCAgIDAgICAxCXIvdwlubyBhY2MKKyAqCSAgMTEweCAgIDEgICAxICAgMAlyL28Jci9vCisgKgkgIDExeDAgICAxICAgMSAgIDAJci9vCXIvbworICoJICAxMTExICAgMCAgIDEgICAxCXIvdwlyL3cKKyAqLworRU5UUlkoY3B1X3Y2X3NldF9wdGUpCisJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgorCisJYmljCXIyLCByMSwgIzB4MDAwMDBmZjAKKwliaWMJcjIsIHIyLCAjMHgwMDAwMDAwMworCW9ycglyMiwgcjIsICNBUDAgfCAyCisKKwl0c3QJcjEsICNMX1BURV9XUklURQorCXRzdG5lCXIxLCAjTF9QVEVfRElSVFkKKwlvcnJlcQlyMiwgcjIsICNBUFgKKworCXRzdAlyMSwgI0xfUFRFX1VTRVIKKwlvcnJuZQlyMiwgcjIsICNBUDEgfCBuRworCXRzdG5lCXIyLCAjQVBYCisJZW9ybmUJcjIsIHIyLCAjQVAwCisKKwl0c3QJcjEsICNMX1BURV9ZT1VORworCWJpY2VxCXIyLCByMiwgI0FQWCB8IEFQMSB8IEFQMAorCitACXRzdAlyMSwgI0xfUFRFX0VYRUMKK0AJb3JyZXEJcjIsIHIyLCAjWE4KKworCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQKKwltb3ZlcQlyMiwgIzAKKworCXN0cglyMiwgW3IwXQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxIEAgZmx1c2hfcHRlCisJbW92CXBjLCBscgorCisKKworCitjcHVfdjZfbmFtZToKKwkuYXNjaXoJIlNvbWUgUmFuZG9tIFY2IFByb2Nlc3NvciIKKwkuYWxpZ24KKworCS5zZWN0aW9uICIudGV4dC5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKy8qCisgKglfX3Y2X3NldHVwCisgKgorICoJSW5pdGlhbGlzZSBUTEIsIENhY2hlcywgYW5kIE1NVSBzdGF0ZSByZWFkeSB0byBzd2l0Y2ggdGhlIE1NVQorICoJb24uICBSZXR1cm4gaW4gcjAgdGhlIG5ldyBDUDE1IEMxIGNvbnRyb2wgcmVnaXN0ZXIgc2V0dGluZy4KKyAqCisgKglXZSBhdXRvbWF0aWNhbGx5IGRldGVjdCBpZiB3ZSBoYXZlIGEgSGFydmFyZCBjYWNoZSwgYW5kIHVzZSB0aGUKKyAqCUhhcnZhcmQgY2FjaGUgY29udHJvbCBpbnN0cnVjdGlvbnMgaW5zZWFkIG9mIHRoZSB1bmlmaWVkIGNhY2hlCisgKgljb250cm9sIGluc3RydWN0aW9ucy4KKyAqCisgKglUaGlzIHNob3VsZCBiZSBhYmxlIHRvIGNvdmVyIGFsbCBBUk12NiBjb3Jlcy4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIGNhY2hlIHR5cGUgcmVnaXN0ZXIgaXMgaW1wbGVtZW50ZWQKKyAqLworX192Nl9zZXR1cDoKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDAJCUAgY2xlYW4raW52YWxpZGF0ZSBEIGNhY2hlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgY2FjaGUKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNSwgMAkJQCBjbGVhbitpbnZhbGlkYXRlIGNhY2hlCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gd3JpdGUgYnVmZmVyCisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgKyBEIFRMQnMKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAyCQlAIFRUQiBjb250cm9sIHJlZ2lzdGVyCisJbWNyCXAxNSwgMCwgcjQsIGMyLCBjMCwgMQkJQCBsb2FkIFRUQjEKKyNpZmRlZiBDT05GSUdfVkZQCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMgorCW9ycglyMCwgcjAsICMoMyA8PCAyMCkKKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAyCQlAIEVuYWJsZSBmdWxsIGFjY2VzcyB0byBWRlAKKyNlbmRpZgorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgcmVhZCBjb250cm9sIHJlZ2lzdGVyCisJbGRyCXI1LCB2Nl9jcjFfY2xlYXIJCUAgZ2V0IG1hc2sgZm9yIGJpdHMgdG8gY2xlYXIKKwliaWMJcjAsIHIwLCByNQkJCUAgY2xlYXIgYml0cyB0aGVtCisJbGRyCXI1LCB2Nl9jcjFfc2V0CQkJQCBnZXQgbWFzayBmb3IgYml0cyB0byBzZXQKKwlvcnIJcjAsIHIwLCByNQkJCUAgc2V0IHRoZW0KKwltb3YJcGMsIGxyCQkJCUAgcmV0dXJuIHRvIGhlYWQuUzpfX3JldAorCisJLyoKKwkgKiAgICAgICAgIFYgWCBGICAgSSBEIExSCisJICogLi4uLiAuLi5FIFBVSS4gLlQuVCA0UlZJIFpGUlMgQkxEUCBXQ0FNCisJICogcnJyciBycnJ4IHh4eDAgMDEwMSB4eHh4IHh4eHggeDExMSB4eHh4IDwgZm9yY2VkCisJICogICAgICAgICAwIDExMCAgICAgICAwMDExIDEuMDAgLjExMSAxMTAxIDwgd2Ugd2FudAorCSAqLworCS50eXBlCXY2X2NyMV9jbGVhciwgI29iamVjdAorCS50eXBlCXY2X2NyMV9zZXQsICNvYmplY3QKK3Y2X2NyMV9jbGVhcjoKKwkud29yZAkweDAxZTBmYjdmCit2Nl9jcjFfc2V0OgorCS53b3JkCTB4MDBjMDM4N2QKKworCS50eXBlCXY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKK0VOVFJZKHY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCisJLndvcmQJdjZfZWFybHlfYWJvcnQKKwkud29yZAljcHVfdjZfcHJvY19pbml0CisJLndvcmQJY3B1X3Y2X3Byb2NfZmluCisJLndvcmQJY3B1X3Y2X3Jlc2V0CisJLndvcmQJY3B1X3Y2X2RvX2lkbGUKKwkud29yZAljcHVfdjZfZGNhY2hlX2NsZWFuX2FyZWEKKwkud29yZAljcHVfdjZfc3dpdGNoX21tCisJLndvcmQJY3B1X3Y2X3NldF9wdGUKKwkuc2l6ZQl2Nl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gdjZfcHJvY2Vzc29yX2Z1bmN0aW9ucworCisJLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAorY3B1X2FyY2hfbmFtZToKKwkuYXNjaXoJImFybXY2IgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY2IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCS5hbGlnbgorCisJLnNlY3Rpb24gIi5wcm9jLmluZm8iLCAjYWxsb2MsICNleGVjaW5zdHIKKworCS8qCisJICogTWF0Y2ggYW55IEFSTXY2IHByb2Nlc3NvciBjb3JlLgorCSAqLworCS50eXBlCV9fdjZfcHJvY19pbmZvLCAjb2JqZWN0CitfX3Y2X3Byb2NfaW5mbzoKKwkubG9uZwkweDAwMDdiMDAwCisJLmxvbmcJMHgwMDA3ZjAwMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX192Nl9zZXR1cAorCS5sb25nCWNwdV9hcmNoX25hbWUKKwkubG9uZwljcHVfZWxmX25hbWUKKwkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfVkZQfEhXQ0FQX0VEU1B8SFdDQVBfSkFWQQorCS5sb25nCWNwdV92Nl9uYW1lCisJLmxvbmcJdjZfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY2d2JpX3RsYl9mbnMKKwkubG9uZwl2Nl91c2VyX2ZucworCS5sb25nCXY2X2NhY2hlX2ZucworCS5zaXplCV9fdjZfcHJvY19pbmZvLCAuIC0gX192Nl9wcm9jX2luZm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMgYi9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTc3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCkBAIC0wLDAgKzEsOTM0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKKyAqCisgKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiAgQ3JlYXRlZDoJTm92ZW1iZXIgMjAwMAorICogIENvcHlyaWdodDoJKEMpIDIwMDAsIDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNTVUgZnVuY3Rpb25zIGZvciB0aGUgSW50ZWwgWFNjYWxlIENQVXMKKyAqCisgKiAyMDAxIEF1ZyAyMToKKyAqCXNvbWUgY29udHJpYnV0aW9ucyBieSBCcmV0dCBHYWluZXMgPGJyZXR0LncuZ2FpbmVzQGludGVsLmNvbT4KKyAqCUNvcHlyaWdodCAyMDAxIGJ5IEludGVsIENvcnAuCisgKgorICogMjAwMSBTZXAgMDg6CisgKglDb21wbGV0ZWx5IHJldmlzaXRlZCwgbWFueSBpbXBvcnRhbnQgZml4ZXMKKyAqCU5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgorCisvKgorICogVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIG9mIGFuIGFyZWEgd2hpY2ggd2lsbCBiZSBmbHVzaGVkLiAgSWYgdGhlIGFyZWEKKyAqIGlzIGxhcmdlciB0aGFuIHRoaXMsIHRoZW4gd2UgZmx1c2ggdGhlIHdob2xlIGNhY2hlCisgKi8KKyNkZWZpbmUgTUFYX0FSRUFfU0laRQkzMjc2OAorCisvKgorICogdGhlIGNhY2hlIGxpbmUgc2l6ZSBvZiB0aGUgSSBhbmQgRCBjYWNoZQorICovCisjZGVmaW5lIENBQ0hFTElORVNJWkUJMzIKKworLyoKKyAqIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNhY2hlCisgKi8KKyNkZWZpbmUgQ0FDSEVTSVpFCTMyNzY4CisKKy8qCisgKiBWaXJ0dWFsIGFkZHJlc3MgdXNlZCB0byBhbGxvY2F0ZSB0aGUgY2FjaGUgd2hlbiBmbHVzaGVkCisgKgorICogVGhpcyBtdXN0IGJlIGFuIGFkZHJlc3MgcmFuZ2Ugd2hpY2ggaXMgX25ldmVyXyB1c2VkLiAgSXQgc2hvdWxkCisgKiBhcHBhcmVudGx5IGhhdmUgYSBtYXBwaW5nIGluIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2UgdGFibGUgZm9yCisgKiBjb21wYXRpYmlsaXR5IHdpdGggZnV0dXJlIENQVXMgdGhhdCBfY291bGRfIHJlcXVpcmUgaXQuICBGb3IgaW5zdGFuY2Ugd2UKKyAqIGRvbid0IGNhcmUuCisgKgorICogVGhpcyBtdXN0IGJlIGFsaWduZWQgb24gYSAyKkNBQ0hFU0laRSBib3VuZGFyeS4gIFRoZSBjb2RlIHNlbGVjdHMgb25lIG9mCisgKiB0aGUgMiBhcmVhcyBpbiBhbHRlcm5hbmNlIGVhY2ggdGltZSB0aGUgY2xlYW5fZF9jYWNoZSBtYWNybyBpcyB1c2VkLgorICogV2l0aG91dCB0aGlzIHRoZSBYU2NhbGUgY29yZSBleGhpYml0cyBjYWNoZSBldmljdGlvbiBwcm9ibGVtcyBhbmQgbm8gb25lCisgKiBrbm93cyB3aHkuCisgKgorICogUmVtaW5kZXI6IHRoZSB2ZWN0b3IgdGFibGUgaXMgbG9jYXRlZCBhdCAweGZmZmYwMDAwLTB4ZmZmZjBmZmYuCisgKi8KKyNkZWZpbmUgQ0xFQU5fQUREUgkweGZmZmUwMDAwCisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gd2FpdCBmb3IgYSBDUDE1IHdyaXRlIGFuZCBpcyBuZWVkZWQKKyAqIHdoZW4gd2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgbGFzdCBvcGVyYXRpb24gdG8gdGhlIGNvLXBybworICogd2FzIGNvbXBsZXRlZCBiZWZvcmUgY29udGludWluZyB3aXRoIG9wZXJhdGlvbi4KKyAqLworCS5tYWNybwljcHdhaXQsIHJkCisJbXJjCXAxNSwgMCwgXHJkLCBjMiwgYzAsIDAJCUAgYXJiaXRyYXJ5IHJlYWQgb2YgY3AxNQorCW1vdglccmQsIFxyZAkJCUAgd2FpdCBmb3IgY29tcGxldGlvbgorCXN1YiAJcGMsIHBjLCAjNAkJCUAgZmx1c2ggaW5zdHJ1Y3Rpb24gcGlwZWxpbmUKKwkuZW5kbQorCisJLm1hY3JvCWNwd2FpdF9yZXQsIGxyLCByZAorCW1yYwlwMTUsIDAsIFxyZCwgYzIsIGMwLCAwCQlAIGFyYml0cmFyeSByZWFkIG9mIGNwMTUKKwlzdWIJcGMsIFxsciwgXHJkLCBMU1IgIzMyCQlAIHdhaXQgZm9yIGNvbXBsZXRpb24gYW5kCisJCQkJCQlAIGZsdXNoIGluc3RydWN0aW9uIHBpcGVsaW5lCisJLmVuZG0KKworLyoKKyAqIFRoaXMgbWFjcm8gY2xlYW5zIHRoZSBlbnRpcmUgZGNhY2hlIHVzaW5nIGxpbmUgYWxsb2NhdGUuCisgKiBUaGUgbWFpbiBsb29wIGhhcyBiZWVuIHVucm9sbGVkIHRvIHJlZHVjZSBsb29wIG92ZXJoZWFkLgorICogcmQgYW5kIHJzIGFyZSB0d28gc2NyYXRjaCByZWdpc3RlcnMuCisgKi8KKwkubWFjcm8gIGNsZWFuX2RfY2FjaGUsIHJkLCBycworCWxkcglccnMsID1jbGVhbl9hZGRyCisJbGRyCVxyZCwgW1xyc10KKwllb3IJXHJkLCBccmQsICNDQUNIRVNJWkUKKwlzdHIJXHJkLCBbXHJzXQorCWFkZAlccnMsIFxyZCwgI0NBQ0hFU0laRQorMToJbWNyCXAxNSwgMCwgXHJkLCBjNywgYzIsIDUJCUAgYWxsb2NhdGUgRCBjYWNoZSBsaW5lCisJYWRkCVxyZCwgXHJkLCAjQ0FDSEVMSU5FU0laRQorCW1jcglwMTUsIDAsIFxyZCwgYzcsIGMyLCA1CQlAIGFsbG9jYXRlIEQgY2FjaGUgbGluZQorCWFkZAlccmQsIFxyZCwgI0NBQ0hFTElORVNJWkUKKwltY3IJcDE1LCAwLCBccmQsIGM3LCBjMiwgNQkJQCBhbGxvY2F0ZSBEIGNhY2hlIGxpbmUKKwlhZGQJXHJkLCBccmQsICNDQUNIRUxJTkVTSVpFCisJbWNyCXAxNSwgMCwgXHJkLCBjNywgYzIsIDUJCUAgYWxsb2NhdGUgRCBjYWNoZSBsaW5lCisJYWRkCVxyZCwgXHJkLCAjQ0FDSEVMSU5FU0laRQorCXRlcQlccmQsIFxycworCWJuZQkxYgorCS5lbmRtCisKKwkuZGF0YQorY2xlYW5fYWRkcjoJLndvcmQJQ0xFQU5fQUREUgorCisJLnRleHQKKworLyoKKyAqIGNwdV94c2NhbGVfcHJvY19pbml0KCkKKyAqCisgKiBOb3RoaW5nIHRvbyBleGNpdGluZyBhdCB0aGUgbW9tZW50CisgKi8KK0VOVFJZKGNwdV94c2NhbGVfcHJvY19pbml0KQorCW1vdglwYywgbHIKKworLyoKKyAqIGNwdV94c2NhbGVfcHJvY19maW4oKQorICovCitFTlRSWShjcHVfeHNjYWxlX3Byb2NfZmluKQorCXN0cglsciwgW3NwLCAjLTRdIQorCW1vdglyMCwgI1BTUl9GX0JJVHxQU1JfSV9CSVR8U1ZDX01PREUKKwltc3IJY3Bzcl9jLCByMAorCWJsCXhzY2FsZV9mbHVzaF9rZXJuX2NhY2hlX2FsbAlAIGNsZWFuIGNhY2hlcworCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlyMCwgcjAsICMweDE4MDAJCQlAIC4uLklaLi4uLi4uLi4uLi4KKwliaWMJcjAsIHIwLCAjMHgwMDA2CQkJQCAuLi4uLi4uLi4uLi4uQ0EuCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcworCWxkcglwYywgW3NwXSwgIzQKKworLyoKKyAqIGNwdV94c2NhbGVfcmVzZXQobG9jKQorICoKKyAqIFBlcmZvcm0gYSBzb2Z0IHJlc2V0IG9mIHRoZSBzeXN0ZW0uICBQdXQgdGhlIENQVSBpbnRvIHRoZQorICogc2FtZSBzdGF0ZSBhcyBpdCB3b3VsZCBiZSBpZiBpdCBoYWQgYmVlbiByZXNldCwgYW5kIGJyYW5jaAorICogdG8gd2hhdCB3b3VsZCBiZSB0aGUgcmVzZXQgdmVjdG9yLgorICoKKyAqIGxvYzogbG9jYXRpb24gdG8ganVtcCB0byBmb3Igc29mdCByZXNldAorICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV94c2NhbGVfcmVzZXQpCisJbW92CXIxLCAjUFNSX0ZfQklUfFBTUl9JX0JJVHxTVkNfTU9ERQorCW1zcgljcHNyX2MsIHIxCQkJQCByZXNldCBDUFNSCisJbXJjCXAxNSwgMCwgcjEsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCisJYmljCXIxLCByMSwgIzB4MDA4NgkJCUAgLi4uLi4uLi5CLi4uLkNBLgorCWJpYwlyMSwgcjEsICMweDM5MDAJCQlAIC4uVklaLi5TLi4uLi4uLi4KKwltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGM3LCAwCQlAIGludmFsaWRhdGUgSSxEIGNhY2hlcyAmIEJUQgorCWJpYwlyMSwgcjEsICMweDAwMDEJCQlAIC4uLi4uLi4uLi4uLi4uLk0KKwltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwlAIENBVVRJT046IE1NVSB0dXJuZWQgb2ZmIGZyb20gdGhpcyBwb2ludC4gV2UgY291bnQgb24gdGhlIHBpcGVsaW5lCisJQCBhbHJlYWR5IGNvbnRhaW5pbmcgdGhvc2UgdHdvIGxhc3QgaW5zdHJ1Y3Rpb25zIHRvIHN1cnZpdmUuCisJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwltb3YJcGMsIHIwCisKKy8qCisgKiBjcHVfeHNjYWxlX2RvX2lkbGUoKQorICoKKyAqIENhdXNlIHRoZSBwcm9jZXNzb3IgdG8gaWRsZQorICoKKyAqIEZvciBub3cgd2UgZG8gbm90aGluZyBidXQgZ28gdG8gaWRsZSBtb2RlIGZvciBldmVyeSBjYXNlCisgKgorICogWFNjYWxlIHN1cHBvcnRzIGNsb2NrIHN3aXRjaGluZywgYnV0IHVzaW5nIGlkbGUgbW9kZSBzdXBwb3J0CisgKiBhbGxvd3MgZXh0ZXJuYWwgaGFyZHdhcmUgdG8gcmVhY3QgdG8gc3lzdGVtIHN0YXRlIGNoYW5nZXMuCisgKi8KKwkuYWxpZ24JNQorCitFTlRSWShjcHVfeHNjYWxlX2RvX2lkbGUpCisJbW92CXIwLCAjMQorCW1jcglwMTQsIDAsIHIwLCBjNywgYzAsIDAJCUAgR28gdG8gSURMRQorCW1vdglwYywgbHIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENBQ0hFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKglmbHVzaF91c2VyX2NhY2hlX2FsbCgpCisgKgorICoJSW52YWxpZGF0ZSBhbGwgY2FjaGUgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgYWRkcmVzcworICoJc3BhY2UuCisgKi8KK0VOVFJZKHhzY2FsZV9mbHVzaF91c2VyX2NhY2hlX2FsbCkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJZmx1c2hfa2Vybl9jYWNoZV9hbGwoKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK0VOVFJZKHhzY2FsZV9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwltb3YJcjIsICNWTV9FWEVDCisJbW92CWlwLCAjMAorX19mbHVzaF93aG9sZV9jYWNoZToKKwljbGVhbl9kX2NhY2hlIHIwLCByMQorCXRzdAlyMiwgI1ZNX0VYRUMKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzUsIDAJCUAgSW52YWxpZGF0ZSBJIGNhY2hlICYgQlRCCisJbWNybmUJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltb3YJcGMsIGxyCisKKy8qCisgKglmbHVzaF91c2VyX2NhY2hlX3JhbmdlKHN0YXJ0LCBlbmQsIHZtX2ZsYWdzKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBjYWNoZSBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQKKyAqCWFkZHJlc3Mgc3BhY2UuCisgKgorICoJLSBzdGFydCAtIHN0YXJ0IGFkZHJlc3MgKG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZW5kCS0gZW5kIGFkZHJlc3MgKGV4Y2x1c2l2ZSwgbWF5IG5vdCBiZSBhbGlnbmVkKQorICoJLSB2bWEJLSB2bWFfYXJlYV9zdHJ1Y3QgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoeHNjYWxlX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UpCisJbW92CWlwLCAjMAorCXN1YglyMywgcjEsIHIwCQkJQCBjYWxjdWxhdGUgdG90YWwgc2l6ZQorCWNtcAlyMywgI01BWF9BUkVBX1NJWkUKKwliaHMJX19mbHVzaF93aG9sZV9jYWNoZQorCisxOgl0c3QJcjIsICNWTV9FWEVDCisJbWNybmUJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIEludmFsaWRhdGUgSSBjYWNoZSBsaW5lCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgQ2xlYW4gRCBjYWNoZSBsaW5lCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBJbnZhbGlkYXRlIEQgY2FjaGUgbGluZQorCWFkZAlyMCwgcjAsICNDQUNIRUxJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCXRzdAlyMiwgI1ZNX0VYRUMKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzUsIDYJCUAgSW52YWxpZGF0ZSBCVEIKKwltY3JuZQlwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIERyYWluIFdyaXRlICgmIEZpbGwpIEJ1ZmZlcgorCW1vdglwYywgbHIKKworLyoKKyAqCWNvaGVyZW50X2tlcm5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqCU5vdGU6IHNpbmdsZSBJLWNhY2hlIGxpbmUgaW52YWxpZGF0aW9uIGlzbid0IHVzZWQgaGVyZSBzaW5jZQorICoJaXQgYWxzbyB0cmFzaGVzIHRoZSBtaW5pIEktY2FjaGUgdXNlZCBieSBKVEFHIGRlYnVnZ2Vycy4KKyAqLworRU5UUlkoeHNjYWxlX2NvaGVyZW50X2tlcm5fcmFuZ2UpCisJLyogRkFMTFRIUk9VR0ggKi8KKworLyoKKyAqCWNvaGVyZW50X3VzZXJfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglFbnN1cmUgY29oZXJlbmN5IGJldHdlZW4gdGhlIEljYWNoZSBhbmQgdGhlIERjYWNoZSBpbiB0aGUKKyAqCXJlZ2lvbiBkZXNjcmliZWQgYnkgc3RhcnQuICBJZiB5b3UgaGF2ZSBub24tc25vb3BpbmcKKyAqCUhhcnZhcmQgY2FjaGVzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICoKKyAqCU5vdGU6IHNpbmdsZSBJLWNhY2hlIGxpbmUgaW52YWxpZGF0aW9uIGlzbid0IHVzZWQgaGVyZSBzaW5jZQorICoJaXQgYWxzbyB0cmFzaGVzIHRoZSBtaW5pIEktY2FjaGUgdXNlZCBieSBKVEFHIGRlYnVnZ2Vycy4KKyAqLworRU5UUlkoeHNjYWxlX2NvaGVyZW50X3VzZXJfcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFTElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFTElORVNJWkUKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCUAgSW52YWxpZGF0ZSBJIGNhY2hlICYgQlRCCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgRHJhaW4gV3JpdGUgKCYgRmlsbCkgQnVmZmVyCisJbW92CXBjLCBscgorCisvKgorICoJZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSh2b2lkICpwYWdlKQorICoKKyAqCUVuc3VyZSBubyBEIGNhY2hlIGFsaWFzaW5nIG9jY3VycywgZWl0aGVyIHdpdGggaXRzZWxmIG9yCisgKgl0aGUgSSBjYWNoZQorICoKKyAqCS0gYWRkcgktIHBhZ2UgYWxpZ25lZCBhZGRyZXNzCisgKi8KK0VOVFJZKHhzY2FsZV9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlKQorCWFkZAlyMSwgcjAsICNQQUdFX1NaCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMAkJQCBJbnZhbGlkYXRlIEkgY2FjaGUgJiBCVEIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCisgKgorICoJSW52YWxpZGF0ZSAoZGlzY2FyZCkgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKglNYXkgbm90IHdyaXRlIGJhY2sgYW55IGVudHJpZXMuICBJZiAnc3RhcnQnIG9yICdlbmQnCisgKglhcmUgbm90IGNhY2hlIGxpbmUgYWxpZ25lZCwgdGhvc2UgbGluZXMgbXVzdCBiZSB3cml0dGVuCisgKgliYWNrLgorICoKKyAqCS0gc3RhcnQgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAkgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKHhzY2FsZV9kbWFfaW52X3JhbmdlKQorCW1yYwlwMTUsIDAsIHIyLCBjMCwgYzAsIDAJCUAgcmVhZCBJRAorCWVvcglyMiwgcjIsICMweDY5MDAwMDAwCisJZW9yCXIyLCByMiwgIzB4MDAwNTIwMDAKKwliaWNzCXIyLCByMiwgIzEKKwliZXEJeHNjYWxlX2RtYV9mbHVzaF9yYW5nZQorCisJdHN0CXIwLCAjQ0FDSEVMSU5FU0laRSAtIDEKKwliaWMJcjAsIHIwLCAjQ0FDSEVMSU5FU0laRSAtIDEKKwltY3JuZQlwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKKwl0c3QJcjEsICNDQUNIRUxJTkVTSVpFIC0gMQorCW1jcm5lCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltb3YJcGMsIGxyCisKKy8qCisgKglkbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglDbGVhbiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0ICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBlbmQJIC0gdmlydHVhbCBlbmQgYWRkcmVzcworICovCitFTlRSWSh4c2NhbGVfZG1hX2NsZWFuX3JhbmdlKQorCWJpYwlyMCwgcjAsICNDQUNIRUxJTkVTSVpFIC0gMQorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQorCWFkZAlyMCwgcjAsICNDQUNIRUxJTkVTSVpFCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIERyYWluIFdyaXRlICgmIEZpbGwpIEJ1ZmZlcgorCW1vdglwYywgbHIKKworLyoKKyAqCWRtYV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIHJhbmdlLgorICoKKyAqCS0gc3RhcnQgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIGVuZAkgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzCisgKi8KK0VOVFJZKHhzY2FsZV9kbWFfZmx1c2hfcmFuZ2UpCisJYmljCXIwLCByMCwgI0NBQ0hFTElORVNJWkUgLSAxCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlIEQgZW50cnkKKwlhZGQJcjAsIHIwLCAjQ0FDSEVMSU5FU0laRQorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltb3YJcGMsIGxyCisKK0VOVFJZKHhzY2FsZV9jYWNoZV9mbnMpCisJLmxvbmcJeHNjYWxlX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJLmxvbmcJeHNjYWxlX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCisJLmxvbmcJeHNjYWxlX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwkubG9uZwl4c2NhbGVfY29oZXJlbnRfa2Vybl9yYW5nZQorCS5sb25nCXhzY2FsZV9jb2hlcmVudF91c2VyX3JhbmdlCisJLmxvbmcJeHNjYWxlX2ZsdXNoX2tlcm5fZGNhY2hlX3BhZ2UKKwkubG9uZwl4c2NhbGVfZG1hX2ludl9yYW5nZQorCS5sb25nCXhzY2FsZV9kbWFfY2xlYW5fcmFuZ2UKKwkubG9uZwl4c2NhbGVfZG1hX2ZsdXNoX3JhbmdlCisKK0VOVFJZKGNwdV94c2NhbGVfZGNhY2hlX2NsZWFuX2FyZWEpCisxOgltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgI0NBQ0hFTElORVNJWkUKKwlzdWJzCXIxLCByMSwgI0NBQ0hFTElORVNJWkUKKwliaGkJMWIKKwltb3YJcGMsIGxyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENBQ0hFIExPQ0tJTkc9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlIFhTY2FsZSBNaWNyb0FyY2hpdGVjdHVyZSBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGxvY2tpbmcgZW50cmllcyBpbnRvCisgKiB0aGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGUuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGNvcmUKKyAqIGxvdyBsZXZlbCBpbnN0cnVjdGlvbnMgbmVlZGVkIHRvIGFjY29tcGxpc2ggdGhlIGxvY2tpbmcuICBUaGUgZGV2ZWxvcGVyJ3MKKyAqIG1hbnVhbCBzdGF0ZXMgdGhhdCB0aGUgY29kZSB0aGF0IHBlcmZvcm1zIHRoZSBsb2NraW5nIG11c3QgYmUgaW4gbm9uLWNhY2hlZAorICogbWVtb3J5LiAgVG8gYWNjb21wbGlzaCB0aGlzLCB0aGUgY29kZSBpbiB4c2NhbGUtY2FjaGUtbG9jay5jIGNvcGllcyB0aGUKKyAqIGZvbGxvd2luZyBmdW5jdGlvbnMgZnJvbSB0aGUgY2FjaGUgaW50byBhIG5vbi1jYWNoZWQgbWVtb3J5IHJlZ2lvbiB0aGF0CisgKiBpcyBhbGxvY2F0ZWQgdGhyb3VnaCBjb25zaXN0ZW50X2FsbG9jKCkuCisgKgorICovCisJLmFsaWduCTUKKy8qCisgKiB4c2NhbGVfaWNhY2hlX2xvY2sKKyAqCisgKiByMDogc3RhcnRpbmcgYWRkcmVzcyB0byBsb2NrCisgKiByMTogZW5kIGFkZHJlc3MgdG8gbG9jaworICovCitFTlRSWSh4c2NhbGVfaWNhY2hlX2xvY2spCisKK2lMb2NrTG9vcDoKKwliaWMJcjAsIHIwLCAjQ0FDSEVMSU5FU0laRSAtIDEKKwltY3IJcDE1LCAwLCByMCwgYzksIGMxLCAwCUAgbG9jayBpbnRvIGNhY2hlCisJY21wCXIwLCByMQkJCUAgYXJlIHdlIGRvbmU/CisJYWRkCXIwLCByMCwgI0NBQ0hFTElORVNJWkUJQCBhZHZhbmNlIHRvIG5leHQgY2FjaGUgbGluZQorCWJscwlpTG9ja0xvb3AKKwltb3YJcGMsIGxyCisKKy8qCisgKiB4c2NhbGVfaWNhY2hlX3VubG9jaworICovCitFTlRSWSh4c2NhbGVfaWNhY2hlX3VubG9jaykKKwltY3IJcDE1LCAwLCByMCwgYzksIGMxLCAxCUAgVW5sb2NrIGljYWNoZQorCW1vdglwYywgbHIKKworLyoKKyAqIHhzY2FsZV9kY2FjaGVfbG9jaworICoKKyAqIHIwOiBzdGFydGluZyBhZGRyZXNzIHRvIGxvY2sKKyAqIHIxOiBlbmQgYWRkcmVzcyB0byBsb2NrCisgKi8KK0VOVFJZKHhzY2FsZV9kY2FjaGVfbG9jaykKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltb3YJcjIsICMxCisJbWNyCXAxNSwgMCwgcjIsIGM5LCBjMiwgMAlAIFB1dCBkY2FjaGUgaW4gbG9jayBtb2RlCisJY3B3YWl0CWlwCQkJQCBXYWl0IGZvciBjb21wbGV0aW9uCisKKwltcnMJcjIsIGNwc3IKKwlvcnIJcjMsIHIyLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUCitkTG9ja0xvb3A6CisJbXNyCWNwc3JfYywgcjMKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQlAIFdyaXRlIGJhY2sgbGluZSBpZiBpdCBpcyBkaXJ0eQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzYsIDEJQCBGbHVzaC9pbnZhbGlkYXRlIGxpbmUKKwltc3IJY3Bzcl9jLCByMgorCWxkcglpcCwgW3IwXSwgI0NBQ0hFTElORVNJWkUgQCBQcmVsb2FkIDMyIGJ5dGVzIGludG8gY2FjaGUgZnJvbQorCQkJCQlAIGxvY2F0aW9uIFtyMF0uIFBvc3QtaW5jcmVtZW50CisJCQkJCUAgcjMgdG8gbmV4dCBjYWNoZSBsaW5lCisJY21wCXIwLCByMQkJCUAgQXJlIHdlIGRvbmU/CisJYmxzCWRMb2NrTG9vcAorCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgRHJhaW4gV3JpdGUgKCYgRmlsbCkgQnVmZmVyCisJbW92CXIyLCAjMAorCW1jcglwMTUsIDAsIHIyLCBjOSwgYzIsIDAJQCBHZXQgb3V0IG9mIGxvY2sgbW9kZQorCWNwd2FpdF9yZXQgbHIsIGlwCisKKy8qCisgKiB4c2NhbGVfZGNhY2hlX3VubG9jaworICovCitFTlRSWSh4c2NhbGVfZGNhY2hlX3VubG9jaykKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltY3IJcDE1LCAwLCBpcCwgYzksIGMyLCAxCUAgVW5sb2NrIGNhY2hlCisJbW92CXBjLCBscgorCisvKgorICogTmVlZGVkIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgY29waWVkLgorICovCisJLmFsaWduCTUKK0VOVFJZKHhzY2FsZV9jYWNoZV9kdW1teSkKKwltb3YJcGMsIGxyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRMQiBMT0NLSU5HPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlIFhTY2FsZSBNaWNyb0FyY2hpdGVjdHVyZSBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGxvY2tpbmcgZW50cmllcyBpbnRvCisgKiB0aGUgSW5zdHJ1Y3Rpb24gYW5kIERhdGEgVExCcy4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgdGhlCisgKiBsb3cgbGV2ZWwgc3VwcG9ydCBmb3Igc3VwcG9ydGluZyB0aGVzZSB1bmRlciBMaW51eC4gIHhzY2FsZS1sb2NrLmMKKyAqIGltcGxlbWVudHMgc29tZSBoaWdoZXIgbGV2ZWwgbWFuYWdlbWVudCBjb2RlLiAgTW9zdCBvZiB0aGUgZm9sbG93aW5nCisgKiBpcyB0YWtlbiBzdHJhaWdodCBvdXQgb2YgdGhlIERldmVsb3BlcidzIE1hbnVhbC4KKyAqLworCisvKgorICogTG9jayBJLVRMQiBlbnRyeQorICoKKyAqIHIwOiBWaXJ0dWFsIGFkZHJlc3MgdG8gdHJhbnNsYXRlIGFuZCBsb2NrCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoeHNjYWxlX2l0bGJfbG9jaykKKwltcnMJcjIsIGNwc3IKKwlvcnIJcjMsIHIyLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUCisJbXNyCWNwc3JfYywgcjMJCQlAIERpc2FibGUgaW50ZXJydXB0cworCW1jcglwMTUsIDAsIHIwLCBjOCwgYzUsIDEJCUAgSW52YWxpZGF0ZSBJLVRMQiBlbnRyeQorCW1jcglwMTUsIDAsIHIwLCBjMTAsIGM0LCAwCQlAIFRyYW5zbGF0ZSBhbmQgbG9jaworCW1zcgljcHNyX2MsIHIyCQkJQCBSZXN0b3JlIGludGVycnVwdHMKKwljcHdhaXRfcmV0IGxyLCBpcAorCisvKgorICogTG9jayBELVRMQiBlbnRyeQorICoKKyAqIHIwOiBWaXJ0dWFsIGFkZHJlc3MgdG8gdHJhbnNsYXRlIGFuZCBsb2NrCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoeHNjYWxlX2R0bGJfbG9jaykKKwltcnMJcjIsIGNwc3IKKwlvcnIJcjMsIHIyLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUCisJbXNyCWNwc3JfYywgcjMJCQlAIERpc2FibGUgaW50ZXJydXB0cworCW1jcglwMTUsIDAsIHIwLCBjOCwgYzYsIDEJCUAgSW52YWxpZGF0ZSBELVRMQiBlbnRyeQorCW1jcglwMTUsIDAsIHIwLCBjMTAsIGM4LCAwCQlAIFRyYW5zbGF0ZSBhbmQgbG9jaworCW1zcgljcHNyX2MsIHIyCQkJQCBSZXN0b3JlIGludGVycnVwdHMKKwljcHdhaXRfcmV0IGxyLCBpcAorCisvKgorICogVW5sb2NrIGFsbCBJLVRMQiBlbnRyaWVzCisgKi8KKwkuYWxpZ24JNQorRU5UUlkoeHNjYWxlX2l0bGJfdW5sb2NrKQorCW1jcglwMTUsIDAsIGlwLCBjMTAsIGM0LCAxCQlAIFVubG9jayBJLVRMQgorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzUsIDAJCUAgSW52YWxpZGF0ZSBJLVRMQgorCWNwd2FpdF9yZXQgbHIsIGlwCisKKy8qCisgKiBVbmxvY2sgYWxsIEQtVExCIGVudHJpZXMKKyAqLworRU5UUlkoeHNjYWxlX2R0bGJfdW5sb2NrKQorCW1jcglwMTUsIDAsIGlwLCBjMTAsIGM4LCAxCQlAIFVubG9jayBELVRCTAorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzYsIDAJCUAgSW52YWxpZGF0ZSBELVRMQgorCWNwd2FpdF9yZXQgbHIsIGlwCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFnZVRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIFBURV9DQUNIRV9XUklURV9BTExPQ0FURSAwCisKKy8qCisgKiBjcHVfeHNjYWxlX3N3aXRjaF9tbShwZ2QpCisgKgorICogU2V0IHRoZSB0cmFuc2xhdGlvbiBiYXNlIHBvaW50ZXIgdG8gYmUgYXMgZGVzY3JpYmVkIGJ5IHBnZC4KKyAqCisgKiBwZ2Q6IG5ldyBwYWdlIHRhYmxlcworICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV94c2NhbGVfc3dpdGNoX21tKQorCWNsZWFuX2RfY2FjaGUgcjEsIHIyCisJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAkJQCBJbnZhbGlkYXRlIEkgY2FjaGUgJiBCVEIKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIGxvYWQgcGFnZSB0YWJsZSBwb2ludGVyCisJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBpbnZhbGlkYXRlIEkgJiBEIFRMQnMKKwljcHdhaXRfcmV0IGxyLCBpcAorCisvKgorICogY3B1X3hzY2FsZV9zZXRfcHRlKHB0ZXAsIHB0ZSkKKyAqCisgKiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dAorICoKKyAqIEVycmF0YSA0MDogbXVzdCBzZXQgbWVtb3J5IHRvIHdyaXRlLXRocm91Z2ggZm9yIHVzZXIgcmVhZC1vbmx5IHBhZ2VzLgorICovCisJLmFsaWduCTUKK0VOVFJZKGNwdV94c2NhbGVfc2V0X3B0ZSkKKwlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCisKKwliaWMJcjIsIHIxLCAjMHhmZjAKKwlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfRVhUCQlAIGV4dGVuZGVkIHBhZ2UKKworCWVvcglyMywgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwl0c3QJcjMsICNMX1BURV9VU0VSCQkJQCBVc2VyPworCW9ycm5lCXIyLCByMiwgI1BURV9FWFRfQVBfVVJPX1NSVwlAIHllcyAtPiB1c2VyIHIvbywgc3lzdGVtIHIvdworCisJdHN0CXIzLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KKwlvcnJlcQlyMiwgcjIsICNQVEVfRVhUX0FQX1VOT19TUlcJQCB5ZXMgLT4gdXNlciBuL2EsIHN5c3RlbSByL3cKKwkJCQkJCUAgY29tYmluZWQgd2l0aCB1c2VyIC0+IHVzZXIgci93CisKKwlACisJQCBIYW5kbGUgdGhlIFggYml0LiAgV2Ugd2FudCB0byBzZXQgdGhpcyBiaXQgZm9yIHRoZSBtaW5pY2FjaGUKKwlAIChVID0gRSA9IEIgPSBXID0gMCwgQyA9IDEpIG9yIHdoZW4gd3JpdGUgYWxsb2NhdGUgaXMgZW5hYmxlZCwKKwlAIGFuZCB3ZSBoYXZlIGEgd3JpdGVhYmxlLCBjYWNoZWFibGUgcmVnaW9uLiAgSWYgd2UgaWdub3JlIHRoZQorCUAgVSBhbmQgRSBiaXRzLCB3ZSBjYW4gYWxsb3cgdXNlciBzcGFjZSB0byB1c2UgdGhlIG1pbmljYWNoZSBhcworCUAgd2VsbC4KKwlACisJQCAgWCA9IChDICYgflcgJiB+QikgfCAoQyAmIFcgJiBCICYgd3JpdGVfYWxsb2NhdGUpCisJQAorCWVvcglpcCwgcjEsICNMX1BURV9DQUNIRUFCTEUKKwl0c3QJaXAsICNMX1BURV9DQUNIRUFCTEUgfCBMX1BURV9XUklURSB8IExfUFRFX0JVRkZFUkFCTEUKKyNpZiBQVEVfQ0FDSEVfV1JJVEVfQUxMT0NBVEUKKwllb3JuZQlpcCwgcjEsICNMX1BURV9DQUNIRUFCTEUgfCBMX1BURV9XUklURSB8IExfUFRFX0JVRkZFUkFCTEUKKwl0c3RuZQlpcCwgI0xfUFRFX0NBQ0hFQUJMRSB8IExfUFRFX1dSSVRFIHwgTF9QVEVfQlVGRkVSQUJMRQorI2VuZGlmCisJb3JyZXEJcjIsIHIyLCAjUFRFX0VYVF9URVgoMSkKKworCUAKKwlAIEVycmF0dW0gNDA6IFRoZSBCIGJpdCBtdXN0IGJlIGNsZWFyZWQgZm9yIGEgdXNlciByZWFkLW9ubHkKKwlAIGNhY2hlYWJsZSBwYWdlLgorCUAKKwlAICBCID0gQiAmIH4oVSAmIEMgJiB+VykKKwlACisJYW5kCWlwLCByMSwgI0xfUFRFX1VTRVIgfCBMX1BURV9XUklURSB8IExfUFRFX0NBQ0hFQUJMRQorCXRlcQlpcCwgI0xfUFRFX1VTRVIgfCBMX1BURV9DQUNIRUFCTEUKKwliaWNlcQlyMiwgcjIsICNQVEVfQlVGRkVSQUJMRQorCisJdHN0CXIzLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/CisJbW92bmUJcjIsICMwCQkJCUAgbm8gLT4gZmF1bHQKKworCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCW1vdglpcCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBDbGVhbiBEIGNhY2hlIGxpbmUKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBEcmFpbiBXcml0ZSAoJiBGaWxsKSBCdWZmZXIKKwltb3YJcGMsIGxyCisKKworCS5sdG9yZworCisJLmFsaWduCisKKwlfX0lOSVQKKworCS50eXBlCV9feHNjYWxlX3NldHVwLCAjZnVuY3Rpb24KK19feHNjYWxlX3NldHVwOgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLCBEIGNhY2hlcyAmIEJUQgorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIERyYWluIFdyaXRlICgmIEZpbGwpIEJ1ZmZlcgorCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLCBEIFRMQnMKKyNpZmRlZiBDT05GSUdfSVdNTVhUCisJbW92CXIwLCAjMAkJCQlAIGluaXRpYWxseSBkaXNhbGxvdyBhY2Nlc3MgdG8gQ1AwL0NQMQorI2Vsc2UKKwltb3YJcjAsICMxCQkJCUAgQWxsb3cgYWNjZXNzIHRvIENQMAorI2VuZGlmCisJb3JyICAgICByMCwgcjAsICMxIDw8IDYJCQlAIGNwNiBmb3IgSU9QM3h4IGFuZCBCdWx2ZXJkZQorCW9ycglyMCwgcjAsICMxIDw8IDEzCQlAIEl0cyB1bmRlZmluZWQgd2hldGhlciB0aGlzCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzEsIDAJCUAgYWZmZWN0cyBVU1Igb3IgU1ZDIG1vZGVzCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBnZXQgY29udHJvbCByZWdpc3RlcgorCWxkcglyNSwgeHNjYWxlX2NyMV9jbGVhcgorCWJpYwlyMCwgcjAsIHI1CisJbGRyCXI1LCB4c2NhbGVfY3IxX3NldAorCW9ycglyMCwgcjAsIHI1CisJbW92CXBjLCBscgorCS5zaXplCV9feHNjYWxlX3NldHVwLCAuIC0gX194c2NhbGVfc2V0dXAKKworCS8qCisJICogIFIKKwkgKiAuUlZJIFpGUlMgQkxEUCBXQ0FNCisJICogLi4xMSAxLjAxIC4uLi4gLjEwMQorCSAqIAorCSAqLworCS50eXBlCXhzY2FsZV9jcjFfY2xlYXIsICNvYmplY3QKKwkudHlwZQl4c2NhbGVfY3IxX3NldCwgI29iamVjdAoreHNjYWxlX2NyMV9jbGVhcjoKKwkud29yZAkweDNiMDcKK3hzY2FsZV9jcjFfc2V0OgorCS53b3JkCTB4MzkwNQorCisJX19JTklUREFUQQorCisvKgorICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscworICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKKyAqLworCisJLnR5cGUJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKK0VOVFJZKHhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zKQorCS53b3JkCXY1dF9lYXJseV9hYm9ydAorCS53b3JkCWNwdV94c2NhbGVfcHJvY19pbml0CisJLndvcmQJY3B1X3hzY2FsZV9wcm9jX2ZpbgorCS53b3JkCWNwdV94c2NhbGVfcmVzZXQKKwkud29yZAljcHVfeHNjYWxlX2RvX2lkbGUKKwkud29yZAljcHVfeHNjYWxlX2RjYWNoZV9jbGVhbl9hcmVhCisJLndvcmQJY3B1X3hzY2FsZV9zd2l0Y2hfbW0KKwkud29yZAljcHVfeHNjYWxlX3NldF9wdGUKKwkuc2l6ZQl4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIHhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCisKKwkuc2VjdGlvbiAiLnJvZGF0YSIKKworCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKK2NwdV9hcmNoX25hbWU6CisJLmFzY2l6CSJhcm12NXRlIgorCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisKKwkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKK2NwdV9lbGZfbmFtZToKKwkuYXNjaXoJInY1IgorCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQorCisJLnR5cGUJY3B1XzgwMjAwX25hbWUsICNvYmplY3QKK2NwdV84MDIwMF9uYW1lOgorCS5hc2NpegkiWFNjYWxlLTgwMjAwIgorCS5zaXplCWNwdV84MDIwMF9uYW1lLCAuIC0gY3B1XzgwMjAwX25hbWUKKworCS50eXBlCWNwdV84MDMyeF9uYW1lLCAjb2JqZWN0CitjcHVfODAzMnhfbmFtZToKKwkuYXNjaXoJIlhTY2FsZS1JT1A4MDMyeCBGYW1pbHkiCisJLnNpemUJY3B1XzgwMzJ4X25hbWUsIC4gLSBjcHVfODAzMnhfbmFtZQorCisJLnR5cGUJY3B1XzgwMzN4X25hbWUsICNvYmplY3QKK2NwdV84MDMzeF9uYW1lOgorCS5hc2NpegkiWFNjYWxlLUlPUDgwMzN4IEZhbWlseSIKKwkuc2l6ZQljcHVfODAzM3hfbmFtZSwgLiAtIGNwdV84MDMzeF9uYW1lCisKKwkudHlwZQljcHVfcHhhMjUwX25hbWUsICNvYmplY3QKK2NwdV9weGEyNTBfbmFtZToKKwkuYXNjaXoJIlhTY2FsZS1QWEEyNTAiCisJLnNpemUJY3B1X3B4YTI1MF9uYW1lLCAuIC0gY3B1X3B4YTI1MF9uYW1lCisKKwkudHlwZQljcHVfcHhhMjEwX25hbWUsICNvYmplY3QKK2NwdV9weGEyMTBfbmFtZToKKwkuYXNjaXoJIlhTY2FsZS1QWEEyMTAiCisJLnNpemUJY3B1X3B4YTIxMF9uYW1lLCAuIC0gY3B1X3B4YTIxMF9uYW1lCisKKwkudHlwZQljcHVfaXhwNDJ4X25hbWUsICNvYmplY3QKK2NwdV9peHA0MnhfbmFtZToKKwkuYXNjaXoJIlhTY2FsZS1JWFA0MnggRmFtaWx5IgorCS5zaXplCWNwdV9peHA0MnhfbmFtZSwgLiAtIGNwdV9peHA0MnhfbmFtZQorCisJLnR5cGUJY3B1X2l4cDQ2eF9uYW1lLCAjb2JqZWN0CitjcHVfaXhwNDZ4X25hbWU6CisJLmFzY2l6CSJYU2NhbGUtSVhQNDZ4IEZhbWlseSIKKwkuc2l6ZQljcHVfaXhwNDZ4X25hbWUsIC4gLSBjcHVfaXhwNDZ4X25hbWUKKworCS50eXBlCWNwdV9peHAyNDAwX25hbWUsICNvYmplY3QKK2NwdV9peHAyNDAwX25hbWU6CisJLmFzY2l6CSJYU2NhbGUtSVhQMjQwMCIKKwkuc2l6ZQljcHVfaXhwMjQwMF9uYW1lLCAuIC0gY3B1X2l4cDI0MDBfbmFtZQorCisJLnR5cGUJY3B1X2l4cDI4MDBfbmFtZSwgI29iamVjdAorY3B1X2l4cDI4MDBfbmFtZToKKwkuYXNjaXoJIlhTY2FsZS1JWFAyODAwIgorCS5zaXplCWNwdV9peHAyODAwX25hbWUsIC4gLSBjcHVfaXhwMjgwMF9uYW1lCisKKwkudHlwZQljcHVfcHhhMjU1X25hbWUsICNvYmplY3QKK2NwdV9weGEyNTVfbmFtZToKKwkuYXNjaXoJIlhTY2FsZS1QWEEyNTUiCisJLnNpemUJY3B1X3B4YTI1NV9uYW1lLCAuIC0gY3B1X3B4YTI1NV9uYW1lCisKKwkudHlwZQljcHVfcHhhMjcwX25hbWUsICNvYmplY3QKK2NwdV9weGEyNzBfbmFtZToKKwkuYXNjaXoJIlhTY2FsZS1QWEEyNzAiCisJLnNpemUJY3B1X3B4YTI3MF9uYW1lLCAuIC0gY3B1X3B4YTI3MF9uYW1lCisKKwkuYWxpZ24KKworCS5zZWN0aW9uICIucHJvYy5pbmZvIiwgI2FsbG9jLCAjZXhlY2luc3RyCisKKwkudHlwZQlfXzgwMjAwX3Byb2NfaW5mbywjb2JqZWN0CitfXzgwMjAwX3Byb2NfaW5mbzoKKwkubG9uZwkweDY5MDUyMDAwCisJLmxvbmcJMHhmZmZmZmZmMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX194c2NhbGVfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKKwkubG9uZwljcHVfODAyMDBfbmFtZQorCS5sb25nCXhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCisJLmxvbmcJdjR3YmlfdGxiX2ZucworCS5sb25nCXhzY2FsZV9tY191c2VyX2ZucworCS5sb25nCXhzY2FsZV9jYWNoZV9mbnMKKwkuc2l6ZQlfXzgwMjAwX3Byb2NfaW5mbywgLiAtIF9fODAyMDBfcHJvY19pbmZvCisKKwkudHlwZQlfXzgwMzJ4X3Byb2NfaW5mbywjb2JqZWN0CitfXzgwMzJ4X3Byb2NfaW5mbzoKKwkubG9uZwkweDY5MDUyNDIwCisJLmxvbmcJMHhmZmZmZjVlMCAgICAgIEAgbWFzayBzaG91bGQgYWNjb21vZGF0ZSBJT1A4MDIxOSBhbHNvCisJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAorCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAorCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCisJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAorCQlQTURfU0VDVF9BUF9SRUFECisJYglfX3hzY2FsZV9zZXR1cAorCS5sb25nCWNwdV9hcmNoX25hbWUKKwkubG9uZwljcHVfZWxmX25hbWUKKwkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAorCS5sb25nCWNwdV84MDMyeF9uYW1lCisJLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCisJLmxvbmcJeHNjYWxlX2NhY2hlX2ZucworCS5zaXplCV9fODAzMnhfcHJvY19pbmZvLCAuIC0gX184MDMyeF9wcm9jX2luZm8KKworCS50eXBlCV9fODAzM3hfcHJvY19pbmZvLCNvYmplY3QKK19fODAzM3hfcHJvY19pbmZvOgorCS5sb25nCTB4NjkwNTQwMTAKKwkubG9uZwkweGZmZmZmZjMwCisJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAorCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAorCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCisJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAorCQlQTURfU0VDVF9BUF9SRUFECisJYglfX3hzY2FsZV9zZXR1cAorCS5sb25nCWNwdV9hcmNoX25hbWUKKwkubG9uZwljcHVfZWxmX25hbWUKKwkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAorCS5sb25nCWNwdV84MDMzeF9uYW1lCisJLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCisJLmxvbmcJeHNjYWxlX2NhY2hlX2ZucworCS5zaXplCV9fODAzM3hfcHJvY19pbmZvLCAuIC0gX184MDMzeF9wcm9jX2luZm8KKworCS50eXBlCV9fcHhhMjUwX3Byb2NfaW5mbywjb2JqZWN0CitfX3B4YTI1MF9wcm9jX2luZm86CisJLmxvbmcJMHg2OTA1MjEwMAorCS5sb25nCTB4ZmZmZmY3ZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCisJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQKKwliCV9feHNjYWxlX3NldHVwCisJLmxvbmcJY3B1X2FyY2hfbmFtZQorCS5sb25nCWNwdV9lbGZfbmFtZQorCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCisJLmxvbmcJY3B1X3B4YTI1MF9uYW1lCisJLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCisJLmxvbmcJeHNjYWxlX2NhY2hlX2ZucworCS5zaXplCV9fcHhhMjUwX3Byb2NfaW5mbywgLiAtIF9fcHhhMjUwX3Byb2NfaW5mbworCisJLnR5cGUJX19weGEyMTBfcHJvY19pbmZvLCNvYmplY3QKK19fcHhhMjEwX3Byb2NfaW5mbzoKKwkubG9uZwkweDY5MDUyMTIwCisJLmxvbmcJMHhmZmZmZjNmMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX194c2NhbGVfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKKwkubG9uZwljcHVfcHhhMjEwX25hbWUKKwkubG9uZwl4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKKwkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCisJLnNpemUJX19weGEyMTBfcHJvY19pbmZvLCAuIC0gX19weGEyMTBfcHJvY19pbmZvCisKKwkudHlwZQlfX2l4cDI0MDBfcHJvY19pbmZvLCAjb2JqZWN0CitfX2l4cDI0MDBfcHJvY19pbmZvOgorCS5sb25nICAgMHg2OTA1NDE5MAorCS5sb25nICAgMHhmZmZmZmZmMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIgICAgICAgX194c2NhbGVfc2V0dXAKKwkubG9uZyAgIGNwdV9hcmNoX25hbWUKKwkubG9uZyAgIGNwdV9lbGZfbmFtZQorCS5sb25nICAgSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKKwkubG9uZyAgIGNwdV9peHAyNDAwX25hbWUKKwkubG9uZyAgIHhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCisJLmxvbmcJdjR3YmlfdGxiX2ZucworCS5sb25nCXhzY2FsZV9tY191c2VyX2ZucworCS5sb25nCXhzY2FsZV9jYWNoZV9mbnMKKwkuc2l6ZSAgIF9faXhwMjQwMF9wcm9jX2luZm8sIC4gLSBfX2l4cDI0MDBfcHJvY19pbmZvICAgICAgICAgICAgICAgIAorCisJLnR5cGUJX19peHAyODAwX3Byb2NfaW5mbywgI29iamVjdAorX19peHAyODAwX3Byb2NfaW5mbzoKKwkubG9uZyAgIDB4NjkwNTQxYTAKKwkubG9uZyAgIDB4ZmZmZmZmZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCisJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQKKwliICAgICAgIF9feHNjYWxlX3NldHVwCisJLmxvbmcgICBjcHVfYXJjaF9uYW1lCisJLmxvbmcgICBjcHVfZWxmX25hbWUKKwkubG9uZyAgIEhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCisJLmxvbmcgICBjcHVfaXhwMjgwMF9uYW1lCisJLmxvbmcgICB4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKKwkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCisJLnNpemUgICBfX2l4cDI4MDBfcHJvY19pbmZvLCAuIC0gX19peHAyODAwX3Byb2NfaW5mbyAgICAgICAgICAgICAgICAKKworCS50eXBlCV9faXhwNDJ4X3Byb2NfaW5mbywgI29iamVjdAorX19peHA0MnhfcHJvY19pbmZvOgorCS5sb25nICAgMHg2OTA1NDFjMAorCS5sb25nICAgMHhmZmZmZmZjMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIgICAgICAgX194c2NhbGVfc2V0dXAKKwkubG9uZyAgIGNwdV9hcmNoX25hbWUKKwkubG9uZyAgIGNwdV9lbGZfbmFtZQorCS5sb25nICAgSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKKwkubG9uZyAgIGNwdV9peHA0MnhfbmFtZQorCS5sb25nICAgeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCisJLmxvbmcJeHNjYWxlX2NhY2hlX2ZucworCS5zaXplICAgX19peHA0MnhfcHJvY19pbmZvLCAuIC0gX19peHA0MnhfcHJvY19pbmZvICAgICAgICAgICAgICAgIAorCisJLnR5cGUJX19peHA0NnhfcHJvY19pbmZvLCAjb2JqZWN0CitfX2l4cDQ2eF9wcm9jX2luZm86CisJLmxvbmcgICAweDY5MDU0MjAwCisJLmxvbmcgICAweGZmZmZmZjAwCisJLmxvbmcgICAweDAwMDAwYzBlCisJYiAgICAgICBfX3hzY2FsZV9zZXR1cAorCS5sb25nICAgY3B1X2FyY2hfbmFtZQorCS5sb25nICAgY3B1X2VsZl9uYW1lCisJLmxvbmcgICBIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAorCS5sb25nICAgY3B1X2l4cDQ2eF9uYW1lCisJLmxvbmcgICB4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKKwkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCisJLnNpemUgICBfX2l4cDQ2eF9wcm9jX2luZm8sIC4gLSBfX2l4cDQ2eF9wcm9jX2luZm8KKworCS50eXBlCV9fcHhhMjU1X3Byb2NfaW5mbywjb2JqZWN0CitfX3B4YTI1NV9wcm9jX2luZm86CisJLmxvbmcJMHg2OTA1MmQwMAorCS5sb25nCTB4ZmZmZmZmZjAKKwkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCisJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQKKwliCV9feHNjYWxlX3NldHVwCisJLmxvbmcJY3B1X2FyY2hfbmFtZQorCS5sb25nCWNwdV9lbGZfbmFtZQorCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCisJLmxvbmcJY3B1X3B4YTI1NV9uYW1lCisJLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwl2NHdiaV90bGJfZm5zCisJLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCisJLmxvbmcJeHNjYWxlX2NhY2hlX2ZucworCS5zaXplCV9fcHhhMjU1X3Byb2NfaW5mbywgLiAtIF9fcHhhMjU1X3Byb2NfaW5mbworCisJLnR5cGUJX19weGEyNzBfcHJvY19pbmZvLCNvYmplY3QKK19fcHhhMjcwX3Byb2NfaW5mbzoKKwkubG9uZwkweDY5MDU0MTEwCisJLmxvbmcJMHhmZmZmZmZmMAorCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKwkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX194c2NhbGVfc2V0dXAKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKKwkubG9uZwljcHVfcHhhMjcwX25hbWUKKwkubG9uZwl4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKKwkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCisJLnNpemUJX19weGEyNzBfcHJvY19pbmZvLCAuIC0gX19weGEyNzBfcHJvY19pbmZvCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12My5TIGIvYXJjaC9hcm0vbW0vdGxiLXYzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiMGRhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL3RsYi12My5TCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vdGxidjMuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBUk0gYXJjaGl0ZWN0dXJlIHZlcnNpb24gMyBUTEIgaGFuZGxpbmcgZnVuY3Rpb25zLgorICoKKyAqIFByb2Nlc3NvcnM6IEFSTTYxMCwgQVJNNzEwLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKKworCS5hbGlnbgk1CisvKgorICoJdjNfZmx1c2hfdXNlcl90bGJfcmFuZ2Uoc3RhcnQsIGVuZCwgbW0pCisgKgorICoJSW52YWxpZGF0ZSBhIHJhbmdlIG9mIFRMQiBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBzcGFjZS4KKyAqCisgKgktIHN0YXJ0IC0gcmFuZ2Ugc3RhcnQgYWRkcmVzcworICoJLSBlbmQgICAtIHJhbmdlIGVuZCBhZGRyZXNzCisgKgktIG1tICAgIC0gbW1fc3RydWN0IGRlc2NyaWJpbmcgYWRkcmVzcyBzcGFjZQorICovCisJLmFsaWduCTUKK0VOVFJZKHYzX2ZsdXNoX3VzZXJfdGxiX3JhbmdlKQorCXZtYV92bV9tbSByMiwgcjIKKwlhY3RfbW0JcjMJCQkJQCBnZXQgY3VycmVudC0+YWN0aXZlX21tCisJdGVxCXIyLCByMwkJCQlAID09IG1tID8KKwltb3ZuZQlwYywgbHIJCQkJQCBubywgd2UgZG9udCBkbyBhbnl0aGluZworRU5UUlkodjNfZmx1c2hfa2Vybl90bGJfcmFuZ2UpCisJYmljCXIwLCByMCwgIzB4MGZmCisJYmljCXIwLCByMCwgIzB4ZjAwCisxOgltY3IJcDE1LCAwLCByMCwgYzYsIGMwLCAwCQlAIGludmFsaWRhdGUgVExCIGVudHJ5CisJYWRkCXIwLCByMCwgI1BBR0VfU1oKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CXBjLCBscgorCisJX19JTklUREFUQQorCisJLnR5cGUJdjNfdGxiX2ZucywgI29iamVjdAorRU5UUlkodjNfdGxiX2ZucykKKwkubG9uZwl2M19mbHVzaF91c2VyX3RsYl9yYW5nZQorCS5sb25nCXYzX2ZsdXNoX2tlcm5fdGxiX3JhbmdlCisJLmxvbmcJdjNfdGxiX2ZsYWdzCisJLnNpemUJdjNfdGxiX2ZucywgLiAtIHYzX3RsYl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12NC5TIGIvYXJjaC9hcm0vbW0vdGxiLXY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4MmVlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL3RsYi12NC5TCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vdGxidjQuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBUk0gYXJjaGl0ZWN0dXJlIHZlcnNpb24gNCBUTEIgaGFuZGxpbmcgZnVuY3Rpb25zLgorICogIFRoZXNlIGFzc3VtZSBhIHNwbGl0IEkvRCBUTEJzLCBhbmQgbm8gd3JpdGUgYnVmZmVyLgorICoKKyAqIFByb2Nlc3NvcnM6IEFSTTcyMFQKKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKKwkuYWxpZ24JNQorLyoKKyAqCXY0X2ZsdXNoX3VzZXJfdGxiX3JhbmdlKHN0YXJ0LCBlbmQsIG1tKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBUTEIgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHVzZXIgYWRkcmVzcyBzcGFjZS4KKyAqCisgKgktIHN0YXJ0IC0gcmFuZ2Ugc3RhcnQgYWRkcmVzcworICoJLSBlbmQgICAtIHJhbmdlIGVuZCBhZGRyZXNzCisgKgktIG1tICAgIC0gbW1fc3RydWN0IGRlc2NyaWJpbmcgYWRkcmVzcyBzcGFjZQorICovCisJLmFsaWduCTUKK0VOVFJZKHY0X2ZsdXNoX3VzZXJfdGxiX3JhbmdlKQorCXZtYV92bV9tbSBpcCwgcjIKKwlhY3RfbW0JcjMJCQkJQCBnZXQgY3VycmVudC0+YWN0aXZlX21tCisJZW9ycwlyMywgaXAsIHIzCQkJCUAgPT0gbW0gPworCW1vdm5lCXBjLCBscgkJCQlAIG5vLCB3ZSBkb250IGRvIGFueXRoaW5nCisudjRfZmx1c2hfa2Vybl90bGJfcmFuZ2U6CisJYmljCXIwLCByMCwgIzB4MGZmCisJYmljCXIwLCByMCwgIzB4ZjAwCisxOgltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAxCQlAIGludmFsaWRhdGUgVExCIGVudHJ5CisJYWRkCXIwLCByMCwgI1BBR0VfU1oKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJbW92CXBjLCBscgorCisvKgorICoJdjRfZmx1c2hfa2Vybl90bGJfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCisgKglJbnZhbGlkYXRlIGEgcmFuZ2Ugb2YgVExCIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZCBrZXJuZWwKKyAqCWFkZHJlc3MgcmFuZ2UuCisgKgorICoJLSBzdGFydCAtIHZpcnR1YWwgYWRkcmVzcyAobWF5IG5vdCBiZSBhbGlnbmVkKQorICoJLSBlbmQgICAtIHZpcnR1YWwgYWRkcmVzcyAobWF5IG5vdCBiZSBhbGlnbmVkKQorICovCisuZ2xvYmwgdjRfZmx1c2hfa2Vybl90bGJfcmFuZ2UKKy5lcXUgdjRfZmx1c2hfa2Vybl90bGJfcmFuZ2UsIC52NF9mbHVzaF9rZXJuX3RsYl9yYW5nZQorCisJX19JTklUREFUQQorCisJLnR5cGUJdjRfdGxiX2ZucywgI29iamVjdAorRU5UUlkodjRfdGxiX2ZucykKKwkubG9uZwl2NF9mbHVzaF91c2VyX3RsYl9yYW5nZQorCS5sb25nCXY0X2ZsdXNoX2tlcm5fdGxiX3JhbmdlCisJLmxvbmcJdjRfdGxiX2ZsYWdzCisJLnNpemUJdjRfdGxiX2ZucywgLiAtIHY0X3RsYl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12NHdiLlMgYi9hcmNoL2FybS9tbS90bGItdjR3Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDhkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS90bGItdjR3Yi5TCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vdGxidjR3Yi5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFSTSBhcmNoaXRlY3R1cmUgdmVyc2lvbiA0IFRMQiBoYW5kbGluZyBmdW5jdGlvbnMuCisgKiAgVGhlc2UgYXNzdW1lIGEgc3BsaXQgSS9EIFRMQnMgdy9vIEkgVExCIGVudHJ5LCB3aXRoIGEgd3JpdGUgYnVmZmVyLgorICoKKyAqICBQcm9jZXNzb3JzOiBTQTExMCBTQTExMDAgU0ExMTEwCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgorCisJLmFsaWduCTUKKy8qCisgKgl2NHdiX2ZsdXNoX3VzZXJfdGxiX3JhbmdlKHN0YXJ0LCBlbmQsIG1tKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBUTEIgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJLSBzdGFydCAtIHJhbmdlIHN0YXJ0IGFkZHJlc3MKKyAqCS0gZW5kICAgLSByYW5nZSBlbmQgYWRkcmVzcworICoJLSBtbSAgICAtIG1tX3N0cnVjdCBkZXNjcmliaW5nIGFkZHJlc3Mgc3BhY2UKKyAqLworCS5hbGlnbgk1CitFTlRSWSh2NHdiX2ZsdXNoX3VzZXJfdGxiX3JhbmdlKQorCXZtYV92bV9tbSBpcCwgcjIKKwlhY3RfbW0JcjMJCQkJQCBnZXQgY3VycmVudC0+YWN0aXZlX21tCisJZW9ycwlyMywgaXAsIHIzCQkJCUAgPT0gbW0gPworCW1vdm5lCXBjLCBscgkJCQlAIG5vLCB3ZSBkb250IGRvIGFueXRoaW5nCisJdm1hX3ZtX2ZsYWdzIHIyLCByMgorCW1jcglwMTUsIDAsIHIzLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJdHN0CXIyLCAjVk1fRVhFQworCW1jcm5lCXAxNSwgMCwgcjMsIGM4LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgVExCCisJYmljCXIwLCByMCwgIzB4MGZmCisJYmljCXIwLCByMCwgIzB4ZjAwCisxOgltY3IJcDE1LCAwLCByMCwgYzgsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBUTEIgZW50cnkKKwlhZGQJcjAsIHIwLCAjUEFHRV9TWgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltb3YJcGMsIGxyCisKKy8qCisgKgl2NF9mbHVzaF9rZXJuX3RsYl9yYW5nZShzdGFydCwgZW5kKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBUTEIgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGtlcm5lbAorICoJYWRkcmVzcyByYW5nZS4KKyAqCisgKgktIHN0YXJ0IC0gdmlydHVhbCBhZGRyZXNzIChtYXkgbm90IGJlIGFsaWduZWQpCisgKgktIGVuZCAgIC0gdmlydHVhbCBhZGRyZXNzIChtYXkgbm90IGJlIGFsaWduZWQpCisgKi8KK0VOVFJZKHY0d2JfZmx1c2hfa2Vybl90bGJfcmFuZ2UpCisJbW92CXIzLCAjMAorCW1jcglwMTUsIDAsIHIzLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJYmljCXIwLCByMCwgIzB4MGZmCisJYmljCXIwLCByMCwgIzB4ZjAwCisJbWNyCXAxNSwgMCwgcjMsIGM4LCBjNSwgMAkJQCBpbnZhbGlkYXRlIEkgVExCCisxOgltY3IJcDE1LCAwLCByMCwgYzgsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBUTEIgZW50cnkKKwlhZGQJcjAsIHIwLCAjUEFHRV9TWgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltb3YJcGMsIGxyCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2NHdiX3RsYl9mbnMsICNvYmplY3QKK0VOVFJZKHY0d2JfdGxiX2ZucykKKwkubG9uZwl2NHdiX2ZsdXNoX3VzZXJfdGxiX3JhbmdlCisJLmxvbmcJdjR3Yl9mbHVzaF9rZXJuX3RsYl9yYW5nZQorCS5sb25nCXY0d2JfdGxiX2ZsYWdzCisJLnNpemUJdjR3Yl90bGJfZm5zLCAuIC0gdjR3Yl90bGJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS90bGItdjR3YmkuUyBiL2FyY2gvYXJtL21tL3RsYi12NHdiaS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmU5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS90bGItdjR3YmkuUwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL3RsYnY0d2JpLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQVJNIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIDQgYW5kIHZlcnNpb24gNSBUTEIgaGFuZGxpbmcgZnVuY3Rpb25zLgorICogIFRoZXNlIGFzc3VtZSBhIHNwbGl0IEkvRCBUTEJzLCB3aXRoIGEgd3JpdGUgYnVmZmVyLgorICoKKyAqICBQcm9jZXNzb3JzOiBBUk05MjAgQVJNOTIyIEFSTTkyNSBBUk05MjYgWFNjYWxlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgorCisvKgorICoJdjR3Yl9mbHVzaF91c2VyX3RsYl9yYW5nZShzdGFydCwgZW5kLCBtbSkKKyAqCisgKglJbnZhbGlkYXRlIGEgcmFuZ2Ugb2YgVExCIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZCBhZGRyZXNzIHNwYWNlLgorICoKKyAqCS0gc3RhcnQgLSByYW5nZSBzdGFydCBhZGRyZXNzCisgKgktIGVuZCAgIC0gcmFuZ2UgZW5kIGFkZHJlc3MKKyAqCS0gbW0gICAgLSBtbV9zdHJ1Y3QgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KKwkuYWxpZ24JNQorRU5UUlkodjR3YmlfZmx1c2hfdXNlcl90bGJfcmFuZ2UpCisJdm1hX3ZtX21tIGlwLCByMgorCWFjdF9tbQlyMwkJCQlAIGdldCBjdXJyZW50LT5hY3RpdmVfbW0KKwllb3JzCXIzLCBpcCwgcjMJCQlAID09IG1tID8KKwltb3ZuZQlwYywgbHIJCQkJQCBubywgd2UgZG9udCBkbyBhbnl0aGluZworCW1vdglyMywgIzAKKwltY3IJcDE1LCAwLCByMywgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgorCXZtYV92bV9mbGFncyByMiwgcjIKKwliaWMJcjAsIHIwLCAjMHgwZmYKKwliaWMJcjAsIHIwLCAjMHhmMDAKKzE6CXRzdAlyMiwgI1ZNX0VYRUMKKwltY3JuZQlwMTUsIDAsIHIwLCBjOCwgYzUsIDEJCUAgaW52YWxpZGF0ZSBJIFRMQiBlbnRyeQorCW1jcglwMTUsIDAsIHIwLCBjOCwgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIFRMQiBlbnRyeQorCWFkZAlyMCwgcjAsICNQQUdFX1NaCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1vdglwYywgbHIKKworRU5UUlkodjR3YmlfZmx1c2hfa2Vybl90bGJfcmFuZ2UpCisJbW92CXIzLCAjMAorCW1jcglwMTUsIDAsIHIzLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCisJYmljCXIwLCByMCwgIzB4MGZmCisJYmljCXIwLCByMCwgIzB4ZjAwCisxOgltY3IJcDE1LCAwLCByMCwgYzgsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBUTEIgZW50cnkKKwltY3IJcDE1LCAwLCByMCwgYzgsIGM2LCAxCQlAIGludmFsaWRhdGUgRCBUTEIgZW50cnkKKwlhZGQJcjAsIHIwLCAjUEFHRV9TWgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltb3YJcGMsIGxyCisKKwlfX0lOSVREQVRBCisKKwkudHlwZQl2NHdiaV90bGJfZm5zLCAjb2JqZWN0CitFTlRSWSh2NHdiaV90bGJfZm5zKQorCS5sb25nCXY0d2JpX2ZsdXNoX3VzZXJfdGxiX3JhbmdlCisJLmxvbmcJdjR3YmlfZmx1c2hfa2Vybl90bGJfcmFuZ2UKKwkubG9uZwl2NHdiaV90bGJfZmxhZ3MKKwkuc2l6ZQl2NHdiaV90bGJfZm5zLCAuIC0gdjR3YmlfdGxiX2ZucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLXY2LlMgYi9hcmNoL2FybS9tbS90bGItdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWVkMjZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vdGxiLXY2LlMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS90bGItdjYuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBUk0gYXJjaGl0ZWN0dXJlIHZlcnNpb24gNiBUTEIgaGFuZGxpbmcgZnVuY3Rpb25zLgorICogIFRoZXNlIGFzc3VtZSBhIHNwbGl0IEkvRCBUTEIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKKworI2RlZmluZSBIQVJWQVJEX1RMQgorCisvKgorICoJdjZ3YmlfZmx1c2hfdXNlcl90bGJfcmFuZ2Uoc3RhcnQsIGVuZCwgdm1hKQorICoKKyAqCUludmFsaWRhdGUgYSByYW5nZSBvZiBUTEIgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJLSBzdGFydCAtIHN0YXJ0IGFkZHJlc3MgKG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZW5kICAgLSBlbmQgYWRkcmVzcyAoZXhjbHVzaXZlLCBtYXkgbm90IGJlIGFsaWduZWQpCisgKgktIHZtYSAgIC0gdm1hX3N0cnVjdCBkZXNjcmliaW5nIGFkZHJlc3MgcmFuZ2UKKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIHRoZSAiSW52YWxpZGF0ZSBzaW5nbGUgZW50cnkiIGluc3RydWN0aW9uIHdpbGwgaW52YWxpZGF0ZQorICoJICBib3RoIHRoZSBJIGFuZCB0aGUgRCBUTEJzIG9uIEhhcnZhcmQtc3R5bGUgVExCcworICovCitFTlRSWSh2NndiaV9mbHVzaF91c2VyX3RsYl9yYW5nZSkKKwl2bWFfdm1fbW0gcjMsIHIyCQkJQCBnZXQgdm1hLT52bV9tbQorCW1vdglpcCwgIzAKKwltbWlkCXIzLCByMwkJCQlAIGdldCB2bV9tbS0+Y29udGV4dC5pZAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIHdyaXRlIGJ1ZmZlcgorCW1vdglyMCwgcjAsIGxzciAjUEFHRV9TSElGVAkJQCBhbGlnbiBhZGRyZXNzCisJbW92CXIxLCByMSwgbHNyICNQQUdFX1NISUZUCisJYXNpZAlyMywgcjMJCQkJQCBtYXNrIEFTSUQKKwlvcnIJcjAsIHIzLCByMCwgbHNsICNQQUdFX1NISUZUCUAgQ3JlYXRlIGluaXRpYWwgTVZBCisJbW92CXIxLCByMSwgbHNsICNQQUdFX1NISUZUCisJdm1hX3ZtX2ZsYWdzIHIyLCByMgkJCUAgZ2V0IHZtYS0+dm1fZmxhZ3MKKzE6CisjaWZkZWYgSEFSVkFSRF9UTEIKKwltY3IJcDE1LCAwLCByMCwgYzgsIGM2LCAxCQlAIFRMQiBpbnZhbGlkYXRlIEQgTVZBICh3YXMgMSkKKwl0c3QJcjIsICNWTV9FWEVDCQkJQCBFeGVjdXRhYmxlIGFyZWEgPworCW1jcm5lCXAxNSwgMCwgcjAsIGM4LCBjNSwgMQkJQCBUTEIgaW52YWxpZGF0ZSBJIE1WQSAod2FzIDEpCisjZWxzZQorCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDEJCUAgVExCIGludmFsaWRhdGUgTVZBICh3YXMgMSkKKyNlbmRpZgorCWFkZAlyMCwgcjAsICNQQUdFX1NaCisJY21wCXIwLCByMQorCWJsbwkxYgorCW1vdglwYywgbHIKKworLyoKKyAqCXY2d2JpX2ZsdXNoX2tlcm5fdGxiX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCisgKglJbnZhbGlkYXRlIGEgcmFuZ2Ugb2Yga2VybmVsIFRMQiBlbnRyaWVzCisgKgorICoJLSBzdGFydCAtIHN0YXJ0IGFkZHJlc3MgKG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZW5kICAgLSBlbmQgYWRkcmVzcyAoZXhjbHVzaXZlLCBtYXkgbm90IGJlIGFsaWduZWQpCisgKi8KK0VOVFJZKHY2d2JpX2ZsdXNoX2tlcm5fdGxiX3JhbmdlKQorCW1vdglyMiwgIzAKKwltY3IJcDE1LCAwLCByMiwgYzcsIGMxMCwgNAkJQCBkcmFpbiB3cml0ZSBidWZmZXIKKwltb3YJcjAsIHIwLCBsc3IgI1BBR0VfU0hJRlQJCUAgYWxpZ24gYWRkcmVzcworCW1vdglyMSwgcjEsIGxzciAjUEFHRV9TSElGVAorCW1vdglyMCwgcjAsIGxzbCAjUEFHRV9TSElGVAorCW1vdglyMSwgcjEsIGxzbCAjUEFHRV9TSElGVAorMToKKyNpZmRlZiBIQVJWQVJEX1RMQgorCW1jcglwMTUsIDAsIHIwLCBjOCwgYzYsIDEJCUAgVExCIGludmFsaWRhdGUgRCBNVkEKKwltY3IJcDE1LCAwLCByMCwgYzgsIGM1LCAxCQlAIFRMQiBpbnZhbGlkYXRlIEkgTVZBCisjZWxzZQorCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDEJCUAgVExCIGludmFsaWRhdGUgTVZBCisjZW5kaWYKKwlhZGQJcjAsIHIwLCAjUEFHRV9TWgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwltb3YJcGMsIGxyCisKKwkuc2VjdGlvbiAiLnRleHQuaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCisJLnR5cGUJdjZ3YmlfdGxiX2ZucywgI29iamVjdAorRU5UUlkodjZ3YmlfdGxiX2ZucykKKwkubG9uZwl2NndiaV9mbHVzaF91c2VyX3RsYl9yYW5nZQorCS5sb25nCXY2d2JpX2ZsdXNoX2tlcm5fdGxiX3JhbmdlCisJLmxvbmcJdjZ3YmlfdGxiX2ZsYWdzCisJLnNpemUJdjZ3YmlfdGxiX2ZucywgLiAtIHY2d2JpX3RsYl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL0FSTS1nY2MuaCBiL2FyY2gvYXJtL253ZnBlL0FSTS1nY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU5ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbndmcGUvQVJNLWdjYy5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIG1hY3JvIGBCSVRTNjQnIGNhbiBiZSBkZWZpbmVkIHRvIGluZGljYXRlIHRoYXQgNjQtYml0IGludGVnZXIgdHlwZXMgYXJlCitzdXBwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgQklUUzY0CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFYWNoIG9mIHRoZSBmb2xsb3dpbmcgYHR5cGVkZWYncyBkZWZpbmVzIHRoZSBtb3N0IGNvbnZlbmllbnQgdHlwZSB0aGF0IGhvbGRzCitpbnRlZ2VycyBvZiBhdCBsZWFzdCBhcyBtYW55IGJpdHMgYXMgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIGB1aW50OCcgc2hvdWxkCitiZSB0aGUgbW9zdCBjb252ZW5pZW50IHR5cGUgdGhhdCBjYW4gaG9sZCB1bnNpZ25lZCBpbnRlZ2VycyBvZiBhcyBtYW55IGFzCis4IGJpdHMuICBUaGUgYGZsYWcnIHR5cGUgbXVzdCBiZSBhYmxlIHRvIGhvbGQgZWl0aGVyIGEgMCBvciAxLiAgRm9yIG1vc3QKK2ltcGxlbWVudGF0aW9ucyBvZiBDLCBgZmxhZycsIGB1aW50OCcsIGFuZCBgaW50OCcgc2hvdWxkIGFsbCBiZSBgdHlwZWRlZidlZAordG8gdGhlIHNhbWUgYXMgYGludCcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwordHlwZWRlZiBjaGFyIGZsYWc7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIGludDg7Cit0eXBlZGVmIGludCB1aW50MTY7Cit0eXBlZGVmIGludCBpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBpbnQzMjsKKyNpZmRlZiBCSVRTNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBiaXRzNjQ7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50IHNiaXRzNjQ7CisjZW5kaWYKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VhY2ggb2YgdGhlIGZvbGxvd2luZyBgdHlwZWRlZidzIGRlZmluZXMgYSB0eXBlIHRoYXQgaG9sZHMgaW50ZWdlcnMKK29mIF9leGFjdGx5XyB0aGUgbnVtYmVyIG9mIGJpdHMgc3BlY2lmaWVkLiAgRm9yIGluc3RhbmNlLCBmb3IgbW9zdAoraW1wbGVtZW50YXRpb24gb2YgQywgYGJpdHMxNicgYW5kIGBzYml0czE2JyBzaG91bGQgYmUgYHR5cGVkZWYnZWQgdG8KK2B1bnNpZ25lZCBzaG9ydCBpbnQnIGFuZCBgc2lnbmVkIHNob3J0IGludCcgKG9yIGBzaG9ydCBpbnQnKSwgcmVzcGVjdGl2ZWx5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBiaXRzODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgc2JpdHM4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgYml0czE2OwordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IHNiaXRzMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBiaXRzMzI7Cit0eXBlZGVmIHNpZ25lZCBpbnQgc2JpdHMzMjsKKyNpZmRlZiBCSVRTNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1aW50NjQ7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50IGludDY0OworI2VuZGlmCisKKyNpZmRlZiBCSVRTNjQKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgYExJVDY0JyBtYWNybyB0YWtlcyBhcyBpdHMgYXJndW1lbnQgYSB0ZXh0dWFsIGludGVnZXIgbGl0ZXJhbCBhbmQgaWYKK25lY2Vzc2FyeSBgYG1hcmtzJycgdGhlIGxpdGVyYWwgYXMgaGF2aW5nIGEgNjQtYml0IGludGVnZXIgdHlwZS4gIEZvcgorZXhhbXBsZSwgdGhlIEdudSBDIENvbXBpbGVyIChgZ2NjJykgcmVxdWlyZXMgdGhhdCA2NC1iaXQgbGl0ZXJhbHMgYmUKK2FwcGVuZGVkIHdpdGggdGhlIGxldHRlcnMgYExMJyBzdGFuZGluZyBmb3IgYGxvbmcgbG9uZycsIHdoaWNoIGlzIGBnY2MncworbmFtZSBmb3IgdGhlIDY0LWJpdCBpbnRlZ2VyIHR5cGUuICBTb21lIGNvbXBpbGVycyBtYXkgYWxsb3cgYExJVDY0JyB0byBiZQorZGVmaW5lZCBhcyB0aGUgaWRlbnRpdHkgbWFjcm86ICBgI2RlZmluZSBMSVQ2NCggYSApIGEnLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgTElUNjQoIGEgKSBhIyNMTAorI2VuZGlmCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbWFjcm8gYElOTElORScgY2FuIGJlIHVzZWQgYmVmb3JlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBpbmxpbmVkLiAgSWYKK2EgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBpbmxpbmluZywgdGhpcyBtYWNybyBzaG91bGQgYmUgZGVmaW5lZAordG8gYmUgYHN0YXRpYycuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBJTkxJTkUgZXh0ZXJuIF9faW5saW5lX18KKworCisvKiBGb3IgdXNlIGFzIGEgR0NDIHNvZnQtZmxvYXQgbGlicmFyeSB3ZSBuZWVkIHNvbWUgc3BlY2lhbCBmdW5jdGlvbiBuYW1lcy4gKi8KKworI2lmZGVmIF9fTElCRkxPQVRfXworCisvKiBTb21lIDMyLWJpdCBvcHMgY2FuIGJlIG1hcHBlZCBzdHJhaWdodCBhY3Jvc3MgYnkganVzdCBjaGFuZ2luZyB0aGUgbmFtZS4gKi8KKyNkZWZpbmUgZmxvYXQzMl9hZGQJCQlfX2FkZHNmMworI2RlZmluZSBmbG9hdDMyX3N1YgkJCV9fc3Vic2YzCisjZGVmaW5lIGZsb2F0MzJfbXVsCQkJX19tdWxzZjMKKyNkZWZpbmUgZmxvYXQzMl9kaXYJCQlfX2RpdnNmMworI2RlZmluZSBpbnQzMl90b19mbG9hdDMyCQlfX2Zsb2F0c2lzZgorI2RlZmluZSBmbG9hdDMyX3RvX2ludDMyX3JvdW5kX3RvX3plcm8JX19maXhzZnNpCisjZGVmaW5lIGZsb2F0MzJfdG9fdWludDMyX3JvdW5kX3RvX3plcm8JX19maXh1bnNzZnNpCisKKy8qIFRoZXNlIG9uZXMgZ28gdGhyb3VnaCB0aGUgZ2x1ZSBjb2RlLiAgVG8gYXZvaWQgbmFtZXNwYWNlIHBvbGx1dGlvbgorICAgd2UgcmVuYW1lIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgdG9vLiAgKi8KKyNkZWZpbmUgZmxvYXQzMl9lcQkJCV9fX2Zsb2F0MzJfZXEKKyNkZWZpbmUgZmxvYXQzMl9sZQkJCV9fX2Zsb2F0MzJfbGUKKyNkZWZpbmUgZmxvYXQzMl9sdAkJCV9fX2Zsb2F0MzJfbHQKKworLyogQWxsIHRoZSA2NC1iaXQgb3BzIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGUgZ2x1ZSwgc28gd2UgcHVsbCB0aGUgc2FtZQorICAgdHJpY2suICAqLworI2RlZmluZSBmbG9hdDY0X2FkZAkJCV9fX2Zsb2F0NjRfYWRkCisjZGVmaW5lIGZsb2F0NjRfc3ViCQkJX19fZmxvYXQ2NF9zdWIKKyNkZWZpbmUgZmxvYXQ2NF9tdWwJCQlfX19mbG9hdDY0X211bAorI2RlZmluZSBmbG9hdDY0X2RpdgkJCV9fX2Zsb2F0NjRfZGl2CisjZGVmaW5lIGludDMyX3RvX2Zsb2F0NjQJCV9fX2ludDMyX3RvX2Zsb2F0NjQKKyNkZWZpbmUgZmxvYXQ2NF90b19pbnQzMl9yb3VuZF90b196ZXJvCV9fX2Zsb2F0NjRfdG9faW50MzJfcm91bmRfdG9femVybworI2RlZmluZSBmbG9hdDY0X3RvX3VpbnQzMl9yb3VuZF90b196ZXJvCV9fX2Zsb2F0NjRfdG9fdWludDMyX3JvdW5kX3RvX3plcm8KKyNkZWZpbmUgZmxvYXQ2NF90b19mbG9hdDMyCQlfX19mbG9hdDY0X3RvX2Zsb2F0MzIKKyNkZWZpbmUgZmxvYXQzMl90b19mbG9hdDY0CQlfX19mbG9hdDMyX3RvX2Zsb2F0NjQKKyNkZWZpbmUgZmxvYXQ2NF9lcQkJCV9fX2Zsb2F0NjRfZXEKKyNkZWZpbmUgZmxvYXQ2NF9sZQkJCV9fX2Zsb2F0NjRfbGUKKyNkZWZpbmUgZmxvYXQ2NF9sdAkJCV9fX2Zsb2F0NjRfbHQKKworI2lmIDAKKyNkZWZpbmUgZmxvYXQ2NF9hZGQJCQlfX2FkZGRmMworI2RlZmluZSBmbG9hdDY0X3N1YgkJCV9fc3ViZGYzCisjZGVmaW5lIGZsb2F0NjRfbXVsCQkJX19tdWxkZjMKKyNkZWZpbmUgZmxvYXQ2NF9kaXYJCQlfX2RpdmRmMworI2RlZmluZSBpbnQzMl90b19mbG9hdDY0CQlfX2Zsb2F0c2lkZgorI2RlZmluZSBmbG9hdDY0X3RvX2ludDMyX3JvdW5kX3RvX3plcm8JX19maXhkZnNpCisjZGVmaW5lIGZsb2F0NjRfdG9fdWludDMyX3JvdW5kX3RvX3plcm8JX19maXh1bnNkZnNpCisjZGVmaW5lIGZsb2F0NjRfdG9fZmxvYXQzMgkJX190cnVuY2Rmc2YyCisjZGVmaW5lIGZsb2F0MzJfdG9fZmxvYXQ2NAkJX19leHRlbmRzZmRmMgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvQ2hhbmdlTG9nIGIvYXJjaC9hcm0vbndmcGUvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjVhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9DaGFuZ2VMb2cKQEAgLTAsMCArMSw5MSBAQAorMjAwMy0wMy0yMiAgUmFscGggU2llbXNlbiA8cmFscGhzQG5ldHdpbmRlci5vcmc+CisJKiBSZWZvcm1hdCBhbGwgYnV0IHNvZnRmbG9hdCBmaWxlcyB0byBnZXQgYSBjb25zaXN0ZW50IGNvZGluZyBzdHlsZS4KKwkgIFVzZWQgImluZGVudCAta3IgLWk4IC10czggLXNvYiAtbDEzMiAtc3MiIGFuZCBhIGZldyBtYW51YWwgZml4dXBzLgorCSogUmVtb3ZlZCBkZWFkIGNvZGUgYW5kIGZpeGVkIGZ1bmN0aW9uIHByb3R5cGVzIHRvIG1hdGNoIGRlZmluaXRpb25zLgorCSogQ29uc29saWRhdGVkIHVzZSBvZiAob3Bjb2RlICYmIE1BU0tfQVJJVEhNRVRJQ19PUENPREUpID4+IDIwLgorCSogTWFrZSA4MC1iaXQgcHJlY2lzaW9uIGEgY29tcGlsZS10aW1lIG9wdGlvbi4gKDElKQorCSogT25seSBpbml0aWFsaXplIEZQRSBzdGF0ZSBvbmNlIGluIHJlcGVhdC1GUCBzaXR1YXRpb25zLiAoNiUpCisKKzIwMDItMDEtMTkgIFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CisKKwkqIGZwYTExLmggLSBBZGQgZG9jdW1lbnRhdGlvbgorCSAgICAgICAgICAtIHJlbW92ZSB1c2VyUmVnaXN0ZXJzIHBvaW50ZXIgZnJvbSB0aGlzIHN0cnVjdHVyZS4KKwkgICAgICAgICAgLSBhZGQgbmV3IG1ldGhvZCB0byBvYnRhaW4gaW50ZWdlciByZWdpc3RlciB2YWx1ZXMuCisJKiBzb2Z0ZmxvYXQuYyAtIFJlbW92ZSBmbG9hdDEyOAorCSogc29mdGZsb2F0LmggLSBSZW1vdmUgZmxvYXQxMjgKKwkqIHNvZnRmbG9hdC1zcGVjaWFsaXplIC0gUmVtb3ZlIGZsb2F0MTI4CisKKwkqIFRoZSBGUEExMSBzdHJ1Y3R1cmUgaXMgbm90IGEga2VybmVsLXNwZWNpZmljIGRhdGEgc3RydWN0dXJlLgorCSAgSXQgaXMgdXNlZCBieSB1c2VycyBvZiBwdHJhY2UgdG8gZXhhbWluZSB0aGUgdmFsdWVzIG9mIHRoZQorCSAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLiAgVGhlcmVmb3JlLCBhbnkgY2hhbmdlcyB0byB0aGUKKwkgIEZQQTExIHN0cnVjdHVyZSAoc2l6ZSBvciBwb3NpdGlvbiBvZiBlbGVtZW50cyBjb250YWluZWQKKwkgIHdpdGhpbikgaGF2ZSB0byBiZSB3ZWxsIHRob3VnaHQgb3V0LgorCisJKiBTaW5jZSAxMjgtYml0IGZsb2F0IHJlcXVpcmVzIHRoZSBGUEExMSBzdHJ1Y3R1cmUgdG8gY2hhbmdlCisJICBzaXplLCBpdCBoYXMgYmVlbiByZW1vdmVkLiAgMTI4LWJpdCBmbG9hdCBpcyBjdXJyZW50bHkgdW51c2VkLAorCSAgYW5kIG5lZWRzIHZhcmlvdXMgdGhpbmdzIHRvIGJlIHJlLXdvcmtlZCBzbyB0aGF0IHdlIHdvbid0CisJICBvdmVyZmxvdyB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSB0YXNrIHN0cnVjdHVyZS4KKworCSogVGhlIGNoYW5nZXMgYXJlIGRlc2lnbmVkIHRvIGJyZWFrIGFueSBwYXRjaCB0aGF0IGdvZXMgb24gdG9wCisJICBvZiB0aGlzIGNvZGUsIHNvIHRoYXQgdGhlIGF1dGhvcnMgcHJvcGVybHkgcmV2aWV3IHRoZWlyIGNoYW5nZXMuCisKKzE5OTktMDgtMTkgIFNjb3R0IEJhbWJyb3VnaCAgPHNjb3R0YkBuZXR3aW5kZXIub3JnPgorCisJKiBmcG1vZHVsZS5jIC0gQ2hhbmdlZCB2ZXJzaW9uIG51bWJlciB0byAwLjk1CisJKiBmcGExMS5oIC0gbW9kaWZpZWQgRlBBMTEsIEZQUkVHIHN0cnVjdHVyZXMKKwkqIGZwYTExLmMgLSBDaGFuZ2VzIGR1ZSB0byBGUEExMSwgRlBSRUcgc3RydWN0dXJlIGFsdGVyYXRpb25zLgorCSogZnBhMTFfY3Bkby5jIC0gQ2hhbmdlcyBkdWUgdG8gRlBBMTEsIEZQUkVHIHN0cnVjdHVyZSBhbHRlcmF0aW9ucy4KKwkqIGZwYTExX2NwZHQuYyAtIENoYW5nZXMgZHVlIHRvIEZQQTExLCBGUFJFRyBzdHJ1Y3R1cmUgYWx0ZXJhdGlvbnMuCisJKiBmcGExMV9jcHJ0LmMgLSBDaGFuZ2VzIGR1ZSB0byBGUEExMSwgRlBSRUcgc3RydWN0dXJlIGFsdGVyYXRpb25zLgorCSogc2luZ2xlX2NwZG8uYyAtIENoYW5nZXMgZHVlIHRvIEZQQTExLCBGUFJFRyBzdHJ1Y3R1cmUgYWx0ZXJhdGlvbnMuCisJKiBkb3VibGVfY3Bkby5jIC0gQ2hhbmdlcyBkdWUgdG8gRlBBMTEsIEZQUkVHIHN0cnVjdHVyZSBhbHRlcmF0aW9ucy4KKwkqIGV4dGVuZGVkX2NwZG8uYyAtIENoYW5nZXMgZHVlIHRvIEZQQTExLCBGUFJFRyBzdHJ1Y3R1cmUgYWx0ZXJhdGlvbnMuCisKKwkqIEkgZGlzY292ZXJlZCBzZXZlcmFsIGJ1Z3MuICBGaXJzdCBhbmQgd29yc3QgaXMgdGhhdCB0aGUga2VybmVsCisJICBwYXNzZXMgaW4gYSBwb2ludGVyIHRvIHRoZSBGUEUncyBzdGF0ZSBhcmVhLglUaGlzIGlzIGRlZmluZWQKKwkgIGFzIGEgc3RydWN0IHVzZXJfZnAgKHNlZSB1c2VyLmgpLiAgVGhpcyBwb2ludGVyIHdhcyBjYXN0IHRvIGEKKwkgIEZQQTExKi4gIFVuZm9ydHVuYXRlbHkgRlBBMTEgYW5kIHVzZXJfZnAgYXJlIG9mIGRpZmZlcmVudCBzaXplczsKKwkgIHVzZXJfZnAgaXMgc21hbGxlci4gIFRoaXMgbWVhbnQgdGhhdCB0aGUgRlBFIHNjcmliYmxlZCBvbiB0aGluZ3MKKwkgIGJlbG93IGl0cyBhcmVhLCB3aGljaCBpcyBiYWQsIGFzIHRoZSBhcmVhIGlzIGluIHRoZSB0aHJlYWRfc3RydWN0CisJICBlbWJlZGRlZCBpbiB0aGUgcHJvY2VzcyB0YXNrIHN0cnVjdHVyZS4gIFRodXMgd2Ugd2VyZSBzY3JpYmJsaW5nCisJICBvdmVyIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgc3RydWN0dXJlcyBpbiB0aGUgZW50aXJlIE9TLgorCisJKiB1c2VyX2ZwIGFuZCBGUEExMSBoYXZlIG5vdyBiZWVuIGhhcm1vbml6ZWQuICBNb3N0IG9mIHRoZSBjaGFuZ2VzCisJICBpbiB0aGUgYWJvdmUgY29kZSB3ZXJlIGRlcmVmZXJlbmNpbmcgcHJvYmxlbXMgZHVlIHRvIG1vdmluZyB0aGUKKwkgIHJlZ2lzdGVyIHR5cGUgb3V0IG9mIEZQUkVHLCBhbmQgZ2V0dGluZyByaWQgb2YgdGhlIHVuaW9uIHZhcmlhYmxlCisJICBmcHZhbHVlLgorCisJKiBTZWNvbmQgSSBub3RpY2VkIHJlc2V0RlBBMTEgd2FzIG5vdCBhbHdheXMgYmVpbmcgY2FsbGVkIGZvciBhCisJICB0YXNrLiAgVGhpcyBzaG91bGQgaGFwcGVuIG9uIHRoZSBmaXJzdCBmbG9hdGluZyBwb2ludCBleGNlcHRpb24KKwkgIHRoYXQgb2NjdXJzLglJdCBpcyBjb250cm9sbGVkIGJ5IGluaXRfZmxhZyBpbiBGUEExMS4gIFRoZQorCSAgY29tbWVudCBpbiB0aGUgY29kZSBiZXNpZGUgaW5pdF9mbGFnIHN0YXRlIHRoZSBrZXJuZWwgZ3VhcmFudGVlcworCSAgdGhpcyB0byBiZSB6ZXJvLiAgTm90IHNvLiAgSSBmb3VuZCB0aGF0IHRoZSBrZXJuZWwgcmVjeWNsZXMgdGFzaworCSAgc3RydWN0dXJlcywgYW5kIHRoYXQgcmVjeWNsZWQgb25lcyBtYXkgbm90IGhhdmUgaW5pdF9mbGFnIHplcm9lZC4KKwkgIEkgY291bGRuJ3QgZXZlbiBmaW5kIGFueXRoaW5nIHRoYXQgZ3VhcmFudGVlcyBpdCBpcyB6ZXJvZWQgd2hlbgorCSAgd2hlbiB0aGUgdGFzayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGx5IGFsbG9jYXRlZC4gIEluIGFueSBjYXNlCisJICBJIG5vdyBpbml0aWFsaXplIHRoZSBlbnRpcmUgRlBFIHN0YXRlIGluIHRoZSB0aHJlYWQgc3RydWN0dXJlIHRvCisJICB6ZXJvIHdoZW4gYWxsb2NhdGVkIGFuZCByZWN5Y2xlZC4gIFNlZSBhbGxvY190YXNrX3N0cnVjdCgpIGFuZAorCSAgZmx1c2hfdGhyZWFkKCkgaW4gYXJjaC9hcm0vcHJvY2Vzcy5jLiAgVGhlIGNoYW5nZSB0bworCSAgYWxsb2NfdGFza19zdHJ1Y3QoKSBtYXkgbm90IGJlIG5lY2Vzc2FyeSwgYnV0IEkgbGVmdCBpdCBpbiBmb3IKKwkgIGNvbXBsZXRlbmVzcyAoYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSkuCisKKzE5OTgtMTEtMjMgIFNjb3R0IEJhbWJyb3VnaCAgPHNjb3R0YkBuZXR3aW5kZXIub3JnPgorCisJKiBSRUFETUUuRlBFIC0gZml4IHR5cG8gaW4gZGVzY3JpcHRpb24gb2YgbGZtL3NmbSBpbnN0cnVjdGlvbnMKKwkqIE5PVEVTIC0gQWRkZWQgZmlsZSB0byBkZXNjcmliZSBrbm93biBidWdzL3Byb2JsZW1zIAorCSogZnBtb2R1bGUuYyAtIENoYW5nZWQgdmVyc2lvbiBudW1iZXIgdG8gMC45NAorCisxOTk4LTExLTIwICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworCSogUkVBRE1FLkZQRSAtIGZpeCBkZXNjcmlwdGlvbiBvZiBVUkQsIE5STSBpbnN0cnVjdGlvbnMKKwkqIFRPRE8gLSByZW1vdmUgVVJELCBOUk0gaW5zdHJ1Y3Rpb25zIGZyb20gVE9ETyBsaXN0CisJKiBzaW5nbGVfY3Bkby5jIC0gaW1wbGVtZW50IFVSRCwgTlJNCisJKiBkb3VibGVfY3Bkby5jIC0gaW1wbGVtZW50IFVSRCwgTlJNCisJKiBleHRlbmRlZF9jcGRvLmMgLSBpbXBsZW1lbnQgVVJELCBOUk0KKworMTk5OC0xMS0xOSAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+CisKKwkqIENoYW5nZUxvZyAtIEFkZGVkIHRoaXMgZmlsZSB0byB0cmFjayBjaGFuZ2VzIG1hZGUuCisJKiBmcGExMS5jIC0gYWRkZWQgY29kZSB0byBpbml0aWFsaXplIHJlZ2lzdGVyIHR5cGVzIHRvIHR5cGVOb25lCisJKiBmcGExMV9jcGR0LmMgLSBmaXhlZCBidWcgaW4gc3RvcmVFeHRlbmRlZCAodHlwZUV4dGVuZGVkIGNoYW5nZWQgdG8KKwkgIHR5cGVEb3VibGUgaW4gc3dpdGNoIHN0YXRlbWVudCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL01ha2VmaWxlIGIvYXJjaC9hcm0vbndmcGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3YjI2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAxIFBoaWxpcCBCbHVuZGVsbAorIworCitvYmotJChDT05GSUdfRlBFX05XRlBFKQkJKz0gbndmcGUubworCitud2ZwZS15CQkJCSs9IGZwYTExLm8gZnBhMTFfY3Bkby5vIGZwYTExX2NwZHQubyBcCisJCQkJICAgZnBhMTFfY3BydC5vIGZwbW9kdWxlLm8gZnBvcGNvZGUubyBcCisJCQkJICAgc29mdGZsb2F0Lm8gc2luZ2xlX2NwZG8ubyBkb3VibGVfY3Bkby5vCisKK253ZnBlLSQoQ09ORklHX0ZQRV9OV0ZQRV9YUCkJKz0gZXh0ZW5kZWRfY3Bkby5vCitud2ZwZS0kKENPTkZJR19DUFVfMjYpCQkrPSBlbnRyeTI2Lm8KK253ZnBlLSQoQ09ORklHX0NQVV8zMikJCSs9IGVudHJ5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL2RvdWJsZV9jcGRvLmMgYi9hcmNoL2FybS9ud2ZwZS9kb3VibGVfY3Bkby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZmQ4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9kb3VibGVfY3Bkby5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICAgIE5ldFdpbmRlciBGbG9hdGluZyBQb2ludCBFbXVsYXRvcgorICAgIChjKSBSZWJlbC5DT00sIDE5OTgsMTk5OQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgImZwYTExLmgiCisjaW5jbHVkZSAic29mdGZsb2F0LmgiCisjaW5jbHVkZSAiZnBvcGNvZGUuaCIKKwordW5pb24gZmxvYXQ2NF9jb21wb25lbnRzIHsKKwlmbG9hdDY0IGY2NDsKKwl1bnNpZ25lZCBpbnQgaVsyXTsKK307CisKK2Zsb2F0NjQgZmxvYXQ2NF9leHAoZmxvYXQ2NCBGbSk7CitmbG9hdDY0IGZsb2F0NjRfbG4oZmxvYXQ2NCBGbSk7CitmbG9hdDY0IGZsb2F0NjRfc2luKGZsb2F0NjQgckZtKTsKK2Zsb2F0NjQgZmxvYXQ2NF9jb3MoZmxvYXQ2NCByRm0pOworZmxvYXQ2NCBmbG9hdDY0X2FyY3NpbihmbG9hdDY0IHJGbSk7CitmbG9hdDY0IGZsb2F0NjRfYXJjdGFuKGZsb2F0NjQgckZtKTsKK2Zsb2F0NjQgZmxvYXQ2NF9sb2coZmxvYXQ2NCByRm0pOworZmxvYXQ2NCBmbG9hdDY0X3RhbihmbG9hdDY0IHJGbSk7CitmbG9hdDY0IGZsb2F0NjRfYXJjY29zKGZsb2F0NjQgckZtKTsKK2Zsb2F0NjQgZmxvYXQ2NF9wb3coZmxvYXQ2NCByRm4sIGZsb2F0NjQgckZtKTsKK2Zsb2F0NjQgZmxvYXQ2NF9wb2woZmxvYXQ2NCByRm4sIGZsb2F0NjQgckZtKTsKKworc3RhdGljIGZsb2F0NjQgZmxvYXQ2NF9yc2YoZmxvYXQ2NCByRm4sIGZsb2F0NjQgckZtKQoreworCXJldHVybiBmbG9hdDY0X3N1YihyRm0sIHJGbik7Cit9CisKK3N0YXRpYyBmbG9hdDY0IGZsb2F0NjRfcmR2KGZsb2F0NjQgckZuLCBmbG9hdDY0IHJGbSkKK3sKKwlyZXR1cm4gZmxvYXQ2NF9kaXYockZtLCByRm4pOworfQorCitzdGF0aWMgZmxvYXQ2NCAoKmNvbnN0IGR5YWRpY19kb3VibGVbMTZdKShmbG9hdDY0IHJGbiwgZmxvYXQ2NCByRm0pID0geworCVtBREZfQ09ERSA+PiAyMF0gPSBmbG9hdDY0X2FkZCwKKwlbTVVGX0NPREUgPj4gMjBdID0gZmxvYXQ2NF9tdWwsCisJW1NVRl9DT0RFID4+IDIwXSA9IGZsb2F0NjRfc3ViLAorCVtSU0ZfQ09ERSA+PiAyMF0gPSBmbG9hdDY0X3JzZiwKKwlbRFZGX0NPREUgPj4gMjBdID0gZmxvYXQ2NF9kaXYsCisJW1JERl9DT0RFID4+IDIwXSA9IGZsb2F0NjRfcmR2LAorCVtSTUZfQ09ERSA+PiAyMF0gPSBmbG9hdDY0X3JlbSwKKworCS8qIHN0cmljdGx5LCB0aGVzZSBvcGNvZGVzIHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQgKi8KKwlbRk1MX0NPREUgPj4gMjBdID0gZmxvYXQ2NF9tdWwsCisJW0ZEVl9DT0RFID4+IDIwXSA9IGZsb2F0NjRfZGl2LAorCVtGUkRfQ09ERSA+PiAyMF0gPSBmbG9hdDY0X3JkdiwKK307CisKK3N0YXRpYyBmbG9hdDY0IGZsb2F0NjRfbXZmKGZsb2F0NjQgckZtKQoreworCXJldHVybiByRm07Cit9CisKK3N0YXRpYyBmbG9hdDY0IGZsb2F0NjRfbW5mKGZsb2F0NjQgckZtKQoreworCXVuaW9uIGZsb2F0NjRfY29tcG9uZW50cyB1OworCisJdS5mNjQgPSByRm07CisjaWZkZWYgX19BUk1FQl9fCisJdS5pWzBdIF49IDB4ODAwMDAwMDA7CisjZWxzZQorCXUuaVsxXSBePSAweDgwMDAwMDAwOworI2VuZGlmCisKKwlyZXR1cm4gdS5mNjQ7Cit9CisKK3N0YXRpYyBmbG9hdDY0IGZsb2F0NjRfYWJzKGZsb2F0NjQgckZtKQoreworCXVuaW9uIGZsb2F0NjRfY29tcG9uZW50cyB1OworCisJdS5mNjQgPSByRm07CisjaWZkZWYgX19BUk1FQl9fCisJdS5pWzBdICY9IDB4N2ZmZmZmZmY7CisjZWxzZQorCXUuaVsxXSAmPSAweDdmZmZmZmZmOworI2VuZGlmCisKKwlyZXR1cm4gdS5mNjQ7Cit9CisKK3N0YXRpYyBmbG9hdDY0ICgqY29uc3QgbW9uYWRpY19kb3VibGVbMTZdKShmbG9hdDY0IHJGbSkgPSB7CisJW01WRl9DT0RFID4+IDIwXSA9IGZsb2F0NjRfbXZmLAorCVtNTkZfQ09ERSA+PiAyMF0gPSBmbG9hdDY0X21uZiwKKwlbQUJTX0NPREUgPj4gMjBdID0gZmxvYXQ2NF9hYnMsCisJW1JORF9DT0RFID4+IDIwXSA9IGZsb2F0NjRfcm91bmRfdG9faW50LAorCVtVUkRfQ09ERSA+PiAyMF0gPSBmbG9hdDY0X3JvdW5kX3RvX2ludCwKKwlbU1FUX0NPREUgPj4gMjBdID0gZmxvYXQ2NF9zcXJ0LAorCVtOUk1fQ09ERSA+PiAyMF0gPSBmbG9hdDY0X212ZiwKK307CisKK3Vuc2lnbmVkIGludCBEb3VibGVDUERPKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUsIEZQUkVHICogckZkKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCWZsb2F0NjQgckZtOworCXVuc2lnbmVkIGludCBGbSwgb3BjX21hc2tfc2hpZnQ7CisKKwlGbSA9IGdldEZtKG9wY29kZSk7CisJaWYgKENPTlNUQU5UX0ZNKG9wY29kZSkpIHsKKwkJckZtID0gZ2V0RG91YmxlQ29uc3RhbnQoRm0pOworCX0gZWxzZSB7CisJCXN3aXRjaCAoZnBhMTEtPmZUeXBlW0ZtXSkgeworCQljYXNlIHR5cGVTaW5nbGU6CisJCQlyRm0gPSBmbG9hdDMyX3RvX2Zsb2F0NjQoZnBhMTEtPmZwcmVnW0ZtXS5mU2luZ2xlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdHlwZURvdWJsZToKKwkJCXJGbSA9IGZwYTExLT5mcHJlZ1tGbV0uZkRvdWJsZTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCW9wY19tYXNrX3NoaWZ0ID0gKG9wY29kZSAmIE1BU0tfQVJJVEhNRVRJQ19PUENPREUpID4+IDIwOworCWlmICghTU9OQURJQ19JTlNUUlVDVElPTihvcGNvZGUpKSB7CisJCXVuc2lnbmVkIGludCBGbiA9IGdldEZuKG9wY29kZSk7CisJCWZsb2F0NjQgckZuOworCisJCXN3aXRjaCAoZnBhMTEtPmZUeXBlW0ZuXSkgeworCQljYXNlIHR5cGVTaW5nbGU6CisJCQlyRm4gPSBmbG9hdDMyX3RvX2Zsb2F0NjQoZnBhMTEtPmZwcmVnW0ZuXS5mU2luZ2xlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdHlwZURvdWJsZToKKwkJCXJGbiA9IGZwYTExLT5mcHJlZ1tGbl0uZkRvdWJsZTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChkeWFkaWNfZG91YmxlW29wY19tYXNrX3NoaWZ0XSkgeworCQkJckZkLT5mRG91YmxlID0gZHlhZGljX2RvdWJsZVtvcGNfbWFza19zaGlmdF0ockZuLCByRm0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobW9uYWRpY19kb3VibGVbb3BjX21hc2tfc2hpZnRdKSB7CisJCQlyRmQtPmZEb3VibGUgPSBtb25hZGljX2RvdWJsZVtvcGNfbWFza19zaGlmdF0ockZtKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9lbnRyeS5TIGIvYXJjaC9hcm0vbndmcGUvZW50cnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGMxM2JjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbndmcGUvZW50cnkuUwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAgICBOZXRXaW5kZXIgRmxvYXRpbmcgUG9pbnQgRW11bGF0b3IKKyAgICAoYykgUmViZWwuQ09NLCAxOTk4CisgICAgKGMpIDE5OTgsIDE5OTkgUGhpbGlwIEJsdW5kZWxsCisKKyAgICBEaXJlY3QgcXVlc3Rpb25zLCBjb21tZW50cyB0byBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKiBUaGlzIGlzIHRoZSBrZXJuZWwncyBlbnRyeSBwb2ludCBpbnRvIHRoZSBmbG9hdGluZyBwb2ludCBlbXVsYXRvci4KK0l0IGlzIGNhbGxlZCBmcm9tIHRoZSBrZXJuZWwgd2l0aCBjb2RlIHNpbWlsYXIgdG8gdGhpczoKKworCXN1YglyNCwgcjUsICM0CisJbGRydAlyMCwgW3I0XQkJCUAgcjAgID0gaW5zdHJ1Y3Rpb24KKwlhZHJzdmMJYWwsIHI5LCByZXRfZnJvbV9leGNlcHRpb24JQCByOSAgPSBub3JtYWwgRlAgcmV0dXJuCisJYWRyc3ZjCWFsLCBsciwgZnB1bmRlZmluc3RyCQlAIGxyICA9IHVuZGVmaW5lZCBpbnN0ciByZXR1cm4KKworCWdldF9jdXJyZW50X3Rhc2sgcjEwCisJbW92CXI4LCAjMQorCXN0cmIJcjgsIFtyMTAsICNUU0tfVVNFRF9NQVRIXQlAIHNldCBjdXJyZW50LT51c2VkX21hdGgKKwlhZGQJcjEwLCByMTAsICNUU1NfRlBFU0FWRQkJQCByMTAgPSB3b3Jrc3BhY2UKKwlsZHIJcjQsIC5MQzIKKwlsZHIJcGMsIFtyNF0JCQlAIENhbGwgRlAgZW11bGF0b3IgZW50cnkgcG9pbnQKKworVGhlIGtlcm5lbCBleHBlY3RzIHRoZSBlbXVsYXRvciB0byByZXR1cm4gdmlhIG9uZSBvZiB0d28gcG9zc2libGUKK3BvaW50cyBvZiByZXR1cm4gaXQgcGFzc2VzIHRvIHRoZSBlbXVsYXRvci4gIFRoZSBlbXVsYXRvciwgaWYKK3N1Y2Nlc3NmdWwgaW4gaXRzIGVtdWxhdGlvbiwganVtcHMgdG8gcmV0X2Zyb21fZXhjZXB0aW9uIChwYXNzZWQgaW4KK3I5KSBhbmQgdGhlIGtlcm5lbCB0YWtlcyBjYXJlIG9mIHJldHVybmluZyBjb250cm9sIGZyb20gdGhlIHRyYXAgdG8KK3RoZSB1c2VyIGNvZGUuICBJZiB0aGUgZW11bGF0b3IgaXMgdW5hYmxlIHRvIGVtdWxhdGUgdGhlIGluc3RydWN0aW9uLAoraXQgcmV0dXJucyB2aWEgX2ZwdW5kZWZpbnN0ciAocGFzc2VkIHZpYSBscikgYW5kIHRoZSBrZXJuZWwgaGFsdHMgdGhlCit1c2VyIHByb2dyYW0gd2l0aCBhIGNvcmUgZHVtcC4KKworT24gZW50cnkgdG8gdGhlIGVtdWxhdG9yIHIxMCBwb2ludHMgdG8gYW4gYXJlYSBvZiBwcml2YXRlIEZQIHdvcmtzcGFjZQorcmVzZXJ2ZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUgZm9yIHRoaXMgcHJvY2Vzcy4gIFRoaXMgaXMgd2hlcmUgdGhlCitlbXVsYXRvciBzYXZlcyBpdHMgcmVnaXN0ZXJzIGFjcm9zcyBjYWxscy4gIFRoZSBmaXJzdCB3b3JkIG9mIHRoaXMgYXJlYQoraXMgdXNlZCBhcyBhIGZsYWcgdG8gZGV0ZWN0IHRoZSBmaXJzdCB0aW1lIGEgcHJvY2VzcyB1c2VzIGZsb2F0aW5nIHBvaW50LAorc28gdGhhdCB0aGUgZW11bGF0b3Igc3RhcnR1cCBjb3N0IGNhbiBiZSBhdm9pZGVkIGZvciB0YXNrcyB0aGF0IGRvbid0Cit3YW50IGl0LgorCitUaGlzIHJvdXRpbmUgZG9lcyB0aHJlZSB0aGluZ3M6CisKKzEpIFRoZSBrZXJuZWwgaGFzIGNyZWF0ZWQgYSBzdHJ1Y3QgcHRfcmVncyBvbiB0aGUgc3RhY2sgYW5kIHNhdmVkIHRoZQordXNlciByZWdpc3RlcnMgaW50byBpdC4gIFNlZSAvdXNyL2luY2x1ZGUvYXNtL3Byb2MvcHRyYWNlLmggZm9yIGRldGFpbHMuCisKKzIpIEl0IGNhbGxzIEVtdWxhdGVBbGwgdG8gZW11bGF0ZSBhIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLgorRW11bGF0ZUFsbCByZXR1cm5zIDEgaWYgdGhlIGVtdWxhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3IgMCBpZiBub3QuCisKKzMpIElmIGFuIGluc3RydWN0aW9uIGhhcyBiZWVuIGVtdWxhdGVkIHN1Y2Nlc3NmdWxseSwgaXQgbG9va3MgYWhlYWQgYXQKK3RoZSBuZXh0IGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiwgaXQKK2V4ZWN1dGVzIHRoZSBpbnN0cnVjdGlvbiwgd2l0aG91dCByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4gIEluIHRoaXMKK3dheSBpdCByZXBlYXRlZGx5IGxvb2tzIGFoZWFkIGFuZCBleGVjdXRlcyBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKK3VudGlsIGl0IGVuY291bnRlcnMgYSBub24gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24sIGF0IHdoaWNoIHRpbWUgaXQKK3JldHVybnMgdmlhIF9mcHJldHVybi4KKworVGhpcyBpcyBkb25lIHRvIHJlZHVjZSB0aGUgZWZmZWN0IG9mIHRoZSB0cmFwIG92ZXJoZWFkIG9uIGVhY2gKK2Zsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gIEdDQyBhdHRlbXB0cyB0byBncm91cCBmbG9hdGluZyBwb2ludAoraW5zdHJ1Y3Rpb25zIHRvIGFsbG93IHRoZSBlbXVsYXRvciB0byBzcHJlYWQgdGhlIGNvc3Qgb2YgdGhlIHRyYXAgb3Zlcgorc2V2ZXJhbCBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICAqLworCisJLmdsb2JsCW53ZnBlX2VudGVyCitud2ZwZV9lbnRlcjoKKwltb3YJcjQsIGxyCQkJQCBzYXZlIHRoZSBmYWlsdXJlLXJldHVybiBhZGRyZXNzZXMKKwltb3YJc2wsIHNwCQkJQCB3ZSBhY2Nlc3MgdGhlIHJlZ2lzdGVycyB2aWEgJ3NsJworCisJbGRyCXI1LCBbc3AsICM2MF0JCUAgZ2V0IGNvbnRlbnRzIG9mIFBDOworZW11bGF0ZToKKwlibAlFbXVsYXRlQWxsCQlAIGVtdWxhdGUgdGhlIGluc3RydWN0aW9uCisJY21wCXIwLCAjMAkJCUAgd2FzIGVtdWxhdGlvbiBzdWNjZXNzZnVsCisJbW92ZXEJcGMsIHI0CQkJQCBubywgcmV0dXJuIGZhaWx1cmUKKworbmV4dDoKKy5MeDE6CWxkcnQJcjYsIFtyNV0sICM0CQlAIGdldCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBhbmQKKwkJCQkJQCBpbmNyZW1lbnQgUEMKKworCWFuZAlyMiwgcjYsICMweDBGMDAwMDAwCUAgdGVzdCBmb3IgRlAgaW5zbnMKKwl0ZXEJcjIsICMweDBDMDAwMDAwCisJdGVxbmUJcjIsICMweDBEMDAwMDAwCisJdGVxbmUJcjIsICMweDBFMDAwMDAwCisJbW92bmUJcGMsIHI5CQkJQCByZXR1cm4gb2sgaWYgbm90IGEgZnAgaW5zbgorCisJc3RyCXI1LCBbc3AsICM2MF0JCUAgdXBkYXRlIFBDIGNvcHkgaW4gcmVncworCisJbW92CXIwLCByNgkJCUAgc2F2ZSBhIGNvcHkKKwlsZHIJcjEsIFtzcCwgIzY0XQkJQCBmZXRjaCB0aGUgY29uZGl0aW9uIGNvZGVzCisJYmwJY2hlY2tDb25kaXRpb24JCUAgY2hlY2sgdGhlIGNvbmRpdGlvbgorCWNtcAlyMCwgIzAJCQlAIHIwID0gMCA9PT4gY29uZGl0aW9uIGZhaWxlZAorCisJQCBpZiBjb25kaXRpb24gY29kZSBmYWlsZWQgdG8gbWF0Y2gsIG5leHQgaW5zbgorCWJlcQluZXh0CQkJQCBnZXQgdGhlIG5leHQgaW5zdHJ1Y3Rpb247CisKKwltb3YJcjAsIHI2CQkJQCBwcmVwYXJlIGZvciBFbXVsYXRlQWxsKCkKKwliCWVtdWxhdGUJCQlAIGlmIHIwICE9IDAsIGdvdG8gRW11bGF0ZUFsbAorCisJQCBXZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciB0aGUgaW5zdHJ1Y3Rpb25zIGF0IC5MeDEgYW5kIC5MeDIgCisJQCB0byBmYXVsdC4gIEVtaXQgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBndW5rIHRvIGZpeCB0aGluZ3MgdXAuCisJQCA/Pz8gRm9yIHNvbWUgcmVhc29uLCBmYXVsdHMgY2FuIGhhcHBlbiBhdCAuTHgyIGV2ZW4gd2l0aCBhCisJQCBwbGFpbiBMRFIgaW5zdHJ1Y3Rpb24uICBXZWlyZCwgYnV0IGl0IHNlZW1zIGhhcm1sZXNzLgorCS5zZWN0aW9uIC5maXh1cCwiYXgiCisJLmFsaWduCTIKKy5MZml4Ogltb3YJcGMsIHI5CQkJQCBsZXQgdGhlIHVzZXIgZWF0IHNlZ2ZhdWx0cworCS5wcmV2aW91cworCisJLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24JMworCS5sb25nCS5MeDEsIC5MZml4CisJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9lbnRyeTI2LlMgYi9hcmNoL2FybS9ud2ZwZS9lbnRyeTI2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkMzhiMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL2VudHJ5MjYuUwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAgICBOZXRXaW5kZXIgRmxvYXRpbmcgUG9pbnQgRW11bGF0b3IKKyAgICAoYykgUmViZWwuQ09NLCAxOTk4CisgICAgKGMpIFBoaWxpcCBCbHVuZGVsbCAxOTk4LTE5OTkKKworICAgIERpcmVjdCBxdWVzdGlvbnMsIGNvbW1lbnRzIHRvIFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQG5ldHdpbmRlci5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisKKy8qIFRoaXMgaXMgdGhlIGtlcm5lbCdzIGVudHJ5IHBvaW50IGludG8gdGhlIGZsb2F0aW5nIHBvaW50IGVtdWxhdG9yLgorSXQgaXMgY2FsbGVkIGZyb20gdGhlIGtlcm5lbCB3aXRoIGNvZGUgc2ltaWxhciB0byB0aGlzOgorCisJbW92CWZwLCAjMAorCXRlcXAJcGMsICNQU1JfSV9CSVQgfCBNT0RFX1NWQworCWxkcglyNCwgLkxDMgorCWxkcglwYywgW3I0XQkJQCBDYWxsIEZQIG1vZHVsZSBVU1IgZW50cnkgcG9pbnQKKworVGhlIGtlcm5lbCBleHBlY3RzIHRoZSBlbXVsYXRvciB0byByZXR1cm4gdmlhIG9uZSBvZiB0d28gcG9zc2libGUKK3BvaW50cyBvZiByZXR1cm4gaXQgcGFzc2VzIHRvIHRoZSBlbXVsYXRvci4gIFRoZSBlbXVsYXRvciwgaWYKK3N1Y2Nlc3NmdWwgaW4gaXRzIGVtdWxhdGlvbiwganVtcHMgdG8gcmV0X2Zyb21fZXhjZXB0aW9uIGFuZCB0aGUKK2tlcm5lbCB0YWtlcyBjYXJlIG9mIHJldHVybmluZyBjb250cm9sIGZyb20gdGhlIHRyYXAgdG8gdGhlIHVzZXIgY29kZS4KK0lmIHRoZSBlbXVsYXRvciBpcyB1bmFibGUgdG8gZW11bGF0ZSB0aGUgaW5zdHJ1Y3Rpb24sIGl0IHJldHVybnMgdG8KK2ZwdW5kZWZpbnN0ciBhbmQgdGhlIGtlcm5lbCBoYWx0cyB0aGUgdXNlciBwcm9ncmFtIHdpdGggYSBjb3JlIGR1bXAuCisKK1RoaXMgcm91dGluZSBkb2VzIGZvdXIgdGhpbmdzOgorCisxKSBJdCBzYXZlcyBTUCBpbnRvIGEgdmFyaWFibGUgY2FsbGVkIHVzZXJSZWdpc3RlcnMuICBUaGUga2VybmVsIGhhcworY3JlYXRlZCBhIHN0cnVjdCBwdF9yZWdzIG9uIHRoZSBzdGFjayBhbmQgc2F2ZWQgdGhlIHVzZXIgcmVnaXN0ZXJzCitpbnRvIGl0LiAgU2VlIC91c3IvaW5jbHVkZS9hc20vcHJvYy9wdHJhY2UuaCBmb3IgZGV0YWlscy4gIFRoZQorZW11bGF0b3IgY29kZSB1c2VzIHVzZXJSZWdpc3RlcnMgYXMgdGhlIGJhc2Ugb2YgYW4gYXJyYXkgb2Ygd29yZHMgZnJvbQord2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlcnMgY2FuIGJlIGV4dHJhY3RlZC4KKworMikgSXQgbG9jYXRlcyB0aGUgRlAgZW11bGF0b3Igd29yayBhcmVhIHdpdGhpbiB0aGUgVFNTIHN0cnVjdHVyZSBhbmQKK3BvaW50cyBgZnBhMTEnIHRvIGl0LgorCiszKSBJdCBjYWxscyBFbXVsYXRlQWxsIHRvIGVtdWxhdGUgYSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4KK0VtdWxhdGVBbGwgcmV0dXJucyAxIGlmIHRoZSBlbXVsYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG9yIDAgaWYgbm90LgorCis0KSBJZiBhbiBpbnN0cnVjdGlvbiBoYXMgYmVlbiBlbXVsYXRlZCBzdWNjZXNzZnVsbHksIGl0IGxvb2tzIGFoZWFkIGF0Cit0aGUgbmV4dCBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGEgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24sIGl0CitleGVjdXRlcyB0aGUgaW5zdHJ1Y3Rpb24sIHdpdGhvdXQgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuICBJbiB0aGlzCit3YXkgaXQgcmVwZWF0ZWRseSBsb29rcyBhaGVhZCBhbmQgZXhlY3V0ZXMgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zCit1bnRpbCBpdCBlbmNvdW50ZXJzIGEgbm9uIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLCBhdCB3aGljaCB0aW1lIGl0CityZXR1cm5zIHZpYSBfZnByZXR1cm4uCisKK1RoaXMgaXMgZG9uZSB0byByZWR1Y2UgdGhlIGVmZmVjdCBvZiB0aGUgdHJhcCBvdmVyaGVhZCBvbiBlYWNoCitmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBHQ0MgYXR0ZW1wdHMgdG8gZ3JvdXAgZmxvYXRpbmcgcG9pbnQKK2luc3RydWN0aW9ucyB0byBhbGxvdyB0aGUgZW11bGF0b3IgdG8gc3ByZWFkIHRoZSBjb3N0IG9mIHRoZSB0cmFwIG92ZXIKK3NldmVyYWwgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLiAgKi8KKworCS5nbG9ibAlud2ZwZV9lbnRlcgorbndmcGVfZW50ZXI6CisJbW92CXNsLCBzcAorCWxkcglyNSwgW3NwLCAjNjBdCQlAIGdldCBjb250ZW50cyBvZiBQQworCWJpYwlyNSwgcjUsICMweGZjMDAwMDAzCisJbGRyCXIwLCBbcjUsICMtNF0JCUAgZ2V0IGFjdHVhbCBpbnN0cnVjdGlvbiBpbnRvIHIwCisJYmwJRW11bGF0ZUFsbAkJQCBlbXVsYXRlIHRoZSBpbnN0cnVjdGlvbgorMToJY21wCXIwLCAjMAkJCUAgd2FzIGVtdWxhdGlvbiBzdWNjZXNzZnVsCisJYmVxCWZwdW5kZWZpbnN0cgkJQCBubywgcmV0dXJuIGZhaWx1cmUKKworbmV4dDoKKy5MeDE6CWxkcnQJcjYsIFtyNV0sICM0CQlAIGdldCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBhbmQKKwkJCQkJQCBpbmNyZW1lbnQgUEMKKworCWFuZAlyMiwgcjYsICMweDBGMDAwMDAwCUAgdGVzdCBmb3IgRlAgaW5zbnMKKwl0ZXEJcjIsICMweDBDMDAwMDAwCisJdGVxbmUJcjIsICMweDBEMDAwMDAwCisJdGVxbmUJcjIsICMweDBFMDAwMDAwCisJYm5lCXJldF9mcm9tX2V4Y2VwdGlvbglAIHJldHVybiBvayBpZiBub3QgYSBmcCBpbnNuCisKKwlsZHIJcjksIFtzcCwgIzYwXQkJQCBnZXQgbmV3IGNvbmRpdGlvbiBjb2RlcworCWFuZAlyOSwgcjksICMweGZjMDAwMDAzCisJb3JyCXI3LCByNSwgcjkKKwlzdHIJcjcsIFtzcCwgIzYwXQkJQCB1cGRhdGUgUEMgY29weSBpbiByZWdzCisKKwltb3YJcjAsIHI2CQkJQCBzYXZlIGEgY29weQorCW1vdglyMSwgcjkJCQlAIGZldGNoIHRoZSBjb25kaXRpb24gY29kZXMKKwlibAljaGVja0NvbmRpdGlvbgkJQCBjaGVjayB0aGUgY29uZGl0aW9uCisJY21wCXIwLCAjMAkJCUAgcjAgPSAwID09PiBjb25kaXRpb24gZmFpbGVkCisKKwlAIGlmIGNvbmRpdGlvbiBjb2RlIGZhaWxlZCB0byBtYXRjaCwgbmV4dCBpbnNuCisJYmVxCW5leHQJCQlAIGdldCB0aGUgbmV4dCBpbnN0cnVjdGlvbjsKKworCW1vdglyMCwgcjYJCQlAIHByZXBhcmUgZm9yIEVtdWxhdGVBbGwoKQorCWFkcglsciwgMWIKKwlvcnIJbHIsIGxyLCAjMworCWIJRW11bGF0ZUFsbAkJQCBpZiByMCAhPSAwLCBnb3RvIEVtdWxhdGVBbGwKKworLkxyZXQ6CWIJcmV0X2Zyb21fZXhjZXB0aW9uCUAgbGV0IHRoZSB1c2VyIGVhdCBzZWdmYXVsdHMKKwkKKwlAIFdlIG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yIHRoZSBpbnN0cnVjdGlvbiBhdCAuTHgxIHRvIGZhdWx0LgorCUAgRW1pdCB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIGd1bmsgdG8gZml4IHRoaW5ncyB1cC4KKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbgkzCisJLmxvbmcJLkx4MQorCWxkcglsciwgW2xyLCAkKC5McmV0IC0gLkx4MSkvNF0KKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL2V4dGVuZGVkX2NwZG8uYyBiL2FyY2gvYXJtL253ZnBlL2V4dGVuZGVkX2NwZG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzlmNjhhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbndmcGUvZXh0ZW5kZWRfY3Bkby5jCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICAgIE5ldFdpbmRlciBGbG9hdGluZyBQb2ludCBFbXVsYXRvcgorICAgIChjKSBSZWJlbC5DT00sIDE5OTgsMTk5OQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgImZwYTExLmgiCisjaW5jbHVkZSAic29mdGZsb2F0LmgiCisjaW5jbHVkZSAiZnBvcGNvZGUuaCIKKworZmxvYXR4ODAgZmxvYXR4ODBfZXhwKGZsb2F0eDgwIEZtKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX2xuKGZsb2F0eDgwIEZtKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX3NpbihmbG9hdHg4MCByRm0pOworZmxvYXR4ODAgZmxvYXR4ODBfY29zKGZsb2F0eDgwIHJGbSk7CitmbG9hdHg4MCBmbG9hdHg4MF9hcmNzaW4oZmxvYXR4ODAgckZtKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX2FyY3RhbihmbG9hdHg4MCByRm0pOworZmxvYXR4ODAgZmxvYXR4ODBfbG9nKGZsb2F0eDgwIHJGbSk7CitmbG9hdHg4MCBmbG9hdHg4MF90YW4oZmxvYXR4ODAgckZtKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX2FyY2NvcyhmbG9hdHg4MCByRm0pOworZmxvYXR4ODAgZmxvYXR4ODBfcG93KGZsb2F0eDgwIHJGbiwgZmxvYXR4ODAgckZtKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX3BvbChmbG9hdHg4MCByRm4sIGZsb2F0eDgwIHJGbSk7CisKK3N0YXRpYyBmbG9hdHg4MCBmbG9hdHg4MF9yc2YoZmxvYXR4ODAgckZuLCBmbG9hdHg4MCByRm0pCit7CisJcmV0dXJuIGZsb2F0eDgwX3N1YihyRm0sIHJGbik7Cit9CisKK3N0YXRpYyBmbG9hdHg4MCBmbG9hdHg4MF9yZHYoZmxvYXR4ODAgckZuLCBmbG9hdHg4MCByRm0pCit7CisJcmV0dXJuIGZsb2F0eDgwX2RpdihyRm0sIHJGbik7Cit9CisKK3N0YXRpYyBmbG9hdHg4MCAoKmNvbnN0IGR5YWRpY19leHRlbmRlZFsxNl0pKGZsb2F0eDgwIHJGbiwgZmxvYXR4ODAgckZtKSA9IHsKKwlbQURGX0NPREUgPj4gMjBdID0gZmxvYXR4ODBfYWRkLAorCVtNVUZfQ09ERSA+PiAyMF0gPSBmbG9hdHg4MF9tdWwsCisJW1NVRl9DT0RFID4+IDIwXSA9IGZsb2F0eDgwX3N1YiwKKwlbUlNGX0NPREUgPj4gMjBdID0gZmxvYXR4ODBfcnNmLAorCVtEVkZfQ09ERSA+PiAyMF0gPSBmbG9hdHg4MF9kaXYsCisJW1JERl9DT0RFID4+IDIwXSA9IGZsb2F0eDgwX3JkdiwKKwlbUk1GX0NPREUgPj4gMjBdID0gZmxvYXR4ODBfcmVtLAorCisJLyogc3RyaWN0bHksIHRoZXNlIG9wY29kZXMgc2hvdWxkIG5vdCBiZSBpbXBsZW1lbnRlZCAqLworCVtGTUxfQ09ERSA+PiAyMF0gPSBmbG9hdHg4MF9tdWwsCisJW0ZEVl9DT0RFID4+IDIwXSA9IGZsb2F0eDgwX2RpdiwKKwlbRlJEX0NPREUgPj4gMjBdID0gZmxvYXR4ODBfcmR2LAorfTsKKworc3RhdGljIGZsb2F0eDgwIGZsb2F0eDgwX212ZihmbG9hdHg4MCByRm0pCit7CisJcmV0dXJuIHJGbTsKK30KKworc3RhdGljIGZsb2F0eDgwIGZsb2F0eDgwX21uZihmbG9hdHg4MCByRm0pCit7CisJckZtLmhpZ2ggXj0gMHg4MDAwOworCXJldHVybiByRm07Cit9CisKK3N0YXRpYyBmbG9hdHg4MCBmbG9hdHg4MF9hYnMoZmxvYXR4ODAgckZtKQoreworCXJGbS5oaWdoICY9IDB4N2ZmZjsKKwlyZXR1cm4gckZtOworfQorCitzdGF0aWMgZmxvYXR4ODAgKCpjb25zdCBtb25hZGljX2V4dGVuZGVkWzE2XSkoZmxvYXR4ODAgckZtKSA9IHsKKwlbTVZGX0NPREUgPj4gMjBdID0gZmxvYXR4ODBfbXZmLAorCVtNTkZfQ09ERSA+PiAyMF0gPSBmbG9hdHg4MF9tbmYsCisJW0FCU19DT0RFID4+IDIwXSA9IGZsb2F0eDgwX2FicywKKwlbUk5EX0NPREUgPj4gMjBdID0gZmxvYXR4ODBfcm91bmRfdG9faW50LAorCVtVUkRfQ09ERSA+PiAyMF0gPSBmbG9hdHg4MF9yb3VuZF90b19pbnQsCisJW1NRVF9DT0RFID4+IDIwXSA9IGZsb2F0eDgwX3NxcnQsCisJW05STV9DT0RFID4+IDIwXSA9IGZsb2F0eDgwX212ZiwKK307CisKK3Vuc2lnbmVkIGludCBFeHRlbmRlZENQRE8oY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSwgRlBSRUcgKiByRmQpCit7CisJRlBBMTEgKmZwYTExID0gR0VUX0ZQQTExKCk7CisJZmxvYXR4ODAgckZtOworCXVuc2lnbmVkIGludCBGbSwgb3BjX21hc2tfc2hpZnQ7CisKKwlGbSA9IGdldEZtKG9wY29kZSk7CisJaWYgKENPTlNUQU5UX0ZNKG9wY29kZSkpIHsKKwkJckZtID0gZ2V0RXh0ZW5kZWRDb25zdGFudChGbSk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmcGExMS0+ZlR5cGVbRm1dKSB7CisJCWNhc2UgdHlwZVNpbmdsZToKKwkJCXJGbSA9IGZsb2F0MzJfdG9fZmxvYXR4ODAoZnBhMTEtPmZwcmVnW0ZtXS5mU2luZ2xlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdHlwZURvdWJsZToKKwkJCXJGbSA9IGZsb2F0NjRfdG9fZmxvYXR4ODAoZnBhMTEtPmZwcmVnW0ZtXS5mRG91YmxlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdHlwZUV4dGVuZGVkOgorCQkJckZtID0gZnBhMTEtPmZwcmVnW0ZtXS5mRXh0ZW5kZWQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlvcGNfbWFza19zaGlmdCA9IChvcGNvZGUgJiBNQVNLX0FSSVRITUVUSUNfT1BDT0RFKSA+PiAyMDsKKwlpZiAoIU1PTkFESUNfSU5TVFJVQ1RJT04ob3Bjb2RlKSkgeworCQl1bnNpZ25lZCBpbnQgRm4gPSBnZXRGbihvcGNvZGUpOworCQlmbG9hdHg4MCByRm47CisKKwkJc3dpdGNoIChmcGExMS0+ZlR5cGVbRm5dKSB7CisJCWNhc2UgdHlwZVNpbmdsZToKKwkJCXJGbiA9IGZsb2F0MzJfdG9fZmxvYXR4ODAoZnBhMTEtPmZwcmVnW0ZuXS5mU2luZ2xlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdHlwZURvdWJsZToKKwkJCXJGbiA9IGZsb2F0NjRfdG9fZmxvYXR4ODAoZnBhMTEtPmZwcmVnW0ZuXS5mRG91YmxlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdHlwZUV4dGVuZGVkOgorCQkJckZuID0gZnBhMTEtPmZwcmVnW0ZuXS5mRXh0ZW5kZWQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoZHlhZGljX2V4dGVuZGVkW29wY19tYXNrX3NoaWZ0XSkgeworCQkJckZkLT5mRXh0ZW5kZWQgPSBkeWFkaWNfZXh0ZW5kZWRbb3BjX21hc2tfc2hpZnRdKHJGbiwgckZtKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG1vbmFkaWNfZXh0ZW5kZWRbb3BjX21hc2tfc2hpZnRdKSB7CisJCQlyRmQtPmZFeHRlbmRlZCA9IG1vbmFkaWNfZXh0ZW5kZWRbb3BjX21hc2tfc2hpZnRdKHJGbSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBhMTEuYyBiL2FyY2gvYXJtL253ZnBlL2ZwYTExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MTY5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL2ZwYTExLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgICAgTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yCisgICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CisgICAgKGMpIFBoaWxpcCBCbHVuZGVsbCwgMjAwMQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgImZwYTExLmgiCisjaW5jbHVkZSAiZnBvcGNvZGUuaCIKKworI2luY2x1ZGUgImZwbW9kdWxlLmgiCisjaW5jbHVkZSAiZnBtb2R1bGUuaW5sIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCit1bnNpZ25lZCBpbnQgRW11bGF0ZUNQRE8oY29uc3QgdW5zaWduZWQgaW50KTsKK3Vuc2lnbmVkIGludCBFbXVsYXRlQ1BEVChjb25zdCB1bnNpZ25lZCBpbnQpOwordW5zaWduZWQgaW50IEVtdWxhdGVDUFJUKGNvbnN0IHVuc2lnbmVkIGludCk7CisKKy8qIFJlc2V0IHRoZSBGUEExMSBjaGlwLiAgQ2FsbGVkIHRvIGluaXRpYWxpemUgYW5kIHJlc2V0IHRoZSBlbXVsYXRvci4gKi8KK3N0YXRpYyB2b2lkIHJlc2V0RlBBMTEodm9pZCkKK3sKKwlpbnQgaTsKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKworCS8qIGluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIHR5cGUgYXJyYXkgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDc7IGkrKykgeworCQlmcGExMS0+ZlR5cGVbaV0gPSB0eXBlTm9uZTsKKwl9CisKKwkvKiBGUFNSOiBzZXQgc3lzdGVtIGlkIHRvIEZQX0VNVUxBVE9SLCBzZXQgQUMsIGNsZWFyIGFsbCBvdGhlciBiaXRzICovCisJZnBhMTEtPmZwc3IgPSBGUF9FTVVMQVRPUiB8IEJJVF9BQzsKK30KKwordm9pZCBTZXRSb3VuZGluZ01vZGUoY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSkKK3sKKwlzd2l0Y2ggKG9wY29kZSAmIE1BU0tfUk9VTkRJTkdfTU9ERSkgeworCWRlZmF1bHQ6CisJY2FzZSBST1VORF9UT19ORUFSRVNUOgorCQlmbG9hdF9yb3VuZGluZ19tb2RlID0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuOworCQlicmVhazsKKworCWNhc2UgUk9VTkRfVE9fUExVU19JTkZJTklUWToKKwkJZmxvYXRfcm91bmRpbmdfbW9kZSA9IGZsb2F0X3JvdW5kX3VwOworCQlicmVhazsKKworCWNhc2UgUk9VTkRfVE9fTUlOVVNfSU5GSU5JVFk6CisJCWZsb2F0X3JvdW5kaW5nX21vZGUgPSBmbG9hdF9yb3VuZF9kb3duOworCQlicmVhazsKKworCWNhc2UgUk9VTkRfVE9fWkVSTzoKKwkJZmxvYXRfcm91bmRpbmdfbW9kZSA9IGZsb2F0X3JvdW5kX3RvX3plcm87CisJCWJyZWFrOworCX0KK30KKwordm9pZCBTZXRSb3VuZGluZ1ByZWNpc2lvbihjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKQoreworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKKwlzd2l0Y2ggKG9wY29kZSAmIE1BU0tfUk9VTkRJTkdfUFJFQ0lTSU9OKSB7CisJY2FzZSBST1VORF9TSU5HTEU6CisJCWZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbiA9IDMyOworCQlicmVhazsKKworCWNhc2UgUk9VTkRfRE9VQkxFOgorCQlmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb24gPSA2NDsKKwkJYnJlYWs7CisKKwljYXNlIFJPVU5EX0VYVEVOREVEOgorCQlmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb24gPSA4MDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb24gPSA4MDsKKwl9CisjZW5kaWYKK30KKwordm9pZCBud2ZwZV9pbml0X2ZwYSh1bmlvbiBmcF9zdGF0ZSAqZnApCit7CisJRlBBMTEgKmZwYTExID0gKEZQQTExICopZnA7CisjaWZkZWYgTldGUEVfREVCVUcKKwlwcmludGsoIk5XRlBFOiBzZXR0aW5nIHVwIHN0YXRlLlxuIik7CisjZW5kaWYKKyAJbWVtc2V0KGZwYTExLCAwLCBzaXplb2YoRlBBMTEpKTsKKwlyZXNldEZQQTExKCk7CisJU2V0Um91bmRpbmdNb2RlKFJPVU5EX1RPX05FQVJFU1QpOworCVNldFJvdW5kaW5nUHJlY2lzaW9uKFJPVU5EX0VYVEVOREVEKTsKKwlmcGExMS0+aW5pdGZsYWcgPSAxOworfQorCisvKiBFbXVsYXRlIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgb3Bjb2RlLiAqLwordW5zaWduZWQgaW50IEVtdWxhdGVBbGwodW5zaWduZWQgaW50IG9wY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgY29kZTsKKworI2lmZGVmIE5XRlBFX0RFQlVHCisJcHJpbnRrKCJOV0ZQRTogZW11bGF0aW5nIG9wY29kZSAlMDh4XG4iLCBvcGNvZGUpOworI2VuZGlmCisJY29kZSA9IG9wY29kZSAmIDB4MDAwMDBmMDA7CisJaWYgKGNvZGUgPT0gMHgwMDAwMDEwMCB8fCBjb2RlID09IDB4MDAwMDAyMDApIHsKKwkJLyogRm9yIGNvcHJvY2Vzc29yIDEgb3IgMiAoRlBBMTEpICovCisJCWNvZGUgPSBvcGNvZGUgJiAweDBlMDAwMDAwOworCQlpZiAoY29kZSA9PSAweDBlMDAwMDAwKSB7CisJCQlpZiAob3Bjb2RlICYgMHgwMDAwMDAxMCkgeworCQkJCS8qIEVtdWxhdGUgY29udmVyc2lvbiBvcGNvZGVzLiAqLworCQkJCS8qIEVtdWxhdGUgcmVnaXN0ZXIgdHJhbnNmZXIgb3Bjb2Rlcy4gKi8KKwkJCQkvKiBFbXVsYXRlIGNvbXBhcmlzb24gb3Bjb2Rlcy4gKi8KKwkJCQlyZXR1cm4gRW11bGF0ZUNQUlQob3Bjb2RlKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRW11bGF0ZSBtb25hZGljIGFyaXRobWV0aWMgb3Bjb2Rlcy4gKi8KKwkJCQkvKiBFbXVsYXRlIGR5YWRpYyBhcml0aG1ldGljIG9wY29kZXMuICovCisJCQkJcmV0dXJuIEVtdWxhdGVDUERPKG9wY29kZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoY29kZSA9PSAweDBjMDAwMDAwKSB7CisJCQkvKiBFbXVsYXRlIGxvYWQvc3RvcmUgb3Bjb2Rlcy4gKi8KKwkJCS8qIEVtdWxhdGUgbG9hZC9zdG9yZSBtdWx0aXBsZSBvcGNvZGVzLiAqLworCQkJcmV0dXJuIEVtdWxhdGVDUERUKG9wY29kZSk7CisJCX0KKwl9CisKKwkvKiBJbnZhbGlkIGluc3RydWN0aW9uIGRldGVjdGVkLiAgUmV0dXJuIEZBTFNFLiAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBhMTEuaCBiL2FyY2gvYXJtL253ZnBlL2ZwYTExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjYzY1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL2ZwYTExLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAgICBOZXRXaW5kZXIgRmxvYXRpbmcgUG9pbnQgRW11bGF0b3IKKyAgICAoYykgUmViZWwuY29tLCAxOTk4LTE5OTkKKyAgICAKKyAgICBEaXJlY3QgcXVlc3Rpb25zLCBjb21tZW50cyB0byBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9fRlBBMTFfSF9fCisjZGVmaW5lIF9fRlBBMTFfSF9fCisKKyNkZWZpbmUgR0VUX0ZQQTExKCkgKChGUEExMSAqKSgmY3VycmVudF90aHJlYWRfaW5mbygpLT5mcHN0YXRlKSkKKworLyoKKyAqIFRoZSBwcm9jZXNzZXMgcmVnaXN0ZXJzIGFyZSBhbHdheXMgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSA4SworICogc3RhY2srdGFzayBzdHJ1Y3QuICBVc2UgdGhlIHNhbWUgbWV0aG9kIGFzICdjdXJyZW50JyB1c2VzIHRvCisgKiByZWFjaCB0aGVtLgorICovCityZWdpc3RlciB1bnNpZ25lZCBsb25nICp1c2VyX3JlZ2lzdGVycyBhc20oInNsIik7CisKKyNkZWZpbmUgR0VUX1VTRVJSRUcoKSAodXNlcl9yZWdpc3RlcnMpCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorCisvKiBpbmNsdWRlcyAqLworI2luY2x1ZGUgImZwc3IuaCIJCS8qIEZQIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIm1pbGlldS5oIgorI2luY2x1ZGUgInNvZnRmbG9hdC5oIgorCisjZGVmaW5lCQl0eXBlTm9uZQkJMHgwMAorI2RlZmluZQkJdHlwZVNpbmdsZQkJMHgwMQorI2RlZmluZQkJdHlwZURvdWJsZQkJMHgwMgorI2RlZmluZQkJdHlwZUV4dGVuZGVkCQkweDAzCisKKy8qCisgKiBUaGlzIG11c3QgYmUgbm8gbW9yZSBhbmQgbm8gbGVzcyB0aGFuIDEyIGJ5dGVzLgorICovCit0eXBlZGVmIHVuaW9uIHRhZ0ZQUkVHIHsKKwlmbG9hdDMyIGZTaW5nbGU7CisJZmxvYXQ2NCBmRG91YmxlOworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKKwlmbG9hdHg4MCBmRXh0ZW5kZWQ7CisjZWxzZQorCWludCBwYWRkaW5nWzNdOworI2VuZGlmCit9IEZQUkVHOworCisvKgorICogRlBBMTEgZGV2aWNlIG1vZGVsLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UuICBEbyBub3QgcmUtb3JkZXIuCisgKiBPbmx5IGFkZCBuZXcgc3R1ZmYgdG8gdGhlIGVuZCwgYW5kIGRvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YKKyAqIGFueSBlbGVtZW50LiAgRWxlbWVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIHVzZWQgYnkgdXNlcgorICogc3BhY2UsIGFuZCBtdXN0IG1hdGNoIHN0cnVjdCB1c2VyX2ZwIGluIGluY2x1ZGUvYXNtLWFybS91c2VyLmguCisgKiBXZSBpbmNsdWRlIHRoZSBieXRlIG9mZnNldHMgYmVsb3cgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMuCisgKgorICogVGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgYW5kIEZQUkVHIGFyZSBjaGVja2VkIGJ5IGZwbW9kdWxlLmMKKyAqIG9uIGluaXRpYWxpc2F0aW9uLiAgSWYgdGhlIHJ1bGVzIGhhdmUgYmVlbiBicm9rZW4sIE5XRlBFIHdpbGwKKyAqIG5vdCBpbml0aWFsaXNlLgorICovCit0eXBlZGVmIHN0cnVjdCB0YWdGUEExMSB7CisvKiAgIDAgKi8gRlBSRUcgZnByZWdbOF07CS8qIDggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisvKiAgOTYgKi8gRlBTUiBmcHNyOwkJLyogZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyICovCisvKiAxMDAgKi8gRlBDUiBmcGNyOwkJLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciAqLworLyogMTA0ICovIHVuc2lnbmVkIGNoYXIgZlR5cGVbOF07CS8qIHR5cGUgb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaGVsZCBpbgorCQkJCQkgICBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICBPbmUgb2YKKwkJCQkJICAgbm9uZSwgc2luZ2xlLCBkb3VibGUgb3IgZXh0ZW5kZWQuICovCisvKiAxMTIgKi8gaW50IGluaXRmbGFnOwkJLyogdGhpcyBpcyBzcGVjaWFsLiAgVGhlIGtlcm5lbCBndWFyYW50ZWVzCisJCQkJICAgdG8gc2V0IGl0IHRvIDAgd2hlbiBhIHRocmVhZCBpcyBsYXVuY2hlZCwKKwkJCQkgICBzbyB3ZSBjYW4gdXNlIGl0IHRvIGRldGVjdCB3aGV0aGVyIHRoaXMKKwkJCQkgICBpbnN0YW5jZSBvZiB0aGUgZW11bGF0b3IgbmVlZHMgdG8gYmUKKwkJCQkgICBpbml0aWFsaXNlZC4gKi8KK30gRlBBMTE7CisKK2V4dGVybiB2b2lkIFNldFJvdW5kaW5nTW9kZShjb25zdCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgU2V0Um91bmRpbmdQcmVjaXNpb24oY29uc3QgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIG53ZnBlX2luaXRfZnBhKHVuaW9uIGZwX3N0YXRlICpmcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBhMTEuaW5sIGIvYXJjaC9hcm0vbndmcGUvZnBhMTEuaW5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzNjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9mcGExMS5pbmwKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAgICBOZXRXaW5kZXIgRmxvYXRpbmcgUG9pbnQgRW11bGF0b3IKKyAgICAoYykgUmViZWwuQ09NLCAxOTk4LDE5OTkKKworICAgIERpcmVjdCBxdWVzdGlvbnMsIGNvbW1lbnRzIHRvIFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQG5ldHdpbmRlci5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlICJmcGExMS5oIgorCisvKiBSZWFkIGFuZCB3cml0ZSBmbG9hdGluZyBwb2ludCBzdGF0dXMgcmVnaXN0ZXIgKi8KK2V4dGVybiBfX2lubGluZV9fIHVuc2lnbmVkIGludCByZWFkRlBTUih2b2lkKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCXJldHVybiAoZnBhMTEtPmZwc3IpOworfQorCitleHRlcm4gX19pbmxpbmVfXyB2b2lkIHdyaXRlRlBTUihGUFNSIHJlZykKK3sKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKwkvKiB0aGUgc3lzaWQgYnl0ZSBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIGlzIHJlYWRvbmx5ICovCisJZnBhMTEtPmZwc3IgPSAoZnBhMTEtPmZwc3IgJiBNQVNLX1NZU0lEKSB8IChyZWcgJiB+TUFTS19TWVNJRCk7Cit9CisKKy8qIFJlYWQgYW5kIHdyaXRlIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIgKi8KK2V4dGVybiBfX2lubGluZV9fIEZQQ1IgcmVhZEZQQ1Iodm9pZCkKK3sKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKwkvKiBjbGVhciBTQiwgQUIgYW5kIERBIGJpdHMgYmVmb3JlIHJldHVybmluZyBGUENSICovCisJcmV0dXJuIChmcGExMS0+ZnBjciAmIH5NQVNLX1JGQyk7Cit9CisKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgd3JpdGVGUENSKEZQQ1IgcmVnKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCWZwYTExLT5mcGNyICY9IH5NQVNLX1dGQzsJCS8qIGNsZWFyIFNCLCBBQiBhbmQgREEgYml0cyAqLworCWZwYTExLT5mcGNyIHw9IChyZWcgJiBNQVNLX1dGQyk7CS8qIHdyaXRlIFNCLCBBQiBhbmQgREEgYml0cyAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBhMTFfY3Bkby5jIGIvYXJjaC9hcm0vbndmcGUvZnBhMTFfY3Bkby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZWE2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9mcGExMV9jcGRvLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgICAgTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yCisgICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CisgICAgKGMpIFBoaWxpcCBCbHVuZGVsbCwgMjAwMQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImZwYTExLmgiCisjaW5jbHVkZSAiZnBvcGNvZGUuaCIKKwordW5zaWduZWQgaW50IFNpbmdsZUNQRE8oY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSwgRlBSRUcgKiByRmQpOwordW5zaWduZWQgaW50IERvdWJsZUNQRE8oY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSwgRlBSRUcgKiByRmQpOwordW5zaWduZWQgaW50IEV4dGVuZGVkQ1BETyhjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlLCBGUFJFRyAqIHJGZCk7CisKK3Vuc2lnbmVkIGludCBFbXVsYXRlQ1BETyhjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCUZQUkVHICpyRmQ7CisJdW5zaWduZWQgaW50IG5UeXBlLCBuRGVzdCwgblJjOworCisJLyogR2V0IHRoZSBkZXN0aW5hdGlvbiBzaXplLiAgSWYgbm90IHZhbGlkIGxldCBMaW51eCBwZXJmb3JtCisJICAgYW4gaW52YWxpZCBpbnN0cnVjdGlvbiB0cmFwLiAqLworCW5EZXN0ID0gZ2V0RGVzdGluYXRpb25TaXplKG9wY29kZSk7CisJaWYgKHR5cGVOb25lID09IG5EZXN0KQorCQlyZXR1cm4gMDsKKworCVNldFJvdW5kaW5nTW9kZShvcGNvZGUpOworCisJLyogQ29tcGFyZSB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZHMgaW4gRm4gYW5kIEZtLgorCSAgIENob29zZSB0aGUgbGFyZ2VzdCBzaXplIGFuZCBwZXJmb3JtIG9wZXJhdGlvbnMgaW4gdGhhdCBzaXplLAorCSAgIGluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIGFsbCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBvcGVyYW5kcy4KKwkgICBJZiBGbSBpcyBhIGNvbnN0YW50LCB3ZSBqdXN0IGdyYWIgYSBjb25zdGFudCBvZiBhIHNpemUKKwkgICBtYXRjaGluZyB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZCBpbiBGbi4gKi8KKwlpZiAoTU9OQURJQ19JTlNUUlVDVElPTihvcGNvZGUpKQorCQluVHlwZSA9IG5EZXN0OworCWVsc2UKKwkJblR5cGUgPSBmcGExMS0+ZlR5cGVbZ2V0Rm4ob3Bjb2RlKV07CisKKwlpZiAoIUNPTlNUQU5UX0ZNKG9wY29kZSkpIHsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IEZtID0gZ2V0Rm0ob3Bjb2RlKTsKKwkJaWYgKG5UeXBlIDwgZnBhMTEtPmZUeXBlW0ZtXSkgeworCQkJblR5cGUgPSBmcGExMS0+ZlR5cGVbRm1dOworCQl9CisJfQorCisJckZkID0gJmZwYTExLT5mcHJlZ1tnZXRGZChvcGNvZGUpXTsKKworCXN3aXRjaCAoblR5cGUpIHsKKwljYXNlIHR5cGVTaW5nbGU6CisJCW5SYyA9IFNpbmdsZUNQRE8ob3Bjb2RlLCByRmQpOworCQlicmVhazsKKwljYXNlIHR5cGVEb3VibGU6CisJCW5SYyA9IERvdWJsZUNQRE8ob3Bjb2RlLCByRmQpOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfRlBFX05XRlBFX1hQCisJY2FzZSB0eXBlRXh0ZW5kZWQ6CisJCW5SYyA9IEV4dGVuZGVkQ1BETyhvcGNvZGUsIHJGZCk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJblJjID0gMDsKKwl9CisKKwkvKiBUaGUgQ1BETyBmdW5jdGlvbnMgdXNlZCB0byBhbHdheXMgc2V0IHRoZSBkZXN0aW5hdGlvbiB0eXBlCisJICAgdG8gYmUgdGhlIHNhbWUgYXMgdGhlaXIgd29ya2luZyBzaXplLiAqLworCisJaWYgKG5SYyAhPSAwKSB7CisJCS8qIElmIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLCBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3VsdCBpbiB0aGUKKwkJICAgZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgdGhlIGNvcnJlY3Qgc2l6ZS4gIElmIG5vdCBmb3JjZSBpdAorCQkgICB0byBiZS4gKi8KKworCQlmcGExMS0+ZlR5cGVbZ2V0RmQob3Bjb2RlKV0gPSBuRGVzdDsKKworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKKwkJaWYgKG5EZXN0ICE9IG5UeXBlKSB7CisJCQlzd2l0Y2ggKG5EZXN0KSB7CisJCQljYXNlIHR5cGVTaW5nbGU6CisJCQkJeworCQkJCQlpZiAodHlwZURvdWJsZSA9PSBuVHlwZSkKKwkJCQkJCXJGZC0+ZlNpbmdsZSA9IGZsb2F0NjRfdG9fZmxvYXQzMihyRmQtPmZEb3VibGUpOworCQkJCQllbHNlCisJCQkJCQlyRmQtPmZTaW5nbGUgPSBmbG9hdHg4MF90b19mbG9hdDMyKHJGZC0+ZkV4dGVuZGVkKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgdHlwZURvdWJsZToKKwkJCQl7CisJCQkJCWlmICh0eXBlU2luZ2xlID09IG5UeXBlKQorCQkJCQkJckZkLT5mRG91YmxlID0gZmxvYXQzMl90b19mbG9hdDY0KHJGZC0+ZlNpbmdsZSk7CisJCQkJCWVsc2UKKwkJCQkJCXJGZC0+ZkRvdWJsZSA9IGZsb2F0eDgwX3RvX2Zsb2F0NjQockZkLT5mRXh0ZW5kZWQpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSB0eXBlRXh0ZW5kZWQ6CisJCQkJeworCQkJCQlpZiAodHlwZVNpbmdsZSA9PSBuVHlwZSkKKwkJCQkJCXJGZC0+ZkV4dGVuZGVkID0gZmxvYXQzMl90b19mbG9hdHg4MChyRmQtPmZTaW5nbGUpOworCQkJCQllbHNlCisJCQkJCQlyRmQtPmZFeHRlbmRlZCA9IGZsb2F0NjRfdG9fZmxvYXR4ODAockZkLT5mRG91YmxlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbHNlCisJCWlmIChuRGVzdCAhPSBuVHlwZSkgeworCQkJaWYgKG5EZXN0ID09IHR5cGVTaW5nbGUpCisJCQkJckZkLT5mU2luZ2xlID0gZmxvYXQ2NF90b19mbG9hdDMyKHJGZC0+ZkRvdWJsZSk7CisJCQllbHNlCisJCQkJckZkLT5mRG91YmxlID0gZmxvYXQzMl90b19mbG9hdDY0KHJGZC0+ZlNpbmdsZSk7CisJCX0KKyNlbmRpZgorCX0KKworCXJldHVybiBuUmM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9mcGExMV9jcGR0LmMgYi9hcmNoL2FybS9ud2ZwZS9mcGExMV9jcGR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmYjYzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL2ZwYTExX2NwZHQuYwpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAgICBOZXRXaW5kZXIgRmxvYXRpbmcgUG9pbnQgRW11bGF0b3IKKyAgICAoYykgUmViZWwuY29tLCAxOTk4LTE5OTkKKyAgICAoYykgUGhpbGlwIEJsdW5kZWxsLCAxOTk4LCAyMDAxCisKKyAgICBEaXJlY3QgcXVlc3Rpb25zLCBjb21tZW50cyB0byBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZnBhMTEuaCIKKyNpbmNsdWRlICJzb2Z0ZmxvYXQuaCIKKyNpbmNsdWRlICJmcG9wY29kZS5oIgorI2luY2x1ZGUgImZwbW9kdWxlLmgiCisjaW5jbHVkZSAiZnBtb2R1bGUuaW5sIgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGxvYWRTaW5nbGUoY29uc3QgdW5zaWduZWQgaW50IEZuLCBjb25zdCB1bnNpZ25lZCBpbnQgX191c2VyICpwTWVtKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCWZwYTExLT5mVHlwZVtGbl0gPSB0eXBlU2luZ2xlOworCWdldF91c2VyKGZwYTExLT5mcHJlZ1tGbl0uZlNpbmdsZSwgcE1lbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkRG91YmxlKGNvbnN0IHVuc2lnbmVkIGludCBGbiwgY29uc3QgdW5zaWduZWQgaW50IF9fdXNlciAqcE1lbSkKK3sKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKwl1bnNpZ25lZCBpbnQgKnA7CisJcCA9ICh1bnNpZ25lZCBpbnQgKikgJmZwYTExLT5mcHJlZ1tGbl0uZkRvdWJsZTsKKwlmcGExMS0+ZlR5cGVbRm5dID0gdHlwZURvdWJsZTsKKyNpZmRlZiBfX0FSTUVCX18KKwlnZXRfdXNlcihwWzBdLCAmcE1lbVswXSk7CS8qIHNpZ24gJiBleHBvbmVudCAqLworCWdldF91c2VyKHBbMV0sICZwTWVtWzFdKTsKKyNlbHNlCisJZ2V0X3VzZXIocFswXSwgJnBNZW1bMV0pOworCWdldF91c2VyKHBbMV0sICZwTWVtWzBdKTsJLyogc2lnbiAmIGV4cG9uZW50ICovCisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkRXh0ZW5kZWQoY29uc3QgdW5zaWduZWQgaW50IEZuLCBjb25zdCB1bnNpZ25lZCBpbnQgX191c2VyICpwTWVtKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCXVuc2lnbmVkIGludCAqcDsKKwlwID0gKHVuc2lnbmVkIGludCAqKSAmZnBhMTEtPmZwcmVnW0ZuXS5mRXh0ZW5kZWQ7CisJZnBhMTEtPmZUeXBlW0ZuXSA9IHR5cGVFeHRlbmRlZDsKKwlnZXRfdXNlcihwWzBdLCAmcE1lbVswXSk7CS8qIHNpZ24gJiBleHBvbmVudCAqLworCWdldF91c2VyKHBbMV0sICZwTWVtWzJdKTsJLyogbHMgYml0cyAqLworCWdldF91c2VyKHBbMl0sICZwTWVtWzFdKTsJLyogbXMgYml0cyAqLworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkTXVsdGlwbGUoY29uc3QgdW5zaWduZWQgaW50IEZuLCBjb25zdCB1bnNpZ25lZCBpbnQgX191c2VyICpwTWVtKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCAqcDsKKwl1bnNpZ25lZCBsb25nIHg7CisKKwlwID0gKHVuc2lnbmVkIGludCAqKSAmKGZwYTExLT5mcHJlZ1tGbl0pOworCWdldF91c2VyKHgsICZwTWVtWzBdKTsKKwlmcGExMS0+ZlR5cGVbRm5dID0gKHggPj4gMTQpICYgMHgwMDAwMDAwMzsKKworCXN3aXRjaCAoZnBhMTEtPmZUeXBlW0ZuXSkgeworCWNhc2UgdHlwZVNpbmdsZToKKwljYXNlIHR5cGVEb3VibGU6CisJCXsKKwkJCWdldF91c2VyKHBbMF0sICZwTWVtWzJdKTsJLyogU2luZ2xlICovCisJCQlnZXRfdXNlcihwWzFdLCAmcE1lbVsxXSk7CS8qIGRvdWJsZSBtc3cgKi8KKwkJCXBbMl0gPSAwOwkJCS8qIGVtcHR5ICovCisJCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfRlBFX05XRlBFX1hQCisJY2FzZSB0eXBlRXh0ZW5kZWQ6CisJCXsKKwkJCWdldF91c2VyKHBbMV0sICZwTWVtWzJdKTsKKwkJCWdldF91c2VyKHBbMl0sICZwTWVtWzFdKTsJLyogbXN3ICovCisJCQlwWzBdID0gKHggJiAweDgwMDAzZmZmKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlU2luZ2xlKGNvbnN0IHVuc2lnbmVkIGludCBGbiwgdW5zaWduZWQgaW50IF9fdXNlciAqcE1lbSkKK3sKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKwl1bmlvbiB7CisJCWZsb2F0MzIgZjsKKwkJdW5zaWduZWQgaW50IGlbMV07CisJfSB2YWw7CisKKwlzd2l0Y2ggKGZwYTExLT5mVHlwZVtGbl0pIHsKKwljYXNlIHR5cGVEb3VibGU6CisJCXZhbC5mID0gZmxvYXQ2NF90b19mbG9hdDMyKGZwYTExLT5mcHJlZ1tGbl0uZkRvdWJsZSk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0ZQRV9OV0ZQRV9YUAorCWNhc2UgdHlwZUV4dGVuZGVkOgorCQl2YWwuZiA9IGZsb2F0eDgwX3RvX2Zsb2F0MzIoZnBhMTEtPmZwcmVnW0ZuXS5mRXh0ZW5kZWQpOworCQlicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJdmFsLmYgPSBmcGExMS0+ZnByZWdbRm5dLmZTaW5nbGU7CisJfQorCisJcHV0X3VzZXIodmFsLmlbMF0sIHBNZW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVEb3VibGUoY29uc3QgdW5zaWduZWQgaW50IEZuLCB1bnNpZ25lZCBpbnQgX191c2VyICpwTWVtKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCXVuaW9uIHsKKwkJZmxvYXQ2NCBmOworCQl1bnNpZ25lZCBpbnQgaVsyXTsKKwl9IHZhbDsKKworCXN3aXRjaCAoZnBhMTEtPmZUeXBlW0ZuXSkgeworCWNhc2UgdHlwZVNpbmdsZToKKwkJdmFsLmYgPSBmbG9hdDMyX3RvX2Zsb2F0NjQoZnBhMTEtPmZwcmVnW0ZuXS5mU2luZ2xlKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfRlBFX05XRlBFX1hQCisJY2FzZSB0eXBlRXh0ZW5kZWQ6CisJCXZhbC5mID0gZmxvYXR4ODBfdG9fZmxvYXQ2NChmcGExMS0+ZnByZWdbRm5dLmZFeHRlbmRlZCk7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQl2YWwuZiA9IGZwYTExLT5mcHJlZ1tGbl0uZkRvdWJsZTsKKwl9CisKKyNpZmRlZiBfX0FSTUVCX18KKwlwdXRfdXNlcih2YWwuaVswXSwgJnBNZW1bMF0pOwkvKiBtc3cgKi8KKwlwdXRfdXNlcih2YWwuaVsxXSwgJnBNZW1bMV0pOwkvKiBsc3cgKi8KKyNlbHNlCisJcHV0X3VzZXIodmFsLmlbMV0sICZwTWVtWzBdKTsJLyogbXN3ICovCisJcHV0X3VzZXIodmFsLmlbMF0sICZwTWVtWzFdKTsJLyogbHN3ICovCisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZUV4dGVuZGVkKGNvbnN0IHVuc2lnbmVkIGludCBGbiwgdW5zaWduZWQgaW50IF9fdXNlciAqcE1lbSkKK3sKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKwl1bmlvbiB7CisJCWZsb2F0eDgwIGY7CisJCXVuc2lnbmVkIGludCBpWzNdOworCX0gdmFsOworCisJc3dpdGNoIChmcGExMS0+ZlR5cGVbRm5dKSB7CisJY2FzZSB0eXBlU2luZ2xlOgorCQl2YWwuZiA9IGZsb2F0MzJfdG9fZmxvYXR4ODAoZnBhMTEtPmZwcmVnW0ZuXS5mU2luZ2xlKTsKKwkJYnJlYWs7CisKKwljYXNlIHR5cGVEb3VibGU6CisJCXZhbC5mID0gZmxvYXQ2NF90b19mbG9hdHg4MChmcGExMS0+ZnByZWdbRm5dLmZEb3VibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXZhbC5mID0gZnBhMTEtPmZwcmVnW0ZuXS5mRXh0ZW5kZWQ7CisJfQorCisJcHV0X3VzZXIodmFsLmlbMF0sICZwTWVtWzBdKTsJLyogc2lnbiAmIGV4cCAqLworCXB1dF91c2VyKHZhbC5pWzFdLCAmcE1lbVsyXSk7CisJcHV0X3VzZXIodmFsLmlbMl0sICZwTWVtWzFdKTsJLyogbXN3ICovCit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlTXVsdGlwbGUoY29uc3QgdW5zaWduZWQgaW50IEZuLCB1bnNpZ25lZCBpbnQgX191c2VyICpwTWVtKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBuVHlwZSwgKnA7CisKKwlwID0gKHVuc2lnbmVkIGludCAqKSAmKGZwYTExLT5mcHJlZ1tGbl0pOworCW5UeXBlID0gZnBhMTEtPmZUeXBlW0ZuXTsKKworCXN3aXRjaCAoblR5cGUpIHsKKwljYXNlIHR5cGVTaW5nbGU6CisJY2FzZSB0eXBlRG91YmxlOgorCQl7CisJCQlwdXRfdXNlcihwWzBdLCAmcE1lbVsyXSk7CS8qIHNpbmdsZSAqLworCQkJcHV0X3VzZXIocFsxXSwgJnBNZW1bMV0pOwkvKiBkb3VibGUgbXN3ICovCisJCQlwdXRfdXNlcihuVHlwZSA8PCAxNCwgJnBNZW1bMF0pOworCQl9CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0ZQRV9OV0ZQRV9YUAorCWNhc2UgdHlwZUV4dGVuZGVkOgorCQl7CisJCQlwdXRfdXNlcihwWzJdLCAmcE1lbVsxXSk7CS8qIG1zdyAqLworCQkJcHV0X3VzZXIocFsxXSwgJnBNZW1bMl0pOworCQkJcHV0X3VzZXIoKHBbMF0gJiAweDgwMDAzZmZmKSB8IChuVHlwZSA8PCAxNCksICZwTWVtWzBdKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCX0KK30KKwordW5zaWduZWQgaW50IFBlcmZvcm1MREYoY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgX191c2VyICpwQmFzZSwgKnBBZGRyZXNzLCAqcEZpbmFsOworCXVuc2lnbmVkIGludCBuUmMgPSAxLCB3cml0ZV9iYWNrID0gV1JJVEVfQkFDSyhvcGNvZGUpOworCisJcEJhc2UgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKSByZWFkUmVnaXN0ZXIoZ2V0Um4ob3Bjb2RlKSk7CisJaWYgKFJFR19QQyA9PSBnZXRSbihvcGNvZGUpKSB7CisJCXBCYXNlICs9IDI7CisJCXdyaXRlX2JhY2sgPSAwOworCX0KKworCXBGaW5hbCA9IHBCYXNlOworCWlmIChCSVRfVVBfU0VUKG9wY29kZSkpCisJCXBGaW5hbCArPSBnZXRPZmZzZXQob3Bjb2RlKTsKKwllbHNlCisJCXBGaW5hbCAtPSBnZXRPZmZzZXQob3Bjb2RlKTsKKworCWlmIChQUkVJTkRFWEVEKG9wY29kZSkpCisJCXBBZGRyZXNzID0gcEZpbmFsOworCWVsc2UKKwkJcEFkZHJlc3MgPSBwQmFzZTsKKworCXN3aXRjaCAob3Bjb2RlICYgTUFTS19UUkFOU0ZFUl9MRU5HVEgpIHsKKwljYXNlIFRSQU5TRkVSX1NJTkdMRToKKwkJbG9hZFNpbmdsZShnZXRGZChvcGNvZGUpLCBwQWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgVFJBTlNGRVJfRE9VQkxFOgorCQlsb2FkRG91YmxlKGdldEZkKG9wY29kZSksIHBBZGRyZXNzKTsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0ZQRV9OV0ZQRV9YUAorCWNhc2UgVFJBTlNGRVJfRVhURU5ERUQ6CisJCWxvYWRFeHRlbmRlZChnZXRGZChvcGNvZGUpLCBwQWRkcmVzcyk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJblJjID0gMDsKKwl9CisKKwlpZiAod3JpdGVfYmFjaykKKwkJd3JpdGVSZWdpc3RlcihnZXRSbihvcGNvZGUpLCAodW5zaWduZWQgbG9uZykgcEZpbmFsKTsKKwlyZXR1cm4gblJjOworfQorCit1bnNpZ25lZCBpbnQgUGVyZm9ybVNURihjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKQoreworCXVuc2lnbmVkIGludCBfX3VzZXIgKnBCYXNlLCAqcEFkZHJlc3MsICpwRmluYWw7CisJdW5zaWduZWQgaW50IG5SYyA9IDEsIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLKG9wY29kZSk7CisKKwlTZXRSb3VuZGluZ01vZGUoUk9VTkRfVE9fTkVBUkVTVCk7CisKKwlwQmFzZSA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopIHJlYWRSZWdpc3RlcihnZXRSbihvcGNvZGUpKTsKKwlpZiAoUkVHX1BDID09IGdldFJuKG9wY29kZSkpIHsKKwkJcEJhc2UgKz0gMjsKKwkJd3JpdGVfYmFjayA9IDA7CisJfQorCisJcEZpbmFsID0gcEJhc2U7CisJaWYgKEJJVF9VUF9TRVQob3Bjb2RlKSkKKwkJcEZpbmFsICs9IGdldE9mZnNldChvcGNvZGUpOworCWVsc2UKKwkJcEZpbmFsIC09IGdldE9mZnNldChvcGNvZGUpOworCisJaWYgKFBSRUlOREVYRUQob3Bjb2RlKSkKKwkJcEFkZHJlc3MgPSBwRmluYWw7CisJZWxzZQorCQlwQWRkcmVzcyA9IHBCYXNlOworCisJc3dpdGNoIChvcGNvZGUgJiBNQVNLX1RSQU5TRkVSX0xFTkdUSCkgeworCWNhc2UgVFJBTlNGRVJfU0lOR0xFOgorCQlzdG9yZVNpbmdsZShnZXRGZChvcGNvZGUpLCBwQWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgVFJBTlNGRVJfRE9VQkxFOgorCQlzdG9yZURvdWJsZShnZXRGZChvcGNvZGUpLCBwQWRkcmVzcyk7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKKwljYXNlIFRSQU5TRkVSX0VYVEVOREVEOgorCQlzdG9yZUV4dGVuZGVkKGdldEZkKG9wY29kZSksIHBBZGRyZXNzKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQluUmMgPSAwOworCX0KKworCWlmICh3cml0ZV9iYWNrKQorCQl3cml0ZVJlZ2lzdGVyKGdldFJuKG9wY29kZSksICh1bnNpZ25lZCBsb25nKSBwRmluYWwpOworCXJldHVybiBuUmM7Cit9CisKK3Vuc2lnbmVkIGludCBQZXJmb3JtTEZNKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisJdW5zaWduZWQgaW50IF9fdXNlciAqcEJhc2UsICpwQWRkcmVzcywgKnBGaW5hbDsKKwl1bnNpZ25lZCBpbnQgaSwgRmQsIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLKG9wY29kZSk7CisKKwlwQmFzZSA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopIHJlYWRSZWdpc3RlcihnZXRSbihvcGNvZGUpKTsKKwlpZiAoUkVHX1BDID09IGdldFJuKG9wY29kZSkpIHsKKwkJcEJhc2UgKz0gMjsKKwkJd3JpdGVfYmFjayA9IDA7CisJfQorCisJcEZpbmFsID0gcEJhc2U7CisJaWYgKEJJVF9VUF9TRVQob3Bjb2RlKSkKKwkJcEZpbmFsICs9IGdldE9mZnNldChvcGNvZGUpOworCWVsc2UKKwkJcEZpbmFsIC09IGdldE9mZnNldChvcGNvZGUpOworCisJaWYgKFBSRUlOREVYRUQob3Bjb2RlKSkKKwkJcEFkZHJlc3MgPSBwRmluYWw7CisJZWxzZQorCQlwQWRkcmVzcyA9IHBCYXNlOworCisJRmQgPSBnZXRGZChvcGNvZGUpOworCWZvciAoaSA9IGdldFJlZ2lzdGVyQ291bnQob3Bjb2RlKTsgaSA+IDA7IGktLSkgeworCQlsb2FkTXVsdGlwbGUoRmQsIHBBZGRyZXNzKTsKKwkJcEFkZHJlc3MgKz0gMzsKKwkJRmQrKzsKKwkJaWYgKEZkID09IDgpCisJCQlGZCA9IDA7CisJfQorCisJaWYgKHdyaXRlX2JhY2spCisJCXdyaXRlUmVnaXN0ZXIoZ2V0Um4ob3Bjb2RlKSwgKHVuc2lnbmVkIGxvbmcpIHBGaW5hbCk7CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGludCBQZXJmb3JtU0ZNKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisJdW5zaWduZWQgaW50IF9fdXNlciAqcEJhc2UsICpwQWRkcmVzcywgKnBGaW5hbDsKKwl1bnNpZ25lZCBpbnQgaSwgRmQsIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLKG9wY29kZSk7CisKKwlwQmFzZSA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopIHJlYWRSZWdpc3RlcihnZXRSbihvcGNvZGUpKTsKKwlpZiAoUkVHX1BDID09IGdldFJuKG9wY29kZSkpIHsKKwkJcEJhc2UgKz0gMjsKKwkJd3JpdGVfYmFjayA9IDA7CisJfQorCisJcEZpbmFsID0gcEJhc2U7CisJaWYgKEJJVF9VUF9TRVQob3Bjb2RlKSkKKwkJcEZpbmFsICs9IGdldE9mZnNldChvcGNvZGUpOworCWVsc2UKKwkJcEZpbmFsIC09IGdldE9mZnNldChvcGNvZGUpOworCisJaWYgKFBSRUlOREVYRUQob3Bjb2RlKSkKKwkJcEFkZHJlc3MgPSBwRmluYWw7CisJZWxzZQorCQlwQWRkcmVzcyA9IHBCYXNlOworCisJRmQgPSBnZXRGZChvcGNvZGUpOworCWZvciAoaSA9IGdldFJlZ2lzdGVyQ291bnQob3Bjb2RlKTsgaSA+IDA7IGktLSkgeworCQlzdG9yZU11bHRpcGxlKEZkLCBwQWRkcmVzcyk7CisJCXBBZGRyZXNzICs9IDM7CisJCUZkKys7CisJCWlmIChGZCA9PSA4KQorCQkJRmQgPSAwOworCX0KKworCWlmICh3cml0ZV9iYWNrKQorCQl3cml0ZVJlZ2lzdGVyKGdldFJuKG9wY29kZSksICh1bnNpZ25lZCBsb25nKSBwRmluYWwpOworCXJldHVybiAxOworfQorCit1bnNpZ25lZCBpbnQgRW11bGF0ZUNQRFQoY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgblJjID0gMDsKKworCWlmIChMREZfT1Aob3Bjb2RlKSkgeworCQluUmMgPSBQZXJmb3JtTERGKG9wY29kZSk7CisJfSBlbHNlIGlmIChMRk1fT1Aob3Bjb2RlKSkgeworCQluUmMgPSBQZXJmb3JtTEZNKG9wY29kZSk7CisJfSBlbHNlIGlmIChTVEZfT1Aob3Bjb2RlKSkgeworCQluUmMgPSBQZXJmb3JtU1RGKG9wY29kZSk7CisJfSBlbHNlIGlmIChTRk1fT1Aob3Bjb2RlKSkgeworCQluUmMgPSBQZXJmb3JtU0ZNKG9wY29kZSk7CisJfSBlbHNlIHsKKwkJblJjID0gMDsKKwl9CisKKwlyZXR1cm4gblJjOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBhMTFfY3BydC5jIGIvYXJjaC9hcm0vbndmcGUvZnBhMTFfY3BydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDFmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9mcGExMV9jcHJ0LmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgICAgTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yCisgICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CisgICAgKGMpIFBoaWxpcCBCbHVuZGVsbCwgMTk5OSwgMjAwMQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImZwYTExLmgiCisjaW5jbHVkZSAiZnBvcGNvZGUuaCIKKyNpbmNsdWRlICJmcGExMS5pbmwiCisjaW5jbHVkZSAiZnBtb2R1bGUuaCIKKyNpbmNsdWRlICJmcG1vZHVsZS5pbmwiCisKKyNpZmRlZiBDT05GSUdfRlBFX05XRlBFX1hQCitleHRlcm4gZmxhZyBmbG9hdHg4MF9pc19uYW4oZmxvYXR4ODApOworI2VuZGlmCitleHRlcm4gZmxhZyBmbG9hdDY0X2lzX25hbihmbG9hdDY0KTsKK2V4dGVybiBmbGFnIGZsb2F0MzJfaXNfbmFuKGZsb2F0MzIpOworCit2b2lkIFNldFJvdW5kaW5nTW9kZShjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKTsKKwordW5zaWduZWQgaW50IFBlcmZvcm1GTFQoY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSk7Cit1bnNpZ25lZCBpbnQgUGVyZm9ybUZJWChjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBQZXJmb3JtQ29tcGFyaXNvbihjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKTsKKwordW5zaWduZWQgaW50IEVtdWxhdGVDUFJUKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisKKwlpZiAob3Bjb2RlICYgMHg4MDAwMDApIHsKKwkJLyogVGhpcyBpcyBzb21lIHZhcmlhbnQgb2YgYSBjb21wYXJpc29uIChQZXJmb3JtQ29tcGFyaXNvbgorCQkgICB3aWxsIHNvcnQgb3V0IHdoaWNoIG9uZSkuICBTaW5jZSBtb3N0IG9mIHRoZSBvdGhlciBDUFJUCisJCSAgIGluc3RydWN0aW9ucyBhcmUgb2RkYmFsbCBjYXNlcyBvZiBzb21lIHNvcnQgb3Igb3RoZXIgaXQKKwkJICAgbWFrZXMgc2Vuc2UgdG8gcHVsbCB0aGlzIG91dCBpbnRvIGEgZmFzdCBwYXRoLiAgKi8KKwkJcmV0dXJuIFBlcmZvcm1Db21wYXJpc29uKG9wY29kZSk7CisJfQorCisJLyogSGludCB0byBHQ0MgdGhhdCB3ZSdkIGxpa2UgYSBqdW1wIHRhYmxlIHJhdGhlciB0aGFuIGEgbG9hZCBvZiBDTVBzICovCisJc3dpdGNoICgob3Bjb2RlICYgMHg3MDAwMDApID4+IDIwKSB7CisJY2FzZSBGTFRfQ09ERSA+PiAyMDoKKwkJcmV0dXJuIFBlcmZvcm1GTFQob3Bjb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBGSVhfQ09ERSA+PiAyMDoKKwkJcmV0dXJuIFBlcmZvcm1GSVgob3Bjb2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIFdGU19DT0RFID4+IDIwOgorCQl3cml0ZUZQU1IocmVhZFJlZ2lzdGVyKGdldFJkKG9wY29kZSkpKTsKKwkJYnJlYWs7CisJY2FzZSBSRlNfQ09ERSA+PiAyMDoKKwkJd3JpdGVSZWdpc3RlcihnZXRSZChvcGNvZGUpLCByZWFkRlBTUigpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgaW50IFBlcmZvcm1GTFQoY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSkKK3sKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKwlTZXRSb3VuZGluZ01vZGUob3Bjb2RlKTsKKwlTZXRSb3VuZGluZ1ByZWNpc2lvbihvcGNvZGUpOworCisJc3dpdGNoIChvcGNvZGUgJiBNQVNLX1JPVU5ESU5HX1BSRUNJU0lPTikgeworCWNhc2UgUk9VTkRfU0lOR0xFOgorCQl7CisJCQlmcGExMS0+ZlR5cGVbZ2V0Rm4ob3Bjb2RlKV0gPSB0eXBlU2luZ2xlOworCQkJZnBhMTEtPmZwcmVnW2dldEZuKG9wY29kZSldLmZTaW5nbGUgPSBpbnQzMl90b19mbG9hdDMyKHJlYWRSZWdpc3RlcihnZXRSZChvcGNvZGUpKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJPVU5EX0RPVUJMRToKKwkJeworCQkJZnBhMTEtPmZUeXBlW2dldEZuKG9wY29kZSldID0gdHlwZURvdWJsZTsKKwkJCWZwYTExLT5mcHJlZ1tnZXRGbihvcGNvZGUpXS5mRG91YmxlID0gaW50MzJfdG9fZmxvYXQ2NChyZWFkUmVnaXN0ZXIoZ2V0UmQob3Bjb2RlKSkpOworCQl9CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0ZQRV9OV0ZQRV9YUAorCWNhc2UgUk9VTkRfRVhURU5ERUQ6CisJCXsKKwkJCWZwYTExLT5mVHlwZVtnZXRGbihvcGNvZGUpXSA9IHR5cGVFeHRlbmRlZDsKKwkJCWZwYTExLT5mcHJlZ1tnZXRGbihvcGNvZGUpXS5mRXh0ZW5kZWQgPSBpbnQzMl90b19mbG9hdHg4MChyZWFkUmVnaXN0ZXIoZ2V0UmQob3Bjb2RlKSkpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgaW50IFBlcmZvcm1GSVgoY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSkKK3sKKwlGUEExMSAqZnBhMTEgPSBHRVRfRlBBMTEoKTsKKwl1bnNpZ25lZCBpbnQgRm4gPSBnZXRGbShvcGNvZGUpOworCisJU2V0Um91bmRpbmdNb2RlKG9wY29kZSk7CisKKwlzd2l0Y2ggKGZwYTExLT5mVHlwZVtGbl0pIHsKKwljYXNlIHR5cGVTaW5nbGU6CisJCXsKKwkJCXdyaXRlUmVnaXN0ZXIoZ2V0UmQob3Bjb2RlKSwgZmxvYXQzMl90b19pbnQzMihmcGExMS0+ZnByZWdbRm5dLmZTaW5nbGUpKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgdHlwZURvdWJsZToKKwkJeworCQkJd3JpdGVSZWdpc3RlcihnZXRSZChvcGNvZGUpLCBmbG9hdDY0X3RvX2ludDMyKGZwYTExLT5mcHJlZ1tGbl0uZkRvdWJsZSkpOworCQl9CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0ZQRV9OV0ZQRV9YUAorCWNhc2UgdHlwZUV4dGVuZGVkOgorCQl7CisJCQl3cml0ZVJlZ2lzdGVyKGdldFJkKG9wY29kZSksIGZsb2F0eDgwX3RvX2ludDMyKGZwYTExLT5mcHJlZ1tGbl0uZkV4dGVuZGVkKSk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIGZsYWdzIE4sIFosIEMsIFYgaW4gdGhlIEZQU1IuICovCitzdGF0aWMgdW5zaWduZWQgaW50IFBlcmZvcm1Db21wYXJpc29uKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisJRlBBMTEgKmZwYTExID0gR0VUX0ZQQTExKCk7CisJdW5zaWduZWQgaW50IEZuID0gZ2V0Rm4ob3Bjb2RlKSwgRm0gPSBnZXRGbShvcGNvZGUpOworCWludCBlX2ZsYWcgPSBvcGNvZGUgJiAweDQwMDAwMDsJLyogMSBpZiBDeEZFICovCisJaW50IG5fZmxhZyA9IG9wY29kZSAmIDB4MjAwMDAwOwkvKiAxIGlmIENOeHggKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCisjaWZkZWYgQ09ORklHX0ZQRV9OV0ZQRV9YUAorCWZsb2F0eDgwIHJGbiwgckZtOworCisJLyogQ2hlY2sgZm9yIHVub3JkZXJlZCBjb25kaXRpb24gYW5kIGNvbnZlcnQgYWxsIG9wZXJhbmRzIHRvIDgwLWJpdAorCSAgIGZvcm1hdC4KKwkgICA/PyBNaWdodCBiZSBzb21lIG1pbGVhZ2UgaW4gYXZvaWRpbmcgdGhpcyBjb252ZXJzaW9uIGlmIHBvc3NpYmxlLgorCSAgIEVnLCBpZiBib3RoIG9wZXJhbmRzIGFyZSAzMi1iaXQsIGRldGVjdCB0aGlzIGFuZCBkbyBhIDMyLWJpdAorCSAgIGNvbXBhcmlzb24gKGNoZWFwZXIgdGhhbiBhbiA4MC1iaXQgb25lKS4gICovCisJc3dpdGNoIChmcGExMS0+ZlR5cGVbRm5dKSB7CisJY2FzZSB0eXBlU2luZ2xlOgorCQkvL3ByaW50aygic2luZ2xlLlxuIik7CisJCWlmIChmbG9hdDMyX2lzX25hbihmcGExMS0+ZnByZWdbRm5dLmZTaW5nbGUpKQorCQkJZ290byB1bm9yZGVyZWQ7CisJCXJGbiA9IGZsb2F0MzJfdG9fZmxvYXR4ODAoZnBhMTEtPmZwcmVnW0ZuXS5mU2luZ2xlKTsKKwkJYnJlYWs7CisKKwljYXNlIHR5cGVEb3VibGU6CisJCS8vcHJpbnRrKCJkb3VibGUuXG4iKTsKKwkJaWYgKGZsb2F0NjRfaXNfbmFuKGZwYTExLT5mcHJlZ1tGbl0uZkRvdWJsZSkpCisJCQlnb3RvIHVub3JkZXJlZDsKKwkJckZuID0gZmxvYXQ2NF90b19mbG9hdHg4MChmcGExMS0+ZnByZWdbRm5dLmZEb3VibGUpOworCQlicmVhazsKKworCWNhc2UgdHlwZUV4dGVuZGVkOgorCQkvL3ByaW50aygiZXh0ZW5kZWQuXG4iKTsKKwkJaWYgKGZsb2F0eDgwX2lzX25hbihmcGExMS0+ZnByZWdbRm5dLmZFeHRlbmRlZCkpCisJCQlnb3RvIHVub3JkZXJlZDsKKwkJckZuID0gZnBhMTEtPmZwcmVnW0ZuXS5mRXh0ZW5kZWQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKENPTlNUQU5UX0ZNKG9wY29kZSkpIHsKKwkJLy9wcmludGsoIkZtIGlzIGEgY29uc3RhbnQ6ICMlZC5cbiIsRm0pOworCQlyRm0gPSBnZXRFeHRlbmRlZENvbnN0YW50KEZtKTsKKwkJaWYgKGZsb2F0eDgwX2lzX25hbihyRm0pKQorCQkJZ290byB1bm9yZGVyZWQ7CisJfSBlbHNlIHsKKwkJLy9wcmludGsoIkZtID0gciVkIHdoaWNoIGNvbnRhaW5zIGEgIixGbSk7CisJCXN3aXRjaCAoZnBhMTEtPmZUeXBlW0ZtXSkgeworCQljYXNlIHR5cGVTaW5nbGU6CisJCQkvL3ByaW50aygic2luZ2xlLlxuIik7CisJCQlpZiAoZmxvYXQzMl9pc19uYW4oZnBhMTEtPmZwcmVnW0ZtXS5mU2luZ2xlKSkKKwkJCQlnb3RvIHVub3JkZXJlZDsKKwkJCXJGbSA9IGZsb2F0MzJfdG9fZmxvYXR4ODAoZnBhMTEtPmZwcmVnW0ZtXS5mU2luZ2xlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdHlwZURvdWJsZToKKwkJCS8vcHJpbnRrKCJkb3VibGUuXG4iKTsKKwkJCWlmIChmbG9hdDY0X2lzX25hbihmcGExMS0+ZnByZWdbRm1dLmZEb3VibGUpKQorCQkJCWdvdG8gdW5vcmRlcmVkOworCQkJckZtID0gZmxvYXQ2NF90b19mbG9hdHg4MChmcGExMS0+ZnByZWdbRm1dLmZEb3VibGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSB0eXBlRXh0ZW5kZWQ6CisJCQkvL3ByaW50aygiZXh0ZW5kZWQuXG4iKTsKKwkJCWlmIChmbG9hdHg4MF9pc19uYW4oZnBhMTEtPmZwcmVnW0ZtXS5mRXh0ZW5kZWQpKQorCQkJCWdvdG8gdW5vcmRlcmVkOworCQkJckZtID0gZnBhMTEtPmZwcmVnW0ZtXS5mRXh0ZW5kZWQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAobl9mbGFnKQorCQlyRm0uaGlnaCBePSAweDgwMDA7CisKKwkvKiB0ZXN0IGZvciBsZXNzIHRoYW4gY29uZGl0aW9uICovCisJaWYgKGZsb2F0eDgwX2x0KHJGbiwgckZtKSkKKwkJZmxhZ3MgfD0gQ0NfTkVHQVRJVkU7CisKKwkvKiB0ZXN0IGZvciBlcXVhbCBjb25kaXRpb24gKi8KKwlpZiAoZmxvYXR4ODBfZXEockZuLCByRm0pKQorCQlmbGFncyB8PSBDQ19aRVJPOworCisJLyogdGVzdCBmb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbmRpdGlvbiAqLworCWlmIChmbG9hdHg4MF9sdChyRm0sIHJGbikpCisJCWZsYWdzIHw9IENDX0NBUlJZOworCisjZWxzZQorCWlmIChDT05TVEFOVF9GTShvcGNvZGUpKSB7CisJCS8qIEZtIGlzIGEgY29uc3RhbnQuICBEbyB0aGUgY29tcGFyaXNvbiBpbiB3aGF0ZXZlciBwcmVjaXNpb24KKwkJICAgRm4gaGFwcGVucyB0byBiZSBzdG9yZWQgaW4uICAqLworCQlpZiAoZnBhMTEtPmZUeXBlW0ZuXSA9PSB0eXBlU2luZ2xlKSB7CisJCQlmbG9hdDMyIHJGbSA9IGdldFNpbmdsZUNvbnN0YW50KEZtKTsKKwkJCWZsb2F0MzIgckZuID0gZnBhMTEtPmZwcmVnW0ZuXS5mU2luZ2xlOworCisJCQlpZiAoZmxvYXQzMl9pc19uYW4ockZuKSkKKwkJCQlnb3RvIHVub3JkZXJlZDsKKworCQkJaWYgKG5fZmxhZykKKwkJCQlyRm0gXj0gMHg4MDAwMDAwMDsKKworCQkJLyogdGVzdCBmb3IgbGVzcyB0aGFuIGNvbmRpdGlvbiAqLworCQkJaWYgKGZsb2F0MzJfbHRfbm9jaGVjayhyRm4sIHJGbSkpCisJCQkJZmxhZ3MgfD0gQ0NfTkVHQVRJVkU7CisKKwkJCS8qIHRlc3QgZm9yIGVxdWFsIGNvbmRpdGlvbiAqLworCQkJaWYgKGZsb2F0MzJfZXFfbm9jaGVjayhyRm4sIHJGbSkpCisJCQkJZmxhZ3MgfD0gQ0NfWkVSTzsKKworCQkJLyogdGVzdCBmb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbmRpdGlvbiAqLworCQkJaWYgKGZsb2F0MzJfbHRfbm9jaGVjayhyRm0sIHJGbikpCisJCQkJZmxhZ3MgfD0gQ0NfQ0FSUlk7CisJCX0gZWxzZSB7CisJCQlmbG9hdDY0IHJGbSA9IGdldERvdWJsZUNvbnN0YW50KEZtKTsKKwkJCWZsb2F0NjQgckZuID0gZnBhMTEtPmZwcmVnW0ZuXS5mRG91YmxlOworCisJCQlpZiAoZmxvYXQ2NF9pc19uYW4ockZuKSkKKwkJCQlnb3RvIHVub3JkZXJlZDsKKworCQkJaWYgKG5fZmxhZykKKwkJCQlyRm0gXj0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOworCisJCQkvKiB0ZXN0IGZvciBsZXNzIHRoYW4gY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQ2NF9sdF9ub2NoZWNrKHJGbiwgckZtKSkKKwkJCQlmbGFncyB8PSBDQ19ORUdBVElWRTsKKworCQkJLyogdGVzdCBmb3IgZXF1YWwgY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQ2NF9lcV9ub2NoZWNrKHJGbiwgckZtKSkKKwkJCQlmbGFncyB8PSBDQ19aRVJPOworCisJCQkvKiB0ZXN0IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQ2NF9sdF9ub2NoZWNrKHJGbSwgckZuKSkKKwkJCQlmbGFncyB8PSBDQ19DQVJSWTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEJvdGggb3BlcmFuZHMgYXJlIGluIHJlZ2lzdGVycy4gICovCisJCWlmIChmcGExMS0+ZlR5cGVbRm5dID09IHR5cGVTaW5nbGUKKwkJICAgICYmIGZwYTExLT5mVHlwZVtGbV0gPT0gdHlwZVNpbmdsZSkgeworCQkJZmxvYXQzMiByRm0gPSBmcGExMS0+ZnByZWdbRm1dLmZTaW5nbGU7CisJCQlmbG9hdDMyIHJGbiA9IGZwYTExLT5mcHJlZ1tGbl0uZlNpbmdsZTsKKworCQkJaWYgKGZsb2F0MzJfaXNfbmFuKHJGbikKKwkJCSAgICB8fCBmbG9hdDMyX2lzX25hbihyRm0pKQorCQkJCWdvdG8gdW5vcmRlcmVkOworCisJCQlpZiAobl9mbGFnKQorCQkJCXJGbSBePSAweDgwMDAwMDAwOworCisJCQkvKiB0ZXN0IGZvciBsZXNzIHRoYW4gY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQzMl9sdF9ub2NoZWNrKHJGbiwgckZtKSkKKwkJCQlmbGFncyB8PSBDQ19ORUdBVElWRTsKKworCQkJLyogdGVzdCBmb3IgZXF1YWwgY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQzMl9lcV9ub2NoZWNrKHJGbiwgckZtKSkKKwkJCQlmbGFncyB8PSBDQ19aRVJPOworCisJCQkvKiB0ZXN0IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQzMl9sdF9ub2NoZWNrKHJGbSwgckZuKSkKKwkJCQlmbGFncyB8PSBDQ19DQVJSWTsKKwkJfSBlbHNlIHsKKwkJCS8qIFByb21vdGUgMzItYml0IG9wZXJhbmQgdG8gNjQgYml0cy4gICovCisJCQlmbG9hdDY0IHJGbSwgckZuOworCisJCQlyRm0gPSAoZnBhMTEtPmZUeXBlW0ZtXSA9PSB0eXBlU2luZ2xlKSA/CisJCQkgICAgZmxvYXQzMl90b19mbG9hdDY0KGZwYTExLT5mcHJlZ1tGbV0uZlNpbmdsZSkKKwkJCSAgICA6IGZwYTExLT5mcHJlZ1tGbV0uZkRvdWJsZTsKKworCQkJckZuID0gKGZwYTExLT5mVHlwZVtGbl0gPT0gdHlwZVNpbmdsZSkgPworCQkJICAgIGZsb2F0MzJfdG9fZmxvYXQ2NChmcGExMS0+ZnByZWdbRm5dLmZTaW5nbGUpCisJCQkgICAgOiBmcGExMS0+ZnByZWdbRm5dLmZEb3VibGU7CisKKwkJCWlmIChmbG9hdDY0X2lzX25hbihyRm4pCisJCQkgICAgfHwgZmxvYXQ2NF9pc19uYW4ockZtKSkKKwkJCQlnb3RvIHVub3JkZXJlZDsKKworCQkJaWYgKG5fZmxhZykKKwkJCQlyRm0gXj0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOworCisJCQkvKiB0ZXN0IGZvciBsZXNzIHRoYW4gY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQ2NF9sdF9ub2NoZWNrKHJGbiwgckZtKSkKKwkJCQlmbGFncyB8PSBDQ19ORUdBVElWRTsKKworCQkJLyogdGVzdCBmb3IgZXF1YWwgY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQ2NF9lcV9ub2NoZWNrKHJGbiwgckZtKSkKKwkJCQlmbGFncyB8PSBDQ19aRVJPOworCisJCQkvKiB0ZXN0IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29uZGl0aW9uICovCisJCQlpZiAoZmxvYXQ2NF9sdF9ub2NoZWNrKHJGbSwgckZuKSkKKwkJCQlmbGFncyB8PSBDQ19DQVJSWTsKKwkJfQorCX0KKworI2VuZGlmCisKKwl3cml0ZUNvbmRpdGlvbkNvZGVzKGZsYWdzKTsKKworCXJldHVybiAxOworCisgICAgICB1bm9yZGVyZWQ6CisJLyogPz8gVGhlIEZQQSBkYXRhIHNoZWV0IGlzIHByZXR0eSB2YWd1ZSBhYm91dCB0aGlzLCBpbiBwYXJ0aWN1bGFyCisJICAgYWJvdXQgd2hldGhlciB0aGUgbm9uLUUgY29tcGFyaXNvbnMgY2FuIGV2ZXIgcmFpc2UgZXhjZXB0aW9ucy4KKwkgICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGEgY29tYmluYXRpb24gb2Ygd2hhdCBpdCBzYXlzIGluCisJICAgdGhlIGRhdGEgc2hlZXQsIG9ic2VydmF0aW9uIG9mIGhvdyB0aGUgQWNvcm4gZW11bGF0b3IgYWN0dWFsbHkKKwkgICBiZWhhdmVzIChhbmQgaG93IHByb2dyYW1zIGV4cGVjdCBpdCB0bykgYW5kIGd1ZXNzd29yay4gICovCisJZmxhZ3MgfD0gQ0NfT1ZFUkZMT1c7CisJZmxhZ3MgJj0gfihDQ19aRVJPIHwgQ0NfTkVHQVRJVkUpOworCisJaWYgKEJJVF9BQyAmIHJlYWRGUFNSKCkpCisJCWZsYWdzIHw9IENDX0NBUlJZOworCisJaWYgKGVfZmxhZykKKwkJZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkKTsKKworCXdyaXRlQ29uZGl0aW9uQ29kZXMoZmxhZ3MpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuYyBiL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNmZlYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmMKQEAgLTAsMCArMSwxNzMgQEAKKworLyoKKyAgICBOZXRXaW5kZXIgRmxvYXRpbmcgUG9pbnQgRW11bGF0b3IKKyAgICAoYykgUmViZWwuY29tLCAxOTk4LTE5OTkKKyAgICAoYykgUGhpbGlwIEJsdW5kZWxsLCAxOTk4LTE5OTkKKworICAgIERpcmVjdCBxdWVzdGlvbnMsIGNvbW1lbnRzIHRvIFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQG5ldHdpbmRlci5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlICJmcGExMS5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKiBYWFggKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisvKiBYWFggKi8KKworI2luY2x1ZGUgInNvZnRmbG9hdC5oIgorI2luY2x1ZGUgImZwb3Bjb2RlLmgiCisjaW5jbHVkZSAiZnBtb2R1bGUuaCIKKyNpbmNsdWRlICJmcGExMS5pbmwiCisKKy8qIGtlcm5lbCBzeW1ib2xzIHJlcXVpcmVkIGZvciBzaWduYWwgaGFuZGxpbmcgKi8KKyNpZmRlZiBDT05GSUdfRlBFX05XRlBFX1hQCisjZGVmaW5lIE5XRlBFX0JJVFMgImV4dGVuZGVkIgorI2Vsc2UKKyNkZWZpbmUgTldGUEVfQklUUyAiZG91YmxlIgorI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK3ZvaWQgZnBfc2VuZF9zaWcodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHByaXYpOworI2Vsc2UKKyNkZWZpbmUgZnBfc2VuZF9zaWcJc2VuZF9zaWcKKyNkZWZpbmUga2Vybl9mcF9lbnRlcglmcF9lbnRlcgorCitleHRlcm4gY2hhciBmcGVfdHlwZVtdOworI2VuZGlmCisKKy8qIGtlcm5lbCBmdW5jdGlvbiBwcm90b3R5cGVzIHJlcXVpcmVkICovCit2b2lkIGZwX3NldHVwKHZvaWQpOworCisvKiBleHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIHNhdmVkIGtlcm5lbCBzeW1ib2xzICovCitleHRlcm4gdm9pZCAoKmtlcm5fZnBfZW50ZXIpKHZvaWQpOworZXh0ZXJuIHZvaWQgKCpmcF9pbml0KSh1bmlvbiBmcF9zdGF0ZSAqKTsKKworLyogT3JpZ2luYWwgdmFsdWUgb2YgZnBfZW50ZXIgZnJvbSBrZXJuZWwgYmVmb3JlIHBhdGNoZWQgYnkgZnBlX2luaXQuICovCitzdGF0aWMgdm9pZCAoKm9yaWdfZnBfZW50ZXIpKHZvaWQpOworc3RhdGljIHZvaWQgKCpvcmlnX2ZwX2luaXQpKHVuaW9uIGZwX3N0YXRlICopOworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworZXh0ZXJuIHZvaWQgbndmcGVfZW50ZXIodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGZwZV9pbml0KHZvaWQpCit7CisJaWYgKHNpemVvZihGUEExMSkgPiBzaXplb2YodW5pb24gZnBfc3RhdGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibndmcGU6IGJhZCBzdHJ1Y3R1cmUgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzaXplb2YoRlBSRUcpICE9IDEyKSB7CisJCXByaW50ayhLRVJOX0VSUiAibndmcGU6IGJhZCByZWdpc3RlciBzaXplXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChmcGVfdHlwZVswXSAmJiBzdHJjbXAoZnBlX3R5cGUsICJud2ZwZSIpKQorCQlyZXR1cm4gMDsKKworCS8qIERpc3BsYXkgdGl0bGUsIHZlcnNpb24gYW5kIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4gKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJOZXRXaW5kZXIgRmxvYXRpbmcgUG9pbnQgRW11bGF0b3IgVjAuOTcgKCIKKwkgICAgICAgTldGUEVfQklUUyAiIHByZWNpc2lvbilcbiIpOworCisJLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBvbGQgRlAgaGFuZGxlciBhbmQgdGhlbiBwYXRjaCBvdXJzZWx2ZXMgaW4gKi8KKwlvcmlnX2ZwX2VudGVyID0ga2Vybl9mcF9lbnRlcjsKKwlvcmlnX2ZwX2luaXQgPSBmcF9pbml0OworCWtlcm5fZnBfZW50ZXIgPSBud2ZwZV9lbnRlcjsKKwlmcF9pbml0ID0gbndmcGVfaW5pdF9mcGE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZwZV9leGl0KHZvaWQpCit7CisJLyogUmVzdG9yZSB0aGUgdmFsdWVzIHdlIHNhdmVkIGVhcmxpZXIuICovCisJa2Vybl9mcF9lbnRlciA9IG9yaWdfZnBfZW50ZXI7CisJZnBfaW5pdCA9IG9yaWdfZnBfaW5pdDsKK30KKworLyoKK1Njb3R0QjogIE5vdmVtYmVyIDQsIDE5OTgKKworTW92ZWQgdGhpcyBmdW5jdGlvbiBvdXQgb2Ygc29mdGZsb2F0LXNwZWNpYWxpemUgaW50byBmcG1vZHVsZS5jLgorVGhpcyBlZmZlY3RpdmVseSBpc29sYXRlcyBhbGwgdGhlIGNoYW5nZXMgcmVxdWlyZWQgZm9yIGludGVncmF0aW5nIHdpdGggdGhlCitMaW51eCBrZXJuZWwgaW50byBmcG1vZHVsZS5jLiAgUG9ydGluZyB0byBOZXRCU0Qgc2hvdWxkIG9ubHkgcmVxdWlyZSBtb2RpZnlpbmcKK2ZwbW9kdWxlLmMgdG8gaW50ZWdyYXRlIHdpdGggdGhlIE5ldEJTRCBrZXJuZWwgKEkgaG9wZSEpLgorCitbMS8xLzk5OiBOb3QgcXVpdGUgdHJ1ZSBhbnkgbW9yZSB1bmZvcnR1bmF0ZWx5LiAgVGhlcmUgaXMgTGludXgtc3BlY2lmaWMKK2NvZGUgdG8gYWNjZXNzIGRhdGEgaW4gdXNlciBzcGFjZSBpbiBzb21lIG90aGVyIHNvdXJjZSBmaWxlcyBhdCB0aGUgCittb21lbnQgKGdyZXAgZm9yIGdldF91c2VyIC8gcHV0X3VzZXIgY2FsbHMpLiAgLS1waGlsYl0KKworZmxvYXRfZXhjZXB0aW9uX2ZsYWdzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIGluIFNvZnRGbG9hdC4KKworVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFNvZnRGbG9hdCByb3V0aW5lcyB0byByYWlzZSBhIGZsb2F0aW5nCitwb2ludCBleGNlcHRpb24uICBXZSBjaGVjayB0aGUgdHJhcCBlbmFibGUgYnl0ZSBpbiB0aGUgRlBTUiwgYW5kIHJhaXNlCithIFNJR0ZQRSBleGNlcHRpb24gaWYgbmVjZXNzYXJ5LiAgSWYgbm90IHRoZSByZWxldmFudCBiaXRzIGluIHRoZSAKK2N1bXVsYXRpdmUgZXhjZXB0aW9ucyBmbGFnIGJ5dGUgYXJlIHNldCBhbmQgd2UgcmV0dXJuLgorKi8KKwordm9pZCBmbG9hdF9yYWlzZShzaWduZWQgY2hhciBmbGFncykKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgZnBzciwgY3VtdWxhdGl2ZVRyYXBzOworCisjaWZkZWYgQ09ORklHX0RFQlVHX1VTRVIKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiTldGUEU6ICVzWyVkXSB0YWtlcyBleGNlcHRpb24gJTA4eCBhdCAlcCBmcm9tICUwOGx4XG4iLAorCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZsYWdzLAorCSAgICAgICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIEdFVF9VU0VSUkVHKClbMTVdKTsKKyNlbmRpZgorCisJLyogS2VlcCBTb2Z0RmxvYXQgZXhjZXB0aW9uIGZsYWdzIHVwIHRvIGRhdGUuICAqLworCWZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbGFnczsKKworCS8qIFJlYWQgZnBzciBhbmQgaW5pdGlhbGl6ZSB0aGUgY3VtdWxhdGl2ZVRyYXBzLiAgKi8KKwlmcHNyID0gcmVhZEZQU1IoKTsKKwljdW11bGF0aXZlVHJhcHMgPSAwOworCisJLyogRm9yIGVhY2ggdHlwZSBvZiBleGNlcHRpb24sIHRoZSBjdW11bGF0aXZlIHRyYXAgZXhjZXB0aW9uIGJpdCBpcyBvbmx5CisJICAgc2V0IGlmIHRoZSBjb3JyZXNwb25kaW5nIHRyYXAgZW5hYmxlIGJpdCBpcyBub3Qgc2V0LiAgKi8KKwlpZiAoKCEoZnBzciAmIEJJVF9JWEUpKSAmJiAoZmxhZ3MgJiBCSVRfSVhDKSkKKwkJY3VtdWxhdGl2ZVRyYXBzIHw9IEJJVF9JWEM7CisJaWYgKCghKGZwc3IgJiBCSVRfVUZFKSkgJiYgKGZsYWdzICYgQklUX1VGQykpCisJCWN1bXVsYXRpdmVUcmFwcyB8PSBCSVRfVUZDOworCWlmICgoIShmcHNyICYgQklUX09GRSkpICYmIChmbGFncyAmIEJJVF9PRkMpKQorCQljdW11bGF0aXZlVHJhcHMgfD0gQklUX09GQzsKKwlpZiAoKCEoZnBzciAmIEJJVF9EWkUpKSAmJiAoZmxhZ3MgJiBCSVRfRFpDKSkKKwkJY3VtdWxhdGl2ZVRyYXBzIHw9IEJJVF9EWkM7CisJaWYgKCghKGZwc3IgJiBCSVRfSU9FKSkgJiYgKGZsYWdzICYgQklUX0lPQykpCisJCWN1bXVsYXRpdmVUcmFwcyB8PSBCSVRfSU9DOworCisJLyogU2V0IHRoZSBjdW11bGF0aXZlIGV4Y2VwdGlvbnMgZmxhZ3MuICAqLworCWlmIChjdW11bGF0aXZlVHJhcHMpCisJCXdyaXRlRlBTUihmcHNyIHwgY3VtdWxhdGl2ZVRyYXBzKTsKKworCS8qIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBuZWNlc3NhcnkuICAqLworCWlmIChmcHNyICYgKGZsYWdzIDw8IDE2KSkKKwkJZnBfc2VuZF9zaWcoU0lHRlBFLCBjdXJyZW50LCAxKTsKK30KKworbW9kdWxlX2luaXQoZnBlX2luaXQpOworbW9kdWxlX2V4aXQoZnBlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTY290dCBCYW1icm91Z2ggPHNjb3R0YkByZWJlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5XRlBFIGZsb2F0aW5nIHBvaW50IGVtdWxhdG9yICgiIE5XRlBFX0JJVFMgIiBwcmVjaXNpb24pIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9mcG1vZHVsZS5oIGIvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzJlOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICAgIE5ldFdpbmRlciBGbG9hdGluZyBQb2ludCBFbXVsYXRvcgorICAgIChjKSBSZWJlbC5jb20sIDE5OTgtMTk5OQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgICAgMjcvMDMvMDMgSWFuIE1vbHRvbiBDbGVhbiB1cCBDT05GSUdfQ1BVCisqLworCisjaWZuZGVmIF9fRlBNT0RVTEVfSF9fCisjZGVmaW5lIF9fRlBNT0RVTEVfSF9fCisKKyNkZWZpbmUgUkVHX09SSUdfUjAJMTcKKyNkZWZpbmUgUkVHX0NQU1IJMTYKKyNkZWZpbmUgUkVHX1BDCQkxNQorI2RlZmluZSBSRUdfTFIJCTE0CisjZGVmaW5lIFJFR19TUAkJMTMKKyNkZWZpbmUgUkVHX0lQCQkxMgorI2RlZmluZSBSRUdfRlAJCTExCisjZGVmaW5lIFJFR19SMTAJCTEwCisjZGVmaW5lIFJFR19SOQkJOQorI2RlZmluZSBSRUdfUjkJCTkKKyNkZWZpbmUgUkVHX1I4CQk4CisjZGVmaW5lIFJFR19SNwkJNworI2RlZmluZSBSRUdfUjYJCTYKKyNkZWZpbmUgUkVHX1I1CQk1CisjZGVmaW5lIFJFR19SNAkJNAorI2RlZmluZSBSRUdfUjMJCTMKKyNkZWZpbmUgUkVHX1IyCQkyCisjZGVmaW5lIFJFR19SMQkJMQorI2RlZmluZSBSRUdfUjAJCTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9mcG1vZHVsZS5pbmwgYi9hcmNoL2FybS9ud2ZwZS9mcG1vZHVsZS5pbmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmNTllOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmlubApAQCAtMCwwICsxLDc0IEBACisvKgorICAgIE5ldFdpbmRlciBGbG9hdGluZyBQb2ludCBFbXVsYXRvcgorICAgIChjKSBSZWJlbC5DT00sIDE5OTgsMTk5OQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRSZWdpc3Rlcihjb25zdCB1bnNpZ25lZCBpbnQgblJlZykKK3sKKwkvKiBOb3RlOiBUaGUgQ1BVIHRoaW5rcyBpdCBoYXMgZGVhbHQgd2l0aCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKwkgICBBcyBhIHJlc3VsdCB0aGUgcHJvZ3JhbSBjb3VudGVyIGhhcyBiZWVuIGFkdmFuY2VkIHRvIHRoZSBuZXh0CisJICAgaW5zdHJ1Y3Rpb24sIGFuZCBwb2ludHMgNCBieXRlcyBiZXlvbmQgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbgorCSAgIHRoYXQgY2F1c2VkIHRoZSBpbnZhbGlkIGluc3RydWN0aW9uIHRyYXAgdG8gb2NjdXIuICBXZSBhZGp1c3QKKwkgICBmb3IgdGhpcyBpbiB0aGlzIHJvdXRpbmUuICBMREYvU1RGIGluc3RydWN0aW9ucyB3aXRoIFJuID0gUEMKKwkgICBkZXBlbmQgb24gdGhlIFBDIGJlaW5nIGNvcnJlY3QsIGFzIHRoZXkgdXNlIFBDKzggaW4gdGhlaXIKKwkgICBhZGRyZXNzIGNhbGN1bGF0aW9ucy4gKi8KKwl1bnNpZ25lZCBsb25nICp1c2VyUmVnaXN0ZXJzID0gR0VUX1VTRVJSRUcoKTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gdXNlclJlZ2lzdGVyc1tuUmVnXTsKKwlpZiAoUkVHX1BDID09IG5SZWcpCisJCXZhbCAtPSA0OworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVSZWdpc3Rlcihjb25zdCB1bnNpZ25lZCBpbnQgblJlZywgY29uc3QgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJdW5zaWduZWQgbG9uZyAqdXNlclJlZ2lzdGVycyA9IEdFVF9VU0VSUkVHKCk7CisJdXNlclJlZ2lzdGVyc1tuUmVnXSA9IHZhbDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRDUFNSKHZvaWQpCit7CisJcmV0dXJuIChyZWFkUmVnaXN0ZXIoUkVHX0NQU1IpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlQ1BTUihjb25zdCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwl3cml0ZVJlZ2lzdGVyKFJFR19DUFNSLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZENvbmRpdGlvbkNvZGVzKHZvaWQpCit7CisjaWZkZWYgX19GUEVNX1RFU1RfXworCXJldHVybiAoMCk7CisjZWxzZQorCXJldHVybiAocmVhZENQU1IoKSAmIENDX01BU0spOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZUNvbmRpdGlvbkNvZGVzKGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgKnVzZXJSZWdpc3RlcnMgPSBHRVRfVVNFUlJFRygpOworCXVuc2lnbmVkIGxvbmcgcnZhbDsKKwkvKgorCSAqIE9wZXJhdGUgZGlyZWN0bHkgb24gdXNlclJlZ2lzdGVycyBzaW5jZQorCSAqIHRoZSBDUFNSIG1heSBiZSB0aGUgUEMgcmVnaXN0ZXIgaXRzZWxmLgorCSAqLworCXJ2YWwgPSB1c2VyUmVnaXN0ZXJzW1JFR19DUFNSXSAmIH5DQ19NQVNLOworCXVzZXJSZWdpc3RlcnNbUkVHX0NQU1JdID0gcnZhbCB8ICh2YWwgJiBDQ19NQVNLKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL2Zwb3Bjb2RlLmMgYi9hcmNoL2FybS9ud2ZwZS9mcG9wY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWY1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9mcG9wY29kZS5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgICAgTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yCisgICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CisKKyAgICBEaXJlY3QgcXVlc3Rpb25zLCBjb21tZW50cyB0byBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZnBhMTEuaCIKKyNpbmNsdWRlICJzb2Z0ZmxvYXQuaCIKKyNpbmNsdWRlICJmcG9wY29kZS5oIgorI2luY2x1ZGUgImZwc3IuaCIKKyNpbmNsdWRlICJmcG1vZHVsZS5oIgorI2luY2x1ZGUgImZwbW9kdWxlLmlubCIKKworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKK2NvbnN0IGZsb2F0eDgwIGZsb2F0eDgwQ29uc3RhbnRbXSA9IHsKKwl7MHgwMDAwLCAweDAwMDAwMDAwMDAwMDAwMDBVTEx9LAkvKiBleHRlbmRlZCAwLjAgKi8KKwl7MHgzZmZmLCAweDgwMDAwMDAwMDAwMDAwMDBVTEx9LAkvKiBleHRlbmRlZCAxLjAgKi8KKwl7MHg0MDAwLCAweDgwMDAwMDAwMDAwMDAwMDBVTEx9LAkvKiBleHRlbmRlZCAyLjAgKi8KKwl7MHg0MDAwLCAweGMwMDAwMDAwMDAwMDAwMDBVTEx9LAkvKiBleHRlbmRlZCAzLjAgKi8KKwl7MHg0MDAxLCAweDgwMDAwMDAwMDAwMDAwMDBVTEx9LAkvKiBleHRlbmRlZCA0LjAgKi8KKwl7MHg0MDAxLCAweGEwMDAwMDAwMDAwMDAwMDBVTEx9LAkvKiBleHRlbmRlZCA1LjAgKi8KKwl7MHgzZmZlLCAweDgwMDAwMDAwMDAwMDAwMDBVTEx9LAkvKiBleHRlbmRlZCAwLjUgKi8KKwl7MHg0MDAyLCAweGEwMDAwMDAwMDAwMDAwMDBVTEx9CQkvKiBleHRlbmRlZCAxMC4wICovCit9OworI2VuZGlmCisKK2NvbnN0IGZsb2F0NjQgZmxvYXQ2NENvbnN0YW50W10gPSB7CisJMHgwMDAwMDAwMDAwMDAwMDAwVUxMLAkvKiBkb3VibGUgMC4wICovCisJMHgzZmYwMDAwMDAwMDAwMDAwVUxMLAkvKiBkb3VibGUgMS4wICovCisJMHg0MDAwMDAwMDAwMDAwMDAwVUxMLAkvKiBkb3VibGUgMi4wICovCisJMHg0MDA4MDAwMDAwMDAwMDAwVUxMLAkvKiBkb3VibGUgMy4wICovCisJMHg0MDEwMDAwMDAwMDAwMDAwVUxMLAkvKiBkb3VibGUgNC4wICovCisJMHg0MDE0MDAwMDAwMDAwMDAwVUxMLAkvKiBkb3VibGUgNS4wICovCisJMHgzZmUwMDAwMDAwMDAwMDAwVUxMLAkvKiBkb3VibGUgMC41ICovCisJMHg0MDI0MDAwMDAwMDAwMDAwVUxMCS8qIGRvdWJsZSAxMC4wICovCit9OworCitjb25zdCBmbG9hdDMyIGZsb2F0MzJDb25zdGFudFtdID0geworCTB4MDAwMDAwMDAsCQkvKiBzaW5nbGUgMC4wICovCisJMHgzZjgwMDAwMCwJCS8qIHNpbmdsZSAxLjAgKi8KKwkweDQwMDAwMDAwLAkJLyogc2luZ2xlIDIuMCAqLworCTB4NDA0MDAwMDAsCQkvKiBzaW5nbGUgMy4wICovCisJMHg0MDgwMDAwMCwJCS8qIHNpbmdsZSA0LjAgKi8KKwkweDQwYTAwMDAwLAkJLyogc2luZ2xlIDUuMCAqLworCTB4M2YwMDAwMDAsCQkvKiBzaW5nbGUgMC41ICovCisJMHg0MTIwMDAwMAkJLyogc2luZ2xlIDEwLjAgKi8KK307CisKKy8qIGNvbmRpdGlvbiBjb2RlIGxvb2t1cCB0YWJsZQorIGluZGV4IGludG8gdGhlIHRhYmxlIGlzIHRlc3QgY29kZTogRVEsIE5FLCAuLi4gTFQsIEdULCBBTCwgTlYKKyBiaXQgcG9zaXRpb24gaW4gc2hvcnQgaXMgY29uZGl0aW9uIGNvZGU6IE5aQ1YgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBhQ0NbMTZdID0geworCTB4RjBGMCwJCQkvLyBFUSA9PSBaIHNldAorCTB4MEYwRiwJCQkvLyBORQorCTB4Q0NDQywJCQkvLyBDUyA9PSBDIHNldAorCTB4MzMzMywJCQkvLyBDQworCTB4RkYwMCwJCQkvLyBNSSA9PSBOIHNldAorCTB4MDBGRiwJCQkvLyBQTAorCTB4QUFBQSwJCQkvLyBWUyA9PSBWIHNldAorCTB4NTU1NSwJCQkvLyBWQworCTB4MEMwQywJCQkvLyBISSA9PSBDIHNldCAmJiBaIGNsZWFyCisJMHhGM0YzLAkJCS8vIExTID09IEMgY2xlYXIgfHwgWiBzZXQKKwkweEFBNTUsCQkJLy8gR0UgPT0gKE49PVYpCisJMHg1NUFBLAkJCS8vIExUID09IChOIT1WKQorCTB4MEEwNSwJCQkvLyBHVCA9PSAoIVogJiYgKE49PVYpKQorCTB4RjVGQSwJCQkvLyBMRSA9PSAoWiB8fCAoTiE9VikpCisJMHhGRkZGLAkJCS8vIEFMIGFsd2F5cworCTAJCQkvLyBOVgorfTsKKwordW5zaWduZWQgaW50IGNoZWNrQ29uZGl0aW9uKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUsIGNvbnN0IHVuc2lnbmVkIGludCBjY29kZXMpCit7CisJcmV0dXJuIChhQ0Nbb3Bjb2RlID4+IDI4XSA+PiAoY2NvZGVzID4+IDI4KSkgJiAxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBvcGNvZGUuaCBiL2FyY2gvYXJtL253ZnBlL2Zwb3Bjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzNWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL2Zwb3Bjb2RlLmgKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgICAgTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yCisgICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CisgICAgKGMpIFBoaWxpcCBCbHVuZGVsbCwgMjAwMQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfX0ZQT1BDT0RFX0hfXworI2RlZmluZSBfX0ZQT1BDT0RFX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCitBUk0gRmxvYXRpbmcgUG9pbnQgSW5zdHJ1Y3Rpb24gQ2xhc3NlcworfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgCit8YyBvIG4gZHwxIDEgMCBQfFV8dXxXfEx8ICAgUm4gIHx2fCAgRmQgfDB8MHwwfDF8ICBvIGYgZiBzIGUgdCAgfCBDUERUCit8YyBvIG4gZHwxIDEgMCBQfFV8d3xXfEx8ICAgUm4gIHx4fCAgRmQgfDB8MHwxfDB8ICBvIGYgZiBzIGUgdCAgfCBDUERUIChjb3BybyAyKQorfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgCit8YyBvIG4gZHwxIDEgMSAwfGF8YnxjfGR8ZXwgIEZuIHxqfCAgRmQgfDB8MHwwfDF8ZnxnfGh8MHxpfCAgRm0gfCBDUERPCit8YyBvIG4gZHwxIDEgMSAwfGF8YnxjfEx8ZXwgIEZuIHwgICBSZCAgfDB8MHwwfDF8ZnxnfGh8MXxpfCAgRm0gfCBDUFJUCit8YyBvIG4gZHwxIDEgMSAwfGF8YnxjfDF8ZXwgIEZuIHwxfDF8MXwxfDB8MHwwfDF8ZnxnfGh8MXxpfCAgRm0gfCBjb21wYXJpc29ucworfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgCisKK0NQRFQJCWRhdGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zCisJCUxERiwgU1RGLCBMRk0gKGNvcHJvIDIpLCBTRk0gKGNvcHJvIDIpCisJCQorQ1BETwkJZHlhZGljIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zCisJCUFERiwgTVVGLCBTVUYsIFJTRiwgRFZGLCBSREYsCisJCVBPVywgUlBXLCBSTUYsIEZNTCwgRkRWLCBGUkQsIFBPTAorCitDUERPCQltb25hZGljIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zCisJCU1WRiwgTU5GLCBBQlMsIFJORCwgU1FULCBMT0csIExHTiwgRVhQLAorCQlTSU4sIENPUywgVEFOLCBBU04sIEFDUywgQVROLCBVUkQsIE5STQorCQkKK0NQUlQJCWpvaW50IGFyaXRobWV0aWMvZGF0YSB0cmFuc2ZlciBpbnN0cnVjdGlvbnMKKwkJRklYIChhcml0aG1ldGljIGZvbGxvd2VkIGJ5IGxvYWQvc3RvcmUpCisJCUZMVCAobG9hZC9zdG9yZSBmb2xsb3dlZCBieSBhcml0aG1ldGljKQorCQlDTUYsIENORiBDTUZFLCBDTkZFIChjb21wYXJpc29ucykKKwkJV0ZTLCBSRlMgKHdyaXRlL3JlYWQgZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyKQorCQlXRkMsIFJGQyAod3JpdGUvcmVhZCBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyKQorCitjb25kCQljb25kaXRpb24gY29kZXMKK1AJCXByZS9wb3N0IGluZGV4IGJpdDogMCA9IHBvc3RpbmRleCwgMSA9IHByZWluZGV4CitVCQl1cC9kb3duIGJpdDogMCA9IHN0YWNrIGdyb3dzIGRvd24sIDEgPSBzdGFjayBncm93cyB1cAorVwkJd3JpdGUgYmFjayBiaXQ6IDEgPSB1cGRhdGUgYmFzZSByZWdpc3RlciAoUm4pCitMCQlsb2FkL3N0b3JlIGJpdDogMCA9IHN0b3JlLCAxID0gbG9hZAorUm4JCWJhc2UgcmVnaXN0ZXIKK1JkCQlkZXN0aW5hdGlvbi9zb3VyY2UgcmVnaXN0ZXIJCQorRmQJCWZsb2F0aW5nIHBvaW50IGRlc3RpbmF0aW9uIHJlZ2lzdGVyCitGbgkJZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyCitGbQkJZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyIG9yIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50CisKK3V2CQl0cmFuc2ZlciBsZW5ndGggKFRBQkxFIDEpCit3eAkJcmVnaXN0ZXIgY291bnQgKFRBQkxFIDIpCithYmNkCQlhcml0aG1ldGljIG9wY29kZSAoVEFCTEVTIDMgJiA0KQorZWYJCWRlc3RpbmF0aW9uIHNpemUgKHJvdW5kaW5nIHByZWNpc2lvbikgKFRBQkxFIDUpCitnaAkJcm91bmRpbmcgbW9kZSAoVEFCTEUgNikKK2oJCWR5YWRpYy9tb25hZGljIGJpdDogMCA9IGR5YWRpYywgMSA9IG1vbmFkaWMKK2kgCQljb25zdGFudCBiaXQ6IDEgPSBjb25zdGFudCAoVEFCTEUgNikKKyovCisKKy8qCitUQUJMRSAxCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCit8ICBQcmVjaXNpb24gICAgICAgICAgICAgIHwgdSB8IHYgfCBGUFNSLkVQIHwgbGVuZ3RoICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCit8IFNpbmdsZSAgICAgICAgICAgICAgICAgIHwgMCD8IDAgfCAgICB4ICAgIHwgMSB3b3JkcyB8Cit8IERvdWJsZSAgICAgICAgICAgICAgICAgIHwgMSD8IDEgfCAgICB4ICAgIHwgMiB3b3JkcyB8Cit8IEV4dGVuZGVkICAgICAgICAgICAgICAgIHwgMSD8IDEgfCAgICB4ICAgIHwgMyB3b3JkcyB8Cit8IFBhY2tlZCBkZWNpbWFsICAgICAgICAgIHwgMSD8IDEgfCAgICAwICAgIHwgMyB3b3JkcyB8Cit8IEV4cGFuZGVkIHBhY2tlZCBkZWNpbWFsIHwgMSD8IDEgfCAgICAxICAgIHwgNCB3b3JkcyB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCitOb3RlOiB4ID0gZG9uJ3QgY2FyZQorKi8KKworLyoKK1RBQkxFIDIKKystLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgdyB8IHggfCBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHRyYW5zZmVyIHwKKystLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgMCD8IDEgfCAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMSD8IDAgfCAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMSD8IDEgfCAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMCD8IDAgfCAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyovCisKKy8qCitUQUJMRSAzOiBEeWFkaWMgRmxvYXRpbmcgUG9pbnQgT3Bjb2RlcworKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBhIHwgYiB8IGMgfCBkIHwgTW5lbW9uaWMgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgfCBPcGVyYXRpb24gICAgICAgICAgICAgfAorKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCAwIHwgMCB8IDAgfCAwIHwgQURGICAgICAgfCBBZGQgICAgICAgICAgICAgICAgICAgfCBGZCA6PSBGbiArIEZtICAgICAgICAgfAorfCAwIHwgMCB8IDAgfCAxIHwgTVVGICAgICAgfCBNdWx0aXBseSAgICAgICAgICAgICAgfCBGZCA6PSBGbiAqIEZtICAgICAgICAgfAorfCAwIHwgMCB8IDEgfCAwIHwgU1VGICAgICAgfCBTdWJ0cmFjdCAgICAgICAgICAgICAgfCBGZCA6PSBGbiAtIEZtICAgICAgICAgfAorfCAwIHwgMCB8IDEgfCAxIHwgUlNGICAgICAgfCBSZXZlcnNlIHN1YnRyYWN0ICAgICAgfCBGZCA6PSBGbSAtIEZuICAgICAgICAgfAorfCAwIHwgMSB8IDAgfCAwIHwgRFZGICAgICAgfCBEaXZpZGUgICAgICAgICAgICAgICAgfCBGZCA6PSBGbiAvIEZtICAgICAgICAgfAorfCAwIHwgMSB8IDAgfCAxIHwgUkRGICAgICAgfCBSZXZlcnNlIGRpdmlkZSAgICAgICAgfCBGZCA6PSBGbSAvIEZuICAgICAgICAgfAorfCAwIHwgMSB8IDEgfCAwIHwgUE9XICAgICAgfCBQb3dlciAgICAgICAgICAgICAgICAgfCBGZCA6PSBGbiBeIEZtICAgICAgICAgfAorfCAwIHwgMSB8IDEgfCAxIHwgUlBXICAgICAgfCBSZXZlcnNlIHBvd2VyICAgICAgICAgfCBGZCA6PSBGbSBeIEZuICAgICAgICAgfAorfCAxIHwgMCB8IDAgfCAwIHwgUk1GICAgICAgfCBSZW1haW5kZXIgICAgICAgICAgICAgfCBGZCA6PSBJRUVFIHJlbShGbi9GbSkgfAorfCAxIHwgMCB8IDAgfCAxIHwgRk1MICAgICAgfCBGYXN0IE11bHRpcGx5ICAgICAgICAgfCBGZCA6PSBGbiAqIEZtICAgICAgICAgfAorfCAxIHwgMCB8IDEgfCAwIHwgRkRWICAgICAgfCBGYXN0IERpdmlkZSAgICAgICAgICAgfCBGZCA6PSBGbiAvIEZtICAgICAgICAgfAorfCAxIHwgMCB8IDEgfCAxIHwgRlJEICAgICAgfCBGYXN0IHJldmVyc2UgZGl2aWRlICAgfCBGZCA6PSBGbSAvIEZuICAgICAgICAgfAorfCAxIHwgMSB8IDAgfCAwIHwgUE9MICAgICAgfCBQb2xhciBhbmdsZSAoQXJjVGFuMikgfCBGZCA6PSBhcmN0YW4yKEZuLEZtKSAgfAorfCAxIHwgMSB8IDAgfCAxIHwgICAgICAgICAgfCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gfCB0cmFwICAgICAgICAgICAgICAgICAgfAorfCAxIHwgMSB8IDEgfCAwIHwgICAgICAgICAgfCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gfCB0cmFwICAgICAgICAgICAgICAgICAgfAorfCAxIHwgMSB8IDEgfCAxIHwgICAgICAgICAgfCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gfCB0cmFwICAgICAgICAgICAgICAgICAgfAorKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworTm90ZTogUE9XLCBSUFcsIFBPTCBhcmUgZGVwcmVjYXRlZCwgYW5kIGFyZSBhdmFpbGFibGUgZm9yIGJhY2t3YXJkcworICAgICAgY29tcGF0aWJpbGl0eSBvbmx5LgorKi8KKworLyoKK1RBQkxFIDQ6IE1vbmFkaWMgRmxvYXRpbmcgUG9pbnQgT3Bjb2RlcworKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBhIHwgYiB8IGMgfCBkIHwgTW5lbW9uaWMgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgfCBPcGVyYXRpb24gICAgICAgICAgICAgfAorKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCAwIHwgMCB8IDAgfCAwIHwgTVZGICAgICAgfCBNb3ZlICAgICAgICAgICAgICAgICAgfCBGZCA6PSBGbSAgICAgICAgICAgICAgfAorfCAwIHwgMCB8IDAgfCAxIHwgTU5GICAgICAgfCBNb3ZlIG5lZ2F0ZWQgICAgICAgICAgfCBGZCA6PSAtIEZtICAgICAgICAgICAgfAorfCAwIHwgMCB8IDEgfCAwIHwgQUJTICAgICAgfCBBYnNvbHV0ZSB2YWx1ZSAgICAgICAgfCBGZCA6PSBhYnMoRm0pICAgICAgICAgfAorfCAwIHwgMCB8IDEgfCAxIHwgUk5EICAgICAgfCBSb3VuZCB0byBpbnRlZ2VyICAgICAgfCBGZCA6PSBpbnQoRm0pICAgICAgICAgfAorfCAwIHwgMSB8IDAgfCAwIHwgU1FUICAgICAgfCBTcXVhcmUgcm9vdCAgICAgICAgICAgfCBGZCA6PSBzcXJ0KEZtKSAgICAgICAgfAorfCAwIHwgMSB8IDAgfCAxIHwgTE9HICAgICAgfCBMb2cgYmFzZSAxMCAgICAgICAgICAgfCBGZCA6PSBsb2cxMChGbSkgICAgICAgfAorfCAwIHwgMSB8IDEgfCAwIHwgTEdOICAgICAgfCBMb2cgYmFzZSBlICAgICAgICAgICAgfCBGZCA6PSBsbihGbSkgICAgICAgICAgfAorfCAwIHwgMSB8IDEgfCAxIHwgRVhQICAgICAgfCBFeHBvbmVudCAgICAgICAgICAgICAgfCBGZCA6PSBlIF4gRm0gICAgICAgICAgfAorfCAxIHwgMCB8IDAgfCAwIHwgU0lOICAgICAgfCBTaW5lICAgICAgICAgICAgICAgICAgfCBGZCA6PSBzaW4oRm0pICAgICAgICAgfAorfCAxIHwgMCB8IDAgfCAxIHwgQ09TICAgICAgfCBDb3NpbmUgICAgICAgICAgICAgICAgfCBGZCA6PSBjb3MoRm0pICAgICAgICAgfAorfCAxIHwgMCB8IDEgfCAwIHwgVEFOICAgICAgfCBUYW5nZW50ICAgICAgICAgICAgICAgfCBGZCA6PSB0YW4oRm0pICAgICAgICAgfAorfCAxIHwgMCB8IDEgfCAxIHwgQVNOICAgICAgfCBBcmMgU2luZSAgICAgICAgICAgICAgfCBGZCA6PSBhcmNzaW4oRm0pICAgICAgfAorfCAxIHwgMSB8IDAgfCAwIHwgQUNTICAgICAgfCBBcmMgQ29zaW5lICAgICAgICAgICAgfCBGZCA6PSBhcmNjb3MoRm0pICAgICAgfAorfCAxIHwgMSB8IDAgfCAxIHwgQVROICAgICAgfCBBcmMgVGFuZ2VudCAgICAgICAgICAgfCBGZCA6PSBhcmN0YW4oRm0pICAgICAgfAorfCAxIHwgMSB8IDEgfCAwIHwgVVJEICAgICAgfCBVbm5vcm1hbGl6ZWQgcm91bmQgICAgfCBGZCA6PSBpbnQoRm0pICAgICAgICAgfAorfCAxIHwgMSB8IDEgfCAxIHwgTlJNICAgICAgfCBOb3JtYWxpemUgICAgICAgICAgICAgfCBGZCA6PSBub3JtKEZtKSAgICAgICAgfAorKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworTm90ZTogTE9HLCBMR04sIEVYUCwgU0lOLCBDT1MsIFRBTiwgQVNOLCBBQ1MsIEFUTiBhcmUgZGVwcmVjYXRlZCwgYW5kIGFyZQorICAgICAgYXZhaWxhYmxlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5LgorKi8KKworLyoKK1RBQkxFIDUKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rCit8ICBSb3VuZGluZyBQcmVjaXNpb24gICAgIHwgZSB8IGYgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKK3wgSUVFRSBTaW5nbGUgcHJlY2lzaW9uICAgfCAwIPwgMCB8Cit8IElFRUUgRG91YmxlIHByZWNpc2lvbiAgIHwgMCD8IDEgfAorfCBJRUVFIEV4dGVuZGVkIHByZWNpc2lvbiB8IDEg/CAwIHwKK3wgdW5kZWZpbmVkICh0cmFwKSAgICAgICAgfCAxIPwgMSB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKworKi8KKworLyoKK1RBQkxFIDUKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKK3wgIFJvdW5kaW5nIE1vZGUgICAgICAgICAgICAgICAgICB8IGcgfCBoIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKK3wgUm91bmQgdG8gbmVhcmVzdCAoZGVmYXVsdCkgICAgICB8IDAg/CAwIHwKK3wgUm91bmQgdG93YXJkIHBsdXMgaW5maW5pdHkgICAgICB8IDAg/CAxIHwKK3wgUm91bmQgdG93YXJkIG5lZ2F0aXZlIGluZmluaXR5ICB8IDEg/CAwIHwKK3wgUm91bmQgdG93YXJkIHplcm8gICAgICAgICAgICAgICB8IDEg/CAxIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKKyovCisKKy8qCis9PT0KKz09PSBEZWZpbml0aW9ucyBmb3IgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zCis9PT0KKyovCisKKy8qIGJpdCBtYXNrcyAqLworI2RlZmluZSBCSVRfUFJFSU5ERVgJMHgwMTAwMDAwMAorI2RlZmluZSBCSVRfVVAJCTB4MDA4MDAwMDAKKyNkZWZpbmUgQklUX1dSSVRFX0JBQ0sJMHgwMDIwMDAwMAorI2RlZmluZSBCSVRfTE9BRAkweDAwMTAwMDAwCisKKy8qIG1hc2tzIGZvciBsb2FkL3N0b3JlICovCisjZGVmaW5lIE1BU0tfQ1BEVAkJMHgwYzAwMDAwMAkvKiBkYXRhIHByb2Nlc3Npbmcgb3Bjb2RlICovCisjZGVmaW5lIE1BU0tfT0ZGU0VUCQkweDAwMDAwMGZmCisjZGVmaW5lIE1BU0tfVFJBTlNGRVJfTEVOR1RICTB4MDA0MDgwMDAKKyNkZWZpbmUgTUFTS19SRUdJU1RFUl9DT1VOVAlNQVNLX1RSQU5TRkVSX0xFTkdUSAorI2RlZmluZSBNQVNLX0NPUFJPQ0VTU09SCTB4MDAwMDBmMDAKKworLyogVGVzdHMgZm9yIHRyYW5zZmVyIGxlbmd0aCAqLworI2RlZmluZSBUUkFOU0ZFUl9TSU5HTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFJBTlNGRVJfRE9VQkxFCQkweDAwMDA4MDAwCisjZGVmaW5lIFRSQU5TRkVSX0VYVEVOREVECTB4MDA0MDAwMDAKKyNkZWZpbmUgVFJBTlNGRVJfUEFDS0VECQlNQVNLX1RSQU5TRkVSX0xFTkdUSAorCisvKiBHZXQgdGhlIGNvcHJvY2Vzc29yIG51bWJlciBmcm9tIHRoZSBvcGNvZGUuICovCisjZGVmaW5lIGdldENvcHJvY2Vzc29yTnVtYmVyKG9wY29kZSkJKChvcGNvZGUgJiBNQVNLX0NPUFJPQ0VTU09SKSA+PiA4KQorCisvKiBHZXQgdGhlIG9mZnNldCBmcm9tIHRoZSBvcGNvZGUuICovCisjZGVmaW5lIGdldE9mZnNldChvcGNvZGUpCQkob3Bjb2RlICYgTUFTS19PRkZTRVQpCisKKy8qIFRlc3RzIGZvciBzcGVjaWZpYyBkYXRhIHRyYW5zZmVyIGxvYWQvc3RvcmUgb3Bjb2Rlcy4gKi8KKyNkZWZpbmUgVEVTVF9PUENPREUob3Bjb2RlLG1hc2spCSgoKG9wY29kZSkgJiAobWFzaykpID09IChtYXNrKSkKKworI2RlZmluZSBMT0FEX09QKG9wY29kZSkgICBURVNUX09QQ09ERSgob3Bjb2RlKSxNQVNLX0NQRFQgfCBCSVRfTE9BRCkKKyNkZWZpbmUgU1RPUkVfT1Aob3Bjb2RlKSAgKChvcGNvZGUgJiAoTUFTS19DUERUIHwgQklUX0xPQUQpKSA9PSBNQVNLX0NQRFQpCisKKyNkZWZpbmUgTERGX09QKG9wY29kZSkJKExPQURfT1Aob3Bjb2RlKSAmJiAoZ2V0Q29wcm9jZXNzb3JOdW1iZXIob3Bjb2RlKSA9PSAxKSkKKyNkZWZpbmUgTEZNX09QKG9wY29kZSkJKExPQURfT1Aob3Bjb2RlKSAmJiAoZ2V0Q29wcm9jZXNzb3JOdW1iZXIob3Bjb2RlKSA9PSAyKSkKKyNkZWZpbmUgU1RGX09QKG9wY29kZSkJKFNUT1JFX09QKG9wY29kZSkgJiYgKGdldENvcHJvY2Vzc29yTnVtYmVyKG9wY29kZSkgPT0gMSkpCisjZGVmaW5lIFNGTV9PUChvcGNvZGUpCShTVE9SRV9PUChvcGNvZGUpICYmIChnZXRDb3Byb2Nlc3Nvck51bWJlcihvcGNvZGUpID09IDIpKQorCisjZGVmaW5lIFBSRUlOREVYRUQob3Bjb2RlKQkJKChvcGNvZGUgJiBCSVRfUFJFSU5ERVgpICE9IDApCisjZGVmaW5lIFBPU1RJTkRFWEVEKG9wY29kZSkJCSgob3Bjb2RlICYgQklUX1BSRUlOREVYKSA9PSAwKQorI2RlZmluZSBCSVRfVVBfU0VUKG9wY29kZSkJCSgob3Bjb2RlICYgQklUX1VQKSAhPSAwKQorI2RlZmluZSBCSVRfVVBfQ0xFQVIob3Bjb2RlKQkJKChvcGNvZGUgJiBCSVRfRE9XTikgPT0gMCkKKyNkZWZpbmUgV1JJVEVfQkFDSyhvcGNvZGUpCQkoKG9wY29kZSAmIEJJVF9XUklURV9CQUNLKSAhPSAwKQorI2RlZmluZSBMT0FEKG9wY29kZSkJCQkoKG9wY29kZSAmIEJJVF9MT0FEKSAhPSAwKQorI2RlZmluZSBTVE9SRShvcGNvZGUpCQkJKChvcGNvZGUgJiBCSVRfTE9BRCkgPT0gMCkKKworLyoKKz09PQorPT09IERlZmluaXRpb25zIGZvciBhcml0aG1ldGljIGluc3RydWN0aW9ucworPT09CisqLworLyogYml0IG1hc2tzICovCisjZGVmaW5lIEJJVF9NT05BRElDCTB4MDAwMDgwMDAKKyNkZWZpbmUgQklUX0NPTlNUQU5UCTB4MDAwMDAwMDgKKworI2RlZmluZSBDT05TVEFOVF9GTShvcGNvZGUpCQkoKG9wY29kZSAmIEJJVF9DT05TVEFOVCkgIT0gMCkKKyNkZWZpbmUgTU9OQURJQ19JTlNUUlVDVElPTihvcGNvZGUpCSgob3Bjb2RlICYgQklUX01PTkFESUMpICE9IDApCisKKy8qIGluc3RydWN0aW9uIGlkZW50aWZpY2F0aW9uIG1hc2tzICovCisjZGVmaW5lIE1BU0tfQ1BETwkJMHgwZTAwMDAwMAkvKiBhcml0aG1ldGljIG9wY29kZSAqLworI2RlZmluZSBNQVNLX0FSSVRITUVUSUNfT1BDT0RFCTB4MDBmMDgwMDAKKyNkZWZpbmUgTUFTS19ERVNUSU5BVElPTl9TSVpFCTB4MDAwODAwODAKKworLyogZHlhZGljIGFyaXRobWV0aWMgb3Bjb2Rlcy4gKi8KKyNkZWZpbmUgQURGX0NPREUJMHgwMDAwMDAwMAorI2RlZmluZSBNVUZfQ09ERQkweDAwMTAwMDAwCisjZGVmaW5lIFNVRl9DT0RFCTB4MDAyMDAwMDAKKyNkZWZpbmUgUlNGX0NPREUJMHgwMDMwMDAwMAorI2RlZmluZSBEVkZfQ09ERQkweDAwNDAwMDAwCisjZGVmaW5lIFJERl9DT0RFCTB4MDA1MDAwMDAKKyNkZWZpbmUgUE9XX0NPREUJMHgwMDYwMDAwMAorI2RlZmluZSBSUFdfQ09ERQkweDAwNzAwMDAwCisjZGVmaW5lIFJNRl9DT0RFCTB4MDA4MDAwMDAKKyNkZWZpbmUgRk1MX0NPREUJMHgwMDkwMDAwMAorI2RlZmluZSBGRFZfQ09ERQkweDAwYTAwMDAwCisjZGVmaW5lIEZSRF9DT0RFCTB4MDBiMDAwMDAKKyNkZWZpbmUgUE9MX0NPREUJMHgwMGMwMDAwMAorLyogMHgwMGQwMDAwMCBpcyBhbiBpbnZhbGlkIGR5YWRpYyBhcml0aG1ldGljIG9wY29kZSAqLworLyogMHgwMGUwMDAwMCBpcyBhbiBpbnZhbGlkIGR5YWRpYyBhcml0aG1ldGljIG9wY29kZSAqLworLyogMHgwMGYwMDAwMCBpcyBhbiBpbnZhbGlkIGR5YWRpYyBhcml0aG1ldGljIG9wY29kZSAqLworCisvKiBtb25hZGljIGFyaXRobWV0aWMgb3Bjb2Rlcy4gKi8KKyNkZWZpbmUgTVZGX0NPREUJMHgwMDAwODAwMAorI2RlZmluZSBNTkZfQ09ERQkweDAwMTA4MDAwCisjZGVmaW5lIEFCU19DT0RFCTB4MDAyMDgwMDAKKyNkZWZpbmUgUk5EX0NPREUJMHgwMDMwODAwMAorI2RlZmluZSBTUVRfQ09ERQkweDAwNDA4MDAwCisjZGVmaW5lIExPR19DT0RFCTB4MDA1MDgwMDAKKyNkZWZpbmUgTEdOX0NPREUJMHgwMDYwODAwMAorI2RlZmluZSBFWFBfQ09ERQkweDAwNzA4MDAwCisjZGVmaW5lIFNJTl9DT0RFCTB4MDA4MDgwMDAKKyNkZWZpbmUgQ09TX0NPREUJMHgwMDkwODAwMAorI2RlZmluZSBUQU5fQ09ERQkweDAwYTA4MDAwCisjZGVmaW5lIEFTTl9DT0RFCTB4MDBiMDgwMDAKKyNkZWZpbmUgQUNTX0NPREUJMHgwMGMwODAwMAorI2RlZmluZSBBVE5fQ09ERQkweDAwZDA4MDAwCisjZGVmaW5lIFVSRF9DT0RFCTB4MDBlMDgwMDAKKyNkZWZpbmUgTlJNX0NPREUJMHgwMGYwODAwMAorCisvKgorPT09Cis9PT0gRGVmaW5pdGlvbnMgZm9yIHJlZ2lzdGVyIHRyYW5zZmVyIGFuZCBjb21wYXJpc29uIGluc3RydWN0aW9ucworPT09CisqLworCisjZGVmaW5lIE1BU0tfQ1BSVAkJMHgwZTAwMDAxMAkvKiByZWdpc3RlciB0cmFuc2ZlciBvcGNvZGUgKi8KKyNkZWZpbmUgTUFTS19DUFJUX0NPREUJCTB4MDBmMDAwMDAKKyNkZWZpbmUgRkxUX0NPREUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRklYX0NPREUJCTB4MDAxMDAwMDAKKyNkZWZpbmUgV0ZTX0NPREUJCTB4MDAyMDAwMDAKKyNkZWZpbmUgUkZTX0NPREUJCTB4MDAzMDAwMDAKKyNkZWZpbmUgV0ZDX0NPREUJCTB4MDA0MDAwMDAKKyNkZWZpbmUgUkZDX0NPREUJCTB4MDA1MDAwMDAKKyNkZWZpbmUgQ01GX0NPREUJCTB4MDA5MDAwMDAKKyNkZWZpbmUgQ05GX0NPREUJCTB4MDBiMDAwMDAKKyNkZWZpbmUgQ01GRV9DT0RFCQkweDAwZDAwMDAwCisjZGVmaW5lIENORkVfQ09ERQkJMHgwMGYwMDAwMAorCisvKgorPT09Cis9PT0gQ29tbW9uIGRlZmluaXRpb25zCis9PT0KKyovCisKKy8qIHJlZ2lzdGVyIG1hc2tzICovCisjZGVmaW5lIE1BU0tfUmQJCTB4MDAwMGYwMDAKKyNkZWZpbmUgTUFTS19SbgkJMHgwMDBmMDAwMAorI2RlZmluZSBNQVNLX0ZkCQkweDAwMDA3MDAwCisjZGVmaW5lIE1BU0tfRm0JCTB4MDAwMDAwMDcKKyNkZWZpbmUgTUFTS19GbgkJMHgwMDA3MDAwMAorCisvKiBjb25kaXRpb24gY29kZSBtYXNrcyAqLworI2RlZmluZSBDQ19NQVNLCQkweGYwMDAwMDAwCisjZGVmaW5lIENDX05FR0FUSVZFCTB4ODAwMDAwMDAKKyNkZWZpbmUgQ0NfWkVSTwkJMHg0MDAwMDAwMAorI2RlZmluZSBDQ19DQVJSWQkweDIwMDAwMDAwCisjZGVmaW5lIENDX09WRVJGTE9XCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0NfRVEJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0NfTkUJCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0NfQ1MJCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ0NfSFMJCUNDX0NTCisjZGVmaW5lIENDX0NDCQkweDMwMDAwMDAwCisjZGVmaW5lIENDX0xPCQlDQ19DQworI2RlZmluZSBDQ19NSQkJMHg0MDAwMDAwMAorI2RlZmluZSBDQ19QTAkJMHg1MDAwMDAwMAorI2RlZmluZSBDQ19WUwkJMHg2MDAwMDAwMAorI2RlZmluZSBDQ19WQwkJMHg3MDAwMDAwMAorI2RlZmluZSBDQ19ISQkJMHg4MDAwMDAwMAorI2RlZmluZSBDQ19MUwkJMHg5MDAwMDAwMAorI2RlZmluZSBDQ19HRQkJMHhhMDAwMDAwMAorI2RlZmluZSBDQ19MVAkJMHhiMDAwMDAwMAorI2RlZmluZSBDQ19HVAkJMHhjMDAwMDAwMAorI2RlZmluZSBDQ19MRQkJMHhkMDAwMDAwMAorI2RlZmluZSBDQ19BTAkJMHhlMDAwMDAwMAorI2RlZmluZSBDQ19OVgkJMHhmMDAwMDAwMAorCisvKiByb3VuZGluZyBtYXNrcy92YWx1ZXMgKi8KKyNkZWZpbmUgTUFTS19ST1VORElOR19NT0RFCTB4MDAwMDAwNjAKKyNkZWZpbmUgUk9VTkRfVE9fTkVBUkVTVAkweDAwMDAwMDAwCisjZGVmaW5lIFJPVU5EX1RPX1BMVVNfSU5GSU5JVFkJMHgwMDAwMDAyMAorI2RlZmluZSBST1VORF9UT19NSU5VU19JTkZJTklUWQkweDAwMDAwMDQwCisjZGVmaW5lIFJPVU5EX1RPX1pFUk8JCTB4MDAwMDAwNjAKKworI2RlZmluZSBNQVNLX1JPVU5ESU5HX1BSRUNJU0lPTgkweDAwMDgwMDgwCisjZGVmaW5lIFJPVU5EX1NJTkdMRQkJMHgwMDAwMDAwMAorI2RlZmluZSBST1VORF9ET1VCTEUJCTB4MDAwMDAwODAKKyNkZWZpbmUgUk9VTkRfRVhURU5ERUQJCTB4MDAwODAwMDAKKworLyogR2V0IHRoZSBjb25kaXRpb24gY29kZSBmcm9tIHRoZSBvcGNvZGUuICovCisjZGVmaW5lIGdldENvbmRpdGlvbihvcGNvZGUpCQkob3Bjb2RlID4+IDI4KQorCisvKiBHZXQgdGhlIHNvdXJjZSByZWdpc3RlciBmcm9tIHRoZSBvcGNvZGUuICovCisjZGVmaW5lIGdldFJuKG9wY29kZSkJCQkoKG9wY29kZSAmIE1BU0tfUm4pID4+IDE2KQorCisvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KKyNkZWZpbmUgZ2V0RmQob3Bjb2RlKQkJCSgob3Bjb2RlICYgTUFTS19GZCkgPj4gMTIpCisKKy8qIEdldCB0aGUgZmlyc3Qgc291cmNlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KKyNkZWZpbmUgZ2V0Rm4ob3Bjb2RlKQkJKChvcGNvZGUgJiBNQVNLX0ZuKSA+PiAxNikKKworLyogR2V0IHRoZSBzZWNvbmQgc291cmNlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KKyNkZWZpbmUgZ2V0Rm0ob3Bjb2RlKQkJKG9wY29kZSAmIE1BU0tfRm0pCisKKy8qIEdldCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgZnJvbSB0aGUgb3Bjb2RlLiAqLworI2RlZmluZSBnZXRSZChvcGNvZGUpCQkoKG9wY29kZSAmIE1BU0tfUmQpID4+IDEyKQorCisvKiBHZXQgdGhlIHJvdW5kaW5nIG1vZGUgZnJvbSB0aGUgb3Bjb2RlLiAqLworI2RlZmluZSBnZXRSb3VuZGluZ01vZGUob3Bjb2RlKQkJKChvcGNvZGUgJiBNQVNLX1JPVU5ESU5HX01PREUpID4+IDUpCisKKyNpZmRlZiBDT05GSUdfRlBFX05XRlBFX1hQCitzdGF0aWMgaW5saW5lIGNvbnN0IGZsb2F0eDgwIGdldEV4dGVuZGVkQ29uc3RhbnQoY29uc3QgdW5zaWduZWQgaW50IG5JbmRleCkKK3sKKwlleHRlcm4gY29uc3QgZmxvYXR4ODAgZmxvYXR4ODBDb25zdGFudFtdOworCXJldHVybiBmbG9hdHg4MENvbnN0YW50W25JbmRleF07Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBjb25zdCBmbG9hdDY0IGdldERvdWJsZUNvbnN0YW50KGNvbnN0IHVuc2lnbmVkIGludCBuSW5kZXgpCit7CisJZXh0ZXJuIGNvbnN0IGZsb2F0NjQgZmxvYXQ2NENvbnN0YW50W107CisJcmV0dXJuIGZsb2F0NjRDb25zdGFudFtuSW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGZsb2F0MzIgZ2V0U2luZ2xlQ29uc3RhbnQoY29uc3QgdW5zaWduZWQgaW50IG5JbmRleCkKK3sKKwlleHRlcm4gY29uc3QgZmxvYXQzMiBmbG9hdDMyQ29uc3RhbnRbXTsKKwlyZXR1cm4gZmxvYXQzMkNvbnN0YW50W25JbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldFRyYW5zZmVyTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisJdW5zaWduZWQgaW50IG5SYzsKKworCXN3aXRjaCAob3Bjb2RlICYgTUFTS19UUkFOU0ZFUl9MRU5HVEgpIHsKKwljYXNlIDB4MDAwMDAwMDA6CisJCW5SYyA9IDE7CisJCWJyZWFrOwkJLyogc2luZ2xlIHByZWNpc2lvbiAqLworCWNhc2UgMHgwMDAwODAwMDoKKwkJblJjID0gMjsKKwkJYnJlYWs7CQkvKiBkb3VibGUgcHJlY2lzaW9uICovCisJY2FzZSAweDAwNDAwMDAwOgorCQluUmMgPSAzOworCQlicmVhazsJCS8qIGV4dGVuZGVkIHByZWNpc2lvbiAqLworCWRlZmF1bHQ6CisJCW5SYyA9IDA7CisJfQorCisJcmV0dXJuIChuUmMpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRSZWdpc3RlckNvdW50KGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisJdW5zaWduZWQgaW50IG5SYzsKKworCXN3aXRjaCAob3Bjb2RlICYgTUFTS19SRUdJU1RFUl9DT1VOVCkgeworCWNhc2UgMHgwMDAwMDAwMDoKKwkJblJjID0gNDsKKwkJYnJlYWs7CisJY2FzZSAweDAwMDA4MDAwOgorCQluUmMgPSAxOworCQlicmVhazsKKwljYXNlIDB4MDA0MDAwMDA6CisJCW5SYyA9IDI7CisJCWJyZWFrOworCWNhc2UgMHgwMDQwODAwMDoKKwkJblJjID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJblJjID0gMDsKKwl9CisKKwlyZXR1cm4gKG5SYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldFJvdW5kaW5nUHJlY2lzaW9uKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisJdW5zaWduZWQgaW50IG5SYzsKKworCXN3aXRjaCAob3Bjb2RlICYgTUFTS19ST1VORElOR19QUkVDSVNJT04pIHsKKwljYXNlIDB4MDAwMDAwMDA6CisJCW5SYyA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgwMDAwMDA4MDoKKwkJblJjID0gMjsKKwkJYnJlYWs7CisJY2FzZSAweDAwMDgwMDAwOgorCQluUmMgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluUmMgPSAwOworCX0KKworCXJldHVybiAoblJjKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0RGVzdGluYXRpb25TaXplKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUpCit7CisJdW5zaWduZWQgaW50IG5SYzsKKworCXN3aXRjaCAob3Bjb2RlICYgTUFTS19ERVNUSU5BVElPTl9TSVpFKSB7CisJY2FzZSAweDAwMDAwMDAwOgorCQluUmMgPSB0eXBlU2luZ2xlOworCQlicmVhazsKKwljYXNlIDB4MDAwMDAwODA6CisJCW5SYyA9IHR5cGVEb3VibGU7CisJCWJyZWFrOworCWNhc2UgMHgwMDA4MDAwMDoKKwkJblJjID0gdHlwZUV4dGVuZGVkOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluUmMgPSB0eXBlTm9uZTsKKwl9CisKKwlyZXR1cm4gKG5SYyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBzci5oIGIvYXJjaC9hcm0vbndmcGUvZnBzci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWIzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9mcHNyLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgICAgTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yCisgICAgKGMpIFJlYmVsLmNvbSwgMTk5OC0xOTk5CisKKyAgICBEaXJlY3QgcXVlc3Rpb25zLCBjb21tZW50cyB0byBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9fRlBTUl9IX18KKyNkZWZpbmUgX19GUFNSX0hfXworCisvKgorVGhlIEZQU1IgaXMgYSAzMiBiaXQgcmVnaXN0ZXIgY29uc2lzdGluZyBvZiA0IHBhcnRzLCBlYWNoIGV4YWN0bHkKK29uZSBieXRlLgorCisJU1lTVEVNIElECisJRVhDRVBUSU9OIFRSQVAgRU5BQkxFIEJZVEUKKwlTWVNURU0gQ09OVFJPTCBCWVRFCisJQ1VNVUxBVElWRSBFWENFUFRJT04gRkxBR1MgQllURQorCQorVGhlIEZQQ1IgaXMgYSAzMiBiaXQgcmVnaXN0ZXIgY29uc2lzdGluZyBvZiBiaXQgZmxhZ3MuCisqLworCisvKiBTWVNURU0gSUQKKy0tLS0tLS0tLS0tLQorTm90ZTogdGhlIHN5c3RlbSBpZCBieXRlIGlzIHJlYWQgb25seSAgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRlBTUjsJLyogdHlwZSBmb3IgZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBGUENSOwkvKiB0eXBlIGZvciBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTUFTS19TWVNJRAkJMHhmZjAwMDAwMAorI2RlZmluZSBCSVRfSEFSRFdBUkUJCTB4ODAwMDAwMDAKKyNkZWZpbmUgRlBfRU1VTEFUT1IJCTB4MDEwMDAwMDAJLyogU3lzdGVtIElEIGZvciBlbXVsYXRvciAqLworI2RlZmluZSBGUF9BQ0NFTEVSQVRPUgkJMHg4MTAwMDAwMAkvKiBTeXN0ZW0gSUQgZm9yIEZQQTExICovCisKKy8qIEVYQ0VQVElPTiBUUkFQIEVOQUJMRSBCWVRFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1BU0tfVFJBUF9FTkFCTEUJMHgwMGZmMDAwMAorI2RlZmluZSBNQVNLX1RSQVBfRU5BQkxFX1NUUklDVAkweDAwMWYwMDAwCisjZGVmaW5lIEJJVF9JWEUJCTB4MDAxMDAwMDAJLyogaW5leGFjdCBleGNlcHRpb24gZW5hYmxlICovCisjZGVmaW5lIEJJVF9VRkUJCTB4MDAwODAwMDAJLyogdW5kZXJmbG93IGV4Y2VwdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgQklUX09GRQkJMHgwMDA0MDAwMAkvKiBvdmVyZmxvdyBleGNlcHRpb24gZW5hYmxlICovCisjZGVmaW5lIEJJVF9EWkUJCTB4MDAwMjAwMDAJLyogZGl2aWRlIGJ5IHplcm8gZXhjZXB0aW9uIGVuYWJsZSAqLworI2RlZmluZSBCSVRfSU9FCQkweDAwMDEwMDAwCS8qIGludmFsaWQgb3BlcmF0aW9uIGV4Y2VwdGlvbiBlbmFibGUgKi8KKworLyogU1lTVEVNIENPTlRST0wgQllURQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1BU0tfU1lTVEVNX0NPTlRST0wJMHgwMDAwZmYwMAorI2RlZmluZSBNQVNLX1RSQVBfU1RSSUNUCTB4MDAwMDFmMDAKKworI2RlZmluZSBCSVRfQUMJMHgwMDAwMTAwMAkvKiB1c2UgYWx0ZXJuYXRpdmUgQy1mbGFnIGRlZmluaXRpb24KKwkJCQkgICBmb3IgY29tcGFyZXMgKi8KKyNkZWZpbmUgQklUX0VQCTB4MDAwMDA4MDAJLyogdXNlIGV4cGFuZGVkIHBhY2tlZCBkZWNpbWFsIGZvcm1hdCAqLworI2RlZmluZSBCSVRfU08JMHgwMDAwMDQwMAkvKiBzZWxlY3Qgc3luY2hyb25vdXMgb3BlcmF0aW9uIG9mIEZQQSAqLworI2RlZmluZSBCSVRfTkUJMHgwMDAwMDIwMAkvKiBOYU4gZXhjZXB0aW9uIGJpdCAqLworI2RlZmluZSBCSVRfTkQJMHgwMDAwMDEwMAkvKiBubyBkZW5vcm1hbGl6ZWQgbnVtYmVycyBiaXQgKi8KKworLyogQ1VNVUxBVElWRSBFWENFUFRJT04gRkxBR1MgQllURQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1BU0tfRVhDRVBUSU9OX0ZMQUdTCQkweDAwMDAwMGZmCisjZGVmaW5lIE1BU0tfRVhDRVBUSU9OX0ZMQUdTX1NUUklDVAkweDAwMDAwMDFmCisKKyNkZWZpbmUgQklUX0lYQwkJMHgwMDAwMDAxMAkvKiBpbmV4YWN0IGV4Y2VwdGlvbiBmbGFnICovCisjZGVmaW5lIEJJVF9VRkMJCTB4MDAwMDAwMDgJLyogdW5kZXJmbG93IGV4Y2VwdGlvbiBmbGFnICovCisjZGVmaW5lIEJJVF9PRkMJCTB4MDAwMDAwMDQJLyogb3ZlcmZsb2F0IGV4Y2VwdGlvbiBmbGFnICovCisjZGVmaW5lIEJJVF9EWkMJCTB4MDAwMDAwMDIJLyogZGl2aWRlIGJ5IHplcm8gZXhjZXB0aW9uIGZsYWcgKi8KKyNkZWZpbmUgQklUX0lPQwkJMHgwMDAwMDAwMQkvKiBpbnZhbGlkIG9wZXJhdGlvbiBleGNlcHRpb24gZmxhZyAqLworCisvKiBGbG9hdGluZyBQb2ludCBDb250cm9sIFJlZ2lzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBCSVRfUlUJCTB4ODAwMDAwMDAJLyogcm91bmRlZCB1cCBiaXQgKi8KKyNkZWZpbmUgQklUX0lFCQkweDEwMDAwMDAwCS8qIGluZXhhY3QgYml0ICovCisjZGVmaW5lIEJJVF9NTwkJMHgwODAwMDAwMAkvKiBtYW50aXNzYSBvdmVyZmxvdyBiaXQgKi8KKyNkZWZpbmUgQklUX0VPCQkweDA0MDAwMDAwCS8qIGV4cG9uZW50IG92ZXJmbG93IGJpdCAqLworI2RlZmluZSBCSVRfU0IJCTB4MDAwMDA4MDAJLyogc3RvcmUgYm91bmNlICovCisjZGVmaW5lIEJJVF9BQgkJMHgwMDAwMDQwMAkvKiBhcml0aG1ldGljIGJvdW5jZSAqLworI2RlZmluZSBCSVRfUkUJCTB4MDAwMDAyMDAJLyogcm91bmRpbmcgZXhjZXB0aW9uICovCisjZGVmaW5lIEJJVF9EQQkJMHgwMDAwMDEwMAkvKiBkaXNhYmxlIEZQQSAqLworCisjZGVmaW5lIE1BU0tfT1AJCTB4MDBmMDgwMTAJLyogQVUgb3BlcmF0aW9uIGNvZGUgKi8KKyNkZWZpbmUgTUFTS19QUgkJMHgwMDA4MDA4MAkvKiBBVSBwcmVjaXNpb24gKi8KKyNkZWZpbmUgTUFTS19TMQkJMHgwMDA3MDAwMAkvKiBBVSBzb3VyY2UgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBNQVNLX1MyCQkweDAwMDAwMDA3CS8qIEFVIHNvdXJjZSByZWdpc3RlciAyICovCisjZGVmaW5lIE1BU0tfRFMJCTB4MDAwMDcwMDAJLyogQVUgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUFTS19STQkJMHgwMDAwMDA2MAkvKiBBVSByb3VuZGluZyBtb2RlICovCisjZGVmaW5lIE1BU0tfQUxVCTB4OWNmZmYyZmYJLyogb25seSBBTFUgY2FuIHdyaXRlIHRoZXNlIGJpdHMgKi8KKyNkZWZpbmUgTUFTS19SRVNFVAkweDAwMDAwZDAwCS8qIGJpdHMgc2V0IG9uIHJlc2V0LCBhbGwgb3RoZXJzIGNsZWFyZWQgKi8KKyNkZWZpbmUgTUFTS19XRkMJTUFTS19SRVNFVAorI2RlZmluZSBNQVNLX1JGQwl+TUFTS19SRVNFVAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL21pbGlldS5oIGIvYXJjaC9hcm0vbndmcGUvbWlsaWV1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4OTJhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL21pbGlldS5oCkBAIC0wLDAgKzEsNDggQEAKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBDIGhlYWRlciBmaWxlIGlzIHBhcnQgb2YgdGhlIFNvZnRGbG9hdCBJRUMvSUVFRSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYyBQYWNrYWdlLCBSZWxlYXNlIDIuCisKK1dyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKK0ludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKK05hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCitvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKK3Byb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKK292ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KK2lzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBXZWIgcGFnZSBgaHR0cDovL0hUVFAuQ1MuQmVya2VsZXkuRURVL35qaGF1c2VyLworYXJpdGhtZXRpYy9zb2Z0ZmxvYXQuaHRtbCcuCisKK1RISVMgU09GVFdBUkUgSVMgRElTVFJJQlVURUQgQVMgSVMsIEZPUiBGUkVFLiAgQWx0aG91Z2ggcmVhc29uYWJsZSBlZmZvcnQKK2hhcyBiZWVuIG1hZGUgdG8gYXZvaWQgaXQsIFRISVMgU09GVFdBUkUgTUFZIENPTlRBSU4gRkFVTFRTIFRIQVQgV0lMTCBBVAorVElNRVMgUkVTVUxUIElOIElOQ09SUkVDVCBCRUhBVklPUi4gIFVTRSBPRiBUSElTIFNPRlRXQVJFIElTIFJFU1RSSUNURUQgVE8KK1BFUlNPTlMgQU5EIE9SR0FOSVpBVElPTlMgV0hPIENBTiBBTkQgV0lMTCBUQUtFIEZVTEwgUkVTUE9OU0lCSUxJVFkgRk9SIEFOWQorQU5EIEFMTCBMT1NTRVMsIENPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBBUklTSU5HIEZST00gSVRTIFVTRS4KKworRGVyaXZhdGl2ZSB3b3JrcyBhcmUgYWNjZXB0YWJsZSwgZXZlbiBmb3IgY29tbWVyY2lhbCBwdXJwb3Nlcywgc28gbG9uZyBhcworKDEpIHRoZXkgaW5jbHVkZSBwcm9taW5lbnQgbm90aWNlIHRoYXQgdGhlIHdvcmsgaXMgZGVyaXZhdGl2ZSwgYW5kICgyKSB0aGV5CitpbmNsdWRlIHByb21pbmVudCBub3RpY2UgYWtpbiB0byB0aGVzZSB0aHJlZSBwYXJhZ3JhcGhzIGZvciB0aG9zZSBwYXJ0cyBvZgordGhpcyBjb2RlIHRoYXQgYXJlIHJldGFpbmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW5jbHVkZSBjb21tb24gaW50ZWdlciB0eXBlcyBhbmQgZmxhZ3MuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2luY2x1ZGUgIkFSTS1nY2MuaCIKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N5bWJvbGljIEJvb2xlYW4gbGl0ZXJhbHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZW51bSB7CisgICAgRkFMU0UgPSAwLAorICAgIFRSVUUgID0gMQorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvc2luZ2xlX2NwZG8uYyBiL2FyY2gvYXJtL253ZnBlL3NpbmdsZV9jcGRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ODA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL253ZnBlL3NpbmdsZV9jcGRvLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgICAgTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yCisgICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CisgICAgKGMpIFBoaWxpcCBCbHVuZGVsbCwgMjAwMQorCisgICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgImZwYTExLmgiCisjaW5jbHVkZSAic29mdGZsb2F0LmgiCisjaW5jbHVkZSAiZnBvcGNvZGUuaCIKKworZmxvYXQzMiBmbG9hdDMyX2V4cChmbG9hdDMyIEZtKTsKK2Zsb2F0MzIgZmxvYXQzMl9sbihmbG9hdDMyIEZtKTsKK2Zsb2F0MzIgZmxvYXQzMl9zaW4oZmxvYXQzMiByRm0pOworZmxvYXQzMiBmbG9hdDMyX2NvcyhmbG9hdDMyIHJGbSk7CitmbG9hdDMyIGZsb2F0MzJfYXJjc2luKGZsb2F0MzIgckZtKTsKK2Zsb2F0MzIgZmxvYXQzMl9hcmN0YW4oZmxvYXQzMiByRm0pOworZmxvYXQzMiBmbG9hdDMyX2xvZyhmbG9hdDMyIHJGbSk7CitmbG9hdDMyIGZsb2F0MzJfdGFuKGZsb2F0MzIgckZtKTsKK2Zsb2F0MzIgZmxvYXQzMl9hcmNjb3MoZmxvYXQzMiByRm0pOworZmxvYXQzMiBmbG9hdDMyX3BvdyhmbG9hdDMyIHJGbiwgZmxvYXQzMiByRm0pOworZmxvYXQzMiBmbG9hdDMyX3BvbChmbG9hdDMyIHJGbiwgZmxvYXQzMiByRm0pOworCitzdGF0aWMgZmxvYXQzMiBmbG9hdDMyX3JzZihmbG9hdDMyIHJGbiwgZmxvYXQzMiByRm0pCit7CisJcmV0dXJuIGZsb2F0MzJfc3ViKHJGbSwgckZuKTsKK30KKworc3RhdGljIGZsb2F0MzIgZmxvYXQzMl9yZHYoZmxvYXQzMiByRm4sIGZsb2F0MzIgckZtKQoreworCXJldHVybiBmbG9hdDMyX2RpdihyRm0sIHJGbik7Cit9CisKK3N0YXRpYyBmbG9hdDMyICgqY29uc3QgZHlhZGljX3NpbmdsZVsxNl0pKGZsb2F0MzIgckZuLCBmbG9hdDMyIHJGbSkgPSB7CisJW0FERl9DT0RFID4+IDIwXSA9IGZsb2F0MzJfYWRkLAorCVtNVUZfQ09ERSA+PiAyMF0gPSBmbG9hdDMyX211bCwKKwlbU1VGX0NPREUgPj4gMjBdID0gZmxvYXQzMl9zdWIsCisJW1JTRl9DT0RFID4+IDIwXSA9IGZsb2F0MzJfcnNmLAorCVtEVkZfQ09ERSA+PiAyMF0gPSBmbG9hdDMyX2RpdiwKKwlbUkRGX0NPREUgPj4gMjBdID0gZmxvYXQzMl9yZHYsCisJW1JNRl9DT0RFID4+IDIwXSA9IGZsb2F0MzJfcmVtLAorCisJW0ZNTF9DT0RFID4+IDIwXSA9IGZsb2F0MzJfbXVsLAorCVtGRFZfQ09ERSA+PiAyMF0gPSBmbG9hdDMyX2RpdiwKKwlbRlJEX0NPREUgPj4gMjBdID0gZmxvYXQzMl9yZHYsCit9OworCitzdGF0aWMgZmxvYXQzMiBmbG9hdDMyX212ZihmbG9hdDMyIHJGbSkKK3sKKwlyZXR1cm4gckZtOworfQorCitzdGF0aWMgZmxvYXQzMiBmbG9hdDMyX21uZihmbG9hdDMyIHJGbSkKK3sKKwlyZXR1cm4gckZtIF4gMHg4MDAwMDAwMDsKK30KKworc3RhdGljIGZsb2F0MzIgZmxvYXQzMl9hYnMoZmxvYXQzMiByRm0pCit7CisJcmV0dXJuIHJGbSAmIDB4N2ZmZmZmZmY7Cit9CisKK3N0YXRpYyBmbG9hdDMyICgqY29uc3QgbW9uYWRpY19zaW5nbGVbMTZdKShmbG9hdDMyIHJGbSkgPSB7CisJW01WRl9DT0RFID4+IDIwXSA9IGZsb2F0MzJfbXZmLAorCVtNTkZfQ09ERSA+PiAyMF0gPSBmbG9hdDMyX21uZiwKKwlbQUJTX0NPREUgPj4gMjBdID0gZmxvYXQzMl9hYnMsCisJW1JORF9DT0RFID4+IDIwXSA9IGZsb2F0MzJfcm91bmRfdG9faW50LAorCVtVUkRfQ09ERSA+PiAyMF0gPSBmbG9hdDMyX3JvdW5kX3RvX2ludCwKKwlbU1FUX0NPREUgPj4gMjBdID0gZmxvYXQzMl9zcXJ0LAorCVtOUk1fQ09ERSA+PiAyMF0gPSBmbG9hdDMyX212ZiwKK307CisKK3Vuc2lnbmVkIGludCBTaW5nbGVDUERPKGNvbnN0IHVuc2lnbmVkIGludCBvcGNvZGUsIEZQUkVHICogckZkKQoreworCUZQQTExICpmcGExMSA9IEdFVF9GUEExMSgpOworCWZsb2F0MzIgckZtOworCXVuc2lnbmVkIGludCBGbSwgb3BjX21hc2tfc2hpZnQ7CisKKwlGbSA9IGdldEZtKG9wY29kZSk7CisJaWYgKENPTlNUQU5UX0ZNKG9wY29kZSkpIHsKKwkJckZtID0gZ2V0U2luZ2xlQ29uc3RhbnQoRm0pOworCX0gZWxzZSBpZiAoZnBhMTEtPmZUeXBlW0ZtXSA9PSB0eXBlU2luZ2xlKSB7CisJCXJGbSA9IGZwYTExLT5mcHJlZ1tGbV0uZlNpbmdsZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9CisKKwlvcGNfbWFza19zaGlmdCA9IChvcGNvZGUgJiBNQVNLX0FSSVRITUVUSUNfT1BDT0RFKSA+PiAyMDsKKwlpZiAoIU1PTkFESUNfSU5TVFJVQ1RJT04ob3Bjb2RlKSkgeworCQl1bnNpZ25lZCBpbnQgRm4gPSBnZXRGbihvcGNvZGUpOworCQlmbG9hdDMyIHJGbjsKKworCQlpZiAoZnBhMTEtPmZUeXBlW0ZuXSA9PSB0eXBlU2luZ2xlICYmCisJCSAgICBkeWFkaWNfc2luZ2xlW29wY19tYXNrX3NoaWZ0XSkgeworCQkJckZuID0gZnBhMTEtPmZwcmVnW0ZuXS5mU2luZ2xlOworCQkJckZkLT5mU2luZ2xlID0gZHlhZGljX3NpbmdsZVtvcGNfbWFza19zaGlmdF0ockZuLCByRm0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobW9uYWRpY19zaW5nbGVbb3BjX21hc2tfc2hpZnRdKSB7CisJCQlyRmQtPmZTaW5nbGUgPSBtb25hZGljX3NpbmdsZVtvcGNfbWFza19zaGlmdF0ockZtKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9zb2Z0ZmxvYXQtbWFjcm9zIGIvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LW1hY3JvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDY5OTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LW1hY3JvcwpAQCAtMCwwICsxLDc0MCBAQAorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIEMgc291cmNlIGZyYWdtZW50IGlzIHBhcnQgb2YgdGhlIFNvZnRGbG9hdCBJRUMvSUVFRSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYyBQYWNrYWdlLCBSZWxlYXNlIDIuCisKK1dyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKK0ludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKK05hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCitvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKK3Byb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKK292ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KK2lzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3ZWIgcGFnZSBgaHR0cDovL0hUVFAuQ1MuQmVya2VsZXkuRURVL35qaGF1c2VyLworYXJpdGhtZXRpYy9zb2Z0ZmxvYXQuaHRtbCcuCisKK1RISVMgU09GVFdBUkUgSVMgRElTVFJJQlVURUQgQVMgSVMsIEZPUiBGUkVFLiAgQWx0aG91Z2ggcmVhc29uYWJsZSBlZmZvcnQKK2hhcyBiZWVuIG1hZGUgdG8gYXZvaWQgaXQsIFRISVMgU09GVFdBUkUgTUFZIENPTlRBSU4gRkFVTFRTIFRIQVQgV0lMTCBBVAorVElNRVMgUkVTVUxUIElOIElOQ09SUkVDVCBCRUhBVklPUi4gIFVTRSBPRiBUSElTIFNPRlRXQVJFIElTIFJFU1RSSUNURUQgVE8KK1BFUlNPTlMgQU5EIE9SR0FOSVpBVElPTlMgV0hPIENBTiBBTkQgV0lMTCBUQUtFIEZVTEwgUkVTUE9OU0lCSUxJVFkgRk9SIEFOWQorQU5EIEFMTCBMT1NTRVMsIENPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBBUklTSU5HIEZST00gSVRTIFVTRS4KKworRGVyaXZhdGl2ZSB3b3JrcyBhcmUgYWNjZXB0YWJsZSwgZXZlbiBmb3IgY29tbWVyY2lhbCBwdXJwb3Nlcywgc28gbG9uZyBhcworKDEpIHRoZXkgaW5jbHVkZSBwcm9taW5lbnQgbm90aWNlIHRoYXQgdGhlIHdvcmsgaXMgZGVyaXZhdGl2ZSwgYW5kICgyKSB0aGV5CitpbmNsdWRlIHByb21pbmVudCBub3RpY2UgYWtpbiB0byB0aGVzZSB0aHJlZSBwYXJhZ3JhcGhzIGZvciB0aG9zZSBwYXJ0cyBvZgordGhpcyBjb2RlIHRoYXQgYXJlIHJldGFpbmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU2hpZnRzIGBhJyByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gaW4gYGNvdW50Jy4gIElmIGFueSBub256ZXJvCitiaXRzIGFyZSBzaGlmdGVkIG9mZiwgdGhleSBhcmUgYGBqYW1tZWQnJyBpbnRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YKK3RoZSByZXN1bHQgYnkgc2V0dGluZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIDEuICBUaGUgdmFsdWUgb2YgYGNvdW50JworY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlOyBpbiBwYXJ0aWN1bGFyLCBpZiBgY291bnQnIGlzIGdyZWF0ZXIgdGhhbiAzMiwgdGhlCityZXN1bHQgd2lsbCBiZSBlaXRoZXIgMCBvciAxLCBkZXBlbmRpbmcgb24gd2hldGhlciBgYScgaXMgemVybyBvciBub256ZXJvLgorVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgYHpQdHInLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK0lOTElORSB2b2lkIHNoaWZ0MzJSaWdodEphbW1pbmcoIGJpdHMzMiBhLCBpbnQxNiBjb3VudCwgYml0czMyICp6UHRyICkKK3sKKyAgICBiaXRzMzIgejsKKyAgICBpZiAoIGNvdW50ID09IDAgKSB7CisgICAgICAgIHogPSBhOworICAgIH0KKyAgICBlbHNlIGlmICggY291bnQgPCAzMiApIHsKKyAgICAgICAgeiA9ICggYT4+Y291bnQgKSB8ICggKCBhPDwoICggLSBjb3VudCApICYgMzEgKSApICE9IDAgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHogPSAoIGEgIT0gMCApOworICAgIH0KKyAgICAqelB0ciA9IHo7Cit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTaGlmdHMgYGEnIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBpbiBgY291bnQnLiAgSWYgYW55IG5vbnplcm8KK2JpdHMgYXJlIHNoaWZ0ZWQgb2ZmLCB0aGV5IGFyZSBgYGphbW1lZCcnIGludG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZgordGhlIHJlc3VsdCBieSBzZXR0aW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gMS4gIFRoZSB2YWx1ZSBvZiBgY291bnQnCitjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2U7IGluIHBhcnRpY3VsYXIsIGlmIGBjb3VudCcgaXMgZ3JlYXRlciB0aGFuIDY0LCB0aGUKK3Jlc3VsdCB3aWxsIGJlIGVpdGhlciAwIG9yIDEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGBhJyBpcyB6ZXJvIG9yIG5vbnplcm8uCitUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBgelB0cicuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIHZvaWQgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYml0czY0IGEsIGludDE2IGNvdW50LCBiaXRzNjQgKnpQdHIgKQoreworICAgIGJpdHM2NCB6OworCisgX19hc21fXygiQHNoaWZ0NjRSaWdodEphbW1pbmcgLS0gc3RhcnQiKTsgICAKKyAgICBpZiAoIGNvdW50ID09IDAgKSB7CisgICAgICAgIHogPSBhOworICAgIH0KKyAgICBlbHNlIGlmICggY291bnQgPCA2NCApIHsKKyAgICAgICAgeiA9ICggYT4+Y291bnQgKSB8ICggKCBhPDwoICggLSBjb3VudCApICYgNjMgKSApICE9IDAgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHogPSAoIGEgIT0gMCApOworICAgIH0KKyBfX2FzbV9fKCJAc2hpZnQ2NFJpZ2h0SmFtbWluZyAtLSBlbmQiKTsgICAKKyAgICAqelB0ciA9IHo7Cit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTaGlmdHMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyByaWdodCBieSA2NAorX3BsdXNfIHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBpbiBgY291bnQnLiAgVGhlIHNoaWZ0ZWQgcmVzdWx0IGlzIGF0IG1vc3QKKzY0IG5vbnplcm8gYml0czsgdGhpcyBpcyBzdG9yZWQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgYHowUHRyJy4gIFRoZQorYml0cyBzaGlmdGVkIG9mZiBmb3JtIGEgc2Vjb25kIDY0LWJpdCByZXN1bHQgYXMgZm9sbG93czogIFRoZSBfbGFzdF8gYml0CitzaGlmdGVkIG9mZiBpcyB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgb2YgdGhlIGV4dHJhIHJlc3VsdCwgYW5kIHRoZSBvdGhlcgorNjMgYml0cyBvZiB0aGUgZXh0cmEgcmVzdWx0IGFyZSBhbGwgemVybyBpZiBhbmQgb25seSBpZiBfYWxsX2J1dF90aGVfbGFzdF8KK2JpdHMgc2hpZnRlZCBvZmYgd2VyZSBhbGwgemVyby4gIFRoaXMgZXh0cmEgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgbG9jYXRpb24KK3BvaW50ZWQgdG8gYnkgYHoxUHRyJy4gIFRoZSB2YWx1ZSBvZiBgY291bnQnIGNhbiBiZSBhcmJpdHJhcmlseSBsYXJnZS4KKyAgICAoVGhpcyByb3V0aW5lIG1ha2VzIG1vcmUgc2Vuc2UgaWYgYGEwJyBhbmQgYGExJyBhcmUgY29uc2lkZXJlZCB0byBmb3JtIGEKK2ZpeGVkLXBvaW50IHZhbHVlIHdpdGggYmluYXJ5IHBvaW50IGJldHdlZW4gYGEwJyBhbmQgYGExJy4gIFRoaXMgZml4ZWQtcG9pbnQKK3ZhbHVlIGlzIHNoaWZ0ZWQgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcsIGFuZCB0aGUKK2ludGVnZXIgcGFydCBvZiB0aGUgcmVzdWx0IGlzIHJldHVybmVkIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5CitgejBQdHInLiAgVGhlIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgcmVzdWx0IG1heSBiZSBzbGlnaHRseSBjb3JydXB0ZWQgYXMKK2Rlc2NyaWJlZCBhYm92ZSwgYW5kIGlzIHJldHVybmVkIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IGB6MVB0cicuKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK0lOTElORSB2b2lkCisgc2hpZnQ2NEV4dHJhUmlnaHRKYW1taW5nKAorICAgICBiaXRzNjQgYTAsIGJpdHM2NCBhMSwgaW50MTYgY291bnQsIGJpdHM2NCAqejBQdHIsIGJpdHM2NCAqejFQdHIgKQoreworICAgIGJpdHM2NCB6MCwgejE7CisgICAgaW50OCBuZWdDb3VudCA9ICggLSBjb3VudCApICYgNjM7CisKKyAgICBpZiAoIGNvdW50ID09IDAgKSB7CisgICAgICAgIHoxID0gYTE7CisgICAgICAgIHowID0gYTA7CisgICAgfQorICAgIGVsc2UgaWYgKCBjb3VudCA8IDY0ICkgeworICAgICAgICB6MSA9ICggYTA8PG5lZ0NvdW50ICkgfCAoIGExICE9IDAgKTsKKyAgICAgICAgejAgPSBhMD4+Y291bnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIGNvdW50ID09IDY0ICkgeworICAgICAgICAgICAgejEgPSBhMCB8ICggYTEgIT0gMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgejEgPSAoICggYTAgfCBhMSApICE9IDAgKTsKKyAgICAgICAgfQorICAgICAgICB6MCA9IDA7CisgICAgfQorICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTaGlmdHMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyByaWdodCBieSB0aGUKK251bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcuICBBbnkgYml0cyBzaGlmdGVkIG9mZiBhcmUgbG9zdC4gIFRoZSB2YWx1ZQorb2YgYGNvdW50JyBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2U7IGluIHBhcnRpY3VsYXIsIGlmIGBjb3VudCcgaXMgZ3JlYXRlcgordGhhbiAxMjgsIHRoZSByZXN1bHQgd2lsbCBiZSAwLiAgVGhlIHJlc3VsdCBpcyBicm9rZW4gaW50byB0d28gNjQtYml0IHBpZWNlcword2hpY2ggYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHowUHRyJyBhbmQgYHoxUHRyJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgdm9pZAorIHNoaWZ0MTI4UmlnaHQoCisgICAgIGJpdHM2NCBhMCwgYml0czY0IGExLCBpbnQxNiBjb3VudCwgYml0czY0ICp6MFB0ciwgYml0czY0ICp6MVB0ciApCit7CisgICAgYml0czY0IHowLCB6MTsKKyAgICBpbnQ4IG5lZ0NvdW50ID0gKCAtIGNvdW50ICkgJiA2MzsKKworICAgIGlmICggY291bnQgPT0gMCApIHsKKyAgICAgICAgejEgPSBhMTsKKyAgICAgICAgejAgPSBhMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGNvdW50IDwgNjQgKSB7CisgICAgICAgIHoxID0gKCBhMDw8bmVnQ291bnQgKSB8ICggYTE+PmNvdW50ICk7CisgICAgICAgIHowID0gYTA+PmNvdW50OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgejEgPSAoIGNvdW50IDwgNjQgKSA/ICggYTA+PiggY291bnQgJiA2MyApICkgOiAwOworICAgICAgICB6MCA9IDA7CisgICAgfQorICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTaGlmdHMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyByaWdodCBieSB0aGUKK251bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcuICBJZiBhbnkgbm9uemVybyBiaXRzIGFyZSBzaGlmdGVkIG9mZiwgdGhleQorYXJlIGBgamFtbWVkJycgaW50byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSByZXN1bHQgYnkgc2V0dGluZyB0aGUKK2xlYXN0IHNpZ25pZmljYW50IGJpdCB0byAxLiAgVGhlIHZhbHVlIG9mIGBjb3VudCcgY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlOworaW4gcGFydGljdWxhciwgaWYgYGNvdW50JyBpcyBncmVhdGVyIHRoYW4gMTI4LCB0aGUgcmVzdWx0IHdpbGwgYmUgZWl0aGVyIDAKK29yIDEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb25jYXRlbmF0aW9uIG9mIGBhMCcgYW5kIGBhMScgaXMgemVybyBvcgorbm9uemVyby4gIFRoZSByZXN1bHQgaXMgYnJva2VuIGludG8gdHdvIDY0LWJpdCBwaWVjZXMgd2hpY2ggYXJlIHN0b3JlZCBhdAordGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicgYW5kIGB6MVB0cicuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIHZvaWQKKyBzaGlmdDEyOFJpZ2h0SmFtbWluZygKKyAgICAgYml0czY0IGEwLCBiaXRzNjQgYTEsIGludDE2IGNvdW50LCBiaXRzNjQgKnowUHRyLCBiaXRzNjQgKnoxUHRyICkKK3sKKyAgICBiaXRzNjQgejAsIHoxOworICAgIGludDggbmVnQ291bnQgPSAoIC0gY291bnQgKSAmIDYzOworCisgICAgaWYgKCBjb3VudCA9PSAwICkgeworICAgICAgICB6MSA9IGExOworICAgICAgICB6MCA9IGEwOworICAgIH0KKyAgICBlbHNlIGlmICggY291bnQgPCA2NCApIHsKKyAgICAgICAgejEgPSAoIGEwPDxuZWdDb3VudCApIHwgKCBhMT4+Y291bnQgKSB8ICggKCBhMTw8bmVnQ291bnQgKSAhPSAwICk7CisgICAgICAgIHowID0gYTA+PmNvdW50OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBjb3VudCA9PSA2NCApIHsKKyAgICAgICAgICAgIHoxID0gYTAgfCAoIGExICE9IDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggY291bnQgPCAxMjggKSB7CisgICAgICAgICAgICB6MSA9ICggYTA+PiggY291bnQgJiA2MyApICkgfCAoICggKCBhMDw8bmVnQ291bnQgKSB8IGExICkgIT0gMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgejEgPSAoICggYTAgfCBhMSApICE9IDAgKTsKKyAgICAgICAgfQorICAgICAgICB6MCA9IDA7CisgICAgfQorICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTaGlmdHMgdGhlIDE5Mi1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJywgYGExJywgYW5kIGBhMicgcmlnaHQKK2J5IDY0IF9wbHVzXyB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gaW4gYGNvdW50Jy4gIFRoZSBzaGlmdGVkIHJlc3VsdCBpcworYXQgbW9zdCAxMjggbm9uemVybyBiaXRzOyB0aGVzZSBhcmUgYnJva2VuIGludG8gdHdvIDY0LWJpdCBwaWVjZXMgd2hpY2ggYXJlCitzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicgYW5kIGB6MVB0cicuICBUaGUgYml0cyBzaGlmdGVkCitvZmYgZm9ybSBhIHRoaXJkIDY0LWJpdCByZXN1bHQgYXMgZm9sbG93czogIFRoZSBfbGFzdF8gYml0IHNoaWZ0ZWQgb2ZmIGlzCit0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgb2YgdGhlIGV4dHJhIHJlc3VsdCwgYW5kIHRoZSBvdGhlciA2MyBiaXRzIG9mIHRoZQorZXh0cmEgcmVzdWx0IGFyZSBhbGwgemVybyBpZiBhbmQgb25seSBpZiBfYWxsX2J1dF90aGVfbGFzdF8gYml0cyBzaGlmdGVkIG9mZgord2VyZSBhbGwgemVyby4gIFRoaXMgZXh0cmEgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieQorYHoyUHRyJy4gIFRoZSB2YWx1ZSBvZiBgY291bnQnIGNhbiBiZSBhcmJpdHJhcmlseSBsYXJnZS4KKyAgICAoVGhpcyByb3V0aW5lIG1ha2VzIG1vcmUgc2Vuc2UgaWYgYGEwJywgYGExJywgYW5kIGBhMicgYXJlIGNvbnNpZGVyZWQKK3RvIGZvcm0gYSBmaXhlZC1wb2ludCB2YWx1ZSB3aXRoIGJpbmFyeSBwb2ludCBiZXR3ZWVuIGBhMScgYW5kIGBhMicuICBUaGlzCitmaXhlZC1wb2ludCB2YWx1ZSBpcyBzaGlmdGVkIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBpbiBgY291bnQnLAorYW5kIHRoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8KK2J5IGB6MFB0cicgYW5kIGB6MVB0cicuICBUaGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSByZXN1bHQgbWF5IGJlIHNsaWdodGx5Citjb3JydXB0ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgaXMgcmV0dXJuZWQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkKK2B6MlB0cicuKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK0lOTElORSB2b2lkCisgc2hpZnQxMjhFeHRyYVJpZ2h0SmFtbWluZygKKyAgICAgYml0czY0IGEwLAorICAgICBiaXRzNjQgYTEsCisgICAgIGJpdHM2NCBhMiwKKyAgICAgaW50MTYgY291bnQsCisgICAgIGJpdHM2NCAqejBQdHIsCisgICAgIGJpdHM2NCAqejFQdHIsCisgICAgIGJpdHM2NCAqejJQdHIKKyApCit7CisgICAgYml0czY0IHowLCB6MSwgejI7CisgICAgaW50OCBuZWdDb3VudCA9ICggLSBjb3VudCApICYgNjM7CisKKyAgICBpZiAoIGNvdW50ID09IDAgKSB7CisgICAgICAgIHoyID0gYTI7CisgICAgICAgIHoxID0gYTE7CisgICAgICAgIHowID0gYTA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIGNvdW50IDwgNjQgKSB7CisgICAgICAgICAgICB6MiA9IGExPDxuZWdDb3VudDsKKyAgICAgICAgICAgIHoxID0gKCBhMDw8bmVnQ291bnQgKSB8ICggYTE+PmNvdW50ICk7CisgICAgICAgICAgICB6MCA9IGEwPj5jb3VudDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggY291bnQgPT0gNjQgKSB7CisgICAgICAgICAgICAgICAgejIgPSBhMTsKKyAgICAgICAgICAgICAgICB6MSA9IGEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYTIgfD0gYTE7CisgICAgICAgICAgICAgICAgaWYgKCBjb3VudCA8IDEyOCApIHsKKyAgICAgICAgICAgICAgICAgICAgejIgPSBhMDw8bmVnQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIHoxID0gYTA+PiggY291bnQgJiA2MyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgejIgPSAoIGNvdW50ID09IDEyOCApID8gYTAgOiAoIGEwICE9IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgejEgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHowID0gMDsKKyAgICAgICAgfQorICAgICAgICB6MiB8PSAoIGEyICE9IDAgKTsKKyAgICB9CisgICAgKnoyUHRyID0gejI7CisgICAgKnoxUHRyID0gejE7CisgICAgKnowUHRyID0gejA7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NoaWZ0cyB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnIGFuZCBgYTEnIGxlZnQgYnkgdGhlCitudW1iZXIgb2YgYml0cyBnaXZlbiBpbiBgY291bnQnLiAgQW55IGJpdHMgc2hpZnRlZCBvZmYgYXJlIGxvc3QuICBUaGUgdmFsdWUKK29mIGBjb3VudCcgbXVzdCBiZSBsZXNzIHRoYW4gNjQuICBUaGUgcmVzdWx0IGlzIGJyb2tlbiBpbnRvIHR3byA2NC1iaXQKK3BpZWNlcyB3aGljaCBhcmUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgejBQdHInIGFuZCBgejFQdHInLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK0lOTElORSB2b2lkCisgc2hvcnRTaGlmdDEyOExlZnQoCisgICAgIGJpdHM2NCBhMCwgYml0czY0IGExLCBpbnQxNiBjb3VudCwgYml0czY0ICp6MFB0ciwgYml0czY0ICp6MVB0ciApCit7CisKKyAgICAqejFQdHIgPSBhMTw8Y291bnQ7CisgICAgKnowUHRyID0KKyAgICAgICAgKCBjb3VudCA9PSAwICkgPyBhMCA6ICggYTA8PGNvdW50ICkgfCAoIGExPj4oICggLSBjb3VudCApICYgNjMgKSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTaGlmdHMgdGhlIDE5Mi1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJywgYGExJywgYW5kIGBhMicgbGVmdAorYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcuICBBbnkgYml0cyBzaGlmdGVkIG9mZiBhcmUgbG9zdC4KK1RoZSB2YWx1ZSBvZiBgY291bnQnIG11c3QgYmUgbGVzcyB0aGFuIDY0LiAgVGhlIHJlc3VsdCBpcyBicm9rZW4gaW50byB0aHJlZQorNjQtYml0IHBpZWNlcyB3aGljaCBhcmUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgejBQdHInLAorYHoxUHRyJywgYW5kIGB6MlB0cicuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIHZvaWQKKyBzaG9ydFNoaWZ0MTkyTGVmdCgKKyAgICAgYml0czY0IGEwLAorICAgICBiaXRzNjQgYTEsCisgICAgIGJpdHM2NCBhMiwKKyAgICAgaW50MTYgY291bnQsCisgICAgIGJpdHM2NCAqejBQdHIsCisgICAgIGJpdHM2NCAqejFQdHIsCisgICAgIGJpdHM2NCAqejJQdHIKKyApCit7CisgICAgYml0czY0IHowLCB6MSwgejI7CisgICAgaW50OCBuZWdDb3VudDsKKworICAgIHoyID0gYTI8PGNvdW50OworICAgIHoxID0gYTE8PGNvdW50OworICAgIHowID0gYTA8PGNvdW50OworICAgIGlmICggMCA8IGNvdW50ICkgeworICAgICAgICBuZWdDb3VudCA9ICggKCAtIGNvdW50ICkgJiA2MyApOworICAgICAgICB6MSB8PSBhMj4+bmVnQ291bnQ7CisgICAgICAgIHowIHw9IGExPj5uZWdDb3VudDsKKyAgICB9CisgICAgKnoyUHRyID0gejI7CisgICAgKnoxUHRyID0gejE7CisgICAgKnowUHRyID0gejA7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FkZHMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyB0byB0aGUgMTI4LWJpdAordmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJyBhbmQgYGIxJy4gIEFkZGl0aW9uIGlzIG1vZHVsbyAyXjEyOCwgc28KK2FueSBjYXJyeSBvdXQgaXMgbG9zdC4gIFRoZSByZXN1bHQgaXMgYnJva2VuIGludG8gdHdvIDY0LWJpdCBwaWVjZXMgd2hpY2gKK2FyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicgYW5kIGB6MVB0cicuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIHZvaWQKKyBhZGQxMjgoCisgICAgIGJpdHM2NCBhMCwgYml0czY0IGExLCBiaXRzNjQgYjAsIGJpdHM2NCBiMSwgYml0czY0ICp6MFB0ciwgYml0czY0ICp6MVB0ciApCit7CisgICAgYml0czY0IHoxOworCisgICAgejEgPSBhMSArIGIxOworICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IGEwICsgYjAgKyAoIHoxIDwgYTEgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRkcyB0aGUgMTkyLWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnLCBgYTEnLCBhbmQgYGEyJyB0byB0aGUKKzE5Mi1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJywgYGIxJywgYW5kIGBiMicuICBBZGRpdGlvbiBpcworbW9kdWxvIDJeMTkyLCBzbyBhbnkgY2Fycnkgb3V0IGlzIGxvc3QuICBUaGUgcmVzdWx0IGlzIGJyb2tlbiBpbnRvIHRocmVlCis2NC1iaXQgcGllY2VzIHdoaWNoIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicsCitgejFQdHInLCBhbmQgYHoyUHRyJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgdm9pZAorIGFkZDE5MigKKyAgICAgYml0czY0IGEwLAorICAgICBiaXRzNjQgYTEsCisgICAgIGJpdHM2NCBhMiwKKyAgICAgYml0czY0IGIwLAorICAgICBiaXRzNjQgYjEsCisgICAgIGJpdHM2NCBiMiwKKyAgICAgYml0czY0ICp6MFB0ciwKKyAgICAgYml0czY0ICp6MVB0ciwKKyAgICAgYml0czY0ICp6MlB0cgorICkKK3sKKyAgICBiaXRzNjQgejAsIHoxLCB6MjsKKyAgICBpbnQ4IGNhcnJ5MCwgY2FycnkxOworCisgICAgejIgPSBhMiArIGIyOworICAgIGNhcnJ5MSA9ICggejIgPCBhMiApOworICAgIHoxID0gYTEgKyBiMTsKKyAgICBjYXJyeTAgPSAoIHoxIDwgYTEgKTsKKyAgICB6MCA9IGEwICsgYjA7CisgICAgejEgKz0gY2FycnkxOworICAgIHowICs9ICggejEgPCBjYXJyeTEgKTsKKyAgICB6MCArPSBjYXJyeTA7CisgICAgKnoyUHRyID0gejI7CisgICAgKnoxUHRyID0gejE7CisgICAgKnowUHRyID0gejA7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1YnRyYWN0cyB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYjAnIGFuZCBgYjEnIGZyb20gdGhlCisxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScuICBTdWJ0cmFjdGlvbiBpcyBtb2R1bG8KKzJeMTI4LCBzbyBhbnkgYm9ycm93IG91dCAoY2Fycnkgb3V0KSBpcyBsb3N0LiAgVGhlIHJlc3VsdCBpcyBicm9rZW4gaW50byB0d28KKzY0LWJpdCBwaWVjZXMgd2hpY2ggYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHowUHRyJyBhbmQKK2B6MVB0cicuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIHZvaWQKKyBzdWIxMjgoCisgICAgIGJpdHM2NCBhMCwgYml0czY0IGExLCBiaXRzNjQgYjAsIGJpdHM2NCBiMSwgYml0czY0ICp6MFB0ciwgYml0czY0ICp6MVB0ciApCit7CisKKyAgICAqejFQdHIgPSBhMSAtIGIxOworICAgICp6MFB0ciA9IGEwIC0gYjAgLSAoIGExIDwgYjEgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3VidHJhY3RzIHRoZSAxOTItYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBiMCcsIGBiMScsIGFuZCBgYjInCitmcm9tIHRoZSAxOTItYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcsIGBhMScsIGFuZCBgYTInLgorU3VidHJhY3Rpb24gaXMgbW9kdWxvIDJeMTkyLCBzbyBhbnkgYm9ycm93IG91dCAoY2Fycnkgb3V0KSBpcyBsb3N0LiAgVGhlCityZXN1bHQgaXMgYnJva2VuIGludG8gdGhyZWUgNjQtYml0IHBpZWNlcyB3aGljaCBhcmUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMKK3BvaW50ZWQgdG8gYnkgYHowUHRyJywgYHoxUHRyJywgYW5kIGB6MlB0cicuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIHZvaWQKKyBzdWIxOTIoCisgICAgIGJpdHM2NCBhMCwKKyAgICAgYml0czY0IGExLAorICAgICBiaXRzNjQgYTIsCisgICAgIGJpdHM2NCBiMCwKKyAgICAgYml0czY0IGIxLAorICAgICBiaXRzNjQgYjIsCisgICAgIGJpdHM2NCAqejBQdHIsCisgICAgIGJpdHM2NCAqejFQdHIsCisgICAgIGJpdHM2NCAqejJQdHIKKyApCit7CisgICAgYml0czY0IHowLCB6MSwgejI7CisgICAgaW50OCBib3Jyb3cwLCBib3Jyb3cxOworCisgICAgejIgPSBhMiAtIGIyOworICAgIGJvcnJvdzEgPSAoIGEyIDwgYjIgKTsKKyAgICB6MSA9IGExIC0gYjE7CisgICAgYm9ycm93MCA9ICggYTEgPCBiMSApOworICAgIHowID0gYTAgLSBiMDsKKyAgICB6MCAtPSAoIHoxIDwgYm9ycm93MSApOworICAgIHoxIC09IGJvcnJvdzE7CisgICAgejAgLT0gYm9ycm93MDsKKyAgICAqejJQdHIgPSB6MjsKKyAgICAqejFQdHIgPSB6MTsKKyAgICAqejBQdHIgPSB6MDsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTXVsdGlwbGllcyBgYScgYnkgYGInIHRvIG9idGFpbiBhIDEyOC1iaXQgcHJvZHVjdC4gIFRoZSBwcm9kdWN0IGlzIGJyb2tlbgoraW50byB0d28gNjQtYml0IHBpZWNlcyB3aGljaCBhcmUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieQorYHowUHRyJyBhbmQgYHoxUHRyJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgdm9pZCBtdWw2NFRvMTI4KCBiaXRzNjQgYSwgYml0czY0IGIsIGJpdHM2NCAqejBQdHIsIGJpdHM2NCAqejFQdHIgKQoreworICAgIGJpdHMzMiBhSGlnaCwgYUxvdywgYkhpZ2gsIGJMb3c7CisgICAgYml0czY0IHowLCB6TWlkZGxlQSwgek1pZGRsZUIsIHoxOworCisgICAgYUxvdyA9IGE7CisgICAgYUhpZ2ggPSBhPj4zMjsKKyAgICBiTG93ID0gYjsKKyAgICBiSGlnaCA9IGI+PjMyOworICAgIHoxID0gKCAoYml0czY0KSBhTG93ICkgKiBiTG93OworICAgIHpNaWRkbGVBID0gKCAoYml0czY0KSBhTG93ICkgKiBiSGlnaDsKKyAgICB6TWlkZGxlQiA9ICggKGJpdHM2NCkgYUhpZ2ggKSAqIGJMb3c7CisgICAgejAgPSAoIChiaXRzNjQpIGFIaWdoICkgKiBiSGlnaDsKKyAgICB6TWlkZGxlQSArPSB6TWlkZGxlQjsKKyAgICB6MCArPSAoICggKGJpdHM2NCkgKCB6TWlkZGxlQSA8IHpNaWRkbGVCICkgKTw8MzIgKSArICggek1pZGRsZUE+PjMyICk7CisgICAgek1pZGRsZUEgPDw9IDMyOworICAgIHoxICs9IHpNaWRkbGVBOworICAgIHowICs9ICggejEgPCB6TWlkZGxlQSApOworICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNdWx0aXBsaWVzIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScgYnkgYGInIHRvCitvYnRhaW4gYSAxOTItYml0IHByb2R1Y3QuICBUaGUgcHJvZHVjdCBpcyBicm9rZW4gaW50byB0aHJlZSA2NC1iaXQgcGllY2VzCit3aGljaCBhcmUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgejBQdHInLCBgejFQdHInLCBhbmQKK2B6MlB0cicuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIHZvaWQKKyBtdWwxMjhCeTY0VG8xOTIoCisgICAgIGJpdHM2NCBhMCwKKyAgICAgYml0czY0IGExLAorICAgICBiaXRzNjQgYiwKKyAgICAgYml0czY0ICp6MFB0ciwKKyAgICAgYml0czY0ICp6MVB0ciwKKyAgICAgYml0czY0ICp6MlB0cgorICkKK3sKKyAgICBiaXRzNjQgejAsIHoxLCB6MiwgbW9yZTE7CisKKyAgICBtdWw2NFRvMTI4KCBhMSwgYiwgJnoxLCAmejIgKTsKKyAgICBtdWw2NFRvMTI4KCBhMCwgYiwgJnowLCAmbW9yZTEgKTsKKyAgICBhZGQxMjgoIHowLCBtb3JlMSwgMCwgejEsICZ6MCwgJnoxICk7CisgICAgKnoyUHRyID0gejI7CisgICAgKnoxUHRyID0gejE7CisgICAgKnowUHRyID0gejA7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK011bHRpcGxpZXMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyB0byB0aGUKKzEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJyBhbmQgYGIxJyB0byBvYnRhaW4gYSAyNTYtYml0Citwcm9kdWN0LiAgVGhlIHByb2R1Y3QgaXMgYnJva2VuIGludG8gZm91ciA2NC1iaXQgcGllY2VzIHdoaWNoIGFyZSBzdG9yZWQgYXQKK3RoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgejBQdHInLCBgejFQdHInLCBgejJQdHInLCBhbmQgYHozUHRyJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgdm9pZAorIG11bDEyOFRvMjU2KAorICAgICBiaXRzNjQgYTAsCisgICAgIGJpdHM2NCBhMSwKKyAgICAgYml0czY0IGIwLAorICAgICBiaXRzNjQgYjEsCisgICAgIGJpdHM2NCAqejBQdHIsCisgICAgIGJpdHM2NCAqejFQdHIsCisgICAgIGJpdHM2NCAqejJQdHIsCisgICAgIGJpdHM2NCAqejNQdHIKKyApCit7CisgICAgYml0czY0IHowLCB6MSwgejIsIHozOworICAgIGJpdHM2NCBtb3JlMSwgbW9yZTI7CisKKyAgICBtdWw2NFRvMTI4KCBhMSwgYjEsICZ6MiwgJnozICk7CisgICAgbXVsNjRUbzEyOCggYTEsIGIwLCAmejEsICZtb3JlMiApOworICAgIGFkZDEyOCggejEsIG1vcmUyLCAwLCB6MiwgJnoxLCAmejIgKTsKKyAgICBtdWw2NFRvMTI4KCBhMCwgYjAsICZ6MCwgJm1vcmUxICk7CisgICAgYWRkMTI4KCB6MCwgbW9yZTEsIDAsIHoxLCAmejAsICZ6MSApOworICAgIG11bDY0VG8xMjgoIGEwLCBiMSwgJm1vcmUxLCAmbW9yZTIgKTsKKyAgICBhZGQxMjgoIG1vcmUxLCBtb3JlMiwgMCwgejIsICZtb3JlMSwgJnoyICk7CisgICAgYWRkMTI4KCB6MCwgejEsIDAsIG1vcmUxLCAmejAsICZ6MSApOworICAgICp6M1B0ciA9IHozOworICAgICp6MlB0ciA9IHoyOworICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIGFuIGFwcHJveGltYXRpb24gdG8gdGhlIDY0LWJpdCBpbnRlZ2VyIHF1b3RpZW50IG9idGFpbmVkIGJ5IGRpdmlkaW5nCitgYicgaW50byB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnIGFuZCBgYTEnLiAgVGhlCitkaXZpc29yIGBiJyBtdXN0IGJlIGF0IGxlYXN0IDJeNjMuICBJZiBxIGlzIHRoZSBleGFjdCBxdW90aWVudCB0cnVuY2F0ZWQKK3Rvd2FyZCB6ZXJvLCB0aGUgYXBwcm94aW1hdGlvbiByZXR1cm5lZCBsaWVzIGJldHdlZW4gcSBhbmQgcSArIDIgaW5jbHVzaXZlLgorSWYgdGhlIGV4YWN0IHF1b3RpZW50IHEgaXMgbGFyZ2VyIHRoYW4gNjQgYml0cywgdGhlIG1heGltdW0gcG9zaXRpdmUgNjQtYml0Cit1bnNpZ25lZCBpbnRlZ2VyIGlzIHJldHVybmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBiaXRzNjQgZXN0aW1hdGVEaXYxMjhUbzY0KCBiaXRzNjQgYTAsIGJpdHM2NCBhMSwgYml0czY0IGIgKQoreworICAgIGJpdHM2NCBiMCwgYjE7CisgICAgYml0czY0IHJlbTAsIHJlbTEsIHRlcm0wLCB0ZXJtMTsKKyAgICBiaXRzNjQgejsKKyAgICBpZiAoIGIgPD0gYTAgKSByZXR1cm4gTElUNjQoIDB4RkZGRkZGRkZGRkZGRkZGRiApOworICAgIGIwID0gYj4+MzI7CisgICAgeiA9ICggYjA8PDMyIDw9IGEwICkgPyBMSVQ2NCggMHhGRkZGRkZGRjAwMDAwMDAwICkgOiAoIGEwIC8gYjAgKTw8MzI7CisgICAgbXVsNjRUbzEyOCggYiwgeiwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICBzdWIxMjgoIGEwLCBhMSwgdGVybTAsIHRlcm0xLCAmcmVtMCwgJnJlbTEgKTsKKyAgICB3aGlsZSAoICggKHNiaXRzNjQpIHJlbTAgKSA8IDAgKSB7CisgICAgICAgIHogLT0gTElUNjQoIDB4MTAwMDAwMDAwICk7CisgICAgICAgIGIxID0gYjw8MzI7CisgICAgICAgIGFkZDEyOCggcmVtMCwgcmVtMSwgYjAsIGIxLCAmcmVtMCwgJnJlbTEgKTsKKyAgICB9CisgICAgcmVtMCA9ICggcmVtMDw8MzIgKSB8ICggcmVtMT4+MzIgKTsKKyAgICB6IHw9ICggYjA8PDMyIDw9IHJlbTAgKSA/IDB4RkZGRkZGRkYgOiByZW0wIC8gYjA7CisgICAgcmV0dXJuIHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIDMyLWJpdCBzaWduaWZpY2FuZCBnaXZlbgorYnkgYGEnLiAgQ29uc2lkZXJlZCBhcyBhbiBpbnRlZ2VyLCBgYScgbXVzdCBiZSBhdCBsZWFzdCAyXjMxLiAgSWYgYml0IDAgb2YKK2BhRXhwJyAodGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCkgaXMgMSwgdGhlIGludGVnZXIgcmV0dXJuZWQgYXBwcm94aW1hdGVzCisyXjMxKnNxcnQoYGEnLzJeMzEpLCB3aGVyZSBgYScgaXMgY29uc2lkZXJlZCBhbiBpbnRlZ2VyLiAgSWYgYml0IDAgb2YgYGFFeHAnCitpcyAwLCB0aGUgaW50ZWdlciByZXR1cm5lZCBhcHByb3hpbWF0ZXMgMl4zMSpzcXJ0KGBhJy8yXjMwKS4gIEluIGVpdGhlcgorY2FzZSwgdGhlIGFwcHJveGltYXRpb24gcmV0dXJuZWQgbGllcyBzdHJpY3RseSB3aXRoaW4gKy8tMiBvZiB0aGUgZXhhY3QKK3ZhbHVlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBiaXRzMzIgZXN0aW1hdGVTcXJ0MzIoIGludDE2IGFFeHAsIGJpdHMzMiBhICkKK3sKKyAgICBzdGF0aWMgY29uc3QgYml0czE2IHNxcnRPZGRBZGp1c3RtZW50c1tdID0geworICAgICAgICAweDAwMDQsIDB4MDAyMiwgMHgwMDVELCAweDAwQjEsIDB4MDExRCwgMHgwMTlGLCAweDAyMzYsIDB4MDJFMCwKKyAgICAgICAgMHgwMzlDLCAweDA0NjgsIDB4MDU0NSwgMHgwNjMxLCAweDA3MkIsIDB4MDgzMiwgMHgwOTQ2LCAweDBBNjcKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBiaXRzMTYgc3FydEV2ZW5BZGp1c3RtZW50c1tdID0geworICAgICAgICAweDBBMkQsIDB4MDhBRiwgMHgwNzVBLCAweDA2MjksIDB4MDUxQSwgMHgwNDI5LCAweDAzNTYsIDB4MDI5RSwKKyAgICAgICAgMHgwMjAwLCAweDAxNzksIDB4MDEwOSwgMHgwMEFGLCAweDAwNjgsIDB4MDAzNCwgMHgwMDEyLCAweDAwMDIKKyAgICB9OworICAgIGludDggaW5kZXg7CisgICAgYml0czMyIHo7CisKKyAgICBpbmRleCA9ICggYT4+MjcgKSAmIDE1OworICAgIGlmICggYUV4cCAmIDEgKSB7CisgICAgICAgIHogPSAweDQwMDAgKyAoIGE+PjE3ICkgLSBzcXJ0T2RkQWRqdXN0bWVudHNbIGluZGV4IF07CisgICAgICAgIHogPSAoICggYSAvIHogKTw8MTQgKSArICggejw8MTUgKTsKKyAgICAgICAgYSA+Pj0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHogPSAweDgwMDAgKyAoIGE+PjE3ICkgLSBzcXJ0RXZlbkFkanVzdG1lbnRzWyBpbmRleCBdOworICAgICAgICB6ID0gYSAvIHogKyB6OworICAgICAgICB6ID0gKCAweDIwMDAwIDw9IHogKSA/IDB4RkZGRjgwMDAgOiAoIHo8PDE1ICk7CisgICAgICAgIGlmICggeiA8PSBhICkgcmV0dXJuIChiaXRzMzIpICggKCAoc2JpdHMzMikgYSApPj4xICk7CisgICAgfQorICAgIHJldHVybiAoIChiaXRzMzIpICggKCAoIChiaXRzNjQpIGEgKTw8MzEgKSAvIHogKSApICsgKCB6Pj4xICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIG51bWJlciBvZiBsZWFkaW5nIDAgYml0cyBiZWZvcmUgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgMSBiaXQKK29mIGBhJy4gIElmIGBhJyBpcyB6ZXJvLCAzMiBpcyByZXR1cm5lZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgaW50OCBjb3VudExlYWRpbmdaZXJvczMyKCBiaXRzMzIgYSApCit7CisgICAgc3RhdGljIGNvbnN0IGludDggY291bnRMZWFkaW5nWmVyb3NIaWdoW10gPSB7CisgICAgICAgIDgsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICB9OworICAgIGludDggc2hpZnRDb3VudDsKKworICAgIHNoaWZ0Q291bnQgPSAwOworICAgIGlmICggYSA8IDB4MTAwMDAgKSB7CisgICAgICAgIHNoaWZ0Q291bnQgKz0gMTY7CisgICAgICAgIGEgPDw9IDE2OworICAgIH0KKyAgICBpZiAoIGEgPCAweDEwMDAwMDAgKSB7CisgICAgICAgIHNoaWZ0Q291bnQgKz0gODsKKyAgICAgICAgYSA8PD0gODsKKyAgICB9CisgICAgc2hpZnRDb3VudCArPSBjb3VudExlYWRpbmdaZXJvc0hpZ2hbIGE+PjI0IF07CisgICAgcmV0dXJuIHNoaWZ0Q291bnQ7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIG51bWJlciBvZiBsZWFkaW5nIDAgYml0cyBiZWZvcmUgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgMSBiaXQKK29mIGBhJy4gIElmIGBhJyBpcyB6ZXJvLCA2NCBpcyByZXR1cm5lZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgaW50OCBjb3VudExlYWRpbmdaZXJvczY0KCBiaXRzNjQgYSApCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgc2hpZnRDb3VudCA9IDA7CisgICAgaWYgKCBhIDwgKCAoYml0czY0KSAxICk8PDMyICkgeworICAgICAgICBzaGlmdENvdW50ICs9IDMyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYSA+Pj0gMzI7CisgICAgfQorICAgIHNoaWZ0Q291bnQgKz0gY291bnRMZWFkaW5nWmVyb3MzMiggYSApOworICAgIHJldHVybiBzaGlmdENvdW50OworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJworaXMgZXF1YWwgdG8gdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJyBhbmQgYGIxJy4KK090aGVyd2lzZSwgcmV0dXJucyAwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK0lOTElORSBmbGFnIGVxMTI4KCBiaXRzNjQgYTAsIGJpdHM2NCBhMSwgYml0czY0IGIwLCBiaXRzNjQgYjEgKQoreworCisgICAgcmV0dXJuICggYTAgPT0gYjAgKSAmJiAoIGExID09IGIxICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnIGFuZCBgYTEnIGlzIGxlc3MKK3RoYW4gb3IgZXF1YWwgdG8gdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJyBhbmQgYGIxJy4KK090aGVyd2lzZSwgcmV0dXJucyAwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK0lOTElORSBmbGFnIGxlMTI4KCBiaXRzNjQgYTAsIGJpdHM2NCBhMSwgYml0czY0IGIwLCBiaXRzNjQgYjEgKQoreworCisgICAgcmV0dXJuICggYTAgPCBiMCApIHx8ICggKCBhMCA9PSBiMCApICYmICggYTEgPD0gYjEgKSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyBpcyBsZXNzCit0aGFuIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBiMCcgYW5kIGBiMScuICBPdGhlcndpc2UsCityZXR1cm5zIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIGZsYWcgbHQxMjgoIGJpdHM2NCBhMCwgYml0czY0IGExLCBiaXRzNjQgYjAsIGJpdHM2NCBiMSApCit7CisKKyAgICByZXR1cm4gKCBhMCA8IGIwICkgfHwgKCAoIGEwID09IGIwICkgJiYgKCBhMSA8IGIxICkgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyAxIGlmIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScgaXMKK25vdCBlcXVhbCB0byB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYjAnIGFuZCBgYjEnLgorT3RoZXJ3aXNlLCByZXR1cm5zIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIGZsYWcgbmUxMjgoIGJpdHM2NCBhMCwgYml0czY0IGExLCBiaXRzNjQgYjAsIGJpdHM2NCBiMSApCit7CisKKyAgICByZXR1cm4gKCBhMCAhPSBiMCApIHx8ICggYTEgIT0gYjEgKTsKKworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9zb2Z0ZmxvYXQtc3BlY2lhbGl6ZSBiL2FyY2gvYXJtL253ZnBlL3NvZnRmbG9hdC1zcGVjaWFsaXplCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjQwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9zb2Z0ZmxvYXQtc3BlY2lhbGl6ZQpAQCAtMCwwICsxLDM2NiBAQAorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIEMgc291cmNlIGZyYWdtZW50IGlzIHBhcnQgb2YgdGhlIFNvZnRGbG9hdCBJRUMvSUVFRSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYyBQYWNrYWdlLCBSZWxlYXNlIDIuCisKK1dyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKK0ludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKK05hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCitvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKK3Byb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKK292ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KK2lzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBXZWIgcGFnZSBgaHR0cDovL0hUVFAuQ1MuQmVya2VsZXkuRURVL35qaGF1c2VyLworYXJpdGhtZXRpYy9zb2Z0ZmxvYXQuaHRtbCcuCisKK1RISVMgU09GVFdBUkUgSVMgRElTVFJJQlVURUQgQVMgSVMsIEZPUiBGUkVFLiAgQWx0aG91Z2ggcmVhc29uYWJsZSBlZmZvcnQKK2hhcyBiZWVuIG1hZGUgdG8gYXZvaWQgaXQsIFRISVMgU09GVFdBUkUgTUFZIENPTlRBSU4gRkFVTFRTIFRIQVQgV0lMTCBBVAorVElNRVMgUkVTVUxUIElOIElOQ09SUkVDVCBCRUhBVklPUi4gIFVTRSBPRiBUSElTIFNPRlRXQVJFIElTIFJFU1RSSUNURUQgVE8KK1BFUlNPTlMgQU5EIE9SR0FOSVpBVElPTlMgV0hPIENBTiBBTkQgV0lMTCBUQUtFIEZVTEwgUkVTUE9OU0lCSUxJVFkgRk9SIEFOWQorQU5EIEFMTCBMT1NTRVMsIENPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBBUklTSU5HIEZST00gSVRTIFVTRS4KKworRGVyaXZhdGl2ZSB3b3JrcyBhcmUgYWNjZXB0YWJsZSwgZXZlbiBmb3IgY29tbWVyY2lhbCBwdXJwb3Nlcywgc28gbG9uZyBhcworKDEpIHRoZXkgaW5jbHVkZSBwcm9taW5lbnQgbm90aWNlIHRoYXQgdGhlIHdvcmsgaXMgZGVyaXZhdGl2ZSwgYW5kICgyKSB0aGV5CitpbmNsdWRlIHByb21pbmVudCBub3RpY2UgYWtpbiB0byB0aGVzZSB0aHJlZSBwYXJhZ3JhcGhzIGZvciB0aG9zZSBwYXJ0cyBvZgordGhpcyBjb2RlIHRoYXQgYXJlIHJldGFpbmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVW5kZXJmbG93IHRpbmluZXNzLWRldGVjdGlvbiBtb2RlLCBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIGRlZmF1bHQgdmFsdWUuCisoVGhlIGRlY2xhcmF0aW9uIGluIGBzb2Z0ZmxvYXQuaCcgbXVzdCBtYXRjaCB0aGUgYGludDgnIHR5cGUgaGVyZS4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50OCBmbG9hdF9kZXRlY3RfdGluaW5lc3MgPSBmbG9hdF90aW5pbmVzc19hZnRlcl9yb3VuZGluZzsKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JhaXNlcyB0aGUgZXhjZXB0aW9ucyBzcGVjaWZpZWQgYnkgYGZsYWdzJy4gIEZsb2F0aW5nLXBvaW50IHRyYXBzIGNhbiBiZQorZGVmaW5lZCBoZXJlIGlmIGRlc2lyZWQuICBJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIGZvciBzdWNoIGEgdHJhcCB0bworc3Vic3RpdHV0ZSBhIHJlc3VsdCB2YWx1ZS4gIElmIHRyYXBzIGFyZSBub3QgaW1wbGVtZW50ZWQsIHRoaXMgcm91dGluZQorc2hvdWxkIGJlIHNpbXBseSBgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzIHw9IGZsYWdzOycuCisKK1Njb3R0QjogIE5vdmVtYmVyIDQsIDE5OTgKK01vdmVkIHRoaXMgZnVuY3Rpb24gb3V0IG9mIHNvZnRmbG9hdC1zcGVjaWFsaXplIGludG8gZnBtb2R1bGUuYy4KK1RoaXMgZWZmZWN0aXZlbHkgaXNvbGF0ZXMgYWxsIHRoZSBjaGFuZ2VzIHJlcXVpcmVkIGZvciBpbnRlZ3JhdGluZyB3aXRoIHRoZQorTGludXgga2VybmVsIGludG8gZnBtb2R1bGUuYy4gIFBvcnRpbmcgdG8gTmV0QlNEIHNob3VsZCBvbmx5IHJlcXVpcmUgbW9kaWZ5aW5nCitmcG1vZHVsZS5jIHRvIGludGVncmF0ZSB3aXRoIHRoZSBOZXRCU0Qga2VybmVsIChJIGhvcGUhKS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgZmxvYXRfcmFpc2UoIGludDggZmxhZ3MgKQoreworICAgIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbGFnczsKK30KKyovCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbnRlcm5hbCBjYW5vbmljYWwgTmFOIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxhZyBzaWduOworICAgIGJpdHM2NCBoaWdoLCBsb3c7Cit9IGNvbW1vbk5hTlQ7CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgcGF0dGVybiBmb3IgYSBkZWZhdWx0IGdlbmVyYXRlZCBzaW5nbGUtcHJlY2lzaW9uIE5hTi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIGZsb2F0MzJfZGVmYXVsdF9uYW4gMHhGRkZGRkZGRgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyAxIGlmIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBhIE5hTjsKK290aGVyd2lzZSByZXR1cm5zIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdDMyX2lzX25hbiggZmxvYXQzMiBhICkKK3sKKworICAgIHJldHVybiAoIDB4RkYwMDAwMDAgPCAoYml0czMyKSAoIGE8PDEgKSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEgc2lnbmFsaW5nCitOYU47IG90aGVyd2lzZSByZXR1cm5zIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGZsb2F0MzIgYSApCit7CisKKyAgICByZXR1cm4gKCAoICggYT4+MjIgKSAmIDB4MUZGICkgPT0gMHgxRkUgKSAmJiAoIGEgJiAweDAwM0ZGRkZGICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IE5hTgorYGEnIHRvIHRoZSBjYW5vbmljYWwgTmFOIGZvcm1hdC4gIElmIGBhJyBpcyBhIHNpZ25hbGluZyBOYU4sIHRoZSBpbnZhbGlkCitleGNlcHRpb24gaXMgcmFpc2VkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBjb21tb25OYU5UIGZsb2F0MzJUb0NvbW1vbk5hTiggZmxvYXQzMiBhICkKK3sKKyAgICBjb21tb25OYU5UIHo7CisKKyAgICBpZiAoIGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggYSApICkgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgIHouc2lnbiA9IGE+PjMxOworICAgIHoubG93ID0gMDsKKyAgICB6LmhpZ2ggPSAoIChiaXRzNjQpIGEgKTw8NDE7CisgICAgcmV0dXJuIHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBjYW5vbmljYWwgTmFOIGBhJyB0byB0aGUgc2luZ2xlLQorcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgZmxvYXQzMiBjb21tb25OYU5Ub0Zsb2F0MzIoIGNvbW1vbk5hTlQgYSApCit7CisKKyAgICByZXR1cm4gKCAoIChiaXRzMzIpIGEuc2lnbiApPDwzMSApIHwgMHg3RkMwMDAwMCB8ICggYS5oaWdoPj40MSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUYWtlcyB0d28gc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicsIG9uZSBvZiB3aGljaAoraXMgYSBOYU4sIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBOYU4gcmVzdWx0LiAgSWYgZWl0aGVyIGBhJyBvciBgYicgaXMgYQorc2lnbmFsaW5nIE5hTiwgdGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgZmxvYXQzMiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCit7CisgICAgZmxhZyBhSXNOYU4sIGFJc1NpZ25hbGluZ05hTiwgYklzTmFOLCBiSXNTaWduYWxpbmdOYU47CisKKyAgICBhSXNOYU4gPSBmbG9hdDMyX2lzX25hbiggYSApOworICAgIGFJc1NpZ25hbGluZ05hTiA9IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggYSApOworICAgIGJJc05hTiA9IGZsb2F0MzJfaXNfbmFuKCBiICk7CisgICAgYklzU2lnbmFsaW5nTmFOID0gZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBiICk7CisgICAgYSB8PSAweDAwNDAwMDAwOworICAgIGIgfD0gMHgwMDQwMDAwMDsKKyAgICBpZiAoIGFJc1NpZ25hbGluZ05hTiB8IGJJc1NpZ25hbGluZ05hTiApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICBpZiAoIGFJc05hTiApIHsKKyAgICAgICAgcmV0dXJuICggYUlzU2lnbmFsaW5nTmFOICYgYklzTmFOICkgPyBiIDogYTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBiOworICAgIH0KKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHBhdHRlcm4gZm9yIGEgZGVmYXVsdCBnZW5lcmF0ZWQgZG91YmxlLXByZWNpc2lvbiBOYU4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBmbG9hdDY0X2RlZmF1bHRfbmFuIExJVDY0KCAweEZGRkZGRkZGRkZGRkZGRkYgKQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBhIE5hTjsKK290aGVyd2lzZSByZXR1cm5zIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdDY0X2lzX25hbiggZmxvYXQ2NCBhICkKK3sKKworICAgIHJldHVybiAoIExJVDY0KCAweEZGRTAwMDAwMDAwMDAwMDAgKSA8IChiaXRzNjQpICggYTw8MSApICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgYSBzaWduYWxpbmcKK05hTjsgb3RoZXJ3aXNlIHJldHVybnMgMC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbGFnIGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbiggZmxvYXQ2NCBhICkKK3sKKworICAgIHJldHVybgorICAgICAgICAgICAoICggKCBhPj41MSApICYgMHhGRkYgKSA9PSAweEZGRSApCisgICAgICAgICYmICggYSAmIExJVDY0KCAweDAwMDdGRkZGRkZGRkZGRkYgKSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBOYU4KK2BhJyB0byB0aGUgY2Fub25pY2FsIE5hTiBmb3JtYXQuICBJZiBgYScgaXMgYSBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZAorZXhjZXB0aW9uIGlzIHJhaXNlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgY29tbW9uTmFOVCBmbG9hdDY0VG9Db21tb25OYU4oIGZsb2F0NjQgYSApCit7CisgICAgY29tbW9uTmFOVCB6OworCisgICAgaWYgKCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGEgKSApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICB6LnNpZ24gPSBhPj42MzsKKyAgICB6LmxvdyA9IDA7CisgICAgei5oaWdoID0gYTw8MTI7CisgICAgcmV0dXJuIHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBjYW5vbmljYWwgTmFOIGBhJyB0byB0aGUgZG91YmxlLQorcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgZmxvYXQ2NCBjb21tb25OYU5Ub0Zsb2F0NjQoIGNvbW1vbk5hTlQgYSApCit7CisKKyAgICByZXR1cm4KKyAgICAgICAgICAoICggKGJpdHM2NCkgYS5zaWduICk8PDYzICkKKyAgICAgICAgfCBMSVQ2NCggMHg3RkY4MDAwMDAwMDAwMDAwICkKKyAgICAgICAgfCAoIGEuaGlnaD4+MTIgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGFrZXMgdHdvIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLCBvbmUgb2Ygd2hpY2gKK2lzIGEgTmFOLCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgTmFOIHJlc3VsdC4gIElmIGVpdGhlciBgYScgb3IgYGInIGlzIGEKK3NpZ25hbGluZyBOYU4sIHRoZSBpbnZhbGlkIGV4Y2VwdGlvbiBpcyByYWlzZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGZsb2F0NjQgcHJvcGFnYXRlRmxvYXQ2NE5hTiggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICAgIGZsYWcgYUlzTmFOLCBhSXNTaWduYWxpbmdOYU4sIGJJc05hTiwgYklzU2lnbmFsaW5nTmFOOworCisgICAgYUlzTmFOID0gZmxvYXQ2NF9pc19uYW4oIGEgKTsKKyAgICBhSXNTaWduYWxpbmdOYU4gPSBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGEgKTsKKyAgICBiSXNOYU4gPSBmbG9hdDY0X2lzX25hbiggYiApOworICAgIGJJc1NpZ25hbGluZ05hTiA9IGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbiggYiApOworICAgIGEgfD0gTElUNjQoIDB4MDAwODAwMDAwMDAwMDAwMCApOworICAgIGIgfD0gTElUNjQoIDB4MDAwODAwMDAwMDAwMDAwMCApOworICAgIGlmICggYUlzU2lnbmFsaW5nTmFOIHwgYklzU2lnbmFsaW5nTmFOICkgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgIGlmICggYUlzTmFOICkgeworICAgICAgICByZXR1cm4gKCBhSXNTaWduYWxpbmdOYU4gJiBiSXNOYU4gKSA/IGIgOiBhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCit9CisKKyNpZmRlZiBGTE9BVFg4MAorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHBhdHRlcm4gZm9yIGEgZGVmYXVsdCBnZW5lcmF0ZWQgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBOYU4uICBUaGUKK2BoaWdoJyBhbmQgYGxvdycgdmFsdWVzIGhvbGQgdGhlIG1vc3QtIGFuZCBsZWFzdC1zaWduaWZpY2FudCBiaXRzLAorcmVzcGVjdGl2ZWx5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgZmxvYXR4ODBfZGVmYXVsdF9uYW5faGlnaCAweEZGRkYKKyNkZWZpbmUgZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93ICBMSVQ2NCggMHhGRkZGRkZGRkZGRkZGRkZGICkKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgYQorTmFOOyBvdGhlcndpc2UgcmV0dXJucyAwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXR4ODBfaXNfbmFuKCBmbG9hdHg4MCBhICkKK3sKKworICAgIHJldHVybiAoICggYS5oaWdoICYgMHg3RkZGICkgPT0gMHg3RkZGICkgJiYgKGJpdHM2NCkgKCBhLmxvdzw8MSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEKK3NpZ25hbGluZyBOYU47IG90aGVyd2lzZSByZXR1cm5zIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBmbG9hdHg4MCBhICkKK3sKKyAgICAvL3JlZ2lzdGVyIGludCBscjsKKyAgICBiaXRzNjQgYUxvdzsKKworICAgIC8vX19hc21fXygibW92ICUwLCBsciIgOiA6ICJnIiAobHIpKTsKKyAgICAvL2ZwX3ByaW50aygiZmxvYXR4ODBfaXNfc2lnbmFsbGluZ19uYW4oKSBjYWxsZWQgZnJvbSAweCUwOHhcbiIsbHIpOworICAgIGFMb3cgPSBhLmxvdyAmIH4gTElUNjQoIDB4NDAwMDAwMDAwMDAwMDAwMCApOworICAgIHJldHVybgorICAgICAgICAgICAoICggYS5oaWdoICYgMHg3RkZGICkgPT0gMHg3RkZGICkKKyAgICAgICAgJiYgKGJpdHM2NCkgKCBhTG93PDwxICkKKyAgICAgICAgJiYgKCBhLmxvdyA9PSBhTG93ICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorcG9pbnQgTmFOIGBhJyB0byB0aGUgY2Fub25pY2FsIE5hTiBmb3JtYXQuICBJZiBgYScgaXMgYSBzaWduYWxpbmcgTmFOLCB0aGUKK2ludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgY29tbW9uTmFOVCBmbG9hdHg4MFRvQ29tbW9uTmFOKCBmbG9hdHg4MCBhICkKK3sKKyAgICBjb21tb25OYU5UIHo7CisKKyAgICBpZiAoIGZsb2F0eDgwX2lzX3NpZ25hbGluZ19uYW4oIGEgKSApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICB6LnNpZ24gPSBhLmhpZ2g+PjE1OworICAgIHoubG93ID0gMDsKKyAgICB6LmhpZ2ggPSBhLmxvdzw8MTsKKyAgICByZXR1cm4gejsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGNhbm9uaWNhbCBOYU4gYGEnIHRvIHRoZSBleHRlbmRlZAorZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGZsb2F0eDgwIGNvbW1vbk5hTlRvRmxvYXR4ODAoIGNvbW1vbk5hTlQgYSApCit7CisgICAgZmxvYXR4ODAgejsKKworICAgIHoubG93ID0gTElUNjQoIDB4QzAwMDAwMDAwMDAwMDAwMCApIHwgKCBhLmhpZ2g+PjEgKTsKKyAgICB6LmhpZ2ggPSAoICggKGJpdHMxNikgYS5zaWduICk8PDE1ICkgfCAweDdGRkY7CisgICAgcmV0dXJuIHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Rha2VzIHR3byBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJywgb25lCitvZiB3aGljaCBpcyBhIE5hTiwgYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIE5hTiByZXN1bHQuICBJZiBlaXRoZXIgYGEnIG9yCitgYicgaXMgYSBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBmbG9hdHg4MCBwcm9wYWdhdGVGbG9hdHg4ME5hTiggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiApCit7CisgICAgZmxhZyBhSXNOYU4sIGFJc1NpZ25hbGluZ05hTiwgYklzTmFOLCBiSXNTaWduYWxpbmdOYU47CisKKyAgICBhSXNOYU4gPSBmbG9hdHg4MF9pc19uYW4oIGEgKTsKKyAgICBhSXNTaWduYWxpbmdOYU4gPSBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBhICk7CisgICAgYklzTmFOID0gZmxvYXR4ODBfaXNfbmFuKCBiICk7CisgICAgYklzU2lnbmFsaW5nTmFOID0gZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYiApOworICAgIGEubG93IHw9IExJVDY0KCAweEMwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICBiLmxvdyB8PSBMSVQ2NCggMHhDMDAwMDAwMDAwMDAwMDAwICk7CisgICAgaWYgKCBhSXNTaWduYWxpbmdOYU4gfCBiSXNTaWduYWxpbmdOYU4gKSBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgaWYgKCBhSXNOYU4gKSB7CisgICAgICAgIHJldHVybiAoIGFJc1NpZ25hbGluZ05hTiAmIGJJc05hTiApID8gYiA6IGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9zb2Z0ZmxvYXQuYyBiL2FyY2gvYXJtL253ZnBlL3NvZnRmbG9hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzQzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ud2ZwZS9zb2Z0ZmxvYXQuYwpAQCAtMCwwICsxLDM0NDMgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgQyBzb3VyY2UgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTb2Z0RmxvYXQgSUVDL0lFRUUgRmxvYXRpbmctcG9pbnQKK0FyaXRobWV0aWMgUGFja2FnZSwgUmVsZWFzZSAyLgorCitXcml0dGVuIGJ5IEpvaG4gUi4gSGF1c2VyLiAgVGhpcyB3b3JrIHdhcyBtYWRlIHBvc3NpYmxlIGluIHBhcnQgYnkgdGhlCitJbnRlcm5hdGlvbmFsIENvbXB1dGVyIFNjaWVuY2UgSW5zdGl0dXRlLCBsb2NhdGVkIGF0IFN1aXRlIDYwMCwgMTk0NyBDZW50ZXIKK1N0cmVldCwgQmVya2VsZXksIENhbGlmb3JuaWEgOTQ3MDQuICBGdW5kaW5nIHdhcyBwYXJ0aWFsbHkgcHJvdmlkZWQgYnkgdGhlCitOYXRpb25hbCBTY2llbmNlIEZvdW5kYXRpb24gdW5kZXIgZ3JhbnQgTUlQLTkzMTE5ODAuICBUaGUgb3JpZ2luYWwgdmVyc2lvbgorb2YgdGhpcyBjb2RlIHdhcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIGJ1aWxkIGEgZml4ZWQtcG9pbnQgdmVjdG9yCitwcm9jZXNzb3IgaW4gY29sbGFib3JhdGlvbiB3aXRoIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXksCitvdmVyc2VlbiBieSBQcm9mcy4gTmVsc29uIE1vcmdhbiBhbmQgSm9obiBXYXdyenluZWsuICBNb3JlIGluZm9ybWF0aW9uCitpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd2ViIHBhZ2UgYGh0dHA6Ly9IVFRQLkNTLkJlcmtlbGV5LkVEVS9+amhhdXNlci8KK2FyaXRobWV0aWMvc29mdGZsb2F0Lmh0bWwnLgorCitUSElTIFNPRlRXQVJFIElTIERJU1RSSUJVVEVEIEFTIElTLCBGT1IgRlJFRS4gIEFsdGhvdWdoIHJlYXNvbmFibGUgZWZmb3J0CitoYXMgYmVlbiBtYWRlIHRvIGF2b2lkIGl0LCBUSElTIFNPRlRXQVJFIE1BWSBDT05UQUlOIEZBVUxUUyBUSEFUIFdJTEwgQVQKK1RJTUVTIFJFU1VMVCBJTiBJTkNPUlJFQ1QgQkVIQVZJT1IuICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJUyBSRVNUUklDVEVEIFRPCitQRVJTT05TIEFORCBPUkdBTklaQVRJT05TIFdITyBDQU4gQU5EIFdJTEwgVEFLRSBGVUxMIFJFU1BPTlNJQklMSVRZIEZPUiBBTlkKK0FORCBBTEwgTE9TU0VTLCBDT1NUUywgT1IgT1RIRVIgUFJPQkxFTVMgQVJJU0lORyBGUk9NIElUUyBVU0UuCisKK0Rlcml2YXRpdmUgd29ya3MgYXJlIGFjY2VwdGFibGUsIGV2ZW4gZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMsIHNvIGxvbmcgYXMKKygxKSB0aGV5IGluY2x1ZGUgcHJvbWluZW50IG5vdGljZSB0aGF0IHRoZSB3b3JrIGlzIGRlcml2YXRpdmUsIGFuZCAoMikgdGhleQoraW5jbHVkZSBwcm9taW5lbnQgbm90aWNlIGFraW4gdG8gdGhlc2UgdGhyZWUgcGFyYWdyYXBocyBmb3IgdGhvc2UgcGFydHMgb2YKK3RoaXMgY29kZSB0aGF0IGFyZSByZXRhaW5lZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2luY2x1ZGUgImZwYTExLmgiCisvLyNpbmNsdWRlICJtaWxpZXUuaCIKKy8vI2luY2x1ZGUgInNvZnRmbG9hdC5oIgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRmxvYXRpbmctcG9pbnQgcm91bmRpbmcgbW9kZSwgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiByb3VuZGluZyBwcmVjaXNpb24sCithbmQgZXhjZXB0aW9uIGZsYWdzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ludDggZmxvYXRfcm91bmRpbmdfbW9kZSA9IGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbjsKK2ludDggZmxvYXR4ODBfcm91bmRpbmdfcHJlY2lzaW9uID0gODA7CitpbnQ4IGZsb2F0X2V4Y2VwdGlvbl9mbGFnczsKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ByaW1pdGl2ZSBhcml0aG1ldGljIGZ1bmN0aW9ucywgaW5jbHVkaW5nIG11bHRpLXdvcmQgYXJpdGhtZXRpYywgYW5kCitkaXZpc2lvbiBhbmQgc3F1YXJlIHJvb3QgYXBwcm94aW1hdGlvbnMuICAoQ2FuIGJlIHNwZWNpYWxpemVkIHRvIHRhcmdldCBpZgorZGVzaXJlZC4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2luY2x1ZGUgInNvZnRmbG9hdC1tYWNyb3MiCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIHRvIGRldGVybWluZTogICgxKSB3aGV0aGVyIHRpbmluZXNzIGZvciB1bmRlcmZsb3cKK2lzIGRldGVjdGVkIGJlZm9yZSBvciBhZnRlciByb3VuZGluZyBieSBkZWZhdWx0LCAoMikgd2hhdCAoaWYgYW55dGhpbmcpCitoYXBwZW5zIHdoZW4gZXhjZXB0aW9ucyBhcmUgcmFpc2VkLCAoMykgaG93IHNpZ25hbGluZyBOYU5zIGFyZSBkaXN0aW5ndWlzaGVkCitmcm9tIHF1aWV0IE5hTnMsICg0KSB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgcXVpZXQgTmFOcywgYW5kICg1KSBob3cgTmFOcworYXJlIHByb3BhZ2F0ZWQgZnJvbSBmdW5jdGlvbiBpbnB1dHMgdG8gb3V0cHV0LiAgVGhlc2UgZGV0YWlscyBhcmUgdGFyZ2V0LQorc3BlY2lmaWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2luY2x1ZGUgInNvZnRmbG9hdC1zcGVjaWFsaXplIgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGFrZXMgYSA2NC1iaXQgZml4ZWQtcG9pbnQgdmFsdWUgYGFic1onIHdpdGggYmluYXJ5IHBvaW50IGJldHdlZW4gYml0cyA2CithbmQgNywgYW5kIHJldHVybnMgdGhlIHByb3Blcmx5IHJvdW5kZWQgMzItYml0IGludGVnZXIgY29ycmVzcG9uZGluZyB0byB0aGUKK2lucHV0LiAgSWYgYHpTaWduJyBpcyBub256ZXJvLCB0aGUgaW5wdXQgaXMgbmVnYXRlZCBiZWZvcmUgYmVpbmcgY29udmVydGVkCit0byBhbiBpbnRlZ2VyLiAgQml0IDYzIG9mIGBhYnNaJyBtdXN0IGJlIHplcm8uICBPcmRpbmFyaWx5LCB0aGUgZml4ZWQtcG9pbnQKK2lucHV0IGlzIHNpbXBseSByb3VuZGVkIHRvIGFuIGludGVnZXIsIHdpdGggdGhlIGluZXhhY3QgZXhjZXB0aW9uIHJhaXNlZCBpZgordGhlIGlucHV0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGFuIGludGVnZXIuICBJZiB0aGUgZml4ZWQtcG9pbnQKK2lucHV0IGlzIHRvbyBsYXJnZSwgaG93ZXZlciwgdGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlIGxhcmdlc3QKK3Bvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGludDMyIHJvdW5kQW5kUGFja0ludDMyKCBmbGFnIHpTaWduLCBiaXRzNjQgYWJzWiApCit7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgZmxhZyByb3VuZE5lYXJlc3RFdmVuOworICAgIGludDggcm91bmRJbmNyZW1lbnQsIHJvdW5kQml0czsKKyAgICBpbnQzMiB6OworCisgICAgcm91bmRpbmdNb2RlID0gZmxvYXRfcm91bmRpbmdfbW9kZTsKKyAgICByb3VuZE5lYXJlc3RFdmVuID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICk7CisgICAgcm91bmRJbmNyZW1lbnQgPSAweDQwOworICAgIGlmICggISByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAweDdGOworICAgICAgICAgICAgaWYgKCB6U2lnbiApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF91cCApIHJvdW5kSW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX2Rvd24gKSByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcm91bmRCaXRzID0gYWJzWiAmIDB4N0Y7CisgICAgYWJzWiA9ICggYWJzWiArIHJvdW5kSW5jcmVtZW50ICk+Pjc7CisgICAgYWJzWiAmPSB+ICggKCAoIHJvdW5kQml0cyBeIDB4NDAgKSA9PSAwICkgJiByb3VuZE5lYXJlc3RFdmVuICk7CisgICAgeiA9IGFic1o7CisgICAgaWYgKCB6U2lnbiApIHogPSAtIHo7CisgICAgaWYgKCAoIGFic1o+PjMyICkgfHwgKCB6ICYmICggKCB6IDwgMCApIF4gelNpZ24gKSApICkgeworICAgICAgICBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbnZhbGlkOworICAgICAgICByZXR1cm4gelNpZ24gPyAweDgwMDAwMDAwIDogMHg3RkZGRkZGRjsKKyAgICB9CisgICAgaWYgKCByb3VuZEJpdHMgKSBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHJldHVybiB6OworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSBmcmFjdGlvbiBiaXRzIG9mIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgYml0czMyIGV4dHJhY3RGbG9hdDMyRnJhYyggZmxvYXQzMiBhICkKK3sKKworICAgIHJldHVybiBhICYgMHgwMDdGRkZGRjsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgZXhwb25lbnQgYml0cyBvZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIGludDE2IGV4dHJhY3RGbG9hdDMyRXhwKCBmbG9hdDMyIGEgKQoreworCisgICAgcmV0dXJuICggYT4+MjMgKSAmIDB4RkY7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWYgMAkvKiBpbiBzb2Z0ZmxvYXQuaCAqLworSU5MSU5FIGZsYWcgZXh0cmFjdEZsb2F0MzJTaWduKCBmbG9hdDMyIGEgKQoreworCisgICAgcmV0dXJuIGE+PjMxOworCit9CisjZW5kaWYKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05vcm1hbGl6ZXMgdGhlIHN1Ym5vcm1hbCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIHJlcHJlc2VudGVkCitieSB0aGUgZGVub3JtYWxpemVkIHNpZ25pZmljYW5kIGBhU2lnJy4gIFRoZSBub3JtYWxpemVkIGV4cG9uZW50IGFuZAorc2lnbmlmaWNhbmQgYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHpFeHBQdHInIGFuZAorYHpTaWdQdHInLCByZXNwZWN0aXZlbHkuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHZvaWQKKyBub3JtYWxpemVGbG9hdDMyU3Vibm9ybWFsKCBiaXRzMzIgYVNpZywgaW50MTYgKnpFeHBQdHIsIGJpdHMzMiAqelNpZ1B0ciApCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zMzIoIGFTaWcgKSAtIDg7CisgICAgKnpTaWdQdHIgPSBhU2lnPDxzaGlmdENvdW50OworICAgICp6RXhwUHRyID0gMSAtIHNoaWZ0Q291bnQ7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BhY2tzIHRoZSBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywgYW5kIHNpZ25pZmljYW5kIGB6U2lnJyBpbnRvIGEKK3NpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUsIHJldHVybmluZyB0aGUgcmVzdWx0LiAgQWZ0ZXIgYmVpbmcKK3NoaWZ0ZWQgaW50byB0aGUgcHJvcGVyIHBvc2l0aW9ucywgdGhlIHRocmVlIGZpZWxkcyBhcmUgc2ltcGx5IGFkZGVkCit0b2dldGhlciB0byBmb3JtIHRoZSByZXN1bHQuICBUaGlzIG1lYW5zIHRoYXQgYW55IGludGVnZXIgcG9ydGlvbiBvZiBgelNpZycKK3dpbGwgYmUgYWRkZWQgaW50byB0aGUgZXhwb25lbnQuICBTaW5jZSBhIHByb3Blcmx5IG5vcm1hbGl6ZWQgc2lnbmlmaWNhbmQKK3dpbGwgaGF2ZSBhbiBpbnRlZ2VyIHBvcnRpb24gZXF1YWwgdG8gMSwgdGhlIGB6RXhwJyBpbnB1dCBzaG91bGQgYmUgMSBsZXNzCit0aGFuIHRoZSBkZXNpcmVkIHJlc3VsdCBleHBvbmVudCB3aGVuZXZlciBgelNpZycgaXMgYSBjb21wbGV0ZSwgbm9ybWFsaXplZAorc2lnbmlmaWNhbmQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIGZsb2F0MzIgcGFja0Zsb2F0MzIoIGZsYWcgelNpZ24sIGludDE2IHpFeHAsIGJpdHMzMiB6U2lnICkKK3sKKyNpZiAwCisgICBmbG9hdDMyIGY7CisgICBfX2FzbV9fKCJAIHBhY2tGbG9hdDMyCQkJCVxuXAorICAgCSAgICBtb3YgJTAsICUxLCBhc2wgIzMxCQkJCVxuXAorICAgCSAgICBvcnIgJTAsICUyLCBhc2wgIzIzCQkJCVxuXAorICAgCSAgICBvcnIgJTAsICUzIgorICAgCSAgICA6IC8qIG5vIG91dHB1dHMgKi8KKyAgIAkgICAgOiAiZyIgKGYpLCAiZyIgKHpTaWduKSwgImciICh6RXhwKSwgImciICh6U2lnKQorICAgCSAgICA6ICJjYyIpOworICAgcmV0dXJuIGY7CisjZWxzZQorICAgIHJldHVybiAoICggKGJpdHMzMikgelNpZ24gKTw8MzEgKSArICggKCAoYml0czMyKSB6RXhwICk8PDIzICkgKyB6U2lnOworI2VuZGlmIAorfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGFrZXMgYW4gYWJzdHJhY3QgZmxvYXRpbmctcG9pbnQgdmFsdWUgaGF2aW5nIHNpZ24gYHpTaWduJywgZXhwb25lbnQgYHpFeHAnLAorYW5kIHNpZ25pZmljYW5kIGB6U2lnJywgYW5kIHJldHVybnMgdGhlIHByb3BlciBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorcG9pbnQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgYWJzdHJhY3QgaW5wdXQuICBPcmRpbmFyaWx5LCB0aGUgYWJzdHJhY3QKK3ZhbHVlIGlzIHNpbXBseSByb3VuZGVkIGFuZCBwYWNrZWQgaW50byB0aGUgc2luZ2xlLXByZWNpc2lvbiBmb3JtYXQsIHdpdGgKK3RoZSBpbmV4YWN0IGV4Y2VwdGlvbiByYWlzZWQgaWYgdGhlIGFic3RyYWN0IGlucHV0IGNhbm5vdCBiZSByZXByZXNlbnRlZAorZXhhY3RseS4gIElmIHRoZSBhYnN0cmFjdCB2YWx1ZSBpcyB0b28gbGFyZ2UsIGhvd2V2ZXIsIHRoZSBvdmVyZmxvdyBhbmQKK2luZXhhY3QgZXhjZXB0aW9ucyBhcmUgcmFpc2VkIGFuZCBhbiBpbmZpbml0eSBvciBtYXhpbWFsIGZpbml0ZSB2YWx1ZSBpcworcmV0dXJuZWQuICBJZiB0aGUgYWJzdHJhY3QgdmFsdWUgaXMgdG9vIHNtYWxsLCB0aGUgaW5wdXQgdmFsdWUgaXMgcm91bmRlZCB0bworYSBzdWJub3JtYWwgbnVtYmVyLCBhbmQgdGhlIHVuZGVyZmxvdyBhbmQgaW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQgaWYKK3RoZSBhYnN0cmFjdCBpbnB1dCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIHN1Ym5vcm1hbCBzaW5nbGUtCitwcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAgIFRoZSBpbnB1dCBzaWduaWZpY2FuZCBgelNpZycgaGFzIGl0cyBiaW5hcnkgcG9pbnQgYmV0d2VlbiBiaXRzIDMwCithbmQgMjksIHdoaWNoIGlzIDcgYml0cyB0byB0aGUgbGVmdCBvZiB0aGUgdXN1YWwgbG9jYXRpb24uICBUaGlzIHNoaWZ0ZWQKK3NpZ25pZmljYW5kIG11c3QgYmUgbm9ybWFsaXplZCBvciBzbWFsbGVyLiAgSWYgYHpTaWcnIGlzIG5vdCBub3JtYWxpemVkLAorYHpFeHAnIG11c3QgYmUgMDsgaW4gdGhhdCBjYXNlLCB0aGUgcmVzdWx0IHJldHVybmVkIGlzIGEgc3Vibm9ybWFsIG51bWJlciwKK2FuZCBpdCBtdXN0IG5vdCByZXF1aXJlIHJvdW5kaW5nLiAgSW4gdGhlIHVzdWFsIGNhc2UgdGhhdCBgelNpZycgaXMKK25vcm1hbGl6ZWQsIGB6RXhwJyBtdXN0IGJlIDEgbGVzcyB0aGFuIHRoZSBgYHRydWUnJyBmbG9hdGluZy1wb2ludCBleHBvbmVudC4KK1RoZSBoYW5kbGluZyBvZiB1bmRlcmZsb3cgYW5kIG92ZXJmbG93IGZvbGxvd3MgdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvcgorQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGZsb2F0MzIgcm91bmRBbmRQYWNrRmxvYXQzMiggZmxhZyB6U2lnbiwgaW50MTYgekV4cCwgYml0czMyIHpTaWcgKQoreworICAgIGludDggcm91bmRpbmdNb2RlOworICAgIGZsYWcgcm91bmROZWFyZXN0RXZlbjsKKyAgICBpbnQ4IHJvdW5kSW5jcmVtZW50LCByb3VuZEJpdHM7CisgICAgZmxhZyBpc1Rpbnk7CisKKyAgICByb3VuZGluZ01vZGUgPSBmbG9hdF9yb3VuZGluZ19tb2RlOworICAgIHJvdW5kTmVhcmVzdEV2ZW4gPSAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4gKTsKKyAgICByb3VuZEluY3JlbWVudCA9IDB4NDA7CisgICAgaWYgKCAhIHJvdW5kTmVhcmVzdEV2ZW4gKSB7CisgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3RvX3plcm8gKSB7CisgICAgICAgICAgICByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByb3VuZEluY3JlbWVudCA9IDB4N0Y7CisgICAgICAgICAgICBpZiAoIHpTaWduICkgeworICAgICAgICAgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfZG93biApIHJvdW5kSW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByb3VuZEJpdHMgPSB6U2lnICYgMHg3RjsKKyAgICBpZiAoIDB4RkQgPD0gKGJpdHMxNikgekV4cCApIHsKKyAgICAgICAgaWYgKCAgICAoIDB4RkQgPCB6RXhwICkKKyAgICAgICAgICAgICB8fCAoICAgICggekV4cCA9PSAweEZEICkKKyAgICAgICAgICAgICAgICAgICYmICggKHNiaXRzMzIpICggelNpZyArIHJvdW5kSW5jcmVtZW50ICkgPCAwICkgKQorICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX292ZXJmbG93IHwgZmxvYXRfZmxhZ19pbmV4YWN0ICk7CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoIHpTaWduLCAweEZGLCAwICkgLSAoIHJvdW5kSW5jcmVtZW50ID09IDAgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHpFeHAgPCAwICkgeworICAgICAgICAgICAgaXNUaW55ID0KKyAgICAgICAgICAgICAgICAgICAoIGZsb2F0X2RldGVjdF90aW5pbmVzcyA9PSBmbG9hdF90aW5pbmVzc19iZWZvcmVfcm91bmRpbmcgKQorICAgICAgICAgICAgICAgIHx8ICggekV4cCA8IC0xICkKKyAgICAgICAgICAgICAgICB8fCAoIHpTaWcgKyByb3VuZEluY3JlbWVudCA8IDB4ODAwMDAwMDAgKTsKKyAgICAgICAgICAgIHNoaWZ0MzJSaWdodEphbW1pbmcoIHpTaWcsIC0gekV4cCwgJnpTaWcgKTsKKyAgICAgICAgICAgIHpFeHAgPSAwOworICAgICAgICAgICAgcm91bmRCaXRzID0gelNpZyAmIDB4N0Y7CisgICAgICAgICAgICBpZiAoIGlzVGlueSAmJiByb3VuZEJpdHMgKSBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ191bmRlcmZsb3cgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHJvdW5kQml0cyApIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgelNpZyA9ICggelNpZyArIHJvdW5kSW5jcmVtZW50ICk+Pjc7CisgICAgelNpZyAmPSB+ICggKCAoIHJvdW5kQml0cyBeIDB4NDAgKSA9PSAwICkgJiByb3VuZE5lYXJlc3RFdmVuICk7CisgICAgaWYgKCB6U2lnID09IDAgKSB6RXhwID0gMDsKKyAgICByZXR1cm4gcGFja0Zsb2F0MzIoIHpTaWduLCB6RXhwLCB6U2lnICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Rha2VzIGFuIGFic3RyYWN0IGZsb2F0aW5nLXBvaW50IHZhbHVlIGhhdmluZyBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywKK2FuZCBzaWduaWZpY2FuZCBgelNpZycsIGFuZCByZXR1cm5zIHRoZSBwcm9wZXIgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy0KK3BvaW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgVGhpcyByb3V0aW5lIGlzIGp1c3QgbGlrZQorYHJvdW5kQW5kUGFja0Zsb2F0MzInIGV4Y2VwdCB0aGF0IGB6U2lnJyBkb2VzIG5vdCBoYXZlIHRvIGJlIG5vcm1hbGl6ZWQgaW4KK2FueSB3YXkuICBJbiBhbGwgY2FzZXMsIGB6RXhwJyBtdXN0IGJlIDEgbGVzcyB0aGFuIHRoZSBgYHRydWUnJyBmbG9hdGluZy0KK3BvaW50IGV4cG9uZW50LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBmbG9hdDMyCisgbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQzMiggZmxhZyB6U2lnbiwgaW50MTYgekV4cCwgYml0czMyIHpTaWcgKQoreworICAgIGludDggc2hpZnRDb3VudDsKKworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczMyKCB6U2lnICkgLSAxOworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDMyKCB6U2lnbiwgekV4cCAtIHNoaWZ0Q291bnQsIHpTaWc8PHNoaWZ0Q291bnQgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgZnJhY3Rpb24gYml0cyBvZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIGJpdHM2NCBleHRyYWN0RmxvYXQ2NEZyYWMoIGZsb2F0NjQgYSApCit7CisKKyAgICByZXR1cm4gYSAmIExJVDY0KCAweDAwMEZGRkZGRkZGRkZGRkYgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgZXhwb25lbnQgYml0cyBvZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIGludDE2IGV4dHJhY3RGbG9hdDY0RXhwKCBmbG9hdDY0IGEgKQoreworCisgICAgcmV0dXJuICggYT4+NTIgKSAmIDB4N0ZGOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSBzaWduIGJpdCBvZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmIDAJLyogaW4gc29mdGZsb2F0LmggKi8KK0lOTElORSBmbGFnIGV4dHJhY3RGbG9hdDY0U2lnbiggZmxvYXQ2NCBhICkKK3sKKworICAgIHJldHVybiBhPj42MzsKKworfQorI2VuZGlmCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitOb3JtYWxpemVzIHRoZSBzdWJub3JtYWwgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSByZXByZXNlbnRlZAorYnkgdGhlIGRlbm9ybWFsaXplZCBzaWduaWZpY2FuZCBgYVNpZycuICBUaGUgbm9ybWFsaXplZCBleHBvbmVudCBhbmQKK3NpZ25pZmljYW5kIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6RXhwUHRyJyBhbmQKK2B6U2lnUHRyJywgcmVzcGVjdGl2ZWx5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkCisgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYml0czY0IGFTaWcsIGludDE2ICp6RXhwUHRyLCBiaXRzNjQgKnpTaWdQdHIgKQoreworICAgIGludDggc2hpZnRDb3VudDsKKworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCBhU2lnICkgLSAxMTsKKyAgICAqelNpZ1B0ciA9IGFTaWc8PHNoaWZ0Q291bnQ7CisgICAgKnpFeHBQdHIgPSAxIC0gc2hpZnRDb3VudDsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUGFja3MgdGhlIHNpZ24gYHpTaWduJywgZXhwb25lbnQgYHpFeHAnLCBhbmQgc2lnbmlmaWNhbmQgYHpTaWcnIGludG8gYQorZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSwgcmV0dXJuaW5nIHRoZSByZXN1bHQuICBBZnRlciBiZWluZworc2hpZnRlZCBpbnRvIHRoZSBwcm9wZXIgcG9zaXRpb25zLCB0aGUgdGhyZWUgZmllbGRzIGFyZSBzaW1wbHkgYWRkZWQKK3RvZ2V0aGVyIHRvIGZvcm0gdGhlIHJlc3VsdC4gIFRoaXMgbWVhbnMgdGhhdCBhbnkgaW50ZWdlciBwb3J0aW9uIG9mIGB6U2lnJword2lsbCBiZSBhZGRlZCBpbnRvIHRoZSBleHBvbmVudC4gIFNpbmNlIGEgcHJvcGVybHkgbm9ybWFsaXplZCBzaWduaWZpY2FuZAord2lsbCBoYXZlIGFuIGludGVnZXIgcG9ydGlvbiBlcXVhbCB0byAxLCB0aGUgYHpFeHAnIGlucHV0IHNob3VsZCBiZSAxIGxlc3MKK3RoYW4gdGhlIGRlc2lyZWQgcmVzdWx0IGV4cG9uZW50IHdoZW5ldmVyIGB6U2lnJyBpcyBhIGNvbXBsZXRlLCBub3JtYWxpemVkCitzaWduaWZpY2FuZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgZmxvYXQ2NCBwYWNrRmxvYXQ2NCggZmxhZyB6U2lnbiwgaW50MTYgekV4cCwgYml0czY0IHpTaWcgKQoreworCisgICAgcmV0dXJuICggKCAoYml0czY0KSB6U2lnbiApPDw2MyApICsgKCAoIChiaXRzNjQpIHpFeHAgKTw8NTIgKSArIHpTaWc7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Rha2VzIGFuIGFic3RyYWN0IGZsb2F0aW5nLXBvaW50IHZhbHVlIGhhdmluZyBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywKK2FuZCBzaWduaWZpY2FuZCBgelNpZycsIGFuZCByZXR1cm5zIHRoZSBwcm9wZXIgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy0KK3BvaW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgT3JkaW5hcmlseSwgdGhlIGFic3RyYWN0Cit2YWx1ZSBpcyBzaW1wbHkgcm91bmRlZCBhbmQgcGFja2VkIGludG8gdGhlIGRvdWJsZS1wcmVjaXNpb24gZm9ybWF0LCB3aXRoCit0aGUgaW5leGFjdCBleGNlcHRpb24gcmFpc2VkIGlmIHRoZSBhYnN0cmFjdCBpbnB1dCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKK2V4YWN0bHkuICBJZiB0aGUgYWJzdHJhY3QgdmFsdWUgaXMgdG9vIGxhcmdlLCBob3dldmVyLCB0aGUgb3ZlcmZsb3cgYW5kCitpbmV4YWN0IGV4Y2VwdGlvbnMgYXJlIHJhaXNlZCBhbmQgYW4gaW5maW5pdHkgb3IgbWF4aW1hbCBmaW5pdGUgdmFsdWUgaXMKK3JldHVybmVkLiAgSWYgdGhlIGFic3RyYWN0IHZhbHVlIGlzIHRvbyBzbWFsbCwgdGhlIGlucHV0IHZhbHVlIGlzIHJvdW5kZWQgdG8KK2Egc3Vibm9ybWFsIG51bWJlciwgYW5kIHRoZSB1bmRlcmZsb3cgYW5kIGluZXhhY3QgZXhjZXB0aW9ucyBhcmUgcmFpc2VkIGlmCit0aGUgYWJzdHJhY3QgaW5wdXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBzdWJub3JtYWwgZG91YmxlLQorcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBUaGUgaW5wdXQgc2lnbmlmaWNhbmQgYHpTaWcnIGhhcyBpdHMgYmluYXJ5IHBvaW50IGJldHdlZW4gYml0cyA2MgorYW5kIDYxLCB3aGljaCBpcyAxMCBiaXRzIHRvIHRoZSBsZWZ0IG9mIHRoZSB1c3VhbCBsb2NhdGlvbi4gIFRoaXMgc2hpZnRlZAorc2lnbmlmaWNhbmQgbXVzdCBiZSBub3JtYWxpemVkIG9yIHNtYWxsZXIuICBJZiBgelNpZycgaXMgbm90IG5vcm1hbGl6ZWQsCitgekV4cCcgbXVzdCBiZSAwOyBpbiB0aGF0IGNhc2UsIHRoZSByZXN1bHQgcmV0dXJuZWQgaXMgYSBzdWJub3JtYWwgbnVtYmVyLAorYW5kIGl0IG11c3Qgbm90IHJlcXVpcmUgcm91bmRpbmcuICBJbiB0aGUgdXN1YWwgY2FzZSB0aGF0IGB6U2lnJyBpcworbm9ybWFsaXplZCwgYHpFeHAnIG11c3QgYmUgMSBsZXNzIHRoYW4gdGhlIGBgdHJ1ZScnIGZsb2F0aW5nLXBvaW50IGV4cG9uZW50LgorVGhlIGhhbmRsaW5nIG9mIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cgZm9sbG93cyB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yCitCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgZmxvYXQ2NCByb3VuZEFuZFBhY2tGbG9hdDY0KCBmbGFnIHpTaWduLCBpbnQxNiB6RXhwLCBiaXRzNjQgelNpZyApCit7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgZmxhZyByb3VuZE5lYXJlc3RFdmVuOworICAgIGludDE2IHJvdW5kSW5jcmVtZW50LCByb3VuZEJpdHM7CisgICAgZmxhZyBpc1Rpbnk7CisKKyAgICByb3VuZGluZ01vZGUgPSBmbG9hdF9yb3VuZGluZ19tb2RlOworICAgIHJvdW5kTmVhcmVzdEV2ZW4gPSAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4gKTsKKyAgICByb3VuZEluY3JlbWVudCA9IDB4MjAwOworICAgIGlmICggISByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAweDNGRjsKKyAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9kb3duICkgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJvdW5kQml0cyA9IHpTaWcgJiAweDNGRjsKKyAgICBpZiAoIDB4N0ZEIDw9IChiaXRzMTYpIHpFeHAgKSB7CisgICAgICAgIGlmICggICAgKCAweDdGRCA8IHpFeHAgKQorICAgICAgICAgICAgIHx8ICggICAgKCB6RXhwID09IDB4N0ZEICkKKyAgICAgICAgICAgICAgICAgICYmICggKHNiaXRzNjQpICggelNpZyArIHJvdW5kSW5jcmVtZW50ICkgPCAwICkgKQorICAgICAgICAgICApIHsKKyAgICAgICAgICAgIC8vcmVnaXN0ZXIgaW50IGxyID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworICAgICAgICAgICAgLy9wcmludGsoInJvdW5kQW5kUGFja0Zsb2F0NjQgY2FsbGVkIGZyb20gMHglMDh4XG4iLGxyKTsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX292ZXJmbG93IHwgZmxvYXRfZmxhZ19pbmV4YWN0ICk7CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAweDdGRiwgMCApIC0gKCByb3VuZEluY3JlbWVudCA9PSAwICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB6RXhwIDwgMCApIHsKKyAgICAgICAgICAgIGlzVGlueSA9CisgICAgICAgICAgICAgICAgICAgKCBmbG9hdF9kZXRlY3RfdGluaW5lc3MgPT0gZmxvYXRfdGluaW5lc3NfYmVmb3JlX3JvdW5kaW5nICkKKyAgICAgICAgICAgICAgICB8fCAoIHpFeHAgPCAtMSApCisgICAgICAgICAgICAgICAgfHwgKCB6U2lnICsgcm91bmRJbmNyZW1lbnQgPCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICAgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoIHpTaWcsIC0gekV4cCwgJnpTaWcgKTsKKyAgICAgICAgICAgIHpFeHAgPSAwOworICAgICAgICAgICAgcm91bmRCaXRzID0gelNpZyAmIDB4M0ZGOworICAgICAgICAgICAgaWYgKCBpc1RpbnkgJiYgcm91bmRCaXRzICkgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfdW5kZXJmbG93ICk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCByb3VuZEJpdHMgKSBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHpTaWcgPSAoIHpTaWcgKyByb3VuZEluY3JlbWVudCApPj4xMDsKKyAgICB6U2lnICY9IH4gKCAoICggcm91bmRCaXRzIF4gMHgyMDAgKSA9PSAwICkgJiByb3VuZE5lYXJlc3RFdmVuICk7CisgICAgaWYgKCB6U2lnID09IDAgKSB6RXhwID0gMDsKKyAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCB6RXhwLCB6U2lnICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Rha2VzIGFuIGFic3RyYWN0IGZsb2F0aW5nLXBvaW50IHZhbHVlIGhhdmluZyBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywKK2FuZCBzaWduaWZpY2FuZCBgelNpZycsIGFuZCByZXR1cm5zIHRoZSBwcm9wZXIgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy0KK3BvaW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgVGhpcyByb3V0aW5lIGlzIGp1c3QgbGlrZQorYHJvdW5kQW5kUGFja0Zsb2F0NjQnIGV4Y2VwdCB0aGF0IGB6U2lnJyBkb2VzIG5vdCBoYXZlIHRvIGJlIG5vcm1hbGl6ZWQgaW4KK2FueSB3YXkuICBJbiBhbGwgY2FzZXMsIGB6RXhwJyBtdXN0IGJlIDEgbGVzcyB0aGFuIHRoZSBgYHRydWUnJyBmbG9hdGluZy0KK3BvaW50IGV4cG9uZW50LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBmbG9hdDY0Cisgbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQ2NCggZmxhZyB6U2lnbiwgaW50MTYgekV4cCwgYml0czY0IHpTaWcgKQoreworICAgIGludDggc2hpZnRDb3VudDsKKworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCB6U2lnICkgLSAxOworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDY0KCB6U2lnbiwgekV4cCAtIHNoaWZ0Q291bnQsIHpTaWc8PHNoaWZ0Q291bnQgKTsKKworfQorCisjaWZkZWYgRkxPQVRYODAKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3ZhbHVlIGBhJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgYml0czY0IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGZsb2F0eDgwIGEgKQoreworCisgICAgcmV0dXJuIGEubG93OworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSBleHBvbmVudCBiaXRzIG9mIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50Cit2YWx1ZSBgYScuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworSU5MSU5FIGludDMyIGV4dHJhY3RGbG9hdHg4MEV4cCggZmxvYXR4ODAgYSApCit7CisKKyAgICByZXR1cm4gYS5oaWdoICYgMHg3RkZGOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSBzaWduIGJpdCBvZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorYGEnLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK0lOTElORSBmbGFnIGV4dHJhY3RGbG9hdHg4MFNpZ24oIGZsb2F0eDgwIGEgKQoreworCisgICAgcmV0dXJuIGEuaGlnaD4+MTU7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05vcm1hbGl6ZXMgdGhlIHN1Ym5vcm1hbCBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCityZXByZXNlbnRlZCBieSB0aGUgZGVub3JtYWxpemVkIHNpZ25pZmljYW5kIGBhU2lnJy4gIFRoZSBub3JtYWxpemVkIGV4cG9uZW50CithbmQgc2lnbmlmaWNhbmQgYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHpFeHBQdHInIGFuZAorYHpTaWdQdHInLCByZXNwZWN0aXZlbHkuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHZvaWQKKyBub3JtYWxpemVGbG9hdHg4MFN1Ym5vcm1hbCggYml0czY0IGFTaWcsIGludDMyICp6RXhwUHRyLCBiaXRzNjQgKnpTaWdQdHIgKQoreworICAgIGludDggc2hpZnRDb3VudDsKKworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCBhU2lnICk7CisgICAgKnpTaWdQdHIgPSBhU2lnPDxzaGlmdENvdW50OworICAgICp6RXhwUHRyID0gMSAtIHNoaWZ0Q291bnQ7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BhY2tzIHRoZSBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywgYW5kIHNpZ25pZmljYW5kIGB6U2lnJyBpbnRvIGFuCitleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlLCByZXR1cm5pbmcgdGhlIHJlc3VsdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitJTkxJTkUgZmxvYXR4ODAgcGFja0Zsb2F0eDgwKCBmbGFnIHpTaWduLCBpbnQzMiB6RXhwLCBiaXRzNjQgelNpZyApCit7CisgICAgZmxvYXR4ODAgejsKKworICAgIHoubG93ID0gelNpZzsKKyAgICB6LmhpZ2ggPSAoICggKGJpdHMxNikgelNpZ24gKTw8MTUgKSArIHpFeHA7CisgICAgcmV0dXJuIHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Rha2VzIGFuIGFic3RyYWN0IGZsb2F0aW5nLXBvaW50IHZhbHVlIGhhdmluZyBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywKK2FuZCBleHRlbmRlZCBzaWduaWZpY2FuZCBmb3JtZWQgYnkgdGhlIGNvbmNhdGVuYXRpb24gb2YgYHpTaWcwJyBhbmQgYHpTaWcxJywKK2FuZCByZXR1cm5zIHRoZSBwcm9wZXIgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorY29ycmVzcG9uZGluZyB0byB0aGUgYWJzdHJhY3QgaW5wdXQuICBPcmRpbmFyaWx5LCB0aGUgYWJzdHJhY3QgdmFsdWUgaXMKK3JvdW5kZWQgYW5kIHBhY2tlZCBpbnRvIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZvcm1hdCwgd2l0aCB0aGUKK2luZXhhY3QgZXhjZXB0aW9uIHJhaXNlZCBpZiB0aGUgYWJzdHJhY3QgaW5wdXQgY2Fubm90IGJlIHJlcHJlc2VudGVkCitleGFjdGx5LiAgSWYgdGhlIGFic3RyYWN0IHZhbHVlIGlzIHRvbyBsYXJnZSwgaG93ZXZlciwgdGhlIG92ZXJmbG93IGFuZAoraW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQgYW5kIGFuIGluZmluaXR5IG9yIG1heGltYWwgZmluaXRlIHZhbHVlIGlzCityZXR1cm5lZC4gIElmIHRoZSBhYnN0cmFjdCB2YWx1ZSBpcyB0b28gc21hbGwsIHRoZSBpbnB1dCB2YWx1ZSBpcyByb3VuZGVkIHRvCithIHN1Ym5vcm1hbCBudW1iZXIsIGFuZCB0aGUgdW5kZXJmbG93IGFuZCBpbmV4YWN0IGV4Y2VwdGlvbnMgYXJlIHJhaXNlZCBpZgordGhlIGFic3RyYWN0IGlucHV0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgc3Vibm9ybWFsIGV4dGVuZGVkCitkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBJZiBgcm91bmRpbmdQcmVjaXNpb24nIGlzIDMyIG9yIDY0LCB0aGUgcmVzdWx0IGlzIHJvdW5kZWQgdG8gdGhlIHNhbWUKK251bWJlciBvZiBiaXRzIGFzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uLCByZXNwZWN0aXZlbHkuICBPdGhlcndpc2UsIHRoZQorcmVzdWx0IGlzIHJvdW5kZWQgdG8gdGhlIGZ1bGwgcHJlY2lzaW9uIG9mIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uCitmb3JtYXQuCisgICAgVGhlIGlucHV0IHNpZ25pZmljYW5kIG11c3QgYmUgbm9ybWFsaXplZCBvciBzbWFsbGVyLiAgSWYgdGhlIGlucHV0CitzaWduaWZpY2FuZCBpcyBub3Qgbm9ybWFsaXplZCwgYHpFeHAnIG11c3QgYmUgMDsgaW4gdGhhdCBjYXNlLCB0aGUgcmVzdWx0CityZXR1cm5lZCBpcyBhIHN1Ym5vcm1hbCBudW1iZXIsIGFuZCBpdCBtdXN0IG5vdCByZXF1aXJlIHJvdW5kaW5nLiAgVGhlCitoYW5kbGluZyBvZiB1bmRlcmZsb3cgYW5kIG92ZXJmbG93IGZvbGxvd3MgdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK0Zsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGZsb2F0eDgwCisgcm91bmRBbmRQYWNrRmxvYXR4ODAoCisgICAgIGludDggcm91bmRpbmdQcmVjaXNpb24sIGZsYWcgelNpZ24sIGludDMyIHpFeHAsIGJpdHM2NCB6U2lnMCwgYml0czY0IHpTaWcxCisgKQoreworICAgIGludDggcm91bmRpbmdNb2RlOworICAgIGZsYWcgcm91bmROZWFyZXN0RXZlbiwgaW5jcmVtZW50LCBpc1Rpbnk7CisgICAgaW50NjQgcm91bmRJbmNyZW1lbnQsIHJvdW5kTWFzaywgcm91bmRCaXRzOworCisgICAgcm91bmRpbmdNb2RlID0gZmxvYXRfcm91bmRpbmdfbW9kZTsKKyAgICByb3VuZE5lYXJlc3RFdmVuID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICk7CisgICAgaWYgKCByb3VuZGluZ1ByZWNpc2lvbiA9PSA4MCApIGdvdG8gcHJlY2lzaW9uODA7CisgICAgaWYgKCByb3VuZGluZ1ByZWNpc2lvbiA9PSA2NCApIHsKKyAgICAgICAgcm91bmRJbmNyZW1lbnQgPSBMSVQ2NCggMHgwMDAwMDAwMDAwMDAwNDAwICk7CisgICAgICAgIHJvdW5kTWFzayA9IExJVDY0KCAweDAwMDAwMDAwMDAwMDA3RkYgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHJvdW5kaW5nUHJlY2lzaW9uID09IDMyICkgeworICAgICAgICByb3VuZEluY3JlbWVudCA9IExJVDY0KCAweDAwMDAwMDgwMDAwMDAwMDAgKTsKKyAgICAgICAgcm91bmRNYXNrID0gTElUNjQoIDB4MDAwMDAwRkZGRkZGRkZGRiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ290byBwcmVjaXNpb244MDsKKyAgICB9CisgICAgelNpZzAgfD0gKCB6U2lnMSAhPSAwICk7CisgICAgaWYgKCAhIHJvdW5kTmVhcmVzdEV2ZW4gKSB7CisgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3RvX3plcm8gKSB7CisgICAgICAgICAgICByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByb3VuZEluY3JlbWVudCA9IHJvdW5kTWFzazsKKyAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9kb3duICkgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJvdW5kQml0cyA9IHpTaWcwICYgcm91bmRNYXNrOworICAgIGlmICggMHg3RkZEIDw9IChiaXRzMzIpICggekV4cCAtIDEgKSApIHsKKyAgICAgICAgaWYgKCAgICAoIDB4N0ZGRSA8IHpFeHAgKQorICAgICAgICAgICAgIHx8ICggKCB6RXhwID09IDB4N0ZGRSApICYmICggelNpZzAgKyByb3VuZEluY3JlbWVudCA8IHpTaWcwICkgKQorICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB6RXhwIDw9IDAgKSB7CisgICAgICAgICAgICBpc1RpbnkgPQorICAgICAgICAgICAgICAgICAgICggZmxvYXRfZGV0ZWN0X3RpbmluZXNzID09IGZsb2F0X3RpbmluZXNzX2JlZm9yZV9yb3VuZGluZyApCisgICAgICAgICAgICAgICAgfHwgKCB6RXhwIDwgMCApCisgICAgICAgICAgICAgICAgfHwgKCB6U2lnMCA8PSB6U2lnMCArIHJvdW5kSW5jcmVtZW50ICk7CisgICAgICAgICAgICBzaGlmdDY0UmlnaHRKYW1taW5nKCB6U2lnMCwgMSAtIHpFeHAsICZ6U2lnMCApOworICAgICAgICAgICAgekV4cCA9IDA7CisgICAgICAgICAgICByb3VuZEJpdHMgPSB6U2lnMCAmIHJvdW5kTWFzazsKKyAgICAgICAgICAgIGlmICggaXNUaW55ICYmIHJvdW5kQml0cyApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX3VuZGVyZmxvdyApOworICAgICAgICAgICAgaWYgKCByb3VuZEJpdHMgKSBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgICAgICAgICAgelNpZzAgKz0gcm91bmRJbmNyZW1lbnQ7CisgICAgICAgICAgICBpZiAoIChzYml0czY0KSB6U2lnMCA8IDAgKSB6RXhwID0gMTsKKyAgICAgICAgICAgIHJvdW5kSW5jcmVtZW50ID0gcm91bmRNYXNrICsgMTsKKyAgICAgICAgICAgIGlmICggcm91bmROZWFyZXN0RXZlbiAmJiAoIHJvdW5kQml0czw8MSA9PSByb3VuZEluY3JlbWVudCApICkgeworICAgICAgICAgICAgICAgIHJvdW5kTWFzayB8PSByb3VuZEluY3JlbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpTaWcwICY9IH4gcm91bmRNYXNrOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIHpFeHAsIHpTaWcwICk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCByb3VuZEJpdHMgKSBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHpTaWcwICs9IHJvdW5kSW5jcmVtZW50OworICAgIGlmICggelNpZzAgPCByb3VuZEluY3JlbWVudCApIHsKKyAgICAgICAgKyt6RXhwOworICAgICAgICB6U2lnMCA9IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB9CisgICAgcm91bmRJbmNyZW1lbnQgPSByb3VuZE1hc2sgKyAxOworICAgIGlmICggcm91bmROZWFyZXN0RXZlbiAmJiAoIHJvdW5kQml0czw8MSA9PSByb3VuZEluY3JlbWVudCApICkgeworICAgICAgICByb3VuZE1hc2sgfD0gcm91bmRJbmNyZW1lbnQ7CisgICAgfQorICAgIHpTaWcwICY9IH4gcm91bmRNYXNrOworICAgIGlmICggelNpZzAgPT0gMCApIHpFeHAgPSAwOworICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCB6RXhwLCB6U2lnMCApOworIHByZWNpc2lvbjgwOgorICAgIGluY3JlbWVudCA9ICggKHNiaXRzNjQpIHpTaWcxIDwgMCApOworICAgIGlmICggISByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICAgICAgaW5jcmVtZW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfZG93biApICYmIHpTaWcxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSAmJiB6U2lnMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIDB4N0ZGRCA8PSAoYml0czMyKSAoIHpFeHAgLSAxICkgKSB7CisgICAgICAgIGlmICggICAgKCAweDdGRkUgPCB6RXhwICkKKyAgICAgICAgICAgICB8fCAoICAgICggekV4cCA9PSAweDdGRkUgKQorICAgICAgICAgICAgICAgICAgJiYgKCB6U2lnMCA9PSBMSVQ2NCggMHhGRkZGRkZGRkZGRkZGRkZGICkgKQorICAgICAgICAgICAgICAgICAgJiYgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICApIHsKKyAgICAgICAgICAgIHJvdW5kTWFzayA9IDA7Cisgb3ZlcmZsb3c6CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19vdmVyZmxvdyB8IGZsb2F0X2ZsYWdfaW5leGFjdCApOworICAgICAgICAgICAgaWYgKCAgICAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkKKyAgICAgICAgICAgICAgICAgfHwgKCB6U2lnbiAmJiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF91cCApICkKKyAgICAgICAgICAgICAgICAgfHwgKCAhIHpTaWduICYmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX2Rvd24gKSApCisgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMHg3RkZFLCB+IHJvdW5kTWFzayApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB6RXhwIDw9IDAgKSB7CisgICAgICAgICAgICBpc1RpbnkgPQorICAgICAgICAgICAgICAgICAgICggZmxvYXRfZGV0ZWN0X3RpbmluZXNzID09IGZsb2F0X3RpbmluZXNzX2JlZm9yZV9yb3VuZGluZyApCisgICAgICAgICAgICAgICAgfHwgKCB6RXhwIDwgMCApCisgICAgICAgICAgICAgICAgfHwgISBpbmNyZW1lbnQKKyAgICAgICAgICAgICAgICB8fCAoIHpTaWcwIDwgTElUNjQoIDB4RkZGRkZGRkZGRkZGRkZGRiApICk7CisgICAgICAgICAgICBzaGlmdDY0RXh0cmFSaWdodEphbW1pbmcoIHpTaWcwLCB6U2lnMSwgMSAtIHpFeHAsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgICAgICAgICB6RXhwID0gMDsKKyAgICAgICAgICAgIGlmICggaXNUaW55ICYmIHpTaWcxICkgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfdW5kZXJmbG93ICk7CisgICAgICAgICAgICBpZiAoIHpTaWcxICkgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgICAgIGlmICggcm91bmROZWFyZXN0RXZlbiApIHsKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAoIChzYml0czY0KSB6U2lnMSA8IDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCA9ICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX2Rvd24gKSAmJiB6U2lnMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCA9ICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgJiYgelNpZzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpbmNyZW1lbnQgKSB7CisgICAgICAgICAgICAgICAgKyt6U2lnMDsKKyAgICAgICAgICAgICAgICB6U2lnMCAmPSB+ICggKCB6U2lnMSArIHpTaWcxID09IDAgKSAmIHJvdW5kTmVhcmVzdEV2ZW4gKTsKKyAgICAgICAgICAgICAgICBpZiAoIChzYml0czY0KSB6U2lnMCA8IDAgKSB6RXhwID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCB6RXhwLCB6U2lnMCApOworICAgICAgICB9CisgICAgfQorICAgIGlmICggelNpZzEgKSBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIGlmICggaW5jcmVtZW50ICkgeworICAgICAgICArK3pTaWcwOworICAgICAgICBpZiAoIHpTaWcwID09IDAgKSB7CisgICAgICAgICAgICArK3pFeHA7CisgICAgICAgICAgICB6U2lnMCA9IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHpTaWcwICY9IH4gKCAoIHpTaWcxICsgelNpZzEgPT0gMCApICYgcm91bmROZWFyZXN0RXZlbiApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIHpTaWcwID09IDAgKSB6RXhwID0gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIHpFeHAsIHpTaWcwICk7Cit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUYWtlcyBhbiBhYnN0cmFjdCBmbG9hdGluZy1wb2ludCB2YWx1ZSBoYXZpbmcgc2lnbiBgelNpZ24nLCBleHBvbmVudAorYHpFeHAnLCBhbmQgc2lnbmlmaWNhbmQgZm9ybWVkIGJ5IHRoZSBjb25jYXRlbmF0aW9uIG9mIGB6U2lnMCcgYW5kIGB6U2lnMScsCithbmQgcmV0dXJucyB0aGUgcHJvcGVyIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK2NvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgVGhpcyByb3V0aW5lIGlzIGp1c3QgbGlrZQorYHJvdW5kQW5kUGFja0Zsb2F0eDgwJyBleGNlcHQgdGhhdCB0aGUgaW5wdXQgc2lnbmlmaWNhbmQgZG9lcyBub3QgaGF2ZSB0byBiZQorbm9ybWFsaXplZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgZmxvYXR4ODAKKyBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdHg4MCgKKyAgICAgaW50OCByb3VuZGluZ1ByZWNpc2lvbiwgZmxhZyB6U2lnbiwgaW50MzIgekV4cCwgYml0czY0IHpTaWcwLCBiaXRzNjQgelNpZzEKKyApCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgaWYgKCB6U2lnMCA9PSAwICkgeworICAgICAgICB6U2lnMCA9IHpTaWcxOworICAgICAgICB6U2lnMSA9IDA7CisgICAgICAgIHpFeHAgLT0gNjQ7CisgICAgfQorICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCB6U2lnMCApOworICAgIHNob3J0U2hpZnQxMjhMZWZ0KCB6U2lnMCwgelNpZzEsIHNoaWZ0Q291bnQsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgekV4cCAtPSBzaGlmdENvdW50OworICAgIHJldHVybgorICAgICAgICByb3VuZEFuZFBhY2tGbG9hdHg4MCggcm91bmRpbmdQcmVjaXNpb24sIHpTaWduLCB6RXhwLCB6U2lnMCwgelNpZzEgKTsKKworfQorCisjZW5kaWYKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGBhJyB0bwordGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkCithY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDMyIGludDMyX3RvX2Zsb2F0MzIoIGludDMyIGEgKQoreworICAgIGZsYWcgelNpZ247CisKKyAgICBpZiAoIGEgPT0gMCApIHJldHVybiAwOworICAgIGlmICggYSA9PSAweDgwMDAwMDAwICkgcmV0dXJuIHBhY2tGbG9hdDMyKCAxLCAweDlFLCAwICk7CisgICAgelNpZ24gPSAoIGEgPCAwICk7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MzIoIHpTaWduLCAweDlDLCB6U2lnbiA/IC0gYSA6IGEgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIDMyLWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgYGEnIHRvCit0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQKK2FjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0NjQgaW50MzJfdG9fZmxvYXQ2NCggaW50MzIgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICB1aW50MzIgYWJzQTsKKyAgICBpbnQ4IHNoaWZ0Q291bnQ7CisgICAgYml0czY0IHpTaWc7CisKKyAgICBpZiAoIGEgPT0gMCApIHJldHVybiAwOworICAgIGFTaWduID0gKCBhIDwgMCApOworICAgIGFic0EgPSBhU2lnbiA/IC0gYSA6IGE7CisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zMzIoIGFic0EgKSArIDIxOworICAgIHpTaWcgPSBhYnNBOworICAgIHJldHVybiBwYWNrRmxvYXQ2NCggYVNpZ24sIDB4NDMyIC0gc2hpZnRDb3VudCwgelNpZzw8c2hpZnRDb3VudCApOworCit9CisKKyNpZmRlZiBGTE9BVFg4MAorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIDMyLWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgYGEnCit0byB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbgoraXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdHg4MCBpbnQzMl90b19mbG9hdHg4MCggaW50MzIgYSApCit7CisgICAgZmxhZyB6U2lnbjsKKyAgICB1aW50MzIgYWJzQTsKKyAgICBpbnQ4IHNoaWZ0Q291bnQ7CisgICAgYml0czY0IHpTaWc7CisKKyAgICBpZiAoIGEgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIDAsIDAsIDAgKTsKKyAgICB6U2lnbiA9ICggYSA8IDAgKTsKKyAgICBhYnNBID0gelNpZ24gPyAtIGEgOiBhOworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczMyKCBhYnNBICkgKyAzMjsKKyAgICB6U2lnID0gYWJzQTsKKyAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMHg0MDNFIC0gc2hpZnRDb3VudCwgelNpZzw8c2hpZnRDb3VudCApOworCit9CisKKyNlbmRpZgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK2BhJyB0byB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYy0tLXdoaWNoIG1lYW5zIGluIHBhcnRpY3VsYXIgdGhhdCB0aGUgY29udmVyc2lvbiBpcyByb3VuZGVkCithY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gIElmIGBhJyBpcyBhIE5hTiwgdGhlIGxhcmdlc3QKK3Bvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGlmIHRoZSBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlCitsYXJnZXN0IGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGBhJyBpcyByZXR1cm5lZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQzMiBmbG9hdDMyX3RvX2ludDMyKCBmbG9hdDMyIGEgKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MTYgYUV4cCwgc2hpZnRDb3VudDsKKyAgICBiaXRzMzIgYVNpZzsKKyAgICBiaXRzNjQgelNpZzsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGlmICggKCBhRXhwID09IDB4N0ZGICkgJiYgYVNpZyApIGFTaWduID0gMDsKKyAgICBpZiAoIGFFeHAgKSBhU2lnIHw9IDB4MDA4MDAwMDA7CisgICAgc2hpZnRDb3VudCA9IDB4QUYgLSBhRXhwOworICAgIHpTaWcgPSBhU2lnOworICAgIHpTaWcgPDw9IDMyOworICAgIGlmICggMCA8IHNoaWZ0Q291bnQgKSBzaGlmdDY0UmlnaHRKYW1taW5nKCB6U2lnLCBzaGlmdENvdW50LCAmelNpZyApOworICAgIHJldHVybiByb3VuZEFuZFBhY2tJbnQzMiggYVNpZ24sIHpTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK2BhJyB0byB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYywgZXhjZXB0IHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgYWx3YXlzIHJvdW5kZWQgdG93YXJkIHplcm8uICBJZgorYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUKK2NvbnZlcnNpb24gb3ZlcmZsb3dzLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMKK3JldHVybmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ludDMyIGZsb2F0MzJfdG9faW50MzJfcm91bmRfdG9femVybyggZmxvYXQzMiBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDE2IGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgYml0czMyIGFTaWc7CisgICAgaW50MzIgejsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIHNoaWZ0Q291bnQgPSBhRXhwIC0gMHg5RTsKKyAgICBpZiAoIDAgPD0gc2hpZnRDb3VudCApIHsKKyAgICAgICAgaWYgKCBhID09IDB4Q0YwMDAwMDAgKSByZXR1cm4gMHg4MDAwMDAwMDsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICBpZiAoICEgYVNpZ24gfHwgKCAoIGFFeHAgPT0gMHhGRiApICYmIGFTaWcgKSApIHJldHVybiAweDdGRkZGRkZGOworICAgICAgICByZXR1cm4gMHg4MDAwMDAwMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFFeHAgPD0gMHg3RSApIHsKKyAgICAgICAgaWYgKCBhRXhwIHwgYVNpZyApIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnID0gKCBhU2lnIHwgMHgwMDgwMDAwMCApPDw4OworICAgIHogPSBhU2lnPj4oIC0gc2hpZnRDb3VudCApOworICAgIGlmICggKGJpdHMzMikgKCBhU2lnPDwoIHNoaWZ0Q291bnQgJiAzMSApICkgKSB7CisgICAgICAgIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgfQorICAgIHJldHVybiBhU2lnbiA/IC0geiA6IHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCitgYScgdG8gdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMKK3BlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQKK0FyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXQ2NCBmbG9hdDMyX3RvX2Zsb2F0NjQoIGZsb2F0MzIgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQxNiBhRXhwOworICAgIGJpdHMzMiBhU2lnOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBjb21tb25OYU5Ub0Zsb2F0NjQoIGZsb2F0MzJUb0NvbW1vbk5hTiggYSApICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggYVNpZ24sIDB4N0ZGLCAwICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQ2NCggYVNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgICAgIC0tYUV4cDsKKyAgICB9CisgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCBhU2lnbiwgYUV4cCArIDB4MzgwLCAoIChiaXRzNjQpIGFTaWcgKTw8MjkgKTsKKworfQorCisjaWZkZWYgRkxPQVRYODAKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCitgYScgdG8gdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24KK2lzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQKK0FyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXR4ODAgZmxvYXQzMl90b19mbG9hdHg4MCggZmxvYXQzMiBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDE2IGFFeHA7CisgICAgYml0czMyIGFTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXR4ODAoIGZsb2F0MzJUb0NvbW1vbk5hTiggYSApICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIGFTaWduLCAweDdGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0eDgwKCBhU2lnbiwgMCwgMCApOworICAgICAgICBub3JtYWxpemVGbG9hdDMyU3Vibm9ybWFsKCBhU2lnLCAmYUV4cCwgJmFTaWcgKTsKKyAgICB9CisgICAgYVNpZyB8PSAweDAwODAwMDAwOworICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIGFTaWduLCBhRXhwICsgMHgzRjgwLCAoIChiaXRzNjQpIGFTaWcgKTw8NDAgKTsKKworfQorCisjZW5kaWYKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JvdW5kcyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgdG8gYW4gaW50ZWdlciwgYW5kCityZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlLiAgVGhlCitvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDMyIGZsb2F0MzJfcm91bmRfdG9faW50KCBmbG9hdDMyIGEgKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MTYgYUV4cDsKKyAgICBiaXRzMzIgbGFzdEJpdE1hc2ssIHJvdW5kQml0c01hc2s7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgZmxvYXQzMiB6OworCisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBhICk7CisgICAgaWYgKCAweDk2IDw9IGFFeHAgKSB7CisgICAgICAgIGlmICggKCBhRXhwID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBhICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIGlmICggYUV4cCA8PSAweDdFICkgeworICAgICAgICBpZiAoIChiaXRzMzIpICggYTw8MSApID09IDAgKSByZXR1cm4gYTsKKyAgICAgICAgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICAgICAgc3dpdGNoICggZmxvYXRfcm91bmRpbmdfbW9kZSApIHsKKyAgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuOgorICAgICAgICAgICAgaWYgKCAoIGFFeHAgPT0gMHg3RSApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYSApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggYVNpZ24sIDB4N0YsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOgorICAgICAgICAgICAgcmV0dXJuIGFTaWduID8gMHhCRjgwMDAwMCA6IDA7CisgICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX3VwOgorICAgICAgICAgICAgcmV0dXJuIGFTaWduID8gMHg4MDAwMDAwMCA6IDB4M0Y4MDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCBhU2lnbiwgMCwgMCApOworICAgIH0KKyAgICBsYXN0Qml0TWFzayA9IDE7CisgICAgbGFzdEJpdE1hc2sgPDw9IDB4OTYgLSBhRXhwOworICAgIHJvdW5kQml0c01hc2sgPSBsYXN0Qml0TWFzayAtIDE7CisgICAgeiA9IGE7CisgICAgcm91bmRpbmdNb2RlID0gZmxvYXRfcm91bmRpbmdfbW9kZTsKKyAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4gKSB7CisgICAgICAgIHogKz0gbGFzdEJpdE1hc2s+PjE7CisgICAgICAgIGlmICggKCB6ICYgcm91bmRCaXRzTWFzayApID09IDAgKSB6ICY9IH4gbGFzdEJpdE1hc2s7CisgICAgfQorICAgIGVsc2UgaWYgKCByb3VuZGluZ01vZGUgIT0gZmxvYXRfcm91bmRfdG9femVybyApIHsKKyAgICAgICAgaWYgKCBleHRyYWN0RmxvYXQzMlNpZ24oIHogKSBeICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgKSB7CisgICAgICAgICAgICB6ICs9IHJvdW5kQml0c01hc2s7CisgICAgICAgIH0KKyAgICB9CisgICAgeiAmPSB+IHJvdW5kQml0c01hc2s7CisgICAgaWYgKCB6ICE9IGEgKSBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHJldHVybiB6OworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIHNpbmdsZS1wcmVjaXNpb24KK2Zsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIElmIGB6U2lnbicgaXMgdHJ1ZSwgdGhlIHN1bSBpcyBuZWdhdGVkCitiZWZvcmUgYmVpbmcgcmV0dXJuZWQuICBgelNpZ24nIGlzIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCBpcyBhIE5hTi4gIFRoZQorYWRkaXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgZmxvYXQzMiBhZGRGbG9hdDMyU2lncyggZmxvYXQzMiBhLCBmbG9hdDMyIGIsIGZsYWcgelNpZ24gKQoreworICAgIGludDE2IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgYml0czMyIGFTaWcsIGJTaWcsIHpTaWc7CisgICAgaW50MTYgZXhwRGlmZjsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGFTaWcgPDw9IDY7CisgICAgYlNpZyA8PD0gNjsKKyAgICBpZiAoIDAgPCBleHBEaWZmICkgeworICAgICAgICBpZiAoIGFFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgICAgIGlmICggYVNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiICk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgICAgIC0tZXhwRGlmZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJTaWcgfD0gMHgyMDAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBzaGlmdDMyUmlnaHRKYW1taW5nKCBiU2lnLCBleHBEaWZmLCAmYlNpZyApOworICAgICAgICB6RXhwID0gYUV4cDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGV4cERpZmYgPCAwICkgeworICAgICAgICBpZiAoIGJFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiICk7CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoIHpTaWduLCAweEZGLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgICAgICArK2V4cERpZmY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhU2lnIHw9IDB4MjAwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgc2hpZnQzMlJpZ2h0SmFtbWluZyggYVNpZywgLSBleHBEaWZmLCAmYVNpZyApOworICAgICAgICB6RXhwID0gYkV4cDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggYUV4cCA9PSAweEZGICkgeworICAgICAgICAgICAgaWYgKCBhU2lnIHwgYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiICk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGFFeHAgPT0gMCApIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDAsICggYVNpZyArIGJTaWcgKT4+NiApOworICAgICAgICB6U2lnID0gMHg0MDAwMDAwMCArIGFTaWcgKyBiU2lnOworICAgICAgICB6RXhwID0gYUV4cDsKKyAgICAgICAgZ290byByb3VuZEFuZFBhY2s7CisgICAgfQorICAgIGFTaWcgfD0gMHgyMDAwMDAwMDsKKyAgICB6U2lnID0gKCBhU2lnICsgYlNpZyApPDwxOworICAgIC0tekV4cDsKKyAgICBpZiAoIChzYml0czMyKSB6U2lnIDwgMCApIHsKKyAgICAgICAgelNpZyA9IGFTaWcgKyBiU2lnOworICAgICAgICArK3pFeHA7CisgICAgfQorIHJvdW5kQW5kUGFjazoKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQzMiggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIHNpbmdsZS0KK3ByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicuICBJZiBgelNpZ24nIGlzIHRydWUsIHRoZQorZGlmZmVyZW5jZSBpcyBuZWdhdGVkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUKK3Jlc3VsdCBpcyBhIE5hTi4gIFRoZSBzdWJ0cmFjdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBmbG9hdDMyIHN1YkZsb2F0MzJTaWdzKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiwgZmxhZyB6U2lnbiApCit7CisgICAgaW50MTYgYUV4cCwgYkV4cCwgekV4cDsKKyAgICBiaXRzMzIgYVNpZywgYlNpZywgelNpZzsKKyAgICBpbnQxNiBleHBEaWZmOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGIgKTsKKyAgICBleHBEaWZmID0gYUV4cCAtIGJFeHA7CisgICAgYVNpZyA8PD0gNzsKKyAgICBiU2lnIDw8PSA3OworICAgIGlmICggMCA8IGV4cERpZmYgKSBnb3RvIGFFeHBCaWdnZXI7CisgICAgaWYgKCBleHBEaWZmIDwgMCApIGdvdG8gYkV4cEJpZ2dlcjsKKyAgICBpZiAoIGFFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnIHwgYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiICk7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBhRXhwID0gMTsKKyAgICAgICAgYkV4cCA9IDE7CisgICAgfQorICAgIGlmICggYlNpZyA8IGFTaWcgKSBnb3RvIGFCaWdnZXI7CisgICAgaWYgKCBhU2lnIDwgYlNpZyApIGdvdG8gYkJpZ2dlcjsKKyAgICByZXR1cm4gcGFja0Zsb2F0MzIoIGZsb2F0X3JvdW5kaW5nX21vZGUgPT0gZmxvYXRfcm91bmRfZG93biwgMCwgMCApOworIGJFeHBCaWdnZXI6CisgICAgaWYgKCBiRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24gXiAxLCAweEZGLCAwICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICArK2V4cERpZmY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhU2lnIHw9IDB4NDAwMDAwMDA7CisgICAgfQorICAgIHNoaWZ0MzJSaWdodEphbW1pbmcoIGFTaWcsIC0gZXhwRGlmZiwgJmFTaWcgKTsKKyAgICBiU2lnIHw9IDB4NDAwMDAwMDA7CisgYkJpZ2dlcjoKKyAgICB6U2lnID0gYlNpZyAtIGFTaWc7CisgICAgekV4cCA9IGJFeHA7CisgICAgelNpZ24gXj0gMTsKKyAgICBnb3RvIG5vcm1hbGl6ZVJvdW5kQW5kUGFjazsKKyBhRXhwQmlnZ2VyOgorICAgIGlmICggYUV4cCA9PSAweEZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQzMk5hTiggYSwgYiApOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIC0tZXhwRGlmZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJTaWcgfD0gMHg0MDAwMDAwMDsKKyAgICB9CisgICAgc2hpZnQzMlJpZ2h0SmFtbWluZyggYlNpZywgZXhwRGlmZiwgJmJTaWcgKTsKKyAgICBhU2lnIHw9IDB4NDAwMDAwMDA7CisgYUJpZ2dlcjoKKyAgICB6U2lnID0gYVNpZyAtIGJTaWc7CisgICAgekV4cCA9IGFFeHA7Cisgbm9ybWFsaXplUm91bmRBbmRQYWNrOgorICAgIC0tekV4cDsKKyAgICByZXR1cm4gbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQzMiggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnCithbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IKK0JpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0MzIgZmxvYXQzMl9hZGQoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduID09IGJTaWduICkgeworICAgICAgICByZXR1cm4gYWRkRmxvYXQzMlNpZ3MoIGEsIGIsIGFTaWduICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gc3ViRmxvYXQzMlNpZ3MoIGEsIGIsIGFTaWduICk7CisgICAgfQorCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzCitgYScgYW5kIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQKK2ZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDMyIGZsb2F0MzJfc3ViKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiA9PSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuIHN1YkZsb2F0MzJTaWdzKCBhLCBiLCBhU2lnbiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGFkZEZsb2F0MzJTaWdzKCBhLCBiLCBhU2lnbiApOworICAgIH0KKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcworYGEnIGFuZCBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkCitmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXQzMiBmbG9hdDMyX211bCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduLCB6U2lnbjsKKyAgICBpbnQxNiBhRXhwLCBiRXhwLCB6RXhwOworICAgIGJpdHMzMiBhU2lnLCBiU2lnOworICAgIGJpdHM2NCB6U2lnNjQ7CisgICAgYml0czMyIHpTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBiICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGIgKTsKKyAgICB6U2lnbiA9IGFTaWduIF4gYlNpZ247CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyB8fCAoICggYkV4cCA9PSAweEZGICkgJiYgYlNpZyApICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggYkV4cCB8IGJTaWcgKSA9PSAwICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMHhGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgKTsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYVNpZyA9PSAwICkgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMCwgMCApOworICAgICAgICBub3JtYWxpemVGbG9hdDMyU3Vibm9ybWFsKCBhU2lnLCAmYUV4cCwgJmFTaWcgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYlNpZyA9PSAwICkgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMCwgMCApOworICAgICAgICBub3JtYWxpemVGbG9hdDMyU3Vibm9ybWFsKCBiU2lnLCAmYkV4cCwgJmJTaWcgKTsKKyAgICB9CisgICAgekV4cCA9IGFFeHAgKyBiRXhwIC0gMHg3RjsKKyAgICBhU2lnID0gKCBhU2lnIHwgMHgwMDgwMDAwMCApPDw3OworICAgIGJTaWcgPSAoIGJTaWcgfCAweDAwODAwMDAwICk8PDg7CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggKCAoYml0czY0KSBhU2lnICkgKiBiU2lnLCAzMiwgJnpTaWc2NCApOworICAgIHpTaWcgPSB6U2lnNjQ7CisgICAgaWYgKCAwIDw9IChzYml0czMyKSAoIHpTaWc8PDEgKSApIHsKKyAgICAgICAgelNpZyA8PD0gMTsKKyAgICAgICAgLS16RXhwOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQzMiggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJworYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZQorSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0MzIgZmxvYXQzMl9kaXYoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbiwgelNpZ247CisgICAgaW50MTYgYUV4cCwgYkV4cCwgekV4cDsKKyAgICBiaXRzMzIgYVNpZywgYlNpZywgelNpZzsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGIgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYiApOworICAgIHpTaWduID0gYVNpZ24gXiBiU2lnbjsKKyAgICBpZiAoIGFFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgKTsKKyAgICAgICAgaWYgKCBiRXhwID09IDB4RkYgKSB7CisgICAgICAgICAgICBpZiAoIGJTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQzMk5hTiggYSwgYiApOworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMHhGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMCwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBiU2lnID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICggYUV4cCB8IGFTaWcgKSA9PSAwICkgeworICAgICAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQzMl9kZWZhdWx0X25hbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2RpdmJ5emVybyApOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMHhGRiwgMCApOworICAgICAgICB9CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0MzIoIHpTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICB6RXhwID0gYUV4cCAtIGJFeHAgKyAweDdEOworICAgIGFTaWcgPSAoIGFTaWcgfCAweDAwODAwMDAwICk8PDc7CisgICAgYlNpZyA9ICggYlNpZyB8IDB4MDA4MDAwMDAgKTw8ODsKKyAgICBpZiAoIGJTaWcgPD0gKCBhU2lnICsgYVNpZyApICkgeworICAgICAgICBhU2lnID4+PSAxOworICAgICAgICArK3pFeHA7CisgICAgfQorICAgIHpTaWcgPSAoICggKGJpdHM2NCkgYVNpZyApPDwzMiApIC8gYlNpZzsKKyAgICBpZiAoICggelNpZyAmIDB4M0YgKSA9PSAwICkgeworICAgICAgICB6U2lnIHw9ICggKCAoYml0czY0KSBiU2lnICkgKiB6U2lnICE9ICggKGJpdHM2NCkgYVNpZyApPDwzMiApOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQzMiggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJword2l0aCByZXNwZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkCithY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDMyIGZsb2F0MzJfcmVtKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDE2IGFFeHAsIGJFeHAsIGV4cERpZmY7CisgICAgYml0czMyIGFTaWcsIGJTaWc7CisgICAgYml0czMyIHE7CisgICAgYml0czY0IGFTaWc2NCwgYlNpZzY0LCBxNjQ7CisgICAgYml0czMyIGFsdGVybmF0ZUFTaWc7CisgICAgc2JpdHMzMiBzaWdNZWFuOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYiApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBiICk7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyB8fCAoICggYkV4cCA9PSAweEZGICkgJiYgYlNpZyApICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgKTsKKyAgICAgICAgfQorICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gYTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGV4cERpZmYgPSBhRXhwIC0gYkV4cDsKKyAgICBhU2lnIHw9IDB4MDA4MDAwMDA7CisgICAgYlNpZyB8PSAweDAwODAwMDAwOworICAgIGlmICggZXhwRGlmZiA8IDMyICkgeworICAgICAgICBhU2lnIDw8PSA4OworICAgICAgICBiU2lnIDw8PSA4OworICAgICAgICBpZiAoIGV4cERpZmYgPCAwICkgeworICAgICAgICAgICAgaWYgKCBleHBEaWZmIDwgLTEgKSByZXR1cm4gYTsKKyAgICAgICAgICAgIGFTaWcgPj49IDE7CisgICAgICAgIH0KKyAgICAgICAgcSA9ICggYlNpZyA8PSBhU2lnICk7CisgICAgICAgIGlmICggcSApIGFTaWcgLT0gYlNpZzsKKyAgICAgICAgaWYgKCAwIDwgZXhwRGlmZiApIHsKKyAgICAgICAgICAgIHEgPSAoICggKGJpdHM2NCkgYVNpZyApPDwzMiApIC8gYlNpZzsKKyAgICAgICAgICAgIHEgPj49IDMyIC0gZXhwRGlmZjsKKyAgICAgICAgICAgIGJTaWcgPj49IDI7CisgICAgICAgICAgICBhU2lnID0gKCAoIGFTaWc+PjEgKTw8KCBleHBEaWZmIC0gMSApICkgLSBiU2lnICogcTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFTaWcgPj49IDI7CisgICAgICAgICAgICBiU2lnID4+PSAyOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIGJTaWcgPD0gYVNpZyApIGFTaWcgLT0gYlNpZzsKKyAgICAgICAgYVNpZzY0ID0gKCAoYml0czY0KSBhU2lnICk8PDQwOworICAgICAgICBiU2lnNjQgPSAoIChiaXRzNjQpIGJTaWcgKTw8NDA7CisgICAgICAgIGV4cERpZmYgLT0gNjQ7CisgICAgICAgIHdoaWxlICggMCA8IGV4cERpZmYgKSB7CisgICAgICAgICAgICBxNjQgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWc2NCwgMCwgYlNpZzY0ICk7CisgICAgICAgICAgICBxNjQgPSAoIDIgPCBxNjQgKSA/IHE2NCAtIDIgOiAwOworICAgICAgICAgICAgYVNpZzY0ID0gLSAoICggYlNpZyAqIHE2NCApPDwzOCApOworICAgICAgICAgICAgZXhwRGlmZiAtPSA2MjsKKyAgICAgICAgfQorICAgICAgICBleHBEaWZmICs9IDY0OworICAgICAgICBxNjQgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWc2NCwgMCwgYlNpZzY0ICk7CisgICAgICAgIHE2NCA9ICggMiA8IHE2NCApID8gcTY0IC0gMiA6IDA7CisgICAgICAgIHEgPSBxNjQ+PiggNjQgLSBleHBEaWZmICk7CisgICAgICAgIGJTaWcgPDw9IDY7CisgICAgICAgIGFTaWcgPSAoICggYVNpZzY0Pj4zMyApPDwoIGV4cERpZmYgLSAxICkgKSAtIGJTaWcgKiBxOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIGFsdGVybmF0ZUFTaWcgPSBhU2lnOworICAgICAgICArK3E7CisgICAgICAgIGFTaWcgLT0gYlNpZzsKKyAgICB9IHdoaWxlICggMCA8PSAoc2JpdHMzMikgYVNpZyApOworICAgIHNpZ01lYW4gPSBhU2lnICsgYWx0ZXJuYXRlQVNpZzsKKyAgICBpZiAoICggc2lnTWVhbiA8IDAgKSB8fCAoICggc2lnTWVhbiA9PSAwICkgJiYgKCBxICYgMSApICkgKSB7CisgICAgICAgIGFTaWcgPSBhbHRlcm5hdGVBU2lnOworICAgIH0KKyAgICB6U2lnbiA9ICggKHNiaXRzMzIpIGFTaWcgPCAwICk7CisgICAgaWYgKCB6U2lnbiApIGFTaWcgPSAtIGFTaWc7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MzIoIGFTaWduIF4gelNpZ24sIGJFeHAsIGFTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnLgorVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5CitGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0MzIgZmxvYXQzMl9zcXJ0KCBmbG9hdDMyIGEgKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MTYgYUV4cCwgekV4cDsKKyAgICBiaXRzMzIgYVNpZywgelNpZzsKKyAgICBiaXRzNjQgcmVtLCB0ZXJtOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCAwICk7CisgICAgICAgIGlmICggISBhU2lnbiApIHJldHVybiBhOworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGFTaWduICkgeworICAgICAgICBpZiAoICggYUV4cCB8IGFTaWcgKSA9PSAwICkgcmV0dXJuIGE7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiAwOworICAgICAgICBub3JtYWxpemVGbG9hdDMyU3Vibm9ybWFsKCBhU2lnLCAmYUV4cCwgJmFTaWcgKTsKKyAgICB9CisgICAgekV4cCA9ICggKCBhRXhwIC0gMHg3RiApPj4xICkgKyAweDdFOworICAgIGFTaWcgPSAoIGFTaWcgfCAweDAwODAwMDAwICk8PDg7CisgICAgelNpZyA9IGVzdGltYXRlU3FydDMyKCBhRXhwLCBhU2lnICkgKyAyOworICAgIGlmICggKCB6U2lnICYgMHg3RiApIDw9IDUgKSB7CisgICAgICAgIGlmICggelNpZyA8IDIgKSB7CisgICAgICAgICAgICB6U2lnID0gMHhGRkZGRkZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFTaWcgPj49IGFFeHAgJiAxOworICAgICAgICAgICAgdGVybSA9ICggKGJpdHM2NCkgelNpZyApICogelNpZzsKKyAgICAgICAgICAgIHJlbSA9ICggKCAoYml0czY0KSBhU2lnICk8PDMyICkgLSB0ZXJtOworICAgICAgICAgICAgd2hpbGUgKCAoc2JpdHM2NCkgcmVtIDwgMCApIHsKKyAgICAgICAgICAgICAgICAtLXpTaWc7CisgICAgICAgICAgICAgICAgcmVtICs9ICggKCAoYml0czY0KSB6U2lnICk8PDEgKSB8IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6U2lnIHw9ICggcmVtICE9IDAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaGlmdDMyUmlnaHRKYW1taW5nKCB6U2lnLCAxLCAmelNpZyApOworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDMyKCAwLCB6RXhwLCB6U2lnICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgZXF1YWwgdG8gdGhlCitjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkCithY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbGFnIGZsb2F0MzJfZXEoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBhICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYSApICkKKyAgICAgICAgIHx8ICggKCBleHRyYWN0RmxvYXQzMkV4cCggYiApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBhICkgfHwgZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAoIGEgPT0gYiApIHx8ICggKGJpdHMzMikgKCAoIGEgfCBiICk8PDEgKSA9PSAwICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcyB0aGFuIG9yCitlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBjb21wYXJpc29uIGlzCitwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50CitBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXQzMl9sZSggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGEgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBiICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gfHwgKCAoYml0czMyKSAoICggYSB8IGIgKTw8MSApID09IDAgKTsKKyAgICByZXR1cm4gKCBhID09IGIgKSB8fCAoIGFTaWduIF4gKCBhIDwgYiApICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcyB0aGFuCit0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZAorYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdDMyX2x0KCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQzMkV4cCggYSApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGIgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHJldHVybiBhU2lnbiAmJiAoIChiaXRzMzIpICggKCBhIHwgYiApPDwxICkgIT0gMCApOworICAgIHJldHVybiAoIGEgIT0gYiApICYmICggYVNpZ24gXiAoIGEgPCBiICkgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyAxIGlmIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBlcXVhbCB0byB0aGUKK2NvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBUaGUgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkCitpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIE5hTi4gIE90aGVyd2lzZSwgdGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkCithY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbGFnIGZsb2F0MzJfZXFfc2lnbmFsaW5nKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCit7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQzMkV4cCggYSApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGIgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gKCBhID09IGIgKSB8fCAoIChiaXRzMzIpICggKCBhIHwgYiApPDwxICkgPT0gMCApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGxlc3MgdGhhbiBvcgorZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdAorY2F1c2UgYW4gZXhjZXB0aW9uLiAgT3RoZXJ3aXNlLCB0aGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZQorSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXQzMl9sZV9xdWlldCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworICAgIC8vaW50MTYgYUV4cCwgYkV4cDsKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBhICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYSApICkKKyAgICAgICAgIHx8ICggKCBleHRyYWN0RmxvYXQzMkV4cCggYiApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBhICkgfHwgZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgcmV0dXJuIGFTaWduIHx8ICggKGJpdHMzMikgKCAoIGEgfCBiICk8PDEgKSA9PSAwICk7CisgICAgcmV0dXJuICggYSA9PSBiICkgfHwgKCBhU2lnbiBeICggYSA8IGIgKSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGxlc3MgdGhhbgordGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdCBjYXVzZSBhbgorZXhjZXB0aW9uLiAgT3RoZXJ3aXNlLCB0aGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXQzMl9sdF9xdWlldCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGEgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBiICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGEgKSB8fCBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGIgKSApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gJiYgKCAoYml0czMyKSAoICggYSB8IGIgKTw8MSApICE9IDAgKTsKKyAgICByZXR1cm4gKCBhICE9IGIgKSAmJiAoIGFTaWduIF4gKCBhIDwgYiApICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCitgYScgdG8gdGhlIDMyLWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMKK3BlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQKK0FyaXRobWV0aWMtLS13aGljaCBtZWFucyBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgcm91bmRlZAorYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUuICBJZiBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0Citwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUgY29udmVyc2lvbiBvdmVyZmxvd3MsIHRoZQorbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMgcmV0dXJuZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50MzIgZmxvYXQ2NF90b19pbnQzMiggZmxvYXQ2NCBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDE2IGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgYml0czY0IGFTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBpZiAoICggYUV4cCA9PSAweDdGRiApICYmIGFTaWcgKSBhU2lnbiA9IDA7CisgICAgaWYgKCBhRXhwICkgYVNpZyB8PSBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICk7CisgICAgc2hpZnRDb3VudCA9IDB4NDJDIC0gYUV4cDsKKyAgICBpZiAoIDAgPCBzaGlmdENvdW50ICkgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgc2hpZnRDb3VudCwgJmFTaWcgKTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrSW50MzIoIGFTaWduLCBhU2lnICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCitgYScgdG8gdGhlIDMyLWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMKK3BlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQKK0FyaXRobWV0aWMsIGV4Y2VwdCB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIGFsd2F5cyByb3VuZGVkIHRvd2FyZCB6ZXJvLiAgSWYKK2BhJyBpcyBhIE5hTiwgdGhlIGxhcmdlc3QgcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgaWYgdGhlCitjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlIGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lIHNpZ24gYXMgYGEnIGlzCityZXR1cm5lZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQzMiBmbG9hdDY0X3RvX2ludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0NjQgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQxNiBhRXhwLCBzaGlmdENvdW50OworICAgIGJpdHM2NCBhU2lnLCBzYXZlZEFTaWc7CisgICAgaW50MzIgejsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIHNoaWZ0Q291bnQgPSAweDQzMyAtIGFFeHA7CisgICAgaWYgKCBzaGlmdENvdW50IDwgMjEgKSB7CisgICAgICAgIGlmICggKCBhRXhwID09IDB4N0ZGICkgJiYgYVNpZyApIGFTaWduID0gMDsKKyAgICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKyAgICBlbHNlIGlmICggNTIgPCBzaGlmdENvdW50ICkgeworICAgICAgICBpZiAoIGFFeHAgfHwgYVNpZyApIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnIHw9IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKTsKKyAgICBzYXZlZEFTaWcgPSBhU2lnOworICAgIGFTaWcgPj49IHNoaWZ0Q291bnQ7CisgICAgeiA9IGFTaWc7CisgICAgaWYgKCBhU2lnbiApIHogPSAtIHo7CisgICAgaWYgKCAoIHogPCAwICkgXiBhU2lnbiApIHsKKyBpbnZhbGlkOgorICAgICAgICBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbnZhbGlkOworICAgICAgICByZXR1cm4gYVNpZ24gPyAweDgwMDAwMDAwIDogMHg3RkZGRkZGRjsKKyAgICB9CisgICAgaWYgKCAoIGFTaWc8PHNoaWZ0Q291bnQgKSAhPSBzYXZlZEFTaWcgKSB7CisgICAgICAgIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgfQorICAgIHJldHVybiB6OworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorYGEnIHRvIHRoZSAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCB1bnNpZ25lZCBpbnRlZ2VyIGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uCitpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50CitBcml0aG1ldGljLS0td2hpY2ggbWVhbnMgaW4gcGFydGljdWxhciB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIHJvdW5kZWQKK2FjY29yZGluZyB0byB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLiAgSWYgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdAorcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgaWYgdGhlIGNvbnZlcnNpb24gb3ZlcmZsb3dzLCB0aGUKK2xhcmdlc3QgcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQzMiBmbG9hdDY0X3RvX3VpbnQzMiggZmxvYXQ2NCBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDE2IGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgYml0czY0IGFTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSAwOyAvL2V4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIC8vaWYgKCAoIGFFeHAgPT0gMHg3RkYgKSAmJiBhU2lnICkgYVNpZ24gPSAwOworICAgIGlmICggYUV4cCApIGFTaWcgfD0gTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApOworICAgIHNoaWZ0Q291bnQgPSAweDQyQyAtIGFFeHA7CisgICAgaWYgKCAwIDwgc2hpZnRDb3VudCApIHNoaWZ0NjRSaWdodEphbW1pbmcoIGFTaWcsIHNoaWZ0Q291bnQsICZhU2lnICk7CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0ludDMyKCBhU2lnbiwgYVNpZyApOworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK2BhJyB0byB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYywgZXhjZXB0IHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgYWx3YXlzIHJvdW5kZWQgdG93YXJkIHplcm8uICBJZgorYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUKK2NvbnZlcnNpb24gb3ZlcmZsb3dzLCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ludDMyIGZsb2F0NjRfdG9fdWludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0NjQgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQxNiBhRXhwLCBzaGlmdENvdW50OworICAgIGJpdHM2NCBhU2lnLCBzYXZlZEFTaWc7CisgICAgaW50MzIgejsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIHNoaWZ0Q291bnQgPSAweDQzMyAtIGFFeHA7CisgICAgaWYgKCBzaGlmdENvdW50IDwgMjEgKSB7CisgICAgICAgIGlmICggKCBhRXhwID09IDB4N0ZGICkgJiYgYVNpZyApIGFTaWduID0gMDsKKyAgICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKyAgICBlbHNlIGlmICggNTIgPCBzaGlmdENvdW50ICkgeworICAgICAgICBpZiAoIGFFeHAgfHwgYVNpZyApIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnIHw9IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKTsKKyAgICBzYXZlZEFTaWcgPSBhU2lnOworICAgIGFTaWcgPj49IHNoaWZ0Q291bnQ7CisgICAgeiA9IGFTaWc7CisgICAgaWYgKCBhU2lnbiApIHogPSAtIHo7CisgICAgaWYgKCAoIHogPCAwICkgXiBhU2lnbiApIHsKKyBpbnZhbGlkOgorICAgICAgICBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbnZhbGlkOworICAgICAgICByZXR1cm4gYVNpZ24gPyAweDgwMDAwMDAwIDogMHg3RkZGRkZGRjsKKyAgICB9CisgICAgaWYgKCAoIGFTaWc8PHNoaWZ0Q291bnQgKSAhPSBzYXZlZEFTaWcgKSB7CisgICAgICAgIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgfQorICAgIHJldHVybiB6OworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK2BhJyB0byB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDMyIGZsb2F0NjRfdG9fZmxvYXQzMiggZmxvYXQ2NCBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDE2IGFFeHA7CisgICAgYml0czY0IGFTaWc7CisgICAgYml0czMyIHpTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBjb21tb25OYU5Ub0Zsb2F0MzIoIGZsb2F0NjRUb0NvbW1vbk5hTiggYSApICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggYVNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgMjIsICZhU2lnICk7CisgICAgelNpZyA9IGFTaWc7CisgICAgaWYgKCBhRXhwIHx8IHpTaWcgKSB7CisgICAgICAgIHpTaWcgfD0gMHg0MDAwMDAwMDsKKyAgICAgICAgYUV4cCAtPSAweDM4MTsKKyAgICB9CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MzIoIGFTaWduLCBhRXhwLCB6U2lnICk7CisKK30KKworI2lmZGVmIEZMT0FUWDgwCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorYGEnIHRvIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uCitpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50CitBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0eDgwIGZsb2F0NjRfdG9fZmxvYXR4ODAoIGZsb2F0NjQgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQxNiBhRXhwOworICAgIGJpdHM2NCBhU2lnOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gY29tbW9uTmFOVG9GbG9hdHg4MCggZmxvYXQ2NFRvQ29tbW9uTmFOKCBhICkgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggYVNpZ24sIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIGFTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgcGFja0Zsb2F0eDgwKAorICAgICAgICAgICAgYVNpZ24sIGFFeHAgKyAweDNDMDAsICggYVNpZyB8IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKSApPDwxMSApOworCit9CisKKyNlbmRpZgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUm91bmRzIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyB0byBhbiBpbnRlZ2VyLCBhbmQKK3JldHVybnMgdGhlIHJlc3VsdCBhcyBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUuICBUaGUKK29wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5CitGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0NjQgZmxvYXQ2NF9yb3VuZF90b19pbnQoIGZsb2F0NjQgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQxNiBhRXhwOworICAgIGJpdHM2NCBsYXN0Qml0TWFzaywgcm91bmRCaXRzTWFzazsKKyAgICBpbnQ4IHJvdW5kaW5nTW9kZTsKKyAgICBmbG9hdDY0IHo7CisKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBpZiAoIDB4NDMzIDw9IGFFeHAgKSB7CisgICAgICAgIGlmICggKCBhRXhwID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBhICkgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGFFeHAgPD0gMHgzRkUgKSB7CisgICAgICAgIGlmICggKGJpdHM2NCkgKCBhPDwxICkgPT0gMCApIHJldHVybiBhOworICAgICAgICBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgICAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgICAgICBzd2l0Y2ggKCBmbG9hdF9yb3VuZGluZ19tb2RlICkgeworICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW46CisgICAgICAgICAgICBpZiAoICggYUV4cCA9PSAweDNGRSApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYSApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggYVNpZ24sIDB4M0ZGLCAwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfZG93bjoKKyAgICAgICAgICAgIHJldHVybiBhU2lnbiA/IExJVDY0KCAweEJGRjAwMDAwMDAwMDAwMDAgKSA6IDA7CisgICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX3VwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhU2lnbiA/IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSA6IExJVDY0KCAweDNGRjAwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIGFTaWduLCAwLCAwICk7CisgICAgfQorICAgIGxhc3RCaXRNYXNrID0gMTsKKyAgICBsYXN0Qml0TWFzayA8PD0gMHg0MzMgLSBhRXhwOworICAgIHJvdW5kQml0c01hc2sgPSBsYXN0Qml0TWFzayAtIDE7CisgICAgeiA9IGE7CisgICAgcm91bmRpbmdNb2RlID0gZmxvYXRfcm91bmRpbmdfbW9kZTsKKyAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4gKSB7CisgICAgICAgIHogKz0gbGFzdEJpdE1hc2s+PjE7CisgICAgICAgIGlmICggKCB6ICYgcm91bmRCaXRzTWFzayApID09IDAgKSB6ICY9IH4gbGFzdEJpdE1hc2s7CisgICAgfQorICAgIGVsc2UgaWYgKCByb3VuZGluZ01vZGUgIT0gZmxvYXRfcm91bmRfdG9femVybyApIHsKKyAgICAgICAgaWYgKCBleHRyYWN0RmxvYXQ2NFNpZ24oIHogKSBeICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgKSB7CisgICAgICAgICAgICB6ICs9IHJvdW5kQml0c01hc2s7CisgICAgICAgIH0KKyAgICB9CisgICAgeiAmPSB+IHJvdW5kQml0c01hc2s7CisgICAgaWYgKCB6ICE9IGEgKSBmbG9hdF9leGNlcHRpb25fZmxhZ3MgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHJldHVybiB6OworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGRvdWJsZS1wcmVjaXNpb24KK2Zsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIElmIGB6U2lnbicgaXMgdHJ1ZSwgdGhlIHN1bSBpcyBuZWdhdGVkCitiZWZvcmUgYmVpbmcgcmV0dXJuZWQuICBgelNpZ24nIGlzIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCBpcyBhIE5hTi4gIFRoZQorYWRkaXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgZmxvYXQ2NCBhZGRGbG9hdDY0U2lncyggZmxvYXQ2NCBhLCBmbG9hdDY0IGIsIGZsYWcgelNpZ24gKQoreworICAgIGludDE2IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgYml0czY0IGFTaWcsIGJTaWcsIHpTaWc7CisgICAgaW50MTYgZXhwRGlmZjsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGFTaWcgPDw9IDk7CisgICAgYlNpZyA8PD0gOTsKKyAgICBpZiAoIDAgPCBleHBEaWZmICkgeworICAgICAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiApOworICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgICAgICAtLWV4cERpZmY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBiU2lnIHw9IExJVDY0KCAweDIwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICBzaGlmdDY0UmlnaHRKYW1taW5nKCBiU2lnLCBleHBEaWZmLCAmYlNpZyApOworICAgICAgICB6RXhwID0gYUV4cDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGV4cERpZmYgPCAwICkgeworICAgICAgICBpZiAoIGJFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgICAgICBpZiAoIGJTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiApOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCB6U2lnbiwgMHg3RkYsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgICAgICsrZXhwRGlmZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFTaWcgfD0gTElUNjQoIDB4MjAwMDAwMDAwMDAwMDAwMCApOworICAgICAgICB9CisgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoIGFTaWcsIC0gZXhwRGlmZiwgJmFTaWcgKTsKKyAgICAgICAgekV4cCA9IGJFeHA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgICAgICBpZiAoIGFTaWcgfCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0NjROYU4oIGEsIGIgKTsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgICAgIGlmICggYUV4cCA9PSAwICkgcmV0dXJuIHBhY2tGbG9hdDY0KCB6U2lnbiwgMCwgKCBhU2lnICsgYlNpZyApPj45ICk7CisgICAgICAgIHpTaWcgPSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICkgKyBhU2lnICsgYlNpZzsKKyAgICAgICAgekV4cCA9IGFFeHA7CisgICAgICAgIGdvdG8gcm91bmRBbmRQYWNrOworICAgIH0KKyAgICBhU2lnIHw9IExJVDY0KCAweDIwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB6U2lnID0gKCBhU2lnICsgYlNpZyApPDwxOworICAgIC0tekV4cDsKKyAgICBpZiAoIChzYml0czY0KSB6U2lnIDwgMCApIHsKKyAgICAgICAgelNpZyA9IGFTaWcgKyBiU2lnOworICAgICAgICArK3pFeHA7CisgICAgfQorIHJvdW5kQW5kUGFjazoKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGRvdWJsZS0KK3ByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicuICBJZiBgelNpZ24nIGlzIHRydWUsIHRoZQorZGlmZmVyZW5jZSBpcyBuZWdhdGVkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUKK3Jlc3VsdCBpcyBhIE5hTi4gIFRoZSBzdWJ0cmFjdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBmbG9hdDY0IHN1YkZsb2F0NjRTaWdzKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiwgZmxhZyB6U2lnbiApCit7CisgICAgaW50MTYgYUV4cCwgYkV4cCwgekV4cDsKKyAgICBiaXRzNjQgYVNpZywgYlNpZywgelNpZzsKKyAgICBpbnQxNiBleHBEaWZmOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGIgKTsKKyAgICBleHBEaWZmID0gYUV4cCAtIGJFeHA7CisgICAgYVNpZyA8PD0gMTA7CisgICAgYlNpZyA8PD0gMTA7CisgICAgaWYgKCAwIDwgZXhwRGlmZiApIGdvdG8gYUV4cEJpZ2dlcjsKKyAgICBpZiAoIGV4cERpZmYgPCAwICkgZ290byBiRXhwQmlnZ2VyOworICAgIGlmICggYUV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnIHwgYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiICk7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgcmV0dXJuIGZsb2F0NjRfZGVmYXVsdF9uYW47CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBhRXhwID0gMTsKKyAgICAgICAgYkV4cCA9IDE7CisgICAgfQorICAgIGlmICggYlNpZyA8IGFTaWcgKSBnb3RvIGFCaWdnZXI7CisgICAgaWYgKCBhU2lnIDwgYlNpZyApIGdvdG8gYkJpZ2dlcjsKKyAgICByZXR1cm4gcGFja0Zsb2F0NjQoIGZsb2F0X3JvdW5kaW5nX21vZGUgPT0gZmxvYXRfcm91bmRfZG93biwgMCwgMCApOworIGJFeHBCaWdnZXI6CisgICAgaWYgKCBiRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGJTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiApOworICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduIF4gMSwgMHg3RkYsIDAgKTsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgICsrZXhwRGlmZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFTaWcgfD0gTElUNjQoIDB4NDAwMDAwMDAwMDAwMDAwMCApOworICAgIH0KKyAgICBzaGlmdDY0UmlnaHRKYW1taW5nKCBhU2lnLCAtIGV4cERpZmYsICZhU2lnICk7CisgICAgYlNpZyB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgYkJpZ2dlcjoKKyAgICB6U2lnID0gYlNpZyAtIGFTaWc7CisgICAgekV4cCA9IGJFeHA7CisgICAgelNpZ24gXj0gMTsKKyAgICBnb3RvIG5vcm1hbGl6ZVJvdW5kQW5kUGFjazsKKyBhRXhwQmlnZ2VyOgorICAgIGlmICggYUV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0NjROYU4oIGEsIGIgKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICAtLWV4cERpZmY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBiU2lnIHw9IExJVDY0KCAweDQwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYlNpZywgZXhwRGlmZiwgJmJTaWcgKTsKKyAgICBhU2lnIHw9IExJVDY0KCAweDQwMDAwMDAwMDAwMDAwMDAgKTsKKyBhQmlnZ2VyOgorICAgIHpTaWcgPSBhU2lnIC0gYlNpZzsKKyAgICB6RXhwID0gYUV4cDsKKyBub3JtYWxpemVSb3VuZEFuZFBhY2s6CisgICAgLS16RXhwOworICAgIHJldHVybiBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdDY0KCB6U2lnbiwgekV4cCwgelNpZyApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScKK2FuZCBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvcgorQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXQ2NCBmbG9hdDY0X2FkZCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworCisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYiApOworICAgIGlmICggYVNpZ24gPT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybiBhZGRGbG9hdDY0U2lncyggYSwgYiwgYVNpZ24gKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBzdWJGbG9hdDY0U2lncyggYSwgYiwgYVNpZ24gKTsKKyAgICB9CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMKK2BhJyBhbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZAorZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0NjQgZmxvYXQ2NF9zdWIoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduID09IGJTaWduICkgeworICAgICAgICByZXR1cm4gc3ViRmxvYXQ2NFNpZ3MoIGEsIGIsIGFTaWduICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYWRkRmxvYXQ2NFNpZ3MoIGEsIGIsIGFTaWduICk7CisgICAgfQorCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzCitgYScgYW5kIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQKK2ZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDY0IGZsb2F0NjRfbXVsKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDE2IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgYml0czY0IGFTaWcsIGJTaWcsIHpTaWcwLCB6U2lnMTsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGIgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYiApOworICAgIHpTaWduID0gYVNpZ24gXiBiU2lnbjsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYVNpZyB8fCAoICggYkV4cCA9PSAweDdGRiApICYmIGJTaWcgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoIGJFeHAgfCBiU2lnICkgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDB4N0ZGLCAwICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgaWYgKCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0NjROYU4oIGEsIGIgKTsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDB4N0ZGLCAwICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYlNpZywgJmJFeHAsICZiU2lnICk7CisgICAgfQorICAgIHpFeHAgPSBhRXhwICsgYkV4cCAtIDB4M0ZGOworICAgIGFTaWcgPSAoIGFTaWcgfCBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICkgKTw8MTA7CisgICAgYlNpZyA9ICggYlNpZyB8IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKSApPDwxMTsKKyAgICBtdWw2NFRvMTI4KCBhU2lnLCBiU2lnLCAmelNpZzAsICZ6U2lnMSApOworICAgIHpTaWcwIHw9ICggelNpZzEgIT0gMCApOworICAgIGlmICggMCA8PSAoc2JpdHM2NCkgKCB6U2lnMDw8MSApICkgeworICAgICAgICB6U2lnMCA8PD0gMTsKKyAgICAgICAgLS16RXhwOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCggelNpZ24sIHpFeHAsIHpTaWcwICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScKK2J5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0bwordGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDY0IGZsb2F0NjRfZGl2KCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDE2IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgYml0czY0IGFTaWcsIGJTaWcsIHpTaWc7CisgICAgYml0czY0IHJlbTAsIHJlbTE7CisgICAgYml0czY0IHRlcm0wLCB0ZXJtMTsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGIgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYiApOworICAgIHpTaWduID0gYVNpZ24gXiBiU2lnbjsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiICk7CisgICAgICAgIGlmICggYkV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiICk7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAweDdGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDAsIDAgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYlNpZyA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0NjRfZGVmYXVsdF9uYW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19kaXZieXplcm8gKTsKKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDB4N0ZGLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYlNpZywgJmJFeHAsICZiU2lnICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIHpFeHAgPSBhRXhwIC0gYkV4cCArIDB4M0ZEOworICAgIGFTaWcgPSAoIGFTaWcgfCBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICkgKTw8MTA7CisgICAgYlNpZyA9ICggYlNpZyB8IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKSApPDwxMTsKKyAgICBpZiAoIGJTaWcgPD0gKCBhU2lnICsgYVNpZyApICkgeworICAgICAgICBhU2lnID4+PSAxOworICAgICAgICArK3pFeHA7CisgICAgfQorICAgIHpTaWcgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcsIDAsIGJTaWcgKTsKKyAgICBpZiAoICggelNpZyAmIDB4MUZGICkgPD0gMiApIHsKKyAgICAgICAgbXVsNjRUbzEyOCggYlNpZywgelNpZywgJnRlcm0wLCAmdGVybTEgKTsKKyAgICAgICAgc3ViMTI4KCBhU2lnLCAwLCB0ZXJtMCwgdGVybTEsICZyZW0wLCAmcmVtMSApOworICAgICAgICB3aGlsZSAoIChzYml0czY0KSByZW0wIDwgMCApIHsKKyAgICAgICAgICAgIC0telNpZzsKKyAgICAgICAgICAgIGFkZDEyOCggcmVtMCwgcmVtMSwgMCwgYlNpZywgJnJlbTAsICZyZW0xICk7CisgICAgICAgIH0KKyAgICAgICAgelNpZyB8PSAoIHJlbTEgIT0gMCApOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJword2l0aCByZXNwZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkCithY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDY0IGZsb2F0NjRfcmVtKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDE2IGFFeHAsIGJFeHAsIGV4cERpZmY7CisgICAgYml0czY0IGFTaWcsIGJTaWc7CisgICAgYml0czY0IHEsIGFsdGVybmF0ZUFTaWc7CisgICAgc2JpdHM2NCBzaWdNZWFuOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYiApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBiICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGFTaWcgfHwgKCAoIGJFeHAgPT0gMHg3RkYgKSAmJiBiU2lnICkgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiApOworICAgICAgICB9CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgcmV0dXJuIGZsb2F0NjRfZGVmYXVsdF9uYW47CisgICAgfQorICAgIGlmICggYkV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgaWYgKCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0NjROYU4oIGEsIGIgKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gYTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGV4cERpZmYgPSBhRXhwIC0gYkV4cDsKKyAgICBhU2lnID0gKCBhU2lnIHwgTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApICk8PDExOworICAgIGJTaWcgPSAoIGJTaWcgfCBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICkgKTw8MTE7CisgICAgaWYgKCBleHBEaWZmIDwgMCApIHsKKyAgICAgICAgaWYgKCBleHBEaWZmIDwgLTEgKSByZXR1cm4gYTsKKyAgICAgICAgYVNpZyA+Pj0gMTsKKyAgICB9CisgICAgcSA9ICggYlNpZyA8PSBhU2lnICk7CisgICAgaWYgKCBxICkgYVNpZyAtPSBiU2lnOworICAgIGV4cERpZmYgLT0gNjQ7CisgICAgd2hpbGUgKCAwIDwgZXhwRGlmZiApIHsKKyAgICAgICAgcSA9IGVzdGltYXRlRGl2MTI4VG82NCggYVNpZywgMCwgYlNpZyApOworICAgICAgICBxID0gKCAyIDwgcSApID8gcSAtIDIgOiAwOworICAgICAgICBhU2lnID0gLSAoICggYlNpZz4+MiApICogcSApOworICAgICAgICBleHBEaWZmIC09IDYyOworICAgIH0KKyAgICBleHBEaWZmICs9IDY0OworICAgIGlmICggMCA8IGV4cERpZmYgKSB7CisgICAgICAgIHEgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcsIDAsIGJTaWcgKTsKKyAgICAgICAgcSA9ICggMiA8IHEgKSA/IHEgLSAyIDogMDsKKyAgICAgICAgcSA+Pj0gNjQgLSBleHBEaWZmOworICAgICAgICBiU2lnID4+PSAyOworICAgICAgICBhU2lnID0gKCAoIGFTaWc+PjEgKTw8KCBleHBEaWZmIC0gMSApICkgLSBiU2lnICogcTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFTaWcgPj49IDI7CisgICAgICAgIGJTaWcgPj49IDI7CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgYWx0ZXJuYXRlQVNpZyA9IGFTaWc7CisgICAgICAgICsrcTsKKyAgICAgICAgYVNpZyAtPSBiU2lnOworICAgIH0gd2hpbGUgKCAwIDw9IChzYml0czY0KSBhU2lnICk7CisgICAgc2lnTWVhbiA9IGFTaWcgKyBhbHRlcm5hdGVBU2lnOworICAgIGlmICggKCBzaWdNZWFuIDwgMCApIHx8ICggKCBzaWdNZWFuID09IDAgKSAmJiAoIHEgJiAxICkgKSApIHsKKyAgICAgICAgYVNpZyA9IGFsdGVybmF0ZUFTaWc7CisgICAgfQorICAgIHpTaWduID0gKCAoc2JpdHM2NCkgYVNpZyA8IDAgKTsKKyAgICBpZiAoIHpTaWduICkgYVNpZyA9IC0gYVNpZzsKKyAgICByZXR1cm4gbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQ2NCggYVNpZ24gXiB6U2lnbiwgYkV4cCwgYVNpZyApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCitUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK0Zsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXQ2NCBmbG9hdDY0X3NxcnQoIGZsb2F0NjQgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQxNiBhRXhwLCB6RXhwOworICAgIGJpdHM2NCBhU2lnLCB6U2lnOworICAgIGJpdHM2NCByZW0wLCByZW0xLCB0ZXJtMCwgdGVybTE7IC8vLCBzaGlmdGVkUmVtOworICAgIC8vZmxvYXQ2NCB6OworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYSApOworICAgICAgICBpZiAoICEgYVNpZ24gKSByZXR1cm4gYTsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICB9CisgICAgaWYgKCBhU2lnbiApIHsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHJldHVybiBhOworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gMDsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIHpFeHAgPSAoICggYUV4cCAtIDB4M0ZGICk+PjEgKSArIDB4M0ZFOworICAgIGFTaWcgfD0gTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApOworICAgIHpTaWcgPSBlc3RpbWF0ZVNxcnQzMiggYUV4cCwgYVNpZz4+MjEgKTsKKyAgICB6U2lnIDw8PSAzMTsKKyAgICBhU2lnIDw8PSA5IC0gKCBhRXhwICYgMSApOworICAgIHpTaWcgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcsIDAsIHpTaWcgKSArIHpTaWcgKyAyOworICAgIGlmICggKCB6U2lnICYgMHgzRkYgKSA8PSA1ICkgeworICAgICAgICBpZiAoIHpTaWcgPCAyICkgeworICAgICAgICAgICAgelNpZyA9IExJVDY0KCAweEZGRkZGRkZGRkZGRkZGRkYgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFTaWcgPDw9IDI7CisgICAgICAgICAgICBtdWw2NFRvMTI4KCB6U2lnLCB6U2lnLCAmdGVybTAsICZ0ZXJtMSApOworICAgICAgICAgICAgc3ViMTI4KCBhU2lnLCAwLCB0ZXJtMCwgdGVybTEsICZyZW0wLCAmcmVtMSApOworICAgICAgICAgICAgd2hpbGUgKCAoc2JpdHM2NCkgcmVtMCA8IDAgKSB7CisgICAgICAgICAgICAgICAgLS16U2lnOworICAgICAgICAgICAgICAgIHNob3J0U2hpZnQxMjhMZWZ0KCAwLCB6U2lnLCAxLCAmdGVybTAsICZ0ZXJtMSApOworICAgICAgICAgICAgICAgIHRlcm0xIHw9IDE7CisgICAgICAgICAgICAgICAgYWRkMTI4KCByZW0wLCByZW0xLCB0ZXJtMCwgdGVybTEsICZyZW0wLCAmcmVtMSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgelNpZyB8PSAoICggcmVtMCB8IHJlbTEgKSAhPSAwICk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggelNpZywgMSwgJnpTaWcgKTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCggMCwgekV4cCwgelNpZyApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGVxdWFsIHRvIHRoZQorY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZAorYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdDY0X2VxKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYSApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBiICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKCBhICkgfHwgZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAoIGEgPT0gYiApIHx8ICggKGJpdHM2NCkgKCAoIGEgfCBiICk8PDEgKSA9PSAwICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcyB0aGFuIG9yCitlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBjb21wYXJpc29uIGlzCitwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50CitBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXQ2NF9sZSggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGEgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYSApICkKKyAgICAgICAgIHx8ICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYiApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHJldHVybiBhU2lnbiB8fCAoIChiaXRzNjQpICggKCBhIHwgYiApPDwxICkgPT0gMCApOworICAgIHJldHVybiAoIGEgPT0gYiApIHx8ICggYVNpZ24gXiAoIGEgPCBiICkgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4KK3RoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkCithY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbGFnIGZsb2F0NjRfbHQoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBhICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGIgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gJiYgKCAoYml0czY0KSAoICggYSB8IGIgKTw8MSApICE9IDAgKTsKKyAgICByZXR1cm4gKCBhICE9IGIgKSAmJiAoIGFTaWduIF4gKCBhIDwgYiApICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgZXF1YWwgdG8gdGhlCitjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZAoraWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBOYU4uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZAorYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdDY0X2VxX3NpZ25hbGluZyggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGEgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYSApICkKKyAgICAgICAgIHx8ICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYiApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gKCBhID09IGIgKSB8fCAoIChiaXRzNjQpICggKCBhIHwgYiApPDwxICkgPT0gMCApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGxlc3MgdGhhbiBvcgorZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdAorY2F1c2UgYW4gZXhjZXB0aW9uLiAgT3RoZXJ3aXNlLCB0aGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZQorSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXQ2NF9sZV9xdWlldCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworICAgIC8vaW50MTYgYUV4cCwgYkV4cDsKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBhICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGIgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGEgKSB8fCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGIgKSApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gfHwgKCAoYml0czY0KSAoICggYSB8IGIgKTw8MSApID09IDAgKTsKKyAgICByZXR1cm4gKCBhID09IGIgKSB8fCAoIGFTaWduIF4gKCBhIDwgYiApICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcyB0aGFuCit0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90IGNhdXNlIGFuCitleGNlcHRpb24uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCitTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdDY0X2x0X3F1aWV0KCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYSApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBiICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKCBhICkgfHwgZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgcmV0dXJuIGFTaWduICYmICggKGJpdHM2NCkgKCAoIGEgfCBiICk8PDEgKSAhPSAwICk7CisgICAgcmV0dXJuICggYSAhPSBiICkgJiYgKCBhU2lnbiBeICggYSA8IGIgKSApOworCit9CisKKyNpZmRlZiBGTE9BVFg4MAorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctCitwb2ludCB2YWx1ZSBgYScgdG8gdGhlIDMyLWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgZm9ybWF0LiAgVGhlCitjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK0Zsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMtLS13aGljaCBtZWFucyBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGNvbnZlcnNpb24KK2lzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUuICBJZiBgYScgaXMgYSBOYU4sIHRoZQorbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUgY29udmVyc2lvbgorb3ZlcmZsb3dzLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMgcmV0dXJuZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50MzIgZmxvYXR4ODBfdG9faW50MzIoIGZsb2F0eDgwIGEgKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MzIgYUV4cCwgc2hpZnRDb3VudDsKKyAgICBiaXRzNjQgYVNpZzsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGlmICggKCBhRXhwID09IDB4N0ZGRiApICYmIChiaXRzNjQpICggYVNpZzw8MSApICkgYVNpZ24gPSAwOworICAgIHNoaWZ0Q291bnQgPSAweDQwMzcgLSBhRXhwOworICAgIGlmICggc2hpZnRDb3VudCA8PSAwICkgc2hpZnRDb3VudCA9IDE7CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgc2hpZnRDb3VudCwgJmFTaWcgKTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrSW50MzIoIGFTaWduLCBhU2lnICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorcG9pbnQgdmFsdWUgYGEnIHRvIHRoZSAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4gIFRoZQorY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5CitGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLCBleGNlcHQgdGhhdCB0aGUgY29udmVyc2lvbiBpcyBhbHdheXMgcm91bmRlZAordG93YXJkIHplcm8uICBJZiBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuCitPdGhlcndpc2UsIGlmIHRoZSBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlIGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lCitzaWduIGFzIGBhJyBpcyByZXR1cm5lZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQzMiBmbG9hdHg4MF90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdHg4MCBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgYml0czY0IGFTaWcsIHNhdmVkQVNpZzsKKyAgICBpbnQzMiB6OworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgc2hpZnRDb3VudCA9IDB4NDAzRSAtIGFFeHA7CisgICAgaWYgKCBzaGlmdENvdW50IDwgMzIgKSB7CisgICAgICAgIGlmICggKCBhRXhwID09IDB4N0ZGRiApICYmIChiaXRzNjQpICggYVNpZzw8MSApICkgYVNpZ24gPSAwOworICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCA2MyA8IHNoaWZ0Q291bnQgKSB7CisgICAgICAgIGlmICggYUV4cCB8fCBhU2lnICkgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNhdmVkQVNpZyA9IGFTaWc7CisgICAgYVNpZyA+Pj0gc2hpZnRDb3VudDsKKyAgICB6ID0gYVNpZzsKKyAgICBpZiAoIGFTaWduICkgeiA9IC0gejsKKyAgICBpZiAoICggeiA8IDAgKSBeIGFTaWduICkgeworIGludmFsaWQ6CisgICAgICAgIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2ludmFsaWQ7CisgICAgICAgIHJldHVybiBhU2lnbiA/IDB4ODAwMDAwMDAgOiAweDdGRkZGRkZGOworICAgIH0KKyAgICBpZiAoICggYVNpZzw8c2hpZnRDb3VudCApICE9IHNhdmVkQVNpZyApIHsKKyAgICAgICAgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICB9CisgICAgcmV0dXJuIHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorcG9pbnQgdmFsdWUgYGEnIHRvIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZQorY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5CitGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0MzIgZmxvYXR4ODBfdG9fZmxvYXQzMiggZmxvYXR4ODAgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwOworICAgIGJpdHM2NCBhU2lnOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAoYml0czY0KSAoIGFTaWc8PDEgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBjb21tb25OYU5Ub0Zsb2F0MzIoIGZsb2F0eDgwVG9Db21tb25OYU4oIGEgKSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggYVNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgMzMsICZhU2lnICk7CisgICAgaWYgKCBhRXhwIHx8IGFTaWcgKSBhRXhwIC09IDB4M0Y4MTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQzMiggYVNpZ24sIGFFeHAsIGFTaWcgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctCitwb2ludCB2YWx1ZSBgYScgdG8gdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlCitjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK0Zsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXQ2NCBmbG9hdHg4MF90b19mbG9hdDY0KCBmbG9hdHg4MCBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHA7CisgICAgYml0czY0IGFTaWcsIHpTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIChiaXRzNjQpICggYVNpZzw8MSApICkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXQ2NCggZmxvYXR4ODBUb0NvbW1vbk5hTiggYSApICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCBhU2lnbiwgMHg3RkYsIDAgKTsKKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgMSwgJnpTaWcgKTsKKyAgICBpZiAoIGFFeHAgfHwgYVNpZyApIGFFeHAgLT0gMHgzQzAxOworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDY0KCBhU2lnbiwgYUV4cCwgelNpZyApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSb3VuZHMgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIHRvIGFuIGludGVnZXIsCithbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIGV4dGVuZGVkIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3ZhbHVlLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IKK0JpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0eDgwIGZsb2F0eDgwX3JvdW5kX3RvX2ludCggZmxvYXR4ODAgYSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwOworICAgIGJpdHM2NCBsYXN0Qml0TWFzaywgcm91bmRCaXRzTWFzazsKKyAgICBpbnQ4IHJvdW5kaW5nTW9kZTsKKyAgICBmbG9hdHg4MCB6OworCisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYSApOworICAgIGlmICggMHg0MDNFIDw9IGFFeHAgKSB7CisgICAgICAgIGlmICggKCBhRXhwID09IDB4N0ZGRiApICYmIChiaXRzNjQpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApPDwxICkgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGEgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKCBhRXhwIDw9IDB4M0ZGRSApIHsKKyAgICAgICAgaWYgKCAgICAoIGFFeHAgPT0gMCApCisgICAgICAgICAgICAgJiYgKCAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApID09IDAgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgICAgIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgICAgICBzd2l0Y2ggKCBmbG9hdF9yb3VuZGluZ19tb2RlICkgeworICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW46CisgICAgICAgICAgICBpZiAoICggYUV4cCA9PSAweDNGRkUgKSAmJiAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApCisgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgcGFja0Zsb2F0eDgwKCBhU2lnbiwgMHgzRkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICBhU2lnbiA/CisgICAgICAgICAgICAgICAgICAgICAgcGFja0Zsb2F0eDgwKCAxLCAweDNGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApCisgICAgICAgICAgICAgICAgOiBwYWNrRmxvYXR4ODAoIDAsIDAsIDAgKTsKKyAgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfdXA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgIGFTaWduID8gcGFja0Zsb2F0eDgwKCAxLCAwLCAwICkKKyAgICAgICAgICAgICAgICA6IHBhY2tGbG9hdHg4MCggMCwgMHgzRkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCBhU2lnbiwgMCwgMCApOworICAgIH0KKyAgICBsYXN0Qml0TWFzayA9IDE7CisgICAgbGFzdEJpdE1hc2sgPDw9IDB4NDAzRSAtIGFFeHA7CisgICAgcm91bmRCaXRzTWFzayA9IGxhc3RCaXRNYXNrIC0gMTsKKyAgICB6ID0gYTsKKyAgICByb3VuZGluZ01vZGUgPSBmbG9hdF9yb3VuZGluZ19tb2RlOworICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbiApIHsKKyAgICAgICAgei5sb3cgKz0gbGFzdEJpdE1hc2s+PjE7CisgICAgICAgIGlmICggKCB6LmxvdyAmIHJvdW5kQml0c01hc2sgKSA9PSAwICkgei5sb3cgJj0gfiBsYXN0Qml0TWFzazsKKyAgICB9CisgICAgZWxzZSBpZiAoIHJvdW5kaW5nTW9kZSAhPSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICBpZiAoIGV4dHJhY3RGbG9hdHg4MFNpZ24oIHogKSBeICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgKSB7CisgICAgICAgICAgICB6LmxvdyArPSByb3VuZEJpdHNNYXNrOworICAgICAgICB9CisgICAgfQorICAgIHoubG93ICY9IH4gcm91bmRCaXRzTWFzazsKKyAgICBpZiAoIHoubG93ID09IDAgKSB7CisgICAgICAgICsrei5oaWdoOworICAgICAgICB6LmxvdyA9IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB9CisgICAgaWYgKCB6LmxvdyAhPSBhLmxvdyApIGZsb2F0X2V4Y2VwdGlvbl9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgcmV0dXJuIHo7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBhZGRpbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgZXh0ZW5kZWQgZG91YmxlLQorcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIElmIGB6U2lnbicgaXMgdHJ1ZSwgdGhlIHN1bSBpcworbmVnYXRlZCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQuICBgelNpZ24nIGlzIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCBpcyBhIE5hTi4KK1RoZSBhZGRpdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5CitGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBmbG9hdHg4MCBhZGRGbG9hdHg4MFNpZ3MoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIsIGZsYWcgelNpZ24gKQoreworICAgIGludDMyIGFFeHAsIGJFeHAsIHpFeHA7CisgICAgYml0czY0IGFTaWcsIGJTaWcsIHpTaWcwLCB6U2lnMTsKKyAgICBpbnQzMiBleHBEaWZmOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGlmICggMCA8IGV4cERpZmYgKSB7CisgICAgICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgICAgICBpZiAoIChiaXRzNjQpICggYVNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiICk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJFeHAgPT0gMCApIC0tZXhwRGlmZjsKKyAgICAgICAgc2hpZnQ2NEV4dHJhUmlnaHRKYW1taW5nKCBiU2lnLCAwLCBleHBEaWZmLCAmYlNpZywgJnpTaWcxICk7CisgICAgICAgIHpFeHAgPSBhRXhwOworICAgIH0KKyAgICBlbHNlIGlmICggZXhwRGlmZiA8IDAgKSB7CisgICAgICAgIGlmICggYkV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgICAgICBpZiAoIChiaXRzNjQpICggYlNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiICk7CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMHg3RkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGFFeHAgPT0gMCApICsrZXhwRGlmZjsKKyAgICAgICAgc2hpZnQ2NEV4dHJhUmlnaHRKYW1taW5nKCBhU2lnLCAwLCAtIGV4cERpZmYsICZhU2lnLCAmelNpZzEgKTsKKyAgICAgICAgekV4cCA9IGJFeHA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICAgICAgaWYgKCAoYml0czY0KSAoICggYVNpZyB8IGJTaWcgKTw8MSApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICAgICAgelNpZzEgPSAwOworICAgICAgICB6U2lnMCA9IGFTaWcgKyBiU2lnOworICAgICAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgICAgIG5vcm1hbGl6ZUZsb2F0eDgwU3Vibm9ybWFsKCB6U2lnMCwgJnpFeHAsICZ6U2lnMCApOworICAgICAgICAgICAgZ290byByb3VuZEFuZFBhY2s7CisgICAgICAgIH0KKyAgICAgICAgekV4cCA9IGFFeHA7CisgICAgICAgIGdvdG8gc2hpZnRSaWdodDE7CisgICAgfQorICAgIAorICAgIHpTaWcwID0gYVNpZyArIGJTaWc7CisKKyAgICBpZiAoIChzYml0czY0KSB6U2lnMCA8IDAgKSBnb3RvIHJvdW5kQW5kUGFjazsgCisgc2hpZnRSaWdodDE6CisgICAgc2hpZnQ2NEV4dHJhUmlnaHRKYW1taW5nKCB6U2lnMCwgelNpZzEsIDEsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgelNpZzAgfD0gTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApOworICAgICsrekV4cDsKKyByb3VuZEFuZFBhY2s6CisgICAgcmV0dXJuCisgICAgICAgIHJvdW5kQW5kUGFja0Zsb2F0eDgwKAorICAgICAgICAgICAgZmxvYXR4ODBfcm91bmRpbmdfcHJlY2lzaW9uLCB6U2lnbiwgekV4cCwgelNpZzAsIHpTaWcxICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBleHRlbmRlZAorZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicuICBJZiBgelNpZ24nIGlzIHRydWUsCit0aGUgZGlmZmVyZW5jZSBpcyBuZWdhdGVkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUKK3Jlc3VsdCBpcyBhIE5hTi4gIFRoZSBzdWJ0cmFjdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBmbG9hdHg4MCBzdWJGbG9hdHg4MFNpZ3MoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIsIGZsYWcgelNpZ24gKQoreworICAgIGludDMyIGFFeHAsIGJFeHAsIHpFeHA7CisgICAgYml0czY0IGFTaWcsIGJTaWcsIHpTaWcwLCB6U2lnMTsKKyAgICBpbnQzMiBleHBEaWZmOworICAgIGZsb2F0eDgwIHo7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKTsKKyAgICBleHBEaWZmID0gYUV4cCAtIGJFeHA7CisgICAgaWYgKCAwIDwgZXhwRGlmZiApIGdvdG8gYUV4cEJpZ2dlcjsKKyAgICBpZiAoIGV4cERpZmYgPCAwICkgZ290byBiRXhwQmlnZ2VyOworICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggKGJpdHM2NCkgKCAoIGFTaWcgfCBiU2lnICk8PDEgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiApOworICAgICAgICB9CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgei5sb3cgPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgIHouaGlnaCA9IGZsb2F0eDgwX2RlZmF1bHRfbmFuX2hpZ2g7CisgICAgICAgIHJldHVybiB6OworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgYUV4cCA9IDE7CisgICAgICAgIGJFeHAgPSAxOworICAgIH0KKyAgICB6U2lnMSA9IDA7CisgICAgaWYgKCBiU2lnIDwgYVNpZyApIGdvdG8gYUJpZ2dlcjsKKyAgICBpZiAoIGFTaWcgPCBiU2lnICkgZ290byBiQmlnZ2VyOworICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIGZsb2F0X3JvdW5kaW5nX21vZGUgPT0gZmxvYXRfcm91bmRfZG93biwgMCwgMCApOworIGJFeHBCaWdnZXI6CisgICAgaWYgKCBiRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAoYml0czY0KSAoIGJTaWc8PDEgKSApIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiApOworICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiBeIDEsIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgKytleHBEaWZmOworICAgIHNoaWZ0MTI4UmlnaHRKYW1taW5nKCBhU2lnLCAwLCAtIGV4cERpZmYsICZhU2lnLCAmelNpZzEgKTsKKyBiQmlnZ2VyOgorICAgIHN1YjEyOCggYlNpZywgMCwgYVNpZywgelNpZzEsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgekV4cCA9IGJFeHA7CisgICAgelNpZ24gXj0gMTsKKyAgICBnb3RvIG5vcm1hbGl6ZVJvdW5kQW5kUGFjazsKKyBhRXhwQmlnZ2VyOgorICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggKGJpdHM2NCkgKCBhU2lnPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgLS1leHBEaWZmOworICAgIHNoaWZ0MTI4UmlnaHRKYW1taW5nKCBiU2lnLCAwLCBleHBEaWZmLCAmYlNpZywgJnpTaWcxICk7CisgYUJpZ2dlcjoKKyAgICBzdWIxMjgoIGFTaWcsIDAsIGJTaWcsIHpTaWcxLCAmelNpZzAsICZ6U2lnMSApOworICAgIHpFeHAgPSBhRXhwOworIG5vcm1hbGl6ZVJvdW5kQW5kUGFjazoKKyAgICByZXR1cm4KKyAgICAgICAgbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXR4ODAoCisgICAgICAgICAgICBmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb24sIHpTaWduLCB6RXhwLCB6U2lnMCwgelNpZzEgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludAordmFsdWVzIGBhJyBhbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0eDgwIGZsb2F0eDgwX2FkZCggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisgICAgCisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiA9PSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuIGFkZEZsb2F0eDgwU2lncyggYSwgYiwgYVNpZ24gKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBzdWJGbG9hdHg4MFNpZ3MoIGEsIGIsIGFTaWduICk7CisgICAgfQorICAgIAorfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZQorSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0eDgwIGZsb2F0eDgwX3N1YiggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduID09IGJTaWduICkgeworICAgICAgICByZXR1cm4gc3ViRmxvYXR4ODBTaWdzKCBhLCBiLCBhU2lnbiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGFkZEZsb2F0eDgwU2lncyggYSwgYiwgYVNpZ24gKTsKKyAgICB9CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy0KK3BvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUKK0lFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdHg4MCBmbG9hdHg4MF9tdWwoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduLCB6U2lnbjsKKyAgICBpbnQzMiBhRXhwLCBiRXhwLCB6RXhwOworICAgIGJpdHM2NCBhU2lnLCBiU2lnLCB6U2lnMCwgelNpZzE7CisgICAgZmxvYXR4ODAgejsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYiApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYiApOworICAgIHpTaWduID0gYVNpZ24gXiBiU2lnbjsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoICAgIChiaXRzNjQpICggYVNpZzw8MSApCisgICAgICAgICAgICAgfHwgKCAoIGJFeHAgPT0gMHg3RkZGICkgJiYgKGJpdHM2NCkgKCBiU2lnPDwxICkgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiApOworICAgICAgICB9CisgICAgICAgIGlmICggKCBiRXhwIHwgYlNpZyApID09IDAgKSBnb3RvIGludmFsaWQ7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAweDdGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIChiaXRzNjQpICggYlNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiICk7CisgICAgICAgIGlmICggKCBhRXhwIHwgYVNpZyApID09IDAgKSB7CisgaW52YWxpZDoKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgICAgIHoubG93ID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93OworICAgICAgICAgICAgei5oaWdoID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5faGlnaDsKKyAgICAgICAgICAgIHJldHVybiB6OworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAweDdGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMCwgMCApOworICAgICAgICBub3JtYWxpemVGbG9hdHg4MFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0eDgwU3Vibm9ybWFsKCBiU2lnLCAmYkV4cCwgJmJTaWcgKTsKKyAgICB9CisgICAgekV4cCA9IGFFeHAgKyBiRXhwIC0gMHgzRkZFOworICAgIG11bDY0VG8xMjgoIGFTaWcsIGJTaWcsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgaWYgKCAwIDwgKHNiaXRzNjQpIHpTaWcwICkgeworICAgICAgICBzaG9ydFNoaWZ0MTI4TGVmdCggelNpZzAsIHpTaWcxLCAxLCAmelNpZzAsICZ6U2lnMSApOworICAgICAgICAtLXpFeHA7CisgICAgfQorICAgIHJldHVybgorICAgICAgICByb3VuZEFuZFBhY2tGbG9hdHg4MCgKKyAgICAgICAgICAgIGZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbiwgelNpZ24sIHpFeHAsIHpTaWcwLCB6U2lnMSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3ZhbHVlIGBhJyBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZAorYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXR4ODAgZmxvYXR4ODBfZGl2KCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbiwgelNpZ247CisgICAgaW50MzIgYUV4cCwgYkV4cCwgekV4cDsKKyAgICBiaXRzNjQgYVNpZywgYlNpZywgelNpZzAsIHpTaWcxOworICAgIGJpdHM2NCByZW0wLCByZW0xLCByZW0yLCB0ZXJtMCwgdGVybTEsIHRlcm0yOworICAgIGZsb2F0eDgwIHo7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGIgKTsKKyAgICB6U2lnbiA9IGFTaWduIF4gYlNpZ247CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAoYml0czY0KSAoIGFTaWc8PDEgKSApIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiApOworICAgICAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICAgICAgaWYgKCAoYml0czY0KSAoIGJTaWc8PDEgKSApIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiApOworICAgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAweDdGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIChiaXRzNjQpICggYlNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAwLCAwICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggKCBhRXhwIHwgYVNpZyApID09IDAgKSB7CisgaW52YWxpZDoKKyAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgICAgICAgICAgei5sb3cgPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgICAgICAgICAgei5oaWdoID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5faGlnaDsKKyAgICAgICAgICAgICAgICByZXR1cm4gejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2RpdmJ5emVybyApOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXR4ODBTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMCwgMCApOworICAgICAgICBub3JtYWxpemVGbG9hdHg4MFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIHpFeHAgPSBhRXhwIC0gYkV4cCArIDB4M0ZGRTsKKyAgICByZW0xID0gMDsKKyAgICBpZiAoIGJTaWcgPD0gYVNpZyApIHsKKyAgICAgICAgc2hpZnQxMjhSaWdodCggYVNpZywgMCwgMSwgJmFTaWcsICZyZW0xICk7CisgICAgICAgICsrekV4cDsKKyAgICB9CisgICAgelNpZzAgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcsIHJlbTEsIGJTaWcgKTsKKyAgICBtdWw2NFRvMTI4KCBiU2lnLCB6U2lnMCwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICBzdWIxMjgoIGFTaWcsIHJlbTEsIHRlcm0wLCB0ZXJtMSwgJnJlbTAsICZyZW0xICk7CisgICAgd2hpbGUgKCAoc2JpdHM2NCkgcmVtMCA8IDAgKSB7CisgICAgICAgIC0telNpZzA7CisgICAgICAgIGFkZDEyOCggcmVtMCwgcmVtMSwgMCwgYlNpZywgJnJlbTAsICZyZW0xICk7CisgICAgfQorICAgIHpTaWcxID0gZXN0aW1hdGVEaXYxMjhUbzY0KCByZW0xLCAwLCBiU2lnICk7CisgICAgaWYgKCAoYml0czY0KSAoIHpTaWcxPDwxICkgPD0gOCApIHsKKyAgICAgICAgbXVsNjRUbzEyOCggYlNpZywgelNpZzEsICZ0ZXJtMSwgJnRlcm0yICk7CisgICAgICAgIHN1YjEyOCggcmVtMSwgMCwgdGVybTEsIHRlcm0yLCAmcmVtMSwgJnJlbTIgKTsKKyAgICAgICAgd2hpbGUgKCAoc2JpdHM2NCkgcmVtMSA8IDAgKSB7CisgICAgICAgICAgICAtLXpTaWcxOworICAgICAgICAgICAgYWRkMTI4KCByZW0xLCByZW0yLCAwLCBiU2lnLCAmcmVtMSwgJnJlbTIgKTsKKyAgICAgICAgfQorICAgICAgICB6U2lnMSB8PSAoICggcmVtMSB8IHJlbTIgKSAhPSAwICk7CisgICAgfQorICAgIHJldHVybgorICAgICAgICByb3VuZEFuZFBhY2tGbG9hdHg4MCgKKyAgICAgICAgICAgIGZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbiwgelNpZ24sIHpFeHAsIHpTaWcwLCB6U2lnMSApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK2BhJyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQKK2FjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0eDgwIGZsb2F0eDgwX3JlbSggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDMyIGFFeHAsIGJFeHAsIGV4cERpZmY7CisgICAgYml0czY0IGFTaWcwLCBhU2lnMSwgYlNpZzsKKyAgICBiaXRzNjQgcSwgdGVybTAsIHRlcm0xLCBhbHRlcm5hdGVBU2lnMCwgYWx0ZXJuYXRlQVNpZzE7CisgICAgZmxvYXR4ODAgejsKKworICAgIGFTaWcwID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGIgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoICAgIChiaXRzNjQpICggYVNpZzA8PDEgKQorICAgICAgICAgICAgIHx8ICggKCBiRXhwID09IDB4N0ZGRiApICYmIChiaXRzNjQpICggYlNpZzw8MSApICkgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggKGJpdHM2NCkgKCBiU2lnPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHsKKyBpbnZhbGlkOgorICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICAgICAgei5sb3cgPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgICAgICB6LmhpZ2ggPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXR4ODBTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCAoYml0czY0KSAoIGFTaWcwPDwxICkgPT0gMCApIHJldHVybiBhOworICAgICAgICBub3JtYWxpemVGbG9hdHg4MFN1Ym5vcm1hbCggYVNpZzAsICZhRXhwLCAmYVNpZzAgKTsKKyAgICB9CisgICAgYlNpZyB8PSBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICk7CisgICAgelNpZ24gPSBhU2lnbjsKKyAgICBleHBEaWZmID0gYUV4cCAtIGJFeHA7CisgICAgYVNpZzEgPSAwOworICAgIGlmICggZXhwRGlmZiA8IDAgKSB7CisgICAgICAgIGlmICggZXhwRGlmZiA8IC0xICkgcmV0dXJuIGE7CisgICAgICAgIHNoaWZ0MTI4UmlnaHQoIGFTaWcwLCAwLCAxLCAmYVNpZzAsICZhU2lnMSApOworICAgICAgICBleHBEaWZmID0gMDsKKyAgICB9CisgICAgcSA9ICggYlNpZyA8PSBhU2lnMCApOworICAgIGlmICggcSApIGFTaWcwIC09IGJTaWc7CisgICAgZXhwRGlmZiAtPSA2NDsKKyAgICB3aGlsZSAoIDAgPCBleHBEaWZmICkgeworICAgICAgICBxID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnMCwgYVNpZzEsIGJTaWcgKTsKKyAgICAgICAgcSA9ICggMiA8IHEgKSA/IHEgLSAyIDogMDsKKyAgICAgICAgbXVsNjRUbzEyOCggYlNpZywgcSwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICAgICAgc3ViMTI4KCBhU2lnMCwgYVNpZzEsIHRlcm0wLCB0ZXJtMSwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgc2hvcnRTaGlmdDEyOExlZnQoIGFTaWcwLCBhU2lnMSwgNjIsICZhU2lnMCwgJmFTaWcxICk7CisgICAgICAgIGV4cERpZmYgLT0gNjI7CisgICAgfQorICAgIGV4cERpZmYgKz0gNjQ7CisgICAgaWYgKCAwIDwgZXhwRGlmZiApIHsKKyAgICAgICAgcSA9IGVzdGltYXRlRGl2MTI4VG82NCggYVNpZzAsIGFTaWcxLCBiU2lnICk7CisgICAgICAgIHEgPSAoIDIgPCBxICkgPyBxIC0gMiA6IDA7CisgICAgICAgIHEgPj49IDY0IC0gZXhwRGlmZjsKKyAgICAgICAgbXVsNjRUbzEyOCggYlNpZywgcTw8KCA2NCAtIGV4cERpZmYgKSwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICAgICAgc3ViMTI4KCBhU2lnMCwgYVNpZzEsIHRlcm0wLCB0ZXJtMSwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgc2hvcnRTaGlmdDEyOExlZnQoIDAsIGJTaWcsIDY0IC0gZXhwRGlmZiwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICAgICAgd2hpbGUgKCBsZTEyOCggdGVybTAsIHRlcm0xLCBhU2lnMCwgYVNpZzEgKSApIHsKKyAgICAgICAgICAgICsrcTsKKyAgICAgICAgICAgIHN1YjEyOCggYVNpZzAsIGFTaWcxLCB0ZXJtMCwgdGVybTEsICZhU2lnMCwgJmFTaWcxICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRlcm0xID0gMDsKKyAgICAgICAgdGVybTAgPSBiU2lnOworICAgIH0KKyAgICBzdWIxMjgoIHRlcm0wLCB0ZXJtMSwgYVNpZzAsIGFTaWcxLCAmYWx0ZXJuYXRlQVNpZzAsICZhbHRlcm5hdGVBU2lnMSApOworICAgIGlmICggICAgbHQxMjgoIGFsdGVybmF0ZUFTaWcwLCBhbHRlcm5hdGVBU2lnMSwgYVNpZzAsIGFTaWcxICkKKyAgICAgICAgIHx8ICggICAgZXExMjgoIGFsdGVybmF0ZUFTaWcwLCBhbHRlcm5hdGVBU2lnMSwgYVNpZzAsIGFTaWcxICkKKyAgICAgICAgICAgICAgJiYgKCBxICYgMSApICkKKyAgICAgICApIHsKKyAgICAgICAgYVNpZzAgPSBhbHRlcm5hdGVBU2lnMDsKKyAgICAgICAgYVNpZzEgPSBhbHRlcm5hdGVBU2lnMTsKKyAgICAgICAgelNpZ24gPSAhIHpTaWduOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXR4ODAoCisgICAgICAgICAgICA4MCwgelNpZ24sIGJFeHAgKyBleHBEaWZmLCBhU2lnMCwgYVNpZzEgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3ZhbHVlIGBhJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQKK2ZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdHg4MCBmbG9hdHg4MF9zcXJ0KCBmbG9hdHg4MCBhICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHAsIHpFeHA7CisgICAgYml0czY0IGFTaWcwLCBhU2lnMSwgelNpZzAsIHpTaWcxOworICAgIGJpdHM2NCByZW0wLCByZW0xLCByZW0yLCByZW0zLCB0ZXJtMCwgdGVybTEsIHRlcm0yLCB0ZXJtMzsKKyAgICBiaXRzNjQgc2hpZnRlZFJlbTAsIHNoaWZ0ZWRSZW0xOworICAgIGZsb2F0eDgwIHo7CisKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAoYml0czY0KSAoIGFTaWcwPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGEgKTsKKyAgICAgICAgaWYgKCAhIGFTaWduICkgcmV0dXJuIGE7CisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisgICAgaWYgKCBhU2lnbiApIHsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnMCApID09IDAgKSByZXR1cm4gYTsKKyBpbnZhbGlkOgorICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHoubG93ID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93OworICAgICAgICB6LmhpZ2ggPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICByZXR1cm4gejsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYVNpZzAgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIDAsIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXR4ODBTdWJub3JtYWwoIGFTaWcwLCAmYUV4cCwgJmFTaWcwICk7CisgICAgfQorICAgIHpFeHAgPSAoICggYUV4cCAtIDB4M0ZGRiApPj4xICkgKyAweDNGRkY7CisgICAgelNpZzAgPSBlc3RpbWF0ZVNxcnQzMiggYUV4cCwgYVNpZzA+PjMyICk7CisgICAgelNpZzAgPDw9IDMxOworICAgIGFTaWcxID0gMDsKKyAgICBzaGlmdDEyOFJpZ2h0KCBhU2lnMCwgMCwgKCBhRXhwICYgMSApICsgMiwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICB6U2lnMCA9IGVzdGltYXRlRGl2MTI4VG82NCggYVNpZzAsIGFTaWcxLCB6U2lnMCApICsgelNpZzAgKyA0OworICAgIGlmICggMCA8PSAoc2JpdHM2NCkgelNpZzAgKSB6U2lnMCA9IExJVDY0KCAweEZGRkZGRkZGRkZGRkZGRkYgKTsKKyAgICBzaG9ydFNoaWZ0MTI4TGVmdCggYVNpZzAsIGFTaWcxLCAyLCAmYVNpZzAsICZhU2lnMSApOworICAgIG11bDY0VG8xMjgoIHpTaWcwLCB6U2lnMCwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICBzdWIxMjgoIGFTaWcwLCBhU2lnMSwgdGVybTAsIHRlcm0xLCAmcmVtMCwgJnJlbTEgKTsKKyAgICB3aGlsZSAoIChzYml0czY0KSByZW0wIDwgMCApIHsKKyAgICAgICAgLS16U2lnMDsKKyAgICAgICAgc2hvcnRTaGlmdDEyOExlZnQoIDAsIHpTaWcwLCAxLCAmdGVybTAsICZ0ZXJtMSApOworICAgICAgICB0ZXJtMSB8PSAxOworICAgICAgICBhZGQxMjgoIHJlbTAsIHJlbTEsIHRlcm0wLCB0ZXJtMSwgJnJlbTAsICZyZW0xICk7CisgICAgfQorICAgIHNob3J0U2hpZnQxMjhMZWZ0KCByZW0wLCByZW0xLCA2MywgJnNoaWZ0ZWRSZW0wLCAmc2hpZnRlZFJlbTEgKTsKKyAgICB6U2lnMSA9IGVzdGltYXRlRGl2MTI4VG82NCggc2hpZnRlZFJlbTAsIHNoaWZ0ZWRSZW0xLCB6U2lnMCApOworICAgIGlmICggKGJpdHM2NCkgKCB6U2lnMTw8MSApIDw9IDEwICkgeworICAgICAgICBpZiAoIHpTaWcxID09IDAgKSB6U2lnMSA9IDE7CisgICAgICAgIG11bDY0VG8xMjgoIHpTaWcwLCB6U2lnMSwgJnRlcm0xLCAmdGVybTIgKTsKKyAgICAgICAgc2hvcnRTaGlmdDEyOExlZnQoIHRlcm0xLCB0ZXJtMiwgMSwgJnRlcm0xLCAmdGVybTIgKTsKKyAgICAgICAgc3ViMTI4KCByZW0xLCAwLCB0ZXJtMSwgdGVybTIsICZyZW0xLCAmcmVtMiApOworICAgICAgICBtdWw2NFRvMTI4KCB6U2lnMSwgelNpZzEsICZ0ZXJtMiwgJnRlcm0zICk7CisgICAgICAgIHN1YjE5MiggcmVtMSwgcmVtMiwgMCwgMCwgdGVybTIsIHRlcm0zLCAmcmVtMSwgJnJlbTIsICZyZW0zICk7CisgICAgICAgIHdoaWxlICggKHNiaXRzNjQpIHJlbTEgPCAwICkgeworICAgICAgICAgICAgLS16U2lnMTsKKyAgICAgICAgICAgIHNob3J0U2hpZnQxOTJMZWZ0KCAwLCB6U2lnMCwgelNpZzEsIDEsICZ0ZXJtMSwgJnRlcm0yLCAmdGVybTMgKTsKKyAgICAgICAgICAgIHRlcm0zIHw9IDE7CisgICAgICAgICAgICBhZGQxOTIoCisgICAgICAgICAgICAgICAgcmVtMSwgcmVtMiwgcmVtMywgdGVybTEsIHRlcm0yLCB0ZXJtMywgJnJlbTEsICZyZW0yLCAmcmVtMyApOworICAgICAgICB9CisgICAgICAgIHpTaWcxIHw9ICggKCByZW0xIHwgcmVtMiB8IHJlbTMgKSAhPSAwICk7CisgICAgfQorICAgIHJldHVybgorICAgICAgICByb3VuZEFuZFBhY2tGbG9hdHg4MCgKKyAgICAgICAgICAgIGZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbiwgMCwgekV4cCwgelNpZzAsIHpTaWcxICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMKK2VxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGNvbXBhcmlzb24gaXMKK3BlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctcG9pbnQKK0FyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdHg4MF9lcSggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiApCit7CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApICkKKyAgICAgICAgIHx8ICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTw8MSApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCAgICBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBhICkKKyAgICAgICAgICAgICB8fCBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybgorICAgICAgICAgICAoIGEubG93ID09IGIubG93ICkKKyAgICAgICAgJiYgKCAgICAoIGEuaGlnaCA9PSBiLmhpZ2ggKQorICAgICAgICAgICAgIHx8ICggICAgKCBhLmxvdyA9PSAwICkKKyAgICAgICAgICAgICAgICAgICYmICggKGJpdHMxNikgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgPT0gMCApICkKKyAgICAgICAgICAgKTsKKworfQorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmV0dXJucyAxIGlmIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcworbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlCitjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK0Zsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdHg4MF9sZSggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApICkKKyAgICAgICAgIHx8ICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTw8MSApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICBhU2lnbgorICAgICAgICAgICAgfHwgKCAgICAoICggKGJpdHMxNikgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgKSB8IGEubG93IHwgYi5sb3cgKQorICAgICAgICAgICAgICAgICA9PSAwICk7CisgICAgfQorICAgIHJldHVybgorICAgICAgICAgIGFTaWduID8gbGUxMjgoIGIuaGlnaCwgYi5sb3csIGEuaGlnaCwgYS5sb3cgKQorICAgICAgICA6IGxlMTI4KCBhLmhpZ2gsIGEubG93LCBiLmhpZ2gsIGIubG93ICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMKK2xlc3MgdGhhbiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBjb21wYXJpc29uCitpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50CitBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXR4ODBfbHQoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworCisgICAgaWYgKCAgICAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBhICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKGJpdHM2NCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk8PDEgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKGJpdHM2NCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk8PDEgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgYVNpZ24KKyAgICAgICAgICAgICYmICggICAgKCAoIChiaXRzMTYpICggKCBhLmhpZ2ggfCBiLmhpZ2ggKTw8MSApICkgfCBhLmxvdyB8IGIubG93ICkKKyAgICAgICAgICAgICAgICAgIT0gMCApOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICBhU2lnbiA/IGx0MTI4KCBiLmhpZ2gsIGIubG93LCBhLmhpZ2gsIGEubG93ICkKKyAgICAgICAgOiBsdDEyOCggYS5oaWdoLCBhLmxvdywgYi5oaWdoLCBiLmxvdyApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGVxdWFsCit0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBpbnZhbGlkIGV4Y2VwdGlvbiBpcworcmFpc2VkIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgTmFOLiAgT3RoZXJ3aXNlLCB0aGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQKK2FjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXR4ODBfZXFfc2lnbmFsaW5nKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiICkKK3sKKworICAgIGlmICggICAgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYSApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmIChiaXRzNjQpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApPDwxICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmIChiaXRzNjQpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYiApPDwxICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICAgKCBhLmxvdyA9PSBiLmxvdyApCisgICAgICAgICYmICggICAgKCBhLmhpZ2ggPT0gYi5oaWdoICkKKyAgICAgICAgICAgICB8fCAoICAgICggYS5sb3cgPT0gMCApCisgICAgICAgICAgICAgICAgICAmJiAoIChiaXRzMTYpICggKCBhLmhpZ2ggfCBiLmhpZ2ggKTw8MSApID09IDAgKSApCisgICAgICAgICAgICk7CisKK30KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JldHVybnMgMSBpZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcwordGhhbiBvciBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMKK2RvIG5vdCBjYXVzZSBhbiBleGNlcHRpb24uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcKK3RvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxhZyBmbG9hdHg4MF9sZV9xdWlldCggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApICkKKyAgICAgICAgIHx8ICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoYml0czY0KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTw8MSApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCAgICBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBhICkKKyAgICAgICAgICAgICB8fCBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgYVNpZ24KKyAgICAgICAgICAgIHx8ICggICAgKCAoIChiaXRzMTYpICggKCBhLmhpZ2ggfCBiLmhpZ2ggKTw8MSApICkgfCBhLmxvdyB8IGIubG93ICkKKyAgICAgICAgICAgICAgICAgPT0gMCApOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICBhU2lnbiA/IGxlMTI4KCBiLmhpZ2gsIGIubG93LCBhLmhpZ2gsIGEubG93ICkKKyAgICAgICAgOiBsZTEyOCggYS5oaWdoLCBhLmxvdywgYi5oaWdoLCBiLmxvdyApOworCit9CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZXR1cm5zIDEgaWYgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGxlc3MKK3RoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdCBjYXVzZQorYW4gZXhjZXB0aW9uLiAgT3RoZXJ3aXNlLCB0aGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZQorSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ZsYWcgZmxvYXR4ODBfbHRfcXVpZXQoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIgKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworCisgICAgaWYgKCAgICAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBhICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKGJpdHM2NCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk8PDEgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKGJpdHM2NCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk8PDEgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggICAgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYSApCisgICAgICAgICAgICAgfHwgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgIGFTaWduCisgICAgICAgICAgICAmJiAoICAgICggKCAoYml0czE2KSAoICggYS5oaWdoIHwgYi5oaWdoICk8PDEgKSApIHwgYS5sb3cgfCBiLmxvdyApCisgICAgICAgICAgICAgICAgICE9IDAgKTsKKyAgICB9CisgICAgcmV0dXJuCisgICAgICAgICAgYVNpZ24gPyBsdDEyOCggYi5oaWdoLCBiLmxvdywgYS5oaWdoLCBhLmxvdyApCisgICAgICAgIDogbHQxMjgoIGEuaGlnaCwgYS5sb3csIGIuaGlnaCwgYi5sb3cgKTsKKworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LmggYi9hcmNoL2FybS9ud2ZwZS9zb2Z0ZmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTE3NDMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LmgKQEAgLTAsMCArMSwyNzggQEAKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBDIGhlYWRlciBmaWxlIGlzIHBhcnQgb2YgdGhlIFNvZnRGbG9hdCBJRUMvSUVFRSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYyBQYWNrYWdlLCBSZWxlYXNlIDIuCisKK1dyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKK0ludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKK05hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCitvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKK3Byb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKK292ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KK2lzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBXZWIgcGFnZSBgaHR0cDovL0hUVFAuQ1MuQmVya2VsZXkuRURVL35qaGF1c2VyLworYXJpdGhtZXRpYy9zb2Z0ZmxvYXQuaHRtbCcuCisKK1RISVMgU09GVFdBUkUgSVMgRElTVFJJQlVURUQgQVMgSVMsIEZPUiBGUkVFLiAgQWx0aG91Z2ggcmVhc29uYWJsZSBlZmZvcnQKK2hhcyBiZWVuIG1hZGUgdG8gYXZvaWQgaXQsIFRISVMgU09GVFdBUkUgTUFZIENPTlRBSU4gRkFVTFRTIFRIQVQgV0lMTCBBVAorVElNRVMgUkVTVUxUIElOIElOQ09SUkVDVCBCRUhBVklPUi4gIFVTRSBPRiBUSElTIFNPRlRXQVJFIElTIFJFU1RSSUNURUQgVE8KK1BFUlNPTlMgQU5EIE9SR0FOSVpBVElPTlMgV0hPIENBTiBBTkQgV0lMTCBUQUtFIEZVTEwgUkVTUE9OU0lCSUxJVFkgRk9SIEFOWQorQU5EIEFMTCBMT1NTRVMsIENPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBBUklTSU5HIEZST00gSVRTIFVTRS4KKworRGVyaXZhdGl2ZSB3b3JrcyBhcmUgYWNjZXB0YWJsZSwgZXZlbiBmb3IgY29tbWVyY2lhbCBwdXJwb3Nlcywgc28gbG9uZyBhcworKDEpIHRoZXkgaW5jbHVkZSBwcm9taW5lbnQgbm90aWNlIHRoYXQgdGhlIHdvcmsgaXMgZGVyaXZhdGl2ZSwgYW5kICgyKSB0aGV5CitpbmNsdWRlIHByb21pbmVudCBub3RpY2UgYWtpbiB0byB0aGVzZSB0aHJlZSBwYXJhZ3JhcGhzIGZvciB0aG9zZSBwYXJ0cyBvZgordGhpcyBjb2RlIHRoYXQgYXJlIHJldGFpbmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWZuZGVmIF9fU09GVEZMT0FUX0hfXworI2RlZmluZSBfX1NPRlRGTE9BVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIG1hY3JvIGBGTE9BVFg4MCcgbXVzdCBiZSBkZWZpbmVkIHRvIGVuYWJsZSB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbgorZmxvYXRpbmctcG9pbnQgZm9ybWF0IGBmbG9hdHg4MCcuICBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkLCB0aGUKK2BmbG9hdHg4MCcgdHlwZSB3aWxsIG5vdCBiZSBkZWZpbmVkLCBhbmQgbm9uZSBvZiB0aGUgZnVuY3Rpb25zIHRoYXQgZWl0aGVyCitpbnB1dCBvciBvdXRwdXQgdGhlIGBmbG9hdHg4MCcgdHlwZSB3aWxsIGJlIGRlZmluZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIENPTkZJR19GUEVfTldGUEVfWFAKKyNkZWZpbmUgRkxPQVRYODAKKyNlbmRpZgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgSUVDL0lFRUUgZmxvYXRpbmctcG9pbnQgdHlwZXMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBmbG9hdDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZmxvYXQ2NDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBoaWdoOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBsb3c7Cit9IGZsb2F0eDgwOworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgSUVDL0lFRUUgZmxvYXRpbmctcG9pbnQgdW5kZXJmbG93IHRpbmluZXNzLWRldGVjdGlvbiBtb2RlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2V4dGVybiBzaWduZWQgY2hhciBmbG9hdF9kZXRlY3RfdGluaW5lc3M7CitlbnVtIHsKKyAgICBmbG9hdF90aW5pbmVzc19hZnRlcl9yb3VuZGluZyAgPSAwLAorICAgIGZsb2F0X3RpbmluZXNzX2JlZm9yZV9yb3VuZGluZyA9IDEKK307CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBJRUMvSUVFRSBmbG9hdGluZy1wb2ludCByb3VuZGluZyBtb2RlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2V4dGVybiBzaWduZWQgY2hhciBmbG9hdF9yb3VuZGluZ19tb2RlOworZW51bSB7CisgICAgZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuID0gMCwKKyAgICBmbG9hdF9yb3VuZF90b196ZXJvICAgICAgPSAxLAorICAgIGZsb2F0X3JvdW5kX2Rvd24gICAgICAgICA9IDIsCisgICAgZmxvYXRfcm91bmRfdXAgICAgICAgICAgID0gMworfTsKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIElFQy9JRUVFIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBmbGFncy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2V4dGVybiBzaWduZWQgY2hhciBmbG9hdF9leGNlcHRpb25fZmxhZ3M7CitlbnVtIHsKKyAgICBmbG9hdF9mbGFnX2luZXhhY3QgICA9ICAxLAorICAgIGZsb2F0X2ZsYWdfdW5kZXJmbG93ID0gIDIsCisgICAgZmxvYXRfZmxhZ19vdmVyZmxvdyAgPSAgNCwKKyAgICBmbG9hdF9mbGFnX2RpdmJ5emVybyA9ICA4LAorICAgIGZsb2F0X2ZsYWdfaW52YWxpZCAgID0gMTYKK307CisKK1Njb3R0QjogTm92ZW1iZXIgNCwgMTk5OAorQ2hhbmdlZCB0aGUgZW51bWVyYXRpb24gdG8gbWF0Y2ggdGhlIGJpdCBvcmRlciBpbiB0aGUgRlBBMTEuCisqLworCitleHRlcm4gc2lnbmVkIGNoYXIgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzOworZW51bSB7CisgICAgZmxvYXRfZmxhZ19pbnZhbGlkICAgPSAgMSwKKyAgICBmbG9hdF9mbGFnX2RpdmJ5emVybyA9ICAyLAorICAgIGZsb2F0X2ZsYWdfb3ZlcmZsb3cgID0gIDQsCisgICAgZmxvYXRfZmxhZ191bmRlcmZsb3cgPSAgOCwKKyAgICBmbG9hdF9mbGFnX2luZXhhY3QgICA9IDE2Cit9OworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUm91dGluZSB0byByYWlzZSBhbnkgb3IgYWxsIG9mIHRoZSBzb2Z0d2FyZSBJRUMvSUVFRSBmbG9hdGluZy1wb2ludAorZXhjZXB0aW9uIGZsYWdzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3ZvaWQgZmxvYXRfcmFpc2UoIHNpZ25lZCBjaGFyICk7CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBJRUMvSUVFRSBpbnRlZ2VyLXRvLWZsb2F0aW5nLXBvaW50IGNvbnZlcnNpb24gcm91dGluZXMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXQzMiBpbnQzMl90b19mbG9hdDMyKCBzaWduZWQgaW50ICk7CitmbG9hdDY0IGludDMyX3RvX2Zsb2F0NjQoIHNpZ25lZCBpbnQgKTsKKyNpZmRlZiBGTE9BVFg4MAorZmxvYXR4ODAgaW50MzJfdG9fZmxvYXR4ODAoIHNpZ25lZCBpbnQgKTsKKyNlbmRpZgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgSUVDL0lFRUUgc2luZ2xlLXByZWNpc2lvbiBjb252ZXJzaW9uIHJvdXRpbmVzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3NpZ25lZCBpbnQgZmxvYXQzMl90b19pbnQzMiggZmxvYXQzMiApOworc2lnbmVkIGludCBmbG9hdDMyX3RvX2ludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0MzIgKTsKK2Zsb2F0NjQgZmxvYXQzMl90b19mbG9hdDY0KCBmbG9hdDMyICk7CisjaWZkZWYgRkxPQVRYODAKK2Zsb2F0eDgwIGZsb2F0MzJfdG9fZmxvYXR4ODAoIGZsb2F0MzIgKTsKKyNlbmRpZgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgSUVDL0lFRUUgc2luZ2xlLXByZWNpc2lvbiBvcGVyYXRpb25zLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2Zsb2F0MzIgZmxvYXQzMl9yb3VuZF90b19pbnQoIGZsb2F0MzIgKTsKK2Zsb2F0MzIgZmxvYXQzMl9hZGQoIGZsb2F0MzIsIGZsb2F0MzIgKTsKK2Zsb2F0MzIgZmxvYXQzMl9zdWIoIGZsb2F0MzIsIGZsb2F0MzIgKTsKK2Zsb2F0MzIgZmxvYXQzMl9tdWwoIGZsb2F0MzIsIGZsb2F0MzIgKTsKK2Zsb2F0MzIgZmxvYXQzMl9kaXYoIGZsb2F0MzIsIGZsb2F0MzIgKTsKK2Zsb2F0MzIgZmxvYXQzMl9yZW0oIGZsb2F0MzIsIGZsb2F0MzIgKTsKK2Zsb2F0MzIgZmxvYXQzMl9zcXJ0KCBmbG9hdDMyICk7CitjaGFyIGZsb2F0MzJfZXEoIGZsb2F0MzIsIGZsb2F0MzIgKTsKK2NoYXIgZmxvYXQzMl9sZSggZmxvYXQzMiwgZmxvYXQzMiApOworY2hhciBmbG9hdDMyX2x0KCBmbG9hdDMyLCBmbG9hdDMyICk7CitjaGFyIGZsb2F0MzJfZXFfc2lnbmFsaW5nKCBmbG9hdDMyLCBmbG9hdDMyICk7CitjaGFyIGZsb2F0MzJfbGVfcXVpZXQoIGZsb2F0MzIsIGZsb2F0MzIgKTsKK2NoYXIgZmxvYXQzMl9sdF9xdWlldCggZmxvYXQzMiwgZmxvYXQzMiApOworY2hhciBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGZsb2F0MzIgKTsKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIElFQy9JRUVFIGRvdWJsZS1wcmVjaXNpb24gY29udmVyc2lvbiByb3V0aW5lcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzaWduZWQgaW50IGZsb2F0NjRfdG9faW50MzIoIGZsb2F0NjQgKTsKK3NpZ25lZCBpbnQgZmxvYXQ2NF90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdDY0ICk7CitmbG9hdDMyIGZsb2F0NjRfdG9fZmxvYXQzMiggZmxvYXQ2NCApOworI2lmZGVmIEZMT0FUWDgwCitmbG9hdHg4MCBmbG9hdDY0X3RvX2Zsb2F0eDgwKCBmbG9hdDY0ICk7CisjZW5kaWYKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIElFQy9JRUVFIGRvdWJsZS1wcmVjaXNpb24gb3BlcmF0aW9ucy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitmbG9hdDY0IGZsb2F0NjRfcm91bmRfdG9faW50KCBmbG9hdDY0ICk7CitmbG9hdDY0IGZsb2F0NjRfYWRkKCBmbG9hdDY0LCBmbG9hdDY0ICk7CitmbG9hdDY0IGZsb2F0NjRfc3ViKCBmbG9hdDY0LCBmbG9hdDY0ICk7CitmbG9hdDY0IGZsb2F0NjRfbXVsKCBmbG9hdDY0LCBmbG9hdDY0ICk7CitmbG9hdDY0IGZsb2F0NjRfZGl2KCBmbG9hdDY0LCBmbG9hdDY0ICk7CitmbG9hdDY0IGZsb2F0NjRfcmVtKCBmbG9hdDY0LCBmbG9hdDY0ICk7CitmbG9hdDY0IGZsb2F0NjRfc3FydCggZmxvYXQ2NCApOworY2hhciBmbG9hdDY0X2VxKCBmbG9hdDY0LCBmbG9hdDY0ICk7CitjaGFyIGZsb2F0NjRfbGUoIGZsb2F0NjQsIGZsb2F0NjQgKTsKK2NoYXIgZmxvYXQ2NF9sdCggZmxvYXQ2NCwgZmxvYXQ2NCApOworY2hhciBmbG9hdDY0X2VxX3NpZ25hbGluZyggZmxvYXQ2NCwgZmxvYXQ2NCApOworY2hhciBmbG9hdDY0X2xlX3F1aWV0KCBmbG9hdDY0LCBmbG9hdDY0ICk7CitjaGFyIGZsb2F0NjRfbHRfcXVpZXQoIGZsb2F0NjQsIGZsb2F0NjQgKTsKK2NoYXIgZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKCBmbG9hdDY0ICk7CisKKyNpZmRlZiBGTE9BVFg4MAorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgSUVDL0lFRUUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBjb252ZXJzaW9uIHJvdXRpbmVzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3NpZ25lZCBpbnQgZmxvYXR4ODBfdG9faW50MzIoIGZsb2F0eDgwICk7CitzaWduZWQgaW50IGZsb2F0eDgwX3RvX2ludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0eDgwICk7CitmbG9hdDMyIGZsb2F0eDgwX3RvX2Zsb2F0MzIoIGZsb2F0eDgwICk7CitmbG9hdDY0IGZsb2F0eDgwX3RvX2Zsb2F0NjQoIGZsb2F0eDgwICk7CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBJRUMvSUVFRSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIHJvdW5kaW5nIHByZWNpc2lvbi4gIFZhbGlkCit2YWx1ZXMgYXJlIDMyLCA2NCwgYW5kIDgwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2V4dGVybiBzaWduZWQgY2hhciBmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb247CisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBJRUMvSUVFRSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIG9wZXJhdGlvbnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworZmxvYXR4ODAgZmxvYXR4ODBfcm91bmRfdG9faW50KCBmbG9hdHg4MCApOworZmxvYXR4ODAgZmxvYXR4ODBfYWRkKCBmbG9hdHg4MCwgZmxvYXR4ODAgKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX3N1YiggZmxvYXR4ODAsIGZsb2F0eDgwICk7CitmbG9hdHg4MCBmbG9hdHg4MF9tdWwoIGZsb2F0eDgwLCBmbG9hdHg4MCApOworZmxvYXR4ODAgZmxvYXR4ODBfZGl2KCBmbG9hdHg4MCwgZmxvYXR4ODAgKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX3JlbSggZmxvYXR4ODAsIGZsb2F0eDgwICk7CitmbG9hdHg4MCBmbG9hdHg4MF9zcXJ0KCBmbG9hdHg4MCApOworY2hhciBmbG9hdHg4MF9lcSggZmxvYXR4ODAsIGZsb2F0eDgwICk7CitjaGFyIGZsb2F0eDgwX2xlKCBmbG9hdHg4MCwgZmxvYXR4ODAgKTsKK2NoYXIgZmxvYXR4ODBfbHQoIGZsb2F0eDgwLCBmbG9hdHg4MCApOworY2hhciBmbG9hdHg4MF9lcV9zaWduYWxpbmcoIGZsb2F0eDgwLCBmbG9hdHg4MCApOworY2hhciBmbG9hdHg4MF9sZV9xdWlldCggZmxvYXR4ODAsIGZsb2F0eDgwICk7CitjaGFyIGZsb2F0eDgwX2x0X3F1aWV0KCBmbG9hdHg4MCwgZmxvYXR4ODAgKTsKK2NoYXIgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggZmxvYXR4ODAgKTsKKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgZmxhZyBleHRyYWN0RmxvYXQzMlNpZ24oZmxvYXQzMiBhKQoreworCXJldHVybiBhID4+IDMxOworfQorCitzdGF0aWMgaW5saW5lIGZsYWcgZmxvYXQzMl9lcV9ub2NoZWNrKGZsb2F0MzIgYSwgZmxvYXQzMiBiKQoreworCXJldHVybiAoYSA9PSBiKSB8fCAoKGJpdHMzMikgKChhIHwgYikgPDwgMSkgPT0gMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZmxhZyBmbG9hdDMyX2x0X25vY2hlY2soZmxvYXQzMiBhLCBmbG9hdDMyIGIpCit7CisJZmxhZyBhU2lnbiwgYlNpZ247CisKKwlhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbihhKTsKKwliU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbihiKTsKKwlpZiAoYVNpZ24gIT0gYlNpZ24pCisJCXJldHVybiBhU2lnbiAmJiAoKGJpdHMzMikgKChhIHwgYikgPDwgMSkgIT0gMCk7CisJcmV0dXJuIChhICE9IGIpICYmIChhU2lnbiBeIChhIDwgYikpOworfQorCitzdGF0aWMgaW5saW5lIGZsYWcgZXh0cmFjdEZsb2F0NjRTaWduKGZsb2F0NjQgYSkKK3sKKwlyZXR1cm4gYSA+PiA2MzsKK30KKworc3RhdGljIGlubGluZSBmbGFnIGZsb2F0NjRfZXFfbm9jaGVjayhmbG9hdDY0IGEsIGZsb2F0NjQgYikKK3sKKwlyZXR1cm4gKGEgPT0gYikgfHwgKChiaXRzNjQpICgoYSB8IGIpIDw8IDEpID09IDApOworfQorCitzdGF0aWMgaW5saW5lIGZsYWcgZmxvYXQ2NF9sdF9ub2NoZWNrKGZsb2F0NjQgYSwgZmxvYXQ2NCBiKQoreworCWZsYWcgYVNpZ24sIGJTaWduOworCisJYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oYSk7CisJYlNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oYik7CisJaWYgKGFTaWduICE9IGJTaWduKQorCQlyZXR1cm4gYVNpZ24gJiYgKChiaXRzNjQpICgoYSB8IGIpIDw8IDEpICE9IDApOworCXJldHVybiAoYSAhPSBiKSAmJiAoYVNpZ24gXiAoYSA8IGIpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9LY29uZmlnIGIvYXJjaC9hcm0vb3Byb2ZpbGUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQzNzczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvS2NvbmZpZwpAQCAtMCwwICsxLDIzIEBACisKK21lbnUgIlByb2ZpbGluZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisKK2NvbmZpZyBQUk9GSUxJTkcKKwlib29sICJQcm9maWxpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgZXh0ZW5kZWQgcHJvZmlsaW5nIHN1cHBvcnQgbWVjaGFuaXNtcyB1c2VkCisJICBieSBwcm9maWxlcnMgc3VjaCBhcyBPUHJvZmlsZS4KKworCitjb25maWcgT1BST0ZJTEUKKwl0cmlzdGF0ZSAiT1Byb2ZpbGUgc3lzdGVtIHByb2ZpbGluZyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBST0ZJTElORworCWhlbHAKKwkgIE9Qcm9maWxlIGlzIGEgcHJvZmlsaW5nIHN5c3RlbSBjYXBhYmxlIG9mIHByb2ZpbGluZyB0aGUKKwkgIHdob2xlIHN5c3RlbSwgaW5jbHVkZSB0aGUga2VybmVsLCBrZXJuZWwgbW9kdWxlcywgbGlicmFyaWVzLAorCSAgYW5kIGFwcGxpY2F0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvYXJtL29wcm9maWxlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWE2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACitvYmotJChDT05GSUdfT1BST0ZJTEUpICs9IG9wcm9maWxlLm8KKworRFJJVkVSX09CSlMgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi9kcml2ZXJzL29wcm9maWxlLywgXAorCQlvcHJvZi5vIGNwdV9idWZmZXIubyBidWZmZXJfc3luYy5vIFwKKwkJZXZlbnRfYnVmZmVyLm8gb3Byb2ZpbGVfZmlsZXMubyBcCisJCW9wcm9maWxlZnMubyBvcHJvZmlsZV9zdGF0cy5vIFwKKwkJdGltZXJfaW50Lm8gKQorCitvcHJvZmlsZS15CQkJCTo9ICQoRFJJVkVSX09CSlMpIGluaXQubworb3Byb2ZpbGUtJChDT05GSUdfQ1BVX1hTQ0FMRSkJCSs9IGNvbW1vbi5vIG9wX21vZGVsX3hzY2FsZS5vCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3ZGRlOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jCkBAIC0wLDAgKzEsMTU2IEBACisvKioKKyAqIEBmaWxlIGNvbW1vbi5jCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwNCBPcHJvZmlsZSBBdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgWndhbmUgTXdhaWthbWJvCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCisjaW5jbHVkZSAib3BfY291bnRlci5oIgorI2luY2x1ZGUgIm9wX2FybV9tb2RlbC5oIgorCitzdGF0aWMgc3RydWN0IG9wX2FybV9tb2RlbF9zcGVjICpwbXVfbW9kZWw7CitzdGF0aWMgaW50IHBtdV9lbmFibGVkOworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgcG11X3NlbTsKKworc3RhdGljIGludCBwbXVfc3RhcnQodm9pZCk7CitzdGF0aWMgaW50IHBtdV9zZXR1cCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBtdV9zdG9wKHZvaWQpOworc3RhdGljIGludCBwbXVfY3JlYXRlX2ZpbGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZGVudHJ5ICopOworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHBtdV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpZiAocG11X2VuYWJsZWQpCisJCXBtdV9zdG9wKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG11X3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCWlmIChwbXVfZW5hYmxlZCkKKwkJcG11X3N0YXJ0KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG9wcm9maWxlX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoIm9wcm9maWxlIiksCisJLnJlc3VtZQkJPSBwbXVfcmVzdW1lLAorCS5zdXNwZW5kCT0gcG11X3N1c3BlbmQsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX29wcm9maWxlID0geworCS5pZAkJPSAwLAorCS5jbHMJCT0gJm9wcm9maWxlX3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9kcml2ZXJmcyh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoIShyZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJm9wcm9maWxlX3N5c2NsYXNzKSkpCisJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX29wcm9maWxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkICBleGl0X2RyaXZlcmZzKHZvaWQpCit7CisJc3lzZGV2X3VucmVnaXN0ZXIoJmRldmljZV9vcHJvZmlsZSk7CisJc3lzZGV2X2NsYXNzX3VucmVnaXN0ZXIoJm9wcm9maWxlX3N5c2NsYXNzKTsKK30KKyNlbHNlCisjZGVmaW5lIGluaXRfZHJpdmVyZnMoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGV4aXRfZHJpdmVyZnMoKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyBjb3VudGVyX2NvbmZpZ1tPUF9NQVhfQ09VTlRFUl07CisKK3N0YXRpYyBpbnQgcG11X2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpyb290KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBtdV9tb2RlbC0+bnVtX2NvdW50ZXJzOyBpKyspIHsKKwkJc3RydWN0IGRlbnRyeSAqZGlyOworCQljaGFyIGJ1ZlsyXTsKKworCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZCIsIGkpOworCQlkaXIgPSBvcHJvZmlsZWZzX21rZGlyKHNiLCByb290LCBidWYpOworCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZW5hYmxlZCIsICZjb3VudGVyX2NvbmZpZ1tpXS5lbmFibGVkKTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImV2ZW50IiwgJmNvdW50ZXJfY29uZmlnW2ldLmV2ZW50KTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImNvdW50IiwgJmNvdW50ZXJfY29uZmlnW2ldLmNvdW50KTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgInVuaXRfbWFzayIsICZjb3VudGVyX2NvbmZpZ1tpXS51bml0X21hc2spOworCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAia2VybmVsIiwgJmNvdW50ZXJfY29uZmlnW2ldLmtlcm5lbCk7CisJCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJ1c2VyIiwgJmNvdW50ZXJfY29uZmlnW2ldLnVzZXIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtdV9zZXR1cCh2b2lkKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2soJm9wcm9maWxlZnNfbG9jayk7CisJcmV0ID0gcG11X21vZGVsLT5zZXR1cF9jdHJzKCk7CisJc3Bpbl91bmxvY2soJm9wcm9maWxlZnNfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbXVfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVCVVNZOworCisJZG93bigmcG11X3NlbSk7CisJaWYgKCFwbXVfZW5hYmxlZCkgeworCQlyZXQgPSBwbXVfbW9kZWwtPnN0YXJ0KCk7CisJCXBtdV9lbmFibGVkID0gIXJldDsKKwl9CisJdXAoJnBtdV9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBtdV9zdG9wKHZvaWQpCit7CisJZG93bigmcG11X3NlbSk7CisJaWYgKHBtdV9lbmFibGVkKQorCQlwbXVfbW9kZWwtPnN0b3AoKTsKKwlwbXVfZW5hYmxlZCA9IDA7CisJdXAoJnBtdV9zZW0pOworfQorCitpbnQgX19pbml0IHBtdV9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMsIHN0cnVjdCBvcF9hcm1fbW9kZWxfc3BlYyAqc3BlYykKK3sKKwlpbml0X01VVEVYKCZwbXVfc2VtKTsKKworCWlmIChzcGVjLT5pbml0KCkgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBtdV9tb2RlbCA9IHNwZWM7CisJaW5pdF9kcml2ZXJmcygpOworCW9wcy0+Y3JlYXRlX2ZpbGVzID0gcG11X2NyZWF0ZV9maWxlczsKKwlvcHMtPnNldHVwID0gcG11X3NldHVwOworCW9wcy0+c2h1dGRvd24gPSBwbXVfc3RvcDsKKwlvcHMtPnN0YXJ0ID0gcG11X3N0YXJ0OworCW9wcy0+c3RvcCA9IHBtdV9zdG9wOworCW9wcy0+Y3B1X3R5cGUgPSBwbXVfbW9kZWwtPm5hbWU7CisJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nICVzIFBNVVxuIiwgc3BlYy0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwbXVfZXhpdCh2b2lkKQoreworCWlmIChwbXVfbW9kZWwpIHsKKwkJZXhpdF9kcml2ZXJmcygpOworCQlwbXVfbW9kZWwgPSBOVUxMOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTNkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9pbml0LmMKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBAZmlsZSBpbml0LmMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDA0IE9wcm9maWxlIEF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBad2FuZSBNd2Fpa2FtYm8KKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlICJvcF9hcm1fbW9kZWwuaCIKKworaW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKK3sKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworI2lmZGVmIENPTkZJR19DUFVfWFNDQUxFCisJcmV0ID0gcG11X2luaXQob3BzLCAmb3BfeHNjYWxlX3NwZWMpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19DUFVfWFNDQUxFCisJcG11X2V4aXQoKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmggYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9hcm1fbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRjYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmgKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBAZmlsZSBvcF9hcm1fbW9kZWwuaAorICogaW50ZXJmYWNlIHRvIEFSTSBtYWNoaW5lIHNwZWNpZmljIG9wZXJhdGlvbnMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDA0IE9wcm9maWxlIEF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBad2FuZSBNd2Fpa2FtYm8KKyAqLworCisjaWZuZGVmIE9QX0FSTV9NT0RFTF9ICisjZGVmaW5lIE9QX0FSTV9NT0RFTF9ICisKK3N0cnVjdCBvcF9hcm1fbW9kZWxfc3BlYyB7CisJaW50ICgqaW5pdCkodm9pZCk7CisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwlpbnQgKCpzZXR1cF9jdHJzKSh2b2lkKTsKKwlpbnQgKCpzdGFydCkodm9pZCk7CisJdm9pZCAoKnN0b3ApKHZvaWQpOworCWNoYXIgKm5hbWU7Cit9OworCisjaWZkZWYgQ09ORklHX0NQVV9YU0NBTEUKK2V4dGVybiBzdHJ1Y3Qgb3BfYXJtX21vZGVsX3NwZWMgb3BfeHNjYWxlX3NwZWM7CisjZW5kaWYKKworZXh0ZXJuIGludCBfX2luaXQgcG11X2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcywgc3RydWN0IG9wX2FybV9tb2RlbF9zcGVjICpzcGVjKTsKK2V4dGVybiB2b2lkIHBtdV9leGl0KHZvaWQpOworI2VuZGlmIC8qIE9QX0FSTV9NT0RFTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9jb3VudGVyLmggYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9jb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYzFkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL29wX2NvdW50ZXIuaApAQCAtMCwwICsxLDI5IEBACisvKioKKyAqIEBmaWxlIG9wX2NvdW50ZXIuaAorICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDQgT3Byb2ZpbGUgQXV0aG9ycworICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIFp3YW5lIE13YWlrYW1ibworICovCisKKyNpZm5kZWYgT1BfQ09VTlRFUl9ICisjZGVmaW5lIE9QX0NPVU5URVJfSAorCisjZGVmaW5lIE9QX01BWF9DT1VOVEVSIDUKKworLyogUGVyIHBlcmZvcm1hbmNlIG1vbml0b3IgY29uZmlndXJhdGlvbiBhcyBzZXQgdmlhCisgKiBvcHJvZmlsZWZzLgorICovCitzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgeworCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJdW5zaWduZWQgbG9uZyBlbmFibGVkOworCXVuc2lnbmVkIGxvbmcgZXZlbnQ7CisJdW5zaWduZWQgbG9uZyB1bml0X21hc2s7CisJdW5zaWduZWQgbG9uZyBrZXJuZWw7CisJdW5zaWduZWQgbG9uZyB1c2VyOworfTsKKworZXh0ZXJuIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyBjb3VudGVyX2NvbmZpZ1tdOworCisjZW5kaWYgLyogT1BfQ09VTlRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF94c2NhbGUuYyBiL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjBiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF94c2NhbGUuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyoqCisgKiBAZmlsZSBvcF9tb2RlbF94c2NhbGUuYworICogWFNjYWxlIFBlcmZvcm1hbmNlIE1vbml0b3IgRHJpdmVyCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMC0yMDA0IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAbXZpc3RhLmNvbT4KKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDAtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIEluYworICogQHJlbWFyayBDb3B5cmlnaHQgMjAwNCBEYXZlIEppYW5nIDxkYXZlLmppYW5nQGludGVsLmNvbT4KKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDQgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDQgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBhcm0ubGludXgub3JnLnVrPgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwNCBPUHJvZmlsZSBBdXRob3JzCisgKgorICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIFp3YW5lIE13YWlrYW1ibworICovCisKKy8qICNkZWZpbmUgREVCVUcgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJvcF9jb3VudGVyLmgiCisjaW5jbHVkZSAib3BfYXJtX21vZGVsLmgiCisKKyNkZWZpbmUJUE1VX0VOQUJMRQkweDAwMQkvKiBFbmFibGUgY291bnRlcnMgKi8KKyNkZWZpbmUgUE1OX1JFU0VUCTB4MDAyCS8qIFJlc2V0IGV2ZW50IGNvdW50ZXJzICovCisjZGVmaW5lCUNDTlRfUkVTRVQJMHgwMDQJLyogUmVzZXQgY2xvY2sgY291bnRlciAqLworI2RlZmluZQlQTVVfUkVTRVQJKENDTlRfUkVTRVQgfCBQTU5fUkVTRVQpCisjZGVmaW5lIFBNVV9DTlQ2NAkweDAwOAkvKiBNYWtlIENDTlQgY291bnQgZXZlcnkgNjR0aCBjeWNsZSAqLworCisvKiBUT0RPIGRvIHJ1bnRpbWUgZGV0ZWN0aW9uICovCisjaWZkZWYgQ09ORklHX0FSQ0hfSU9QMzEwCisjZGVmaW5lIFhTQ0FMRV9QTVVfSVJRICBJUlFfWFM4MDIwMF9QTVUKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX0lPUDMyMQorI2RlZmluZSBYU0NBTEVfUE1VX0lSUSAgSVJRX0lPUDMyMV9DT1JFX1BNVQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfSU9QMzMxCisjZGVmaW5lIFhTQ0FMRV9QTVVfSVJRICBJUlFfSU9QMzMxX0NPUkVfUE1VCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9QWEEKKyNkZWZpbmUgWFNDQUxFX1BNVV9JUlEgIElSUV9QTVUKKyNlbmRpZgorCisvKgorICogRGlmZmVyZW50IHR5cGVzIG9mIGV2ZW50cyB0aGF0IGNhbiBiZSBjb3VudGVkIGJ5IHRoZSBYU2NhbGUgUE1VCisgKiBhcyB1c2VkIGJ5IE9wcm9maWxlIHVzZXJzcGFjZS4gSGVyZSBwcmltYXJpbHkgZm9yIGRvY3VtZW50YXRpb24KKyAqIHB1cnBvc2VzLgorICovCisKKyNkZWZpbmUgRVZUX0lDQUNIRV9NSVNTCQkJMHgwMAorI2RlZmluZQlFVlRfSUNBQ0hFX05PX0RFTElWRVIJCTB4MDEKKyNkZWZpbmUJRVZUX0RBVEFfU1RBTEwJCQkweDAyCisjZGVmaW5lCUVWVF9JVExCX01JU1MJCQkweDAzCisjZGVmaW5lCUVWVF9EVExCX01JU1MJCQkweDA0CisjZGVmaW5lCUVWVF9CUkFOQ0gJCQkweDA1CisjZGVmaW5lCUVWVF9CUkFOQ0hfTUlTUwkJCTB4MDYKKyNkZWZpbmUJRVZUX0lOU1RSVUNUSU9OCQkJMHgwNworI2RlZmluZQlFVlRfRENBQ0hFX0ZVTExfU1RBTEwJCTB4MDgKKyNkZWZpbmUJRVZUX0RDQUNIRV9GVUxMX1NUQUxMX0NPTlRJRwkweDA5CisjZGVmaW5lCUVWVF9EQ0FDSEVfQUNDRVNTCQkweDBBCisjZGVmaW5lCUVWVF9EQ0FDSEVfTUlTUwkJCTB4MEIKKyNkZWZpbmUJRVZUX0RDQUNFX1dSSVRFX0JBQ0sJCTB4MEMKKyNkZWZpbmUJRVZUX1BDX0NIQU5HRUQJCQkweDBECisjZGVmaW5lCUVWVF9CQ1VfUkVRVUVTVAkJCTB4MTAKKyNkZWZpbmUJRVZUX0JDVV9GVUxMCQkJMHgxMQorI2RlZmluZQlFVlRfQkNVX0RSQUlOCQkJMHgxMgorI2RlZmluZQlFVlRfQkNVX0VDQ19OT19FTE9HCQkweDE0CisjZGVmaW5lCUVWVF9CQ1VfMV9CSVRfRVJSCQkweDE1CisjZGVmaW5lCUVWVF9STVcJCQkJMHgxNgorLyogRVZUX0NDTlQgaXMgbm90IGhhcmR3YXJlIGRlZmluZWQgKi8KKyNkZWZpbmUgRVZUX0NDTlQJCQkweEZFCisjZGVmaW5lIEVWVF9VTlVTRUQJCQkweEZGCisKK3N0cnVjdCBwbXVfY291bnRlciB7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBvdmY7CisJdW5zaWduZWQgbG9uZyByZXNldF9jb3VudGVyOworfTsKKworZW51bSB7IENDTlQsIFBNTjAsIFBNTjEsIFBNTjIsIFBNTjMsIE1BWF9DT1VOVEVSUyB9OworCitzdGF0aWMgc3RydWN0IHBtdV9jb3VudGVyIHJlc3VsdHNbTUFYX0NPVU5URVJTXTsKKworLyoKKyAqIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhlIFBNVSBpbiBjdXJyZW50IFhTY2FsZSBwcm9jZXNzb3JzCisgKiB3aXRoIGRpZmZlcmluZyByZWdpc3RlciBsYXlvdXRzIGFuZCBudW1iZXIgb2YgcGVyZm9ybWFuY2UgY291bnRlcnMuCisgKiBlLmcuIElPUDMyMSBpcyB4c2MxIHdoaWxzdCBJT1AzMzEgaXMgeHNjMi4KKyAqIFdlIGRldGVjdCB3aGljaCByZWdpc3RlciBsYXlvdXQgdG8gdXNlIGluIHhzY2FsZV9kZXRlY3RfcG11KCkKKyAqLworZW51bSB7IFBNVV9YU0MxLCBQTVVfWFNDMiB9OworCitzdHJ1Y3QgcG11X3R5cGUgeworCWludCBpZDsKKwljaGFyICpuYW1lOworCWludCBudW1fY291bnRlcnM7CisJdW5zaWduZWQgaW50IGludF9lbmFibGU7CisJdW5zaWduZWQgaW50IGNudF9vdmZbTUFYX0NPVU5URVJTXTsKKwl1bnNpZ25lZCBpbnQgaW50X21hc2tbTUFYX0NPVU5URVJTXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG11X3R5cGUgcG11X3Bhcm1zW10gPSB7CisJeworCQkuaWQJCT0gUE1VX1hTQzEsCisJCS5uYW1lCQk9ICJhcm0veHNjYWxlMSIsCisJCS5udW1fY291bnRlcnMJPSAzLAorCQkuaW50X21hc2sJPSB7IFtQTU4wXSA9IDB4MTAsIFtQTU4xXSA9IDB4MjAsCisJCQkJICAgIFtDQ05UXSA9IDB4NDAgfSwKKwkJLmNudF9vdmYJPSB7IFtDQ05UXSA9IDB4NDAwLCBbUE1OMF0gPSAweDEwMCwKKwkJCQkgICAgW1BNTjFdID0gMHgyMDB9LAorCX0sCisJeworCQkuaWQJCT0gUE1VX1hTQzIsCisJCS5uYW1lCQk9ICJhcm0veHNjYWxlMiIsCisJCS5udW1fY291bnRlcnMJPSA1LAorCQkuaW50X21hc2sJPSB7IFtDQ05UXSA9IDB4MDEsIFtQTU4wXSA9IDB4MDIsCisJCQkJICAgIFtQTU4xXSA9IDB4MDQsIFtQTU4yXSA9IDB4MDgsCisJCQkJICAgIFtQTU4zXSA9IDB4MTAgfSwKKwkJLmNudF9vdmYJPSB7IFtDQ05UXSA9IDB4MDEsIFtQTU4wXSA9IDB4MDIsCisJCQkJICAgIFtQTU4xXSA9IDB4MDQsIFtQTU4yXSA9IDB4MDgsCisJCQkJICAgIFtQTU4zXSA9IDB4MTAgfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbXVfdHlwZSAqcG11OworCitzdGF0aWMgdm9pZCB3cml0ZV9wbW5jKHUzMiB2YWwpCit7CisJaWYgKHBtdS0+aWQgPT0gUE1VX1hTQzEpIHsKKwkJLyogdXBwZXIgNGJpdHMgYW5kIDcsIDExIGFyZSB3cml0ZS1hcy0wICovCisJCXZhbCAmPSAweGZmZmY3N2Y7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibWNyIHAxNCwgMCwgJTAsIGMwLCBjMCwgMCIgOiA6ICJyIiAodmFsKSk7CisJfSBlbHNlIHsKKwkJLyogYml0cyA0LTIzIGFyZSB3cml0ZS1hcy0wLCAyNC0zMSBhcmUgd3JpdGUgaWdub3JlZCAqLworCQl2YWwgJj0gMHhmOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1jciBwMTQsIDAsICUwLCBjMCwgYzEsIDAiIDogOiAiciIgKHZhbCkpOworCX0KK30KKworc3RhdGljIHUzMiByZWFkX3BtbmModm9pZCkKK3sKKwl1MzIgdmFsOworCisJaWYgKHBtdS0+aWQgPT0gUE1VX1hTQzEpCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibXJjIHAxNCwgMCwgJTAsIGMwLCBjMCwgMCIgOiAiPXIiICh2YWwpKTsKKwllbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtcmMgcDE0LCAwLCAlMCwgYzAsIGMxLCAwIiA6ICI9ciIgKHZhbCkpOworCQkvKiBiaXRzIDEtMiBhbmQgNC0yMyBhcmUgcmVhZC11bnByZWRpY3RhYmxlICovCisJCXZhbCAmPSAweGZmMDAwMDA5OworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1MzIgX194c2MxX3JlYWRfY291bnRlcihpbnQgY291bnRlcikKK3sKKwl1MzIgdmFsID0gMDsKKworCXN3aXRjaCAoY291bnRlcikgeworCWNhc2UgQ0NOVDoKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtcmMgcDE0LCAwLCAlMCwgYzEsIGMwLCAwIiA6ICI9ciIgKHZhbCkpOworCQlicmVhazsKKwljYXNlIFBNTjA6CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibXJjIHAxNCwgMCwgJTAsIGMyLCBjMCwgMCIgOiAiPXIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSBQTU4xOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1yYyBwMTQsIDAsICUwLCBjMywgYzAsIDAiIDogIj1yIiAodmFsKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTMyIF9feHNjMl9yZWFkX2NvdW50ZXIoaW50IGNvdW50ZXIpCit7CisJdTMyIHZhbCA9IDA7CisKKwlzd2l0Y2ggKGNvdW50ZXIpIHsKKwljYXNlIENDTlQ6CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibXJjIHAxNCwgMCwgJTAsIGMxLCBjMSwgMCIgOiAiPXIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSBQTU4wOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1yYyBwMTQsIDAsICUwLCBjMCwgYzIsIDAiIDogIj1yIiAodmFsKSk7CisJCWJyZWFrOworCWNhc2UgUE1OMToKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtcmMgcDE0LCAwLCAlMCwgYzEsIGMyLCAwIiA6ICI9ciIgKHZhbCkpOworCQlicmVhazsKKwljYXNlIFBNTjI6CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibXJjIHAxNCwgMCwgJTAsIGMyLCBjMiwgMCIgOiAiPXIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSBQTU4zOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1yYyBwMTQsIDAsICUwLCBjMywgYzIsIDAiIDogIj1yIiAodmFsKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTMyIHJlYWRfY291bnRlcihpbnQgY291bnRlcikKK3sKKwl1MzIgdmFsOworCisJaWYgKHBtdS0+aWQgPT0gUE1VX1hTQzEpCisJCXZhbCA9IF9feHNjMV9yZWFkX2NvdW50ZXIoY291bnRlcik7CisJZWxzZQorCQl2YWwgPSBfX3hzYzJfcmVhZF9jb3VudGVyKGNvdW50ZXIpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgX194c2MxX3dyaXRlX2NvdW50ZXIoaW50IGNvdW50ZXIsIHUzMiB2YWwpCit7CisJc3dpdGNoIChjb3VudGVyKSB7CisJY2FzZSBDQ05UOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1jciBwMTQsIDAsICUwLCBjMSwgYzAsIDAiIDogOiAiciIgKHZhbCkpOworCQlicmVhazsKKwljYXNlIFBNTjA6CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibWNyIHAxNCwgMCwgJTAsIGMyLCBjMCwgMCIgOiA6ICJyIiAodmFsKSk7CisJCWJyZWFrOworCWNhc2UgUE1OMToKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtY3IgcDE0LCAwLCAlMCwgYzMsIGMwLCAwIiA6IDogInIiICh2YWwpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX3hzYzJfd3JpdGVfY291bnRlcihpbnQgY291bnRlciwgdTMyIHZhbCkKK3sKKwlzd2l0Y2ggKGNvdW50ZXIpIHsKKwljYXNlIENDTlQ6CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibWNyIHAxNCwgMCwgJTAsIGMxLCBjMSwgMCIgOiA6ICJyIiAodmFsKSk7CisJCWJyZWFrOworCWNhc2UgUE1OMDoKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtY3IgcDE0LCAwLCAlMCwgYzAsIGMyLCAwIiA6IDogInIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSBQTU4xOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1jciBwMTQsIDAsICUwLCBjMSwgYzIsIDAiIDogOiAiciIgKHZhbCkpOworCQlicmVhazsKKwljYXNlIFBNTjI6CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibWNyIHAxNCwgMCwgJTAsIGMyLCBjMiwgMCIgOiA6ICJyIiAodmFsKSk7CisJCWJyZWFrOworCWNhc2UgUE1OMzoKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtY3IgcDE0LCAwLCAlMCwgYzMsIGMyLCAwIiA6IDogInIiICh2YWwpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9jb3VudGVyKGludCBjb3VudGVyLCB1MzIgdmFsKQoreworCWlmIChwbXUtPmlkID09IFBNVV9YU0MxKQorCQlfX3hzYzFfd3JpdGVfY291bnRlcihjb3VudGVyLCB2YWwpOworCWVsc2UKKwkJX194c2MyX3dyaXRlX2NvdW50ZXIoY291bnRlciwgdmFsKTsKK30KKworc3RhdGljIGludCB4c2NhbGVfc2V0dXBfY3Rycyh2b2lkKQoreworCXUzMiBldnRzZWwsIHBtbmM7CisJaW50IGk7CisKKwlmb3IgKGkgPSBDQ05UOyBpIDwgTUFYX0NPVU5URVJTOyBpKyspIHsKKwkJaWYgKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpCisJCQljb250aW51ZTsKKworCQljb3VudGVyX2NvbmZpZ1tpXS5ldmVudCA9IEVWVF9VTlVTRUQ7CisJfQorCisJc3dpdGNoIChwbXUtPmlkKSB7CisJY2FzZSBQTVVfWFNDMToKKwkJcG1uYyA9IChjb3VudGVyX2NvbmZpZ1tQTU4xXS5ldmVudCA8PCAyMCkgfCAoY291bnRlcl9jb25maWdbUE1OMF0uZXZlbnQgPDwgMTIpOworCQlwcl9kZWJ1ZygieHNjYWxlX3NldHVwX2N0cnM6IHBtbmM6ICUjMDh4XG4iLCBwbW5jKTsKKwkJd3JpdGVfcG1uYyhwbW5jKTsKKwkJYnJlYWs7CisKKwljYXNlIFBNVV9YU0MyOgorCQlldnRzZWwgPSBjb3VudGVyX2NvbmZpZ1tQTU4wXS5ldmVudCB8IChjb3VudGVyX2NvbmZpZ1tQTU4xXS5ldmVudCA8PCA4KSB8CisJCQkoY291bnRlcl9jb25maWdbUE1OMl0uZXZlbnQgPDwgMTYpIHwgKGNvdW50ZXJfY29uZmlnW1BNTjNdLmV2ZW50IDw8IDI0KTsKKworCQlwcl9kZWJ1ZygieHNjYWxlX3NldHVwX2N0cnM6IGV2dHNlbCAlIzA4eFxuIiwgZXZ0c2VsKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtY3IgcDE0LCAwLCAlMCwgYzgsIGMxLCAwIiA6IDogInIiIChldnRzZWwpKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gQ0NOVDsgaSA8IE1BWF9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChjb3VudGVyX2NvbmZpZ1tpXS5ldmVudCA9PSBFVlRfVU5VU0VEKSB7CisJCQljb3VudGVyX2NvbmZpZ1tpXS5ldmVudCA9IDA7CisJCQlwbXUtPmludF9lbmFibGUgJj0gfnBtdS0+aW50X21hc2tbaV07CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlc3VsdHNbaV0ucmVzZXRfY291bnRlciA9IGNvdW50ZXJfY29uZmlnW2ldLmNvdW50OworCQl3cml0ZV9jb3VudGVyKGksIC0odTMyKWNvdW50ZXJfY29uZmlnW2ldLmNvdW50KTsKKwkJcG11LT5pbnRfZW5hYmxlIHw9IHBtdS0+aW50X21hc2tbaV07CisJCXByX2RlYnVnKCJ4c2NhbGVfc2V0dXBfY3RyczogY291bnRlciVkICUjMDh4IGZyb20gJSMwOGx4XG4iLCBpLAorCQkJcmVhZF9jb3VudGVyKGkpLCBjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBfX3hzYzFfY2hlY2tfY3Rycyh2b2lkKQoreworCWludCBpOworCXUzMiBwbW5jID0gcmVhZF9wbW5jKCk7CisKKwkvKiBOT1RFOiB0aGVyZSdzIGFuIEEgc3RlcHBpbmcgZXJyYXRhIHRoYXQgc3RhdGVzIGlmIGFuIG92ZXJmbG93ICovCisJLyogICAgICAgYml0IGFscmVhZHkgZXhpc3RzIGFuZCBhbm90aGVyIG9jY3VycywgdGhlIHByZXZpb3VzICAgICAqLworCS8qICAgICAgIE92ZXJmbG93IGJpdCBnZXRzIGNsZWFyZWQuIFRoZXJlJ3Mgbm8gd29ya2Fyb3VuZC4JICovCisJLyoJIEZpeGVkIGluIEIgc3RlcHBpbmcgb3IgbGF0ZXIJCQkgCSAqLworCisJLyogV3JpdGUgdGhlIHZhbHVlIGJhY2sgdG8gY2xlYXIgdGhlIG92ZXJmbG93IGZsYWdzLiBPdmVyZmxvdyAqLworCS8qIGZsYWdzIHJlbWFpbiBpbiBwbW5jIGZvciB1c2UgYmVsb3cgKi8KKwl3cml0ZV9wbW5jKHBtbmMgJiB+UE1VX0VOQUJMRSk7CisKKwlmb3IgKGkgPSBDQ05UOyBpIDw9IFBNTjE7IGkrKykgeworCQlpZiAoIShwbXUtPmludF9tYXNrW2ldICYgcG11LT5pbnRfZW5hYmxlKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwbW5jICYgcG11LT5jbnRfb3ZmW2ldKQorCQkJcmVzdWx0c1tpXS5vdmYrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBfX3hzYzJfY2hlY2tfY3Rycyh2b2lkKQoreworCWludCBpOworCXUzMiBmbGFnID0gMCwgcG1uYyA9IHJlYWRfcG1uYygpOworCisJcG1uYyAmPSB+UE1VX0VOQUJMRTsKKwl3cml0ZV9wbW5jKHBtbmMpOworCisJLyogcmVhZCBvdmVyZmxvdyBmbGFnIHJlZ2lzdGVyICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtcmMgcDE0LCAwLCAlMCwgYzUsIGMxLCAwIiA6ICI9ciIgKGZsYWcpKTsKKworCWZvciAoaSA9IENDTlQ7IGkgPD0gUE1OMzsgaSsrKSB7CisJCWlmICghKHBtdS0+aW50X21hc2tbaV0gJiBwbXUtPmludF9lbmFibGUpKQorCQkJY29udGludWU7CisKKwkJaWYgKGZsYWcgJiBwbXUtPmNudF9vdmZbaV0pCisJCQlyZXN1bHRzW2ldLm92ZisrOworCX0KKworCS8qIHdyaXRlYmFjayBjbGVhcnMgb3ZlcmZsb3cgYml0cyAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWNyIHAxNCwgMCwgJTAsIGM1LCBjMSwgMCIgOiA6ICJyIiAoZmxhZykpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeHNjYWxlX3BtdV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqYXJnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwl1MzIgcG1uYzsKKworCWlmIChwbXUtPmlkID09IFBNVV9YU0MxKQorCQlfX3hzYzFfY2hlY2tfY3RycygpOworCWVsc2UKKwkJX194c2MyX2NoZWNrX2N0cnMoKTsKKworCWZvciAoaSA9IENDTlQ7IGkgPCBNQVhfQ09VTlRFUlM7IGkrKykgeworCQlpZiAoIXJlc3VsdHNbaV0ub3ZmKQorCQkJY29udGludWU7CisKKwkJd3JpdGVfY291bnRlcihpLCAtKHUzMilyZXN1bHRzW2ldLnJlc2V0X2NvdW50ZXIpOworCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOworCQlyZXN1bHRzW2ldLm92Zi0tOworCX0KKworCXBtbmMgPSByZWFkX3BtbmMoKSB8IFBNVV9FTkFCTEU7CisJd3JpdGVfcG1uYyhwbW5jKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgeHNjYWxlX3BtdV9zdG9wKHZvaWQpCit7CisJdTMyIHBtbmMgPSByZWFkX3BtbmMoKTsKKworCXBtbmMgJj0gflBNVV9FTkFCTEU7CisJd3JpdGVfcG1uYyhwbW5jKTsKKworCWZyZWVfaXJxKFhTQ0FMRV9QTVVfSVJRLCByZXN1bHRzKTsKK30KKworc3RhdGljIGludCB4c2NhbGVfcG11X3N0YXJ0KHZvaWQpCit7CisJaW50IHJldDsKKwl1MzIgcG1uYyA9IHJlYWRfcG1uYygpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoWFNDQUxFX1BNVV9JUlEsIHhzY2FsZV9wbXVfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQkiWFNjYWxlIFBNVSIsICh2b2lkICopcmVzdWx0cyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm9wcm9maWxlOiB1bmFibGUgdG8gcmVxdWVzdCBJUlElZCBmb3IgWFNjYWxlIFBNVVxuIiwKKwkJCVhTQ0FMRV9QTVVfSVJRKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocG11LT5pZCA9PSBQTVVfWFNDMSkKKwkJcG1uYyB8PSBwbXUtPmludF9lbmFibGU7CisJZWxzZSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibWNyIHAxNCwgMCwgJTAsIGM0LCBjMSwgMCIgOiA6ICJyIiAocG11LT5pbnRfZW5hYmxlKSk7CisJCXBtbmMgJj0gflBNVV9DTlQ2NDsKKwl9CisKKwlwbW5jIHw9IFBNVV9FTkFCTEU7CisJd3JpdGVfcG1uYyhwbW5jKTsKKwlwcl9kZWJ1ZygieHNjYWxlX3BtdV9zdGFydDogcG1uYzogJSMwOHggbWFzazogJTA4eFxuIiwgcG1uYywgcG11LT5pbnRfZW5hYmxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4c2NhbGVfZGV0ZWN0X3BtdSh2b2lkKQoreworCWludCByZXQgPSAwOworCXUzMiBpZDsKKworCWlkID0gKHJlYWRfY3B1aWQoQ1BVSURfSUQpID4+IDEzKSAmIDB4NzsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIDE6CisJCXBtdSA9ICZwbXVfcGFybXNbUE1VX1hTQzFdOworCQlicmVhazsKKwljYXNlIDI6CisJCXBtdSA9ICZwbXVfcGFybXNbUE1VX1hTQzJdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCQlicmVhazsKKwl9CisKKwlpZiAoIXJldCkgeworCQlvcF94c2NhbGVfc3BlYy5uYW1lID0gcG11LT5uYW1lOworCQlvcF94c2NhbGVfc3BlYy5udW1fY291bnRlcnMgPSBwbXUtPm51bV9jb3VudGVyczsKKwkJcHJfZGVidWcoInhzY2FsZV9kZXRlY3RfcG11OiBkZXRlY3RlZCAlcyBQTVVcbiIsIHBtdS0+bmFtZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG9wX2FybV9tb2RlbF9zcGVjIG9wX3hzY2FsZV9zcGVjID0geworCS5pbml0CQk9IHhzY2FsZV9kZXRlY3RfcG11LAorCS5zZXR1cF9jdHJzCT0geHNjYWxlX3NldHVwX2N0cnMsCisJLnN0YXJ0CQk9IHhzY2FsZV9wbXVfc3RhcnQsCisJLnN0b3AJCT0geHNjYWxlX3BtdV9zdG9wLAorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvTWFrZWZpbGUgYi9hcmNoL2FybS90b29scy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmE0OTkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vdG9vbHMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIGxpbnV4L2FyY2gvYXJtL3Rvb2xzL01ha2VmaWxlCisjCisjIENvcHlyaWdodCAoQykgMjAwMSBSdXNzZWxsIEtpbmcKKyMKKworaW5jbHVkZS9hc20tYXJtL21hY2gtdHlwZXMuaDogJChzcmMpL2dlbi1tYWNoLXR5cGVzICQoc3JjKS9tYWNoLXR5cGVzCisJQGVjaG8gJyAgR2VuZXJhdGluZyAkQCcKKwkkKFEpJChBV0spIC1mICReID4gJEAgfHwgeyBybSAtZiAkQDsgL2Jpbi9mYWxzZTsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvZ2VuLW1hY2gtdHlwZXMgYi9hcmNoL2FybS90b29scy9nZW4tbWFjaC10eXBlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjljOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vdG9vbHMvZ2VuLW1hY2gtdHlwZXMKQEAgLTAsMCArMSw3MyBAQAorIyEvYmluL2F3aworIworIyBBd2sgc2NyaXB0IHRvIGdlbmVyYXRlIGluY2x1ZGUvYXNtLWFybS9tYWNoLXR5cGVzLmgKKyMKK0JFR0lOCXsgbnIgPSAwIH0KKy9eIy8JeyBuZXh0IH0KKy9eWyAJXSokLyB7IG5leHQgfQorCitORiA9PSA0IHsKKwkgIG1hY2hpbmVfaXNbbnJdID0gIm1hY2hpbmVfaXNfIiQxOworCSAgY29uZmlnW25yXSA9ICJDT05GSUdfIiQyOworCSAgbWFjaF90eXBlW25yXSA9ICJNQUNIX1RZUEVfIiQzOworCSAgbnVtW25yXSA9ICQ0OyBucisrCisJfQorCitORiA9PSAzIHsKKwkgIG1hY2hpbmVfaXNbbnJdID0gIm1hY2hpbmVfaXNfIiQxOworCSAgY29uZmlnW25yXSA9ICJDT05GSUdfIiQyOworCSAgbWFjaF90eXBlW25yXSA9ICJNQUNIX1RZUEVfIiQzOworCSAgbnVtW25yXSA9ICIiOyBucisrCisJfQorCisKK0VORAl7CisJICBwcmludGYoIi8qXG4iKTsKKwkgIHByaW50ZigiICogVGhpcyB3YXMgYXV0b21hZ2ljYWxseSBnZW5lcmF0ZWQgZnJvbSAlcyFcbiIsIEZJTEVOQU1FKTsKKwkgIHByaW50ZigiICogRG8gTk9UIGVkaXRcbiIpOworCSAgcHJpbnRmKCIgKi9cblxuIik7CisJICBwcmludGYoIiNpZm5kZWYgX19BU01fQVJNX01BQ0hfVFlQRV9IXG4iKTsKKwkgIHByaW50ZigiI2RlZmluZSBfX0FTTV9BUk1fTUFDSF9UWVBFX0hcblxuIik7CisJICBwcmludGYoIiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD5cblxuIik7CisJICBwcmludGYoIiNpZm5kZWYgX19BU1NFTUJMWV9fXG4iKTsKKwkgIHByaW50ZigiLyogVGhlIHR5cGUgb2YgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uICovXG4iKTsKKwkgIHByaW50ZigiZXh0ZXJuIHVuc2lnbmVkIGludCBfX21hY2hpbmVfYXJjaF90eXBlO1xuIik7CisJICBwcmludGYoIiNlbmRpZlxuXG4iKTsKKworCSAgcHJpbnRmKCIvKiBzZWUgYXJjaC9hcm0va2VybmVsL2FyY2guYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGVzZSAqL1xuIik7CisJICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKwkgICAgaWYgKG51bVtpXSB+IC8uLiovKQorCSAgICAgIHByaW50ZigiI2RlZmluZSAlLTMwcyAlZFxuIiwgbWFjaF90eXBlW2ldLCBudW1baV0pOworCisJICBwcmludGYoIlxuIik7CisKKwkgIGZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQorCSAgICBpZiAobnVtW2ldIH4gLy4uKi8pIHsKKwkgICAgICBwcmludGYoIiNpZmRlZiAlc1xuIiwgY29uZmlnW2ldKTsKKwkgICAgICBwcmludGYoIiMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGVcbiIpOworCSAgICAgIHByaW50ZigiIyAgdW5kZWYgbWFjaGluZV9hcmNoX3R5cGVcbiIpOworCSAgICAgIHByaW50ZigiIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlXHRfX21hY2hpbmVfYXJjaF90eXBlXG4iKTsKKwkgICAgICBwcmludGYoIiMgZWxzZVxuIik7CisJICAgICAgcHJpbnRmKCIjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGVcdCVzXG4iLCBtYWNoX3R5cGVbaV0pOworCSAgICAgIHByaW50ZigiIyBlbmRpZlxuIik7CisJICAgICAgcHJpbnRmKCIjIGRlZmluZSAlcygpXHQobWFjaGluZV9hcmNoX3R5cGUgPT0gJXMpXG4iLCBtYWNoaW5lX2lzW2ldLCBtYWNoX3R5cGVbaV0pOworCSAgICAgIHByaW50ZigiI2Vsc2VcbiIpOworCSAgICAgIHByaW50ZigiIyBkZWZpbmUgJXMoKVx0KDApXG4iLCBtYWNoaW5lX2lzW2ldKTsKKwkgICAgICBwcmludGYoIiNlbmRpZlxuXG4iKTsKKwkgICAgfQorCisJICBwcmludGYoIi8qXG4gKiBUaGVzZSBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkXG4gKi9cbiIpOworCSAgZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJICAgIGlmIChudW1baV0gIX4gLy4uKi8pCisJICAgICAgcHJpbnRmKCIvKiAjZGVmaW5lICUtMzBzIDw8bm90IHJlZ2lzdGVyZWQ+PiAqL1xuIiwgbWFjaF90eXBlW2ldKTsKKworCSAgZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJICAgIGlmIChudW1baV0gIX4gLy4uKi8pIHsKKwkgICAgICBwcmludGYoIiNkZWZpbmUgJXMoKVx0KDApXG4iLCBtYWNoaW5lX2lzW2ldKTsKKwkgICAgfQorCisJICBwcmludGYoIlxuI2lmbmRlZiBtYWNoaW5lX2FyY2hfdHlwZVxuIik7CisJICBwcmludGYoIiNkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGVcdF9fbWFjaGluZV9hcmNoX3R5cGVcbiIpOworCSAgcHJpbnRmKCIjZW5kaWZcblxuIik7CisJICBwcmludGYoIiNlbmRpZlxuIik7CisJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjMWRmYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTAsMCArMSw3MjYgQEAKKyMgRGF0YWJhc2Ugb2YgbWFjaGluZSBtYWNyb3MgYW5kIG51bWJlcnMKKyMKKyMgVGhpcyBmaWxlIGlzIGxpbnV4L2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKKyMKKyMgUGxlYXNlIGRvIG5vdCBzZW5kIHBhdGNoZXMgdG8gdGhpcyBmaWxlOyBpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEKKyMgVG8gYWRkIGFuIGVudHJ5IGludG8gdGhpcyBkYXRhYmFzZSwgcGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2FybS9SRUFETUUsCisjIG9yIGNvbnRhY3Qgcm1rQGFybS5saW51eC5vcmcudWsKKyMKKyMgTGFzdCB1cGRhdGU6IFRodSBNYXIgMjQgMTQ6MzQ6NTAgMjAwNQorIworIyBtYWNoaW5lX2lzX3h4eAlDT05GSUdfeHh4eAkJTUFDSF9UWVBFX3h4eAkJbnVtYmVyCisjCitlYnNhMTEwCQkJQVJDSF9FQlNBMTEwCQlFQlNBMTEwCQkJMAorcmlzY3BjCQkJQVJDSF9SUEMJCVJJU0NQQwkJCTEKK25leHVzcGNpCQlBUkNIX05FWFVTUENJCQlORVhVU1BDSQkJMworZWJzYTI4NQkJCUFSQ0hfRUJTQTI4NQkJRUJTQTI4NQkJCTQKK25ldHdpbmRlcgkJQVJDSF9ORVRXSU5ERVIJCU5FVFdJTkRFUgkJNQorY2F0cwkJCUFSQ0hfQ0FUUwkJQ0FUUwkJCTYKK3Rib3gJCQlBUkNIX1RCT1gJCVRCT1gJCQk3CitjbzI4NQkJCUFSQ0hfQ08yODUJCUNPMjg1CQkJOAorY2xwczcxMTAJCUFSQ0hfQ0xQUzcxMTAJCUNMUFM3MTEwCQk5CithcmNoaW1lZGVzCQlBUkNIX0FSQwkJQVJDSElNRURFUwkJMTAKK2E1awkJCUFSQ0hfQTVLCQlBNUsJCQkxMQorZXRvaWxlCQkJQVJDSF9FVE9JTEUJCUVUT0lMRQkJCTEyCitsYWNpZV9uYXMJCUFSQ0hfTEFDSUVfTkFTCQlMQUNJRV9OQVMJCTEzCitjbHBzNzUwMAkJQVJDSF9DTFBTNzUwMAkJQ0xQUzc1MDAJCTE0CitzaGFyawkJCUFSQ0hfU0hBUksJCVNIQVJLCQkJMTUKK2JydXR1cwkJCVNBMTEwMF9CUlVUVVMJCUJSVVRVUwkJCTE2CitwZXJzb25hbF9zZXJ2ZXIJCUFSQ0hfUEVSU09OQUxfU0VSVkVSCVBFUlNPTkFMX1NFUlZFUgkJMTcKK2l0c3kJCQlTQTExMDBfSVRTWQkJSVRTWQkJCTE4CitsNzIwMAkJCUFSQ0hfTDcyMDAJCUw3MjAwCQkJMTkKK3BsZWIJCQlTQTExMDBfUExFQgkJUExFQgkJCTIwCitpbnRlZ3JhdG9yCQlBUkNIX0lOVEVHUkFUT1IJCUlOVEVHUkFUT1IJCTIxCitoMzYwMAkJCVNBMTEwMF9IMzYwMAkJSDM2MDAJCQkyMgoraXhwMTIwMAkJCUFSQ0hfSVhQMTIwMAkJSVhQMTIwMAkJCTIzCitwNzIwdAkJCUFSQ0hfUDcyMFQJCVA3MjBUCQkJMjQKK2Fzc2FiZXQJCQlTQTExMDBfQVNTQUJFVAkJQVNTQUJFVAkJCTI1Cit2aWN0b3IJCQlTQTExMDBfVklDVE9SCQlWSUNUT1IJCQkyNgorbGFydAkJCVNBMTEwMF9MQVJUCQlMQVJUCQkJMjcKK3JhbmdlcgkJCVNBMTEwMF9SQU5HRVIJCVJBTkdFUgkJCTI4CitncmFwaGljc2NsaWVudAkJU0ExMTAwX0dSQVBISUNTQ0xJRU5UCUdSQVBISUNTQ0xJRU5UCQkyOQoreHA4NjAJCQlTQTExMDBfWFA4NjAJCVhQODYwCQkJMzAKK2NlcmYJCQlTQTExMDBfQ0VSRgkJQ0VSRgkJCTMxCituYW5vZW5naW5lCQlTQTExMDBfTkFOT0VOR0lORQlOQU5PRU5HSU5FCQkzMgorZnBpYwkJCVNBMTEwMF9GUElDCQlGUElDCQkJMzMKK2V4dGVuZXgxCQlTQTExMDBfRVhURU5FWDEJCUVYVEVORVgxCQkzNAorc2hlcm1hbgkJCVNBMTEwMF9TSEVSTUFOCQlTSEVSTUFOCQkJMzUKK2FjY2VsZW50X3NhCQlTQTExMDBfQUNDRUxFTlQJCUFDQ0VMRU5UX1NBCQkzNgorYWNjZWxlbnRfbDcyMDAJCUFSQ0hfTDcyMDBfQUNDRUxFTlQJQUNDRUxFTlRfTDcyMDAJCTM3CituZXRwb3J0CQkJU0ExMTAwX05FVFBPUlQJCU5FVFBPUlQJCQkzOAorcGFuZ29saW4JCVNBMTEwMF9QQU5HT0xJTgkJUEFOR09MSU4JCTM5Cit5b3B5CQkJU0ExMTAwX1lPUFkJCVlPUFkJCQk0MAorY29vbGlkZ2UJCVNBMTEwMF9DT09MSURHRQkJQ09PTElER0UJCTQxCitodXdfd2VicGFuZWwJCVNBMTEwMF9IVVdfV0VCUEFORUwJSFVXX1dFQlBBTkVMCQk0Mgorc3BvdG1lCQkJQVJDSF9TUE9UTUUJCVNQT1RNRQkJCTQzCitmcmVlYmlyZAkJQVJDSF9GUkVFQklSRAkJRlJFRUJJUkQJCTQ0Cit0aTkyNQkJCUFSQ0hfVEk5MjUJCVRJOTI1CQkJNDUKK3Jpc2NzdGF0aW9uCQlBUkNIX1JJU0NTVEFUSU9OCVJJU0NTVEFUSU9OCQk0NgorY2F2eQkJCVNBMTEwMF9DQVZZCQlDQVZZCQkJNDcKK2pvcm5hZGE3MjAJCVNBMTEwMF9KT1JOQURBNzIwCUpPUk5BREE3MjAJCTQ4CitvbW5pbWV0ZXIJCVNBMTEwMF9PTU5JTUVURVIJT01OSU1FVEVSCQk0OQorZWRiNzIxMQkJCUFSQ0hfRURCNzIxMQkJRURCNzIxMQkJCTUwCitjaXR5Z28JCQlTQTExMDBfQ0lUWUdPCQlDSVRZR08JCQk1MQorcGZzMTY4CQkJU0ExMTAwX1BGUzE2OAkJUEZTMTY4CQkJNTIKK3Nwb3QJCQlTQTExMDBfU1BPVAkJU1BPVAkJCTUzCitmbGV4YW5ldAkJU0ExMTAwX0ZMRVhBTkVUCQlGTEVYQU5FVAkJNTQKK3dlYnBhbAkJCUFSQ0hfV0VCUEFMCQlXRUJQQUwJCQk1NQorbGlucGRhCQkJU0ExMTAwX0xJTlBEQQkJTElOUERBCQkJNTYKK2FuYWtpbgkJCUFSQ0hfQU5BS0lOCQlBTkFLSU4JCQk1NworbXZpCQkJU0ExMTAwX01WSQkJTVZJCQkJNTgKK2p1cGl0ZXIJCQlTQTExMDBfSlVQSVRFUgkJSlVQSVRFUgkJCTU5Citwc2lvbncJCQlBUkNIX1BTSU9OVwkJUFNJT05XCQkJNjAKK2FsbgkJCVNBMTEwMF9BTE4JCUFMTgkJCTYxCitlcHhhCQkJQVJDSF9DQU1FTE9UCQlDQU1FTE9UCQkJNjIKK2dkczIyMDAJCQlTQTExMDBfR0RTMjIwMAkJR0RTMjIwMAkJCTYzCitwc2lvbl9zZXJpZXM3CQlTQTExMDBfUFNJT05fU0VSSUVTNwlQU0lPTl9TRVJJRVM3CQk2NAoreGZpbGUJCQlTQTExMDBfWEZJTEUJCVhGSUxFCQkJNjUKK2FjY2VsZW50X2VwOTMxMgkJQVJDSF9BQ0NFTEVOVF9FUDkzMTIJQUNDRUxFTlRfRVA5MzEyCQk2NgoraWMyMDAJCQlBUkNIX0lDMjAwCQlJQzIwMAkJCTY3CitjcmVkaXRsYXJ0CQlTQTExMDBfQ1JFRElUTEFSVAlDUkVESVRMQVJUCQk2OAoraHRtCQkJU0ExMTAwX0hUTQkJSFRNCQkJNjkKK2lxODAzMTAJCQlBUkNIX0lRODAzMTAJCUlRODAzMTAJCQk3MAorZnJlZWJvdAkJCVNBMTEwMF9GUkVFQk9UCQlGUkVFQk9UCQkJNzEKK2VudGVsCQkJQVJDSF9FTlRFTAkJRU5URUwJCQk3MgorZW5wMzUxMAkJCUFSQ0hfRU5QMzUxMAkJRU5QMzUxMAkJCTczCit0cml6ZXBzCQkJU0ExMTAwX1RSSVpFUFMJCVRSSVpFUFMJCQk3NAorbmVzYQkJCVNBMTEwMF9ORVNBCQlORVNBCQkJNzUKK3ZlbnVzCQkJQVJDSF9WRU5VUwkJVkVOVVMJCQk3NgordGFyZGlzCQkJQVJDSF9UQVJESVMJCVRBUkRJUwkJCTc3CittZXJjdXJ5CQkJQVJDSF9NRVJDVVJZCQlNRVJDVVJZCQkJNzgKK2VtcGVnCQkJU0ExMTAwX0VNUEVHCQlFTVBFRwkJCTc5CithZGlfZXZiCQkJQVJDSF9JODAyMDBGQ0MJCUk4MDIwMEZDQwkJODAKK2l0dF9jcGIJCQlTQTExMDBfSVRUX0NQQgkJSVRUX0NQQgkJCTgxCitzdmMJCQlTQTExMDBfU1ZDCQlTVkMJCQk4MgorYWxwaGEyCQkJU0ExMTAwX0FMUEhBMgkJQUxQSEEyCQkJODQKK2FscGhhMQkJCVNBMTEwMF9BTFBIQTEJCUFMUEhBMQkJCTg1CituZXRhcm0JCQlBUkNIX05FVEFSTQkJTkVUQVJNCQkJODYKK3NpbXBhZAkJCVNBMTEwMF9TSU1QQUQJCVNJTVBBRAkJCTg3CitwZGExCQkJQVJDSF9QREExCQlQREExCQkJODgKK2x1YmJvY2sJCQlBUkNIX0xVQkJPQ0sJCUxVQkJPQ0sJCQk4OQorYW5pa28JCQlBUkNIX0FOSUtPCQlBTklLTwkJCTkwCitjbGVwNzIxMgkJQVJDSF9DTEVQNzIxMgkJQ0xFUDcyMTIJCTkxCitjczg5NzEyCQkJQVJDSF9DUzg5NzEyCQlDUzg5NzEyCQkJOTIKK3dlYXJhcm0JCQlTQTExMDBfV0VBUkFSTQkJV0VBUkFSTQkJCTkzCitwb3NzaW9fcHgJCVNBMTEwMF9QT1NTSU9fUFgJUE9TU0lPX1BYCQk5NAorc2lkZWFybQkJCVNBMTEwMF9TSURFQVJNCQlTSURFQVJNCQkJOTUKK3N0b3JrCQkJU0ExMTAwX1NUT1JLCQlTVE9SSwkJCTk2CitzaGFubm9uCQkJU0ExMTAwX1NIQU5OT04JCVNIQU5OT04JCQk5NworYWNlCQkJQVJDSF9BQ0UJCUFDRQkJCTk4CitiYWxseWFybQkJU0ExMTAwX0JBTExZQVJNCQlCQUxMWUFSTQkJOTkKK3NpbXB1dGVyCQlTQTExMDBfU0lNUFVURVIJCVNJTVBVVEVSCQkxMDAKK25leHRlcm0JCQlTQTExMDBfTkVYVEVSTQkJTkVYVEVSTQkJCTEwMQorc2ExMTAwX2VsZgkJU0ExMTAwX1NBMTEwMF9FTEYJU0ExMTAwX0VMRgkJMTAyCitnYXRvcgkJCVNBMTEwMF9HQVRPUgkJR0FUT1IJCQkxMDMKK2dyYW5pdGUJCQlBUkNIX0dSQU5JVEUJCUdSQU5JVEUJCQkxMDQKK2NvbnN1cwkJCVNBMTEwMF9DT05TVVMJCUNPTlNVUwkJCTEwNQorYWFlZDIwMDAJCUFSQ0hfQUFFRDIwMDAJCUFBRUQyMDAwCQkxMDYKK2NkYjg5NzEyCQlBUkNIX0NEQjg5NzEyCQlDREI4OTcxMgkJMTA3CitncmFwaGljc21hc3RlcgkJU0ExMTAwX0dSQVBISUNTTUFTVEVSCUdSQVBISUNTTUFTVEVSCQkxMDgKK2Fkc2JpdHN5CQlTQTExMDBfQURTQklUU1kJCUFEU0JJVFNZCQkxMDkKK3B4YV9pZHAJCQlBUkNIX1BYQV9JRFAJCVBYQV9JRFAJCQkxMTAKK3BsY2UJCQlBUkNIX1BMQ0UJCVBMQ0UJCQkxMTEKK3B0X3N5c3RlbTMJCVNBMTEwMF9QVF9TWVNURU0zCVBUX1NZU1RFTTMJCTExMgorbXVycGh5CQkJQVJDSF9NRURBTEIJCU1FREFMQgkJCTExMworZWFnbGUJCQlBUkNIX0VBR0xFCQlFQUdMRQkJCTExNAorZHNjMjEJCQlBUkNIX0RTQzIxCQlEU0MyMQkJCTExNQorZHNjMjQJCQlBUkNIX0RTQzI0CQlEU0MyNAkJCTExNgordGk1NDcyCQkJQVJDSF9USTU0NzIJCVRJNTQ3MgkJCTExNworYXV0Y3B1MTIJCUFSQ0hfQVVUQ1BVMTIJCUFVVENQVTEyCQkxMTgKK3VlbmdpbmUJCQlBUkNIX1VFTkdJTkUJCVVFTkdJTkUJCQkxMTkKK2JsdWVzdGVtCQlTQTExMDBfQkxVRVNURU0JCUJMVUVTVEVNCQkxMjAKK3hpbmd1OAkJCUFSQ0hfWElOR1U4CQlYSU5HVTgJCQkxMjEKK2J1c2hzdGIJCQlBUkNIX0JVU0hTVEIJCUJVU0hTVEIJCQkxMjIKK2Vwc2lsb24xCQlTQTExMDBfRVBTSUxPTjEJCUVQU0lMT04xCQkxMjMKK2JhbGxvb24JCQlTQTExMDBfQkFMTE9PTgkJQkFMTE9PTgkJCTEyNAorcHVwcHkJCQlBUkNIX1BVUFBZCQlQVVBQWQkJCTEyNQorZWxyb3kJCQlTQTExMDBfRUxST1kJCUVMUk9ZCQkJMTI2CitnbXM3MjAJCQlBUkNIX0dNUzcyMAkJR01TNzIwCQkJMTI3CitzMjR4CQkJQVJDSF9TMjRYCQlTMjRYCQkJMTI4CitqdGVsX2NsZXA3MzEyCQlBUkNIX0pURUxfQ0xFUDczMTIJSlRFTF9DTEVQNzMxMgkJMTI5CitjeDgyMXh4CQkJQVJDSF9DWDgyMVhYCQlDWDgyMVhYCQkJMTMwCitlZGI3MzEyCQkJQVJDSF9FREI3MzEyCQlFREI3MzEyCQkJMTMxCitic2ExMTEwCQkJU0ExMTAwX0JTQTExMTAJCUJTQTExMTAJCQkxMzIKK3Bvd2VycGluCQlBUkNIX1BPV0VSUElOCQlQT1dFUlBJTgkJMTMzCitvcGVuYXJtCQkJQVJDSF9PUEVOQVJNCQlPUEVOQVJNCQkJMTM0Cit3aGl0ZWNoYXBlbAkJU0ExMTAwX1dISVRFQ0hBUEVMCVdISVRFQ0hBUEVMCQkxMzUKK2gzMTAwCQkJU0ExMTAwX0gzMTAwCQlIMzEwMAkJCTEzNgoraDM4MDAJCQlTQTExMDBfSDM4MDAJCUgzODAwCQkJMTM3CitibHVlX3YxCQkJQVJDSF9CTFVFX1YxCQlCTFVFX1YxCQkJMTM4CitweGFfY2VyZgkJQVJDSF9QWEFfQ0VSRgkJUFhBX0NFUkYJCTEzOQorYXJtN3RldmIJCUFSQ0hfQVJNN1RFVkIJCUFSTTdURVZCCQkxNDAKK2Q3NDAwCQkJU0ExMTAwX0Q3NDAwCQlENzQwMAkJCTE0MQorcGlyYW5oYQkJCUFSQ0hfUElSQU5IQQkJUElSQU5IQQkJCTE0Mgorc2JjYW1lbG90CQlTQTExMDBfU0JDQU1FTE9UCVNCQ0FNRUxPVAkJMTQzCitraW5ncwkJCVNBMTEwMF9LSU5HUwkJS0lOR1MJCQkxNDQKK3NtZGsyNDAwCQlBUkNIX1NNREsyNDAwCQlTTURLMjQwMAkJMTQ1Citjb2xsaWUJCQlTQTExMDBfQ09MTElFCQlDT0xMSUUJCQkxNDYKK2lkcgkJCUFSQ0hfSURSCQlJRFIJCQkxNDcKK2JhZGdlNAkJCVNBMTEwMF9CQURHRTQJCUJBREdFNAkJCTE0OAord2VibmV0CQkJQVJDSF9XRUJORVQJCVdFQk5FVAkJCTE0OQorZDczMDAJCQlTQTExMDBfRDczMDAJCUQ3MzAwCQkJMTUwCitjZXAJCQlTQTExMDBfQ0VQCQlDRVAJCQkxNTEKK2ZvcnR1bmV0CQlBUkNIX0ZPUlRVTkVUCQlGT1JUVU5FVAkJMTUyCit2YzU0N3gJCQlBUkNIX1ZDNTQ3WAkJVkM1NDdYCQkJMTUzCitmaWxld2Fsa2VyCQlTQTExMDBfRklMRVdBTEtFUglGSUxFV0FMS0VSCQkxNTQKK25ldGdhdGV3YXkJCVNBMTEwMF9ORVRHQVRFV0FZCU5FVEdBVEVXQVkJCTE1NQorc3ltYm9sMjgwMAkJU0ExMTAwX1NZTUJPTDI4MDAJU1lNQk9MMjgwMAkJMTU2CitzdW5zCQkJU0ExMTAwX1NVTlMJCVNVTlMJCQkxNTcKK2Zyb2RvCQkJU0ExMTAwX0ZST0RPCQlGUk9ETwkJCTE1OAorbXMzMDEJCQlTQTExMDBfTUFDSF9UWVRFX01TMzAxCU1BQ0hfVFlURV9NUzMwMQkJMTU5CitteDFhZHMJCQlBUkNIX01YMUFEUwkJTVgxQURTCQkJMTYwCitoNzIwMQkJCUFSQ0hfSDcyMDEJCUg3MjAxCQkJMTYxCitoNzIwMgkJCUFSQ0hfSDcyMDIJCUg3MjAyCQkJMTYyCithbWljbwkJCUFSQ0hfQU1JQ08JCUFNSUNPCQkJMTYzCitpYW0JCQlTQTExMDBfSUFNCQlJQU0JCQkxNjQKK3R0NTMwCQkJU0ExMTAwX1RUNTMwCQlUVDUzMAkJCTE2NQorc2FtMjQwMAkJCUFSQ0hfU0FNMjQwMAkJU0FNMjQwMAkJCTE2Ngoram9ybmFkYTU2eAkJU0ExMTAwX0pPUk5BREE1NlgJSk9STkFEQTU2WAkJMTY3CithY3RpdmUJCQlTQTExMDBfQUNUSVZFCQlBQ1RJVkUJCQkxNjgKK2lxODAzMjEJCQlBUkNIX0lRODAzMjEJCUlRODAzMjEJCQkxNjkKK3dpZAkJCVNBMTEwMF9XSUQJCVdJRAkJCTE3MAorc2FiaW5hbAkJCUFSQ0hfU0FCSU5BTAkJU0FCSU5BTAkJCTE3MQoraXhwNDI1X21hdGFjdW1iZQlBUkNIX0lYUDQyNV9NQVRBQ1VNQkUJSVhQNDI1X01BVEFDVU1CRQkxNzIKK21pbmlwcmludAkJU0ExMTAwX01JTklQUklOVAlNSU5JUFJJTlQJCTE3MworYWRtNTEweAkJCUFSQ0hfQURNNTEwWAkJQURNNTEwWAkJCTE3NAorc3ZzMjAwCQkJU0ExMTAwX1NWUzIwMAkJU1ZTMjAwCQkJMTc1CithdGdfdGN1CQkJQVJDSF9BVEdfVENVCQlBVEdfVENVCQkJMTc2Citqb3JuYWRhODIwCQlTQTExMDBfSk9STkFEQTgyMAlKT1JOQURBODIwCQkxNzcKK3MzYzQ0YjAJCQlBUkNIX1MzQzQ0QjAJCVMzQzQ0QjAJCQkxNzgKK21hcmdpczIJCQlBUkNIX01BUkdJUzIJCU1BUkdJUzIJCQkxNzkKK2tzODY5NQkJCUFSQ0hfS1M4Njk1CQlLUzg2OTUJCQkxODAKK2JyaAkJCUFSQ0hfQlJICQlCUkgJCQkxODEKK3MzYzI0MTAJCQlBUkNIX1MzQzI0MTAJCVMzQzI0MTAJCQkxODIKK3Bvc3Npb19weDMwCQlBUkNIX1BPU1NJT19QWDMwCVBPU1NJT19QWDMwCQkxODMKK3MzYzI4MDAJCQlBUkNIX1MzQzI4MDAJCVMzQzI4MDAJCQkxODQKK2ZsZWV0d29vZAkJU0ExMTAwX0ZMRUVUV09PRAlGTEVFVFdPT0QJCTE4NQorb21haGEJCQlBUkNIX09NQUhBCQlPTUFIQQkJCTE4NgordGE3CQkJQVJDSF9UQTcJCVRBNwkJCTE4Nworbm92YQkJCVNBMTEwMF9OT1ZBCQlOT1ZBCQkJMTg4CitobWsJCQlBUkNIX0hNSwkJSE1LCQkJMTg5CitrYXJvCQkJQVJDSF9LQVJPCQlLQVJPCQkJMTkwCitmZXN0ZXIJCQlTQTExMDBfRkVTVEVSCQlGRVNURVIJCQkxOTEKK2dwaQkJCUFSQ0hfR1BJCQlHUEkJCQkxOTIKK3NtZGsyNDEwCQlBUkNIX1NNREsyNDEwCQlTTURLMjQxMAkJMTkzCitpNTE5CQkJQVJDSF9JNTE5CQlJNTE5CQkJMTk0CituZXhpbwkJCVNBMTEwMF9ORVhJTwkJTkVYSU8JCQkxOTUKK2JpdGJveAkJCVNBMTEwMF9CSVRCT1gJCUJJVEJPWAkJCTE5NgorZzIwMAkJCVNBMTEwMF9HMjAwCQlHMjAwCQkJMTk3CitnaWxsCQkJU0ExMTAwX0dJTEwJCUdJTEwJCQkxOTgKK3B4YV9tZXJjdXJ5CQlBUkNIX1BYQV9NRVJDVVJZCVBYQV9NRVJDVVJZCQkxOTkKK2NlaXZhCQkJQVJDSF9DRUlWQQkJQ0VJVkEJCQkyMDAKK2ZyZXQJCQlTQTExMDBfRlJFVAkJRlJFVAkJCTIwMQorZW1haWxwaG9uZQkJU0ExMTAwX0VNQUlMUEhPTkUJRU1BSUxQSE9ORQkJMjAyCitoMzkwMAkJCUFSQ0hfSDM5MDAJCUgzOTAwCQkJMjAzCitweGExCQkJQVJDSF9QWEExCQlQWEExCQkJMjA0Citrb2FuMzY5CQkJU0ExMTAwX0tPQU4zNjkJCUtPQU4zNjkJCQkyMDUKK2NvZ2VudAkJCUFSQ0hfQ09HRU5UCQlDT0dFTlQJCQkyMDYKK2VzbF9zaW1wdXRlcgkJQVJDSF9FU0xfU0lNUFVURVIJRVNMX1NJTVBVVEVSCQkyMDcKK2VzbF9zaW1wdXRlcl9jbHIJQVJDSF9FU0xfU0lNUFVURVJfQ0xSCUVTTF9TSU1QVVRFUl9DTFIJMjA4Citlc2xfc2ltcHV0ZXJfYncJCUFSQ0hfRVNMX1NJTVBVVEVSX0JXCUVTTF9TSU1QVVRFUl9CVwkJMjA5CitoaHBfY3JhZGxlCQlBUkNIX0hIUF9DUkFETEUJCUhIUF9DUkFETEUJCTIxMAoraGU1MDAJCQlBUkNIX0hFNTAwCQlIRTUwMAkJCTIxMQoraW5oYW5kZWxmMgkJU0ExMTAwX0lOSEFOREVMRjIJSU5IQU5ERUxGMgkJMjEyCitpbmhhbmRmdGlwCQlTQTExMDBfSU5IQU5ERlRJUAlJTkhBTkRGVElQCQkyMTMKK2RucDExMTAJCQlTQTExMDBfRE5QMTExMAkJRE5QMTExMAkJCTIxNAorcG5wMTExMAkJCVNBMTEwMF9QTlAxMTEwCQlQTlAxMTEwCQkJMjE1Citjc2IyMjYJCQlBUkNIX0NTQjIyNgkJQ1NCMjI2CQkJMjE2Cithcm5vbGQJCQlTQTExMDBfQVJOT0xECQlBUk5PTEQJCQkyMTcKK3ZvaWNlYmx1ZQkJTUFDSF9WT0lDRUJMVUUJCVZPSUNFQkxVRQkJMjE4CitqejgwMjgJCQlBUkNIX0paODAyOAkJSlo4MDI4CQkJMjE5CitoNTQwMAkJCUFSQ0hfSDU0MDAJCUg1NDAwCQkJMjIwCitmb3J0ZQkJCVNBMTEwMF9GT1JURQkJRk9SVEUJCQkyMjEKK2FjYW0JCQlTQTExMDBfQUNBTQkJQUNBTQkJCTIyMgorYWJveAkJCVNBMTEwMF9BQk9YCQlBQk9YCQkJMjIzCithdG1lbAkJCUFSQ0hfQVRNRUwJCUFUTUVMCQkJMjI0CitzaXRzYW5nCQkJQVJDSF9TSVRTQU5HCQlTSVRTQU5HCQkJMjI1CitjcHUxMTEwbGNkbmV0CQlTQTExMDBfQ1BVMTExMExDRE5FVAlDUFUxMTEwTENETkVUCQkyMjYKK21wbF92Y21hOQkJQVJDSF9NUExfVkNNQTkJCU1QTF9WQ01BOQkJMjI3CitvcHVzX2ExCQkJQVJDSF9PUFVTX0ExCQlPUFVTX0ExCQkJMjI4CitkYXl0b25hCQkJQVJDSF9EQVlUT05BCQlEQVlUT05BCQkJMjI5CitraWxsYmVhcgkJU0ExMTAwX0tJTExCRUFSCQlLSUxMQkVBUgkJMjMwCit5b2hvCQkJQVJDSF9ZT0hPCQlZT0hPCQkJMjMxCitqYXNwZXIJCQlBUkNIX0pBU1BFUgkJSkFTUEVSCQkJMjMyCitkc2MyNQkJCUFSQ0hfRFNDMjUJCURTQzI1CQkJMjMzCitvbWFwX2lubm92YXRvcgkJTUFDSF9PTUFQX0lOTk9WQVRPUglPTUFQX0lOTk9WQVRPUgkJMjM0CityYW1zZXMJCQlBUkNIX1JBTVNFUwkJUkFNU0VTCQkJMjM1CitzMjh4CQkJQVJDSF9TMjhYCQlTMjhYCQkJMjM2CittcG9ydDMJCQlBUkNIX01QT1JUMwkJTVBPUlQzCQkJMjM3CitweGFfZWFnbGUyNTAJCUFSQ0hfUFhBX0VBR0xFMjUwCVBYQV9FQUdMRTI1MAkJMjM4CitwZGIJCQlBUkNIX1BEQgkJUERCCQkJMjM5CitibHVlXzJnCQkJU0ExMTAwX0JMVUVfMkcJCUJMVUVfMkcJCQkyNDAKK2JsdWVhcmNoCQlTQTExMDBfQkxVRUFSQ0gJCUJMVUVBUkNICQkyNDEKK2l4ZHAyNDAwCQlBUkNIX0lYRFAyNDAwCQlJWERQMjQwMAkJMjQyCitpeGRwMjgwMAkJQVJDSF9JWERQMjgwMAkJSVhEUDI4MDAJCTI0MworZXhwbG9yZXIJCVNBMTEwMF9FWFBMT1JFUgkJRVhQTE9SRVIJCTI0NAoraXhkcDQyNQkJCUFSQ0hfSVhEUDQyNQkJSVhEUDQyNQkJCTI0NQorY2hpbXAJCQlBUkNIX0NISU1QCQlDSElNUAkJCTI0Ngorc3RvcmtfbmVzdAkJQVJDSF9TVE9SS19ORVNUCQlTVE9SS19ORVNUCQkyNDcKK3N0b3JrX2VnZwkJQVJDSF9TVE9SS19FR0cJCVNUT1JLX0VHRwkJMjQ4Cit3aXNtbwkJCVNBMTEwMF9XSVNNTwkJV0lTTU8JCQkyNDkKK2V6bGlueAkJCUFSQ0hfRVpMSU5YCQlFWkxJTlgJCQkyNTAKK2F0OTFybTkyMDAJCUFSQ0hfQVQ5MVJNOTIwMAkJQVQ5MVJNOTIwMAkJMjUxCitvcmlvbgkJCUFSQ0hfT1JJT04JCU9SSU9OCQkJMjUyCituZXB0dW5lCQkJQVJDSF9ORVBUVU5FCQlORVBUVU5FCQkJMjUzCitoYWNra2l0CQkJU0ExMTAwX0hBQ0tLSVQJCUhBQ0tLSVQJCQkyNTQKK3B4YV93aW5zMzAJCUFSQ0hfUFhBX1dJTlMzMAkJUFhBX1dJTlMzMAkJMjU1CitsYXZpbm5hCQkJU0ExMTAwX0xBVklOTkEJCUxBVklOTkEJCQkyNTYKK3B4YV91ZW5naW5lCQlBUkNIX1BYQV9VRU5HSU5FCVBYQV9VRU5HSU5FCQkyNTcKK2lubm9rb20JCQlBUkNIX0lOTk9LT00JCUlOTk9LT00JCQkyNTgKK2JtcwkJCUFSQ0hfQk1TCQlCTVMJCQkyNTkKK2l4Y2RwMTEwMAkJQVJDSF9JWENEUDExMDAJCUlYQ0RQMTEwMAkJMjYwCitwcnBtYzExMDAJCUFSQ0hfUFJQTUMxMTAwCQlQUlBNQzExMDAJCTI2MQorYXQ5MXJtOTIwMGRrCQlBUkNIX0FUOTFSTTkyMDBESwlBVDkxUk05MjAwREsJCTI2MgorYXJtc3RpY2sJCUFSQ0hfQVJNU1RJQ0sJCUFSTVNUSUNLCQkyNjMKK2FybW9uaWUJCQlBUkNIX0FSTU9OSUUJCUFSTU9OSUUJCQkyNjQKK21wb3J0MQkJCUFSQ0hfTVBPUlQxCQlNUE9SVDEJCQkyNjUKK3MzYzU0MTAJCQlBUkNIX1MzQzU0MTAJCVMzQzU0MTAJCQkyNjYKK3pjcDMyMGEJCQlBUkNIX1pDUDMyMEEJCVpDUDMyMEEJCQkyNjcKK2lfYm94CQkJQVJDSF9JX0JPWAkJSV9CT1gJCQkyNjgKK3N0bGMxNTAyCQlBUkNIX1NUTEMxNTAyCQlTVExDMTUwMgkJMjY5CitzaXJlbgkJCUFSQ0hfU0lSRU4JCVNJUkVOCQkJMjcwCitncmVlbmxha2UJCUFSQ0hfR1JFRU5MQUtFCQlHUkVFTkxBS0UJCTI3MQorYXJndXMJCQlBUkNIX0FSR1VTCQlBUkdVUwkJCTI3MgorY29tYmFkZ2UJCVNBMTEwMF9DT01CQURHRQkJQ09NQkFER0UJCTI3Mworcm9rZXB4YQkJCUFSQ0hfUk9LRVBYQQkJUk9LRVBYQQkJCTI3NAorY2ludGVncmF0b3IJCUFSQ0hfQ0lOVEVHUkFUT1IJQ0lOVEVHUkFUT1IJCTI3NQorZ3VpZGVhMDcJCUFSQ0hfR1VJREVBMDcJCUdVSURFQTA3CQkyNzYKK3RhdDI1NwkJCUFSQ0hfVEFUMjU3CQlUQVQyNTcJCQkyNzcKK2lncDI0MjUJCQlBUkNIX0lHUDI0MjUJCUlHUDI0MjUJCQkyNzgKK2JsdWVncmFtYQkJQVJDSF9CTFVFR1JBTU1BCQlCTFVFR1JBTU1BCQkyNzkKK2lwb2QJCQlBUkNIX0lQT0QJCUlQT0QJCQkyODAKK2Fkc2JpdHN5eAkJQVJDSF9BRFNCSVRTWVgJCUFEU0JJVFNZWAkJMjgxCit0cml6ZXBzMgkJQVJDSF9UUklaRVBTMgkJVFJJWkVQUzIJCTI4MgordmlwZXIJCQlBUkNIX1ZJUEVSCQlWSVBFUgkJCTI4MworYWRzYml0c3lwbHVzCQlTQTExMDBfQURTQklUU1lQTFVTCUFEU0JJVFNZUExVUwkJMjg0CithZHNhZ2MJCQlTQTExMDBfQURTQUdDCQlBRFNBR0MJCQkyODUKK3N0cDczMTIJCQlBUkNIX1NUUDczMTIJCVNUUDczMTIJCQkyODYKK254X3BobngJCQlNQUNIX05YX1BITlgJCU5YX1BITlgJCQkyODcKK3dlcF9lcDI1MAkJQVJDSF9XRVBfRVAyNTAJCVdFUF9FUDI1MAkJMjg4CitpbmhhbmRlbGYzCQlBUkNIX0lOSEFOREVMRjMJCUlOSEFOREVMRjMJCTI4OQorYWRpX2NveW90ZQkJQVJDSF9BRElfQ09ZT1RFCQlBRElfQ09ZT1RFCQkyOTAKK2l5b25peAkJCUFSQ0hfSVlPTklYCQlJWU9OSVgJCQkyOTEKK2RhbWljYW0xCQlBUkNIX0RBTUlDQU1fU0ExMTEwCURBTUlDQU1fU0ExMTEwCQkyOTIKK21lZzAzCQkJQVJDSF9NRUcwMwkJTUVHMDMJCQkyOTMKK3B4YV93aGl0ZWNoYXBlbAkJQVJDSF9QWEFfV0hJVEVDSEFQRUwJUFhBX1dISVRFQ0hBUEVMCQkyOTQKK253c2MJCQlBUkNIX05XU0MJCU5XU0MJCQkyOTUKK253bGFybQkJCUFSQ0hfTldMQVJNCQlOV0xBUk0JCQkyOTYKK2l4cDQyNV9tZ3VhcmQJCUFSQ0hfSVhQNDI1X01HVUFSRAlJWFA0MjVfTUdVQVJECQkyOTcKK3B4YV9uZXRkY3U0CQlBUkNIX1BYQV9ORVREQ1U0CVBYQV9ORVREQ1U0CQkyOTgKK2l4ZHAyNDAxCQlBUkNIX0lYRFAyNDAxCQlJWERQMjQwMQkJMjk5CitpeGRwMjgwMQkJQVJDSF9JWERQMjgwMQkJSVhEUDI4MDEJCTMwMAorem9kaWFjCQkJQVJDSF9aT0RJQUMJCVpPRElBQwkJCTMwMQorYXJtbW9kdWwJCUFSQ0hfQVJNTU9EVUwJCUFSTU1PRFVMCQkzMDIKK2tldG9wCQkJU0ExMTAwX0tFVE9QCQlLRVRPUAkJCTMwMworYXY3MjAwCQkJQVJDSF9BVjcyMDAJCUFWNzIwMAkJCTMwNAorYXJjaF90aTkyNQkJQVJDSF9BUkNIX1RJOTI1CQlBUkNIX1RJOTI1CQkzMDUKK2FjcTIwMAkJCUFSQ0hfQUNRMjAwCQlBQ1EyMDAJCQkzMDYKK3B0X2RhZml0CQlTQTExMDBfUFRfREFGSVQJCVBUX0RBRklUCQkzMDcKK2loYmEJCQlBUkNIX0lIQkEJCUlIQkEJCQkzMDgKK3F1aW5xdWUJCQlBUkNIX1FVSU5RVUUJCVFVSU5RVUUJCQkzMDkKK25pbWJyYW9uZQkJQVJDSF9OSU1CUkFPTkUJCU5JTUJSQU9ORQkJMzEwCituaW1icmEyOXgJCUFSQ0hfTklNQlJBMjlYCQlOSU1CUkEyOVgJCTMxMQorbmltYnJhMjEwCQlBUkNIX05JTUJSQTIxMAkJTklNQlJBMjEwCQkzMTIKK2hocF9kOTV4eAkJQVJDSF9ISFBfRDk1WFgJCUhIUF9EOTVYWAkJMzEzCitsYWJhcm0JCQlBUkNIX0xBQkFSTQkJTEFCQVJNCQkJMzE0CittODI1eHgJCQlBUkNIX004MjVYWAkJTTgyNVhYCQkJMzE1CittNzEwMAkJCVNBMTEwMF9NNzEwMAkJTTcxMDAJCQkzMTYKK25pcGMyCQkJQVJDSF9OSVBDMgkJTklQQzIJCQkzMTcKK2Z1NzIwMgkJCUFSQ0hfRlU3MjAyCQlGVTcyMDIJCQkzMTgKK2Fkc2FneAkJCUFSQ0hfQURTQUdYCQlBRFNBR1gJCQkzMTkKK3B4YV9wb29oCQlBUkNIX1BYQV9QT09ICQlQWEFfUE9PSAkJMzIwCitiYW5kb24JCQlBUkNIX0JBTkRPTgkJQkFORE9OCQkJMzIxCitwY203MjEwCQkJQVJDSF9QQ003MjEwCQlQQ003MjEwCQkJMzIyCitubXM5MjAwCQkJQVJDSF9OTVM5MjAwCQlOTVM5MjAwCQkJMzIzCitsb2dvZGwJCQlBUkNIX0xPR09ETAkJTE9HT0RMCQkJMzI0CittNzE0MAkJCVNBMTEwMF9NNzE0MAkJTTcxNDAJCQkzMjUKK2tvcmVib3QJCQlBUkNIX0tPUkVCT1QJCUtPUkVCT1QJCQkzMjYKK2lxMzEyNDQJCQlBUkNIX0lRMzEyNDQJCUlRMzEyNDQJCQkzMjcKK2tvYW4zOTMJCQlTQTExMDBfS09BTjM5MwkJS09BTjM5MwkJCTMyOAoraW5oYW5kZnRpcDMJCUFSQ0hfSU5IQU5ERlRJUDMJSU5IQU5ERlRJUDMJCTMyOQorZ29uem8JCQlBUkNIX0dPTlpPCQlHT05aTwkJCTMzMAorYmFzdAkJCUFSQ0hfQkFTVAkJQkFTVAkJCTMzMQorc2NhbnBhc3MJCUFSQ0hfU0NBTlBBU1MJCVNDQU5QQVNTCQkzMzIKK2VwNzMxMl9wb29oCQlBUkNIX0VQNzMxMl9QT09ICUVQNzMxMl9QT09ICQkzMzMKK3RhN3MJCQlBUkNIX1RBN1MJCVRBN1MJCQkzMzQKK3RhN3YJCQlBUkNIX1RBN1YJCVRBN1YJCQkzMzUKK2ljYXJ1cwkJCVNBMTEwMF9JQ0FSVVMJCUlDQVJVUwkJCTMzNgoraDE5MDAJCQlBUkNIX0gxOTAwCQlIMTkwMAkJCTMzNworZ2VtaW5pCQkJU0ExMTAwX0dFTUlOSQkJR0VNSU5JCQkJMzM4CitheGltCQkJQVJDSF9BWElNCQlBWElNCQkJMzM5CithdWRpb3Ryb24JCUFSQ0hfQVVESU9UUk9OCQlBVURJT1RST04JCTM0MAoraDIyMDAJCQlBUkNIX0gyMjAwCQlIMjIwMAkJCTM0MQorbG9veDYwMAkJCUFSQ0hfTE9PWDYwMAkJTE9PWDYwMAkJCTM0MgorbmlvcAkJCUFSQ0hfTklPUAkJTklPUAkJCTM0MworZG0zMTAJCQlBUkNIX0RNMzEwCQlETTMxMAkJCTM0NAorc2VlZHB4YV9jMgkJQVJDSF9TRUVEUFhBX0MyCQlTRUVEUFhBX0MyCQkzNDUKK2l4cDR4eF9tZ3VhcmRwY2kJQVJDSF9JWFA0WFhfTUdVQVJEX1BDSQlJWFA0WFhfTUdVQVJEX1BDSQkzNDYKK2gxOTQwCQkJQVJDSF9IMTk0MAkJSDE5NDAJCQkzNDcKK3Njb3JwaW8JCQlBUkNIX1NDT1JQSU8JCVNDT1JQSU8JCQkzNDgKK3ZpdmEJCQlBUkNIX1ZJVkEJCVZJVkEJCQkzNDkKK3B4YV94Y2FyZAkJQVJDSF9QWEFfWENBUkQJCVBYQV9YQ0FSRAkJMzUwCitjc2IzMzUJCQlBUkNIX0NTQjMzNQkJQ1NCMzM1CQkJMzUxCitpeHJkNDI1CQkJQVJDSF9JWFJENDI1CQlJWFJENDI1CQkJMzUyCitpcTgwMzE1CQkJQVJDSF9JUTgwMzE1CQlJUTgwMzE1CQkJMzUzCitubXA3MzEyCQkJQVJDSF9OTVA3MzEyCQlOTVA3MzEyCQkJMzU0CitjeDg2MXh4CQkJQVJDSF9DWDg2MVhYCQlDWDg2MVhYCQkJMzU1CitlbnAyNjExCQkJQVJDSF9FTlAyNjExCQlFTlAyNjExCQkJMzU2Cit4ZGEJCQlTQTExMDBfWERBCQlYREEJCQkzNTcKK2NzaXJfaW1zCQlBUkNIX0NTSVJfSU1TCQlDU0lSX0lNUwkJMzU4CitpeHA0MjFfZG5hZWV0aAkJQVJDSF9JWFA0MjFfRE5BRUVUSAlJWFA0MjFfRE5BRUVUSAkJMzU5Citwb2NrZXRzZXJ2OTIwMAkJQVJDSF9QT0NLRVRTRVJWOTIwMAlQT0NLRVRTRVJWOTIwMAkJMzYwCit0b3RvCQkJQVJDSF9UT1RPCQlUT1RPCQkJMzYxCitzM2MyNDQwCQkJQVJDSF9TM0MyNDQwCQlTM0MyNDQwCQkJMzYyCitrczg2OTVwCQkJQVJDSF9LUzg2OTVQCQlLUzg2OTVQCQkJMzYzCitzZTQwMDAJCQlBUkNIX1NFNDAwMAkJU0U0MDAwCQkJMzY0CitxdWFkcmljZXBzCQlBUkNIX1FVQURSSUNFUFMJCVFVQURSSUNFUFMJCTM2NQorYnJvbmNvCQkJQVJDSF9CUk9OQ08JCUJST05DTwkJCTM2NgorZXNsX3dpcmVsZXNzX3RhYglBUkNIX0VTTF9XSVJFTEVTU19UQUJMRVRFU0xfV0lSRUxFU1NfVEFCTEVUCTM2NworZXNsX3NvZmNvbXAJCUFSQ0hfRVNMX1NPRkNPTVAJRVNMX1NPRkNPTVAJCTM2OAorczVjNzM3NQkJCUFSQ0hfUzVDNzM3NQkJUzVDNzM3NQkJCTM2OQorc3BlYXJoZWFkCQlBUkNIX1NQRUFSSEVBRAkJU1BFQVJIRUFECQkzNzAKK3BhbnRlcmEJCQlBUkNIX1BBTlRFUkEJCVBBTlRFUkEJCQkzNzEKK3ByYXlvZ2xpdGUJCUFSQ0hfUFJBWU9HTElURQkJUFJBWU9HTElURQkJMzcyCitndW1zdGl4CQkJQVJDSF9HVU1TVElLCQlHVU1TVElLCQkJMzczCityY3ViZQkJCUFSQ0hfUkNVQkUJCVJDVUJFCQkJMzc0CityZWFfb2x2CQkJQVJDSF9SRUFfT0xWCQlSRUFfT0xWCQkJMzc1CitweGFfaXBob25lCQlBUkNIX1BYQV9JUEhPTkUJCVBYQV9JUEhPTkUJCTM3NgorczNjMzQxMAkJCUFSQ0hfUzNDMzQxMAkJUzNDMzQxMAkJCTM3NworZXNwZF80NTEwYgkJQVJDSF9FU1BEXzQ1MTBCCQlFU1BEXzQ1MTBCCQkzNzgKK21wMXgJCQlBUkNIX01QMVgJCU1QMVgJCQkzNzkKK2F0OTFybTkyMDB0YgkJQVJDSF9BVDkxUk05MjAwVEIJQVQ5MVJNOTIwMFRCCQkzODAKK2Fkc3ZneAkJCUFSQ0hfQURTVkdYCQlBRFNWR1gJCQkzODEKK29tYXBfaDIJCQlNQUNIX09NQVBfSDIJCU9NQVBfSDIJCQkzODIKK3BlbGVlCQkJQVJDSF9QRUxFRQkJUEVMRUUJCQkzODMKK2U3NDAJCQlNQUNIX0U3NDAJCUU3NDAJCQkzODQKK2lxODAzMzEJCQlBUkNIX0lRODAzMzEJCUlRODAzMzEJCQkzODUKK3ZlcnNhdGlsZV9wYgkJQVJDSF9WRVJTQVRJTEVfUEIJVkVSU0FUSUxFX1BCCQkzODcKK2tldjdhNDAwCQlNQUNIX0tFVjdBNDAwCQlLRVY3QTQwMAkJMzg4CitscGQ3YTQwMAkJTUFDSF9MUEQ3QTQwMAkJTFBEN0E0MDAJCTM4OQorbHBkN2E0MDQJCU1BQ0hfTFBEN0E0MDQJCUxQRDdBNDA0CQkzOTAKK2Z1aml0c3VfY2FtZWxvdAkJQVJDSF9GVUpJVFNVX0NBTUVMT1QJRlVKSVRTVV9DQU1FTE9UCQkzOTEKK2phbnVzMm0JCQlBUkNIX0pBTlVTMk0JCUpBTlVTMk0JCQkzOTIKK2VtYnRmCQkJTUFDSF9FTUJURgkJRU1CVEYJCQkzOTMKK2hwbQkJCU1BQ0hfSFBNCQlIUE0JCQkzOTQKK3NtZGsyNDEwdGsJCU1BQ0hfU01ESzI0MTBUSwkJU01ESzI0MTBUSwkJMzk1CitzbWRrMjQxMGFqCQlNQUNIX1NNREsyNDEwQUoJCVNNREsyNDEwQUoJCTM5Ngorc3RyZWV0cmFjZXIJCU1BQ0hfU1RSRUVUUkFDRVIJU1RSRUVUUkFDRVIJCTM5NworZWZyYW1lCQkJTUFDSF9FRlJBTUUJCUVGUkFNRQkJCTM5OAorY3NiMzM3CQkJTUFDSF9DU0IzMzcJCUNTQjMzNwkJCTM5OQorcHhhX2xhcmsJCU1BQ0hfUFhBX0xBUksJCVBYQV9MQVJLCQk0MDAKK3B4YV9wbnAyMTEwCQlNQUNIX1BOUDIxMTAJCVBOUDIxMTAJCQk0MDEKK3RjYzcyeAkJCU1BQ0hfVENDNzJYCQlUQ0M3MlgJCQk0MDIKK2FsdGFpcgkJCU1BQ0hfQUxUQUlSCQlBTFRBSVIJCQk0MDMKK2tjMwkJCU1BQ0hfS0MzCQlLQzMJCQk0MDQKK3NpbnRlZnRkCQlNQUNIX1NJTlRFRlRECQlTSU5URUZURAkJNDA1CittYWluc3RvbmUJCU1BQ0hfTUFJTlNUT05FCQlNQUlOU1RPTkUJCTQwNgorYWRheTR4CQkJTUFDSF9BREFZNFgJCUFEQVk0WAkJCTQwNworbGl0ZTMwMAkJCU1BQ0hfTElURTMwMAkJTElURTMwMAkJCTQwOAorczVjNzM3NgkJCU1BQ0hfUzVDNzM3NgkJUzVDNzM3NgkJCTQwOQorbXQwMgkJCU1BQ0hfTVQwMgkJTVQwMgkJCTQxMAorbXBvcnQzcwkJCU1BQ0hfTVBPUlQzUwkJTVBPUlQzUwkJCTQxMQorcmFfYWxwaGEJCU1BQ0hfUkFfQUxQSEEJCVJBX0FMUEhBCQk0MTIKK3hjZXAJCQlNQUNIX1hDRVAJCVhDRVAJCQk0MTMKK2FyY29tX21lcmN1cnkJCU1BQ0hfQVJDT01fTUVSQ1VSWQlBUkNPTV9NRVJDVVJZCQk0MTQKK3N0YXJnYXRlCQlNQUNIX1NUQVJHQVRFCQlTVEFSR0FURQkJNDE1Cithcm1hZGlsbG9qCQlNQUNIX0FSTUFESUxMT0oJCUFSTUFESUxMT0oJCTQxNgorZWxyb3lfamFjawkJTUFDSF9FTFJPWV9KQUNLCQlFTFJPWV9KQUNLCQk0MTcKK2JhY2tlbmQJCQlNQUNIX0JBQ0tFTkQJCUJBQ0tFTkQJCQk0MTgKK3M1bGluYm94CQlNQUNIX1M1TElOQk9YCQlTNUxJTkJPWAkJNDE5Citub21hZGlrCQkJTUFDSF9OT01BRElLCQlOT01BRElLCQkJNDIwCitpYV9jcHVfOTIwMAkJTUFDSF9JQV9DUFVfOTIwMAlJQV9DUFVfOTIwMAkJNDIxCithdDkxX2JqYTEJCU1BQ0hfQVQ5MV9CSkExCQlBVDkxX0JKQTEJCTQyMgorY29yZ2kJCQlNQUNIX0NPUkdJCQlDT1JHSQkJCTQyMworcG9vZGxlCQkJTUFDSF9QT09ETEUJCVBPT0RMRQkJCTQyNAordGVuCQkJTUFDSF9URU4JCVRFTgkJCTQyNQorcm92ZXJwNXAJCU1BQ0hfUk9WRVJQNVAJCVJPVkVSUDVQCQk0MjYKK3NjMjcwMAkJCU1BQ0hfU0MyNzAwCQlTQzI3MDAJCQk0MjcKK2V4X2VhZ2xlCQlNQUNIX0VYX0VBR0xFCQlFWF9FQUdMRQkJNDI4CitueF9weGExMgkJTUFDSF9OWF9QWEExMgkJTlhfUFhBMTIJCTQyOQorbnhfcHhhNQkJCU1BQ0hfTlhfUFhBNQkJTlhfUFhBNQkJCTQzMAorYmxhY2tib2FyZDIJCU1BQ0hfQkxBQ0tCT0FSRDIJQkxBQ0tCT0FSRDIJCTQzMQoraTgxOQkJCU1BQ0hfSTgxOQkJSTgxOQkJCTQzMgoraXhtYjk5NWUJCU1BQ0hfSVhNQjk5NUUJCUlYTUI5OTVFCQk0MzMKK3NreXJpZGVyCQlNQUNIX1NLWVJJREVSCQlTS1lSSURFUgkJNDM0Citza3loYXdrCQkJTUFDSF9TS1lIQVdLCQlTS1lIQVdLCQkJNDM1CitlbnRlcnByaXNlCQlNQUNIX0VOVEVSUFJJU0UJCUVOVEVSUFJJU0UJCTQzNgorZGVwMjQxMAkJCU1BQ0hfREVQMjQxMAkJREVQMjQxMAkJCTQzNworYXJtY29yZQkJCU1BQ0hfQVJNQ09SRQkJQVJNQ09SRQkJCTQzOAoraG9iYml0CQkJTUFDSF9IT0JCSVQJCUhPQkJJVAkJCTQzOQoraDcyMTAJCQlNQUNIX0g3MjEwCQlINzIxMAkJCTQ0MAorcHhhX25ldGRjdTUJCU1BQ0hfUFhBX05FVERDVTUJUFhBX05FVERDVTUJCTQ0MQorYWNjCQkJTUFDSF9BQ0MJCUFDQwkJCTQ0MgorZXNsX3NhcnZhCQlNQUNIX0VTTF9TQVJWQQkJRVNMX1NBUlZBCQk0NDMKK3htMjUwCQkJTUFDSF9YTTI1MAkJWE0yNTAJCQk0NDQKK3Q2dGMxeGIJCQlNQUNIX1Q2VEMxWEIJCVQ2VEMxWEIJCQk0NDUKK2VzczcxMAkJCU1BQ0hfRVNTNzEwCQlFU1M3MTAJCQk0NDYKK214M2FkcwkJCU1BQ0hfTVgzQURTCQlNWDNBRFMJCQk0NDcKK2hpbWFsYXlhCQlNQUNIX0hJTUFMQVlBCQlISU1BTEFZQQkJNDQ4Citib2xmZW5rCQkJTUFDSF9CT0xGRU5LCQlCT0xGRU5LCQkJNDQ5CithdDkxcm05MjAwa3IJCU1BQ0hfQVQ5MVJNOTIwMEtSCUFUOTFSTTkyMDBLUgkJNDUwCitlZGI5MzEyCQkJTUFDSF9FREI5MzEyCQlFREI5MzEyCQkJNDUxCitvbWFwX2dlbmVyaWMJCU1BQ0hfT01BUF9HRU5FUklDCU9NQVBfR0VORVJJQwkJNDUyCitheGlteDMJCQlNQUNIX0FYSU1YMwkJQVhJTVgzCQkJNDUzCitlYjY3eGRpcAkJTUFDSF9FQjY3WERJUAkJRUI2N1hESVAJCTQ1NAord2VidHhzCQkJTUFDSF9XRUJUWFMJCVdFQlRYUwkJCTQ1NQoraGF3awkJCU1BQ0hfSEFXSwkJSEFXSwkJCTQ1NgorY2NhdDkxc2JjMDAxCQlNQUNIX0NDQVQ5MVNCQzAwMQlDQ0FUOTFTQkMwMDEJCTQ1NworZXhwcmVzc28JCU1BQ0hfRVhQUkVTU08JCUVYUFJFU1NPCQk0NTgKK2g0MDAwCQkJTUFDSF9INDAwMAkJSDQwMDAJCQk0NTkKK2Rpbm8JCQlNQUNIX0RJTk8JCURJTk8JCQk0NjAKK21sNjc1awkJCU1BQ0hfTUw2NzVLCQlNTDY3NUsJCQk0NjEKK2VkYjkzMDEJCQlNQUNIX0VEQjkzMDEJCUVEQjkzMDEJCQk0NjIKK2VkYjkzMTUJCQlNQUNIX0VEQjkzMTUJCUVEQjkzMTUJCQk0NjMKK3JlY2l2YV90dAkJTUFDSF9SRUNJVkFfVFQJCVJFQ0lWQV9UVAkJNDY0Citjc3RjYjAxCQkJTUFDSF9DU1RDQjAxCQlDU1RDQjAxCQkJNDY1Citjc3RjYjEJCQlNQUNIX0NTVENCMQkJQ1NUQ0IxCQkJNDY2CitzaGFkd2VsbAkJTUFDSF9TSEFEV0VMTAkJU0hBRFdFTEwJCTQ2NworZ29lcGVsMjYzCQlNQUNIX0dPRVBFTDI2MwkJR09FUEVMMjYzCQk0NjgKK2FjcTEwMAkJCU1BQ0hfQUNRMTAwCQlBQ1ExMDAJCQk0NjkKK214MWZzMgkJCU1BQ0hfTVgxRlMyCQlNWDFGUzIJCQk0NzAKK2hpcHRvcF9nMQkJTUFDSF9ISVBUT1BfRzEJCUhJUFRPUF9HMQkJNDcxCitzcGFya3kJCQlNQUNIX1NQQVJLWQkJU1BBUktZCQkJNDcyCituczk3NTAJCQlNQUNIX05TOTc1MAkJTlM5NzUwCQkJNDczCitwaG9lbml4CQkJTUFDSF9QSE9FTklYCQlQSE9FTklYCQkJNDc0Cit2cjEwMDAJCQlNQUNIX1ZSMTAwMAkJVlIxMDAwCQkJNDc1CitkZWlzdGVycHhhCQlNQUNIX0RFSVNURVJQWEEJCURFSVNURVJQWEEJCTQ3NgorYmNtMTE2MAkJCU1BQ0hfQkNNMTE2MAkJQkNNMTE2MAkJCTQ3NworcGNtMDIyCQkJTUFDSF9QQ00wMjIJCVBDTTAyMgkJCTQ3OAorYWRzZ2N4CQkJTUFDSF9BRFNHQ1gJCUFEU0dDWAkJCTQ3OQorZHJlYWRuYXVnaHQJCU1BQ0hfRFJFQUROQVVHSFQJRFJFQUROQVVHSFQJCTQ4MAorZG0zMjAJCQlNQUNIX0RNMzIwCQlETTMyMAkJCTQ4MQorbWFya292CQkJTUFDSF9NQVJLT1YJCU1BUktPVgkJCTQ4MgorY29zN2E0MDAJCU1BQ0hfQ09TN0E0MDAJCUNPUzdBNDAwCQk0ODMKK21pbGFubwkJCU1BQ0hfTUlMQU5PCQlNSUxBTk8JCQk0ODQKK3VlOTMyOAkJCU1BQ0hfVUU5MzI4CQlVRTkzMjgJCQk0ODUKK3VleDI1NQkJCU1BQ0hfVUVYMjU1CQlVRVgyNTUJCQk0ODYKK3VlMjQxMAkJCU1BQ0hfVUUyNDEwCQlVRTI0MTAJCQk0ODcKK2E2MjAJCQlNQUNIX0E2MjAJCUE2MjAJCQk0ODgKK29jZWxvdAkJCU1BQ0hfT0NFTE9UCQlPQ0VMT1QJCQk0ODkKK2NoZWV0YWgJCQlNQUNIX0NIRUVUQUgJCUNIRUVUQUgJCQk0OTAKK29tYXBfcGVyc2V1czIJCU1BQ0hfT01BUF9QRVJTRVVTMglPTUFQX1BFUlNFVVMyCQk0OTEKK3p2dWUJCQlNQUNIX1pWVUUJCVpWVUUJCQk0OTIKK3JvdmVycDEJCQlNQUNIX1JPVkVSUDEJCVJPVkVSUDEJCQk0OTMKK2FzaWRpYWwyCQlNQUNIX0FTSURJQUwyCQlBU0lESUFMMgkJNDk0CitzM2MyNGEwCQkJTUFDSF9TM0MyNEEwCQlTM0MyNEEwCQkJNDk1CitlODAwCQkJTUFDSF9FODAwCQlFODAwCQkJNDk2CitlNzUwCQkJTUFDSF9FNzUwCQlFNzUwCQkJNDk3CitzM2M1NTAwCQkJTUFDSF9TM0M1NTAwCQlTM0M1NTAwCQkJNDk4CitzbWRrNTUwMAkJTUFDSF9TTURLNTUwMAkJU01ESzU1MDAJCTQ5OQorc2lnbmFsc3luYwkJTUFDSF9TSUdOQUxTWU5DCQlTSUdOQUxTWU5DCQk1MDAKK25iYwkJCU1BQ0hfTkJDCQlOQkMJCQk1MDEKK2tvZGlhawkJCU1BQ0hfS09ESUFLCQlLT0RJQUsJCQk1MDIKK25ldGJvb2twcm8JCU1BQ0hfTkVUQk9PS1BSTwkJTkVUQk9PS1BSTwkJNTAzCitodzkwMjAwCQkJTUFDSF9IVzkwMjAwCQlIVzkwMjAwCQkJNTA0Citjb25kb3IJCQlNQUNIX0NPTkRPUgkJQ09ORE9SCQkJNTA1CitjdXAJCQlNQUNIX0NVUAkJQ1VQCQkJNTA2CitraXRlCQkJTUFDSF9LSVRFCQlLSVRFCQkJNTA3CitzY2I5MzI4CQkJTUFDSF9TQ0I5MzI4CQlTQ0I5MzI4CQkJNTA4CitvbWFwX2gzCQkJTUFDSF9PTUFQX0gzCQlPTUFQX0gzCQkJNTA5CitvbWFwX2g0CQkJTUFDSF9PTUFQX0g0CQlPTUFQX0g0CQkJNTEwCituMTAJCQlNQUNIX04xMAkJTjEwCQkJNTExCittb250ZWphZGUJCU1BQ0hfTU9OVEFKQURFCQlNT05UQUpBREUJCTUxMgorc2c1NjAJCQlNQUNIX1NHNTYwCQlTRzU2MAkJCTUxMworZHAxMDAwCQkJTUFDSF9EUDEwMDAJCURQMTAwMAkJCTUxNAorb21hcF9vc2sJCU1BQ0hfT01BUF9PU0sJCU9NQVBfT1NLCQk1MTUKK3JnMTAwdjMJCQlNQUNIX1JHMTAwVjMJCVJHMTAwVjMJCQk1MTYKK214MmFkcwkJCU1BQ0hfTVgyQURTCQlNWDJBRFMJCQk1MTcKK3B4YV9raWxvCQlNQUNIX1BYQV9LSUxPCQlQWEFfS0lMTwkJNTE4CitpeHA0eHhfZWFnbGUJCU1BQ0hfSVhQNFhYX0VBR0xFCUlYUDRYWF9FQUdMRQkJNTE5Cit0b3NhCQkJTUFDSF9UT1NBCQlUT1NBCQkJNTIwCittYjI1MjBmCQkJTUFDSF9NQjI1MjBGCQlNQjI1MjBGCQkJNTIxCitlbWMxMDAwCQkJTUFDSF9FTUMxMDAwCQlFTUMxMDAwCQkJNTIyCit0aWRzYzI1CQkJTUFDSF9USURTQzI1CQlUSURTQzI1CQkJNTIzCitha2NwbXhsCQkJTUFDSF9BS0NQTVhMCQlBS0NQTVhMCQkJNTI0CithdjN4eAkJCU1BQ0hfQVYzWFgJCUFWM1hYCQkJNTI1CithdmlsYQkJCU1BQ0hfQVZJTEEJCUFWSUxBCQkJNTI2CitweGFfbXBtMTAJCU1BQ0hfUFhBX01QTTEwCQlQWEFfTVBNMTAJCTUyNworcHhhX2t5YW5pdGUJCU1BQ0hfUFhBX0tZQU5JVEUJUFhBX0tZQU5JVEUJCTUyOAorc2dvbGQJCQlNQUNIX1NHT0xECQlTR09MRAkJCTUyOQorb3NjYXIJCQlNQUNIX09TQ0FSCQlPU0NBUgkJCTUzMAorZXB4YTR1c2IyCQlNQUNIX0VQWEE0VVNCMgkJRVBYQTRVU0IyCQk1MzEKK3hzZW5naW5lCQlNQUNIX1hTRU5HSU5FCQlYU0VOR0lORQkJNTMyCitpcDYwMAkJCU1BQ0hfSVA2MDAJCUlQNjAwCQkJNTMzCittY2FuMgkJCU1BQ0hfTUNBTjIJCU1DQU4yCQkJNTM0CitkZGlfYmx1ZXJpZGdlCQlNQUNIX0RESV9CTFVFUklER0UJRERJX0JMVUVSSURHRQkJNTM1Citza3ltaW5kZXIJCU1BQ0hfU0tZTUlOREVSCQlTS1lNSU5ERVIJCTUzNgorbHBkNzk1MjAJCU1BQ0hfTFBENzk1MjAJCUxQRDc5NTIwCQk1MzcKK2VkYjkzMDIJCQlNQUNIX0VEQjkzMDIJCUVEQjkzMDIJCQk1MzgKK2h3OTAzNDAJCQlNQUNIX0hXOTAzNDAJCUhXOTAzNDAJCQk1MzkKK2NpcF9ib3gJCQlNQUNIX0NJUF9CT1gJCUNJUF9CT1gJCQk1NDAKK2l2cG4JCQlNQUNIX0lWUE4JCUlWUE4JCQk1NDEKK3Jzb2MyCQkJTUFDSF9SU09DMgkJUlNPQzIJCQk1NDIKK2h1c2t5CQkJTUFDSF9IVVNLWQkJSFVTS1kJCQk1NDMKK2JveGVyCQkJTUFDSF9CT1hFUgkJQk9YRVIJCQk1NDQKK3NoZXBoZXJkCQlNQUNIX1NIRVBIRVJECQlTSEVQSEVSRAkJNTQ1CithbWw0MjgwMGFhCQlNQUNIX0FNTDQyODAwQUEJCUFNTDQyODAwQUEJCTU0NgorbWw2NzQwMDEJCU1BQ0hfTUFDSF9UWVBFX01MNjc0MDAxCU1BQ0hfVFlQRV9NTDY3NDAwMQk1NDcKK2xwYzIyOTQJCQlNQUNIX0xQQzIyOTQJCUxQQzIyOTQJCQk1NDgKK3N3aXRjaGdyYXNzCQlNQUNIX1NXSVRDSEdSQVNTCVNXSVRDSEdSQVNTCQk1NDkKK2Vuc19jbXUJCQlNQUNIX0VOU19DTVUJCUVOU19DTVUJCQk1NTAKK21tNl9zZGIJCQlNQUNIX01NNl9TREIJCU1NNl9TREIJCQk1NTEKK3NhdHVybgkJCU1BQ0hfU0FUVVJOCQlTQVRVUk4JCQk1NTIKK2FyZ29ucGx1c2V2YgkJTUFDSF9BUkdPTlBMVVNFVkIJQVJHT05QTFVTRVZCCQk1NTMKK3NjbWExMWV2YgkJTUFDSF9TQ01BMTFFVkIJCVNDTUExMUVWQgkJNTU0CitzbWRrMjgwMAkJTUFDSF9TTURLMjgwMAkJU01ESzI4MDAJCTU1NQorbXR3aWxzb24JCU1BQ0hfTVRXSUxTT04JCU1UV0lMU09OCQk1NTYKK3ppdGkJCQlNQUNIX1pJVEkJCVpJVEkJCQk1NTcKK2dyYW5kZmF0aGVyCQlNQUNIX0dSQU5ERkFUSEVSCUdSQU5ERkFUSEVSCQk1NTgKK3RlbmdpbmUJCQlNQUNIX1RFTkdJTkUJCVRFTkdJTkUJCQk1NTkKK3MzYzI0NjAJCQlNQUNIX1MzQzI0NjAJCVMzQzI0NjAJCQk1NjAKK3BkbQkJCU1BQ0hfUERNCQlQRE0JCQk1NjEKK2g0NzAwCQkJTUFDSF9INDcwMAkJSDQ3MDAJCQk1NjIKK2g2MzAwCQkJTUFDSF9INjMwMAkJSDYzMDAJCQk1NjMKK3J6MTcwMAkJCU1BQ0hfUloxNzAwCQlSWjE3MDAJCQk1NjQKK2E3MTYJCQlNQUNIX0E3MTYJCUE3MTYJCQk1NjUKK2VzdGsyNDQwYQkJTUFDSF9FU1RLMjQ0MEEJCUVTVEsyNDQwQQkJNTY2CithdHdpeHA0MjUJCU1BQ0hfQVRXSVhQNDI1CQlBVFdJWFA0MjUJCTU2NworY3NiMzM2CQkJTUFDSF9DU0IzMzYJCUNTQjMzNgkJCTU2OAorcmlybTIJCQlNQUNIX1JJUk0yCQlSSVJNMgkJCTU2OQorY3gyMzUxOAkJCU1BQ0hfQ1gyMzUxOAkJQ1gyMzUxOAkJCTU3MAorY3gyMzUxeAkJCU1BQ0hfQ1gyMzUxWAkJQ1gyMzUxWAkJCTU3MQorY29tcHV0aW1lCQlNQUNIX0NPTVBVVElNRQkJQ09NUFVUSU1FCQk1NzIKK2l6YXJ1cwkJCU1BQ0hfSVpBUlVTCQlJWkFSVVMJCQk1NzMKK3B4YV9ydHMJCQlNQUNIX1JUUwkJUlRTCQkJNTc0CitzZTUxMDAJCQlNQUNIX1NFNTEwMAkJU0U1MTAwCQkJNTc1CitzM2MyNTEwCQkJTUFDSF9TM0MyNTEwCQlTM0MyNTEwCQkJNTc2Citjc2I0Mzd0bAkJTUFDSF9DU0I0MzdUTAkJQ1NCNDM3VEwJCTU3Nworc2xhdXNvbgkJCU1BQ0hfU0xBVVNPTgkJU0xBVVNPTgkJCTU3OAorcGVhcmxyaXZlcgkJTUFDSF9QRUFSTFJJVkVSCQlQRUFSTFJJVkVSCQk1NzkKK3RkY19wMjEwCQlNQUNIX1REQ19QMjEwCQlURENfUDIxMAkJNTgwCitzZzU4MAkJCU1BQ0hfU0c1ODAJCVNHNTgwCQkJNTgxCit3cnNiY2FybTcJCU1BQ0hfV1JTQkNBUk03CQlXUlNCQ0FSTTcJCTU4MgoraXBkCQkJTUFDSF9JUEQJCUlQRAkJCTU4MworcHhhX2RucDIxMTAJCU1BQ0hfUFhBX0ROUDIxMTAJUFhBX0ROUDIxMTAJCTU4NAoreGFlbmlheAkJCU1BQ0hfWEFFTklBWAkJWEFFTklBWAkJCTU4NQorc29tbjQyNTAJCU1BQ0hfU09NTjQyNTAJCVNPTU40MjUwCQk1ODYKK3BsZWIyCQkJTUFDSF9QTEVCMgkJUExFQjIJCQk1ODcKK2Nvcm53YWxsaXMJCU1BQ0hfQ09STldBTExJUwkJQ09STldBTExJUwkJNTg4CitndXJuZXlfZHJ2CQlNQUNIX0dVUk5FWV9EUlYJCUdVUk5FWV9EUlYJCTU4OQorY2hhZmZlZQkJCU1BQ0hfQ0hBRkZFRQkJQ0hBRkZFRQkJCTU5MAorcm1zMTAxCQkJTUFDSF9STVMxMDEJCVJNUzEwMQkJCTU5MQorcngzNzE1CQkJTUFDSF9SWDM3MTUJCVJYMzcxNQkJCTU5Mgorc3dpZnQJCQlNQUNIX1NXSUZUCQlTV0lGVAkJCTU5Mworcm92ZXJwNwkJCU1BQ0hfUk9WRVJQNwkJUk9WRVJQNwkJCTU5NAorcHI4MThzCQkJTUFDSF9QUjgxOFMJCVBSODE4UwkJCTU5NQordHJ4cHJvCQkJTUFDSF9UUlhQUk8JCVRSWFBSTwkJCTU5NgorbnNsdTIJCQlNQUNIX05TTFUyCQlOU0xVMgkJCTU5NworZTQwMAkJCU1BQ0hfRTQwMAkJRTQwMAkJCTU5OAordHJhYgkJCU1BQ0hfVFJBQgkJVFJBQgkJCTU5OQorY21jX3B1MgkJCU1BQ0hfQ01DX1BVMgkJQ01DX1BVMgkJCTYwMAorZnVsY3J1bQkJCU1BQ0hfRlVMQ1JVTQkJRlVMQ1JVTQkJCTYwMQorbmV0Z2F0ZTQyeAkJTUFDSF9ORVRHQVRFNDJYCQlORVRHQVRFNDJYCQk2MDIKK3N0cjcxMAkJCU1BQ0hfU1RSNzEwCQlTVFI3MTAJCQk2MDMKK2l4ZHBnNDI1CQlNQUNIX0lYRFBHNDI1CQlJWERQRzQyNQkJNjA0Cit0b210b21nbwkJTUFDSF9UT01UT01HTwkJVE9NVE9NR08JCTYwNQordmVyc2F0aWxlX2FiCQlNQUNIX1ZFUlNBVElMRV9BQglWRVJTQVRJTEVfQUIJCTYwNgorZWRiOTMwNwkJCU1BQ0hfRURCOTMwNwkJRURCOTMwNwkJCTYwNworc2c1NjUJCQlNQUNIX1NHNTY1CQlTRzU2NQkJCTYwOAorbHBkNzk1MjQJCU1BQ0hfTFBENzk1MjQJCUxQRDc5NTI0CQk2MDkKK2xwZDc5NTI1CQlNQUNIX0xQRDc5NTI1CQlMUEQ3OTUyNQkJNjEwCitybXMxMDAJCQlNQUNIX1JNUzEwMAkJUk1TMTAwCQkJNjExCitrYjkyMDAJCQlNQUNIX0tCOTIwMAkJS0I5MjAwCQkJNjEyCitzeDEJCQlNQUNIX1NYMQkJU1gxCQkJNjEzCitobXMzOWM3MDkyCQlNQUNIX0hNUzM5QzcwOTIJCUhNUzM5QzcwOTIJCTYxNAorYXJtYWRpbGxvCQlNQUNIX0FSTUFESUxMTwkJQVJNQURJTExPCQk2MTUKK2lwY3UJCQlNQUNIX0lQQ1UJCUlQQ1UJCQk2MTYKK2xvb3g3MjAJCQlNQUNIX0xPT1g3MjAJCUxPT1g3MjAJCQk2MTcKK2l4ZHA0NjUJCQlNQUNIX0lYRFA0NjUJCUlYRFA0NjUJCQk2MTgKK2l4ZHAyMzUxCQlNQUNIX0lYRFAyMzUxCQlJWERQMjM1MQkJNjE5CithZHN2aXgJCQlNQUNIX0FEU1ZJWAkJQURTVklYCQkJNjIwCitkbTI3MAkJCU1BQ0hfRE0yNzAJCURNMjcwCQkJNjIxCitzb2NsdHBsdXMJCU1BQ0hfU09DTFRQTFVTCQlTT0NMVFBMVVMJCTYyMgorZWNpYQkJCU1BQ0hfRUNJQQkJRUNJQQkJCTYyMworY200MDA4CQkJTUFDSF9DTTQwMDgJCUNNNDAwOAkJCTYyNAorcDIwMDEJCQlNQUNIX1AyMDAxCQlQMjAwMQkJCTYyNQordHdpc3RlcgkJCU1BQ0hfVFdJU1RFUgkJVFdJU1RFUgkJCTYyNgorbXVkc2hhcmsJCU1BQ0hfTVVEU0hBUksJCU1VRFNIQVJLCQk2MjcKK2hiMgkJCU1BQ0hfSEIyCQlIQjIJCQk2MjgKK2lxODAzMzIJCQlNQUNIX0lRODAzMzIJCUlRODAzMzIJCQk2MjkKK3NlbmR0CQkJTUFDSF9TRU5EVAkJU0VORFQJCQk2MzAKK214MmphenoJCQlNQUNIX01YMkpBWloJCU1YMkpBWloJCQk2MzEKK211bHRpaW8JCQlNQUNIX01VTFRJSU8JCU1VTFRJSU8JCQk2MzIKK2hyZGlzcGxheQkJTUFDSF9IUkRJU1BMQVkJCUhSRElTUExBWQkJNjMzCitzY21hMTFiYgkJTUFDSF9TQ01BMTFCQgkJU0NNQTExQkIJCTYzNAordHJpemVwczMJCU1BQ0hfVFJJWkVQUzMJCVRSSVpFUFMzCQk2MzUKK3plZmVlcmR6YQkJTUFDSF9aRUZFRVJEWkEJCVpFRkVFUkRaQQkJNjM2Cit6ZWZlZXJkemIJCU1BQ0hfWkVGRUVSRFpCCQlaRUZFRVJEWkIJCTYzNworemVmZWVyZHpnCQlNQUNIX1pFRkVFUkRaRwkJWkVGRUVSRFpHCQk2MzgKK3plZmVlcmR6bgkJTUFDSF9aRUZFRVJEWk4JCVpFRkVFUkRaTgkJNjM5Cit6ZWZlZXJkenEJCU1BQ0hfWkVGRUVSRFpRCQlaRUZFRVJEWlEJCTY0MAorZ3R3eDU3MTUJCU1BQ0hfR1RXWDU3MTUJCUdUV1g1NzE1CQk2NDEKK2FzdHJvX2phY2sJCU1BQ0hfQVNUUk9fSkFDSwkJQVNUUk9fSkFDSwkJNjQzCit0aXAwMwkJCU1BQ0hfVElQMDMJCVRJUDAzCQkJNjQ0CithOTIwMGVjCQkJTUFDSF9BOTIwMEVDCQlBOTIwMEVDCQkJNjQ1CitwbngwMTA1CQkJTUFDSF9QTlgwMTA1CQlQTlgwMTA1CQkJNjQ2CithZGNwb2VjcHUJCU1BQ0hfQURDUE9FQ1BVCQlBRENQT0VDUFUJCTY0NworY3NiNjM3CQkJTUFDSF9DU0I2MzcJCUNTQjYzNwkJCTY0OAorbWw2OXE2MjAzCQlNQUNIX01MNjlRNjIwMwkJTUw2OVE2MjAzCQk2NDkKK21iOTIwMAkJCU1BQ0hfTUI5MjAwCQlNQjkyMDAJCQk2NTAKK2t1bHVuCQkJTUFDSF9LVUxVTgkJS1VMVU4JCQk2NTEKK3NuYXBwZXIJCQlNQUNIX1NOQVBQRVIJCVNOQVBQRVIJCQk2NTIKK29wdGltYQkJCU1BQ0hfT1BUSU1BCQlPUFRJTUEJCQk2NTMKK2RsaHNiYwkJCU1BQ0hfRExIU0JDCQlETEhTQkMJCQk2NTQKK3gzMAkJCU1BQ0hfWDMwCQlYMzAJCQk2NTUKK24zMAkJCU1BQ0hfTjMwCQlOMzAJCQk2NTYKK21hbmdhX2tzODY5NQkJTUFDSF9NQU5HQV9LUzg2OTUJTUFOR0FfS1M4Njk1CQk2NTcKK2FqYXgJCQlNQUNIX0FKQVgJCUFKQVgJCQk2NTgKK25lY19tcDkwMAkJTUFDSF9ORUNfTVA5MDAJCU5FQ19NUDkwMAkJNjU5Cit2dnRrMTAwMAkJTUFDSF9WVlRLMTAwMAkJVlZUSzEwMDAJCTY2MQora2FmYQkJCU1BQ0hfS0FGQQkJS0FGQQkJCTY2MgordnZ0azMwMDAJCU1BQ0hfVlZUSzMwMDAJCVZWVEszMDAwCQk2NjMKK3BpbXgxCQkJTUFDSF9QSU1YMQkJUElNWDEJCQk2NjQKK29sbGllCQkJTUFDSF9PTExJRQkJT0xMSUUJCQk2NjUKK3NreW1heAkJCU1BQ0hfU0tZTUFYCQlTS1lNQVgJCQk2NjYKK2phenoJCQlNQUNIX0pBWloJCUpBWloJCQk2NjcKK3RlbF90MwkJCU1BQ0hfVEVMX1QzCQlURUxfVDMJCQk2NjgKK2Fpc2lub19mY3IyNTUJCU1BQ0hfQUlTSU5PX0ZDUjI1NQlBSVNJTk9fRkNSMjU1CQk2NjkKK2J0d2ViCQkJTUFDSF9CVFdFQgkJQlRXRUIJCQk2NzAKK2RiZ19saDc5NTIwCQlNQUNIX0RCR19MSDc5NTIwCURCR19MSDc5NTIwCQk2NzEKK2NtNDF4eAkJCU1BQ0hfQ000MVhYCQlDTTQxWFgJCQk2NzIKK3RzNzJ4eAkJCU1BQ0hfVFM3MlhYCQlUUzcyWFgJCQk2NzMKK25nZ3B4YQkJCU1BQ0hfTkdHUFhBCQlOR0dQWEEJCQk2NzQKK2NzYjUzNQkJCU1BQ0hfQ1NCNTM1CQlDU0I1MzUJCQk2NzUKK2NzYjUzNgkJCU1BQ0hfQ1NCNTM2CQlDU0I1MzYJCQk2NzYKK3B4YV90cmFrcG9kCQlNQUNIX1BYQV9UUkFLUE9ECVBYQV9UUkFLUE9ECQk2NzcKK3ByYXhpcwkJCU1BQ0hfUFJBWElTCQlQUkFYSVMJCQk2NzgKK2xoNzU0MTEJCQlNQUNIX0xINzU0MTEJCUxINzU0MTEJCQk2NzkKK290b20JCQlNQUNIX09UT00JCU9UT00JCQk2ODAKK25leGNvZGVyXzI0NDAJCU1BQ0hfTkVYQ09ERVJfMjQ0MAlORVhDT0RFUl8yNDQwCQk2ODEKK2xvb3g0MTAJCQlNQUNIX0xPT1g0MTAJCUxPT1g0MTAJCQk2ODIKK3dlc3RsYWtlCQlNQUNIX1dFU1RMQUtFCQlXRVNUTEFLRQkJNjgzCituc2IJCQlNQUNIX05TQgkJTlNCCQkJNjg0Citlc2xfc2FydmFfc3RuCQlNQUNIX0VTTF9TQVJWQV9TVE4JRVNMX1NBUlZBX1NUTgkJNjg1Citlc2xfc2FydmFfdGZ0CQlNQUNIX0VTTF9TQVJWQV9URlQJRVNMX1NBUlZBX1RGVAkJNjg2Citlc2xfc2FydmFfaWFkCQlNQUNIX0VTTF9TQVJWQV9JQUQJRVNMX1NBUlZBX0lBRAkJNjg3Citlc2xfc2FydmFfYWNjCQlNQUNIX0VTTF9TQVJWQV9BQ0MJRVNMX1NBUlZBX0FDQwkJNjg4Cit0eXBob29uCQkJTUFDSF9UWVBIT09OCQlUWVBIT09OCQkJNjg5CitjbmF2CQkJTUFDSF9DTkFWCQlDTkFWCQkJNjkwCithNzMwCQkJTUFDSF9BNzMwCQlBNzMwCQkJNjkxCituZXRzdGFyCQkJTUFDSF9ORVRTVEFSCQlORVRTVEFSCQkJNjkyCitzdXBlcmNvbgkJTUFDSF9QSEFTRUZBTEVfU1VQRVJDT04JUEhBU0VGQUxFX1NVUEVSQ09OCTY5Mworc2hpdmExMTAwCQlNQUNIX1NISVZBMTEwMAkJU0hJVkExMTAwCQk2OTQKK2V0ZXhzYwkJCU1BQ0hfRVRFWFNDCQlFVEVYU0MJCQk2OTUKK2l4ZHBnNDY1CQlNQUNIX0lYRFBHNDY1CQlJWERQRzQ2NQkJNjk2CithOW0yNDEwCQkJTUFDSF9BOU0yNDEwCQlBOU0yNDEwCQkJNjk3CithOW0yNDQwCQkJTUFDSF9BOU0yNDQwCQlBOU0yNDQwCQkJNjk4CithOW05NzUwCQkJTUFDSF9BOU05NzUwCQlBOU05NzUwCQkJNjk5CithOW05MzYwCQkJTUFDSF9BOU05MzYwCQlBOU05MzYwCQkJNzAwCit1bmM5MAkJCU1BQ0hfVU5DOTAJCVVOQzkwCQkJNzAxCitlY285MjAJCQlNQUNIX0VDTzkyMAkJRUNPOTIwCQkJNzAyCitzYXR2aWV3CQkJTUFDSF9TQVRWSUVXCQlTQVRWSUVXCQkJNzAzCityb2FkcnVubmVyCQlNQUNIX1JPQURSVU5ORVIJCVJPQURSVU5ORVIJCTcwNAorYXQ5MXJtOTIwMGVrCQlNQUNIX0FUOTFSTTkyMDBFSwlBVDkxUk05MjAwRUsJCTcwNQorZ3AzMgkJCU1BQ0hfR1AzMgkJR1AzMgkJCTcwNgorZ2VtCQkJTUFDSF9HRU0JCUdFTQkJCTcwNworaTg1OAkJCU1BQ0hfSTg1OAkJSTg1OAkJCTcwOAoraHgyNzUwCQkJTUFDSF9IWDI3NTAJCUhYMjc1MAkJCTcwOQoremV1c2V2YgkJCU1BQ0hfWkVVU0VWQgkJWkVVU0VWQgkJCTcxMAorcDcwMAkJCU1BQ0hfUDcwMAkJUDcwMAkJCTcxMQorY3BlCQkJTUFDSF9DUEUJCUNQRQkJCTcxMgorc3BpdHoJCQlNQUNIX1NQSVRaCQlTUElUWgkJCTcxMworbmltYnJhMzQwCQlNQUNIX05JTUJSQTM0MAkJTklNQlJBMzQwCQk3MTQKK2xwYzIyeHgJCQlNQUNIX0xQQzIyWFgJCUxQQzIyWFgJCQk3MTUKK29tYXBfY29tZXQzCQlNQUNIX0NPTUVUMwkJQ09NRVQzCQkJNzE2CitvbWFwX2NvbWV0NAkJTUFDSF9DT01FVDQJCUNPTUVUNAkJCTcxNworY3NiNjI1CQkJTUFDSF9DU0I2MjUJCUNTQjYyNQkJCTcxOApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL01ha2VmaWxlIGIvYXJjaC9hcm0vdmZwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWJhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS92ZnAvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBsaW51eC9hcmNoL2FybS92ZnAvTWFrZWZpbGUKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxIEFSTSBMaW1pdGVkCisjCisKKyMgRVhUUkFfQ0ZMQUdTIDo9IC1EREVCVUcKKyMgRVhUUkFfQUZMQUdTIDo9IC1EREVCVUcKKworb2JqLXkJCQkrPSB2ZnAubworCit2ZnAtJChDT05GSUdfVkZQKQkrPSBlbnRyeS5vIHZmcG1vZHVsZS5vIHZmcGh3Lm8gdmZwc2luZ2xlLm8gdmZwZG91YmxlLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC9lbnRyeS5TIGIvYXJjaC9hcm0vdmZwL2VudHJ5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczYzhkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3ZmcC9lbnRyeS5TCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vdmZwL2VudHJ5LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkLgorICogIFdyaXR0ZW4gYnkgRGVlcCBCbHVlIFNvbHV0aW9ucyBMaW1pdGVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQmFzaWMgZW50cnkgY29kZSwgY2FsbGVkIGZyb20gdGhlIGtlcm5lbCdzIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiB0cmFwLgorICogIHIwICA9IGZhdWx0ZWQgaW5zdHJ1Y3Rpb24KKyAqICByNSAgPSBmYXVsdGVkIFBDKzQKKyAqICByOSAgPSBzdWNjZXNzZnVsIHJldHVybgorICogIHIxMCA9IHRocmVhZF9pbmZvIHN0cnVjdHVyZQorICogIGxyICA9IGZhaWx1cmUgcmV0dXJuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vdmZwbWFjcm9zLmg+CisKKwkuZ2xvYmwJZG9fdmZwCitkb192ZnA6CisgCWxkcglyNCwgLkxDdmZwCisJYWRkCXIxMCwgcjEwLCAjVElfVkZQU1RBVEUJQCByMTAgPSB3b3Jrc3BhY2UKKwlsZHIJcGMsIFtyNF0JCUAgY2FsbCBWRlAgZW50cnkgcG9pbnQKKworLkxDdmZwOgorCS53b3JkCXZmcF92ZWN0b3IKKworQCBUaGlzIGNvZGUgaXMgY2FsbGVkIGlmIHRoZSBWRlAgZG9lcyBub3QgZXhpc3QuIEl0IG5lZWRzIHRvIGZsYWcgdGhlCitAIGZhaWx1cmUgdG8gdGhlIFZGUCBpbml0aWFsaXNhdGlvbiBjb2RlLgorCisJX19JTklUCisJLmdsb2JsCXZmcF90ZXN0aW5nX2VudHJ5Cit2ZnBfdGVzdGluZ19lbnRyeToKKwlsZHIJcjAsIFZGUF9hcmNoX2FkZHJlc3MKKwlzdHIJcjUsIFtyMF0JCUAga25vd24gbm9uLXplcm8gdmFsdWUKKwltb3YJcGMsIHI5CQkJQCB3ZSBoYXZlIGhhbmRsZWQgdGhlIGZhdWx0CisKK1ZGUF9hcmNoX2FkZHJlc3M6CisJLndvcmQJVkZQX2FyY2gKKworCV9fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnAuaCBiL2FyY2gvYXJtL3ZmcC92ZnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWEwMmJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcC5oCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3ZmcC92ZnAuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQuCisgKiAgV3JpdHRlbiBieSBEZWVwIEJsdWUgU29sdXRpb25zIExpbWl0ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiB2ZnBfc2hpZnRyaWdodDMyamFtbWluZyh1MzIgdmFsLCB1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisJaWYgKHNoaWZ0KSB7CisJCWlmIChzaGlmdCA8IDMyKQorCQkJdmFsID0gdmFsID4+IHNoaWZ0IHwgKCh2YWwgPDwgKDMyIC0gc2hpZnQpKSAhPSAwKTsKKwkJZWxzZQorCQkJdmFsID0gdmFsICE9IDA7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IHZmcF9zaGlmdHJpZ2h0NjRqYW1taW5nKHU2NCB2YWwsIHVuc2lnbmVkIGludCBzaGlmdCkKK3sKKwlpZiAoc2hpZnQpIHsKKwkJaWYgKHNoaWZ0IDwgNjQpCisJCQl2YWwgPSB2YWwgPj4gc2hpZnQgfCAoKHZhbCA8PCAoNjQgLSBzaGlmdCkpICE9IDApOworCQllbHNlCisJCQl2YWwgPSB2YWwgIT0gMDsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmZwX2hpNjR0bzMyamFtbWluZyh1NjQgdmFsKQoreworCXUzMiB2OworCisJYXNtKAorCSJjbXAJJVExLCAjMQkJQCB2ZnBfaGk2NHRvMzJqYW1taW5nXG5cdCIKKwkibW92Y2MJJTAsICVSMVxuXHQiCisJIm9ycmNzCSUwLCAlUjEsICMxIgorCTogIj1yIiAodikgOiAiciIgKHZhbCkgOiAiY2MiKTsKKworCXJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkMTI4KHU2NCAqcmVzaCwgdTY0ICpyZXNsLCB1NjQgbmgsIHU2NCBubCwgdTY0IG1oLCB1NjQgbWwpCit7CisJYXNtKAkiYWRkcwklUTAsICVRMiwgJVE0XG5cdCIKKwkJImFkY3MJJVIwLCAlUjIsICVSNFxuXHQiCisJCSJhZGNzCSVRMSwgJVEzLCAlUTVcblx0IgorCQkiYWRjCSVSMSwgJVIzLCAlUjUiCisJICAgIDogIj1yIiAobmwpLCAiPXIiIChuaCkKKwkgICAgOiAiMCIgKG5sKSwgIjEiIChuaCksICJyIiAobWwpLCAiciIgKG1oKQorCSAgICA6ICJjYyIpOworCSpyZXNoID0gbmg7CisJKnJlc2wgPSBubDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1YjEyOCh1NjQgKnJlc2gsIHU2NCAqcmVzbCwgdTY0IG5oLCB1NjQgbmwsIHU2NCBtaCwgdTY0IG1sKQoreworCWFzbSgJInN1YnMJJVEwLCAlUTIsICVRNFxuXHQiCisJCSJzYmNzCSVSMCwgJVIyLCAlUjRcblx0IgorCQkic2JjcwklUTEsICVRMywgJVE1XG5cdCIKKwkJInNiYwklUjEsICVSMywgJVI1XG5cdCIKKwkgICAgOiAiPXIiIChubCksICI9ciIgKG5oKQorCSAgICA6ICIwIiAobmwpLCAiMSIgKG5oKSwgInIiIChtbCksICJyIiAobWgpCisJICAgIDogImNjIik7CisJKnJlc2ggPSBuaDsKKwkqcmVzbCA9IG5sOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVsNjR0bzEyOCh1NjQgKnJlc2gsIHU2NCAqcmVzbCwgdTY0IG4sIHU2NCBtKQoreworCXUzMiBuaCwgbmwsIG1oLCBtbDsKKwl1NjQgcmgsIHJtYSwgcm1iLCBybDsKKworCW5sID0gbjsKKwltbCA9IG07CisJcmwgPSAodTY0KW5sICogbWw7CisKKwluaCA9IG4gPj4gMzI7CisJcm1hID0gKHU2NCluaCAqIG1sOworCisJbWggPSBtID4+IDMyOworCXJtYiA9ICh1NjQpbmwgKiBtaDsKKwlybWEgKz0gcm1iOworCisJcmggPSAodTY0KW5oICogbWg7CisJcmggKz0gKCh1NjQpKHJtYSA8IHJtYikgPDwgMzIpICsgKHJtYSA+PiAzMik7CisKKwlybWEgPDw9IDMyOworCXJsICs9IHJtYTsKKwlyaCArPSAocmwgPCBybWEpOworCisJKnJlc2wgPSBybDsKKwkqcmVzaCA9IHJoOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2hpZnQ2NGxlZnQodTY0ICpyZXNoLCB1NjQgKnJlc2wsIHU2NCBuKQoreworCSpyZXNoID0gbiA+PiA2MzsKKwkqcmVzbCA9IG4gPDwgMTsKK30KKworc3RhdGljIGlubGluZSB1NjQgdmZwX2hpNjRtdWx0aXBseTY0KHU2NCBuLCB1NjQgbSkKK3sKKwl1NjQgcmgsIHJsOworCW11bDY0dG8xMjgoJnJoLCAmcmwsIG4sIG0pOworCXJldHVybiByaCB8IChybCAhPSAwKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgdmZwX2VzdGltYXRlX2RpdjEyOHRvNjQodTY0IG5oLCB1NjQgbmwsIHU2NCBtKQoreworCXU2NCBtaCwgbWwsIHJlbWgsIHJlbWwsIHRlcm1oLCB0ZXJtbCwgejsKKworCWlmIChuaCA+PSBtKQorCQlyZXR1cm4gfjBVTEw7CisJbWggPSBtID4+IDMyOworCXogPSAobWggPDwgMzIgPD0gbmgpID8gMHhmZmZmZmZmZjAwMDAwMDAwVUxMIDogKG5oIC8gbWgpIDw8IDMyOworCW11bDY0dG8xMjgoJnRlcm1oLCAmdGVybWwsIG0sIHopOworCXN1YjEyOCgmcmVtaCwgJnJlbWwsIG5oLCBubCwgdGVybWgsIHRlcm1sKTsKKwltbCA9IG0gPDwgMzI7CisJd2hpbGUgKChzNjQpcmVtaCA8IDApIHsKKwkJeiAtPSAweDEwMDAwMDAwMFVMTDsKKwkJYWRkMTI4KCZyZW1oLCAmcmVtbCwgcmVtaCwgcmVtbCwgbWgsIG1sKTsKKwl9CisJcmVtaCA9IChyZW1oIDw8IDMyKSB8IChyZW1sID4+IDMyKTsKKwl6IHw9IChtaCA8PCAzMiA8PSByZW1oKSA/IDB4ZmZmZmZmZmYgOiByZW1oIC8gbWg7CisJcmV0dXJuIHo7Cit9CisKKy8qCisgKiBPcGVyYXRpb25zIG9uIHVucGFja2VkIGVsZW1lbnRzCisgKi8KKyNkZWZpbmUgdmZwX3NpZ25fbmVnYXRlKHNpZ24pCShzaWduIF4gMHg4MDAwKQorCisvKgorICogU2luZ2xlLXByZWNpc2lvbgorICovCitzdHJ1Y3QgdmZwX3NpbmdsZSB7CisJczE2CWV4cG9uZW50OworCXUxNglzaWduOworCXUzMglzaWduaWZpY2FuZDsKK307CisKK2V4dGVybiBzMzIgdmZwX2dldF9mbG9hdCh1bnNpZ25lZCBpbnQgcmVnKTsKK2V4dGVybiB2b2lkIHZmcF9wdXRfZmxvYXQodW5zaWduZWQgaW50IHJlZywgczMyIHZhbCk7CisKKy8qCisgKiBWRlBfU0lOR0xFX01BTlRJU1NBX0JJVFMgLSBudW1iZXIgb2YgYml0cyBpbiB0aGUgbWFudGlzc2EKKyAqIFZGUF9TSU5HTEVfRVhQT05FTlRfQklUUyAtIG51bWJlciBvZiBiaXRzIGluIHRoZSBleHBvbmVudAorICogVkZQX1NJTkdMRV9MT1dfQklUUyAtIG51bWJlciBvZiBsb3cgYml0cyBpbiB0aGUgdW5wYWNrZWQgc2lnbmlmaWNhbmQKKyAqICB3aGljaCBhcmUgbm90IHByb3BhZ2F0ZWQgdG8gdGhlIGZsb2F0IHVwb24gcGFja2luZy4KKyAqLworI2RlZmluZSBWRlBfU0lOR0xFX01BTlRJU1NBX0JJVFMJKDIzKQorI2RlZmluZSBWRlBfU0lOR0xFX0VYUE9ORU5UX0JJVFMJKDgpCisjZGVmaW5lIFZGUF9TSU5HTEVfTE9XX0JJVFMJCSgzMiAtIFZGUF9TSU5HTEVfTUFOVElTU0FfQklUUyAtIDIpCisjZGVmaW5lIFZGUF9TSU5HTEVfTE9XX0JJVFNfTUFTSwkoKDEgPDwgVkZQX1NJTkdMRV9MT1dfQklUUykgLSAxKQorCisvKgorICogVGhlIGJpdCBpbiBhbiB1bnBhY2tlZCBmbG9hdCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBhIHF1aWV0IE5hTgorICovCisjZGVmaW5lIFZGUF9TSU5HTEVfU0lHTklGSUNBTkRfUU5BTgkoMSA8PCAoVkZQX1NJTkdMRV9NQU5USVNTQV9CSVRTIC0gMSArIFZGUF9TSU5HTEVfTE9XX0JJVFMpKQorCisvKgorICogT3BlcmF0aW9ucyBvbiBwYWNrZWQgc2luZ2xlLXByZWNpc2lvbiBudW1iZXJzCisgKi8KKyNkZWZpbmUgdmZwX3NpbmdsZV9wYWNrZWRfc2lnbih2KQkoKHYpICYgMHg4MDAwMDAwMCkKKyNkZWZpbmUgdmZwX3NpbmdsZV9wYWNrZWRfbmVnYXRlKHYpCSgodikgXiAweDgwMDAwMDAwKQorI2RlZmluZSB2ZnBfc2luZ2xlX3BhY2tlZF9hYnModikJKCh2KSAmIH4weDgwMDAwMDAwKQorI2RlZmluZSB2ZnBfc2luZ2xlX3BhY2tlZF9leHBvbmVudCh2KQkoKCh2KSA+PiBWRlBfU0lOR0xFX01BTlRJU1NBX0JJVFMpICYgKCgxIDw8IFZGUF9TSU5HTEVfRVhQT05FTlRfQklUUykgLSAxKSkKKyNkZWZpbmUgdmZwX3NpbmdsZV9wYWNrZWRfbWFudGlzc2EodikJKCh2KSAmICgoMSA8PCBWRlBfU0lOR0xFX01BTlRJU1NBX0JJVFMpIC0gMSkpCisKKy8qCisgKiBVbnBhY2sgYSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0LiAgTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0aGUgbWFnbml0dWRlCisgKiBvZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdCBtYW50aXNzYSB3aXRoIHRoZSAxLiBpZiBuZWNlc3NhcnksCisgKiBhbGlnbmVkIHRvIGJpdCAzMC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHZmcF9zaW5nbGVfdW5wYWNrKHN0cnVjdCB2ZnBfc2luZ2xlICpzLCBzMzIgdmFsKQoreworCXUzMiBzaWduaWZpY2FuZDsKKworCXMtPnNpZ24gPSB2ZnBfc2luZ2xlX3BhY2tlZF9zaWduKHZhbCkgPj4gMTYsCisJcy0+ZXhwb25lbnQgPSB2ZnBfc2luZ2xlX3BhY2tlZF9leHBvbmVudCh2YWwpOworCisJc2lnbmlmaWNhbmQgPSAodTMyKSB2YWw7CisJc2lnbmlmaWNhbmQgPSAoc2lnbmlmaWNhbmQgPDwgKDMyIC0gVkZQX1NJTkdMRV9NQU5USVNTQV9CSVRTKSkgPj4gMjsKKwlpZiAocy0+ZXhwb25lbnQgJiYgcy0+ZXhwb25lbnQgIT0gMjU1KQorCQlzaWduaWZpY2FuZCB8PSAweDQwMDAwMDAwOworCXMtPnNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQ7Cit9CisKKy8qCisgKiBSZS1wYWNrIGEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdC4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBmbG9hdCBpcworICogYWxyZWFkeSBub3JtYWxpc2VkIHN1Y2ggdGhhdCB0aGUgTVNCIGlzIGJpdCAzMCwgX25vdF8gYml0IDMxLgorICovCitzdGF0aWMgaW5saW5lIHMzMiB2ZnBfc2luZ2xlX3BhY2soc3RydWN0IHZmcF9zaW5nbGUgKnMpCit7CisJdTMyIHZhbDsKKwl2YWwgPSAocy0+c2lnbiA8PCAxNikgKworCSAgICAgIChzLT5leHBvbmVudCA8PCBWRlBfU0lOR0xFX01BTlRJU1NBX0JJVFMpICsKKwkgICAgICAocy0+c2lnbmlmaWNhbmQgPj4gVkZQX1NJTkdMRV9MT1dfQklUUyk7CisJcmV0dXJuIChzMzIpdmFsOworfQorCisjZGVmaW5lIFZGUF9OVU1CRVIJCSgxPDwwKQorI2RlZmluZSBWRlBfWkVSTwkJKDE8PDEpCisjZGVmaW5lIFZGUF9ERU5PUk1BTAkJKDE8PDIpCisjZGVmaW5lIFZGUF9JTkZJTklUWQkJKDE8PDMpCisjZGVmaW5lIFZGUF9OQU4JCQkoMTw8NCkKKyNkZWZpbmUgVkZQX05BTl9TSUdOQUwJCSgxPDw1KQorCisjZGVmaW5lIFZGUF9RTkFOCQkoVkZQX05BTikKKyNkZWZpbmUgVkZQX1NOQU4JCShWRlBfTkFOfFZGUF9OQU5fU0lHTkFMKQorCitzdGF0aWMgaW5saW5lIGludCB2ZnBfc2luZ2xlX3R5cGUoc3RydWN0IHZmcF9zaW5nbGUgKnMpCit7CisJaW50IHR5cGUgPSBWRlBfTlVNQkVSOworCWlmIChzLT5leHBvbmVudCA9PSAyNTUpIHsKKwkJaWYgKHMtPnNpZ25pZmljYW5kID09IDApCisJCQl0eXBlID0gVkZQX0lORklOSVRZOworCQllbHNlIGlmIChzLT5zaWduaWZpY2FuZCAmIFZGUF9TSU5HTEVfU0lHTklGSUNBTkRfUU5BTikKKwkJCXR5cGUgPSBWRlBfUU5BTjsKKwkJZWxzZQorCQkJdHlwZSA9IFZGUF9TTkFOOworCX0gZWxzZSBpZiAocy0+ZXhwb25lbnQgPT0gMCkgeworCQlpZiAocy0+c2lnbmlmaWNhbmQgPT0gMCkKKwkJCXR5cGUgfD0gVkZQX1pFUk87CisJCWVsc2UKKwkJCXR5cGUgfD0gVkZQX0RFTk9STUFMOworCX0KKwlyZXR1cm4gdHlwZTsKK30KKworI2lmbmRlZiBERUJVRworI2RlZmluZSB2ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKHNkLHZzZCxmcHNjcixleGNlcHQsZnVuYykgX192ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKHNkLHZzZCxmcHNjcixleGNlcHQpCit1MzIgX192ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKGludCBzZCwgc3RydWN0IHZmcF9zaW5nbGUgKnZzLCB1MzIgZnBzY3IsIHUzMiBleGNlcHRpb25zKTsKKyNlbHNlCit1MzIgdmZwX3NpbmdsZV9ub3JtYWxpc2Vyb3VuZChpbnQgc2QsIHN0cnVjdCB2ZnBfc2luZ2xlICp2cywgdTMyIGZwc2NyLCB1MzIgZXhjZXB0aW9ucywgY29uc3QgY2hhciAqZnVuYyk7CisjZW5kaWYKKworLyoKKyAqIERvdWJsZS1wcmVjaXNpb24KKyAqLworc3RydWN0IHZmcF9kb3VibGUgeworCXMxNglleHBvbmVudDsKKwl1MTYJc2lnbjsKKwl1NjQJc2lnbmlmaWNhbmQ7Cit9OworCisvKgorICogVkZQX1JFR19aRVJPIGlzIGEgc3BlY2lhbCByZWdpc3RlciBudW1iZXIgZm9yIHZmcF9nZXRfZG91YmxlCisgKiB3aGljaCByZXR1cm5zIChkb3VibGUpMC4wLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSBjb21wYXJlIHdpdGgKKyAqIHplcm8gaW5zdHJ1Y3Rpb25zLgorICovCisjZGVmaW5lIFZGUF9SRUdfWkVSTwkxNgorZXh0ZXJuIHU2NCB2ZnBfZ2V0X2RvdWJsZSh1bnNpZ25lZCBpbnQgcmVnKTsKK2V4dGVybiB2b2lkIHZmcF9wdXRfZG91YmxlKHVuc2lnbmVkIGludCByZWcsIHU2NCB2YWwpOworCisjZGVmaW5lIFZGUF9ET1VCTEVfTUFOVElTU0FfQklUUwkoNTIpCisjZGVmaW5lIFZGUF9ET1VCTEVfRVhQT05FTlRfQklUUwkoMTEpCisjZGVmaW5lIFZGUF9ET1VCTEVfTE9XX0JJVFMJCSg2NCAtIFZGUF9ET1VCTEVfTUFOVElTU0FfQklUUyAtIDIpCisjZGVmaW5lIFZGUF9ET1VCTEVfTE9XX0JJVFNfTUFTSwkoKDEgPDwgVkZQX0RPVUJMRV9MT1dfQklUUykgLSAxKQorCisvKgorICogVGhlIGJpdCBpbiBhbiB1bnBhY2tlZCBkb3VibGUgd2hpY2ggaW5kaWNhdGVzIHRoYXQgaXQgaXMgYSBxdWlldCBOYU4KKyAqLworI2RlZmluZSBWRlBfRE9VQkxFX1NJR05JRklDQU5EX1FOQU4JKDFVTEwgPDwgKFZGUF9ET1VCTEVfTUFOVElTU0FfQklUUyAtIDEgKyBWRlBfRE9VQkxFX0xPV19CSVRTKSkKKworLyoKKyAqIE9wZXJhdGlvbnMgb24gcGFja2VkIHNpbmdsZS1wcmVjaXNpb24gbnVtYmVycworICovCisjZGVmaW5lIHZmcF9kb3VibGVfcGFja2VkX3NpZ24odikJKCh2KSAmICgxVUxMIDw8IDYzKSkKKyNkZWZpbmUgdmZwX2RvdWJsZV9wYWNrZWRfbmVnYXRlKHYpCSgodikgXiAoMVVMTCA8PCA2MykpCisjZGVmaW5lIHZmcF9kb3VibGVfcGFja2VkX2Ficyh2KQkoKHYpICYgfigxVUxMIDw8IDYzKSkKKyNkZWZpbmUgdmZwX2RvdWJsZV9wYWNrZWRfZXhwb25lbnQodikJKCgodikgPj4gVkZQX0RPVUJMRV9NQU5USVNTQV9CSVRTKSAmICgoMSA8PCBWRlBfRE9VQkxFX0VYUE9ORU5UX0JJVFMpIC0gMSkpCisjZGVmaW5lIHZmcF9kb3VibGVfcGFja2VkX21hbnRpc3NhKHYpCSgodikgJiAoKDFVTEwgPDwgVkZQX0RPVUJMRV9NQU5USVNTQV9CSVRTKSAtIDEpKQorCisvKgorICogVW5wYWNrIGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdC4gIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdGhlIG1hZ25pdHVkZQorICogb2YgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXQgbWFudGlzc2Egd2l0aCB0aGUgMS4gaWYgbmVjZXNzYXJ5LAorICogYWxpZ25lZCB0byBiaXQgNjIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZnBfZG91YmxlX3VucGFjayhzdHJ1Y3QgdmZwX2RvdWJsZSAqcywgczY0IHZhbCkKK3sKKwl1NjQgc2lnbmlmaWNhbmQ7CisKKwlzLT5zaWduID0gdmZwX2RvdWJsZV9wYWNrZWRfc2lnbih2YWwpID4+IDQ4OworCXMtPmV4cG9uZW50ID0gdmZwX2RvdWJsZV9wYWNrZWRfZXhwb25lbnQodmFsKTsKKworCXNpZ25pZmljYW5kID0gKHU2NCkgdmFsOworCXNpZ25pZmljYW5kID0gKHNpZ25pZmljYW5kIDw8ICg2NCAtIFZGUF9ET1VCTEVfTUFOVElTU0FfQklUUykpID4+IDI7CisJaWYgKHMtPmV4cG9uZW50ICYmIHMtPmV4cG9uZW50ICE9IDIwNDcpCisJCXNpZ25pZmljYW5kIHw9ICgxVUxMIDw8IDYyKTsKKwlzLT5zaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kOworfQorCisvKgorICogUmUtcGFjayBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgZmxvYXQgaXMKKyAqIGFscmVhZHkgbm9ybWFsaXNlZCBzdWNoIHRoYXQgdGhlIE1TQiBpcyBiaXQgMzAsIF9ub3RfIGJpdCAzMS4KKyAqLworc3RhdGljIGlubGluZSBzNjQgdmZwX2RvdWJsZV9wYWNrKHN0cnVjdCB2ZnBfZG91YmxlICpzKQoreworCXU2NCB2YWw7CisJdmFsID0gKCh1NjQpcy0+c2lnbiA8PCA0OCkgKworCSAgICAgICgodTY0KXMtPmV4cG9uZW50IDw8IFZGUF9ET1VCTEVfTUFOVElTU0FfQklUUykgKworCSAgICAgIChzLT5zaWduaWZpY2FuZCA+PiBWRlBfRE9VQkxFX0xPV19CSVRTKTsKKwlyZXR1cm4gKHM2NCl2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZmcF9kb3VibGVfdHlwZShzdHJ1Y3QgdmZwX2RvdWJsZSAqcykKK3sKKwlpbnQgdHlwZSA9IFZGUF9OVU1CRVI7CisJaWYgKHMtPmV4cG9uZW50ID09IDIwNDcpIHsKKwkJaWYgKHMtPnNpZ25pZmljYW5kID09IDApCisJCQl0eXBlID0gVkZQX0lORklOSVRZOworCQllbHNlIGlmIChzLT5zaWduaWZpY2FuZCAmIFZGUF9ET1VCTEVfU0lHTklGSUNBTkRfUU5BTikKKwkJCXR5cGUgPSBWRlBfUU5BTjsKKwkJZWxzZQorCQkJdHlwZSA9IFZGUF9TTkFOOworCX0gZWxzZSBpZiAocy0+ZXhwb25lbnQgPT0gMCkgeworCQlpZiAocy0+c2lnbmlmaWNhbmQgPT0gMCkKKwkJCXR5cGUgfD0gVkZQX1pFUk87CisJCWVsc2UKKwkJCXR5cGUgfD0gVkZQX0RFTk9STUFMOworCX0KKwlyZXR1cm4gdHlwZTsKK30KKwordTMyIHZmcF9kb3VibGVfbm9ybWFsaXNlcm91bmQoaW50IGRkLCBzdHJ1Y3QgdmZwX2RvdWJsZSAqdmQsIHUzMiBmcHNjciwgdTMyIGV4Y2VwdGlvbnMsIGNvbnN0IGNoYXIgKmZ1bmMpOworCisvKgorICogU3lzdGVtIHJlZ2lzdGVycworICovCitleHRlcm4gdTMyIHZmcF9nZXRfc3lzKHVuc2lnbmVkIGludCByZWcpOworZXh0ZXJuIHZvaWQgdmZwX3B1dF9zeXModW5zaWduZWQgaW50IHJlZywgdTMyIHZhbCk7CisKK3UzMiB2ZnBfZXN0aW1hdGVfc3FydF9zaWduaWZpY2FuZCh1MzIgZXhwb25lbnQsIHUzMiBzaWduaWZpY2FuZCk7CisKKy8qCisgKiBBIHNwZWNpYWwgZmxhZyB0byB0ZWxsIHRoZSBub3JtYWxpc2F0aW9uIGNvZGUgbm90IHRvIG5vcm1hbGlzZS4KKyAqLworI2RlZmluZSBWRlBfTkFOX0ZMQUcJMHgxMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTMwNTNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGRvdWJsZS5jCkBAIC0wLDAgKzEsMTE4NiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS92ZnAvdmZwZG91YmxlLmMKKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBpbiBwYXJ0IGZyb20gSm9obiBSLiBIb3VzZXJzIHNvZnRmbG9hdCBsaWJyYXJ5LCB3aGljaAorICogY2FycmllcyB0aGUgZm9sbG93aW5nIG5vdGljZToKKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgQyBzb3VyY2UgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTb2Z0RmxvYXQgSUVDL0lFRUUgRmxvYXRpbmctcG9pbnQKKyAqIEFyaXRobWV0aWMgUGFja2FnZSwgUmVsZWFzZSAyLgorICoKKyAqIFdyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKKyAqIEludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorICogU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKKyAqIE5hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCisgKiBvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKKyAqIHByb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKKyAqIG92ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KKyAqIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3ZWIgcGFnZSBgaHR0cDovL0hUVFAuQ1MuQmVya2VsZXkuRURVL35qaGF1c2VyLworICogYXJpdGhtZXRpYy9zb2Z0ZmxvYXQuaHRtbCcuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBESVNUUklCVVRFRCBBUyBJUywgRk9SIEZSRUUuICBBbHRob3VnaCByZWFzb25hYmxlIGVmZm9ydAorICogaGFzIGJlZW4gbWFkZSB0byBhdm9pZCBpdCwgVEhJUyBTT0ZUV0FSRSBNQVkgQ09OVEFJTiBGQVVMVFMgVEhBVCBXSUxMIEFUCisgKiBUSU1FUyBSRVNVTFQgSU4gSU5DT1JSRUNUIEJFSEFWSU9SLiAgVVNFIE9GIFRISVMgU09GVFdBUkUgSVMgUkVTVFJJQ1RFRCBUTworICogUEVSU09OUyBBTkQgT1JHQU5JWkFUSU9OUyBXSE8gQ0FOIEFORCBXSUxMIFRBS0UgRlVMTCBSRVNQT05TSUJJTElUWSBGT1IgQU5ZCisgKiBBTkQgQUxMIExPU1NFUywgQ09TVFMsIE9SIE9USEVSIFBST0JMRU1TIEFSSVNJTkcgRlJPTSBJVFMgVVNFLgorICoKKyAqIERlcml2YXRpdmUgd29ya3MgYXJlIGFjY2VwdGFibGUsIGV2ZW4gZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMsIHNvIGxvbmcgYXMKKyAqICgxKSB0aGV5IGluY2x1ZGUgcHJvbWluZW50IG5vdGljZSB0aGF0IHRoZSB3b3JrIGlzIGRlcml2YXRpdmUsIGFuZCAoMikgdGhleQorICogaW5jbHVkZSBwcm9taW5lbnQgbm90aWNlIGFraW4gdG8gdGhlc2UgdGhyZWUgcGFyYWdyYXBocyBmb3IgdGhvc2UgcGFydHMgb2YKKyAqIHRoaXMgY29kZSB0aGF0IGFyZSByZXRhaW5lZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS92ZnAuaD4KKworI2luY2x1ZGUgInZmcGluc3RyLmgiCisjaW5jbHVkZSAidmZwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdmZwX2RvdWJsZSB2ZnBfZG91YmxlX2RlZmF1bHRfcW5hbiA9IHsKKwkuZXhwb25lbnQJPSAyMDQ3LAorCS5zaWduCQk9IDAsCisJLnNpZ25pZmljYW5kCT0gVkZQX0RPVUJMRV9TSUdOSUZJQ0FORF9RTkFOLAorfTsKKworc3RhdGljIHZvaWQgdmZwX2RvdWJsZV9kdW1wKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHZmcF9kb3VibGUgKmQpCit7CisJcHJfZGVidWcoIlZGUDogJXM6IHNpZ249JWQgZXhwb25lbnQ9JWQgc2lnbmlmaWNhbmQ9JTAxNmxseFxuIiwKKwkJIHN0ciwgZC0+c2lnbiAhPSAwLCBkLT5leHBvbmVudCwgZC0+c2lnbmlmaWNhbmQpOworfQorCitzdGF0aWMgdm9pZCB2ZnBfZG91YmxlX25vcm1hbGlzZV9kZW5vcm1hbChzdHJ1Y3QgdmZwX2RvdWJsZSAqdmQpCit7CisJaW50IGJpdHMgPSAzMSAtIGZscyh2ZC0+c2lnbmlmaWNhbmQgPj4gMzIpOworCWlmIChiaXRzID09IDMxKQorCQliaXRzID0gNjIgLSBmbHModmQtPnNpZ25pZmljYW5kKTsKKworCXZmcF9kb3VibGVfZHVtcCgibm9ybWFsaXNlX2Rlbm9ybWFsOiBpbiIsIHZkKTsKKworCWlmIChiaXRzKSB7CisJCXZkLT5leHBvbmVudCAtPSBiaXRzIC0gMTsKKwkJdmQtPnNpZ25pZmljYW5kIDw8PSBiaXRzOworCX0KKworCXZmcF9kb3VibGVfZHVtcCgibm9ybWFsaXNlX2Rlbm9ybWFsOiBvdXQiLCB2ZCk7Cit9CisKK3UzMiB2ZnBfZG91YmxlX25vcm1hbGlzZXJvdW5kKGludCBkZCwgc3RydWN0IHZmcF9kb3VibGUgKnZkLCB1MzIgZnBzY3IsIHUzMiBleGNlcHRpb25zLCBjb25zdCBjaGFyICpmdW5jKQoreworCXU2NCBzaWduaWZpY2FuZCwgaW5jcjsKKwlpbnQgZXhwb25lbnQsIHNoaWZ0LCB1bmRlcmZsb3c7CisJdTMyIHJtb2RlOworCisJdmZwX2RvdWJsZV9kdW1wKCJwYWNrOiBpbiIsIHZkKTsKKworCS8qCisJICogSW5maW5pdGllcyBhbmQgTmFOcyBhcmUgYSBzcGVjaWFsIGNhc2UuCisJICovCisJaWYgKHZkLT5leHBvbmVudCA9PSAyMDQ3ICYmICh2ZC0+c2lnbmlmaWNhbmQgPT0gMCB8fCBleGNlcHRpb25zKSkKKwkJZ290byBwYWNrOworCisJLyoKKwkgKiBTcGVjaWFsLWNhc2UgemVyby4KKwkgKi8KKwlpZiAodmQtPnNpZ25pZmljYW5kID09IDApIHsKKwkJdmQtPmV4cG9uZW50ID0gMDsKKwkJZ290byBwYWNrOworCX0KKworCWV4cG9uZW50ID0gdmQtPmV4cG9uZW50OworCXNpZ25pZmljYW5kID0gdmQtPnNpZ25pZmljYW5kOworCisJc2hpZnQgPSAzMiAtIGZscyhzaWduaWZpY2FuZCA+PiAzMik7CisJaWYgKHNoaWZ0ID09IDMyKQorCQlzaGlmdCA9IDY0IC0gZmxzKHNpZ25pZmljYW5kKTsKKwlpZiAoc2hpZnQpIHsKKwkJZXhwb25lbnQgLT0gc2hpZnQ7CisJCXNpZ25pZmljYW5kIDw8PSBzaGlmdDsKKwl9CisKKyNpZmRlZiBERUJVRworCXZkLT5leHBvbmVudCA9IGV4cG9uZW50OworCXZkLT5zaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kOworCXZmcF9kb3VibGVfZHVtcCgicGFjazogbm9ybWFsaXNlZCIsIHZkKTsKKyNlbmRpZgorCisJLyoKKwkgKiBUaW55IG51bWJlcj8KKwkgKi8KKwl1bmRlcmZsb3cgPSBleHBvbmVudCA8IDA7CisJaWYgKHVuZGVyZmxvdykgeworCQlzaWduaWZpY2FuZCA9IHZmcF9zaGlmdHJpZ2h0NjRqYW1taW5nKHNpZ25pZmljYW5kLCAtZXhwb25lbnQpOworCQlleHBvbmVudCA9IDA7CisjaWZkZWYgREVCVUcKKwkJdmQtPmV4cG9uZW50ID0gZXhwb25lbnQ7CisJCXZkLT5zaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kOworCQl2ZnBfZG91YmxlX2R1bXAoInBhY2s6IHRpbnkgbnVtYmVyIiwgdmQpOworI2VuZGlmCisJCWlmICghKHNpZ25pZmljYW5kICYgKCgxVUxMIDw8IChWRlBfRE9VQkxFX0xPV19CSVRTICsgMSkpIC0gMSkpKQorCQkJdW5kZXJmbG93ID0gMDsKKwl9CisKKwkvKgorCSAqIFNlbGVjdCByb3VuZGluZyBpbmNyZW1lbnQuCisJICovCisJaW5jciA9IDA7CisJcm1vZGUgPSBmcHNjciAmIEZQU0NSX1JNT0RFX01BU0s7CisKKwlpZiAocm1vZGUgPT0gRlBTQ1JfUk9VTkRfTkVBUkVTVCkgeworCQlpbmNyID0gMVVMTCA8PCBWRlBfRE9VQkxFX0xPV19CSVRTOworCQlpZiAoKHNpZ25pZmljYW5kICYgKDFVTEwgPDwgKFZGUF9ET1VCTEVfTE9XX0JJVFMgKyAxKSkpID09IDApCisJCQlpbmNyIC09IDE7CisJfSBlbHNlIGlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9UT1pFUk8pIHsKKwkJaW5jciA9IDA7CisJfSBlbHNlIGlmICgocm1vZGUgPT0gRlBTQ1JfUk9VTkRfUExVU0lORikgXiAodmQtPnNpZ24gIT0gMCkpCisJCWluY3IgPSAoMVVMTCA8PCAoVkZQX0RPVUJMRV9MT1dfQklUUyArIDEpKSAtIDE7CisKKwlwcl9kZWJ1ZygiVkZQOiByb3VuZGluZyBpbmNyZW1lbnQgPSAweCUwOGxseFxuIiwgaW5jcik7CisKKwkvKgorCSAqIElzIG91ciByb3VuZGluZyBnb2luZyB0byBvdmVyZmxvdz8KKwkgKi8KKwlpZiAoKHNpZ25pZmljYW5kICsgaW5jcikgPCBzaWduaWZpY2FuZCkgeworCQlleHBvbmVudCArPSAxOworCQlzaWduaWZpY2FuZCA9IChzaWduaWZpY2FuZCA+PiAxKSB8IChzaWduaWZpY2FuZCAmIDEpOworCQlpbmNyID4+PSAxOworI2lmZGVmIERFQlVHCisJCXZkLT5leHBvbmVudCA9IGV4cG9uZW50OworCQl2ZC0+c2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZDsKKwkJdmZwX2RvdWJsZV9kdW1wKCJwYWNrOiBvdmVyZmxvdyIsIHZkKTsKKyNlbmRpZgorCX0KKworCS8qCisJICogSWYgYW55IG9mIHRoZSBsb3cgYml0cyAod2hpY2ggd2lsbCBiZSBzaGlmdGVkIG91dCBvZiB0aGUKKwkgKiBudW1iZXIpIGFyZSBub24temVybywgdGhlIHJlc3VsdCBpcyBpbmV4YWN0LgorCSAqLworCWlmIChzaWduaWZpY2FuZCAmICgoMSA8PCAoVkZQX0RPVUJMRV9MT1dfQklUUyArIDEpKSAtIDEpKQorCQlleGNlcHRpb25zIHw9IEZQU0NSX0lYQzsKKworCS8qCisJICogRG8gb3VyIHJvdW5kaW5nLgorCSAqLworCXNpZ25pZmljYW5kICs9IGluY3I7CisKKwkvKgorCSAqIEluZmluaXR5PworCSAqLworCWlmIChleHBvbmVudCA+PSAyMDQ2KSB7CisJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfT0ZDIHwgRlBTQ1JfSVhDOworCQlpZiAoaW5jciA9PSAwKSB7CisJCQl2ZC0+ZXhwb25lbnQgPSAyMDQ1OworCQkJdmQtPnNpZ25pZmljYW5kID0gMHg3ZmZmZmZmZmZmZmZmZmZmVUxMOworCQl9IGVsc2UgeworCQkJdmQtPmV4cG9uZW50ID0gMjA0NzsJCS8qIGluZmluaXR5ICovCisJCQl2ZC0+c2lnbmlmaWNhbmQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNpZ25pZmljYW5kID4+IChWRlBfRE9VQkxFX0xPV19CSVRTICsgMSkgPT0gMCkKKwkJCWV4cG9uZW50ID0gMDsKKwkJaWYgKGV4cG9uZW50IHx8IHNpZ25pZmljYW5kID4gMHg4MDAwMDAwMDAwMDAwMDAwVUxMKQorCQkJdW5kZXJmbG93ID0gMDsKKwkJaWYgKHVuZGVyZmxvdykKKwkJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfVUZDOworCQl2ZC0+ZXhwb25lbnQgPSBleHBvbmVudDsKKwkJdmQtPnNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQgPj4gMTsKKwl9CisKKyBwYWNrOgorCXZmcF9kb3VibGVfZHVtcCgicGFjazogZmluYWwiLCB2ZCk7CisJeworCQlzNjQgZCA9IHZmcF9kb3VibGVfcGFjayh2ZCk7CisJCXByX2RlYnVnKCJWRlA6ICVzOiBkKGQlZCk9JTAxNmxseCBleGNlcHRpb25zPSUwOHhcbiIsIGZ1bmMsCisJCQkgZGQsIGQsIGV4Y2VwdGlvbnMpOworCQl2ZnBfcHV0X2RvdWJsZShkZCwgZCk7CisJfQorCXJldHVybiBleGNlcHRpb25zICYgflZGUF9OQU5fRkxBRzsKK30KKworLyoKKyAqIFByb3BhZ2F0ZSB0aGUgTmFOLCBzZXR0aW5nIGV4Y2VwdGlvbnMgaWYgaXQgaXMgc2lnbmFsbGluZy4KKyAqICduJyBpcyBhbHdheXMgYSBOYU4uICAnbScgbWF5IGJlIGEgbnVtYmVyLCBOYU4gb3IgaW5maW5pdHkuCisgKi8KK3N0YXRpYyB1MzIKK3ZmcF9wcm9wYWdhdGVfbmFuKHN0cnVjdCB2ZnBfZG91YmxlICp2ZGQsIHN0cnVjdCB2ZnBfZG91YmxlICp2ZG4sCisJCSAgc3RydWN0IHZmcF9kb3VibGUgKnZkbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfZG91YmxlICpuYW47CisJaW50IHRuLCB0bSA9IDA7CisKKwl0biA9IHZmcF9kb3VibGVfdHlwZSh2ZG4pOworCisJaWYgKHZkbSkKKwkJdG0gPSB2ZnBfZG91YmxlX3R5cGUodmRtKTsKKworCWlmIChmcHNjciAmIEZQU0NSX0RFRkFVTFRfTkFOKQorCQkvKgorCQkgKiBEZWZhdWx0IE5hTiBtb2RlIC0gYWx3YXlzIHJldHVybnMgYSBxdWlldCBOYU4KKwkJICovCisJCW5hbiA9ICZ2ZnBfZG91YmxlX2RlZmF1bHRfcW5hbjsKKwllbHNlIHsKKwkJLyoKKwkJICogQ29udGVtcG9yYXJ5IG1vZGUgLSBzZWxlY3QgdGhlIGZpcnN0IHNpZ25hbGxpbmcKKwkJICogTkFOLCBvciBpZiBuZWl0aGVyIGFyZSBzaWduYWxsaW5nLCB0aGUgZmlyc3QKKwkJICogcXVpZXQgTkFOLgorCQkgKi8KKwkJaWYgKHRuID09IFZGUF9TTkFOIHx8ICh0bSAhPSBWRlBfU05BTiAmJiB0biA9PSBWRlBfUU5BTikpCisJCQluYW4gPSB2ZG47CisJCWVsc2UKKwkJCW5hbiA9IHZkbTsKKwkJLyoKKwkJICogTWFrZSB0aGUgTmFOIHF1aWV0LgorCQkgKi8KKwkJbmFuLT5zaWduaWZpY2FuZCB8PSBWRlBfRE9VQkxFX1NJR05JRklDQU5EX1FOQU47CisJfQorCisJKnZkZCA9ICpuYW47CisKKwkvKgorCSAqIElmIG9uZSB3YXMgYSBzaWduYWxsaW5nIE5BTiwgcmFpc2UgaW52YWxpZCBvcGVyYXRpb24uCisJICovCisJcmV0dXJuIHRuID09IFZGUF9TTkFOIHx8IHRtID09IFZGUF9TTkFOID8gRlBTQ1JfSU9DIDogVkZQX05BTl9GTEFHOworfQorCisvKgorICogRXh0ZW5kZWQgb3BlcmF0aW9ucworICovCitzdGF0aWMgdTMyIHZmcF9kb3VibGVfZmFicyhpbnQgZGQsIGludCB1bnVzZWQsIGludCBkbSwgdTMyIGZwc2NyKQoreworCXZmcF9wdXRfZG91YmxlKGRkLCB2ZnBfZG91YmxlX3BhY2tlZF9hYnModmZwX2dldF9kb3VibGUoZG0pKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mY3B5KGludCBkZCwgaW50IHVudXNlZCwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJdmZwX3B1dF9kb3VibGUoZGQsIHZmcF9nZXRfZG91YmxlKGRtKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mbmVnKGludCBkZCwgaW50IHVudXNlZCwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJdmZwX3B1dF9kb3VibGUoZGQsIHZmcF9kb3VibGVfcGFja2VkX25lZ2F0ZSh2ZnBfZ2V0X2RvdWJsZShkbSkpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZzcXJ0KGludCBkZCwgaW50IHVudXNlZCwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJc3RydWN0IHZmcF9kb3VibGUgdmRtLCB2ZGQ7CisJaW50IHJldCwgdG07CisKKwl2ZnBfZG91YmxlX3VucGFjaygmdmRtLCB2ZnBfZ2V0X2RvdWJsZShkbSkpOworCXRtID0gdmZwX2RvdWJsZV90eXBlKCZ2ZG0pOworCWlmICh0bSAmIChWRlBfTkFOfFZGUF9JTkZJTklUWSkpIHsKKwkJc3RydWN0IHZmcF9kb3VibGUgKnZkcCA9ICZ2ZGQ7CisKKwkJaWYgKHRtICYgVkZQX05BTikKKwkJCXJldCA9IHZmcF9wcm9wYWdhdGVfbmFuKHZkcCwgJnZkbSwgTlVMTCwgZnBzY3IpOworCQllbHNlIGlmICh2ZG0uc2lnbiA9PSAwKSB7Cisgc3FydF9jb3B5OgorCQkJdmRwID0gJnZkbTsKKwkJCXJldCA9IDA7CisJCX0gZWxzZSB7Cisgc3FydF9pbnZhbGlkOgorCQkJdmRwID0gJnZmcF9kb3VibGVfZGVmYXVsdF9xbmFuOworCQkJcmV0ID0gRlBTQ1JfSU9DOworCQl9CisJCXZmcF9wdXRfZG91YmxlKGRkLCB2ZnBfZG91YmxlX3BhY2sodmRwKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBzcXJ0KCsvLSAwKSA9PSArLy0gMAorCSAqLworCWlmICh0bSAmIFZGUF9aRVJPKQorCQlnb3RvIHNxcnRfY29weTsKKworCS8qCisJICogTm9ybWFsaXNlIGEgZGVub3JtYWxpc2VkIG51bWJlcgorCSAqLworCWlmICh0bSAmIFZGUF9ERU5PUk1BTCkKKwkJdmZwX2RvdWJsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZkbSk7CisKKwkvKgorCSAqIHNxcnQoPDApID0gaW52YWxpZAorCSAqLworCWlmICh2ZG0uc2lnbikKKwkJZ290byBzcXJ0X2ludmFsaWQ7CisKKwl2ZnBfZG91YmxlX2R1bXAoInNxcnQiLCAmdmRtKTsKKworCS8qCisJICogRXN0aW1hdGUgdGhlIHNxdWFyZSByb290LgorCSAqLworCXZkZC5zaWduID0gMDsKKwl2ZGQuZXhwb25lbnQgPSAoKHZkbS5leHBvbmVudCAtIDEwMjMpID4+IDEpICsgMTAyMzsKKwl2ZGQuc2lnbmlmaWNhbmQgPSAodTY0KXZmcF9lc3RpbWF0ZV9zcXJ0X3NpZ25pZmljYW5kKHZkbS5leHBvbmVudCwgdmRtLnNpZ25pZmljYW5kID4+IDMyKSA8PCAzMTsKKworCXZmcF9kb3VibGVfZHVtcCgic3FydCBlc3RpbWF0ZTEiLCAmdmRkKTsKKworCXZkbS5zaWduaWZpY2FuZCA+Pj0gMSArICh2ZG0uZXhwb25lbnQgJiAxKTsKKwl2ZGQuc2lnbmlmaWNhbmQgKz0gMiArIHZmcF9lc3RpbWF0ZV9kaXYxMjh0bzY0KHZkbS5zaWduaWZpY2FuZCwgMCwgdmRkLnNpZ25pZmljYW5kKTsKKworCXZmcF9kb3VibGVfZHVtcCgic3FydCBlc3RpbWF0ZTIiLCAmdmRkKTsKKworCS8qCisJICogQW5kIG5vdyBhZGp1c3QuCisJICovCisJaWYgKCh2ZGQuc2lnbmlmaWNhbmQgJiBWRlBfRE9VQkxFX0xPV19CSVRTX01BU0spIDw9IDUpIHsKKwkJaWYgKHZkZC5zaWduaWZpY2FuZCA8IDIpIHsKKwkJCXZkZC5zaWduaWZpY2FuZCA9IH4wVUxMOworCQl9IGVsc2UgeworCQkJdTY0IHRlcm1oLCB0ZXJtbCwgcmVtaCwgcmVtbDsKKwkJCXZkbS5zaWduaWZpY2FuZCA8PD0gMjsKKwkJCW11bDY0dG8xMjgoJnRlcm1oLCAmdGVybWwsIHZkZC5zaWduaWZpY2FuZCwgdmRkLnNpZ25pZmljYW5kKTsKKwkJCXN1YjEyOCgmcmVtaCwgJnJlbWwsIHZkbS5zaWduaWZpY2FuZCwgMCwgdGVybWgsIHRlcm1sKTsKKwkJCXdoaWxlICgoczY0KXJlbWggPCAwKSB7CisJCQkJdmRkLnNpZ25pZmljYW5kIC09IDE7CisJCQkJc2hpZnQ2NGxlZnQoJnRlcm1oLCAmdGVybWwsIHZkZC5zaWduaWZpY2FuZCk7CisJCQkJdGVybWwgfD0gMTsKKwkJCQlhZGQxMjgoJnJlbWgsICZyZW1sLCByZW1oLCByZW1sLCB0ZXJtaCwgdGVybWwpOworCQkJfQorCQkJdmRkLnNpZ25pZmljYW5kIHw9IChyZW1oIHwgcmVtbCkgIT0gMDsKKwkJfQorCX0KKwl2ZGQuc2lnbmlmaWNhbmQgPSB2ZnBfc2hpZnRyaWdodDY0amFtbWluZyh2ZGQuc2lnbmlmaWNhbmQsIDEpOworCisJcmV0dXJuIHZmcF9kb3VibGVfbm9ybWFsaXNlcm91bmQoZGQsICZ2ZGQsIGZwc2NyLCAwLCAiZnNxcnQiKTsKK30KKworLyoKKyAqIEVxdWFsCTo9IFpDCisgKiBMZXNzIHRoYW4JOj0gTgorICogR3JlYXRlciB0aGFuCTo9IEMKKyAqIFVub3JkZXJlZAk6PSBDVgorICovCitzdGF0aWMgdTMyIHZmcF9jb21wYXJlKGludCBkZCwgaW50IHNpZ25hbF9vbl9xbmFuLCBpbnQgZG0sIHUzMiBmcHNjcikKK3sKKwlzNjQgZCwgbTsKKwl1MzIgcmV0ID0gMDsKKworCW0gPSB2ZnBfZ2V0X2RvdWJsZShkbSk7CisJaWYgKHZmcF9kb3VibGVfcGFja2VkX2V4cG9uZW50KG0pID09IDIwNDcgJiYgdmZwX2RvdWJsZV9wYWNrZWRfbWFudGlzc2EobSkpIHsKKwkJcmV0IHw9IEZQU0NSX0MgfCBGUFNDUl9WOworCQlpZiAoc2lnbmFsX29uX3FuYW4gfHwgISh2ZnBfZG91YmxlX3BhY2tlZF9tYW50aXNzYShtKSAmICgxVUxMIDw8IChWRlBfRE9VQkxFX01BTlRJU1NBX0JJVFMgLSAxKSkpKQorCQkJLyoKKwkJCSAqIFNpZ25hbGxpbmcgTmFOLCBvciBzaWduYWxsaW5nIG9uIHF1aWV0IE5hTgorCQkJICovCisJCQlyZXQgfD0gRlBTQ1JfSU9DOworCX0KKworCWQgPSB2ZnBfZ2V0X2RvdWJsZShkZCk7CisJaWYgKHZmcF9kb3VibGVfcGFja2VkX2V4cG9uZW50KGQpID09IDIwNDcgJiYgdmZwX2RvdWJsZV9wYWNrZWRfbWFudGlzc2EoZCkpIHsKKwkJcmV0IHw9IEZQU0NSX0MgfCBGUFNDUl9WOworCQlpZiAoc2lnbmFsX29uX3FuYW4gfHwgISh2ZnBfZG91YmxlX3BhY2tlZF9tYW50aXNzYShkKSAmICgxVUxMIDw8IChWRlBfRE9VQkxFX01BTlRJU1NBX0JJVFMgLSAxKSkpKQorCQkJLyoKKwkJCSAqIFNpZ25hbGxpbmcgTmFOLCBvciBzaWduYWxsaW5nIG9uIHF1aWV0IE5hTgorCQkJICovCisJCQlyZXQgfD0gRlBTQ1JfSU9DOworCX0KKworCWlmIChyZXQgPT0gMCkgeworCQlpZiAoZCA9PSBtIHx8IHZmcF9kb3VibGVfcGFja2VkX2FicyhkIHwgbSkgPT0gMCkgeworCQkJLyoKKwkJCSAqIGVxdWFsCisJCQkgKi8KKwkJCXJldCB8PSBGUFNDUl9aIHwgRlBTQ1JfQzsKKwkJfSBlbHNlIGlmICh2ZnBfZG91YmxlX3BhY2tlZF9zaWduKGQgXiBtKSkgeworCQkJLyoKKwkJCSAqIGRpZmZlcmVudCBzaWducworCQkJICovCisJCQlpZiAodmZwX2RvdWJsZV9wYWNrZWRfc2lnbihkKSkKKwkJCQkvKgorCQkJCSAqIGQgaXMgbmVnYXRpdmUsIHNvIGQgPCBtCisJCQkJICovCisJCQkJcmV0IHw9IEZQU0NSX047CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiBkIGlzIHBvc2l0aXZlLCBzbyBkID4gbQorCQkJCSAqLworCQkJCXJldCB8PSBGUFNDUl9DOworCQl9IGVsc2UgaWYgKCh2ZnBfZG91YmxlX3BhY2tlZF9zaWduKGQpICE9IDApIF4gKGQgPCBtKSkgeworCQkJLyoKKwkJCSAqIGQgPCBtCisJCQkgKi8KKwkJCXJldCB8PSBGUFNDUl9OOworCQl9IGVsc2UgaWYgKCh2ZnBfZG91YmxlX3BhY2tlZF9zaWduKGQpICE9IDApIF4gKGQgPiBtKSkgeworCQkJLyoKKwkJCSAqIGQgPiBtCisJCQkgKi8KKwkJCXJldCB8PSBGUFNDUl9DOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZjbXAoaW50IGRkLCBpbnQgdW51c2VkLCBpbnQgZG0sIHUzMiBmcHNjcikKK3sKKwlyZXR1cm4gdmZwX2NvbXBhcmUoZGQsIDAsIGRtLCBmcHNjcik7Cit9CisKK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mY21wZShpbnQgZGQsIGludCB1bnVzZWQsIGludCBkbSwgdTMyIGZwc2NyKQoreworCXJldHVybiB2ZnBfY29tcGFyZShkZCwgMSwgZG0sIGZwc2NyKTsKK30KKworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZjbXB6KGludCBkZCwgaW50IHVudXNlZCwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9jb21wYXJlKGRkLCAwLCBWRlBfUkVHX1pFUk8sIGZwc2NyKTsKK30KKworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZjbXBleihpbnQgZGQsIGludCB1bnVzZWQsIGludCBkbSwgdTMyIGZwc2NyKQoreworCXJldHVybiB2ZnBfY29tcGFyZShkZCwgMSwgVkZQX1JFR19aRVJPLCBmcHNjcik7Cit9CisKK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mY3Z0cyhpbnQgc2QsIGludCB1bnVzZWQsIGludCBkbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfZG91YmxlIHZkbTsKKwlzdHJ1Y3QgdmZwX3NpbmdsZSB2c2Q7CisJaW50IHRtOworCXUzMiBleGNlcHRpb25zID0gMDsKKworCXZmcF9kb3VibGVfdW5wYWNrKCZ2ZG0sIHZmcF9nZXRfZG91YmxlKGRtKSk7CisKKwl0bSA9IHZmcF9kb3VibGVfdHlwZSgmdmRtKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhIHNpZ25hbGxpbmcgTmFOLCBzaWduYWwgaW52YWxpZCBvcGVyYXRpb24uCisJICovCisJaWYgKHRtID09IFZGUF9TTkFOKQorCQlleGNlcHRpb25zID0gRlBTQ1JfSU9DOworCisJaWYgKHRtICYgVkZQX0RFTk9STUFMKQorCQl2ZnBfZG91YmxlX25vcm1hbGlzZV9kZW5vcm1hbCgmdmRtKTsKKworCXZzZC5zaWduID0gdmRtLnNpZ247CisJdnNkLnNpZ25pZmljYW5kID0gdmZwX2hpNjR0bzMyamFtbWluZyh2ZG0uc2lnbmlmaWNhbmQpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIGluZmluaXR5IG9yIGEgTmFOLCB0aGUgZXhwb25lbnQgbXVzdCBiZSAyNTUKKwkgKi8KKwlpZiAodG0gJiAoVkZQX0lORklOSVRZfFZGUF9OQU4pKSB7CisJCXZzZC5leHBvbmVudCA9IDI1NTsKKwkJaWYgKHRtICYgVkZQX05BTikKKwkJCXZzZC5zaWduaWZpY2FuZCB8PSBWRlBfU0lOR0xFX1NJR05JRklDQU5EX1FOQU47CisJCWdvdG8gcGFja19uYW47CisJfSBlbHNlIGlmICh0bSAmIFZGUF9aRVJPKQorCQl2c2QuZXhwb25lbnQgPSAwOworCWVsc2UKKwkJdnNkLmV4cG9uZW50ID0gdmRtLmV4cG9uZW50IC0gKDEwMjMgLSAxMjcpOworCisJcmV0dXJuIHZmcF9zaW5nbGVfbm9ybWFsaXNlcm91bmQoc2QsICZ2c2QsIGZwc2NyLCBleGNlcHRpb25zLCAiZmN2dHMiKTsKKworIHBhY2tfbmFuOgorCXZmcF9wdXRfZmxvYXQoc2QsIHZmcF9zaW5nbGVfcGFjaygmdnNkKSk7CisJcmV0dXJuIGV4Y2VwdGlvbnM7Cit9CisKK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mdWl0byhpbnQgZGQsIGludCB1bnVzZWQsIGludCBkbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfZG91YmxlIHZkbTsKKwl1MzIgbSA9IHZmcF9nZXRfZmxvYXQoZG0pOworCisJdmRtLnNpZ24gPSAwOworCXZkbS5leHBvbmVudCA9IDEwMjMgKyA2MyAtIDE7CisJdmRtLnNpZ25pZmljYW5kID0gKHU2NCltOworCisJcmV0dXJuIHZmcF9kb3VibGVfbm9ybWFsaXNlcm91bmQoZGQsICZ2ZG0sIGZwc2NyLCAwLCAiZnVpdG8iKTsKK30KKworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZzaXRvKGludCBkZCwgaW50IHVudXNlZCwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJc3RydWN0IHZmcF9kb3VibGUgdmRtOworCXUzMiBtID0gdmZwX2dldF9mbG9hdChkbSk7CisKKwl2ZG0uc2lnbiA9IChtICYgMHg4MDAwMDAwMCkgPj4gMTY7CisJdmRtLmV4cG9uZW50ID0gMTAyMyArIDYzIC0gMTsKKwl2ZG0uc2lnbmlmaWNhbmQgPSB2ZG0uc2lnbiA/IC1tIDogbTsKKworCXJldHVybiB2ZnBfZG91YmxlX25vcm1hbGlzZXJvdW5kKGRkLCAmdmRtLCBmcHNjciwgMCwgImZzaXRvIik7Cit9CisKK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mdG91aShpbnQgc2QsIGludCB1bnVzZWQsIGludCBkbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfZG91YmxlIHZkbTsKKwl1MzIgZCwgZXhjZXB0aW9ucyA9IDA7CisJaW50IHJtb2RlID0gZnBzY3IgJiBGUFNDUl9STU9ERV9NQVNLOworCWludCB0bTsKKworCXZmcF9kb3VibGVfdW5wYWNrKCZ2ZG0sIHZmcF9nZXRfZG91YmxlKGRtKSk7CisKKwkvKgorCSAqIERvIHdlIGhhdmUgYSBkZW5vcm1hbGlzZWQgbnVtYmVyPworCSAqLworCXRtID0gdmZwX2RvdWJsZV90eXBlKCZ2ZG0pOworCWlmICh0bSAmIFZGUF9ERU5PUk1BTCkKKwkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JREM7CisKKwlpZiAodG0gJiBWRlBfTkFOKQorCQl2ZG0uc2lnbiA9IDA7CisKKwlpZiAodmRtLmV4cG9uZW50ID49IDEwMjMgKyAzMikgeworCQlkID0gdmRtLnNpZ24gPyAwIDogMHhmZmZmZmZmZjsKKwkJZXhjZXB0aW9ucyA9IEZQU0NSX0lPQzsKKwl9IGVsc2UgaWYgKHZkbS5leHBvbmVudCA+PSAxMDIzIC0gMSkgeworCQlpbnQgc2hpZnQgPSAxMDIzICsgNjMgLSB2ZG0uZXhwb25lbnQ7CisJCXU2NCByZW0sIGluY3IgPSAwOworCisJCS8qCisJCSAqIDJeMCA8PSBtIDwgMl4zMi0yXjgKKwkJICovCisJCWQgPSAodmRtLnNpZ25pZmljYW5kIDw8IDEpID4+IHNoaWZ0OworCQlyZW0gPSB2ZG0uc2lnbmlmaWNhbmQgPDwgKDY1IC0gc2hpZnQpOworCisJCWlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9ORUFSRVNUKSB7CisJCQlpbmNyID0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOworCQkJaWYgKChkICYgMSkgPT0gMCkKKwkJCQlpbmNyIC09IDE7CisJCX0gZWxzZSBpZiAocm1vZGUgPT0gRlBTQ1JfUk9VTkRfVE9aRVJPKSB7CisJCQlpbmNyID0gMDsKKwkJfSBlbHNlIGlmICgocm1vZGUgPT0gRlBTQ1JfUk9VTkRfUExVU0lORikgXiAodmRtLnNpZ24gIT0gMCkpIHsKKwkJCWluY3IgPSB+MFVMTDsKKwkJfQorCisJCWlmICgocmVtICsgaW5jcikgPCByZW0pIHsKKwkJCWlmIChkIDwgMHhmZmZmZmZmZikKKwkJCQlkICs9IDE7CisJCQllbHNlCisJCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JT0M7CisJCX0KKworCQlpZiAoZCAmJiB2ZG0uc2lnbikgeworCQkJZCA9IDA7CisJCQlleGNlcHRpb25zIHw9IEZQU0NSX0lPQzsKKwkJfSBlbHNlIGlmIChyZW0pCisJCQlleGNlcHRpb25zIHw9IEZQU0NSX0lYQzsKKwl9IGVsc2UgeworCQlkID0gMDsKKwkJaWYgKHZkbS5leHBvbmVudCB8IHZkbS5zaWduaWZpY2FuZCkgeworCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JWEM7CisJCQlpZiAocm1vZGUgPT0gRlBTQ1JfUk9VTkRfUExVU0lORiAmJiB2ZG0uc2lnbiA9PSAwKQorCQkJCWQgPSAxOworCQkJZWxzZSBpZiAocm1vZGUgPT0gRlBTQ1JfUk9VTkRfTUlOVVNJTkYgJiYgdmRtLnNpZ24pIHsKKwkJCQlkID0gMDsKKwkJCQlleGNlcHRpb25zIHw9IEZQU0NSX0lPQzsKKwkJCX0KKwkJfQorCX0KKworCXByX2RlYnVnKCJWRlA6IGZ0b3VpOiBkKHMlZCk9JTA4eCBleGNlcHRpb25zPSUwOHhcbiIsIHNkLCBkLCBleGNlcHRpb25zKTsKKworCXZmcF9wdXRfZmxvYXQoc2QsIGQpOworCisJcmV0dXJuIGV4Y2VwdGlvbnM7Cit9CisKK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mdG91aXooaW50IHNkLCBpbnQgdW51c2VkLCBpbnQgZG0sIHUzMiBmcHNjcikKK3sKKwlyZXR1cm4gdmZwX2RvdWJsZV9mdG91aShzZCwgdW51c2VkLCBkbSwgRlBTQ1JfUk9VTkRfVE9aRVJPKTsKK30KKworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2Z0b3NpKGludCBzZCwgaW50IHVudXNlZCwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJc3RydWN0IHZmcF9kb3VibGUgdmRtOworCXUzMiBkLCBleGNlcHRpb25zID0gMDsKKwlpbnQgcm1vZGUgPSBmcHNjciAmIEZQU0NSX1JNT0RFX01BU0s7CisKKwl2ZnBfZG91YmxlX3VucGFjaygmdmRtLCB2ZnBfZ2V0X2RvdWJsZShkbSkpOworCXZmcF9kb3VibGVfZHVtcCgiVkRNIiwgJnZkbSk7CisKKwkvKgorCSAqIERvIHdlIGhhdmUgZGVub3JtYWxpc2VkIG51bWJlcj8KKwkgKi8KKwlpZiAodmZwX2RvdWJsZV90eXBlKCZ2ZG0pICYgVkZQX0RFTk9STUFMKQorCQlleGNlcHRpb25zIHw9IEZQU0NSX0lEQzsKKworCWlmICh2ZG0uZXhwb25lbnQgPj0gMTAyMyArIDMyKSB7CisJCWQgPSAweDdmZmZmZmZmOworCQlpZiAodmRtLnNpZ24pCisJCQlkID0gfmQ7CisJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfSU9DOworCX0gZWxzZSBpZiAodmRtLmV4cG9uZW50ID49IDEwMjMgLSAxKSB7CisJCWludCBzaGlmdCA9IDEwMjMgKyA2MyAtIHZkbS5leHBvbmVudDsJLyogNTggKi8KKwkJdTY0IHJlbSwgaW5jciA9IDA7CisKKwkJZCA9ICh2ZG0uc2lnbmlmaWNhbmQgPDwgMSkgPj4gc2hpZnQ7CisJCXJlbSA9IHZkbS5zaWduaWZpY2FuZCA8PCAoNjUgLSBzaGlmdCk7CisKKwkJaWYgKHJtb2RlID09IEZQU0NSX1JPVU5EX05FQVJFU1QpIHsKKwkJCWluY3IgPSAweDgwMDAwMDAwMDAwMDAwMDBVTEw7CisJCQlpZiAoKGQgJiAxKSA9PSAwKQorCQkJCWluY3IgLT0gMTsKKwkJfSBlbHNlIGlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9UT1pFUk8pIHsKKwkJCWluY3IgPSAwOworCQl9IGVsc2UgaWYgKChybW9kZSA9PSBGUFNDUl9ST1VORF9QTFVTSU5GKSBeICh2ZG0uc2lnbiAhPSAwKSkgeworCQkJaW5jciA9IH4wVUxMOworCQl9CisKKwkJaWYgKChyZW0gKyBpbmNyKSA8IHJlbSAmJiBkIDwgMHhmZmZmZmZmZikKKwkJCWQgKz0gMTsKKwkJaWYgKGQgPiAweDdmZmZmZmZmICsgKHZkbS5zaWduICE9IDApKSB7CisJCQlkID0gMHg3ZmZmZmZmZiArICh2ZG0uc2lnbiAhPSAwKTsKKwkJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfSU9DOworCQl9IGVsc2UgaWYgKHJlbSkKKwkJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfSVhDOworCisJCWlmICh2ZG0uc2lnbikKKwkJCWQgPSAtZDsKKwl9IGVsc2UgeworCQlkID0gMDsKKwkJaWYgKHZkbS5leHBvbmVudCB8IHZkbS5zaWduaWZpY2FuZCkgeworCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JWEM7CisJCQlpZiAocm1vZGUgPT0gRlBTQ1JfUk9VTkRfUExVU0lORiAmJiB2ZG0uc2lnbiA9PSAwKQorCQkJCWQgPSAxOworCQkJZWxzZSBpZiAocm1vZGUgPT0gRlBTQ1JfUk9VTkRfTUlOVVNJTkYgJiYgdmRtLnNpZ24pCisJCQkJZCA9IC0xOworCQl9CisJfQorCisJcHJfZGVidWcoIlZGUDogZnRvc2k6IGQocyVkKT0lMDh4IGV4Y2VwdGlvbnM9JTA4eFxuIiwgc2QsIGQsIGV4Y2VwdGlvbnMpOworCisJdmZwX3B1dF9mbG9hdChzZCwgKHMzMilkKTsKKworCXJldHVybiBleGNlcHRpb25zOworfQorCitzdGF0aWMgdTMyIHZmcF9kb3VibGVfZnRvc2l6KGludCBkZCwgaW50IHVudXNlZCwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9kb3VibGVfZnRvc2koZGQsIHVudXNlZCwgZG0sIEZQU0NSX1JPVU5EX1RPWkVSTyk7Cit9CisKKworc3RhdGljIHUzMiAoKiBjb25zdCBmb3BfZXh0Zm5zWzMyXSkoaW50IGRkLCBpbnQgdW51c2VkLCBpbnQgZG0sIHUzMiBmcHNjcikgPSB7CisJW0ZFWFRfVE9fSURYKEZFWFRfRkNQWSldCT0gdmZwX2RvdWJsZV9mY3B5LAorCVtGRVhUX1RPX0lEWChGRVhUX0ZBQlMpXQk9IHZmcF9kb3VibGVfZmFicywKKwlbRkVYVF9UT19JRFgoRkVYVF9GTkVHKV0JPSB2ZnBfZG91YmxlX2ZuZWcsCisJW0ZFWFRfVE9fSURYKEZFWFRfRlNRUlQpXQk9IHZmcF9kb3VibGVfZnNxcnQsCisJW0ZFWFRfVE9fSURYKEZFWFRfRkNNUCldCT0gdmZwX2RvdWJsZV9mY21wLAorCVtGRVhUX1RPX0lEWChGRVhUX0ZDTVBFKV0JPSB2ZnBfZG91YmxlX2ZjbXBlLAorCVtGRVhUX1RPX0lEWChGRVhUX0ZDTVBaKV0JPSB2ZnBfZG91YmxlX2ZjbXB6LAorCVtGRVhUX1RPX0lEWChGRVhUX0ZDTVBFWildCT0gdmZwX2RvdWJsZV9mY21wZXosCisJW0ZFWFRfVE9fSURYKEZFWFRfRkNWVCldCT0gdmZwX2RvdWJsZV9mY3Z0cywKKwlbRkVYVF9UT19JRFgoRkVYVF9GVUlUTyldCT0gdmZwX2RvdWJsZV9mdWl0bywKKwlbRkVYVF9UT19JRFgoRkVYVF9GU0lUTyldCT0gdmZwX2RvdWJsZV9mc2l0bywKKwlbRkVYVF9UT19JRFgoRkVYVF9GVE9VSSldCT0gdmZwX2RvdWJsZV9mdG91aSwKKwlbRkVYVF9UT19JRFgoRkVYVF9GVE9VSVopXQk9IHZmcF9kb3VibGVfZnRvdWl6LAorCVtGRVhUX1RPX0lEWChGRVhUX0ZUT1NJKV0JPSB2ZnBfZG91YmxlX2Z0b3NpLAorCVtGRVhUX1RPX0lEWChGRVhUX0ZUT1NJWildCT0gdmZwX2RvdWJsZV9mdG9zaXosCit9OworCisKKworCitzdGF0aWMgdTMyCit2ZnBfZG91YmxlX2ZhZGRfbm9ubnVtYmVyKHN0cnVjdCB2ZnBfZG91YmxlICp2ZGQsIHN0cnVjdCB2ZnBfZG91YmxlICp2ZG4sCisJCQkgIHN0cnVjdCB2ZnBfZG91YmxlICp2ZG0sIHUzMiBmcHNjcikKK3sKKwlzdHJ1Y3QgdmZwX2RvdWJsZSAqdmRwOworCXUzMiBleGNlcHRpb25zID0gMDsKKwlpbnQgdG4sIHRtOworCisJdG4gPSB2ZnBfZG91YmxlX3R5cGUodmRuKTsKKwl0bSA9IHZmcF9kb3VibGVfdHlwZSh2ZG0pOworCisJaWYgKHRuICYgdG0gJiBWRlBfSU5GSU5JVFkpIHsKKwkJLyoKKwkJICogVHdvIGluZmluaXRpZXMuICBBcmUgdGhleSBkaWZmZXJlbnQgc2lnbnM/CisJCSAqLworCQlpZiAodmRuLT5zaWduIF4gdmRtLT5zaWduKSB7CisJCQkvKgorCQkJICogZGlmZmVyZW50IHNpZ25zIC0+IGludmFsaWQKKwkJCSAqLworCQkJZXhjZXB0aW9ucyA9IEZQU0NSX0lPQzsKKwkJCXZkcCA9ICZ2ZnBfZG91YmxlX2RlZmF1bHRfcW5hbjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBzYW1lIHNpZ25zIC0+IHZhbGlkCisJCQkgKi8KKwkJCXZkcCA9IHZkbjsKKwkJfQorCX0gZWxzZSBpZiAodG4gJiBWRlBfSU5GSU5JVFkgJiYgdG0gJiBWRlBfTlVNQkVSKSB7CisJCS8qCisJCSAqIE9uZSBpbmZpbml0eSBhbmQgb25lIG51bWJlciAtPiBpbmZpbml0eQorCQkgKi8KKwkJdmRwID0gdmRuOworCX0gZWxzZSB7CisJCS8qCisJCSAqICduJyBpcyBhIE5hTiBvZiBzb21lIHR5cGUKKwkJICovCisJCXJldHVybiB2ZnBfcHJvcGFnYXRlX25hbih2ZGQsIHZkbiwgdmRtLCBmcHNjcik7CisJfQorCSp2ZGQgPSAqdmRwOworCXJldHVybiBleGNlcHRpb25zOworfQorCitzdGF0aWMgdTMyCit2ZnBfZG91YmxlX2FkZChzdHJ1Y3QgdmZwX2RvdWJsZSAqdmRkLCBzdHJ1Y3QgdmZwX2RvdWJsZSAqdmRuLAorCSAgICAgICBzdHJ1Y3QgdmZwX2RvdWJsZSAqdmRtLCB1MzIgZnBzY3IpCit7CisJdTMyIGV4cF9kaWZmOworCXU2NCBtX3NpZzsKKworCWlmICh2ZG4tPnNpZ25pZmljYW5kICYgKDFVTEwgPDwgNjMpIHx8CisJICAgIHZkbS0+c2lnbmlmaWNhbmQgJiAoMVVMTCA8PCA2MykpIHsKKwkJcHJfaW5mbygiVkZQOiBiYWQgRlAgdmFsdWVzIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJCXZmcF9kb3VibGVfZHVtcCgiVkROIiwgdmRuKTsKKwkJdmZwX2RvdWJsZV9kdW1wKCJWRE0iLCB2ZG0pOworCX0KKworCS8qCisJICogRW5zdXJlIHRoYXQgJ24nIGlzIHRoZSBsYXJnZXN0IG1hZ25pdHVkZSBudW1iZXIuICBOb3RlIHRoYXQKKwkgKiBpZiAnbicgYW5kICdtJyBoYXZlIGVxdWFsIGV4cG9uZW50cywgd2UgZG8gbm90IHN3YXAgdGhlbS4KKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBOYU4gcHJvcGFnYXRpb24gd29ya3MgY29ycmVjdGx5LgorCSAqLworCWlmICh2ZG4tPmV4cG9uZW50IDwgdmRtLT5leHBvbmVudCkgeworCQlzdHJ1Y3QgdmZwX2RvdWJsZSAqdCA9IHZkbjsKKwkJdmRuID0gdmRtOworCQl2ZG0gPSB0OworCX0KKworCS8qCisJICogSXMgJ24nIGFuIGluZmluaXR5IG9yIGEgTmFOPyAgTm90ZSB0aGF0ICdtJyBtYXkgYmUgYSBudW1iZXIsCisJICogaW5maW5pdHkgb3IgYSBOYU4gaGVyZS4KKwkgKi8KKwlpZiAodmRuLT5leHBvbmVudCA9PSAyMDQ3KQorCQlyZXR1cm4gdmZwX2RvdWJsZV9mYWRkX25vbm51bWJlcih2ZGQsIHZkbiwgdmRtLCBmcHNjcik7CisKKwkvKgorCSAqIFdlIGhhdmUgdHdvIHByb3BlciBudW1iZXJzLCB3aGVyZSAndmRuJyBpcyB0aGUgbGFyZ2VyIG1hZ25pdHVkZS4KKwkgKgorCSAqIENvcHkgJ24nIHRvICdkJyBiZWZvcmUgZG9pbmcgdGhlIGFyaXRobWV0aWMuCisJICovCisJKnZkZCA9ICp2ZG47CisKKwkvKgorCSAqIEFsaWduICdtJyB3aXRoIHRoZSByZXN1bHQuCisJICovCisJZXhwX2RpZmYgPSB2ZG4tPmV4cG9uZW50IC0gdmRtLT5leHBvbmVudDsKKwltX3NpZyA9IHZmcF9zaGlmdHJpZ2h0NjRqYW1taW5nKHZkbS0+c2lnbmlmaWNhbmQsIGV4cF9kaWZmKTsKKworCS8qCisJICogSWYgdGhlIHNpZ25zIGFyZSBkaWZmZXJlbnQsIHdlIGFyZSByZWFsbHkgc3VidHJhY3RpbmcuCisJICovCisJaWYgKHZkbi0+c2lnbiBeIHZkbS0+c2lnbikgeworCQltX3NpZyA9IHZkbi0+c2lnbmlmaWNhbmQgLSBtX3NpZzsKKwkJaWYgKChzNjQpbV9zaWcgPCAwKSB7CisJCQl2ZGQtPnNpZ24gPSB2ZnBfc2lnbl9uZWdhdGUodmRkLT5zaWduKTsKKwkJCW1fc2lnID0gLW1fc2lnOworCQl9CisJfSBlbHNlIHsKKwkJbV9zaWcgKz0gdmRuLT5zaWduaWZpY2FuZDsKKwl9CisJdmRkLT5zaWduaWZpY2FuZCA9IG1fc2lnOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIKK3ZmcF9kb3VibGVfbXVsdGlwbHkoc3RydWN0IHZmcF9kb3VibGUgKnZkZCwgc3RydWN0IHZmcF9kb3VibGUgKnZkbiwKKwkJICAgIHN0cnVjdCB2ZnBfZG91YmxlICp2ZG0sIHUzMiBmcHNjcikKK3sKKwl2ZnBfZG91YmxlX2R1bXAoIlZETiIsIHZkbik7CisJdmZwX2RvdWJsZV9kdW1wKCJWRE0iLCB2ZG0pOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCAnbicgaXMgdGhlIGxhcmdlc3QgbWFnbml0dWRlIG51bWJlci4gIE5vdGUgdGhhdAorCSAqIGlmICduJyBhbmQgJ20nIGhhdmUgZXF1YWwgZXhwb25lbnRzLCB3ZSBkbyBub3Qgc3dhcCB0aGVtLgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IE5hTiBwcm9wYWdhdGlvbiB3b3JrcyBjb3JyZWN0bHkuCisJICovCisJaWYgKHZkbi0+ZXhwb25lbnQgPCB2ZG0tPmV4cG9uZW50KSB7CisJCXN0cnVjdCB2ZnBfZG91YmxlICp0ID0gdmRuOworCQl2ZG4gPSB2ZG07CisJCXZkbSA9IHQ7CisJCXByX2RlYnVnKCJWRlA6IHN3YXBwaW5nIE0gPC0+IE5cbiIpOworCX0KKworCXZkZC0+c2lnbiA9IHZkbi0+c2lnbiBeIHZkbS0+c2lnbjsKKworCS8qCisJICogSWYgJ24nIGlzIGFuIGluZmluaXR5IG9yIE5hTiwgaGFuZGxlIGl0LiAgJ20nIG1heSBiZSBhbnl0aGluZy4KKwkgKi8KKwlpZiAodmRuLT5leHBvbmVudCA9PSAyMDQ3KSB7CisJCWlmICh2ZG4tPnNpZ25pZmljYW5kIHx8ICh2ZG0tPmV4cG9uZW50ID09IDIwNDcgJiYgdmRtLT5zaWduaWZpY2FuZCkpCisJCQlyZXR1cm4gdmZwX3Byb3BhZ2F0ZV9uYW4odmRkLCB2ZG4sIHZkbSwgZnBzY3IpOworCQlpZiAoKHZkbS0+ZXhwb25lbnQgfCB2ZG0tPnNpZ25pZmljYW5kKSA9PSAwKSB7CisJCQkqdmRkID0gdmZwX2RvdWJsZV9kZWZhdWx0X3FuYW47CisJCQlyZXR1cm4gRlBTQ1JfSU9DOworCQl9CisJCXZkZC0+ZXhwb25lbnQgPSB2ZG4tPmV4cG9uZW50OworCQl2ZGQtPnNpZ25pZmljYW5kID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiAnbScgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhbHdheXMgemVyby4gIEluIHRoaXMgY2FzZSwKKwkgKiAnbicgbWF5IGJlIHplcm8gb3IgYSBudW1iZXIsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaC4KKwkgKi8KKwlpZiAoKHZkbS0+ZXhwb25lbnQgfCB2ZG0tPnNpZ25pZmljYW5kKSA9PSAwKSB7CisJCXZkZC0+ZXhwb25lbnQgPSAwOworCQl2ZGQtPnNpZ25pZmljYW5kID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhZGQgMiB0byB0aGUgZGVzdGluYXRpb24gZXhwb25lbnQgZm9yIHRoZSBzYW1lIHJlYXNvbgorCSAqIGFzIHRoZSBhZGRpdGlvbiBjYXNlIC0gdGhvdWdoIHRoaXMgdGltZSB3ZSBoYXZlICsxIGZyb20KKwkgKiBlYWNoIGlucHV0IG9wZXJhbmQuCisJICovCisJdmRkLT5leHBvbmVudCA9IHZkbi0+ZXhwb25lbnQgKyB2ZG0tPmV4cG9uZW50IC0gMTAyMyArIDI7CisJdmRkLT5zaWduaWZpY2FuZCA9IHZmcF9oaTY0bXVsdGlwbHk2NCh2ZG4tPnNpZ25pZmljYW5kLCB2ZG0tPnNpZ25pZmljYW5kKTsKKworCXZmcF9kb3VibGVfZHVtcCgiVkREIiwgdmRkKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBORUdfTVVMVElQTFkJKDEgPDwgMCkKKyNkZWZpbmUgTkVHX1NVQlRSQUNUCSgxIDw8IDEpCisKK3N0YXRpYyB1MzIKK3ZmcF9kb3VibGVfbXVsdGlwbHlfYWNjdW11bGF0ZShpbnQgZGQsIGludCBkbiwgaW50IGRtLCB1MzIgZnBzY3IsIHUzMiBuZWdhdGUsIGNoYXIgKmZ1bmMpCit7CisJc3RydWN0IHZmcF9kb3VibGUgdmRkLCB2ZHAsIHZkbiwgdmRtOworCXUzMiBleGNlcHRpb25zOworCisJdmZwX2RvdWJsZV91bnBhY2soJnZkbiwgdmZwX2dldF9kb3VibGUoZG4pKTsKKwlpZiAodmRuLmV4cG9uZW50ID09IDAgJiYgdmRuLnNpZ25pZmljYW5kKQorCQl2ZnBfZG91YmxlX25vcm1hbGlzZV9kZW5vcm1hbCgmdmRuKTsKKworCXZmcF9kb3VibGVfdW5wYWNrKCZ2ZG0sIHZmcF9nZXRfZG91YmxlKGRtKSk7CisJaWYgKHZkbS5leHBvbmVudCA9PSAwICYmIHZkbS5zaWduaWZpY2FuZCkKKwkJdmZwX2RvdWJsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZkbSk7CisKKwlleGNlcHRpb25zID0gdmZwX2RvdWJsZV9tdWx0aXBseSgmdmRwLCAmdmRuLCAmdmRtLCBmcHNjcik7CisJaWYgKG5lZ2F0ZSAmIE5FR19NVUxUSVBMWSkKKwkJdmRwLnNpZ24gPSB2ZnBfc2lnbl9uZWdhdGUodmRwLnNpZ24pOworCisJdmZwX2RvdWJsZV91bnBhY2soJnZkbiwgdmZwX2dldF9kb3VibGUoZGQpKTsKKwlpZiAobmVnYXRlICYgTkVHX1NVQlRSQUNUKQorCQl2ZG4uc2lnbiA9IHZmcF9zaWduX25lZ2F0ZSh2ZG4uc2lnbik7CisKKwlleGNlcHRpb25zIHw9IHZmcF9kb3VibGVfYWRkKCZ2ZGQsICZ2ZG4sICZ2ZHAsIGZwc2NyKTsKKworCXJldHVybiB2ZnBfZG91YmxlX25vcm1hbGlzZXJvdW5kKGRkLCAmdmRkLCBmcHNjciwgZXhjZXB0aW9ucywgZnVuYyk7Cit9CisKKy8qCisgKiBTdGFuZGFyZCBvcGVyYXRpb25zCisgKi8KKworLyoKKyAqIHNkID0gc2QgKyAoc24gKiBzbSkKKyAqLworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZtYWMoaW50IGRkLCBpbnQgZG4sIGludCBkbSwgdTMyIGZwc2NyKQoreworCXJldHVybiB2ZnBfZG91YmxlX211bHRpcGx5X2FjY3VtdWxhdGUoZGQsIGRuLCBkbSwgZnBzY3IsIDAsICJmbWFjIik7Cit9CisKKy8qCisgKiBzZCA9IHNkIC0gKHNuICogc20pCisgKi8KK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mbm1hYyhpbnQgZGQsIGludCBkbiwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9kb3VibGVfbXVsdGlwbHlfYWNjdW11bGF0ZShkZCwgZG4sIGRtLCBmcHNjciwgTkVHX01VTFRJUExZLCAiZm5tYWMiKTsKK30KKworLyoKKyAqIHNkID0gLXNkICsgKHNuICogc20pCisgKi8KK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mbXNjKGludCBkZCwgaW50IGRuLCBpbnQgZG0sIHUzMiBmcHNjcikKK3sKKwlyZXR1cm4gdmZwX2RvdWJsZV9tdWx0aXBseV9hY2N1bXVsYXRlKGRkLCBkbiwgZG0sIGZwc2NyLCBORUdfU1VCVFJBQ1QsICJmbXNjIik7Cit9CisKKy8qCisgKiBzZCA9IC1zZCAtIChzbiAqIHNtKQorICovCitzdGF0aWMgdTMyIHZmcF9kb3VibGVfZm5tc2MoaW50IGRkLCBpbnQgZG4sIGludCBkbSwgdTMyIGZwc2NyKQoreworCXJldHVybiB2ZnBfZG91YmxlX211bHRpcGx5X2FjY3VtdWxhdGUoZGQsIGRuLCBkbSwgZnBzY3IsIE5FR19TVUJUUkFDVCB8IE5FR19NVUxUSVBMWSwgImZubXNjIik7Cit9CisKKy8qCisgKiBzZCA9IHNuICogc20KKyAqLworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZtdWwoaW50IGRkLCBpbnQgZG4sIGludCBkbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfZG91YmxlIHZkZCwgdmRuLCB2ZG07CisJdTMyIGV4Y2VwdGlvbnM7CisKKwl2ZnBfZG91YmxlX3VucGFjaygmdmRuLCB2ZnBfZ2V0X2RvdWJsZShkbikpOworCWlmICh2ZG4uZXhwb25lbnQgPT0gMCAmJiB2ZG4uc2lnbmlmaWNhbmQpCisJCXZmcF9kb3VibGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2ZG4pOworCisJdmZwX2RvdWJsZV91bnBhY2soJnZkbSwgdmZwX2dldF9kb3VibGUoZG0pKTsKKwlpZiAodmRtLmV4cG9uZW50ID09IDAgJiYgdmRtLnNpZ25pZmljYW5kKQorCQl2ZnBfZG91YmxlX25vcm1hbGlzZV9kZW5vcm1hbCgmdmRtKTsKKworCWV4Y2VwdGlvbnMgPSB2ZnBfZG91YmxlX211bHRpcGx5KCZ2ZGQsICZ2ZG4sICZ2ZG0sIGZwc2NyKTsKKwlyZXR1cm4gdmZwX2RvdWJsZV9ub3JtYWxpc2Vyb3VuZChkZCwgJnZkZCwgZnBzY3IsIGV4Y2VwdGlvbnMsICJmbXVsIik7Cit9CisKKy8qCisgKiBzZCA9IC0oc24gKiBzbSkKKyAqLworc3RhdGljIHUzMiB2ZnBfZG91YmxlX2ZubXVsKGludCBkZCwgaW50IGRuLCBpbnQgZG0sIHUzMiBmcHNjcikKK3sKKwlzdHJ1Y3QgdmZwX2RvdWJsZSB2ZGQsIHZkbiwgdmRtOworCXUzMiBleGNlcHRpb25zOworCisJdmZwX2RvdWJsZV91bnBhY2soJnZkbiwgdmZwX2dldF9kb3VibGUoZG4pKTsKKwlpZiAodmRuLmV4cG9uZW50ID09IDAgJiYgdmRuLnNpZ25pZmljYW5kKQorCQl2ZnBfZG91YmxlX25vcm1hbGlzZV9kZW5vcm1hbCgmdmRuKTsKKworCXZmcF9kb3VibGVfdW5wYWNrKCZ2ZG0sIHZmcF9nZXRfZG91YmxlKGRtKSk7CisJaWYgKHZkbS5leHBvbmVudCA9PSAwICYmIHZkbS5zaWduaWZpY2FuZCkKKwkJdmZwX2RvdWJsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZkbSk7CisKKwlleGNlcHRpb25zID0gdmZwX2RvdWJsZV9tdWx0aXBseSgmdmRkLCAmdmRuLCAmdmRtLCBmcHNjcik7CisJdmRkLnNpZ24gPSB2ZnBfc2lnbl9uZWdhdGUodmRkLnNpZ24pOworCisJcmV0dXJuIHZmcF9kb3VibGVfbm9ybWFsaXNlcm91bmQoZGQsICZ2ZGQsIGZwc2NyLCBleGNlcHRpb25zLCAiZm5tdWwiKTsKK30KKworLyoKKyAqIHNkID0gc24gKyBzbQorICovCitzdGF0aWMgdTMyIHZmcF9kb3VibGVfZmFkZChpbnQgZGQsIGludCBkbiwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJc3RydWN0IHZmcF9kb3VibGUgdmRkLCB2ZG4sIHZkbTsKKwl1MzIgZXhjZXB0aW9uczsKKworCXZmcF9kb3VibGVfdW5wYWNrKCZ2ZG4sIHZmcF9nZXRfZG91YmxlKGRuKSk7CisJaWYgKHZkbi5leHBvbmVudCA9PSAwICYmIHZkbi5zaWduaWZpY2FuZCkKKwkJdmZwX2RvdWJsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZkbik7CisKKwl2ZnBfZG91YmxlX3VucGFjaygmdmRtLCB2ZnBfZ2V0X2RvdWJsZShkbSkpOworCWlmICh2ZG0uZXhwb25lbnQgPT0gMCAmJiB2ZG0uc2lnbmlmaWNhbmQpCisJCXZmcF9kb3VibGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2ZG0pOworCisJZXhjZXB0aW9ucyA9IHZmcF9kb3VibGVfYWRkKCZ2ZGQsICZ2ZG4sICZ2ZG0sIGZwc2NyKTsKKworCXJldHVybiB2ZnBfZG91YmxlX25vcm1hbGlzZXJvdW5kKGRkLCAmdmRkLCBmcHNjciwgZXhjZXB0aW9ucywgImZhZGQiKTsKK30KKworLyoKKyAqIHNkID0gc24gLSBzbQorICovCitzdGF0aWMgdTMyIHZmcF9kb3VibGVfZnN1YihpbnQgZGQsIGludCBkbiwgaW50IGRtLCB1MzIgZnBzY3IpCit7CisJc3RydWN0IHZmcF9kb3VibGUgdmRkLCB2ZG4sIHZkbTsKKwl1MzIgZXhjZXB0aW9uczsKKworCXZmcF9kb3VibGVfdW5wYWNrKCZ2ZG4sIHZmcF9nZXRfZG91YmxlKGRuKSk7CisJaWYgKHZkbi5leHBvbmVudCA9PSAwICYmIHZkbi5zaWduaWZpY2FuZCkKKwkJdmZwX2RvdWJsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZkbik7CisKKwl2ZnBfZG91YmxlX3VucGFjaygmdmRtLCB2ZnBfZ2V0X2RvdWJsZShkbSkpOworCWlmICh2ZG0uZXhwb25lbnQgPT0gMCAmJiB2ZG0uc2lnbmlmaWNhbmQpCisJCXZmcF9kb3VibGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2ZG0pOworCisJLyoKKwkgKiBTdWJ0cmFjdGlvbiBpcyBsaWtlIGFkZGl0aW9uLCBidXQgd2l0aCBhIG5lZ2F0ZWQgb3BlcmFuZC4KKwkgKi8KKwl2ZG0uc2lnbiA9IHZmcF9zaWduX25lZ2F0ZSh2ZG0uc2lnbik7CisKKwlleGNlcHRpb25zID0gdmZwX2RvdWJsZV9hZGQoJnZkZCwgJnZkbiwgJnZkbSwgZnBzY3IpOworCisJcmV0dXJuIHZmcF9kb3VibGVfbm9ybWFsaXNlcm91bmQoZGQsICZ2ZGQsIGZwc2NyLCBleGNlcHRpb25zLCAiZnN1YiIpOworfQorCisvKgorICogc2QgPSBzbiAvIHNtCisgKi8KK3N0YXRpYyB1MzIgdmZwX2RvdWJsZV9mZGl2KGludCBkZCwgaW50IGRuLCBpbnQgZG0sIHUzMiBmcHNjcikKK3sKKwlzdHJ1Y3QgdmZwX2RvdWJsZSB2ZGQsIHZkbiwgdmRtOworCXUzMiBleGNlcHRpb25zID0gMDsKKwlpbnQgdG0sIHRuOworCisJdmZwX2RvdWJsZV91bnBhY2soJnZkbiwgdmZwX2dldF9kb3VibGUoZG4pKTsKKwl2ZnBfZG91YmxlX3VucGFjaygmdmRtLCB2ZnBfZ2V0X2RvdWJsZShkbSkpOworCisJdmRkLnNpZ24gPSB2ZG4uc2lnbiBeIHZkbS5zaWduOworCisJdG4gPSB2ZnBfZG91YmxlX3R5cGUoJnZkbik7CisJdG0gPSB2ZnBfZG91YmxlX3R5cGUoJnZkbSk7CisKKwkvKgorCSAqIElzIG4gYSBOQU4/CisJICovCisJaWYgKHRuICYgVkZQX05BTikKKwkJZ290byB2ZG5fbmFuOworCisJLyoKKwkgKiBJcyBtIGEgTkFOPworCSAqLworCWlmICh0bSAmIFZGUF9OQU4pCisJCWdvdG8gdmRtX25hbjsKKworCS8qCisJICogSWYgbiBhbmQgbSBhcmUgaW5maW5pdHksIHRoZSByZXN1bHQgaXMgaW52YWxpZAorCSAqIElmIG4gYW5kIG0gYXJlIHplcm8sIHRoZSByZXN1bHQgaXMgaW52YWxpZAorCSAqLworCWlmICh0bSAmIHRuICYgKFZGUF9JTkZJTklUWXxWRlBfWkVSTykpCisJCWdvdG8gaW52YWxpZDsKKworCS8qCisJICogSWYgbiBpcyBpbmZpbml0eSwgdGhlIHJlc3VsdCBpcyBpbmZpbml0eQorCSAqLworCWlmICh0biAmIFZGUF9JTkZJTklUWSkKKwkJZ290byBpbmZpbml0eTsKKworCS8qCisJICogSWYgbSBpcyB6ZXJvLCByYWlzZSBkaXYwIGV4Y2VwdGlvbnMKKwkgKi8KKwlpZiAodG0gJiBWRlBfWkVSTykKKwkJZ290byBkaXZ6ZXJvOworCisJLyoKKwkgKiBJZiBtIGlzIGluZmluaXR5LCBvciBuIGlzIHplcm8sIHRoZSByZXN1bHQgaXMgemVybworCSAqLworCWlmICh0bSAmIFZGUF9JTkZJTklUWSB8fCB0biAmIFZGUF9aRVJPKQorCQlnb3RvIHplcm87CisKKwlpZiAodG4gJiBWRlBfREVOT1JNQUwpCisJCXZmcF9kb3VibGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2ZG4pOworCWlmICh0bSAmIFZGUF9ERU5PUk1BTCkKKwkJdmZwX2RvdWJsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZkbSk7CisKKwkvKgorCSAqIE9rLCB3ZSBoYXZlIHR3byBudW1iZXJzLCB3ZSBjYW4gcGVyZm9ybSBkaXZpc2lvbi4KKwkgKi8KKwl2ZGQuZXhwb25lbnQgPSB2ZG4uZXhwb25lbnQgLSB2ZG0uZXhwb25lbnQgKyAxMDIzIC0gMTsKKwl2ZG0uc2lnbmlmaWNhbmQgPDw9IDE7CisJaWYgKHZkbS5zaWduaWZpY2FuZCA8PSAoMiAqIHZkbi5zaWduaWZpY2FuZCkpIHsKKwkJdmRuLnNpZ25pZmljYW5kID4+PSAxOworCQl2ZGQuZXhwb25lbnQrKzsKKwl9CisJdmRkLnNpZ25pZmljYW5kID0gdmZwX2VzdGltYXRlX2RpdjEyOHRvNjQodmRuLnNpZ25pZmljYW5kLCAwLCB2ZG0uc2lnbmlmaWNhbmQpOworCWlmICgodmRkLnNpZ25pZmljYW5kICYgMHgxZmYpIDw9IDIpIHsKKwkJdTY0IHRlcm1oLCB0ZXJtbCwgcmVtaCwgcmVtbDsKKwkJbXVsNjR0bzEyOCgmdGVybWgsICZ0ZXJtbCwgdmRtLnNpZ25pZmljYW5kLCB2ZGQuc2lnbmlmaWNhbmQpOworCQlzdWIxMjgoJnJlbWgsICZyZW1sLCB2ZG4uc2lnbmlmaWNhbmQsIDAsIHRlcm1oLCB0ZXJtbCk7CisJCXdoaWxlICgoczY0KXJlbWggPCAwKSB7CisJCQl2ZGQuc2lnbmlmaWNhbmQgLT0gMTsKKwkJCWFkZDEyOCgmcmVtaCwgJnJlbWwsIHJlbWgsIHJlbWwsIDAsIHZkbS5zaWduaWZpY2FuZCk7CisJCX0KKwkJdmRkLnNpZ25pZmljYW5kIHw9IChyZW1sICE9IDApOworCX0KKwlyZXR1cm4gdmZwX2RvdWJsZV9ub3JtYWxpc2Vyb3VuZChkZCwgJnZkZCwgZnBzY3IsIDAsICJmZGl2Iik7CisKKyB2ZG5fbmFuOgorCWV4Y2VwdGlvbnMgPSB2ZnBfcHJvcGFnYXRlX25hbigmdmRkLCAmdmRuLCAmdmRtLCBmcHNjcik7CisgcGFjazoKKwl2ZnBfcHV0X2RvdWJsZShkZCwgdmZwX2RvdWJsZV9wYWNrKCZ2ZGQpKTsKKwlyZXR1cm4gZXhjZXB0aW9uczsKKworIHZkbV9uYW46CisJZXhjZXB0aW9ucyA9IHZmcF9wcm9wYWdhdGVfbmFuKCZ2ZGQsICZ2ZG0sICZ2ZG4sIGZwc2NyKTsKKwlnb3RvIHBhY2s7CisKKyB6ZXJvOgorCXZkZC5leHBvbmVudCA9IDA7CisJdmRkLnNpZ25pZmljYW5kID0gMDsKKwlnb3RvIHBhY2s7CisKKyBkaXZ6ZXJvOgorCWV4Y2VwdGlvbnMgPSBGUFNDUl9EWkM7CisgaW5maW5pdHk6CisJdmRkLmV4cG9uZW50ID0gMjA0NzsKKwl2ZGQuc2lnbmlmaWNhbmQgPSAwOworCWdvdG8gcGFjazsKKworIGludmFsaWQ6CisJdmZwX3B1dF9kb3VibGUoZGQsIHZmcF9kb3VibGVfcGFjaygmdmZwX2RvdWJsZV9kZWZhdWx0X3FuYW4pKTsKKwlyZXR1cm4gRlBTQ1JfSU9DOworfQorCitzdGF0aWMgdTMyICgqIGNvbnN0IGZvcF9mbnNbMTZdKShpbnQgZGQsIGludCBkbiwgaW50IGRtLCB1MzIgZnBzY3IpID0geworCVtGT1BfVE9fSURYKEZPUF9GTUFDKV0JPSB2ZnBfZG91YmxlX2ZtYWMsCisJW0ZPUF9UT19JRFgoRk9QX0ZOTUFDKV0JPSB2ZnBfZG91YmxlX2ZubWFjLAorCVtGT1BfVE9fSURYKEZPUF9GTVNDKV0JPSB2ZnBfZG91YmxlX2Ztc2MsCisJW0ZPUF9UT19JRFgoRk9QX0ZOTVNDKV0JPSB2ZnBfZG91YmxlX2ZubXNjLAorCVtGT1BfVE9fSURYKEZPUF9GTVVMKV0JPSB2ZnBfZG91YmxlX2ZtdWwsCisJW0ZPUF9UT19JRFgoRk9QX0ZOTVVMKV0JPSB2ZnBfZG91YmxlX2ZubXVsLAorCVtGT1BfVE9fSURYKEZPUF9GQUREKV0JPSB2ZnBfZG91YmxlX2ZhZGQsCisJW0ZPUF9UT19JRFgoRk9QX0ZTVUIpXQk9IHZmcF9kb3VibGVfZnN1YiwKKwlbRk9QX1RPX0lEWChGT1BfRkRJVildCT0gdmZwX2RvdWJsZV9mZGl2LAorfTsKKworI2RlZmluZSBGUkVHX0JBTksoeCkJKCh4KSAmIDB4MGMpCisjZGVmaW5lIEZSRUdfSURYKHgpCSgoeCkgJiAzKQorCit1MzIgdmZwX2RvdWJsZV9jcGRvKHUzMiBpbnN0LCB1MzIgZnBzY3IpCit7CisJdTMyIG9wID0gaW5zdCAmIEZPUF9NQVNLOworCXUzMiBleGNlcHRpb25zID0gMDsKKwl1bnNpZ25lZCBpbnQgZGQgPSB2ZnBfZ2V0X3NkKGluc3QpOworCXVuc2lnbmVkIGludCBkbiA9IHZmcF9nZXRfc24oaW5zdCk7CisJdW5zaWduZWQgaW50IGRtID0gdmZwX2dldF9zbShpbnN0KTsKKwl1bnNpZ25lZCBpbnQgdmVjaXRyLCB2ZWNsZW4sIHZlY3N0cmlkZTsKKwl1MzIgKCpmb3ApKGludCwgaW50LCBzMzIsIHUzMik7CisKKwl2ZWNsZW4gPSBmcHNjciAmIEZQU0NSX0xFTkdUSF9NQVNLOworCXZlY3N0cmlkZSA9ICgxICsgKChmcHNjciAmIEZQU0NSX1NUUklERV9NQVNLKSA9PSBGUFNDUl9TVFJJREVfTUFTSykpICogMjsKKworCS8qCisJICogSWYgZGVzdGluYXRpb24gYmFuayBpcyB6ZXJvLCB2ZWN0b3IgbGVuZ3RoIGlzIGFsd2F5cyAnMScuCisJICogQVJNIERESTAxMDBGIEM1LjEuMywgQzUuMy4yLgorCSAqLworCWlmIChGUkVHX0JBTksoZGQpID09IDApCisJCXZlY2xlbiA9IDA7CisKKwlwcl9kZWJ1ZygiVkZQOiB2ZWNzdHJpZGU9JXUgdmVjbGVuPSV1XG4iLCB2ZWNzdHJpZGUsCisJCSAodmVjbGVuID4+IEZQU0NSX0xFTkdUSF9CSVQpICsgMSk7CisKKwlmb3AgPSAob3AgPT0gRk9QX0VYVCkgPyBmb3BfZXh0Zm5zW2RuXSA6IGZvcF9mbnNbRk9QX1RPX0lEWChvcCldOworCWlmICghZm9wKQorCQlnb3RvIGludmFsaWQ7CisKKwlmb3IgKHZlY2l0ciA9IDA7IHZlY2l0ciA8PSB2ZWNsZW47IHZlY2l0ciArPSAxIDw8IEZQU0NSX0xFTkdUSF9CSVQpIHsKKwkJdTMyIGV4Y2VwdDsKKworCQlpZiAob3AgPT0gRk9QX0VYVCkKKwkJCXByX2RlYnVnKCJWRlA6IGl0ciVkIChkJXUuJXUpID0gb3BbJXVdIChkJXUuJXUpXG4iLAorCQkJCSB2ZWNpdHIgPj4gRlBTQ1JfTEVOR1RIX0JJVCwKKwkJCQkgZGQgPj4gMSwgZGQgJiAxLCBkbiwKKwkJCQkgZG0gPj4gMSwgZG0gJiAxKTsKKwkJZWxzZQorCQkJcHJfZGVidWcoIlZGUDogaXRyJWQgKGQldS4ldSkgPSAoZCV1LiV1KSBvcFsldV0gKGQldS4ldSlcbiIsCisJCQkJIHZlY2l0ciA+PiBGUFNDUl9MRU5HVEhfQklULAorCQkJCSBkZCA+PiAxLCBkZCAmIDEsCisJCQkJIGRuID4+IDEsIGRuICYgMSwKKwkJCQkgRk9QX1RPX0lEWChvcCksCisJCQkJIGRtID4+IDEsIGRtICYgMSk7CisKKwkJZXhjZXB0ID0gZm9wKGRkLCBkbiwgZG0sIGZwc2NyKTsKKwkJcHJfZGVidWcoIlZGUDogaXRyJWQ6IGV4Y2VwdGlvbnM9JTA4eFxuIiwKKwkJCSB2ZWNpdHIgPj4gRlBTQ1JfTEVOR1RIX0JJVCwgZXhjZXB0KTsKKworCQlleGNlcHRpb25zIHw9IGV4Y2VwdDsKKworCQkvKgorCQkgKiBUaGlzIGVuc3VyZXMgdGhhdCBjb21wYXJpc29ucyBvbmx5IG9wZXJhdGUgb24gc2NhbGFyczsKKwkJICogY29tcGFyaXNvbnMgYWx3YXlzIHJldHVybiB3aXRoIG9uZSBGUFNDUiBzdGF0dXMgYml0IHNldC4KKwkJICovCisJCWlmIChleGNlcHQgJiAoRlBTQ1JfTnxGUFNDUl9afEZQU0NSX0N8RlBTQ1JfVikpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBDSEVDSzogSXQgYXBwZWFycyB0byBiZSB1bmRlZmluZWQgd2hldGhlciB3ZSBzdG9wIHdoZW4KKwkJICogd2UgZW5jb3VudGVyIGFuIGV4Y2VwdGlvbi4gIFdlIGNvbnRpbnVlLgorCQkgKi8KKworCQlkZCA9IEZSRUdfQkFOSyhkZCkgKyAoKEZSRUdfSURYKGRkKSArIHZlY3N0cmlkZSkgJiA2KTsKKwkJZG4gPSBGUkVHX0JBTksoZG4pICsgKChGUkVHX0lEWChkbikgKyB2ZWNzdHJpZGUpICYgNik7CisJCWlmIChGUkVHX0JBTksoZG0pICE9IDApCisJCQlkbSA9IEZSRUdfQkFOSyhkbSkgKyAoKEZSRUdfSURYKGRtKSArIHZlY3N0cmlkZSkgJiA2KTsKKwl9CisJcmV0dXJuIGV4Y2VwdGlvbnM7CisKKyBpbnZhbGlkOgorCXJldHVybiB+MDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBody5TIGIvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0Y2ExMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3ZmcC92ZnBody5TCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3ZmcC92ZnBody5TCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZC4KKyAqICBXcml0dGVuIGJ5IERlZXAgQmx1ZSBTb2x1dGlvbnMgTGltaXRlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBjYWxsZWQgZnJvbSB0aGUga2VybmVsJ3MgdW5kZWZpbmVkIGluc3RydWN0aW9uIHRyYXAuCisgKiByOSBob2xkcyB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIHN1Y2Nlc3NmdWwgaGFuZGxpbmcuCisgKiBsciBob2xkcyB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIHVucmVjb2duaXNlZCBpbnN0cnVjdGlvbnMuCisgKiByMTAgcG9pbnRzIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJpdmF0ZSBGUCB3b3Jrc3BhY2UgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUKKyAqIHNwIHBvaW50cyB0byBhIHN0cnVjdCBwdF9yZWdzIChhcyBkZWZpbmVkIGluIGluY2x1ZGUvYXNtL3Byb2MvcHRyYWNlLmgpCisgKi8KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vdmZwbWFjcm9zLmg+CisjaW5jbHVkZSAiLi4va2VybmVsL2VudHJ5LWhlYWRlci5TIgorCisJLm1hY3JvCURCR1NUUiwgc3RyCisjaWZkZWYgREVCVUcKKwlzdG1mZAlzcCEsIHtyMC1yMywgaXAsIGxyfQorCWFkZAlyMCwgcGMsICM0CisJYmwJcHJpbnRrCisJYgkxZgorCS5hc2NpeiAgIjw3PlZGUDogXHN0clxuIgorCS5iYWxpZ24gNAorMToJbGRtZmQJc3AhLCB7cjAtcjMsIGlwLCBscn0KKyNlbmRpZgorCS5lbmRtCisKKwkubWFjcm8gIERCR1NUUjEsIHN0ciwgYXJnCisjaWZkZWYgREVCVUcKKwlzdG1mZAlzcCEsIHtyMC1yMywgaXAsIGxyfQorCW1vdglyMSwgXGFyZworCWFkZAlyMCwgcGMsICM0CisJYmwJcHJpbnRrCisJYgkxZgorCS5hc2NpeiAgIjw3PlZGUDogXHN0clxuIgorCS5iYWxpZ24gNAorMToJbGRtZmQJc3AhLCB7cjAtcjMsIGlwLCBscn0KKyNlbmRpZgorCS5lbmRtCisKKwkubWFjcm8gIERCR1NUUjMsIHN0ciwgYXJnMSwgYXJnMiwgYXJnMworI2lmZGVmIERFQlVHCisJc3RtZmQJc3AhLCB7cjAtcjMsIGlwLCBscn0KKwltb3YJcjMsIFxhcmczCisJbW92CXIyLCBcYXJnMgorCW1vdglyMSwgXGFyZzEKKwlhZGQJcjAsIHBjLCAjNAorCWJsCXByaW50aworCWIJMWYKKwkuYXNjaXogICI8Nz5WRlA6IFxzdHJcbiIKKwkuYmFsaWduIDQKKzE6CWxkbWZkCXNwISwge3IwLXIzLCBpcCwgbHJ9CisjZW5kaWYKKwkuZW5kbQorCisKK0AgVkZQIGhhcmR3YXJlIHN1cHBvcnQgZW50cnkgcG9pbnQuCitACitAICByMCAgPSBmYXVsdGVkIGluc3RydWN0aW9uCitAICByMiAgPSBmYXVsdGVkIFBDKzQKK0AgIHI5ICA9IHN1Y2Nlc3NmdWwgcmV0dXJuCitAICByMTAgPSB2ZnBfc3RhdGUgdW5pb24KK0AgIGxyICA9IGZhaWx1cmUgcmV0dXJuCisKKwkuZ2xvYmwJdmZwX3N1cHBvcnRfZW50cnkKK3ZmcF9zdXBwb3J0X2VudHJ5OgorCURCR1NUUjMJImluc3RyICUwOHggcGMgJTA4eCBzdGF0ZSAlcCIsIHIwLCByMiwgcjEwCisKKwlWRlBGTVJYCXIxLCBGUEVYQwkJQCBJcyB0aGUgVkZQIGVuYWJsZWQ/CisJREJHU1RSMQkiZnBleGMgJTA4eCIsIHIxCisJdHN0CXIxLCAjRlBFWENfRU5BQkxFCisJYm5lCWxvb2tfZm9yX1ZGUF9leGNlcHRpb25zCUAgVkZQIGlzIGFscmVhZHkgZW5hYmxlZAorCisJREJHU1RSMSAiZW5hYmxlICV4IiwgcjEwCisJbGRyCXIzLCBsYXN0X1ZGUF9jb250ZXh0X2FkZHJlc3MKKwlvcnIJcjEsIHIxLCAjRlBFWENfRU5BQkxFCUAgdXNlciBGUEVYQyBoYXMgdGhlIGVuYWJsZSBiaXQgc2V0CisJbGRyCXI0LCBbcjNdCQlAIGxhc3RfVkZQX2NvbnRleHQgcG9pbnRlcgorCWJpYwlyNSwgcjEsICNGUEVYQ19FWENFUFRJT04gQCBtYWtlIHN1cmUgZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQKKwljbXAJcjQsIHIxMAorCWJlcQljaGVja19mb3JfZXhjZXB0aW9uCUAgd2UgYXJlIHJldHVybmluZyB0byB0aGUgc2FtZQorCQkJCQlAIHByb2Nlc3MsIHNvIHRoZSByZWdpc3RlcnMgYXJlCisJCQkJCUAgc3RpbGwgdGhlcmUuICBJbiB0aGlzIGNhc2UsIHdlIGRvCisJCQkJCUAgbm90IHdhbnQgdG8gZHJvcCBhIHBlbmRpbmcgZXhjZXB0aW9uLgorCisJVkZQRk1YUglGUEVYQywgcjUJCUAgZW5hYmxlIFZGUCwgZGlzYWJsZSBhbnkgcGVuZGluZworCQkJCQlAIGV4Y2VwdGlvbnMsIHNvIHdlIGNhbiBnZXQgYXQgdGhlCisJCQkJCUAgcmVzdCBvZiBpdAorCisJQCBTYXZlIG91dCB0aGUgY3VycmVudCByZWdpc3RlcnMgdG8gdGhlIG9sZCB0aHJlYWQgc3RhdGUKKworCURCR1NUUjEJInNhdmUgb2xkIHN0YXRlICVwIiwgcjQKKwljbXAJcjQsICMwCisJYmVxCW5vX29sZF9WRlBfcHJvY2VzcworCVZGUEZNUlgJcjUsIEZQU0NSCQlAIGN1cnJlbnQgc3RhdHVzCisJVkZQRk1SWAlyNiwgRlBJTlNUCQlAIEZQSU5TVCAoYWx3YXlzIHRoZXJlLCByZXYwIG9ud2FyZHMpCisJdHN0CXIxLCAjRlBFWENfRlBWMgkJQCBpcyB0aGVyZSBhbiBGUElOU1QyIHRvIHJlYWQ/CisJVkZQRk1SWAlyOCwgRlBJTlNUMiwgTkUJCUAgRlBJTlNUMiBpZiBuZWVkZWQgLSBhdm9pZHMgcmVhZGluZworCQkJCQlAIG5vbmV4aXN0YW50IHJlZyBvbiByZXYwCisJVkZQRlNUTUlBIHI0IAkJCUAgc2F2ZSB0aGUgd29ya2luZyByZWdpc3RlcnMKKwlhZGQJcjQsIHI0LCAjOCoxNis0CisJc3RtaWEJcjQsIHtyMSwgcjUsIHI2LCByOH0JQCBzYXZlIEZQRVhDLCBGUFNDUiwgRlBJTlNULCBGUElOU1QyCisJCQkJCUAgYW5kIHBvaW50IHI0IGF0IHRoZSB3b3JkIGF0IHRoZQorCQkJCQlAIHN0YXJ0IG9mIHRoZSByZWdpc3RlciBkdW1wCisKK25vX29sZF9WRlBfcHJvY2VzczoKKwlEQkdTVFIxCSJsb2FkIHN0YXRlICVwIiwgcjEwCisJc3RyCXIxMCwgW3IzXQkJQCB1cGRhdGUgdGhlIGxhc3RfVkZQX2NvbnRleHQgcG9pbnRlcgorCQkJCQlAIExvYWQgdGhlIHNhdmVkIHN0YXRlIGJhY2sgaW50byB0aGUgVkZQCisJYWRkCXI0LCByMTAsICM4KjE2KzQKKwlsZG1pYQlyNCwge3IxLCByNSwgcjYsIHI4fQlAIGxvYWQgRlBFWEMsIEZQU0NSLCBGUElOU1QsIEZQSU5TVDIKKwlWRlBGTERNSUEgcjEwCSAJCUAgcmVsb2FkIHRoZSB3b3JraW5nIHJlZ2lzdGVycyB3aGlsZQorCQkJCQlAIEZQRVhDIGlzIGluIGEgc2FmZSBzdGF0ZQorCXRzdAlyMSwgI0ZQRVhDX0ZQVjIJCUAgaXMgdGhlcmUgYW4gRlBJTlNUMiB0byB3cml0ZT8KKwlWRlBGTVhSCUZQSU5TVDIsIHI4LCBORQkJQCBGUElOU1QyIGlmIG5lZWRlZCAtIGF2b2lkcyB3cml0aW5nCisJCQkJCUAgbm9uZXhpc3RhbnQgcmVnIG9uIHJldjAKKwlWRlBGTVhSCUZQSU5TVCwgcjYKKwlWRlBGTVhSCUZQU0NSLCByNQkJQCByZXN0b3JlIHN0YXR1cworCitjaGVja19mb3JfZXhjZXB0aW9uOgorCXRzdAlyMSwgI0ZQRVhDX0VYQ0VQVElPTgorCWJuZQlwcm9jZXNzX2V4Y2VwdGlvbglAIG1pZ2h0IGFzIHdlbGwgaGFuZGxlIHRoZSBwZW5kaW5nCisJCQkJCUAgZXhjZXB0aW9uIGJlZm9yZSByZXRyeWluZyBicmFuY2gKKwkJCQkJQCBvdXQgYmVmb3JlIHNldHRpbmcgYW4gRlBFWEMgdGhhdAorCQkJCQlAIHN0b3BzIHVzIHJlYWRpbmcgc3R1ZmYKKwlWRlBGTVhSCUZQRVhDLCByMQkJQCByZXN0b3JlIEZQRVhDIGxhc3QKKwlzdWIJcjIsIHIyLCAjNAorCXN0cglyMiwgW3NwLCAjU19QQ10JCUAgcmV0cnkgdGhlIGluc3RydWN0aW9uCisJbW92CXBjLCByOQkJCUAgd2UgdGhpbmsgd2UgaGF2ZSBoYW5kbGVkIHRoaW5ncworCisKK2xvb2tfZm9yX1ZGUF9leGNlcHRpb25zOgorCXRzdAlyMSwgI0ZQRVhDX0VYQ0VQVElPTgorCWJuZQlwcm9jZXNzX2V4Y2VwdGlvbgorCVZGUEZNUlgJcjUsIEZQU0NSCisJdHN0CXI1LCAjRlBTQ1JfSVhFCQlAIElYRSBkb2Vzbid0IHNldCBGUEVYQ19FWENFUFRJT04gIQorCWJuZQlwcm9jZXNzX2V4Y2VwdGlvbgorCisJQCBGYWxsIGludG8gaGFuZCBvbiB0byBuZXh0IGhhbmRsZXIgLSBhcHByb3ByaWF0ZSBjb3Byb2MgaW5zdHIKKwlAIG5vdCByZWNvZ25pc2VkIGJ5IFZGUAorCisJREJHU1RSCSJub3QgVkZQIgorCW1vdglwYywgbHIKKworcHJvY2Vzc19leGNlcHRpb246CisJREJHU1RSCSJib3VuY2UiCisJc3ViCXIyLCByMiwgIzQKKwlzdHIJcjIsIFtzcCwgI1NfUENdCQlAIHJldHJ5IHRoZSBpbnN0cnVjdGlvbiBvbiBleGl0IGZyb20KKwkJCQkJQCB0aGUgaW1wcmVjaXNlIGV4Y2VwdGlvbiBoYW5kbGluZyBpbgorCQkJCQlAIHRoZSBzdXBwb3J0IGNvZGUKKwltb3YJcjIsIHNwCQkJQCBub3RoaW5nIHN0YWNrZWQgLSByZWdkdW1wIGlzIGF0IFRPUworCW1vdglsciwgcjkJCQlAIHNldHVwIGZvciBhIHJldHVybiB0byB0aGUgdXNlciBjb2RlLgorCisJQCBOb3cgY2FsbCB0aGUgQyBjb2RlIHRvIHBhY2thZ2UgdXAgdGhlIGJvdW5jZSB0byB0aGUgc3VwcG9ydCBjb2RlCisJQCAgIHIwIGhvbGRzIHRoZSB0cmlnZ2VyIGluc3RydWN0aW9uCisJQCAgIHIxIGhvbGRzIHRoZSBGUEVYQyB2YWx1ZQorCUAgICByMiBwb2ludGVyIHRvIHJlZ2lzdGVyIGR1bXAKKwliCVZGUDlfYm91bmNlCQlAIHdlIGhhdmUgaGFuZGxlZCB0aGlzIC0gdGhlIHN1cHBvcnQKKwkJCQkJQCBjb2RlIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGlmCisJCQkJCUAgcmVxdWlyZWQuIElmIG5vdCwgdGhlIHVzZXIgY29kZSB3aWxsCisJCQkJCUAgcmV0cnkgdGhlIGZhdWx0ZWQgaW5zdHJ1Y3Rpb24KKworbGFzdF9WRlBfY29udGV4dF9hZGRyZXNzOgorCS53b3JkCWxhc3RfVkZQX2NvbnRleHQKKworCS5nbG9ibAl2ZnBfZ2V0X2Zsb2F0Cit2ZnBfZ2V0X2Zsb2F0OgorCWFkZAlwYywgcGMsIHIwLCBsc2wgIzMKKwltb3YJcjAsIHIwCisJLmlycAlkciwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CisJbXJjCXAxMCwgMCwgcjAsIGNcZHIsIGMwLCAwCUAgZm1ycwlyMCwgczAKKwltb3YJcGMsIGxyCisJbXJjCXAxMCwgMCwgcjAsIGNcZHIsIGMwLCA0CUAgZm1ycwlyMCwgczEKKwltb3YJcGMsIGxyCisJLmVuZHIKKworCS5nbG9ibAl2ZnBfcHV0X2Zsb2F0Cit2ZnBfcHV0X2Zsb2F0OgorCWFkZAlwYywgcGMsIHIwLCBsc2wgIzMKKwltb3YJcjAsIHIwCisJLmlycAlkciwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CisJbWNyCXAxMCwgMCwgcjEsIGNcZHIsIGMwLCAwCUAgZm1zcglyMCwgczAKKwltb3YJcGMsIGxyCisJbWNyCXAxMCwgMCwgcjEsIGNcZHIsIGMwLCA0CUAgZm1zcglyMCwgczEKKwltb3YJcGMsIGxyCisJLmVuZHIKKworCS5nbG9ibAl2ZnBfZ2V0X2RvdWJsZQordmZwX2dldF9kb3VibGU6CisJbW92CXIwLCByMCwgbHNyICMxCisJYWRkCXBjLCBwYywgcjAsIGxzbCAjMworCW1vdglyMCwgcjAKKwkuaXJwCWRyLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUKKwltcnJjCXAxMCwgMSwgcjAsIHIxLCBjXGRyCUAgZm1ycmQJcjAsIHIxLCBkXGRyCisJbW92CXBjLCBscgorCS5lbmRyCisKKwlAIHZpcnR1YWwgcmVnaXN0ZXIgMTYgZm9yIGNvbXBhcmUgd2l0aCB6ZXJvCisJbW92CXIwLCAjMAorCW1vdglyMSwgIzAKKwltb3YJcGMsIGxyCisKKwkuZ2xvYmwJdmZwX3B1dF9kb3VibGUKK3ZmcF9wdXRfZG91YmxlOgorCW1vdglyMCwgcjAsIGxzciAjMQorCWFkZAlwYywgcGMsIHIwLCBsc2wgIzMKKwltb3YJcjAsIHIwCisJLmlycAlkciwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CisJbWNycglwMTAsIDEsIHIxLCByMiwgY1xkcglAIGZtcnJkCXIxLCByMiwgZFxkcgorCW1vdglwYywgbHIKKwkuZW5kcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcGluc3RyLmggYi9hcmNoL2FybS92ZnAvdmZwaW5zdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgxOWFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGluc3RyLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS92ZnAvdmZwaW5zdHIuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQuCisgKiAgV3JpdHRlbiBieSBEZWVwIEJsdWUgU29sdXRpb25zIExpbWl0ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBWRlAgaW5zdHJ1Y3Rpb24gbWFza3MuCisgKi8KKyNkZWZpbmUgSU5TVF9DUFJURE8oaW5zdCkJKCgoaW5zdCkgJiAweDBmMDAwMDAwKSA9PSAweDBlMDAwMDAwKQorI2RlZmluZSBJTlNUX0NQUlQoaW5zdCkJCSgoaW5zdCkgJiAoMSA8PCA0KSkKKyNkZWZpbmUgSU5TVF9DUFJUX0woaW5zdCkJKChpbnN0KSAmICgxIDw8IDIwKSkKKyNkZWZpbmUgSU5TVF9DUFJUX1JkKGluc3QpCSgoKGluc3QpICYgKDE1IDw8IDEyKSkgPj4gMTIpCisjZGVmaW5lIElOU1RfQ1BSVF9PUChpbnN0KQkoKChpbnN0KSA+PiAyMSkgJiA3KQorI2RlZmluZSBJTlNUX0NQTlVNKGluc3QpCSgoaW5zdCkgJiAweGYwMCkKKyNkZWZpbmUgQ1BOVU0oY3ApCQkoKGNwKSA8PCA4KQorCisjZGVmaW5lIEZPUF9NQVNLCSgweDAwYjAwMDQwKQorI2RlZmluZSBGT1BfRk1BQwkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRk9QX0ZOTUFDCSgweDAwMDAwMDQwKQorI2RlZmluZSBGT1BfRk1TQwkoMHgwMDEwMDAwMCkKKyNkZWZpbmUgRk9QX0ZOTVNDCSgweDAwMTAwMDQwKQorI2RlZmluZSBGT1BfRk1VTAkoMHgwMDIwMDAwMCkKKyNkZWZpbmUgRk9QX0ZOTVVMCSgweDAwMjAwMDQwKQorI2RlZmluZSBGT1BfRkFERAkoMHgwMDMwMDAwMCkKKyNkZWZpbmUgRk9QX0ZTVUIJKDB4MDAzMDAwNDApCisjZGVmaW5lIEZPUF9GRElWCSgweDAwODAwMDAwKQorI2RlZmluZSBGT1BfRVhUCQkoMHgwMGIwMDA0MCkKKworI2RlZmluZSBGT1BfVE9fSURYKGluc3QpCSgoaW5zdCAmIDB4MDBiMDAwMDApID4+IDIwIHwgKGluc3QgJiAoMSA8PCA2KSkgPj4gNCkKKworI2RlZmluZSBGRVhUX01BU0sJKDB4MDAwZjAwODApCisjZGVmaW5lIEZFWFRfRkNQWQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkVYVF9GQUJTCSgweDAwMDAwMDgwKQorI2RlZmluZSBGRVhUX0ZORUcJKDB4MDAwMTAwMDApCisjZGVmaW5lIEZFWFRfRlNRUlQJKDB4MDAwMTAwODApCisjZGVmaW5lIEZFWFRfRkNNUAkoMHgwMDA0MDAwMCkKKyNkZWZpbmUgRkVYVF9GQ01QRQkoMHgwMDA0MDA4MCkKKyNkZWZpbmUgRkVYVF9GQ01QWgkoMHgwMDA1MDAwMCkKKyNkZWZpbmUgRkVYVF9GQ01QRVoJKDB4MDAwNTAwODApCisjZGVmaW5lIEZFWFRfRkNWVAkoMHgwMDA3MDA4MCkKKyNkZWZpbmUgRkVYVF9GVUlUTwkoMHgwMDA4MDAwMCkKKyNkZWZpbmUgRkVYVF9GU0lUTwkoMHgwMDA4MDA4MCkKKyNkZWZpbmUgRkVYVF9GVE9VSQkoMHgwMDBjMDAwMCkKKyNkZWZpbmUgRkVYVF9GVE9VSVoJKDB4MDAwYzAwODApCisjZGVmaW5lIEZFWFRfRlRPU0kJKDB4MDAwZDAwMDApCisjZGVmaW5lIEZFWFRfRlRPU0laCSgweDAwMGQwMDgwKQorCisjZGVmaW5lIEZFWFRfVE9fSURYKGluc3QpCSgoaW5zdCAmIDB4MDAwZjAwMDApID4+IDE1IHwgKGluc3QgJiAoMSA8PCA3KSkgPj4gNykKKworI2RlZmluZSB2ZnBfZ2V0X3NkKGluc3QpCSgoaW5zdCAmIDB4MDAwMGYwMDApID4+IDExIHwgKGluc3QgJiAoMSA8PCAyMikpID4+IDIyKQorI2RlZmluZSB2ZnBfZ2V0X2RkKGluc3QpCSgoaW5zdCAmIDB4MDAwMGYwMDApID4+IDEyKQorI2RlZmluZSB2ZnBfZ2V0X3NtKGluc3QpCSgoaW5zdCAmIDB4MDAwMDAwMGYpIDw8IDEgfCAoaW5zdCAmICgxIDw8IDUpKSA+PiA1KQorI2RlZmluZSB2ZnBfZ2V0X2RtKGluc3QpCSgoaW5zdCAmIDB4MDAwMDAwMGYpKQorI2RlZmluZSB2ZnBfZ2V0X3NuKGluc3QpCSgoaW5zdCAmIDB4MDAwZjAwMDApID4+IDE1IHwgKGluc3QgJiAoMSA8PCA3KSkgPj4gNykKKyNkZWZpbmUgdmZwX2dldF9kbihpbnN0KQkoKGluc3QgJiAweDAwMGYwMDAwKSA+PiAxNikKKworI2RlZmluZSB2ZnBfc2luZ2xlKGluc3QpCSgoKGluc3QpICYgMHgwMDAwZjAwKSA9PSAweGEwMCkKKworI2RlZmluZSBGUFNDUl9OCSgxIDw8IDMxKQorI2RlZmluZSBGUFNDUl9aCSgxIDw8IDMwKQorI2RlZmluZSBGUFNDUl9DICgxIDw8IDI5KQorI2RlZmluZSBGUFNDUl9WCSgxIDw8IDI4KQorCisvKgorICogU2luY2Ugd2UgYXJlbid0IGJ1aWxkaW5nIHdpdGggLW1mcHU9dmZwLCB3ZSBuZWVkIHRvIGNvZGUKKyAqIHRoZXNlIGluc3RydWN0aW9ucyB1c2luZyB0aGVpciBNUkMvTUNSIGVxdWl2YWxlbnRzLgorICovCisjZGVmaW5lIHZmcHJlZyhfdmZwXykgI192ZnBfCisKKyNkZWZpbmUgZm1yeChfdmZwXykgKHsJCQlcCisJdTMyIF9fdjsJCQlcCisJYXNtKCJtcmMlPyBwMTAsIDcsICUwLCAiIHZmcHJlZyhfdmZwXykgIiwgY3IwLCAwIEAgZm1yeAklMCwgIiAjX3ZmcF8JXAorCSAgICA6ICI9ciIgKF9fdikpOwkJXAorCV9fdjsJCQkJXAorIH0pCisKKyNkZWZpbmUgZm14cihfdmZwXyxfdmFyXykJCVwKKwlhc20oIm1jciU/IHAxMCwgNywgJTAsICIgdmZwcmVnKF92ZnBfKSAiLCBjcjAsIDAgQCBmbXhyCSIgI192ZnBfICIsICUwIglcCisJICAgOiA6ICJyIiAoX3Zhcl8pKQorCit1MzIgdmZwX3NpbmdsZV9jcGRvKHUzMiBpbnN0LCB1MzIgZnBzY3IpOwordTMyIHZmcF9zaW5nbGVfY3BydCh1MzIgaW5zdCwgdTMyIGZwc2NyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3UzMiB2ZnBfZG91YmxlX2NwZG8odTMyIGluc3QsIHUzMiBmcHNjcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMgYi9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlZWRkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkLgorICogIFdyaXR0ZW4gYnkgRGVlcCBCbHVlIFNvbHV0aW9ucyBMaW1pdGVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS92ZnAuaD4KKworI2luY2x1ZGUgInZmcGluc3RyLmgiCisjaW5jbHVkZSAidmZwLmgiCisKKy8qCisgKiBPdXIgdW5kZWYgaGFuZGxlcnMgKGluIGVudHJ5LlMpCisgKi8KK3ZvaWQgdmZwX3Rlc3RpbmdfZW50cnkodm9pZCk7Cit2b2lkIHZmcF9zdXBwb3J0X2VudHJ5KHZvaWQpOworCit2b2lkICgqdmZwX3ZlY3Rvcikodm9pZCkgPSB2ZnBfdGVzdGluZ19lbnRyeTsKK3VuaW9uIHZmcF9zdGF0ZSAqbGFzdF9WRlBfY29udGV4dDsKKworLyoKKyAqIER1YWwtdXNlIHZhcmlhYmxlLgorICogVXNlZCBpbiBzdGFydHVwOiBzZXQgdG8gbm9uLXplcm8gaWYgVkZQIGNoZWNrcyBmYWlsCisgKiBBZnRlciBzdGFydHVwLCBob2xkcyBWRlAgYXJjaGl0ZWN0dXJlCisgKi8KK3Vuc2lnbmVkIGludCBWRlBfYXJjaDsKKworLyoKKyAqIFBlci10aHJlYWQgVkZQIGluaXRpYWxpc2F0aW9uLgorICovCit2b2lkIHZmcF9mbHVzaF90aHJlYWQodW5pb24gdmZwX3N0YXRlICp2ZnApCit7CisJbWVtc2V0KHZmcCwgMCwgc2l6ZW9mKHVuaW9uIHZmcF9zdGF0ZSkpOworCisJdmZwLT5oYXJkLmZwZXhjID0gRlBFWENfRU5BQkxFOworCXZmcC0+aGFyZC5mcHNjciA9IEZQU0NSX1JPVU5EX05FQVJFU1Q7CisKKwkvKgorCSAqIERpc2FibGUgVkZQIHRvIGVuc3VyZSB3ZSBpbml0aWFsaXNlIGl0IGZpcnN0LgorCSAqLworCWZteHIoRlBFWEMsIGZtcngoRlBFWEMpICYgfkZQRVhDX0VOQUJMRSk7CisKKwkvKgorCSAqIEVuc3VyZSB3ZSBkb24ndCB0cnkgdG8gb3ZlcndyaXRlIG91ciBuZXdseSBpbml0aWFsaXNlZAorCSAqIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaXJzdCBmYXVsdC4KKwkgKi8KKwlpZiAobGFzdF9WRlBfY29udGV4dCA9PSB2ZnApCisJCWxhc3RfVkZQX2NvbnRleHQgPSBOVUxMOworfQorCisvKgorICogUGVyLXRocmVhZCBWRlAgY2xlYW51cC4KKyAqLwordm9pZCB2ZnBfcmVsZWFzZV90aHJlYWQodW5pb24gdmZwX3N0YXRlICp2ZnApCit7CisJaWYgKGxhc3RfVkZQX2NvbnRleHQgPT0gdmZwKQorCQlsYXN0X1ZGUF9jb250ZXh0ID0gTlVMTDsKK30KKworLyoKKyAqIFJhaXNlIGEgU0lHRlBFIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLgorICogc2ljb2RlIGRlc2NyaWJlcyB0aGUgc2lnbmFsIGJlaW5nIHJhaXNlZC4KKyAqLwordm9pZCB2ZnBfcmFpc2Vfc2lnZnBlKHVuc2lnbmVkIGludCBzaWNvZGUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNpZ2luZm9fdCBpbmZvOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCisJaW5mby5zaV9zaWdubyA9IFNJR0ZQRTsKKwlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgKikoaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAtIDQpOworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIE5XRlBFLCBiZWNhdXNlIGl0J3Mgbm90IGNsZWFyIHdoYXQKKwkgKiB0aGlzIGlzIHVzZWQgZm9yCisJICovCisJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gNjsKKworCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIGN1cnJlbnQpOworfQorCitzdGF0aWMgdm9pZCB2ZnBfcGFuaWMoY2hhciAqcmVhc29uKQoreworCWludCBpOworCisJcHJpbnRrKEtFUk5fRVJSICJWRlA6IEVycm9yOiAlc1xuIiwgcmVhc29uKTsKKwlwcmludGsoS0VSTl9FUlIgIlZGUDogRVhDIDB4JTA4eCBTQ1IgMHglMDh4IElOU1QgMHglMDh4XG4iLAorCQlmbXJ4KEZQRVhDKSwgZm1yeChGUFNDUiksIGZtcngoRlBJTlNUKSk7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IDIpCisJCXByaW50ayhLRVJOX0VSUiAiVkZQOiBzJTJ1OiAweCUwOHggcyUydTogMHglMDh4XG4iLAorCQkgICAgICAgaSwgdmZwX2dldF9mbG9hdChpKSwgaSsxLCB2ZnBfZ2V0X2Zsb2F0KGkrMSkpOworfQorCisvKgorICogUHJvY2VzcyBiaXRtYXNrIG9mIGV4Y2VwdGlvbiBjb25kaXRpb25zLgorICovCitzdGF0aWMgdm9pZCB2ZnBfcmFpc2VfZXhjZXB0aW9ucyh1MzIgZXhjZXB0aW9ucywgdTMyIGluc3QsIHUzMiBmcHNjciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHNpX2NvZGUgPSAwOworCisJcHJfZGVidWcoIlZGUDogcmFpc2luZyBleGNlcHRpb25zICUwOHhcbiIsIGV4Y2VwdGlvbnMpOworCisJaWYgKGV4Y2VwdGlvbnMgPT0gKHUzMiktMSkgeworCQl2ZnBfcGFuaWMoInVuaGFuZGxlZCBib3VuY2UiKTsKKwkJdmZwX3JhaXNlX3NpZ2ZwZSgwLCByZWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgYW55IG9mIHRoZSBzdGF0dXMgZmxhZ3MgYXJlIHNldCwgdXBkYXRlIHRoZSBGUFNDUi4KKwkgKiBDb21wYXJpc29uIGluc3RydWN0aW9ucyBhbHdheXMgcmV0dXJuIGF0IGxlYXN0IG9uZSBvZgorCSAqIHRoZXNlIGZsYWdzIHNldC4KKwkgKi8KKwlpZiAoZXhjZXB0aW9ucyAmIChGUFNDUl9OfEZQU0NSX1p8RlBTQ1JfQ3xGUFNDUl9WKSkKKwkJZnBzY3IgJj0gfihGUFNDUl9OfEZQU0NSX1p8RlBTQ1JfQ3xGUFNDUl9WKTsKKworCWZwc2NyIHw9IGV4Y2VwdGlvbnM7CisKKwlmbXhyKEZQU0NSLCBmcHNjcik7CisKKyNkZWZpbmUgUkFJU0Uoc3RhdCxlbixzaWcpCQkJCVwKKwlpZiAoZXhjZXB0aW9ucyAmIHN0YXQgJiYgZnBzY3IgJiBlbikJCVwKKwkJc2lfY29kZSA9IHNpZzsKKworCS8qCisJICogVGhlc2UgYXJlIGFycmFuZ2VkIGluIHByaW9yaXR5IG9yZGVyLCBsZWFzdCB0byBoaWdoZXN0LgorCSAqLworCVJBSVNFKEZQU0NSX0lYQywgRlBTQ1JfSVhFLCBGUEVfRkxUUkVTKTsKKwlSQUlTRShGUFNDUl9VRkMsIEZQU0NSX1VGRSwgRlBFX0ZMVFVORCk7CisJUkFJU0UoRlBTQ1JfT0ZDLCBGUFNDUl9PRkUsIEZQRV9GTFRPVkYpOworCVJBSVNFKEZQU0NSX0lPQywgRlBTQ1JfSU9FLCBGUEVfRkxUSU5WKTsKKworCWlmIChzaV9jb2RlKQorCQl2ZnBfcmFpc2Vfc2lnZnBlKHNpX2NvZGUsIHJlZ3MpOworfQorCisvKgorICogRW11bGF0ZSBhIFZGUCBpbnN0cnVjdGlvbi4KKyAqLworc3RhdGljIHUzMiB2ZnBfZW11bGF0ZV9pbnN0cnVjdGlvbih1MzIgaW5zdCwgdTMyIGZwc2NyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgZXhjZXB0aW9ucyA9ICh1MzIpLTE7CisKKwlwcl9kZWJ1ZygiVkZQOiBlbXVsYXRlOiBJTlNUPTB4JTA4eCBTQ1I9MHglMDh4XG4iLCBpbnN0LCBmcHNjcik7CisKKwlpZiAoSU5TVF9DUFJURE8oaW5zdCkpIHsKKwkJaWYgKCFJTlNUX0NQUlQoaW5zdCkpIHsKKwkJCS8qCisJCQkgKiBDUERPCisJCQkgKi8KKwkJCWlmICh2ZnBfc2luZ2xlKGluc3QpKSB7CisJCQkJZXhjZXB0aW9ucyA9IHZmcF9zaW5nbGVfY3BkbyhpbnN0LCBmcHNjcik7CisJCQl9IGVsc2UgeworCQkJCWV4Y2VwdGlvbnMgPSB2ZnBfZG91YmxlX2NwZG8oaW5zdCwgZnBzY3IpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEEgQ1BSVCBpbnN0cnVjdGlvbiBjYW4gbm90IGFwcGVhciBpbiBGUElOU1QyLCBub3IKKwkJCSAqIGNhbiBpdCBjYXVzZSBhbiBleGNlcHRpb24uICBUaGVyZWZvcmUsIHdlIGRvIG5vdAorCQkJICogaGF2ZSB0byBlbXVsYXRlIGl0LgorCQkJICovCisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBBIENQRFQgaW5zdHJ1Y3Rpb24gY2FuIG5vdCBhcHBlYXIgaW4gRlBJTlNUMiwgbm9yIGNhbgorCQkgKiBpdCBjYXVzZSBhbiBleGNlcHRpb24uICBUaGVyZWZvcmUsIHdlIGRvIG5vdCBoYXZlIHRvCisJCSAqIGVtdWxhdGUgaXQuCisJCSAqLworCX0KKwlyZXR1cm4gZXhjZXB0aW9uczsKK30KKworLyoKKyAqIFBhY2thZ2UgdXAgYSBib3VuY2UgY29uZGl0aW9uLgorICovCit2b2lkIFZGUDlfYm91bmNlKHUzMiB0cmlnZ2VyLCB1MzIgZnBleGMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBmcHNjciwgb3JpZ19mcHNjciwgZXhjZXB0aW9ucywgaW5zdDsKKworCXByX2RlYnVnKCJWRlA6IGJvdW5jZTogdHJpZ2dlciAlMDh4IGZwZXhjICUwOHhcbiIsIHRyaWdnZXIsIGZwZXhjKTsKKworCS8qCisJICogRW5hYmxlIGFjY2VzcyB0byB0aGUgVkZQIHNvIHdlIGNhbiBoYW5kbGUgdGhlIGJvdW5jZS4KKwkgKi8KKwlmbXhyKEZQRVhDLCBmcGV4YyAmIH4oRlBFWENfRVhDRVBUSU9OfEZQRVhDX0lOVnxGUEVYQ19VRkN8RlBFWENfSU9DKSk7CisKKwlvcmlnX2Zwc2NyID0gZnBzY3IgPSBmbXJ4KEZQU0NSKTsKKworCS8qCisJICogSWYgd2UgYXJlIHJ1bm5pbmcgd2l0aCBpbmV4YWN0IGV4Y2VwdGlvbnMgZW5hYmxlZCwgd2UgbmVlZCB0bworCSAqIGVtdWxhdGUgdGhlIHRyaWdnZXIgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgYXMgd2UncmUgZW11bGF0aW5nCisJICogdGhlIHRyaWdnZXIgaW5zdHJ1Y3Rpb24sIHdlIG5lZWQgdG8gaW5jcmVtZW50IFBDLgorCSAqLworCWlmIChmcHNjciAmIEZQU0NSX0lYRSkgeworCQlyZWdzLT5BUk1fcGMgKz0gNDsKKwkJZ290byBlbXVsYXRlOworCX0KKworCWJhcnJpZXIoKTsKKworCS8qCisJICogTW9kaWZ5IGZwc2NyIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyByZW1haW5pbmcKKwkgKi8KKwlpZiAoZnBleGMgJiBGUEVYQ19FWENFUFRJT04pIHsKKwkJdTMyIGxlbjsKKworCQlsZW4gPSBmcGV4YyArICgxIDw8IEZQRVhDX0xFTkdUSF9CSVQpOworCisJCWZwc2NyICY9IH5GUFNDUl9MRU5HVEhfTUFTSzsKKwkJZnBzY3IgfD0gKGxlbiAmIEZQRVhDX0xFTkdUSF9NQVNLKSA8PCAoRlBTQ1JfTEVOR1RIX0JJVCAtIEZQRVhDX0xFTkdUSF9CSVQpOworCX0KKworCS8qCisJICogSGFuZGxlIHRoZSBmaXJzdCBGUCBpbnN0cnVjdGlvbi4gIFdlIHVzZWQgdG8gdGFrZSBub3RlIG9mIHRoZQorCSAqIEZQRVhDIGJvdW5jZSByZWFzb24sIGJ1dCB0aGlzIGFwcGVhcnMgdG8gYmUgdW5yZWxpYWJsZS4KKwkgKiBFbXVsYXRlIHRoZSBib3VuY2VkIGluc3RydWN0aW9uIGluc3RlYWQuCisJICovCisJaW5zdCA9IGZtcngoRlBJTlNUKTsKKwlleGNlcHRpb25zID0gdmZwX2VtdWxhdGVfaW5zdHJ1Y3Rpb24oaW5zdCwgZnBzY3IsIHJlZ3MpOworCWlmIChleGNlcHRpb25zKQorCQl2ZnBfcmFpc2VfZXhjZXB0aW9ucyhleGNlcHRpb25zLCBpbnN0LCBvcmlnX2Zwc2NyLCByZWdzKTsKKworCS8qCisJICogSWYgdGhlcmUgaXNuJ3QgYSBzZWNvbmQgRlAgaW5zdHJ1Y3Rpb24sIGV4aXQgbm93LgorCSAqLworCWlmICghKGZwZXhjICYgRlBFWENfRlBWMikpCisJCXJldHVybjsKKworCS8qCisJICogVGhlIGJhcnJpZXIoKSBoZXJlIHByZXZlbnRzIGZwaW5zdDIgYmVpbmcgcmVhZAorCSAqIGJlZm9yZSB0aGUgY29uZGl0aW9uIGFib3ZlLgorCSAqLworCWJhcnJpZXIoKTsKKwl0cmlnZ2VyID0gZm1yeChGUElOU1QyKTsKKwlmcHNjciA9IGZtcngoRlBTQ1IpOworCisgZW11bGF0ZToKKwlleGNlcHRpb25zID0gdmZwX2VtdWxhdGVfaW5zdHJ1Y3Rpb24odHJpZ2dlciwgZnBzY3IsIHJlZ3MpOworCWlmIChleGNlcHRpb25zKQorCQl2ZnBfcmFpc2VfZXhjZXB0aW9ucyhleGNlcHRpb25zLCB0cmlnZ2VyLCBvcmlnX2Zwc2NyLCByZWdzKTsKK30KKyAKKy8qCisgKiBWRlAgc3VwcG9ydCBjb2RlIGluaXRpYWxpc2F0aW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCB2ZnBfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2ZnBzaWQ7CisKKwkvKgorCSAqIEZpcnN0IGNoZWNrIHRoYXQgdGhlcmUgaXMgYSBWRlAgdGhhdCB3ZSBjYW4gdXNlLgorCSAqIFRoZSBoYW5kbGVyIGlzIGFscmVhZHkgc2V0dXAgdG8ganVzdCBsb2cgY2FsbHMsIHNvCisJICogd2UganVzdCBuZWVkIHRvIHJlYWQgdGhlIFZGUFNJRCByZWdpc3Rlci4KKwkgKi8KKwl2ZnBzaWQgPSBmbXJ4KEZQU0lEKTsKKworCXByaW50ayhLRVJOX0lORk8gIlZGUCBzdXBwb3J0IHYwLjM6ICIpOworCWlmIChWRlBfYXJjaCkgeworCQlwcmludGsoIm5vdCBwcmVzZW50XG4iKTsKKwl9IGVsc2UgaWYgKHZmcHNpZCAmIEZQU0lEX05PRE9VQkxFKSB7CisJCXByaW50aygibm8gZG91YmxlIHByZWNpc2lvbiBzdXBwb3J0XG4iKTsKKwl9IGVsc2UgeworCQlWRlBfYXJjaCA9ICh2ZnBzaWQgJiBGUFNJRF9BUkNIX01BU0spID4+IEZQU0lEX0FSQ0hfQklUOyAgLyogRXh0cmFjdCB0aGUgYXJjaGl0ZWN0dXJlIHZlcnNpb24gKi8KKwkJcHJpbnRrKCJpbXBsZW1lbnRvciAlMDJ4IGFyY2hpdGVjdHVyZSAlZCBwYXJ0ICUwMnggdmFyaWFudCAleCByZXYgJXhcbiIsCisJCQkodmZwc2lkICYgRlBTSURfSU1QTEVNRU5URVJfTUFTSykgPj4gRlBTSURfSU1QTEVNRU5URVJfQklULAorCQkJKHZmcHNpZCAmIEZQU0lEX0FSQ0hfTUFTSykgPj4gRlBTSURfQVJDSF9CSVQsCisJCQkodmZwc2lkICYgRlBTSURfUEFSVF9NQVNLKSA+PiBGUFNJRF9QQVJUX0JJVCwKKwkJCSh2ZnBzaWQgJiBGUFNJRF9WQVJJQU5UX01BU0spID4+IEZQU0lEX1ZBUklBTlRfQklULAorCQkJKHZmcHNpZCAmIEZQU0lEX1JFVl9NQVNLKSA+PiBGUFNJRF9SRVZfQklUKTsKKwkJdmZwX3ZlY3RvciA9IHZmcF9zdXBwb3J0X2VudHJ5OworCX0KKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbCh2ZnBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS92ZnAvdmZwc2luZ2xlLmMgYi9hcmNoL2FybS92ZnAvdmZwc2luZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0OWZlMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3ZmcC92ZnBzaW5nbGUuYwpAQCAtMCwwICsxLDEyMjQgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vdmZwL3ZmcHNpbmdsZS5jCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgaW4gcGFydCBmcm9tIEpvaG4gUi4gSG91c2VycyBzb2Z0ZmxvYXQgbGlicmFyeSwgd2hpY2gKKyAqIGNhcnJpZXMgdGhlIGZvbGxvd2luZyBub3RpY2U6CisgKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIEMgc291cmNlIGZpbGUgaXMgcGFydCBvZiB0aGUgU29mdEZsb2F0IElFQy9JRUVFIEZsb2F0aW5nLXBvaW50CisgKiBBcml0aG1ldGljIFBhY2thZ2UsIFJlbGVhc2UgMi4KKyAqCisgKiBXcml0dGVuIGJ5IEpvaG4gUi4gSGF1c2VyLiAgVGhpcyB3b3JrIHdhcyBtYWRlIHBvc3NpYmxlIGluIHBhcnQgYnkgdGhlCisgKiBJbnRlcm5hdGlvbmFsIENvbXB1dGVyIFNjaWVuY2UgSW5zdGl0dXRlLCBsb2NhdGVkIGF0IFN1aXRlIDYwMCwgMTk0NyBDZW50ZXIKKyAqIFN0cmVldCwgQmVya2VsZXksIENhbGlmb3JuaWEgOTQ3MDQuICBGdW5kaW5nIHdhcyBwYXJ0aWFsbHkgcHJvdmlkZWQgYnkgdGhlCisgKiBOYXRpb25hbCBTY2llbmNlIEZvdW5kYXRpb24gdW5kZXIgZ3JhbnQgTUlQLTkzMTE5ODAuICBUaGUgb3JpZ2luYWwgdmVyc2lvbgorICogb2YgdGhpcyBjb2RlIHdhcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIGJ1aWxkIGEgZml4ZWQtcG9pbnQgdmVjdG9yCisgKiBwcm9jZXNzb3IgaW4gY29sbGFib3JhdGlvbiB3aXRoIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXksCisgKiBvdmVyc2VlbiBieSBQcm9mcy4gTmVsc29uIE1vcmdhbiBhbmQgSm9obiBXYXdyenluZWsuICBNb3JlIGluZm9ybWF0aW9uCisgKiBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd2ViIHBhZ2UgYGh0dHA6Ly9IVFRQLkNTLkJlcmtlbGV5LkVEVS9+amhhdXNlci8KKyAqIGFyaXRobWV0aWMvc29mdGZsb2F0Lmh0bWwnLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgRElTVFJJQlVURUQgQVMgSVMsIEZPUiBGUkVFLiAgQWx0aG91Z2ggcmVhc29uYWJsZSBlZmZvcnQKKyAqIGhhcyBiZWVuIG1hZGUgdG8gYXZvaWQgaXQsIFRISVMgU09GVFdBUkUgTUFZIENPTlRBSU4gRkFVTFRTIFRIQVQgV0lMTCBBVAorICogVElNRVMgUkVTVUxUIElOIElOQ09SUkVDVCBCRUhBVklPUi4gIFVTRSBPRiBUSElTIFNPRlRXQVJFIElTIFJFU1RSSUNURUQgVE8KKyAqIFBFUlNPTlMgQU5EIE9SR0FOSVpBVElPTlMgV0hPIENBTiBBTkQgV0lMTCBUQUtFIEZVTEwgUkVTUE9OU0lCSUxJVFkgRk9SIEFOWQorICogQU5EIEFMTCBMT1NTRVMsIENPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBBUklTSU5HIEZST00gSVRTIFVTRS4KKyAqCisgKiBEZXJpdmF0aXZlIHdvcmtzIGFyZSBhY2NlcHRhYmxlLCBldmVuIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLCBzbyBsb25nIGFzCisgKiAoMSkgdGhleSBpbmNsdWRlIHByb21pbmVudCBub3RpY2UgdGhhdCB0aGUgd29yayBpcyBkZXJpdmF0aXZlLCBhbmQgKDIpIHRoZXkKKyAqIGluY2x1ZGUgcHJvbWluZW50IG5vdGljZSBha2luIHRvIHRoZXNlIHRocmVlIHBhcmFncmFwaHMgZm9yIHRob3NlIHBhcnRzIG9mCisgKiB0aGlzIGNvZGUgdGhhdCBhcmUgcmV0YWluZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdmZwLmg+CisKKyNpbmNsdWRlICJ2ZnBpbnN0ci5oIgorI2luY2x1ZGUgInZmcC5oIgorCitzdGF0aWMgc3RydWN0IHZmcF9zaW5nbGUgdmZwX3NpbmdsZV9kZWZhdWx0X3FuYW4gPSB7CisJLmV4cG9uZW50CT0gMjU1LAorCS5zaWduCQk9IDAsCisJLnNpZ25pZmljYW5kCT0gVkZQX1NJTkdMRV9TSUdOSUZJQ0FORF9RTkFOLAorfTsKKworc3RhdGljIHZvaWQgdmZwX3NpbmdsZV9kdW1wKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHZmcF9zaW5nbGUgKnMpCit7CisJcHJfZGVidWcoIlZGUDogJXM6IHNpZ249JWQgZXhwb25lbnQ9JWQgc2lnbmlmaWNhbmQ9JTA4eFxuIiwKKwkJIHN0ciwgcy0+c2lnbiAhPSAwLCBzLT5leHBvbmVudCwgcy0+c2lnbmlmaWNhbmQpOworfQorCitzdGF0aWMgdm9pZCB2ZnBfc2luZ2xlX25vcm1hbGlzZV9kZW5vcm1hbChzdHJ1Y3QgdmZwX3NpbmdsZSAqdnMpCit7CisJaW50IGJpdHMgPSAzMSAtIGZscyh2cy0+c2lnbmlmaWNhbmQpOworCisJdmZwX3NpbmdsZV9kdW1wKCJub3JtYWxpc2VfZGVub3JtYWw6IGluIiwgdnMpOworCisJaWYgKGJpdHMpIHsKKwkJdnMtPmV4cG9uZW50IC09IGJpdHMgLSAxOworCQl2cy0+c2lnbmlmaWNhbmQgPDw9IGJpdHM7CisJfQorCisJdmZwX3NpbmdsZV9kdW1wKCJub3JtYWxpc2VfZGVub3JtYWw6IG91dCIsIHZzKTsKK30KKworI2lmbmRlZiBERUJVRworI2RlZmluZSB2ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKHNkLHZzZCxmcHNjcixleGNlcHQsZnVuYykgX192ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKHNkLHZzZCxmcHNjcixleGNlcHQpCit1MzIgX192ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKGludCBzZCwgc3RydWN0IHZmcF9zaW5nbGUgKnZzLCB1MzIgZnBzY3IsIHUzMiBleGNlcHRpb25zKQorI2Vsc2UKK3UzMiB2ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKGludCBzZCwgc3RydWN0IHZmcF9zaW5nbGUgKnZzLCB1MzIgZnBzY3IsIHUzMiBleGNlcHRpb25zLCBjb25zdCBjaGFyICpmdW5jKQorI2VuZGlmCit7CisJdTMyIHNpZ25pZmljYW5kLCBpbmNyLCBybW9kZTsKKwlpbnQgZXhwb25lbnQsIHNoaWZ0LCB1bmRlcmZsb3c7CisKKwl2ZnBfc2luZ2xlX2R1bXAoInBhY2s6IGluIiwgdnMpOworCisJLyoKKwkgKiBJbmZpbml0aWVzIGFuZCBOYU5zIGFyZSBhIHNwZWNpYWwgY2FzZS4KKwkgKi8KKwlpZiAodnMtPmV4cG9uZW50ID09IDI1NSAmJiAodnMtPnNpZ25pZmljYW5kID09IDAgfHwgZXhjZXB0aW9ucykpCisJCWdvdG8gcGFjazsKKworCS8qCisJICogU3BlY2lhbC1jYXNlIHplcm8uCisJICovCisJaWYgKHZzLT5zaWduaWZpY2FuZCA9PSAwKSB7CisJCXZzLT5leHBvbmVudCA9IDA7CisJCWdvdG8gcGFjazsKKwl9CisKKwlleHBvbmVudCA9IHZzLT5leHBvbmVudDsKKwlzaWduaWZpY2FuZCA9IHZzLT5zaWduaWZpY2FuZDsKKworCS8qCisJICogTm9ybWFsaXNlIGZpcnN0LiAgTm90ZSB0aGF0IHdlIHNoaWZ0IHRoZSBzaWduaWZpY2FuZCB1cCB0bworCSAqIGJpdCAzMSwgc28gd2UgaGF2ZSBWRlBfU0lOR0xFX0xPV19CSVRTICsgMSBiZWxvdyB0aGUgbGVhc3QKKwkgKiBzaWduaWZpY2FudCBiaXQuCisJICovCisJc2hpZnQgPSAzMiAtIGZscyhzaWduaWZpY2FuZCk7CisJaWYgKHNoaWZ0IDwgMzIgJiYgc2hpZnQpIHsKKwkJZXhwb25lbnQgLT0gc2hpZnQ7CisJCXNpZ25pZmljYW5kIDw8PSBzaGlmdDsKKwl9CisKKyNpZmRlZiBERUJVRworCXZzLT5leHBvbmVudCA9IGV4cG9uZW50OworCXZzLT5zaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kOworCXZmcF9zaW5nbGVfZHVtcCgicGFjazogbm9ybWFsaXNlZCIsIHZzKTsKKyNlbmRpZgorCisJLyoKKwkgKiBUaW55IG51bWJlcj8KKwkgKi8KKwl1bmRlcmZsb3cgPSBleHBvbmVudCA8IDA7CisJaWYgKHVuZGVyZmxvdykgeworCQlzaWduaWZpY2FuZCA9IHZmcF9zaGlmdHJpZ2h0MzJqYW1taW5nKHNpZ25pZmljYW5kLCAtZXhwb25lbnQpOworCQlleHBvbmVudCA9IDA7CisjaWZkZWYgREVCVUcKKwkJdnMtPmV4cG9uZW50ID0gZXhwb25lbnQ7CisJCXZzLT5zaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kOworCQl2ZnBfc2luZ2xlX2R1bXAoInBhY2s6IHRpbnkgbnVtYmVyIiwgdnMpOworI2VuZGlmCisJCWlmICghKHNpZ25pZmljYW5kICYgKCgxIDw8IChWRlBfU0lOR0xFX0xPV19CSVRTICsgMSkpIC0gMSkpKQorCQkJdW5kZXJmbG93ID0gMDsKKwl9CisKKwkvKgorCSAqIFNlbGVjdCByb3VuZGluZyBpbmNyZW1lbnQuCisJICovCisJaW5jciA9IDA7CisJcm1vZGUgPSBmcHNjciAmIEZQU0NSX1JNT0RFX01BU0s7CisKKwlpZiAocm1vZGUgPT0gRlBTQ1JfUk9VTkRfTkVBUkVTVCkgeworCQlpbmNyID0gMSA8PCBWRlBfU0lOR0xFX0xPV19CSVRTOworCQlpZiAoKHNpZ25pZmljYW5kICYgKDEgPDwgKFZGUF9TSU5HTEVfTE9XX0JJVFMgKyAxKSkpID09IDApCisJCQlpbmNyIC09IDE7CisJfSBlbHNlIGlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9UT1pFUk8pIHsKKwkJaW5jciA9IDA7CisJfSBlbHNlIGlmICgocm1vZGUgPT0gRlBTQ1JfUk9VTkRfUExVU0lORikgXiAodnMtPnNpZ24gIT0gMCkpCisJCWluY3IgPSAoMSA8PCAoVkZQX1NJTkdMRV9MT1dfQklUUyArIDEpKSAtIDE7CisKKwlwcl9kZWJ1ZygiVkZQOiByb3VuZGluZyBpbmNyZW1lbnQgPSAweCUwOHhcbiIsIGluY3IpOworCisJLyoKKwkgKiBJcyBvdXIgcm91bmRpbmcgZ29pbmcgdG8gb3ZlcmZsb3c/CisJICovCisJaWYgKChzaWduaWZpY2FuZCArIGluY3IpIDwgc2lnbmlmaWNhbmQpIHsKKwkJZXhwb25lbnQgKz0gMTsKKwkJc2lnbmlmaWNhbmQgPSAoc2lnbmlmaWNhbmQgPj4gMSkgfCAoc2lnbmlmaWNhbmQgJiAxKTsKKwkJaW5jciA+Pj0gMTsKKyNpZmRlZiBERUJVRworCQl2cy0+ZXhwb25lbnQgPSBleHBvbmVudDsKKwkJdnMtPnNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQ7CisJCXZmcF9zaW5nbGVfZHVtcCgicGFjazogb3ZlcmZsb3ciLCB2cyk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIElmIGFueSBvZiB0aGUgbG93IGJpdHMgKHdoaWNoIHdpbGwgYmUgc2hpZnRlZCBvdXQgb2YgdGhlCisJICogbnVtYmVyKSBhcmUgbm9uLXplcm8sIHRoZSByZXN1bHQgaXMgaW5leGFjdC4KKwkgKi8KKwlpZiAoc2lnbmlmaWNhbmQgJiAoKDEgPDwgKFZGUF9TSU5HTEVfTE9XX0JJVFMgKyAxKSkgLSAxKSkKKwkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JWEM7CisKKwkvKgorCSAqIERvIG91ciByb3VuZGluZy4KKwkgKi8KKwlzaWduaWZpY2FuZCArPSBpbmNyOworCisJLyoKKwkgKiBJbmZpbml0eT8KKwkgKi8KKwlpZiAoZXhwb25lbnQgPj0gMjU0KSB7CisJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfT0ZDIHwgRlBTQ1JfSVhDOworCQlpZiAoaW5jciA9PSAwKSB7CisJCQl2cy0+ZXhwb25lbnQgPSAyNTM7CisJCQl2cy0+c2lnbmlmaWNhbmQgPSAweDdmZmZmZmZmOworCQl9IGVsc2UgeworCQkJdnMtPmV4cG9uZW50ID0gMjU1OwkJLyogaW5maW5pdHkgKi8KKwkJCXZzLT5zaWduaWZpY2FuZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc2lnbmlmaWNhbmQgPj4gKFZGUF9TSU5HTEVfTE9XX0JJVFMgKyAxKSA9PSAwKQorCQkJZXhwb25lbnQgPSAwOworCQlpZiAoZXhwb25lbnQgfHwgc2lnbmlmaWNhbmQgPiAweDgwMDAwMDAwKQorCQkJdW5kZXJmbG93ID0gMDsKKwkJaWYgKHVuZGVyZmxvdykKKwkJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfVUZDOworCQl2cy0+ZXhwb25lbnQgPSBleHBvbmVudDsKKwkJdnMtPnNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQgPj4gMTsKKwl9CisKKyBwYWNrOgorCXZmcF9zaW5nbGVfZHVtcCgicGFjazogZmluYWwiLCB2cyk7CisJeworCQlzMzIgZCA9IHZmcF9zaW5nbGVfcGFjayh2cyk7CisJCXByX2RlYnVnKCJWRlA6ICVzOiBkKHMlZCk9JTA4eCBleGNlcHRpb25zPSUwOHhcbiIsIGZ1bmMsCisJCQkgc2QsIGQsIGV4Y2VwdGlvbnMpOworCQl2ZnBfcHV0X2Zsb2F0KHNkLCBkKTsKKwl9CisKKwlyZXR1cm4gZXhjZXB0aW9ucyAmIH5WRlBfTkFOX0ZMQUc7Cit9CisKKy8qCisgKiBQcm9wYWdhdGUgdGhlIE5hTiwgc2V0dGluZyBleGNlcHRpb25zIGlmIGl0IGlzIHNpZ25hbGxpbmcuCisgKiAnbicgaXMgYWx3YXlzIGEgTmFOLiAgJ20nIG1heSBiZSBhIG51bWJlciwgTmFOIG9yIGluZmluaXR5LgorICovCitzdGF0aWMgdTMyCit2ZnBfcHJvcGFnYXRlX25hbihzdHJ1Y3QgdmZwX3NpbmdsZSAqdnNkLCBzdHJ1Y3QgdmZwX3NpbmdsZSAqdnNuLAorCQkgIHN0cnVjdCB2ZnBfc2luZ2xlICp2c20sIHUzMiBmcHNjcikKK3sKKwlzdHJ1Y3QgdmZwX3NpbmdsZSAqbmFuOworCWludCB0biwgdG0gPSAwOworCisJdG4gPSB2ZnBfc2luZ2xlX3R5cGUodnNuKTsKKworCWlmICh2c20pCisJCXRtID0gdmZwX3NpbmdsZV90eXBlKHZzbSk7CisKKwlpZiAoZnBzY3IgJiBGUFNDUl9ERUZBVUxUX05BTikKKwkJLyoKKwkJICogRGVmYXVsdCBOYU4gbW9kZSAtIGFsd2F5cyByZXR1cm5zIGEgcXVpZXQgTmFOCisJCSAqLworCQluYW4gPSAmdmZwX3NpbmdsZV9kZWZhdWx0X3FuYW47CisJZWxzZSB7CisJCS8qCisJCSAqIENvbnRlbXBvcmFyeSBtb2RlIC0gc2VsZWN0IHRoZSBmaXJzdCBzaWduYWxsaW5nCisJCSAqIE5BTiwgb3IgaWYgbmVpdGhlciBhcmUgc2lnbmFsbGluZywgdGhlIGZpcnN0CisJCSAqIHF1aWV0IE5BTi4KKwkJICovCisJCWlmICh0biA9PSBWRlBfU05BTiB8fCAodG0gIT0gVkZQX1NOQU4gJiYgdG4gPT0gVkZQX1FOQU4pKQorCQkJbmFuID0gdnNuOworCQllbHNlCisJCQluYW4gPSB2c207CisJCS8qCisJCSAqIE1ha2UgdGhlIE5hTiBxdWlldC4KKwkJICovCisJCW5hbi0+c2lnbmlmaWNhbmQgfD0gVkZQX1NJTkdMRV9TSUdOSUZJQ0FORF9RTkFOOworCX0KKworCSp2c2QgPSAqbmFuOworCisJLyoKKwkgKiBJZiBvbmUgd2FzIGEgc2lnbmFsbGluZyBOQU4sIHJhaXNlIGludmFsaWQgb3BlcmF0aW9uLgorCSAqLworCXJldHVybiB0biA9PSBWRlBfU05BTiB8fCB0bSA9PSBWRlBfU05BTiA/IEZQU0NSX0lPQyA6IFZGUF9OQU5fRkxBRzsKK30KKworCisvKgorICogRXh0ZW5kZWQgb3BlcmF0aW9ucworICovCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZmFicyhpbnQgc2QsIGludCB1bnVzZWQsIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJdmZwX3B1dF9mbG9hdChzZCwgdmZwX3NpbmdsZV9wYWNrZWRfYWJzKG0pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZjcHkoaW50IHNkLCBpbnQgdW51c2VkLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXZmcF9wdXRfZmxvYXQoc2QsIG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZm5lZyhpbnQgc2QsIGludCB1bnVzZWQsIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJdmZwX3B1dF9mbG9hdChzZCwgdmZwX3NpbmdsZV9wYWNrZWRfbmVnYXRlKG0pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHUxNiBzcXJ0X29kZGFkanVzdFtdID0geworCTB4MDAwNCwgMHgwMDIyLCAweDAwNWQsIDB4MDBiMSwgMHgwMTFkLCAweDAxOWYsIDB4MDIzNiwgMHgwMmUwLAorCTB4MDM5YywgMHgwNDY4LCAweDA1NDUsIDB4MDYzMSwgMHgwNzJiLCAweDA4MzIsIDB4MDk0NiwgMHgwYTY3Cit9OworCitzdGF0aWMgY29uc3QgdTE2IHNxcnRfZXZlbmFkanVzdFtdID0geworCTB4MGEyZCwgMHgwOGFmLCAweDA3NWEsIDB4MDYyOSwgMHgwNTFhLCAweDA0MjksIDB4MDM1NiwgMHgwMjllLAorCTB4MDIwMCwgMHgwMTc5LCAweDAxMDksIDB4MDBhZiwgMHgwMDY4LCAweDAwMzQsIDB4MDAxMiwgMHgwMDAyCit9OworCit1MzIgdmZwX2VzdGltYXRlX3NxcnRfc2lnbmlmaWNhbmQodTMyIGV4cG9uZW50LCB1MzIgc2lnbmlmaWNhbmQpCit7CisJaW50IGluZGV4OworCXUzMiB6LCBhOworCisJaWYgKChzaWduaWZpY2FuZCAmIDB4YzAwMDAwMDApICE9IDB4NDAwMDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZQOiBlc3RpbWF0ZV9zcXJ0OiBpbnZhbGlkIHNpZ25pZmljYW5kXG4iKTsKKwl9CisKKwlhID0gc2lnbmlmaWNhbmQgPDwgMTsKKwlpbmRleCA9IChhID4+IDI3KSAmIDE1OworCWlmIChleHBvbmVudCAmIDEpIHsKKwkJeiA9IDB4NDAwMCArIChhID4+IDE3KSAtIHNxcnRfb2RkYWRqdXN0W2luZGV4XTsKKwkJeiA9ICgoYSAvIHopIDw8IDE0KSArICh6IDw8IDE1KTsKKwkJYSA+Pj0gMTsKKwl9IGVsc2UgeworCQl6ID0gMHg4MDAwICsgKGEgPj4gMTcpIC0gc3FydF9ldmVuYWRqdXN0W2luZGV4XTsKKwkJeiA9IGEgLyB6ICsgejsKKwkJeiA9ICh6ID49IDB4MjAwMDApID8gMHhmZmZmODAwMCA6ICh6IDw8IDE1KTsKKwkJaWYgKHogPD0gYSkKKwkJCXJldHVybiAoczMyKWEgPj4gMTsKKwl9CisJcmV0dXJuICh1MzIpKCgodTY0KWEgPDwgMzEpIC8geikgKyAoeiA+PiAxKTsKK30KKworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZzcXJ0KGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikKK3sKKwlzdHJ1Y3QgdmZwX3NpbmdsZSB2c20sIHZzZDsKKwlpbnQgcmV0LCB0bTsKKworCXZmcF9zaW5nbGVfdW5wYWNrKCZ2c20sIG0pOworCXRtID0gdmZwX3NpbmdsZV90eXBlKCZ2c20pOworCWlmICh0bSAmIChWRlBfTkFOfFZGUF9JTkZJTklUWSkpIHsKKwkJc3RydWN0IHZmcF9zaW5nbGUgKnZzcCA9ICZ2c2Q7CisKKwkJaWYgKHRtICYgVkZQX05BTikKKwkJCXJldCA9IHZmcF9wcm9wYWdhdGVfbmFuKHZzcCwgJnZzbSwgTlVMTCwgZnBzY3IpOworCQllbHNlIGlmICh2c20uc2lnbiA9PSAwKSB7Cisgc3FydF9jb3B5OgorCQkJdnNwID0gJnZzbTsKKwkJCXJldCA9IDA7CisJCX0gZWxzZSB7Cisgc3FydF9pbnZhbGlkOgorCQkJdnNwID0gJnZmcF9zaW5nbGVfZGVmYXVsdF9xbmFuOworCQkJcmV0ID0gRlBTQ1JfSU9DOworCQl9CisJCXZmcF9wdXRfZmxvYXQoc2QsIHZmcF9zaW5nbGVfcGFjayh2c3ApKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIHNxcnQoKy8tIDApID09ICsvLSAwCisJICovCisJaWYgKHRtICYgVkZQX1pFUk8pCisJCWdvdG8gc3FydF9jb3B5OworCisJLyoKKwkgKiBOb3JtYWxpc2UgYSBkZW5vcm1hbGlzZWQgbnVtYmVyCisJICovCisJaWYgKHRtICYgVkZQX0RFTk9STUFMKQorCQl2ZnBfc2luZ2xlX25vcm1hbGlzZV9kZW5vcm1hbCgmdnNtKTsKKworCS8qCisJICogc3FydCg8MCkgPSBpbnZhbGlkCisJICovCisJaWYgKHZzbS5zaWduKQorCQlnb3RvIHNxcnRfaW52YWxpZDsKKworCXZmcF9zaW5nbGVfZHVtcCgic3FydCIsICZ2c20pOworCisJLyoKKwkgKiBFc3RpbWF0ZSB0aGUgc3F1YXJlIHJvb3QuCisJICovCisJdnNkLnNpZ24gPSAwOworCXZzZC5leHBvbmVudCA9ICgodnNtLmV4cG9uZW50IC0gMTI3KSA+PiAxKSArIDEyNzsKKwl2c2Quc2lnbmlmaWNhbmQgPSB2ZnBfZXN0aW1hdGVfc3FydF9zaWduaWZpY2FuZCh2c20uZXhwb25lbnQsIHZzbS5zaWduaWZpY2FuZCkgKyAyOworCisJdmZwX3NpbmdsZV9kdW1wKCJzcXJ0IGVzdGltYXRlIiwgJnZzZCk7CisKKwkvKgorCSAqIEFuZCBub3cgYWRqdXN0LgorCSAqLworCWlmICgodnNkLnNpZ25pZmljYW5kICYgVkZQX1NJTkdMRV9MT1dfQklUU19NQVNLKSA8PSA1KSB7CisJCWlmICh2c2Quc2lnbmlmaWNhbmQgPCAyKSB7CisJCQl2c2Quc2lnbmlmaWNhbmQgPSAweGZmZmZmZmZmOworCQl9IGVsc2UgeworCQkJdTY0IHRlcm07CisJCQlzNjQgcmVtOworCQkJdnNtLnNpZ25pZmljYW5kIDw8PSAhKHZzbS5leHBvbmVudCAmIDEpOworCQkJdGVybSA9ICh1NjQpdnNkLnNpZ25pZmljYW5kICogdnNkLnNpZ25pZmljYW5kOworCQkJcmVtID0gKCh1NjQpdnNtLnNpZ25pZmljYW5kIDw8IDMyKSAtIHRlcm07CisKKwkJCXByX2RlYnVnKCJWRlA6IHRlcm09JTAxNmxseCByZW09JTAxNmxseFxuIiwgdGVybSwgcmVtKTsKKworCQkJd2hpbGUgKHJlbSA8IDApIHsKKwkJCQl2c2Quc2lnbmlmaWNhbmQgLT0gMTsKKwkJCQlyZW0gKz0gKCh1NjQpdnNkLnNpZ25pZmljYW5kIDw8IDEpIHwgMTsKKwkJCX0KKwkJCXZzZC5zaWduaWZpY2FuZCB8PSByZW0gIT0gMDsKKwkJfQorCX0KKwl2c2Quc2lnbmlmaWNhbmQgPSB2ZnBfc2hpZnRyaWdodDMyamFtbWluZyh2c2Quc2lnbmlmaWNhbmQsIDEpOworCisJcmV0dXJuIHZmcF9zaW5nbGVfbm9ybWFsaXNlcm91bmQoc2QsICZ2c2QsIGZwc2NyLCAwLCAiZnNxcnQiKTsKK30KKworLyoKKyAqIEVxdWFsCTo9IFpDCisgKiBMZXNzIHRoYW4JOj0gTgorICogR3JlYXRlciB0aGFuCTo9IEMKKyAqIFVub3JkZXJlZAk6PSBDVgorICovCitzdGF0aWMgdTMyIHZmcF9jb21wYXJlKGludCBzZCwgaW50IHNpZ25hbF9vbl9xbmFuLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXMzMiBkOworCXUzMiByZXQgPSAwOworCisJZCA9IHZmcF9nZXRfZmxvYXQoc2QpOworCWlmICh2ZnBfc2luZ2xlX3BhY2tlZF9leHBvbmVudChtKSA9PSAyNTUgJiYgdmZwX3NpbmdsZV9wYWNrZWRfbWFudGlzc2EobSkpIHsKKwkJcmV0IHw9IEZQU0NSX0MgfCBGUFNDUl9WOworCQlpZiAoc2lnbmFsX29uX3FuYW4gfHwgISh2ZnBfc2luZ2xlX3BhY2tlZF9tYW50aXNzYShtKSAmICgxIDw8IChWRlBfU0lOR0xFX01BTlRJU1NBX0JJVFMgLSAxKSkpKQorCQkJLyoKKwkJCSAqIFNpZ25hbGxpbmcgTmFOLCBvciBzaWduYWxsaW5nIG9uIHF1aWV0IE5hTgorCQkJICovCisJCQlyZXQgfD0gRlBTQ1JfSU9DOworCX0KKworCWlmICh2ZnBfc2luZ2xlX3BhY2tlZF9leHBvbmVudChkKSA9PSAyNTUgJiYgdmZwX3NpbmdsZV9wYWNrZWRfbWFudGlzc2EoZCkpIHsKKwkJcmV0IHw9IEZQU0NSX0MgfCBGUFNDUl9WOworCQlpZiAoc2lnbmFsX29uX3FuYW4gfHwgISh2ZnBfc2luZ2xlX3BhY2tlZF9tYW50aXNzYShkKSAmICgxIDw8IChWRlBfU0lOR0xFX01BTlRJU1NBX0JJVFMgLSAxKSkpKQorCQkJLyoKKwkJCSAqIFNpZ25hbGxpbmcgTmFOLCBvciBzaWduYWxsaW5nIG9uIHF1aWV0IE5hTgorCQkJICovCisJCQlyZXQgfD0gRlBTQ1JfSU9DOworCX0KKworCWlmIChyZXQgPT0gMCkgeworCQlpZiAoZCA9PSBtIHx8IHZmcF9zaW5nbGVfcGFja2VkX2FicyhkIHwgbSkgPT0gMCkgeworCQkJLyoKKwkJCSAqIGVxdWFsCisJCQkgKi8KKwkJCXJldCB8PSBGUFNDUl9aIHwgRlBTQ1JfQzsKKwkJfSBlbHNlIGlmICh2ZnBfc2luZ2xlX3BhY2tlZF9zaWduKGQgXiBtKSkgeworCQkJLyoKKwkJCSAqIGRpZmZlcmVudCBzaWducworCQkJICovCisJCQlpZiAodmZwX3NpbmdsZV9wYWNrZWRfc2lnbihkKSkKKwkJCQkvKgorCQkJCSAqIGQgaXMgbmVnYXRpdmUsIHNvIGQgPCBtCisJCQkJICovCisJCQkJcmV0IHw9IEZQU0NSX047CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiBkIGlzIHBvc2l0aXZlLCBzbyBkID4gbQorCQkJCSAqLworCQkJCXJldCB8PSBGUFNDUl9DOworCQl9IGVsc2UgaWYgKCh2ZnBfc2luZ2xlX3BhY2tlZF9zaWduKGQpICE9IDApIF4gKGQgPCBtKSkgeworCQkJLyoKKwkJCSAqIGQgPCBtCisJCQkgKi8KKwkJCXJldCB8PSBGUFNDUl9OOworCQl9IGVsc2UgaWYgKCh2ZnBfc2luZ2xlX3BhY2tlZF9zaWduKGQpICE9IDApIF4gKGQgPiBtKSkgeworCQkJLyoKKwkJCSAqIGQgPiBtCisJCQkgKi8KKwkJCXJldCB8PSBGUFNDUl9DOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgdmZwX3NpbmdsZV9mY21wKGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikKK3sKKwlyZXR1cm4gdmZwX2NvbXBhcmUoc2QsIDAsIG0sIGZwc2NyKTsKK30KKworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZjbXBlKGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikKK3sKKwlyZXR1cm4gdmZwX2NvbXBhcmUoc2QsIDEsIG0sIGZwc2NyKTsKK30KKworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZjbXB6KGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikKK3sKKwlyZXR1cm4gdmZwX2NvbXBhcmUoc2QsIDAsIDAsIGZwc2NyKTsKK30KKworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZjbXBleihpbnQgc2QsIGludCB1bnVzZWQsIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9jb21wYXJlKHNkLCAxLCAwLCBmcHNjcik7Cit9CisKK3N0YXRpYyB1MzIgdmZwX3NpbmdsZV9mY3Z0ZChpbnQgZGQsIGludCB1bnVzZWQsIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJc3RydWN0IHZmcF9zaW5nbGUgdnNtOworCXN0cnVjdCB2ZnBfZG91YmxlIHZkZDsKKwlpbnQgdG07CisJdTMyIGV4Y2VwdGlvbnMgPSAwOworCisJdmZwX3NpbmdsZV91bnBhY2soJnZzbSwgbSk7CisKKwl0bSA9IHZmcF9zaW5nbGVfdHlwZSgmdnNtKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhIHNpZ25hbGxpbmcgTmFOLCBzaWduYWwgaW52YWxpZCBvcGVyYXRpb24uCisJICovCisJaWYgKHRtID09IFZGUF9TTkFOKQorCQlleGNlcHRpb25zID0gRlBTQ1JfSU9DOworCisJaWYgKHRtICYgVkZQX0RFTk9STUFMKQorCQl2ZnBfc2luZ2xlX25vcm1hbGlzZV9kZW5vcm1hbCgmdnNtKTsKKworCXZkZC5zaWduID0gdnNtLnNpZ247CisJdmRkLnNpZ25pZmljYW5kID0gKHU2NCl2c20uc2lnbmlmaWNhbmQgPDwgMzI7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYW4gaW5maW5pdHkgb3IgTmFOLCB0aGUgZXhwb25lbnQgbXVzdCBiZSAyMDQ3LgorCSAqLworCWlmICh0bSAmIChWRlBfSU5GSU5JVFl8VkZQX05BTikpIHsKKwkJdmRkLmV4cG9uZW50ID0gMjA0NzsKKwkJaWYgKHRtICYgVkZQX05BTikKKwkJCXZkZC5zaWduaWZpY2FuZCB8PSBWRlBfRE9VQkxFX1NJR05JRklDQU5EX1FOQU47CisJCWdvdG8gcGFja19uYW47CisJfSBlbHNlIGlmICh0bSAmIFZGUF9aRVJPKQorCQl2ZGQuZXhwb25lbnQgPSAwOworCWVsc2UKKwkJdmRkLmV4cG9uZW50ID0gdnNtLmV4cG9uZW50ICsgKDEwMjMgLSAxMjcpOworCisJLyoKKwkgKiBUZWNobmljYWxseSwgaWYgYml0IDAgb2YgZGQgaXMgc2V0LCB0aGlzIGlzIGFuIGludmFsaWQKKwkgKiBpbnN0cnVjdGlvbi4gIEhvd2V2ZXIsIHdlIGlnbm9yZSB0aGlzIGZvciBlZmZpY2llbmN5LgorCSAqLworCXJldHVybiB2ZnBfZG91YmxlX25vcm1hbGlzZXJvdW5kKGRkLCAmdmRkLCBmcHNjciwgZXhjZXB0aW9ucywgImZjdnRkIik7CisKKyBwYWNrX25hbjoKKwl2ZnBfcHV0X2RvdWJsZShkZCwgdmZwX2RvdWJsZV9wYWNrKCZ2ZGQpKTsKKwlyZXR1cm4gZXhjZXB0aW9uczsKK30KKworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2Z1aXRvKGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikKK3sKKwlzdHJ1Y3QgdmZwX3NpbmdsZSB2czsKKworCXZzLnNpZ24gPSAwOworCXZzLmV4cG9uZW50ID0gMTI3ICsgMzEgLSAxOworCXZzLnNpZ25pZmljYW5kID0gKHUzMiltOworCisJcmV0dXJuIHZmcF9zaW5nbGVfbm9ybWFsaXNlcm91bmQoc2QsICZ2cywgZnBzY3IsIDAsICJmdWl0byIpOworfQorCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZnNpdG8oaW50IHNkLCBpbnQgdW51c2VkLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfc2luZ2xlIHZzOworCisJdnMuc2lnbiA9IChtICYgMHg4MDAwMDAwMCkgPj4gMTY7CisJdnMuZXhwb25lbnQgPSAxMjcgKyAzMSAtIDE7CisJdnMuc2lnbmlmaWNhbmQgPSB2cy5zaWduID8gLW0gOiBtOworCisJcmV0dXJuIHZmcF9zaW5nbGVfbm9ybWFsaXNlcm91bmQoc2QsICZ2cywgZnBzY3IsIDAsICJmc2l0byIpOworfQorCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZnRvdWkoaW50IHNkLCBpbnQgdW51c2VkLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfc2luZ2xlIHZzbTsKKwl1MzIgZCwgZXhjZXB0aW9ucyA9IDA7CisJaW50IHJtb2RlID0gZnBzY3IgJiBGUFNDUl9STU9ERV9NQVNLOworCWludCB0bTsKKworCXZmcF9zaW5nbGVfdW5wYWNrKCZ2c20sIG0pOworCXZmcF9zaW5nbGVfZHVtcCgiVlNNIiwgJnZzbSk7CisKKwkvKgorCSAqIERvIHdlIGhhdmUgYSBkZW5vcm1hbGlzZWQgbnVtYmVyPworCSAqLworCXRtID0gdmZwX3NpbmdsZV90eXBlKCZ2c20pOworCWlmICh0bSAmIFZGUF9ERU5PUk1BTCkKKwkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JREM7CisKKwlpZiAodG0gJiBWRlBfTkFOKQorCQl2c20uc2lnbiA9IDA7CisKKwlpZiAodnNtLmV4cG9uZW50ID49IDEyNyArIDMyKSB7CisJCWQgPSB2c20uc2lnbiA/IDAgOiAweGZmZmZmZmZmOworCQlleGNlcHRpb25zID0gRlBTQ1JfSU9DOworCX0gZWxzZSBpZiAodnNtLmV4cG9uZW50ID49IDEyNyAtIDEpIHsKKwkJaW50IHNoaWZ0ID0gMTI3ICsgMzEgLSB2c20uZXhwb25lbnQ7CisJCXUzMiByZW0sIGluY3IgPSAwOworCisJCS8qCisJCSAqIDJeMCA8PSBtIDwgMl4zMi0yXjgKKwkJICovCisJCWQgPSAodnNtLnNpZ25pZmljYW5kIDw8IDEpID4+IHNoaWZ0OworCQlyZW0gPSB2c20uc2lnbmlmaWNhbmQgPDwgKDMzIC0gc2hpZnQpOworCisJCWlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9ORUFSRVNUKSB7CisJCQlpbmNyID0gMHg4MDAwMDAwMDsKKwkJCWlmICgoZCAmIDEpID09IDApCisJCQkJaW5jciAtPSAxOworCQl9IGVsc2UgaWYgKHJtb2RlID09IEZQU0NSX1JPVU5EX1RPWkVSTykgeworCQkJaW5jciA9IDA7CisJCX0gZWxzZSBpZiAoKHJtb2RlID09IEZQU0NSX1JPVU5EX1BMVVNJTkYpIF4gKHZzbS5zaWduICE9IDApKSB7CisJCQlpbmNyID0gfjA7CisJCX0KKworCQlpZiAoKHJlbSArIGluY3IpIDwgcmVtKSB7CisJCQlpZiAoZCA8IDB4ZmZmZmZmZmYpCisJCQkJZCArPSAxOworCQkJZWxzZQorCQkJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfSU9DOworCQl9CisKKwkJaWYgKGQgJiYgdnNtLnNpZ24pIHsKKwkJCWQgPSAwOworCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JT0M7CisJCX0gZWxzZSBpZiAocmVtKQorCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JWEM7CisJfSBlbHNlIHsKKwkJZCA9IDA7CisJCWlmICh2c20uZXhwb25lbnQgfCB2c20uc2lnbmlmaWNhbmQpIHsKKwkJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfSVhDOworCQkJaWYgKHJtb2RlID09IEZQU0NSX1JPVU5EX1BMVVNJTkYgJiYgdnNtLnNpZ24gPT0gMCkKKwkJCQlkID0gMTsKKwkJCWVsc2UgaWYgKHJtb2RlID09IEZQU0NSX1JPVU5EX01JTlVTSU5GICYmIHZzbS5zaWduKSB7CisJCQkJZCA9IDA7CisJCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JT0M7CisJCQl9CisJCX0KKwl9CisKKwlwcl9kZWJ1ZygiVkZQOiBmdG91aTogZChzJWQpPSUwOHggZXhjZXB0aW9ucz0lMDh4XG4iLCBzZCwgZCwgZXhjZXB0aW9ucyk7CisKKwl2ZnBfcHV0X2Zsb2F0KHNkLCBkKTsKKworCXJldHVybiBleGNlcHRpb25zOworfQorCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZnRvdWl6KGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikKK3sKKwlyZXR1cm4gdmZwX3NpbmdsZV9mdG91aShzZCwgdW51c2VkLCBtLCBGUFNDUl9ST1VORF9UT1pFUk8pOworfQorCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZnRvc2koaW50IHNkLCBpbnQgdW51c2VkLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfc2luZ2xlIHZzbTsKKwl1MzIgZCwgZXhjZXB0aW9ucyA9IDA7CisJaW50IHJtb2RlID0gZnBzY3IgJiBGUFNDUl9STU9ERV9NQVNLOworCisJdmZwX3NpbmdsZV91bnBhY2soJnZzbSwgbSk7CisJdmZwX3NpbmdsZV9kdW1wKCJWU00iLCAmdnNtKTsKKworCS8qCisJICogRG8gd2UgaGF2ZSBhIGRlbm9ybWFsaXNlZCBudW1iZXI/CisJICovCisJaWYgKHZmcF9zaW5nbGVfdHlwZSgmdnNtKSAmIFZGUF9ERU5PUk1BTCkKKwkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JREM7CisKKwlpZiAodnNtLmV4cG9uZW50ID49IDEyNyArIDMyKSB7CisJCS8qCisJCSAqIG0gPj0gMl4zMS0yXjc6IGludmFsaWQKKwkJICovCisJCWQgPSAweDdmZmZmZmZmOworCQlpZiAodnNtLnNpZ24pCisJCQlkID0gfmQ7CisJCWV4Y2VwdGlvbnMgfD0gRlBTQ1JfSU9DOworCX0gZWxzZSBpZiAodnNtLmV4cG9uZW50ID49IDEyNyAtIDEpIHsKKwkJaW50IHNoaWZ0ID0gMTI3ICsgMzEgLSB2c20uZXhwb25lbnQ7CisJCXUzMiByZW0sIGluY3IgPSAwOworCisJCS8qIDJeMCA8PSBtIDw9IDJeMzEtMl43ICovCisJCWQgPSAodnNtLnNpZ25pZmljYW5kIDw8IDEpID4+IHNoaWZ0OworCQlyZW0gPSB2c20uc2lnbmlmaWNhbmQgPDwgKDMzIC0gc2hpZnQpOworCisJCWlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9ORUFSRVNUKSB7CisJCQlpbmNyID0gMHg4MDAwMDAwMDsKKwkJCWlmICgoZCAmIDEpID09IDApCisJCQkJaW5jciAtPSAxOworCQl9IGVsc2UgaWYgKHJtb2RlID09IEZQU0NSX1JPVU5EX1RPWkVSTykgeworCQkJaW5jciA9IDA7CisJCX0gZWxzZSBpZiAoKHJtb2RlID09IEZQU0NSX1JPVU5EX1BMVVNJTkYpIF4gKHZzbS5zaWduICE9IDApKSB7CisJCQlpbmNyID0gfjA7CisJCX0KKworCQlpZiAoKHJlbSArIGluY3IpIDwgcmVtICYmIGQgPCAweGZmZmZmZmZmKQorCQkJZCArPSAxOworCQlpZiAoZCA+IDB4N2ZmZmZmZmYgKyAodnNtLnNpZ24gIT0gMCkpIHsKKwkJCWQgPSAweDdmZmZmZmZmICsgKHZzbS5zaWduICE9IDApOworCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JT0M7CisJCX0gZWxzZSBpZiAocmVtKQorCQkJZXhjZXB0aW9ucyB8PSBGUFNDUl9JWEM7CisKKwkJaWYgKHZzbS5zaWduKQorCQkJZCA9IC1kOworCX0gZWxzZSB7CisJCWQgPSAwOworCQlpZiAodnNtLmV4cG9uZW50IHwgdnNtLnNpZ25pZmljYW5kKSB7CisJCQlleGNlcHRpb25zIHw9IEZQU0NSX0lYQzsKKwkJCWlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9QTFVTSU5GICYmIHZzbS5zaWduID09IDApCisJCQkJZCA9IDE7CisJCQllbHNlIGlmIChybW9kZSA9PSBGUFNDUl9ST1VORF9NSU5VU0lORiAmJiB2c20uc2lnbikKKwkJCQlkID0gLTE7CisJCX0KKwl9CisKKwlwcl9kZWJ1ZygiVkZQOiBmdG9zaTogZChzJWQpPSUwOHggZXhjZXB0aW9ucz0lMDh4XG4iLCBzZCwgZCwgZXhjZXB0aW9ucyk7CisKKwl2ZnBfcHV0X2Zsb2F0KHNkLCAoczMyKWQpOworCisJcmV0dXJuIGV4Y2VwdGlvbnM7Cit9CisKK3N0YXRpYyB1MzIgdmZwX3NpbmdsZV9mdG9zaXooaW50IHNkLCBpbnQgdW51c2VkLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXJldHVybiB2ZnBfc2luZ2xlX2Z0b3NpKHNkLCB1bnVzZWQsIG0sIEZQU0NSX1JPVU5EX1RPWkVSTyk7Cit9CisKK3N0YXRpYyB1MzIgKCogY29uc3QgZm9wX2V4dGZuc1szMl0pKGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikgPSB7CisJW0ZFWFRfVE9fSURYKEZFWFRfRkNQWSldCT0gdmZwX3NpbmdsZV9mY3B5LAorCVtGRVhUX1RPX0lEWChGRVhUX0ZBQlMpXQk9IHZmcF9zaW5nbGVfZmFicywKKwlbRkVYVF9UT19JRFgoRkVYVF9GTkVHKV0JPSB2ZnBfc2luZ2xlX2ZuZWcsCisJW0ZFWFRfVE9fSURYKEZFWFRfRlNRUlQpXQk9IHZmcF9zaW5nbGVfZnNxcnQsCisJW0ZFWFRfVE9fSURYKEZFWFRfRkNNUCldCT0gdmZwX3NpbmdsZV9mY21wLAorCVtGRVhUX1RPX0lEWChGRVhUX0ZDTVBFKV0JPSB2ZnBfc2luZ2xlX2ZjbXBlLAorCVtGRVhUX1RPX0lEWChGRVhUX0ZDTVBaKV0JPSB2ZnBfc2luZ2xlX2ZjbXB6LAorCVtGRVhUX1RPX0lEWChGRVhUX0ZDTVBFWildCT0gdmZwX3NpbmdsZV9mY21wZXosCisJW0ZFWFRfVE9fSURYKEZFWFRfRkNWVCldCT0gdmZwX3NpbmdsZV9mY3Z0ZCwKKwlbRkVYVF9UT19JRFgoRkVYVF9GVUlUTyldCT0gdmZwX3NpbmdsZV9mdWl0bywKKwlbRkVYVF9UT19JRFgoRkVYVF9GU0lUTyldCT0gdmZwX3NpbmdsZV9mc2l0bywKKwlbRkVYVF9UT19JRFgoRkVYVF9GVE9VSSldCT0gdmZwX3NpbmdsZV9mdG91aSwKKwlbRkVYVF9UT19JRFgoRkVYVF9GVE9VSVopXQk9IHZmcF9zaW5nbGVfZnRvdWl6LAorCVtGRVhUX1RPX0lEWChGRVhUX0ZUT1NJKV0JPSB2ZnBfc2luZ2xlX2Z0b3NpLAorCVtGRVhUX1RPX0lEWChGRVhUX0ZUT1NJWildCT0gdmZwX3NpbmdsZV9mdG9zaXosCit9OworCisKKworCisKK3N0YXRpYyB1MzIKK3ZmcF9zaW5nbGVfZmFkZF9ub25udW1iZXIoc3RydWN0IHZmcF9zaW5nbGUgKnZzZCwgc3RydWN0IHZmcF9zaW5nbGUgKnZzbiwKKwkJCSAgc3RydWN0IHZmcF9zaW5nbGUgKnZzbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfc2luZ2xlICp2c3A7CisJdTMyIGV4Y2VwdGlvbnMgPSAwOworCWludCB0biwgdG07CisKKwl0biA9IHZmcF9zaW5nbGVfdHlwZSh2c24pOworCXRtID0gdmZwX3NpbmdsZV90eXBlKHZzbSk7CisKKwlpZiAodG4gJiB0bSAmIFZGUF9JTkZJTklUWSkgeworCQkvKgorCQkgKiBUd28gaW5maW5pdGllcy4gIEFyZSB0aGV5IGRpZmZlcmVudCBzaWducz8KKwkJICovCisJCWlmICh2c24tPnNpZ24gXiB2c20tPnNpZ24pIHsKKwkJCS8qCisJCQkgKiBkaWZmZXJlbnQgc2lnbnMgLT4gaW52YWxpZAorCQkJICovCisJCQlleGNlcHRpb25zID0gRlBTQ1JfSU9DOworCQkJdnNwID0gJnZmcF9zaW5nbGVfZGVmYXVsdF9xbmFuOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHNhbWUgc2lnbnMgLT4gdmFsaWQKKwkJCSAqLworCQkJdnNwID0gdnNuOworCQl9CisJfSBlbHNlIGlmICh0biAmIFZGUF9JTkZJTklUWSAmJiB0bSAmIFZGUF9OVU1CRVIpIHsKKwkJLyoKKwkJICogT25lIGluZmluaXR5IGFuZCBvbmUgbnVtYmVyIC0+IGluZmluaXR5CisJCSAqLworCQl2c3AgPSB2c247CisJfSBlbHNlIHsKKwkJLyoKKwkJICogJ24nIGlzIGEgTmFOIG9mIHNvbWUgdHlwZQorCQkgKi8KKwkJcmV0dXJuIHZmcF9wcm9wYWdhdGVfbmFuKHZzZCwgdnNuLCB2c20sIGZwc2NyKTsKKwl9CisJKnZzZCA9ICp2c3A7CisJcmV0dXJuIGV4Y2VwdGlvbnM7Cit9CisKK3N0YXRpYyB1MzIKK3ZmcF9zaW5nbGVfYWRkKHN0cnVjdCB2ZnBfc2luZ2xlICp2c2QsIHN0cnVjdCB2ZnBfc2luZ2xlICp2c24sCisJICAgICAgIHN0cnVjdCB2ZnBfc2luZ2xlICp2c20sIHUzMiBmcHNjcikKK3sKKwl1MzIgZXhwX2RpZmYsIG1fc2lnOworCisJaWYgKHZzbi0+c2lnbmlmaWNhbmQgJiAweDgwMDAwMDAwIHx8CisJICAgIHZzbS0+c2lnbmlmaWNhbmQgJiAweDgwMDAwMDAwKSB7CisJCXByX2luZm8oIlZGUDogYmFkIEZQIHZhbHVlcyBpbiAlc1xuIiwgX19mdW5jX18pOworCQl2ZnBfc2luZ2xlX2R1bXAoIlZTTiIsIHZzbik7CisJCXZmcF9zaW5nbGVfZHVtcCgiVlNNIiwgdnNtKTsKKwl9CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0ICduJyBpcyB0aGUgbGFyZ2VzdCBtYWduaXR1ZGUgbnVtYmVyLiAgTm90ZSB0aGF0CisJICogaWYgJ24nIGFuZCAnbScgaGF2ZSBlcXVhbCBleHBvbmVudHMsIHdlIGRvIG5vdCBzd2FwIHRoZW0uCisJICogVGhpcyBlbnN1cmVzIHRoYXQgTmFOIHByb3BhZ2F0aW9uIHdvcmtzIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAodnNuLT5leHBvbmVudCA8IHZzbS0+ZXhwb25lbnQpIHsKKwkJc3RydWN0IHZmcF9zaW5nbGUgKnQgPSB2c247CisJCXZzbiA9IHZzbTsKKwkJdnNtID0gdDsKKwl9CisKKwkvKgorCSAqIElzICduJyBhbiBpbmZpbml0eSBvciBhIE5hTj8gIE5vdGUgdGhhdCAnbScgbWF5IGJlIGEgbnVtYmVyLAorCSAqIGluZmluaXR5IG9yIGEgTmFOIGhlcmUuCisJICovCisJaWYgKHZzbi0+ZXhwb25lbnQgPT0gMjU1KQorCQlyZXR1cm4gdmZwX3NpbmdsZV9mYWRkX25vbm51bWJlcih2c2QsIHZzbiwgdnNtLCBmcHNjcik7CisKKwkvKgorCSAqIFdlIGhhdmUgdHdvIHByb3BlciBudW1iZXJzLCB3aGVyZSAndnNuJyBpcyB0aGUgbGFyZ2VyIG1hZ25pdHVkZS4KKwkgKgorCSAqIENvcHkgJ24nIHRvICdkJyBiZWZvcmUgZG9pbmcgdGhlIGFyaXRobWV0aWMuCisJICovCisJKnZzZCA9ICp2c247CisKKwkvKgorCSAqIEFsaWduIGJvdGggbnVtYmVycy4KKwkgKi8KKwlleHBfZGlmZiA9IHZzbi0+ZXhwb25lbnQgLSB2c20tPmV4cG9uZW50OworCW1fc2lnID0gdmZwX3NoaWZ0cmlnaHQzMmphbW1pbmcodnNtLT5zaWduaWZpY2FuZCwgZXhwX2RpZmYpOworCisJLyoKKwkgKiBJZiB0aGUgc2lnbnMgYXJlIGRpZmZlcmVudCwgd2UgYXJlIHJlYWxseSBzdWJ0cmFjdGluZy4KKwkgKi8KKwlpZiAodnNuLT5zaWduIF4gdnNtLT5zaWduKSB7CisJCW1fc2lnID0gdnNuLT5zaWduaWZpY2FuZCAtIG1fc2lnOworCQlpZiAoKHMzMiltX3NpZyA8IDApIHsKKwkJCXZzZC0+c2lnbiA9IHZmcF9zaWduX25lZ2F0ZSh2c2QtPnNpZ24pOworCQkJbV9zaWcgPSAtbV9zaWc7CisJCX0gZWxzZSBpZiAobV9zaWcgPT0gMCkgeworCQkJdnNkLT5zaWduID0gKGZwc2NyICYgRlBTQ1JfUk1PREVfTUFTSykgPT0KKwkJCQkgICAgICBGUFNDUl9ST1VORF9NSU5VU0lORiA/IDB4ODAwMCA6IDA7CisJCX0KKwl9IGVsc2UgeworCQltX3NpZyA9IHZzbi0+c2lnbmlmaWNhbmQgKyBtX3NpZzsKKwl9CisJdnNkLT5zaWduaWZpY2FuZCA9IG1fc2lnOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIKK3ZmcF9zaW5nbGVfbXVsdGlwbHkoc3RydWN0IHZmcF9zaW5nbGUgKnZzZCwgc3RydWN0IHZmcF9zaW5nbGUgKnZzbiwgc3RydWN0IHZmcF9zaW5nbGUgKnZzbSwgdTMyIGZwc2NyKQoreworCXZmcF9zaW5nbGVfZHVtcCgiVlNOIiwgdnNuKTsKKwl2ZnBfc2luZ2xlX2R1bXAoIlZTTSIsIHZzbSk7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0ICduJyBpcyB0aGUgbGFyZ2VzdCBtYWduaXR1ZGUgbnVtYmVyLiAgTm90ZSB0aGF0CisJICogaWYgJ24nIGFuZCAnbScgaGF2ZSBlcXVhbCBleHBvbmVudHMsIHdlIGRvIG5vdCBzd2FwIHRoZW0uCisJICogVGhpcyBlbnN1cmVzIHRoYXQgTmFOIHByb3BhZ2F0aW9uIHdvcmtzIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAodnNuLT5leHBvbmVudCA8IHZzbS0+ZXhwb25lbnQpIHsKKwkJc3RydWN0IHZmcF9zaW5nbGUgKnQgPSB2c247CisJCXZzbiA9IHZzbTsKKwkJdnNtID0gdDsKKwkJcHJfZGVidWcoIlZGUDogc3dhcHBpbmcgTSA8LT4gTlxuIik7CisJfQorCisJdnNkLT5zaWduID0gdnNuLT5zaWduIF4gdnNtLT5zaWduOworCisJLyoKKwkgKiBJZiAnbicgaXMgYW4gaW5maW5pdHkgb3IgTmFOLCBoYW5kbGUgaXQuICAnbScgbWF5IGJlIGFueXRoaW5nLgorCSAqLworCWlmICh2c24tPmV4cG9uZW50ID09IDI1NSkgeworCQlpZiAodnNuLT5zaWduaWZpY2FuZCB8fCAodnNtLT5leHBvbmVudCA9PSAyNTUgJiYgdnNtLT5zaWduaWZpY2FuZCkpCisJCQlyZXR1cm4gdmZwX3Byb3BhZ2F0ZV9uYW4odnNkLCB2c24sIHZzbSwgZnBzY3IpOworCQlpZiAoKHZzbS0+ZXhwb25lbnQgfCB2c20tPnNpZ25pZmljYW5kKSA9PSAwKSB7CisJCQkqdnNkID0gdmZwX3NpbmdsZV9kZWZhdWx0X3FuYW47CisJCQlyZXR1cm4gRlBTQ1JfSU9DOworCQl9CisJCXZzZC0+ZXhwb25lbnQgPSB2c24tPmV4cG9uZW50OworCQl2c2QtPnNpZ25pZmljYW5kID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiAnbScgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhbHdheXMgemVyby4gIEluIHRoaXMgY2FzZSwKKwkgKiAnbicgbWF5IGJlIHplcm8gb3IgYSBudW1iZXIsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaC4KKwkgKi8KKwlpZiAoKHZzbS0+ZXhwb25lbnQgfCB2c20tPnNpZ25pZmljYW5kKSA9PSAwKSB7CisJCXZzZC0+ZXhwb25lbnQgPSAwOworCQl2c2QtPnNpZ25pZmljYW5kID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhZGQgMiB0byB0aGUgZGVzdGluYXRpb24gZXhwb25lbnQgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcworCSAqIHRoZSBhZGRpdGlvbiBjYXNlIC0gdGhvdWdoIHRoaXMgdGltZSB3ZSBoYXZlICsxIGZyb20gZWFjaAorCSAqIGlucHV0IG9wZXJhbmQuCisJICovCisJdnNkLT5leHBvbmVudCA9IHZzbi0+ZXhwb25lbnQgKyB2c20tPmV4cG9uZW50IC0gMTI3ICsgMjsKKwl2c2QtPnNpZ25pZmljYW5kID0gdmZwX2hpNjR0bzMyamFtbWluZygodTY0KXZzbi0+c2lnbmlmaWNhbmQgKiB2c20tPnNpZ25pZmljYW5kKTsKKworCXZmcF9zaW5nbGVfZHVtcCgiVlNEIiwgdnNkKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBORUdfTVVMVElQTFkJKDEgPDwgMCkKKyNkZWZpbmUgTkVHX1NVQlRSQUNUCSgxIDw8IDEpCisKK3N0YXRpYyB1MzIKK3ZmcF9zaW5nbGVfbXVsdGlwbHlfYWNjdW11bGF0ZShpbnQgc2QsIGludCBzbiwgczMyIG0sIHUzMiBmcHNjciwgdTMyIG5lZ2F0ZSwgY2hhciAqZnVuYykKK3sKKwlzdHJ1Y3QgdmZwX3NpbmdsZSB2c2QsIHZzcCwgdnNuLCB2c207CisJdTMyIGV4Y2VwdGlvbnM7CisJczMyIHY7CisKKwl2ID0gdmZwX2dldF9mbG9hdChzbik7CisJcHJfZGVidWcoIlZGUDogcyV1ID0gJTA4eFxuIiwgc24sIHYpOworCXZmcF9zaW5nbGVfdW5wYWNrKCZ2c24sIHYpOworCWlmICh2c24uZXhwb25lbnQgPT0gMCAmJiB2c24uc2lnbmlmaWNhbmQpCisJCXZmcF9zaW5nbGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2c24pOworCisJdmZwX3NpbmdsZV91bnBhY2soJnZzbSwgbSk7CisJaWYgKHZzbS5leHBvbmVudCA9PSAwICYmIHZzbS5zaWduaWZpY2FuZCkKKwkJdmZwX3NpbmdsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZzbSk7CisKKwlleGNlcHRpb25zID0gdmZwX3NpbmdsZV9tdWx0aXBseSgmdnNwLCAmdnNuLCAmdnNtLCBmcHNjcik7CisJaWYgKG5lZ2F0ZSAmIE5FR19NVUxUSVBMWSkKKwkJdnNwLnNpZ24gPSB2ZnBfc2lnbl9uZWdhdGUodnNwLnNpZ24pOworCisJdiA9IHZmcF9nZXRfZmxvYXQoc2QpOworCXByX2RlYnVnKCJWRlA6IHMldSA9ICUwOHhcbiIsIHNkLCB2KTsKKwl2ZnBfc2luZ2xlX3VucGFjaygmdnNuLCB2KTsKKwlpZiAobmVnYXRlICYgTkVHX1NVQlRSQUNUKQorCQl2c24uc2lnbiA9IHZmcF9zaWduX25lZ2F0ZSh2c24uc2lnbik7CisKKwlleGNlcHRpb25zIHw9IHZmcF9zaW5nbGVfYWRkKCZ2c2QsICZ2c24sICZ2c3AsIGZwc2NyKTsKKworCXJldHVybiB2ZnBfc2luZ2xlX25vcm1hbGlzZXJvdW5kKHNkLCAmdnNkLCBmcHNjciwgZXhjZXB0aW9ucywgZnVuYyk7Cit9CisKKy8qCisgKiBTdGFuZGFyZCBvcGVyYXRpb25zCisgKi8KKworLyoKKyAqIHNkID0gc2QgKyAoc24gKiBzbSkKKyAqLworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZtYWMoaW50IHNkLCBpbnQgc24sIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9zaW5nbGVfbXVsdGlwbHlfYWNjdW11bGF0ZShzZCwgc24sIG0sIGZwc2NyLCAwLCAiZm1hYyIpOworfQorCisvKgorICogc2QgPSBzZCAtIChzbiAqIHNtKQorICovCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZm5tYWMoaW50IHNkLCBpbnQgc24sIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9zaW5nbGVfbXVsdGlwbHlfYWNjdW11bGF0ZShzZCwgc24sIG0sIGZwc2NyLCBORUdfTVVMVElQTFksICJmbm1hYyIpOworfQorCisvKgorICogc2QgPSAtc2QgKyAoc24gKiBzbSkKKyAqLworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2Ztc2MoaW50IHNkLCBpbnQgc24sIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9zaW5nbGVfbXVsdGlwbHlfYWNjdW11bGF0ZShzZCwgc24sIG0sIGZwc2NyLCBORUdfU1VCVFJBQ1QsICJmbXNjIik7Cit9CisKKy8qCisgKiBzZCA9IC1zZCAtIChzbiAqIHNtKQorICovCitzdGF0aWMgdTMyIHZmcF9zaW5nbGVfZm5tc2MoaW50IHNkLCBpbnQgc24sIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJcmV0dXJuIHZmcF9zaW5nbGVfbXVsdGlwbHlfYWNjdW11bGF0ZShzZCwgc24sIG0sIGZwc2NyLCBORUdfU1VCVFJBQ1QgfCBORUdfTVVMVElQTFksICJmbm1zYyIpOworfQorCisvKgorICogc2QgPSBzbiAqIHNtCisgKi8KK3N0YXRpYyB1MzIgdmZwX3NpbmdsZV9mbXVsKGludCBzZCwgaW50IHNuLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfc2luZ2xlIHZzZCwgdnNuLCB2c207CisJdTMyIGV4Y2VwdGlvbnM7CisJczMyIG4gPSB2ZnBfZ2V0X2Zsb2F0KHNuKTsKKworCXByX2RlYnVnKCJWRlA6IHMldSA9ICUwOHhcbiIsIHNuLCBuKTsKKworCXZmcF9zaW5nbGVfdW5wYWNrKCZ2c24sIG4pOworCWlmICh2c24uZXhwb25lbnQgPT0gMCAmJiB2c24uc2lnbmlmaWNhbmQpCisJCXZmcF9zaW5nbGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2c24pOworCisJdmZwX3NpbmdsZV91bnBhY2soJnZzbSwgbSk7CisJaWYgKHZzbS5leHBvbmVudCA9PSAwICYmIHZzbS5zaWduaWZpY2FuZCkKKwkJdmZwX3NpbmdsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZzbSk7CisKKwlleGNlcHRpb25zID0gdmZwX3NpbmdsZV9tdWx0aXBseSgmdnNkLCAmdnNuLCAmdnNtLCBmcHNjcik7CisJcmV0dXJuIHZmcF9zaW5nbGVfbm9ybWFsaXNlcm91bmQoc2QsICZ2c2QsIGZwc2NyLCBleGNlcHRpb25zLCAiZm11bCIpOworfQorCisvKgorICogc2QgPSAtKHNuICogc20pCisgKi8KK3N0YXRpYyB1MzIgdmZwX3NpbmdsZV9mbm11bChpbnQgc2QsIGludCBzbiwgczMyIG0sIHUzMiBmcHNjcikKK3sKKwlzdHJ1Y3QgdmZwX3NpbmdsZSB2c2QsIHZzbiwgdnNtOworCXUzMiBleGNlcHRpb25zOworCXMzMiBuID0gdmZwX2dldF9mbG9hdChzbik7CisKKwlwcl9kZWJ1ZygiVkZQOiBzJXUgPSAlMDh4XG4iLCBzbiwgbik7CisKKwl2ZnBfc2luZ2xlX3VucGFjaygmdnNuLCBuKTsKKwlpZiAodnNuLmV4cG9uZW50ID09IDAgJiYgdnNuLnNpZ25pZmljYW5kKQorCQl2ZnBfc2luZ2xlX25vcm1hbGlzZV9kZW5vcm1hbCgmdnNuKTsKKworCXZmcF9zaW5nbGVfdW5wYWNrKCZ2c20sIG0pOworCWlmICh2c20uZXhwb25lbnQgPT0gMCAmJiB2c20uc2lnbmlmaWNhbmQpCisJCXZmcF9zaW5nbGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2c20pOworCisJZXhjZXB0aW9ucyA9IHZmcF9zaW5nbGVfbXVsdGlwbHkoJnZzZCwgJnZzbiwgJnZzbSwgZnBzY3IpOworCXZzZC5zaWduID0gdmZwX3NpZ25fbmVnYXRlKHZzZC5zaWduKTsKKwlyZXR1cm4gdmZwX3NpbmdsZV9ub3JtYWxpc2Vyb3VuZChzZCwgJnZzZCwgZnBzY3IsIGV4Y2VwdGlvbnMsICJmbm11bCIpOworfQorCisvKgorICogc2QgPSBzbiArIHNtCisgKi8KK3N0YXRpYyB1MzIgdmZwX3NpbmdsZV9mYWRkKGludCBzZCwgaW50IHNuLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCXN0cnVjdCB2ZnBfc2luZ2xlIHZzZCwgdnNuLCB2c207CisJdTMyIGV4Y2VwdGlvbnM7CisJczMyIG4gPSB2ZnBfZ2V0X2Zsb2F0KHNuKTsKKworCXByX2RlYnVnKCJWRlA6IHMldSA9ICUwOHhcbiIsIHNuLCBuKTsKKworCS8qCisJICogVW5wYWNrIGFuZCBub3JtYWxpc2UgZGVub3JtYWxzLgorCSAqLworCXZmcF9zaW5nbGVfdW5wYWNrKCZ2c24sIG4pOworCWlmICh2c24uZXhwb25lbnQgPT0gMCAmJiB2c24uc2lnbmlmaWNhbmQpCisJCXZmcF9zaW5nbGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2c24pOworCisJdmZwX3NpbmdsZV91bnBhY2soJnZzbSwgbSk7CisJaWYgKHZzbS5leHBvbmVudCA9PSAwICYmIHZzbS5zaWduaWZpY2FuZCkKKwkJdmZwX3NpbmdsZV9ub3JtYWxpc2VfZGVub3JtYWwoJnZzbSk7CisKKwlleGNlcHRpb25zID0gdmZwX3NpbmdsZV9hZGQoJnZzZCwgJnZzbiwgJnZzbSwgZnBzY3IpOworCisJcmV0dXJuIHZmcF9zaW5nbGVfbm9ybWFsaXNlcm91bmQoc2QsICZ2c2QsIGZwc2NyLCBleGNlcHRpb25zLCAiZmFkZCIpOworfQorCisvKgorICogc2QgPSBzbiAtIHNtCisgKi8KK3N0YXRpYyB1MzIgdmZwX3NpbmdsZV9mc3ViKGludCBzZCwgaW50IHNuLCBzMzIgbSwgdTMyIGZwc2NyKQoreworCS8qCisJICogU3VidHJhY3Rpb24gaXMgYWRkaXRpb24gd2l0aCBvbmUgc2lnbiBpbnZlcnRlZC4KKwkgKi8KKwlyZXR1cm4gdmZwX3NpbmdsZV9mYWRkKHNkLCBzbiwgdmZwX3NpbmdsZV9wYWNrZWRfbmVnYXRlKG0pLCBmcHNjcik7Cit9CisKKy8qCisgKiBzZCA9IHNuIC8gc20KKyAqLworc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZkaXYoaW50IHNkLCBpbnQgc24sIHMzMiBtLCB1MzIgZnBzY3IpCit7CisJc3RydWN0IHZmcF9zaW5nbGUgdnNkLCB2c24sIHZzbTsKKwl1MzIgZXhjZXB0aW9ucyA9IDA7CisJczMyIG4gPSB2ZnBfZ2V0X2Zsb2F0KHNuKTsKKwlpbnQgdG0sIHRuOworCisJcHJfZGVidWcoIlZGUDogcyV1ID0gJTA4eFxuIiwgc24sIG4pOworCisJdmZwX3NpbmdsZV91bnBhY2soJnZzbiwgbik7CisJdmZwX3NpbmdsZV91bnBhY2soJnZzbSwgbSk7CisKKwl2c2Quc2lnbiA9IHZzbi5zaWduIF4gdnNtLnNpZ247CisKKwl0biA9IHZmcF9zaW5nbGVfdHlwZSgmdnNuKTsKKwl0bSA9IHZmcF9zaW5nbGVfdHlwZSgmdnNtKTsKKworCS8qCisJICogSXMgbiBhIE5BTj8KKwkgKi8KKwlpZiAodG4gJiBWRlBfTkFOKQorCQlnb3RvIHZzbl9uYW47CisKKwkvKgorCSAqIElzIG0gYSBOQU4/CisJICovCisJaWYgKHRtICYgVkZQX05BTikKKwkJZ290byB2c21fbmFuOworCisJLyoKKwkgKiBJZiBuIGFuZCBtIGFyZSBpbmZpbml0eSwgdGhlIHJlc3VsdCBpcyBpbnZhbGlkCisJICogSWYgbiBhbmQgbSBhcmUgemVybywgdGhlIHJlc3VsdCBpcyBpbnZhbGlkCisJICovCisJaWYgKHRtICYgdG4gJiAoVkZQX0lORklOSVRZfFZGUF9aRVJPKSkKKwkJZ290byBpbnZhbGlkOworCisJLyoKKwkgKiBJZiBuIGlzIGluZmluaXR5LCB0aGUgcmVzdWx0IGlzIGluZmluaXR5CisJICovCisJaWYgKHRuICYgVkZQX0lORklOSVRZKQorCQlnb3RvIGluZmluaXR5OworCisJLyoKKwkgKiBJZiBtIGlzIHplcm8sIHJhaXNlIGRpdjAgZXhjZXB0aW9uCisJICovCisJaWYgKHRtICYgVkZQX1pFUk8pCisJCWdvdG8gZGl2emVybzsKKworCS8qCisJICogSWYgbSBpcyBpbmZpbml0eSwgb3IgbiBpcyB6ZXJvLCB0aGUgcmVzdWx0IGlzIHplcm8KKwkgKi8KKwlpZiAodG0gJiBWRlBfSU5GSU5JVFkgfHwgdG4gJiBWRlBfWkVSTykKKwkJZ290byB6ZXJvOworCisJaWYgKHRuICYgVkZQX0RFTk9STUFMKQorCQl2ZnBfc2luZ2xlX25vcm1hbGlzZV9kZW5vcm1hbCgmdnNuKTsKKwlpZiAodG0gJiBWRlBfREVOT1JNQUwpCisJCXZmcF9zaW5nbGVfbm9ybWFsaXNlX2Rlbm9ybWFsKCZ2c20pOworCisJLyoKKwkgKiBPaywgd2UgaGF2ZSB0d28gbnVtYmVycywgd2UgY2FuIHBlcmZvcm0gZGl2aXNpb24uCisJICovCisJdnNkLmV4cG9uZW50ID0gdnNuLmV4cG9uZW50IC0gdnNtLmV4cG9uZW50ICsgMTI3IC0gMTsKKwl2c20uc2lnbmlmaWNhbmQgPDw9IDE7CisJaWYgKHZzbS5zaWduaWZpY2FuZCA8PSAoMiAqIHZzbi5zaWduaWZpY2FuZCkpIHsKKwkJdnNuLnNpZ25pZmljYW5kID4+PSAxOworCQl2c2QuZXhwb25lbnQrKzsKKwl9CisJdnNkLnNpZ25pZmljYW5kID0gKCh1NjQpdnNuLnNpZ25pZmljYW5kIDw8IDMyKSAvIHZzbS5zaWduaWZpY2FuZDsKKwlpZiAoKHZzZC5zaWduaWZpY2FuZCAmIDB4M2YpID09IDApCisJCXZzZC5zaWduaWZpY2FuZCB8PSAoKHU2NCl2c20uc2lnbmlmaWNhbmQgKiB2c2Quc2lnbmlmaWNhbmQgIT0gKHU2NCl2c24uc2lnbmlmaWNhbmQgPDwgMzIpOworCisJcmV0dXJuIHZmcF9zaW5nbGVfbm9ybWFsaXNlcm91bmQoc2QsICZ2c2QsIGZwc2NyLCAwLCAiZmRpdiIpOworCisgdnNuX25hbjoKKwlleGNlcHRpb25zID0gdmZwX3Byb3BhZ2F0ZV9uYW4oJnZzZCwgJnZzbiwgJnZzbSwgZnBzY3IpOworIHBhY2s6CisJdmZwX3B1dF9mbG9hdChzZCwgdmZwX3NpbmdsZV9wYWNrKCZ2c2QpKTsKKwlyZXR1cm4gZXhjZXB0aW9uczsKKworIHZzbV9uYW46CisJZXhjZXB0aW9ucyA9IHZmcF9wcm9wYWdhdGVfbmFuKCZ2c2QsICZ2c20sICZ2c24sIGZwc2NyKTsKKwlnb3RvIHBhY2s7CisKKyB6ZXJvOgorCXZzZC5leHBvbmVudCA9IDA7CisJdnNkLnNpZ25pZmljYW5kID0gMDsKKwlnb3RvIHBhY2s7CisKKyBkaXZ6ZXJvOgorCWV4Y2VwdGlvbnMgPSBGUFNDUl9EWkM7CisgaW5maW5pdHk6CisJdnNkLmV4cG9uZW50ID0gMjU1OworCXZzZC5zaWduaWZpY2FuZCA9IDA7CisJZ290byBwYWNrOworCisgaW52YWxpZDoKKwl2ZnBfcHV0X2Zsb2F0KHNkLCB2ZnBfc2luZ2xlX3BhY2soJnZmcF9zaW5nbGVfZGVmYXVsdF9xbmFuKSk7CisJcmV0dXJuIEZQU0NSX0lPQzsKK30KKworc3RhdGljIHUzMiAoKiBjb25zdCBmb3BfZm5zWzE2XSkoaW50IHNkLCBpbnQgc24sIHMzMiBtLCB1MzIgZnBzY3IpID0geworCVtGT1BfVE9fSURYKEZPUF9GTUFDKV0JPSB2ZnBfc2luZ2xlX2ZtYWMsCisJW0ZPUF9UT19JRFgoRk9QX0ZOTUFDKV0JPSB2ZnBfc2luZ2xlX2ZubWFjLAorCVtGT1BfVE9fSURYKEZPUF9GTVNDKV0JPSB2ZnBfc2luZ2xlX2Ztc2MsCisJW0ZPUF9UT19JRFgoRk9QX0ZOTVNDKV0JPSB2ZnBfc2luZ2xlX2ZubXNjLAorCVtGT1BfVE9fSURYKEZPUF9GTVVMKV0JPSB2ZnBfc2luZ2xlX2ZtdWwsCisJW0ZPUF9UT19JRFgoRk9QX0ZOTVVMKV0JPSB2ZnBfc2luZ2xlX2ZubXVsLAorCVtGT1BfVE9fSURYKEZPUF9GQUREKV0JPSB2ZnBfc2luZ2xlX2ZhZGQsCisJW0ZPUF9UT19JRFgoRk9QX0ZTVUIpXQk9IHZmcF9zaW5nbGVfZnN1YiwKKwlbRk9QX1RPX0lEWChGT1BfRkRJVildCT0gdmZwX3NpbmdsZV9mZGl2LAorfTsKKworI2RlZmluZSBGUkVHX0JBTksoeCkJKCh4KSAmIDB4MTgpCisjZGVmaW5lIEZSRUdfSURYKHgpCSgoeCkgJiA3KQorCit1MzIgdmZwX3NpbmdsZV9jcGRvKHUzMiBpbnN0LCB1MzIgZnBzY3IpCit7CisJdTMyIG9wID0gaW5zdCAmIEZPUF9NQVNLOworCXUzMiBleGNlcHRpb25zID0gMDsKKwl1bnNpZ25lZCBpbnQgc2QgPSB2ZnBfZ2V0X3NkKGluc3QpOworCXVuc2lnbmVkIGludCBzbiA9IHZmcF9nZXRfc24oaW5zdCk7CisJdW5zaWduZWQgaW50IHNtID0gdmZwX2dldF9zbShpbnN0KTsKKwl1bnNpZ25lZCBpbnQgdmVjaXRyLCB2ZWNsZW4sIHZlY3N0cmlkZTsKKwl1MzIgKCpmb3ApKGludCwgaW50LCBzMzIsIHUzMik7CisKKwl2ZWNsZW4gPSBmcHNjciAmIEZQU0NSX0xFTkdUSF9NQVNLOworCXZlY3N0cmlkZSA9IDEgKyAoKGZwc2NyICYgRlBTQ1JfU1RSSURFX01BU0spID09IEZQU0NSX1NUUklERV9NQVNLKTsKKworCS8qCisJICogSWYgZGVzdGluYXRpb24gYmFuayBpcyB6ZXJvLCB2ZWN0b3IgbGVuZ3RoIGlzIGFsd2F5cyAnMScuCisJICogQVJNIERESTAxMDBGIEM1LjEuMywgQzUuMy4yLgorCSAqLworCWlmIChGUkVHX0JBTksoc2QpID09IDApCisJCXZlY2xlbiA9IDA7CisKKwlwcl9kZWJ1ZygiVkZQOiB2ZWNzdHJpZGU9JXUgdmVjbGVuPSV1XG4iLCB2ZWNzdHJpZGUsCisJCSAodmVjbGVuID4+IEZQU0NSX0xFTkdUSF9CSVQpICsgMSk7CisKKwlmb3AgPSAob3AgPT0gRk9QX0VYVCkgPyBmb3BfZXh0Zm5zW3NuXSA6IGZvcF9mbnNbRk9QX1RPX0lEWChvcCldOworCWlmICghZm9wKQorCQlnb3RvIGludmFsaWQ7CisKKwlmb3IgKHZlY2l0ciA9IDA7IHZlY2l0ciA8PSB2ZWNsZW47IHZlY2l0ciArPSAxIDw8IEZQU0NSX0xFTkdUSF9CSVQpIHsKKwkJczMyIG0gPSB2ZnBfZ2V0X2Zsb2F0KHNtKTsKKwkJdTMyIGV4Y2VwdDsKKworCQlpZiAob3AgPT0gRk9QX0VYVCkKKwkJCXByX2RlYnVnKCJWRlA6IGl0ciVkIChzJXUpID0gb3BbJXVdIChzJXU9JTA4eClcbiIsCisJCQkJIHZlY2l0ciA+PiBGUFNDUl9MRU5HVEhfQklULCBzZCwgc24sIHNtLCBtKTsKKwkJZWxzZQorCQkJcHJfZGVidWcoIlZGUDogaXRyJWQgKHMldSkgPSAocyV1KSBvcFsldV0gKHMldT0lMDh4KVxuIiwKKwkJCQkgdmVjaXRyID4+IEZQU0NSX0xFTkdUSF9CSVQsIHNkLCBzbiwKKwkJCQkgRk9QX1RPX0lEWChvcCksIHNtLCBtKTsKKworCQlleGNlcHQgPSBmb3Aoc2QsIHNuLCBtLCBmcHNjcik7CisJCXByX2RlYnVnKCJWRlA6IGl0ciVkOiBleGNlcHRpb25zPSUwOHhcbiIsCisJCQkgdmVjaXRyID4+IEZQU0NSX0xFTkdUSF9CSVQsIGV4Y2VwdCk7CisKKwkJZXhjZXB0aW9ucyB8PSBleGNlcHQ7CisKKwkJLyoKKwkJICogVGhpcyBlbnN1cmVzIHRoYXQgY29tcGFyaXNvbnMgb25seSBvcGVyYXRlIG9uIHNjYWxhcnM7CisJCSAqIGNvbXBhcmlzb25zIGFsd2F5cyByZXR1cm4gd2l0aCBvbmUgRlBTQ1Igc3RhdHVzIGJpdCBzZXQuCisJCSAqLworCQlpZiAoZXhjZXB0ICYgKEZQU0NSX058RlBTQ1JfWnxGUFNDUl9DfEZQU0NSX1YpKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogQ0hFQ0s6IEl0IGFwcGVhcnMgdG8gYmUgdW5kZWZpbmVkIHdoZXRoZXIgd2Ugc3RvcCB3aGVuCisJCSAqIHdlIGVuY291bnRlciBhbiBleGNlcHRpb24uICBXZSBjb250aW51ZS4KKwkJICovCisKKwkJc2QgPSBGUkVHX0JBTksoc2QpICsgKChGUkVHX0lEWChzZCkgKyB2ZWNzdHJpZGUpICYgNyk7CisJCXNuID0gRlJFR19CQU5LKHNuKSArICgoRlJFR19JRFgoc24pICsgdmVjc3RyaWRlKSAmIDcpOworCQlpZiAoRlJFR19CQU5LKHNtKSAhPSAwKQorCQkJc20gPSBGUkVHX0JBTksoc20pICsgKChGUkVHX0lEWChzbSkgKyB2ZWNzdHJpZGUpICYgNyk7CisJfQorCXJldHVybiBleGNlcHRpb25zOworCisgaW52YWxpZDoKKwlyZXR1cm4gKHUzMiktMTsKK30K