LyoNCglGaWxlOgkJaVR1bmVzQVBJLmgNCgkNCglDb3B5cmlnaHQ6IAmpIENvcHlyaWdodCAyMDAzIEFwcGxlIENvbXB1dGVyLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoJDQoJRGlzY2xhaW1lcjoJSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4NCgkJCQkoIkFwcGxlIikgaW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91cg0KCQkJCXVzZSwgaW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZQ0KCQkJCWNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsDQoJCQkJcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4NCg0KCQkJCUluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QNCgkJCQl0byB0aGVzZSB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMNCgkJCQljb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLA0KCQkJCXJlcHJvZHVjZSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQNCgkJCQltb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlDQoJCQkJdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dCBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4NCgkJCQl0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YNCgkJCQl0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG9yIGxvZ29zIG9mDQoJCQkJQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUNCgkJCQlBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiAgRXhjZXB0IGFzDQoJCQkJZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsDQoJCQkJYXJlIGdyYW50ZWQgYnkgQXBwbGUgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQNCgkJCQltYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUNCgkJCQlTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLg0KDQoJCQkJVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTw0KCQkJCVdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRA0KCQkJCVdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVINCgkJCQlQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUyBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTg0KCQkJCUNPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4NCg0KCQkJCUlOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SDQoJCQkJQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQ0KCQkJCUdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQ0KCQkJCUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTg0KCQkJCU9GIFRIRSBBUFBMRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUDQoJCQkJKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4NCgkJCQlBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCgkJCQkNCiovDQoNCiNpZm5kZWYgSVRVTkVTQVBJX0hfCiNkZWZpbmUgSVRVTkVTQVBJX0hfCgojaW5jbHVkZSA8d2luZG93cy5oPg0KDQojaWYgUFJBR01BX09OQ0UKI3ByYWdtYSBvbmNlCiNlbmRpZgoKdHlwZWRlZiB1bnNpZ25lZCBsb25nCVVJbnQzMjsKdHlwZWRlZiBzaWduZWQgbG9uZwkJU0ludDMyOwp0eXBlZGVmIHVuc2lnbmVkIHNob3J0CVVJbnQxNjsKdHlwZWRlZiBzaWduZWQgc2hvcnQJU0ludDE2Owp0eXBlZGVmCXVuc2lnbmVkIGNoYXIJVUludDg7CnR5cGVkZWYgc2lnbmVkIGNoYXIJCVNJbnQ4OwoKdHlwZWRlZiBVSW50OAkJCVN0cjI1NVsyNTZdOwp0eXBlZGVmIFVJbnQ4CQkJU3RyNjNbNjRdOwp0eXBlZGVmIGNvbnN0IFVJbnQ4ICoJQ29uc3RTdHJpbmdQdHI7CnR5cGVkZWYgVUludDMyCQkJT3B0aW9uQml0czsKdHlwZWRlZiBVSW50MzIJCQlPU1R5cGU7Cgp0eXBlZGVmIFNJbnQzMgkJCU9TU3RhdHVzOwoKdHlwZWRlZiBVSW50MTYJCQlFdmVudEtpbmQ7Cgp0eXBlZGVmIFVJbnQxNiAgICAgICAgICBFdmVudE1vZGlmaWVyczsKCnR5cGVkZWYgVUludDE2CQkJVW5pQ2hhcjsKCnR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSW50NjQ7DQoKdHlwZWRlZiB2b2lkICoqCQkJSGFuZGxlOwoKc3RydWN0IE51bVZlcnNpb24gewoJVUludDgJCQltYWpvclJldjsKCVVJbnQ4CQkJbWlub3JBbmRCdWdSZXY7CglVSW50OAkJCXN0YWdlOwoJVUludDgJCQlub25SZWxSZXY7Cn07CnR5cGVkZWYgc3RydWN0IE51bVZlcnNpb24gTnVtVmVyc2lvbjsKCnN0cnVjdCBQb2ludCB7CiAgICBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgIHY7CiAgICBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgIGg7Cn07CnR5cGVkZWYgc3RydWN0IFBvaW50ICAgICAgICAgICAgICAgICAgICBQb2ludDsKCnN0cnVjdCBFdmVudFJlY29yZCB7CiAgICBFdmVudEtpbmQgICAgICAgICAgICAgICAgICAgICAgIHdoYXQ7CiAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U7CiAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW47CiAgICBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlOwogICAgRXZlbnRNb2RpZmllcnMgICAgICAgICAgICAgICAgICBtb2RpZmllcnM7Cn07CnR5cGVkZWYgc3RydWN0IEV2ZW50UmVjb3JkIEV2ZW50UmVjb3JkOwoKdHlwZWRlZiBVSW50OAkJCUJvb2xlYW47Cgp0eXBlZGVmIFVJbnQzMgkJCVVuc2lnbmVkRml4ZWQ7Cgp0eXBlZGVmIHZvaWQgKgkJCUxvZ2ljYWxBZGRyZXNzOwoKI2RlZmluZQlmYWxzZQkJCTAKI2RlZmluZQl0cnVlCQkJMQojZGVmaW5lCW5pbAkJCQlOVUxMCgplbnVtIHsKCW5vRXJyCQk9IDAsCglwYXJhbUVycgk9IC01MCwKCW1lbUZ1bGxFcnIJPSAtMTA4LAoJdW5pbXBFcnIJPSAtNAp9OwoKc3RydWN0IFJlY3QgewoJc2hvcnQJCQl0b3A7CglzaG9ydAkJCWxlZnQ7CglzaG9ydAkJCWJvdHRvbTsKCXNob3J0CQkJcmlnaHQ7Cn07CnR5cGVkZWYgc3RydWN0IFJlY3QgUmVjdDsKCnN0cnVjdCBTb3VuZENvbXBvbmVudERhdGEgewoJbG9uZwkJCWZsYWdzOwoJT1NUeXBlCQkJZm9ybWF0OwoJc2hvcnQJCQludW1DaGFubmVsczsKCXNob3J0CQkJc2FtcGxlU2l6ZTsKCVVuc2lnbmVkRml4ZWQJc2FtcGxlUmF0ZTsKCWxvbmcJCQlzYW1wbGVDb3VudDsKCVVJbnQ4ICoJCQlidWZmZXI7Cglsb25nCQkJcmVzZXJ2ZWQ7Cn07CnR5cGVkZWYgc3RydWN0IFNvdW5kQ29tcG9uZW50RGF0YSBTb3VuZENvbXBvbmVudERhdGE7CgojZGVmaW5lCVZPTFVNRV9SRUZFUkVOQ0UJCVNJbnQxNgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCiNpZiBQUkFHTUFfU1RSVUNUX0FMSUdOCiAgICAjcHJhZ21hIG9wdGlvbnMgYWxpZ249cG93ZXIKI2VsaWYgUFJBR01BX1NUUlVDVF9QQUNLUFVTSAogICAgI3ByYWdtYSBwYWNrKHB1c2gsIDQpCiNlbGlmIFBSQUdNQV9TVFJVQ1RfUEFDSwogICAgI3ByYWdtYSBwYWNrKDQpCiNlbmRpZgoKCmVudW0gewoJa0lUUGx1Z2luTWFqb3JNZXNzYWdlVmVyc2lvbiA9IDEwLAoJa0lUUGx1Z2luTWlub3JNZXNzYWdlVmVyc2lvbiA9IDUKfTsKCmVudW0gewoJa1RyYWNrU3VwcG9ydHNJRDNUYWdzCQk9ICgxTCA8PCAwKSwKCWtUcmFja0hhc1ZhcmlhYmxlQml0UmF0ZQk9ICgxTCA8PCAxKSwKCWtUcmFja0lzTG9ja2VkCQkJCT0gKDFMIDw8IDMpLAkJLyogRGV2aWNlIHRyYWNrcyBvbmx5LiBUcmFjayBjYW5ub3QgYmUgZGVsZXRlZCBvciByZW5hbWVkICovCglrVHJhY2tDYW5CZURvd25sb2FkZWQJCT0gKDFMIDw8IDQpLAkJLyogRGV2aWNlIHRyYWNrcyBvbmx5LiBUcmFjayBjYW4gYmUgY29waWVkIGZyb20gZGV2aWNlIHRvIGRlc2t0b3AuICovCglrVHJhY2tJc0hpZGRlbgkJCQk9ICgxTCA8PCA1KQkJCS8qIERldmljZSB0cmFja3Mgb25seS4gVHJhY2sgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRldmljZSB3aW5kb3cuICovCn07CnR5cGVkZWYgT3B0aW9uQml0cwlJVFRyYWNrQXR0cmlidXRlczsKCmVudW0gewoJLyoKCQlUaGVzZSBtYXNrIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIElUVHJhY2tJbmZvLnZhbGlkRmllbGRzCgkJdG8gaW5kaWNhdGUgd2hpY2ggZmllbGRzIGNvbnRhaW4gdmFsaWQgZGF0YQoJKi8KCQoJa0lUVElGaWVsZEludmFsaWQJCQkJPSAwLAoJa0lUVElOYW1lRmllbGRNYXNrCQkJCT0gKDFMIDw8IDApLAoJa0lUVElGaWxlTmFtZUZpZWxkTWFzawkJCT0gKDFMIDw8IDEpLAoJa0lUVElBcnRpc3RGaWVsZE1hc2sJCQk9ICgxTCA8PCAyKSwKCWtJVFRJQWxidW1GaWVsZE1hc2sJCQkJPSAoMUwgPDwgMyksCglrSVRUSUdlbnJlRmllbGRNYXNrCQkJCT0gKDFMIDw8IDQpLAoJa0lUVElLaW5kRmllbGRNYXNrCQkJCT0gKDFMIDw8IDUpLAoJa0lUVElUcmFja051bWJlckZpZWxkc01hc2sJCT0gKDFMIDw8IDYpLAoJa0lUVElZZWFyRmllbGRNYXNrCQkJCT0gKDFMIDw8IDcpLAoJa0lUVElTb3VuZFZvbHVtZUZpZWxkTWFzawkJPSAoMUwgPDwgOCksCglrSVRUSUVRUHJlc2V0RmllbGRNYXNrCQkJPSAoMUwgPDwgOSksCglrSVRUSUNvbW1lbnRzRmllbGRNYXNrCQkJPSAoMUwgPDwgMTApLAoJa0lUVElUb3RhbFRpbWVGaWVsZE1hc2sJCQk9ICgxTCA8PCAxMSksCQkJCglrSVRUSVN0YXJ0VGltZUZpZWxkTWFzawkJCT0gKDFMIDw8IDEyKSwKCWtJVFRJU3RvcFRpbWVGaWVsZE1hc2sJCQk9ICgxTCA8PCAxMyksCglrSVRUSVNpemVGaWVsZE1hc2sJCQkJPSAoMUwgPDwgMTQpLAoJa0lUVElCaXRSYXRlRmllbGRNYXNrCQkJPSAoMUwgPDwgMTUpLAoJa0lUVElTYW1wbGVSYXRlRmllbGRNYXNrCQk9ICgxTCA8PCAxNiksCglrSVRUSUF0dHJpYnV0ZXNGaWVsZE1hc2sJCT0gKDFMIDw8IDE3KSwKCWtJVFRJRmlsZVR5cGVGaWVsZE1hc2sJCQk9ICgxTCA8PCAxOCksCglrSVRUSURhdGVGaWVsZE1hc2sJCQkJPSAoMUwgPDwgMTkpLAoJa0lUVElGaWxlQ3JlYXRvckZpZWxkTWFzawkJPSAoMUwgPDwgMjApLAoJa0lUVElDb21wb3NlckZpZWxkTWFzawkJCT0gKDFMIDw8IDIxKSwJLyogQWRkZWQgaW4gaVR1bmVzIDMuMCAqLwoJa0lUVElDb21waWxhdGlvbkZpZWxkTWFzawkJPSAoMUwgPDwgMjIpLAkvKiBBZGRlZCBpbiBpVHVuZXMgMy4wICovCglrSVRUSURpc2NOdW1iZXJGaWVsZHNNYXNrCQk9ICgxTCA8PCAyMyksCS8qIEFkZGVkIGluIGlUdW5lcyAzLjAgKi8KCWtJVFRJVXNlclJhdGluZ0ZpZWxkTWFzawkJPSAoMUwgPDwgMjQpLAkvKiBBZGRlZCBpbiBpVHVuZXMgMy4wICovCglrSVRUSVBsYXlDb3VudEZpZWxkTWFzayAJCT0gKDFMIDw8IDI1KSwJLyogQWRkZWQgaW4gaVR1bmVzIDMuMCAqLwoJa0lUVElMYXN0UGxheURhdGVGaWVsZE1hc2sJCT0gKDFMIDw8IDI2KSwJLyogQWRkZWQgaW4gaVR1bmVzIDMuMCAqLwoJa0lUVElCZWF0c1Blck1pbnV0ZUZpZWxkTWFzawk9ICgxTCA8PCAyNykJLyogQWRkZWQgaW4gaVR1bmVzIDQuMCAqLwp9Owp0eXBlZGVmIE9wdGlvbkJpdHMJSVRUSUZpZWxkTWFzazsKCmVudW0KewoJa0lUVElVc2VyTW9kaWZpYWJsZUZpZWxkc01hc2sgPSBrSVRUSU5hbWVGaWVsZE1hc2sgfCBrSVRUSUFydGlzdEZpZWxkTWFzayB8IGtJVFRJQWxidW1GaWVsZE1hc2sgfCBrSVRUSUdlbnJlRmllbGRNYXNrIHwKCQkJCQkJCQkJCWtJVFRJVHJhY2tOdW1iZXJGaWVsZHNNYXNrIHwga0lUVElZZWFyRmllbGRNYXNrIHwga0lUVElTb3VuZFZvbHVtZUZpZWxkTWFzayB8IGtJVFRJRVFQcmVzZXRGaWVsZE1hc2sgfAoJCQkJCQkJCQkJa0lUVElDb21tZW50c0ZpZWxkTWFzayB8IGtJVFRJU3RhcnRUaW1lRmllbGRNYXNrIHwga0lUVElTdG9wVGltZUZpZWxkTWFzayB8IGtJVFRJQ29tcG9zZXJGaWVsZE1hc2sgfAoJCQkJCQkJCQkJa0lUVElDb21waWxhdGlvbkZpZWxkTWFzayB8IGtJVFRJRGlzY051bWJlckZpZWxkc01hc2sgfCBrSVRUSVVzZXJSYXRpbmdGaWVsZE1hc2sgfCBrSVRUSUJlYXRzUGVyTWludXRlRmllbGRNYXNrCn07Cgp0eXBlZGVmIFVJbnQzMglJVERldmljZUlEOwp0eXBlZGVmIFVJbnQzMglJVERldmljZU1lZGlhSUQ7CnR5cGVkZWYgVUludDMyCUlURGV2aWNlVHJhY2tJRDsKdHlwZWRlZiBVSW50MzIJSVREZXZpY2VQbGF5bGlzdElEOwp0eXBlZGVmIFVJbnQzMglJVERldmljZVBsYXlsaXN0Rm9sZGVySUQ7CnR5cGVkZWYgVUludDMyCUlURGV2aWNlUGxheWxpc3RJdGVtSUQ7Cgp0eXBlZGVmIFVuaUNoYXIgCQlJVFVuaVN0cjI1NVsyNTZdOwkJCQkvKiBTaW1pbGFyIHRvIFN0cjI1NS4gRmlyc3QgZWxlbWVudCBpcyBsZW5ndGggb2Ygc3RyaW5nIGluIGNoYXJhY3RlcnMuICovCnR5cGVkZWYgVW5pQ2hhciAqCQlJVFVuaVN0cmluZ1B0cjsKdHlwZWRlZiBjb25zdCBVbmlDaGFyICoJQ29uc3RJVFVuaVN0cmluZ1B0cjsKCiNkZWZpbmUJa0lURmlsZVNwZWNNYXhQYXRoTGVuZ3RoCShNQVhfUEFUSCAtIDEpCgp0eXBlZGVmIHN0cnVjdCBJVEZpbGVTcGVjCnsKCVVJbnQxNglsZW5ndGg7CQkvLyBMZW5ndGggaW4gY2hhcmFjdGVycwoJVW5pQ2hhcglmdWxsUGF0aFtrSVRGaWxlU3BlY01heFBhdGhMZW5ndGhdOwp9IElURmlsZVNwZWM7CgkKc3RydWN0IElUVHJhY2tJbmZvIHsKCUlUVElGaWVsZE1hc2sJCXZhbGlkRmllbGRzOwoJVUludDMyCQkJCXJlY29yZExlbmd0aDsJCQkJCS8qIFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KCQoJSVRVbmlTdHIyNTUJCQluYW1lOwkKCUlUVW5pU3RyMjU1CQkJZmlsZU5hbWU7CglJVFVuaVN0cjI1NQkJCWFydGlzdDsKCUlUVW5pU3RyMjU1CQkJYWxidW07CglJVFVuaVN0cjI1NQkJCWdlbnJlOwoJSVRVbmlTdHIyNTUJCQlraW5kOwoJSVRVbmlTdHIyNTUJCQllcVByZXNldE5hbWU7CglJVFVuaVN0cjI1NQkJCWNvbW1lbnRzOwoJCglVSW50MzIJCQkJdHJhY2tOdW1iZXI7CglVSW50MzIJCQkJbnVtVHJhY2tzOwoJCQoJVUludDE2CQkJCXllYXI7CglTSW50MTYJCQkJc291bmRWb2x1bWVBZGp1c3RtZW50OwkJCS8qIFZhbGlkIHJhbmdlIGlzIC0yNTUgdG8gKzI1NSAqLwoJCQoJVUludDMyCQkJCXRvdGFsVGltZUluTVM7CglVSW50MzIJCQkJc3RhcnRUaW1lSW5NUzsKCVVJbnQzMgkJCQlzdG9wVGltZUluTVM7CgoJVUludDMyCQkJCWRhdGU7CglVSW50MzIJCQkJc2l6ZUluQnl0ZXM7CgoJVUludDMyCQkJCWJpdFJhdGU7CglVSW50MzIJCQkJc2FtcGxlUmF0ZUZpeGVkOwoKCU9TVHlwZQkJCQlmaWxlVHlwZTsKCU9TVHlwZQkJCQlmaWxlQ3JlYXRvcjsKCQoJSVRUcmFja0F0dHJpYnV0ZXMJYXR0cmlidXRlczsKCUlUVHJhY2tBdHRyaWJ1dGVzCXZhbGlkQXR0cmlidXRlczsJCQkJLyogTWFzayBpbmRpY2F0aW5nIHdoaWNoIGF0dHJpYnV0ZXMgYXJlIGFwcGxpY2FibGUgKi8KCglJVFVuaVN0cjI1NQkJCWNvbXBvc2VyOwkJCQkJCS8qIEFkZGVkIGluIGlUdW5lcyAzLjAgKi8KCQoJQm9vbGVhbgkJCQlpc0NvbXBpbGF0aW9uVHJhY2s7CQkJCS8qIEFkZGVkIGluIGlUdW5lcyAzLjAgKi8KCUJvb2xlYW4JCQkJcmVzZXJ2ZWRCb29sZWFuOwkJCQkvKiBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvLiAqLwoJCglVSW50MTYJCQkJdXNlclJhdGluZzsJCQkJCQkvKiBBZGRlZCBpbiBpVHVuZXMgMy4wLiAwID0gdW5yYXRlZCwgdmFsaWQgdmFsdWVzIGFyZSAyMCwgNDAsIDYwLCA4MCBhbmQgMTAwLiAqLwoKCVVJbnQxNgkJCQlkaXNjTnVtYmVyOwkJCQkJCS8qIEFkZGVkIGluIGlUdW5lcyAzLjAgKi8KCVVJbnQxNgkJCQludW1EaXNjczsJCQkJCQkvKiBBZGRlZCBpbiBpVHVuZXMgMy4wICovCgkKCVVJbnQzMgkJCQlwbGF5Q291bnQ7CQkJCQkJLyogQWRkZWQgaW4gaVR1bmVzIDMuMCAqLwoJVUludDMyCQkJCWxhc3RQbGF5RGF0ZTsJCQkJCS8qIEFkZGVkIGluIGlUdW5lcyAzLjAgKi8KCQoJVUludDE2CQkJCWJlYXRzUGVyTWludXRlOwkJCQkJLyogQWRkZWQgaW4gaVR1bmVzIDQuMCAqLwoJVUludDE2CQkJCXJlc2VydmVkOwkJCQkJCS8qIFJlc2VydmVkLiBNdXN0IGJlIHplcm8uICovCQkKfTsKdHlwZWRlZiBzdHJ1Y3QgSVRUcmFja0luZm8gSVRUcmFja0luZm87CgpzdHJ1Y3QgSVRTdHJlYW1JbmZvIHsKCVNJbnQzMgkJCQl2ZXJzaW9uOwoJSVRVbmlTdHIyNTUJCQlzdHJlYW1UaXRsZTsKCUlUVW5pU3RyMjU1CQkJc3RyZWFtVVJMOwoJSVRVbmlTdHIyNTUJCQlzdHJlYW1NZXNzYWdlOwp9Owp0eXBlZGVmIHN0cnVjdCBJVFN0cmVhbUluZm8gSVRTdHJlYW1JbmZvOwoKZW51bSB7CgkvKiBtZXNzYWdlcyBzZW50IHRvIHBsdWdpbiBtYWluICovCgkKCWtQbHVnaW5Jbml0TWVzc2FnZQkJCQkJPSAnaW5pdCcsCglrUGx1Z2luQ2xlYW51cE1lc3NhZ2UJCQkJPSAnY2xyICcsCglrUGx1Z2luUHJlcGFyZVRvUXVpdE1lc3NhZ2UJCQk9ICdwcnF0JywKCQoJa1BsdWdpbklkbGVNZXNzYWdlCQkJCQk9ICdpZGxlJywKCWtQbHVnaW5Wb2x1bWVNb3VudGVkTWVzc2FnZQkJCT0gJ3ZtbnQnLAoJa1BsdWdpblZvbHVtZVVubW91bnRlZE1lc3NhZ2UJCT0gJ3Z1bm0nLAoJa1BsdWdpblZvbHVtZVJlbmFtZWRNZXNzYWdlCQkJPSAndm5hbScKfTsKCgplbnVtIHsKCS8qIFBsdWdpbkluaXRNZXNzYWdlLm9wdGlvbnMgKi8KCQoJa1BsdWdpbldhbnRzSWRsZU1lc3NhZ2VzCT0gKDFMIDw8IDEpLAkvKiBTZW5kIGlkbGUgbWVzc2FnZXMgdG8gcGx1Z2luIG1haW4gKi8KCWtQbHVnaW5XYW50c1RvQmVMZWZ0T3Blbgk9ICgxTCA8PCAyKSwJLyogRG9uJ3QgY2xvc2UgdGhpcyBwbHVnaW4ganVzdCBiZWNhdXNlIGl0IGRpZG4ndCByZWdpc3RlciBhbnlvbmUgKi8KCWtQbHVnaW5XYW50c1ZvbHVtZU1lc3NhZ2VzCT0gKDFMIDw8IDMpCQkvKiBUaGUgcGx1Z2luIHdhbnRzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdm9sdW1lcyBhcmUgbW91bnRlZC91bm1vdW50ZWQvcmVuYW1lZCAqLwp9OwoKCmVudW0gewoJLyogaVR1bmVzIEFQSSBtZXNzYWdlcyAqLwoKCWtQbGF5ZXJSZWdpc3RlclZpc3VhbFBsdWdpbk1lc3NhZ2UJPSAncnZpcycsCS8qIFJlZ2lzdGVyIGEgdmlzdWFsIHBsdWdpbiAqLwoJa1BsYXllclJlZ2lzdGVyRGV2aWNlUGx1Z2luTWVzc2FnZQk9ICdyZGV2JywJLyogUmVnaXN0ZXIgYSBkZXZpY2UgcGx1Z2luICovCgkKCS8qIEF2YWlsYWJsZSBmb3IgYWxsIHBsdWdpbnMgKi8KCglrUGxheWVyVW5yZWdpc3RlclBsdWdpbk1lc3NhZ2UJCT0gJ3VucmcnLAkvKiBVbnJlZ2lzdGVyIHRoZSBwbHVnaW4gdGhpcyBjb21lcyBmcm9tICovCglrUGxheWVySWRsZU1lc3NhZ2UJCQkJCT0gJ2lkbGUnLAkvKiBHaXZlIGlUdW5lcyBzb21lIHRpbWUgKi8KCQoJa1BsYXllclNob3dBYm91dE1lc3NhZ2UJCQkJPSAnYWJvdScsCS8qIFNob3cgdGhlIGFib3V0IGJveC4gKi8KCWtQbGF5ZXJPcGVuVVJMTWVzc2FnZQkJCQk9ICd1cmwgJywJLyogT3BlbiBhIFVSTCAqLwoKCWtQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZQkJCT0gJ3NwcmYnLAkvKiBTZXQgcGx1Z2luIHByZWZlcmVuY2VzICovCglrUGxheWVyR2V0UGx1Z2luRGF0YU1lc3NhZ2UJCQk9ICdncHJmJywJLyogR2V0IHBsdWdpbiBwcmVmZXJlbmNlcyAqLwoJCglrUGxheWVyU2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZQk9ICdzbnByJywJLyogU2V0IHBsdWdpbiBuYW1lZCBwcmVmZXJlbmVzICovCglrUGxheWVyR2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZQk9ICdnbnByJywJLyogR2V0IHBsdWdpbiBuYW1lZCBwcmVmZXJlbmVzICovCgkKCWtQbGF5ZXJHZXRGaWxlVHJhY2tJbmZvTWVzc2FnZQkJPSAnZ2Z0aScsCS8qIFF1ZXJ5IGlUdW5lcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlICovIAoJa1BsYXllclNldEZpbGVUcmFja0luZm9NZXNzYWdlCQk9ICdzZnRpJywJLyogQXNrIGlUdW5lcyB0byBzZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlICovIAoJCglrUGxheWVyR2V0SVRUcmFja0luZm9TaXplTWVzc2FnZQk9ICdpdHN6JywJLyogUXVlcnkgaVR1bmVzIGZvciB0aGUgc2l6ZW9mKElUVHJhY2tJbmZvKS4gVGhpcyBhbGxvd3MgbmV3ZXIgcGx1Z2lucyB0byBjb3JyZWN0bHkgd29ya2Qgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBpVHVuZXMuICovCgoJa1BsYXllckhhbmRsZU1hY09TRXZlbnRNZXNzYWdlCQk9ICdldm50JywJLyogVGVsbCBwbGF5ZXIgdG8gaGFuZGxlIHVuaGFuZGxlZCBldmVudCAqLwoJa1BsYXllckdldFBsdWdpbklURmlsZVNwZWNNZXNzYWdlCT0gJ2l0ZnMnLAkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBwbHVnaW4gZXhlY3V0YWJsZSAoaVR1bmVzIDQuMSBvciBsYXRlcikgKi8KCQoJLyogQXZhaWxhYmxlIGZvciB2aXN1YWwgcGx1Z2lucyAqLwoKCWtQbGF5ZXJTZXRGdWxsU2NyZWVuTWVzc2FnZQkJCT0gJ3NmdWwnLAkvKiBTZXQgZnVsbCBzY3JlZW4gbW9kZSAqLwoJa1BsYXllclNldEZ1bGxTY3JlZW5PcHRpb25zTWVzc2FnZQk9ICdzZm9wJywJLyogU2V0IGZ1bGwgc2NyZWVuIG9wdGlvbnMgKi8KCWtQbGF5ZXJHZXRDdXJyZW50VHJhY2tDb3ZlckFydE1lc3NhZ2UgPSAnY292cicsCS8qIEdldCBjdXJyZW50IHBsYXllciB0cmFjayBjb3ZlciBhcnR3b3JrICovCgkKCS8qIEF2YWlsYWJsZSBmb3IgZGV2aWNlIHBsdWdpbnMgKi8KCglrUGxheWVyU2V0RGV2aWNlU2VyaWFsTnVtYmVyTWVzc2FnZSA9ICdkdnNuJywJLyogU2V0IGEgc2VyaWFsIG51bWJlciBzdHJpbmcgZm9yIGEgZGV2aWNlLiBOZWVkZWQgZm9yIHBlci1kZXZpY2UgcHJlZnMgKi8KCWtQbGF5ZXJSZWZyZXNoRGV2aWNlTWVkaWFNZXNzYWdlCT0gJ3JlZm0nLAkvKiBUZWxsIGlUdW5lcyB0byByZWZyZXNoIChlbnVtZXJhdGUpIHRoZSBjb250ZW50cyBvZiBhIHNpbmdsZSBtZWRpYSBtb2R1bGUgb24gYSBkZXZpY2UgKi8KCWtQbGF5ZXJSZWZyZXNoQWxsRGV2aWNlTWVkaWFNZXNzYWdlID0gJ3JlZmEnCS8qIFRlbGwgaVR1bmVzIHRvIHJlZnJlc2ggKGVudW1lcmF0ZSkgdGhlIGNvbnRlbnRzIG9mIGFsbCBtZWRpYSBtb2R1bGVzIG9uIGEgZGV2aWNlICovCn07CgpzdHJ1Y3QgUGxheWVyTWVzc2FnZUluZm87Cgp0eXBlZGVmIE9TU3RhdHVzICgqSVRBcHBQcm9jUHRyKSh2b2lkICphcHBDb29raWUsIE9TVHlwZSBtZXNzYWdlLCBzdHJ1Y3QgUGxheWVyTWVzc2FnZUluZm8gKm1lc3NhZ2VJbmZvKTsKCgovKgoJUGx1Z2luIG1haW4gTWVzc2FnZXMKKi8KCnN0cnVjdCBQbHVnaW5Jbml0TWVzc2FnZSB7CglVSW50MzIJCQkJCQkJbWFqb3JWZXJzaW9uOwkJCS8qIElucHV0ICovCglVSW50MzIJCQkJCQkJbWlub3JWZXJzaW9uOwkJCS8qIElucHV0ICovCgoJdm9pZCAqCQkJCQkJCWFwcENvb2tpZTsJCQkJLyogSW5wdXQgKi8KCUlUQXBwUHJvY1B0cgkJCQkJYXBwUHJvYzsJCQkJLyogSW5wdXQgKi8KCQoJT3B0aW9uQml0cwkJCQkJCW9wdGlvbnM7CQkJCS8qIE91dHB1dCwgc2VlIGFib3ZlIGZvciB2YWx1ZXMgKi8KCXZvaWQgKgkJCQkJCQlyZWZDb247CQkJCQkvKiBPdXRwdXQgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGx1Z2luSW5pdE1lc3NhZ2UgUGx1Z2luSW5pdE1lc3NhZ2U7CgpzdHJ1Y3QgUGx1Z2luVm9sdW1lTW91bnRlZE1lc3NhZ2UgewoJVk9MVU1FX1JFRkVSRU5DRQkJCQl2UmVmTnVtOwkJCQkvKiBJbnB1dCAqLwoJVUludDMyCQkJCQkJCXZvbHVtZUlEOwkJCQkvKiBJbnB1dCAqLwoJQ29uc3RJVFVuaVN0cmluZ1B0cgkJCQl2b2x1bWVOYW1lOwkJCQkvKiBJbnB1dCAqLwkJCQp9Owp0eXBlZGVmIHN0cnVjdCBQbHVnaW5Wb2x1bWVNb3VudGVkTWVzc2FnZSBQbHVnaW5Wb2x1bWVNb3VudGVkTWVzc2FnZTsKCnN0cnVjdCBQbHVnaW5Wb2x1bWVVbm1vdW50ZWRNZXNzYWdlIHsKCVVJbnQzMgkJCQkJCQl2b2x1bWVJRDsJCQkJLyogSW5wdXQgKi8KCUNvbnN0SVRVbmlTdHJpbmdQdHIJCQkJdm9sdW1lTmFtZTsJCQkJLyogSW5wdXQgKi8JCQkKfTsKdHlwZWRlZiBzdHJ1Y3QgUGx1Z2luVm9sdW1lVW5tb3VudGVkTWVzc2FnZSBQbHVnaW5Wb2x1bWVVbm1vdW50ZWRNZXNzYWdlOwoKc3RydWN0IFBsdWdpblZvbHVtZVJlbmFtZWRNZXNzYWdlIHsKCVZPTFVNRV9SRUZFUkVOQ0UJCQkJdlJlZk51bTsJCQkJLyogSW5wdXQgKi8KCVVJbnQzMgkJCQkJCQl2b2x1bWVJRDsJCQkJLyogSW5wdXQgKi8KCUNvbnN0SVRVbmlTdHJpbmdQdHIJCQkJbmV3Vm9sdW1lTmFtZTsJCQkvKiBJbnB1dCAqLwkJCQp9Owp0eXBlZGVmIHN0cnVjdCBQbHVnaW5Wb2x1bWVSZW5hbWVkTWVzc2FnZSBQbHVnaW5Wb2x1bWVSZW5hbWVkTWVzc2FnZTsKCnN0cnVjdCBQbHVnaW5NZXNzYWdlSW5mbyB7Cgl1bmlvbiB7CgkJUGx1Z2luSW5pdE1lc3NhZ2UJCQkJaW5pdE1lc3NhZ2U7CgkJUGx1Z2luVm9sdW1lTW91bnRlZE1lc3NhZ2UJCXZvbHVtZU1vdW50ZWRNZXNzYWdlOwoJCVBsdWdpblZvbHVtZVVubW91bnRlZE1lc3NhZ2UJdm9sdW1lVW5tb3VudGVkTWVzc2FnZTsKCQlQbHVnaW5Wb2x1bWVSZW5hbWVkTWVzc2FnZQkJdm9sdW1lUmVuYW1lZE1lc3NhZ2U7Cgl9IHU7Cn07CnR5cGVkZWYgc3RydWN0IFBsdWdpbk1lc3NhZ2VJbmZvIFBsdWdpbk1lc3NhZ2VJbmZvOwoKc3RydWN0IFZpc3VhbFBsdWdpbk1lc3NhZ2VJbmZvOwpzdHJ1Y3QgRGV2aWNlUGx1Z2luTWVzc2FnZUluZm87CgovKiBQbHVnaW4gbWFpbiBlbnRyeSBwb2ludCBtZXNzYWdlIGhhbmRsZXIgKi8KdHlwZWRlZiBPU1N0YXR1cyAoKlBsdWdpblByb2NQdHIpKE9TVHlwZSBtZXNzYWdlLCBQbHVnaW5NZXNzYWdlSW5mbyAqbWVzc2FnZUluZm8sIHZvaWQgKnJlZkNvbik7CgovKiBWaXN1YWwgcGx1Z2luIG1lc3NhZ2UgaGFuZGxlciAqLwp0eXBlZGVmIE9TU3RhdHVzICgqVmlzdWFsUGx1Z2luUHJvY1B0cikoT1NUeXBlIG1lc3NhZ2UsIHN0cnVjdCBWaXN1YWxQbHVnaW5NZXNzYWdlSW5mbyAqbWVzc2FnZUluZm8sIHZvaWQgKnJlZkNvbik7CgovKiBEZXZpY2UgcGx1Z2luIG1lc3NhZ2UgaGFuZGxlciAqLwp0eXBlZGVmIE9TU3RhdHVzICgqRGV2aWNlUGx1Z2luUHJvY1B0cikoT1NUeXBlIG1lc3NhZ2UsIHN0cnVjdCBEZXZpY2VQbHVnaW5NZXNzYWdlSW5mbyAqbWVzc2FnZUluZm8sIHZvaWQgKnJlZkNvbik7CgoKCi8qCglDYWxsYmFja3MgdG8gaVR1bmVzCiovCgplbnVtIHsKCS8qIFBsYXllclJlZ2lzdGVyVmlzdWFsUGx1Z2luTWVzc2FnZS5vcHRpb25zICovCgkKCWtWaXN1YWxXYW50c0lkbGVNZXNzYWdlcwkJCT0gKDFMIDw8IDMpLAoJa1Zpc3VhbFdhbnRzQ29uZmlndXJlCQkJCT0gKDFMIDw8IDUpCn07CgpzdHJ1Y3QgUGxheWVyUmVnaXN0ZXJWaXN1YWxQbHVnaW5NZXNzYWdlIHsKCS8qIElucHV0IGZyb20gcGx1Z2luICovCgkKCVN0cjYzCQkJCQkJCW5hbWU7CQkJCQkJLyogRGlzcGxheWVkIGluIHRoZSBWaXN1YWwgbWVudSAqLwoJT3B0aW9uQml0cwkJCQkJCW9wdGlvbnM7CQkJCQkvKiBTZWUgYWJvdmUgKi8KCQoJT1NUeXBlCQkJCQkJCWNyZWF0b3I7CQkJCQkvKiBJZGVudGlmaWVzIHRoZSBwbHVnaW4gKi8KCQoJTnVtVmVyc2lvbgkJCQkJCXBsdWdpblZlcnNpb247CQkJCS8qIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBwbHVnaW4gKi8KCglWaXN1YWxQbHVnaW5Qcm9jUHRyCQkJCWhhbmRsZXI7CQkJCQkvKiBIYW5kbGVyIGZvciB0aGUgcGx1Z2luJ3MgbWVzc2FnZXMgKi8KCXZvaWQgKgkJCQkJCQlyZWdpc3RlclJlZkNvbjsJCQkJLyogUmVmQ29uIGZvciB0aGUgcGx1Z2luJ3MgaGFuZGxlciAqLwoKCVVJbnQzMgkJCQkJCQl0aW1lQmV0d2VlbkRhdGFJbk1TOwkJLyogSG93IG9mdGVuIHRvIGNhbGwgdGhlIHBsdWdpbiAoMHhGRkZGRkZGRiA9IGFzIG9mdGVuIGFzIHBvc3NpYmxlKSAqLwoJVUludDMyCQkJCQkJCW51bVdhdmVmb3JtQ2hhbm5lbHM7CQkvKiAwLTIgd2F2ZWZvcm1zIHJlcXVlc3RlZCAqLwoJVUludDMyCQkJCQkJCW51bVNwZWN0cnVtQ2hhbm5lbHM7CQkvKiAwLTIgc3BlY3RydW1zIHJlcXVlc3RlZCAqLwoJCglTSW50MTYJCQkJCQkJbWluV2lkdGg7CQkJCQkvKiBNaW5pbXVtIHJlc2l6ZWFibGUgd2lkdGggKi8KCVNJbnQxNgkJCQkJCQltaW5IZWlnaHQ7CQkJCQkvKiBNaW5pbXVtIHJlc2l6ZWFibGUgaGVpZ2h0ICovCgkKCVNJbnQxNgkJCQkJCQltYXhXaWR0aDsJCQkJCS8qIE1heGltdW0gcmVzaXplYWJsZSB3aWR0aCAqLwoJU0ludDE2CQkJCQkJCW1heEhlaWdodDsJCQkJCS8qIE1heGltdW0gcmVzaXplYWJsZSBoZWlnaHQgKi8KCQkKCVVJbnQxNgkJCQkJCQltaW5GdWxsU2NyZWVuQml0RGVwdGg7CQkvKiAwID0gQW55ICovCglVSW50MTYJCQkJCQkJbWF4RnVsbFNjcmVlbkJpdERlcHRoOwkJLyogMCA9IEFueSAqLwoJCglVSW50MTYJCQkJCQkJd2luZG93QWxpZ25tZW50SW5CeXRlczsJCS8qIFJlc2VydmVkIChzaG91bGQgYmUgemVybykgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyUmVnaXN0ZXJWaXN1YWxQbHVnaW5NZXNzYWdlIFBsYXllclJlZ2lzdGVyVmlzdWFsUGx1Z2luTWVzc2FnZTsKCmVudW0gewoJLyogUGxheWVyUmVnaXN0ZXJEZXZpY2VQbHVnaW5NZXNzYWdlLm9wdGlvbnMgKi8KCQoJa0RldmljZVdhbnRzSWRsZU1lc3NhZ2VzID0gKDFMIDw8IDApCn07CgpzdHJ1Y3QgUGxheWVyUmVnaXN0ZXJEZXZpY2VQbHVnaW5NZXNzYWdlIHsKCS8qIElucHV0IGZyb20gcGx1Z2luICovCgkKCVN0cjYzCQkJCQkJCW5hbWU7CQkJCQkJLyogVXNlZCBpbnRlcm5hbGx5LiBOb3QgY3VycmVudGx5IGRpc3BsYXllZCAqLwoJT3B0aW9uQml0cwkJCQkJCW9wdGlvbnM7CQkJCQkvKiBTZWUgYWJvdmUgKi8KCQoJTnVtVmVyc2lvbgkJCQkJCXBsdWdpblZlcnNpb247CQkJCS8qIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBwbHVnaW4gKi8KCglEZXZpY2VQbHVnaW5Qcm9jUHRyCQkJCWhhbmRsZXI7CQkJCQkvKiBIYW5kbGVyIGZvciB0aGUgcGx1Z2luJ3MgbWVzc2FnZXMgKi8KCXZvaWQgKgkJCQkJCQlyZWdpc3RlclJlZkNvbjsJCQkJLyogUmVmQ29uIGZvciB0aGUgcGx1Z2luJ3MgaGFuZGxlciAqLwoJCglVSW50MzIJCQkJCQkJcmVzZXJ2ZWRbMl07CQkJCS8qIE11c3QgYmUgemVybyAqLwp9Owp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJSZWdpc3RlckRldmljZVBsdWdpbk1lc3NhZ2UgUGxheWVyUmVnaXN0ZXJEZXZpY2VQbHVnaW5NZXNzYWdlOwoKc3RydWN0IFBsYXllclNldEZ1bGxTY3JlZW5NZXNzYWdlIHsKCUJvb2xlYW4JCQkJCQkJZnVsbFNjcmVlbjsKfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyU2V0RnVsbFNjcmVlbk1lc3NhZ2UgUGxheWVyU2V0RnVsbFNjcmVlbk1lc3NhZ2U7CgpzdHJ1Y3QgUGxheWVyU2V0RnVsbFNjcmVlbk9wdGlvbnNNZXNzYWdlIHsKCVNJbnQxNgkJCQkJCQltaW5CaXREZXB0aDsJCQkJLyogMCA9IEFueSAqLwoJU0ludDE2CQkJCQkJCW1heEJpdERlcHRoOwkJCQkvKiAwID0gQW55ICovCglTSW50MTYJCQkJCQkJcHJlZmVycmVkQml0RGVwdGg7CQkJLyogMCA9IEN1cnJlbnQgKi8KCQoJU0ludDE2CQkJCQkJCWRlc2lyZWRXaWR0aDsJCQkJLyogTXVzdCBiZSB3aXRoaW4gbWluV2lkdGggJiBtYXhXaWR0aCAqLwoJU0ludDE2CQkJCQkJCWRlc2lyZWRIZWlnaHQ7CQkJCS8qIE11c3QgYmUgd2l0aGluIG1pbkhlaWdodCAmIG1heEhlaWdodCAqLwp9Owp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJTZXRGdWxsU2NyZWVuT3B0aW9uc01lc3NhZ2UgUGxheWVyU2V0RnVsbFNjcmVlbk9wdGlvbnNNZXNzYWdlOwoKc3RydWN0IFBsYXllckdldEN1cnJlbnRUcmFja0NvdmVyQXJ0TWVzc2FnZSB7CglIYW5kbGUJCQkJCQljb3ZlckFydDsJCS8qIG91dHB1dCAtIGNsaWVudCBtdXN0IGRpc3Bvc2UgKi8KCU9TVHlwZQkJCQkJCWNvdmVyQXJ0Rm9ybWF0OwkvKiBvdXRwdXQgLSBmb3JtYXQgb2YgY292ZXIgYXJ0ICovCn07CnR5cGVkZWYgc3RydWN0IFBsYXllckdldEN1cnJlbnRUcmFja0NvdmVyQXJ0TWVzc2FnZSBQbGF5ZXJHZXRDdXJyZW50VHJhY2tDb3ZlckFydE1lc3NhZ2U7CgpzdHJ1Y3QgUGxheWVyT3BlblVSTE1lc3NhZ2UgewoJU0ludDggKgkJCQkJCQl1cmw7CglVSW50MzIJCQkJCQkJbGVuZ3RoOwp9Owp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJPcGVuVVJMTWVzc2FnZSBQbGF5ZXJPcGVuVVJMTWVzc2FnZTsKCnN0cnVjdCBQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZSB7Cgl2b2lkICoJCQkJCQkJZGF0YVB0cjsJCS8qIElucHV0ICovCglVSW50MzIJCQkJCQkJZGF0YVNpemU7CQkvKiBJbnB1dCAqLwp9Owp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZSBQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZTsKCnN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5EYXRhTWVzc2FnZSB7Cgl2b2lkICoJCQkJCQkJZGF0YVB0cjsJCS8qIElucHV0ICovCglVSW50MzIJCQkJCQkJZGF0YUJ1ZmZlclNpemU7CS8qIElucHV0ICovCgkKCVVJbnQzMgkJCQkJCQlkYXRhU2l6ZTsJCS8qIE91dHB1dCAqLwp9Owp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5EYXRhTWVzc2FnZSBQbGF5ZXJHZXRQbHVnaW5EYXRhTWVzc2FnZTsKCnN0cnVjdCBQbGF5ZXJTZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlIHsKCUNvbnN0U3RyaW5nUHRyCQkJCQlkYXRhTmFtZTsJCS8qIElucHV0ICovCgoJdm9pZCAqCQkJCQkJCWRhdGFQdHI7CQkvKiBJbnB1dCAqLwoJVUludDMyCQkJCQkJCWRhdGFTaXplOwkJLyogSW5wdXQgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyU2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZSBQbGF5ZXJTZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlOwoKc3RydWN0IFBsYXllckdldFBsdWdpbk5hbWVkRGF0YU1lc3NhZ2UgewoJQ29uc3RTdHJpbmdQdHIJCQkJCWRhdGFOYW1lOwkJLyogSW5wdXQgKi8KCgl2b2lkICoJCQkJCQkJZGF0YVB0cjsJCS8qIElucHV0ICovCglVSW50MzIJCQkJCQkJZGF0YUJ1ZmZlclNpemU7CS8qIElucHV0ICovCgkKCVVJbnQzMgkJCQkJCQlkYXRhU2l6ZTsJCS8qIE91dHB1dCAqLwp9Owp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlIFBsYXllckdldFBsdWdpbk5hbWVkRGF0YU1lc3NhZ2U7CgpzdHJ1Y3QgUGxheWVySGFuZGxlTWFjT1NFdmVudE1lc3NhZ2UgewoJY29uc3QgRXZlbnRSZWNvcmQgKgkJCQl0aGVFdmVudDsJCS8qIElucHV0ICovCgkKCUJvb2xlYW4JCQkJCQkJaGFuZGxlZDsJCS8qIE91dHB1dCAqLwp9Owp0eXBlZGVmIHN0cnVjdCBQbGF5ZXJIYW5kbGVNYWNPU0V2ZW50TWVzc2FnZSBQbGF5ZXJIYW5kbGVNYWNPU0V2ZW50TWVzc2FnZTsKCnN0cnVjdCBQbGF5ZXJHZXRQbHVnaW5JVEZpbGVTcGVjTWVzc2FnZSB7CglJVEZpbGVTcGVjICoJCQkJCWZpbGVTcGVjOwkJLyogT3V0cHV0ICovCn07CnR5cGVkZWYgc3RydWN0IFBsYXllckdldFBsdWdpbklURmlsZVNwZWNNZXNzYWdlIFBsYXllckdldFBsdWdpbklURmlsZVNwZWNNZXNzYWdlOwoKc3RydWN0IFBsYXllclNldERldmljZVNlcmlhbE51bWJlck1lc3NhZ2UgewoJQ29uc3RTdHJpbmdQdHIJCQkJCXNlcmlhbE51bWJlcjsJLyogSW5wdXQgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyU2V0RGV2aWNlU2VyaWFsTnVtYmVyTWVzc2FnZSBQbGF5ZXJTZXREZXZpY2VTZXJpYWxOdW1iZXJNZXNzYWdlOwoKc3RydWN0IFBsYXllclJlZnJlc2hEZXZpY2VNZWRpYU1lc3NhZ2UgewoJSVREZXZpY2VNZWRpYUlECQkJCQltZWRpYUlEOwkJLyogSW5wdXQgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyUmVmcmVzaERldmljZU1lZGlhTWVzc2FnZSBQbGF5ZXJSZWZyZXNoRGV2aWNlTWVkaWFNZXNzYWdlOwoKc3RydWN0IFBsYXllckdldEZpbGVUcmFja0luZm9NZXNzYWdlIHsKCWNvbnN0IElURmlsZVNwZWMgKgkJCQlmaWxlU3BlYzsJCS8qIElucHV0ICovCglJVFRyYWNrSW5mbyAqCQkJCQl0cmFja0luZm87CQkvKiBPdXRwdXQgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyR2V0RmlsZVRyYWNrSW5mb01lc3NhZ2UgUGxheWVyR2V0RmlsZVRyYWNrSW5mb01lc3NhZ2U7CgpzdHJ1Y3QgUGxheWVyU2V0RmlsZVRyYWNrSW5mb01lc3NhZ2UgewoJY29uc3QgSVRGaWxlU3BlYyAqCQkJCWZpbGVTcGVjOwkJLyogSW5wdXQgKi8KCWNvbnN0IElUVHJhY2tJbmZvICoJCQkJdHJhY2tJbmZvOwkJLyogSW5wdXQgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyU2V0RmlsZVRyYWNrSW5mb01lc3NhZ2UgUGxheWVyU2V0RmlsZVRyYWNrSW5mb01lc3NhZ2U7CgpzdHJ1Y3QgUGxheWVyR2V0SVRUcmFja0luZm9TaXplTWVzc2FnZSB7CglVSW50MzIJCQkJCQkJaXRUcmFja0luZm9TaXplOwkvKiBPdXRwdXQgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgUGxheWVyR2V0SVRUcmFja0luZm9TaXplTWVzc2FnZSBQbGF5ZXJHZXRJVFRyYWNrSW5mb1NpemVNZXNzYWdlOwoKc3RydWN0IFBsYXllck1lc3NhZ2VJbmZvIHsKCVVJbnQzMgkJCQkJCQkJCW1lc3NhZ2VNYWpvclZlcnNpb247CQkvKiBTaG91bGQgYmUga0lUQ3VycmVudFBsdWdpbk1ham9yTWVzc2FnZVZlcnNpb24gKi8KCVVJbnQzMgkJCQkJCQkJCW1lc3NhZ2VNaW5vclZlcnNpb247CQkvKiBTaG91bGQgYmUga0lUQ3VycmVudFBsdWdpbk1pbm9yTWVzc2FnZVZlcnNpb24gKi8KCVVJbnQzMgkJCQkJCQkJCW1lc3NhZ2VJbmZvU2l6ZTsJCQkvKiBTaG91bGQgYmUgc2l6ZW9mKFBsYXllck1lc3NhZ2VJbmZvKSAqLwoJCgl1bmlvbiB7CgkJUGxheWVyUmVnaXN0ZXJWaXN1YWxQbHVnaW5NZXNzYWdlCXJlZ2lzdGVyVmlzdWFsUGx1Z2luTWVzc2FnZTsKCQlQbGF5ZXJSZWdpc3RlckRldmljZVBsdWdpbk1lc3NhZ2UJcmVnaXN0ZXJEZXZpY2VQbHVnaW5NZXNzYWdlOwoKCQlQbGF5ZXJPcGVuVVJMTWVzc2FnZQkJCQlvcGVuVVJMTWVzc2FnZTsKCQkKCQlQbGF5ZXJTZXRQbHVnaW5EYXRhTWVzc2FnZQkJCXNldFBsdWdpbkRhdGFNZXNzYWdlOwoJCVBsYXllckdldFBsdWdpbkRhdGFNZXNzYWdlCQkJZ2V0UGx1Z2luRGF0YU1lc3NhZ2U7CgkJCgkJUGxheWVyU2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZQkJc2V0UGx1Z2luTmFtZWREYXRhTWVzc2FnZTsKCQlQbGF5ZXJHZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlCQlnZXRQbHVnaW5OYW1lZERhdGFNZXNzYWdlOwoJCQoJCVBsYXllclNldEZ1bGxTY3JlZW5NZXNzYWdlCQkJCXNldEZ1bGxTY3JlZW5NZXNzYWdlOwoJCVBsYXllclNldEZ1bGxTY3JlZW5PcHRpb25zTWVzc2FnZQkJc2V0RnVsbFNjcmVlbk9wdGlvbnNNZXNzYWdlOwoJCVBsYXllckdldEN1cnJlbnRUcmFja0NvdmVyQXJ0TWVzc2FnZQlnZXRDdXJyZW50VHJhY2tDb3ZlckFydE1lc3NhZ2U7CgkJCgkJUGxheWVyU2V0RGV2aWNlU2VyaWFsTnVtYmVyTWVzc2FnZQlzZXREZXZpY2VTZXJpYWxOdW1iZXJNZXNzYWdlOwoJCVBsYXllclJlZnJlc2hEZXZpY2VNZWRpYU1lc3NhZ2UJCXJlZnJlc2hEZXZpY2VNZWRpYU1lc3NhZ2U7CgkJCgkJUGxheWVyR2V0RmlsZVRyYWNrSW5mb01lc3NhZ2UJCWdldEZpbGVUcmFja0luZm9NZXNzYWdlOwoJCVBsYXllclNldEZpbGVUcmFja0luZm9NZXNzYWdlCQlzZXRGaWxlVHJhY2tJbmZvTWVzc2FnZTsKCQlQbGF5ZXJHZXRJVFRyYWNrSW5mb1NpemVNZXNzYWdlCQlnZXRJVFRyYWNrSW5mb1NpemVNZXNzYWdlOwoKCQlQbGF5ZXJIYW5kbGVNYWNPU0V2ZW50TWVzc2FnZQkJaGFuZGxlTWFjT1NFdmVudE1lc3NhZ2U7CgkJUGxheWVyR2V0UGx1Z2luSVRGaWxlU3BlY01lc3NhZ2UJZ2V0UGx1Z2luSVRGaWxlU3BlY01lc3NhZ2U7Cgl9IHU7Cn07CnR5cGVkZWYgc3RydWN0IFBsYXllck1lc3NhZ2VJbmZvIFBsYXllck1lc3NhZ2VJbmZvOwoKZXh0ZXJuIE9TU3RhdHVzIElUQ2FsbEFwcGxpY2F0aW9uICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCBPU1R5cGUgbWVzc2FnZSwgUGxheWVyTWVzc2FnZUluZm8gKm1lc3NhZ2VJbmZvKTsKZXh0ZXJuIHZvaWQJCVNldE51bVZlcnNpb24gKE51bVZlcnNpb24gKm51bVZlcnNpb24sIFVJbnQ4IG1ham9yUmV2LCBVSW50OCBtaW5vckFuZEJ1Z1JldiwgVUludDggc3RhZ2UsIFVJbnQ4IG5vblJlbFJldik7CgoKLyogZm9yIHVzZSBmcm9tIHBsdWdpbiBtYWluICovCgpleHRlcm4gT1NTdGF0dXMgUGxheWVyUmVnaXN0ZXJWaXN1YWxQbHVnaW4gKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIFBsYXllck1lc3NhZ2VJbmZvICptZXNzYWdlSW5mbyk7CgovKiBGb3IgYWxsIHBsdWdpbnMgKi8KCmV4dGVybiBPU1N0YXR1cwlQbGF5ZXJVbnJlZ2lzdGVyUGx1Z2luICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCBQbGF5ZXJNZXNzYWdlSW5mbyAqbWVzc2FnZUluZm8pOwpleHRlcm4gT1NTdGF0dXMgUGxheWVySWRsZSAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYyk7CgpleHRlcm4gdm9pZAkJUGxheWVyU2hvd0Fib3V0ICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jKTsKZXh0ZXJuIHZvaWQJCVBsYXllck9wZW5VUkwgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIFNJbnQ4ICpzdHJpbmcsIFVJbnQzMiBsZW5ndGgpOwoKZXh0ZXJuIE9TU3RhdHVzCVBsYXllckdldFBsdWdpbkRhdGEgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIHZvaWQgKmRhdGFQdHIsIFVJbnQzMiBkYXRhQnVmZmVyU2l6ZSwgVUludDMyICpkYXRhU2l6ZSk7CmV4dGVybiBPU1N0YXR1cwlQbGF5ZXJTZXRQbHVnaW5EYXRhICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCB2b2lkICpkYXRhUHRyLCBVSW50MzIgZGF0YVNpemUpOwoKZXh0ZXJuIE9TU3RhdHVzCVBsYXllckdldFBsdWdpbk5hbWVkRGF0YSAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYywgQ29uc3RTdHJpbmdQdHIgZGF0YU5hbWUsIHZvaWQgKmRhdGFQdHIsIFVJbnQzMiBkYXRhQnVmZmVyU2l6ZSwgVUludDMyICpkYXRhU2l6ZSk7CmV4dGVybiBPU1N0YXR1cwlQbGF5ZXJTZXRQbHVnaW5OYW1lZERhdGEgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIENvbnN0U3RyaW5nUHRyIGRhdGFOYW1lLCB2b2lkICpkYXRhUHRyLCBVSW50MzIgZGF0YVNpemUpOwoKZXh0ZXJuIE9TU3RhdHVzCVBsYXllckdldEZpbGVUcmFja0luZm8gKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIGNvbnN0IElURmlsZVNwZWMgKmZpbGVTcGVjLCBJVFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKZXh0ZXJuIE9TU3RhdHVzCVBsYXllclNldEZpbGVUcmFja0luZm8gKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIGNvbnN0IElURmlsZVNwZWMgKmZpbGVTcGVjLCBjb25zdCBJVFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKCmV4dGVybiBPU1N0YXR1cyBQbGF5ZXJHZXRJVFRyYWNrSW5mb1NpemUgKHZvaWQgKmFwcENvb2tpZSwgSVRBcHBQcm9jUHRyIGFwcFByb2MsIFVJbnQzMiBhcHBQbHVnaW5NYWpvclZlcnNpb24sIFVJbnQzMiBhcHBQbHVnaW5NaW5vclZlcnNpb24sIFVJbnQzMiAqaXRUcmFja0luZm9TaXplKTsKCmV4dGVybiBPU1N0YXR1cyBQbGF5ZXJIYW5kbGVNYWNPU0V2ZW50ICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCBjb25zdCBFdmVudFJlY29yZCAqdGhlRXZlbnQsIEJvb2xlYW4gKmV2ZW50SGFuZGxlZCk7CgpleHRlcm4gT1NTdGF0dXMJUGxheWVyR2V0UGx1Z2luSVRGaWxlU3BlYyAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYywgSVRGaWxlU3BlYyAqcGx1Z2luRmlsZVNwZWMpOwoKLyogRm9yIHZpc3VhbCBwbHVnaW5zICovCgpleHRlcm4gT1NTdGF0dXMgUGxheWVyU2V0RnVsbFNjcmVlbiAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYywgQm9vbGVhbiBmdWxsU2NyZWVuKTsKZXh0ZXJuIE9TU3RhdHVzIFBsYXllclNldEZ1bGxTY3JlZW5PcHRpb25zICh2b2lkICphcHBDb29raWUsIElUQXBwUHJvY1B0ciBhcHBQcm9jLCBTSW50MTYgbWluQml0RGVwdGgsIFNJbnQxNiBtYXhCaXREZXB0aCwgU0ludDE2IHByZWZlcnJlZEJpdERlcHRoLCBTSW50MTYgZGVzaXJlZFdpZHRoLCBTSW50MTYgZGVzaXJlZEhlaWdodCk7CmV4dGVybiBPU1N0YXR1cyBQbGF5ZXJHZXRDdXJyZW50VHJhY2tDb3ZlckFydCAodm9pZCAqYXBwQ29va2llLCBJVEFwcFByb2NQdHIgYXBwUHJvYywgSGFuZGxlICpjb3ZlckFydCwgT1NUeXBlICpjb3ZlckFydEZvcm1hdCk7CgojaWYgUFJBR01BX1NUUlVDVF9BTElHTgogICAgI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CiNlbGlmIFBSQUdNQV9TVFJVQ1RfUEFDS1BVU0gKICAgICNwcmFnbWEgcGFjayhwb3ApCiNlbGlmIFBSQUdNQV9TVFJVQ1RfUEFDSwogICAgI3ByYWdtYSBwYWNrKCkKI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiBJVFVORVNBUElfSF8gKi8K