IC8qCiAqIERFQyA5MyBFcmlrIEJvcyA8ZXJpa0B4czRhbGwubmw+CiAqCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKgogKiBNYXIgMywgMTk5OS4gT3ZlIEvldmVuIDxvdmVrQGFyY3RpY25ldC5ubz4KICogLSBVc2UgcG9ydCBpbmRpY2VzIGluc3RlYWQgb2YgdW5peGZkcyBmb3Igd2luMTYKICogLSBNb3ZlZCB0aGluZ3MgYXJvdW5kIChzZXBhcmF0ZWQgd2luMTYgYW5kIHdpbjMyIHJvdXRpbmVzKQogKiAtIEFkZGVkIHNvbWUgaGludHMgb24gaG93IHRvIGltcGxlbWVudCBidWZmZXJzIGFuZCBFbmFibGVDb21tTm90aWZpY2F0aW9uLgogKgogKiBNYXkgMjYsIDE5OTcuICBGaXhlcyBhbmQgY29tbWVudHMgYnkgUmljayBSaWNoYXJkc29uIDxyaWNrQGRnaWkuY29tPiBbUkVSXQogKiAtIHB0ci0+ZmQgd2Fzbid0IGdldHRpbmcgY2xlYXJlZCBvbiBjbG9zZS4KICogLSBHZXRDb21tRXZlbnRNYXNrKCkgYW5kIEdldENvbW1FcnJvcigpIGRpZG4ndCBkbyBtdWNoIG9mIGFueXRoaW5nLgogKiAgIElNSE8sIHRoZXkgYXJlIHN0aWxsIHdyb25nLCBidXQgdGhleSBhdCBsZWFzdCBpbXBsZW1lbnQgdGhlIFJYQ0hBUgogKiAgIGV2ZW50IGFuZCByZXR1cm4gSS9PIHF1ZXVlIHNpemVzLCB3aGljaCBtYWtlcyB0aGUgYXBwIEknbSBpbnRlcmVzdGVkCiAqICAgaW4gKGFuYWxvZyBkZXZpY2VzIEVaS0lUIERTUCBkZXZlbG9wbWVudCBzeXN0ZW0pIHdvcmsuCiAqCiAqIEF1Z3VzdCAxMiwgMTk5Ny4gIFRha2UgYSBiYXNoIGF0IFNldENvbW1FdmVudE1hc2sgLSBMYXdzb24gV2hpdG5leQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIEp1bHkgNiwgMTk5OC4gRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFZhbGVudGlqbiBTZXNzaW5rCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2c2Vzc2lua0BpYy51dmEubmw+IFtWXQogKiAgSSBvbmx5IHF1aWNrLWZpeGVkIGFuIGVycm9yIGZvciB0aGUgb3V0cHV0IGJ1ZmZlcnMuIFRoZSB0aGluZyBpcyB0aGlzOiBpZiBhCiAqIFdpbkFwcCBzdGFydHMgdXNpbmcgc2VyaWFsIHBvcnRzLCBpdCBjYWxscyBPcGVuQ29tbSwgYXNraW5nIGl0IHRvIG9wZW4gdHdvCiAqIGJ1ZmZlcnMsIGNiSW5RdWV1ZSBhbmQgY2JPdXRRdWV1ZSBzaXplLCB0byBob2xkIGRhdGEgdG8vZnJvbSB0aGUgc2VyaWFsCiAqIHBvcnRzLiBXaW5lIE9wZW5Db21tIG9ubHkgcmV0dXJucyAiT0siLiBOb3cgdGhlIGtlcm5lbCBidWZmZXIgc2l6ZSBmb3IKICogc2VyaWFsIGNvbW11bmljYXRpb24gaXMgb25seSA0MDk2IGJ5dGVzIGxhcmdlLiBFcnJvcjogKEFwcCBhc2tzIGZvcgogKiBhIDEwNCwwMDAgYnl0ZXMgc2l6ZSBidWZmZXIsIFdpbmUgcmV0dXJucyAiT0siLCBBcHAgYXNrcyAiSG93IG1hbnkgY2hhcidzCiAqIGFyZSBpbiB0aGUgYnVmZmVyIiwgV2luZSByZXR1cm5zICI0MDAwIiBhbmQgQXBwIHRoaW5rcyAiT0ssIGFub3RoZXIKICogMTAwLDAwMCBjaGFycyBsZWZ0LCBnb29kISIpCiAqIFRoZSBzb2x1dGlvbiBiZWxvdyBpcyBhIGJhZCBidXQgd29ya2luZyBxdWlja2ZpeCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlcjoKICogdGhlIGNiSW5RdWV1ZSBpcyBzYXZlZCBpbiBhIHZhcmlhYmxlOyB3aGVuIHRoZSBwcm9ncmFtIGFza3MgaG93IG1hbnkgY2hhcnMKICogdGhlcmUgYXJlIGluIHRoZSBidWZmZXIsIEdldENvbW1FcnJvciByZXR1cm5zICMgaW4gYnVmZmVyIFBMVVMKICogdGhlIGFkZGl0aW9uYWwgKGNiT3V0UWV1ZXUgLSA0MDk2KSwgd2hpY2ggbGVhdmVzIHRoZSBhcHBsaWNhdGlvbiB0aGlua2luZwogKiAid293LCBhbG1vc3QgZnVsbCIuCiAqIFNvcnJ5IGZvciB0aGUgcmF0aGVyIGNoYXR0eSBleHBsYW5hdGlvbiAtIGJ1dCBJIHRoaW5rIGNvbW0uYyBuZWVkcyB0byBiZQogKiByZWRlZmluZWQgd2l0aCByZWFsIHdvcmtpbmcgYnVmZmVycyBtYWtlIGl0IHdvcms7IG1heWJlIHRoZXNlIGNvbW1lbnRzIGFyZQogKiBvZiBoZWxwLgogKiBPa3RvYmVyIDk4LCBSZWluIEtsYXplcyBbUkhLXQogKiBBIHByb2dyYW0gdGhhdCB3YW50cyB0byBtb25pdG9yIHRoZSBtb2RlbSBzdGF0dXMgbGluZSAoUkxTRC9EQ0QpIG1heQogKiBwb2xsIHRoZSBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgaW4gdGhlIGNvbW1NYXNrIHN0cnVjdHVyZS4gSSB1cGRhdGUgdGhlIGJpdAogKiBpbiBHZXRDb21tRXJyb3IsIHdhaXRpbmcgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIGNvbW11bmljYXRpb24gZXZlbnRzLgogKiAKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx0ZXJtaW9zLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpZmRlZiBIQVZFX1NUUklOR1NfSAojIGluY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAiY29tbS5oIgojaWZkZWYgSEFWRV9TWVNfTU9ERU1fSAojIGluY2x1ZGUgPHN5cy9tb2RlbS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NUUlRJT19ICiMgaW5jbHVkZSA8c3lzL3N0cnRpby5oPgojZW5kaWYKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgIm9wdGlvbnMuaCIKCiNpbmNsdWRlICJzZXJ2ZXIvcmVxdWVzdC5oIgojaW5jbHVkZSAic2VydmVyLmgiCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAiYXN5bmMuaCIKCiNpbmNsdWRlICJkZWJ1Zy5oIgoKI2lmbmRlZiBUSU9DSU5RCiNkZWZpbmUJVElPQ0lOUSBGSU9OUkVBRAojZW5kaWYKI2RlZmluZSBDT01NX01TUl9PRkZTRVQgIDM1ICAgICAgIC8qIHNlZSBrbm93bGVkZ2UgYmFzZSBRMTAxNDE3ICovCgovKgogKiBbVl0gSWYgYWJvdmUgZ2xvYmFscyBhcmUgd3JvbmcsIHRoZSBvbmUgYmVsb3cgd2lsbCBiZSB3cm9uZyBhcyB3ZWxsLiBJdAogKiBzaG91bGQgcHJvYmFibHkgYmUgaW4gdGhlIERvc0RldmljZVN0cnVjdCBvbiBwZXIgcG9ydCBiYXNpcyB0b28uCiovCmludCBpR2xvYmFsT3V0UXVldWVGaWxsZXI7CgojZGVmaW5lIFNFUklBTF9YTUlUX1NJWkUgNDA5NgoKc3RydWN0IERvc0RldmljZVN0cnVjdCBDT01bTUFYX1BPUlRTXTsKc3RydWN0IERvc0RldmljZVN0cnVjdCBMUFRbTUFYX1BPUlRTXTsKLyogcG9pbnRlcnMgdG8gdW5rbm93big9PXVuZG9jdW1lbnRlZCkgY29tbSBzdHJ1Y3R1cmUgKi8gCkxQQ1ZPSUQgKnVua25vd25bTUFYX1BPUlRTXTsKLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZXMgKi8Kc3RhdGljIHN0cnVjdCB0ZXJtaW9zIG1fc3RhdFtNQVhfUE9SVFNdOwoKdm9pZCBDT01NX0luaXQodm9pZCkKewoJaW50IHg7CgljaGFyIG9wdGlvblsxMF0sIHRlbXBbMjU2XSwgKmJ0ZW1wOwoJc3RydWN0IHN0YXQgc3Q7CgoJZm9yICh4PTA7IHghPU1BWF9QT1JUUzsgeCsrKSB7CgkJc3RyY3B5KG9wdGlvbiwiQ09NeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAic2VyaWFscG9ydHMiLCBvcHRpb24sICIqIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgc2l6ZW9mKHRlbXApICk7CgkJaWYgKCFzdHJjbXAodGVtcCwgIioiKSB8fCAqdGVtcCA9PSAnXDAnKSAKCQkJQ09NW3hdLmRldmljZW5hbWUgPSBOVUxMOwoJCWVsc2UgewoJCSAgCWJ0ZW1wID0gc3RyY2hyKHRlbXAsJywnKTsKCQkJaWYgKGJ0ZW1wICE9IE5VTEwpIHsKCQkJICAJKmJ0ZW1wKysgPSAnXDAnOwoJCQkJQ09NW3hdLmJhdWRyYXRlID0gYXRvaShidGVtcCk7CgkJCX0gZWxzZSB7CgkJCQlDT01beF0uYmF1ZHJhdGUgPSAtMTsKCQkJfQoJCQlzdGF0KHRlbXAsICZzdCk7CgkJCWlmICghU19JU0NIUihzdC5zdF9tb2RlKSkgCgkJCQlXQVJOKGNvbW0sIkNhbid0IHVzZSBgJXMnIGFzICVzICFcbiIsIHRlbXAsIG9wdGlvbik7CgkJCWVsc2UKCQkJCWlmICgoQ09NW3hdLmRldmljZW5hbWUgPSBtYWxsb2Moc3RybGVuKHRlbXApKzEpKSA9PSBOVUxMKSAKCQkJCQlXQVJOKGNvbW0sIkNhbid0IG1hbGxvYyBmb3IgZGV2aWNlIGluZm8hXG4iKTsKCQkJCWVsc2UgewoJCQkJCUNPTVt4XS5mZCA9IDA7CgkJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJCX0KICAgICAgICAgICAgICAgIFRSQUNFKGNvbW0sICIlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicGFyYWxsZWxwb3J0cyIsIG9wdGlvbiwgIioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBzaXplb2YodGVtcCkgKTsKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpCgkJCUxQVFt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTihjb21tLCJDYW4ndCB1c2UgYCVzJyBhcyAlcyAhXG4iLCB0ZW1wLCBvcHRpb24pOwoJCQllbHNlIAoJCQkJaWYgKChMUFRbeF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJCVdBUk4oY29tbSwiQ2FuJ3QgbWFsbG9jIGZvciBkZXZpY2UgaW5mbyFcbiIpOwoJCQkJZWxzZSB7CgkJCQkJTFBUW3hdLmZkID0gMDsKCQkJCQlzdHJjcHkoTFBUW3hdLmRldmljZW5hbWUsIHRlbXApOwoJCQkJfQogICAgICAgICAgICAgICAgVFJBQ0UoY29tbSwgIiVzID0gJXNcbiIsIG9wdGlvbiwgTFBUW3hdLmRldmljZW5hbWUpOwoJCX0KCgl9Cn0KCgpzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3RfZmQoaW50IGZkKQp7CglpbnQgeDsKCglmb3IgKHg9MDsgeCE9TUFYX1BPUlRTOyB4KyspIHsKCSAgICBpZiAoQ09NW3hdLmZkID09IGZkKQoJCXJldHVybiAmQ09NW3hdOwoJICAgIGlmIChMUFRbeF0uZmQgPT0gZmQpCgkJcmV0dXJuICZMUFRbeF07Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKkdldERldmljZVN0cnVjdChpbnQgZmQpCnsKCWlmICgoZmQmMHg3Rik8PU1BWF9QT1JUUykgewogICAgICAgICAgICBpZiAoIShmZCYweDgwKSkgewoJCWlmIChDT01bZmRdLmZkKQoJCSAgICByZXR1cm4gJkNPTVtmZF07CgkgICAgfSBlbHNlIHsKCQlpZiAoTFBUW2ZkXS5mZCkKCQkgICAgcmV0dXJuICZMUFRbZmRdOwoJICAgIH0KCX0KCglyZXR1cm4gTlVMTDsKfQoKaW50ICAgIEdldENvbW1Qb3J0X2ZkKGludCBmZCkKewogICAgICAgIGludCB4OwogICAgICAgIAogICAgICAgIGZvciAoeD0wOyB4PE1BWF9QT1JUUzsgeCsrKSB7CiAgICAgICAgICAgICBpZiAoQ09NW3hdLmZkID09IGZkKQogICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgfQogICAgICAgCiAgICAgICByZXR1cm4gLTE7Cn0gCgppbnQgVmFsaWRDT01Qb3J0KGludCB4KQp7CglyZXR1cm4oeCA8IE1BWF9QT1JUUyA/IChpbnQpIENPTVt4XS5kZXZpY2VuYW1lIDogMCk7IAp9CgppbnQgVmFsaWRMUFRQb3J0KGludCB4KQp7CglyZXR1cm4oeCA8IE1BWF9QT1JUUyA/IChpbnQpIExQVFt4XS5kZXZpY2VuYW1lIDogMCk7IAp9CgppbnQgV2luRXJyb3Iodm9pZCkKewogICAgICAgIFRSQUNFKGNvbW0sICJlcnJubyA9ICVkXG4iLCBlcnJubyk7Cglzd2l0Y2ggKGVycm5vKSB7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIENFX0lPRTsKCQl9Cn0KCnN0YXRpYyB2b2lkIFdJTkVfVU5VU0VEIGNvbW1fbm90aWZpY2F0aW9uKGludCBmZCx2b2lkKnByaXZhdGUpCnsKICAgIC8qIGluIGhlcmUsIHdlIG5lZWQgdG86CiAgICAgICAxLiByZWFkIGFueSBkYXRhIGZyb20gdGhlIGNvbW0gcG9ydAogICAgICAgMi4gc2F2ZSBpdCBpbnRvIG91ciBvd24gaW50ZXJuYWwgYnVmZmVycwogICAgICAgICAgKHdlIG5lZWQgb3VyIG93biBidWZmZXJzIHRvIGltcGxlbWVudCBub3RpZmljYXRpb25zIHByb3Blcmx5ISkKICAgICAgIDMuIHdyaXRlIGRhdGEgZnJvbSBvdXIgb3duIGludGVybmFsIGJ1ZmZlcnMgdG8gdGhlIGNvbW0gcG9ydAogICAgICAgNC4gaWYgd25kIGlzIHNldCwgc2VuZCBXTV9DT01NTk9USUZZICh1c2luZyBQb3N0TWVzc2FnZSkgd2hlbgogICAgICAgICAgdGhyZXNob2xkcyBzZXQgYnkgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbiBhcmUgcGFzc2VkICovCiAgICAgICAgICAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCCQkoVVNFUi4yMTMpCiAqLwpCT09MMTYgV0lOQVBJIEJ1aWxkQ29tbURDQjE2KExQQ1NUUiBkZXZpY2UsIExQRENCMTYgbHBkY2IpCnsKCS8qICJDT00xOjk2MDAsbiw4LDEiCSovCgkvKiAgMDEyMzQ1CQkqLwoJaW50IHBvcnQ7CgljaGFyICpwdHIsIHRlbXBbMjU2XTsKCglUUkFDRShjb21tLCAiKCVzKSwgcHRyICVwXG4iLCBkZXZpY2UsIGxwZGNiKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCQoKCQlpZiAocG9ydC0tID09IDApIHsKCQkJRVJSKGNvbW0sICJCVUcgISBDT00wIGNhbid0IGV4aXN0IS5cbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkgewoJCQlyZXR1cm4gLTE7CgkJfQoJCQoJCW1lbXNldChscGRjYiwgMCwgc2l6ZW9mKERDQjE2KSk7IC8qIGluaXRpYWxpemUgKi8KCgkJbHBkY2ItPklkID0gcG9ydDsKCQkKCQlpZiAoISooZGV2aWNlKzQpKQoJCQlyZXR1cm4gMDsKCgkJaWYgKCooZGV2aWNlKzQpICE9ICc6JykKCQkJcmV0dXJuIC0xOwoJCQoJCXN0cmNweSh0ZW1wLGRldmljZSs1KTsKCQlwdHIgPSBzdHJ0b2sodGVtcCwgIiwgIik7IAoKCQlpZiAoQ09NW3BvcnRdLmJhdWRyYXRlID4gMCkKCQkJbHBkY2ItPkJhdWRSYXRlID0gQ09NW3BvcnRdLmJhdWRyYXRlOwoJCWVsc2UKCQkJbHBkY2ItPkJhdWRSYXRlID0gYXRvaShwdHIpOwogICAgICAgIAlUUkFDRShjb21tLCJiYXVkcmF0ZSAoJWQpXG4iLCBscGRjYi0+QmF1ZFJhdGUpOwoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7CgkJaWYgKGlzbG93ZXIoKnB0cikpCgkJCSpwdHIgPSB0b3VwcGVyKCpwdHIpOwoKICAgICAgICAJVFJBQ0UoY29tbSwicGFyaXR5ICglYylcbiIsICpwdHIpOwoJCWxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKCQlzd2l0Y2ggKCpwdHIpIHsKCQkJY2FzZSAnTic6CgkJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCQlscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJ0UnOgoJCQkJbHBkY2ItPlBhcml0eSA9IEVWRU5QQVJJVFk7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnTSc6CgkJCQlscGRjYi0+UGFyaXR5ID0gTUFSS1BBUklUWTsKCQkJCWJyZWFrOwkJCQoJCQljYXNlICdPJzoKCQkJCWxwZGNiLT5QYXJpdHkgPSBPRERQQVJJVFk7CgkJCQlicmVhazsJCQkKCQkJZGVmYXVsdDoKCQkJCVdBUk4oY29tbSwiVW5rbm93biBwYXJpdHkgYCVjJyFcbiIsICpwdHIpOwoJCQkJcmV0dXJuIC0xOwoJCX0KCgkJcHRyID0gc3RydG9rKE5VTEwsICIsICIpOyAKICAgICAgICAgCVRSQUNFKGNvbW0sICJjaGFyc2l6ZSAoJWMpXG4iLCAqcHRyKTsKCQlscGRjYi0+Qnl0ZVNpemUgPSAqcHRyIC0gJzAnOwoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7CiAgICAgICAgCVRSQUNFKGNvbW0sICJzdG9wYml0cyAoJWMpXG4iLCAqcHRyKTsKCQlzd2l0Y2ggKCpwdHIpIHsKCQkJY2FzZSAnMSc6CgkJCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJzInOgoJCQkJbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgkJCQlicmVhazsJCQkKCQkJZGVmYXVsdDoKCQkJCVdBUk4oY29tbSwiVW5rbm93biAjIG9mIHN0b3BiaXRzIGAlYychXG4iLCAqcHRyKTsKCQkJCXJldHVybiAtMTsKCQl9Cgl9CQoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJT3BlbkNvbW0JCShVU0VSLjIwMCkKICovCklOVDE2IFdJTkFQSSBPcGVuQ29tbTE2KExQQ1NUUiBkZXZpY2UsVUlOVDE2IGNiSW5RdWV1ZSxVSU5UMTYgY2JPdXRRdWV1ZSkKewoJaW50IHBvcnQsZmQ7CgogICAgCVRSQUNFKGNvbW0sICIlcywgJWQsICVkXG4iLCBkZXZpY2UsIGNiSW5RdWV1ZSwgY2JPdXRRdWV1ZSk7CgoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiQ09NIiwzKSkgewoJCXBvcnQgPSBkZXZpY2VbM10gLSAnMCc7CgoJCWlmIChwb3J0LS0gPT0gMCkgewoJCQlFUlIoY29tbSwgIkJVRyAhIENPTTAgZG9lc24ndCBleGlzdCAhXG4iKTsKCQl9CgkJCgkJLyogdG8gaGVscCBHZXRDb21tRXJyb3IgcmV0dXJuIGxlZnQgYnVmZnNpemUgW1ZdICovCgkJaUdsb2JhbE91dFF1ZXVlRmlsbGVyID0gKGNiT3V0UXVldWUgLSBTRVJJQUxfWE1JVF9TSVpFKTsKCQlpZiAoaUdsb2JhbE91dFF1ZXVlRmlsbGVyIDwgMCkgaUdsb2JhbE91dFF1ZXVlRmlsbGVyID0gMDsKCiAgICAgICAgICAgICAgICBUUkFDRShjb21tLCAiJXMgPSAlc1xuIiwgZGV2aWNlLCBDT01bcG9ydF0uZGV2aWNlbmFtZSk7CgoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKSB7CgkJCXJldHVybiBJRV9CQURJRDsKCQl9CgkJaWYgKENPTVtwb3J0XS5mZCkgewoJCQlyZXR1cm4gSUVfT1BFTjsKCQl9CgoJCWZkID0gb3BlbihDT01bcG9ydF0uZGV2aWNlbmFtZSwgT19SRFdSIHwgT19OT05CTE9DSyk7CgkJaWYgKGZkID09IC0xKSB7CgkJCXJldHVybiBXaW5FcnJvcigpOwoJCX0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25bcG9ydF0gPSBTRUdQVFJfQUxMT0MoNDApOwogICAgICAgICAgICAgICAgICAgICAgICBiemVybyh1bmtub3duW3BvcnRdLDQwKTsKCQkJQ09NW3BvcnRdLmZkID0gZmQ7CgkJCUNPTVtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlDT01bcG9ydF0uZXZlbnRtYXNrID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICB0Y2dldGF0dHIoZmQsJm1fc3RhdFtwb3J0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYoQ09NW3BvcnRdLmJhdWRyYXRlPi0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQjE2IGRjYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbW1TdGF0ZTE2KHBvcnQsICZkY2IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNiLkJhdWRSYXRlPUNPTVtwb3J0XS5iYXVkcmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vcmUgZGVmYXVsdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkYXRhYml0cywgcGFyaXR5LCBzdG9wYml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRDb21tU3RhdGUxNiggJmRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KI2lmIDAKCQkJLyogYWxsb2NhdGUgYnVmZmVycyAqLwoJCQkvKiAuLi4gKi8KCQkJLyogZW5hYmxlIGFzeW5jIG5vdGlmaWNhdGlvbnMgKi8KCQkJQVNZTkNfUmVnaXN0ZXJGRChDT01bcG9ydF0uZmQsY29tbV9ub3RpZmljYXRpb24sJkNPTVtwb3J0XSk7CiNlbmRpZgoJCQlyZXR1cm4gcG9ydDsKCQl9Cgl9IAoJZWxzZSAKCWlmICghbHN0cm5jbXBpQShkZXZpY2UsIkxQVCIsMykpIHsKCQlwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoJCgkJaWYgKHBvcnQtLSA9PSAwKSB7CgkJCUVSUihjb21tLCAiQlVHICEgTFBUMCBkb2Vzbid0IGV4aXN0ICFcbiIpOwoJCX0KCgkJaWYgKCFWYWxpZExQVFBvcnQocG9ydCkpIHsKCQkJcmV0dXJuIElFX0JBRElEOwoJCX0JCQoJCWlmIChMUFRbcG9ydF0uZmQpIHsKCQkJcmV0dXJuIElFX09QRU47CgkJfQoKCQlmZCA9IG9wZW4oTFBUW3BvcnRdLmRldmljZW5hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0ssIDApOwoJCWlmIChmZCA9PSAtMSkgewoJCQlyZXR1cm4gV2luRXJyb3IoKTsKCQl9IGVsc2UgewoJCQlMUFRbcG9ydF0uZmQgPSBmZDsKCQkJTFBUW3BvcnRdLmNvbW1lcnJvciA9IDA7CgkJCUxQVFtwb3J0XS5ldmVudG1hc2sgPSAwOwoJCQlyZXR1cm4gcG9ydHwweDgwOwoJCX0KCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xvc2VDb21tCQkoVVNFUi4yMDcpCiAqLwpJTlQxNiBXSU5BUEkgQ2xvc2VDb21tMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgCiAgICAJVFJBQ0UoY29tbSwiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCWlmICghKGNpZCYweDgwKSkgewoJCS8qIENPTSBwb3J0ICovCgkJU0VHUFRSX0ZSRUUodW5rbm93bltjaWRdKTsgLyogW0xXXSAqLwojaWYgMAoJCS8qIGRpc2FibGUgYXN5bmMgbm90aWZpY2F0aW9ucyAqLwoJCUFTWU5DX1VucmVnaXN0ZXJGRChDT01bY2lkXS5mZCxjb21tX25vdGlmaWNhdGlvbik7CgkJLyogZnJlZSBidWZmZXJzICovCgkJLyogLi4uICovCiNlbmRpZgoJCS8qIHJlc2V0IG1vZGVtIGxpbmVzICovCgkJdGNzZXRhdHRyKHB0ci0+ZmQsVENTQU5PVywmbV9zdGF0W2NpZF0pOwoJfQoKCWlmIChjbG9zZShwdHItPmZkKSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQkvKiBGSVhNRTogc2hvdWxkIHdlIGNsZWFyIHB0ci0+ZmQgaGVyZT8gKi8KCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlwdHItPmZkID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1CcmVhawkJKFVTRVIuMjEwKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKGNvbW0sImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJcHRyLT5zdXNwZW5kZWQgPSAxOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1CcmVhawkJKFVTRVIuMjExKQogKi8KSU5UMTYgV0lOQVBJIENsZWFyQ29tbUJyZWFrMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKGNvbW0sImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJcHRyLT5zdXNwZW5kZWQgPSAwOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKFVTRVIuMjE0KQogKi8KTE9ORyBXSU5BUEkgRXNjYXBlQ29tbUZ1bmN0aW9uMTYoVUlOVDE2IGNpZCxVSU5UMTYgbkZ1bmN0aW9uKQp7CglpbnQJbWF4OwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCiAgICAJVFJBQ0UoY29tbSwiY2lkPSVkLCBmdW5jdGlvbj0lZFxuIiwgY2lkLCBuRnVuY3Rpb24pOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCWlmICh0Y2dldGF0dHIocHRyLT5mZCwmcG9ydCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvcj1XaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CgoJc3dpdGNoIChuRnVuY3Rpb24pIHsKCQljYXNlIFJFU0VUREVWOgoJCQlicmVhazsJCQkJCQoKCQljYXNlIEdFVE1BWENPTToKCQkJZm9yIChtYXggPSBNQVhfUE9SVFM7IUNPTVttYXhdLmRldmljZW5hbWU7bWF4LS0pCgkJCQk7CgkJCXJldHVybiBtYXg7CgkJCWJyZWFrOwoKCQljYXNlIEdFVE1BWExQVDoKCQkJZm9yIChtYXggPSBNQVhfUE9SVFM7IUxQVFttYXhdLmRldmljZW5hbWU7bWF4LS0pCgkJCQk7CgkJCXJldHVybiAweDgwICsgbWF4OwoJCQlicmVhazsKCiNpZmRlZiBUSU9DTV9EVFIKCQljYXNlIENMUkRUUjoKCQkJcG9ydC5jX2NmbGFnICY9IFRJT0NNX0RUUjsKCQkJYnJlYWs7CiNlbmRpZgoKI2lmZGVmIFRJT0NNX1JUUwoJCWNhc2UgQ0xSUlRTOgoJCQlwb3J0LmNfY2ZsYWcgJj0gVElPQ01fUlRTOwoJCQlicmVhazsKI2VuZGlmCgkKI2lmZGVmIENSVFNDVFMKCQljYXNlIFNFVERUUjoKCQkJcG9ydC5jX2NmbGFnIHw9IENSVFNDVFM7CgkJCWJyZWFrOwoKCQljYXNlIFNFVFJUUzoKCQkJcG9ydC5jX2NmbGFnIHw9IENSVFNDVFM7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVRYT0ZGOgoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgkJCWJyZWFrOwoKCQljYXNlIFNFVFhPTjoKCQkJcG9ydC5jX2lmbGFnIHw9IElYT047CgkJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCQlXQVJOKGNvbW0sIihjaWQ9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwgCgkJCWNpZCwgbkZ1bmN0aW9uKTsKCQkJYnJlYWs7CQkJCQoJfQoJCglpZiAodGNzZXRhdHRyKHB0ci0+ZmQsIFRDU0FEUkFJTiwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUZsdXNoQ29tbQkoVVNFUi4yMTUpCiAqLwpJTlQxNiBXSU5BUEkgRmx1c2hDb21tMTYoSU5UMTYgY2lkLElOVDE2IGZuUXVldWUpCnsKCWludCBxdWV1ZTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoY29tbSwiY2lkPSVkLCBxdWV1ZT0lZFxuIiwgY2lkLCBmblF1ZXVlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9Cglzd2l0Y2ggKGZuUXVldWUpIHsKCQljYXNlIDA6CXF1ZXVlID0gVENPRkxVU0g7CgkJCWJyZWFrOwoJCWNhc2UgMToJcXVldWUgPSBUQ0lGTFVTSDsKCQkJYnJlYWs7CgkJZGVmYXVsdDpXQVJOKGNvbW0sIihjaWQ9JWQsZm5RdWV1ZT0lZCk6VW5rbm93biBxdWV1ZVxuIiwgCgkJCQljaWQsIGZuUXVldWUpOwoJCQlyZXR1cm4gLTE7CgkJfQoJaWYgKHRjZmx1c2gocHRyLT5mZCwgcXVldWUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfSAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUVycm9yCShVU0VSLjIwMykKICovCklOVDE2IFdJTkFQSSBHZXRDb21tRXJyb3IxNihJTlQxNiBjaWQsTFBDT01TVEFUMTYgbHBTdGF0KQp7CglpbnQJCXRlbXBlcnJvcjsKCXVuc2lnbmVkIGxvbmcJY250OwoJaW50CQlyYzsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwogICAgICAgIHVuc2lnbmVkIGludCBtc3RhdDsKCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQogICAgICAgIGlmIChjaWQmMHg4MCkgewogICAgICAgICAgICBXQVJOKGNvbW0sIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gQ0VfTU9ERTsKICAgICAgICB9CiAgICAgICAgc3RvbCA9ICh1bnNpZ25lZCBjaGFyICopdW5rbm93bltjaWRdICsgQ09NTV9NU1JfT0ZGU0VUOwogICAgICAgIGlvY3RsKHB0ci0+ZmQsVElPQ01HRVQsJm1zdGF0KTsKICAgICAgICBpZiggbXN0YXQmVElPQ01fQ0FSICkgCiAgICAgICAgICAgICpzdG9sIHw9IDB4ODA7CiAgICAgICAgZWxzZSAKICAgICAgICAgICAgKnN0b2wgJj0weDdmOwoKCWlmIChscFN0YXQpIHsKCQlscFN0YXQtPnN0YXR1cyA9IDA7CgoJCXJjID0gaW9jdGwocHRyLT5mZCwgVElPQ09VVFEsICZjbnQpOwoJCWlmIChyYykgV0FSTihjb21tLCAiRXJyb3IgIVxuIik7CgkJbHBTdGF0LT5jYk91dFF1ZSA9IGNudCArIGlHbG9iYWxPdXRRdWV1ZUZpbGxlcjsKCgkJcmMgPSBpb2N0bChwdHItPmZkLCBUSU9DSU5RLCAmY250KTsKICAgICAgICAgICAgICAgIGlmIChyYykgV0FSTihjb21tLCAiRXJyb3IgIVxuIik7CgkJbHBTdGF0LT5jYkluUXVlID0gY250OwoKICAgIAkJVFJBQ0UoY29tbSwgImNpZCAlZCwgZXJyb3IgJWQsIGxwU3RhdCAlZCAlZCAlZCBzdG9sICV4XG4iLAoJCQkgICAgIGNpZCwgcHRyLT5jb21tZXJyb3IsIGxwU3RhdC0+c3RhdHVzLCBscFN0YXQtPmNiSW5RdWUsIAoJCQkgICAgIGxwU3RhdC0+Y2JPdXRRdWUsICpzdG9sKTsKCX0KCWVsc2UKCQlUUkFDRShjb21tLCAiY2lkICVkLCBlcnJvciAlZCwgbHBTdGF0IE5VTEwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCAqc3RvbCk7CgoJLyogUmV0dXJuIGFueSBlcnJvcnMgYW5kIGNsZWFyIGl0ICovCgl0ZW1wZXJyb3IgPSBwdHItPmNvbW1lcnJvcjsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybih0ZW1wZXJyb3IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUV2ZW50TWFzawkoVVNFUi4yMDgpCiAqLwpTRUdQVFIgV0lOQVBJIFNldENvbW1FdmVudE1hc2sxNihJTlQxNiBjaWQsVUlOVDE2IGZ1RXZ0TWFzaykKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CiAgICAgICAgaW50IHJlcGlkOwogICAgICAgIHVuc2lnbmVkIGludCBtc3RhdDsKCiAgICAJVFJBQ0UoY29tbSwiY2lkICVkLG1hc2sgJWRcbiIsY2lkLGZ1RXZ0TWFzayk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT5ldmVudG1hc2sgfD0gZnVFdnRNYXNrOwogICAgICAgIGlmIChjaWQmMHg4MCkgewogICAgICAgICAgICBXQVJOKGNvbW0sIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gU0VHUFRSX0dFVChOVUxMKTsKICAgICAgICB9CiAgICAgICAgc3RvbCA9ICh1bnNpZ25lZCBjaGFyICopdW5rbm93bltjaWRdICsgQ09NTV9NU1JfT0ZGU0VUOwoJcmVwaWQgPSBpb2N0bChwdHItPmZkLFRJT0NNR0VULCZtc3RhdCk7CglUUkFDRShjb21tLCAiIGlvY3RsICAlZCwgbXNyICV4IGF0ICVwICVwXG4iLHJlcGlkLG1zdGF0LHN0b2wsdW5rbm93bltjaWRdKTsKCWlmICgobXN0YXQmVElPQ01fQ0FSKSkgeypzdG9sIHw9IDB4ODA7fQoJICAgICBlbHNlIHsqc3RvbCAmPTB4N2Y7fQoJVFJBQ0UoY29tbSwiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwoJcmV0dXJuIFNFR1BUUl9HRVQodW5rbm93bltjaWRdKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1FdmVudE1hc2sJKFVTRVIuMjA5KQogKi8KVUlOVDE2IFdJTkFQSSBHZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmbkV2dENsZWFyKQp7CglpbnQJZXZlbnRzID0gMDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoY29tbSwgImNpZCAlZCwgbWFzayAlZFxuIiwgY2lkLCBmbkV2dENsZWFyKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJLyoKCSAqCURldGVybWluZSBpZiBhbnkgY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlCgkgKi8KCWlmIChmbkV2dENsZWFyICYgRVZfUlhDSEFSKQoJewoJCWludAkJcmM7CgkJdW5zaWduZWQgbG9uZwljbnQ7CgoJCXJjID0gaW9jdGwocHRyLT5mZCwgVElPQ0lOUSwgJmNudCk7CgkJaWYgKGNudCkgZXZlbnRzIHw9IEVWX1JYQ0hBUjsKCgkJVFJBQ0UoY29tbSwgInJ4Y2hhciAlbGRcbiIsIGNudCk7Cgl9CgoJLyoKCSAqCVRoZXJlIGFyZSBvdGhlciBldmVudHMgdGhhdCBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yCgkgKi8KCS8qIFRPRE8gKi8KCglUUkFDRShjb21tLCAicmV0dXJuIGV2ZW50cyAlZFxuIiwgZXZlbnRzKTsKCXJldHVybiBldmVudHM7CgoJLyoKCSAqIFtSRVJdIFRoZSBmb2xsb3dpbmcgd2FzIGdpYmJlcmlzaAoJICovCiNpZiAwCgl0ZW1wbWFzayA9IHB0ci0+ZXZlbnRtYXNrOwoJcHRyLT5ldmVudG1hc2sgJj0gfmZuRXZ0Q2xlYXI7CglyZXR1cm4gcHRyLT5ldmVudG1hc2s7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVN0YXRlMTYJKFVTRVIuMjAxKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1TdGF0ZTE2KExQRENCMTYgbHBkY2IpCnsKCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKGNvbW0sICJjaWQgJWQsIHB0ciAlcFxuIiwgbHBkY2ItPklkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChscGRjYi0+SWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKHRjZ2V0YXR0cihwdHItPmZkLCAmcG9ydCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQoJCXJldHVybiAtMTsKCX0KCglwb3J0LmNfY2NbVk1JTl0gPSAwOwoJcG9ydC5jX2NjW1ZUSU1FXSA9IDE7CgojaWZkZWYgSU1BWEJFTAoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUnxJTUFYQkVMKTsKI2Vsc2UKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1IpOwojZW5kaWYKCXBvcnQuY19pZmxhZyB8PSAoSUdOQlJLKTsKCglwb3J0LmNfb2ZsYWcgJj0gfihPUE9TVCk7CgoJcG9ydC5jX2NmbGFnICY9IH4oSFVQQ0wpOwoJcG9ydC5jX2NmbGFnIHw9IENMT0NBTCB8IENSRUFEOwoKCXBvcnQuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPfElTSUcpOwoJcG9ydC5jX2xmbGFnIHw9IE5PRkxTSDsKCiAgICAJVFJBQ0UoY29tbSwiYmF1ZHJhdGUgJWRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDExMDoKCQljYXNlIENCUl8xMTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTEwOwoJCQlicmVhazsJCQoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDEyMDA6CgkJY2FzZSBDQlJfMTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA0ODAwOgoJCWNhc2UgQ0JSXzQ4MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzODQwMDoKCQljYXNlIENCUl8zODQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzODQwMDsKCQkJYnJlYWs7CQkKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgNTc2MDE6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTE1MjAwOwoJCQlicmVhazsJCQojZW5kaWYKCQlkZWZhdWx0OgoJCQlwdHItPmNvbW1lcnJvciA9IElFX0JBVURSQVRFOwoJCQlyZXR1cm4gLTE7Cgl9CiNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTEwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjExMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDMwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzMwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl82MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzEyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8yNDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjI0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNDgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI0ODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgOTYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzk2MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCOTYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE5MjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTkyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTkyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzODQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzM4NDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjM4NDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+Y29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcG9ydC5jX2lzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgCVRSQUNFKGNvbW0sImJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7Cglwb3J0LmNfY2ZsYWcgJj0gfkNTSVpFOwoJc3dpdGNoIChscGRjYi0+Qnl0ZVNpemUpIHsKCQljYXNlIDU6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzU7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQljYXNlIDg6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzg7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CgkJCXJldHVybiAtMTsKCX0KCiAgICAJVFJBQ0UoY29tbSwiZlBhcml0eSAlZCBQYXJpdHkgJWRcbiIsbHBkY2ItPmZQYXJpdHksIGxwZGNiLT5QYXJpdHkpOwoJcG9ydC5jX2NmbGFnICY9IH4oUEFSRU5CIHwgUEFST0REKTsKCWlmIChscGRjYi0+ZlBhcml0eSkKICAgICAgICAgICAgcG9ydC5jX2lmbGFnIHw9IElOUENLOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5QYXJpdHkpIHsKICAgICAgICAgICAgICAgIGNhc2UgTk9QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBPRERQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSAoUEFSRU5CIHwgUEFST0REKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVWRU5QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSBQQVJFTkI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5jb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCQoKICAgIAlUUkFDRShjb21tLCJzdG9wYml0cyAlZFxuIixscGRjYi0+U3RvcEJpdHMpOwoKCXN3aXRjaCAobHBkY2ItPlN0b3BCaXRzKSB7CgkJY2FzZSBPTkVTVE9QQklUOgoJCQkJcG9ydC5jX2NmbGFnICY9IH5DU1RPUEI7CgkJCQlicmVhazsKCQljYXNlIFRXT1NUT1BCSVRTOgoJCQkJcG9ydC5jX2NmbGFnIHw9IENTVE9QQjsKCQkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CgkJCXJldHVybiAtMTsKCX0KI2lmZGVmIENSVFNDVFMKCglpZiAobHBkY2ItPmZEdHJmbG93IHx8IGxwZGNiLT5mUnRzZmxvdyB8fCBscGRjYi0+Zk91dHhDdHNGbG93KQoJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwoKCWlmIChscGRjYi0+ZkR0ckRpc2FibGUpIAoJCXBvcnQuY19jZmxhZyAmPSB+Q1JUU0NUUzsKI2VuZGlmCQoJaWYgKGxwZGNiLT5mSW5YKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPTjsKCWlmIChscGRjYi0+Zk91dFgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPRkY7CgoJaWYgKHRjc2V0YXR0cihwdHItPmZkLCBUQ1NBRFJBSU4sICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIEZBTFNFOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKFVTRVIuMjAyKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1TdGF0ZTE2KElOVDE2IGNpZCwgTFBEQ0IxNiBscGRjYikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCiAgICAJVFJBQ0UoY29tbSwiY2lkICVkLCBwdHIgJXBcbiIsIGNpZCwgbHBkY2IpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCWlmICh0Y2dldGF0dHIocHRyLT5mZCwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CglscGRjYi0+SWQgPSBjaWQ7CiNpZm5kZWYgX19FTVhfXwojaWZkZWYgQ0JBVUQKICAgICAgICBzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENCQVVEKSB7CiNlbHNlCiAgICAgICAgc3dpdGNoIChwb3J0LmNfb3NwZWVkKSB7CiNlbmRpZgoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgQjExNTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNTc2MDE7CgkJCWJyZWFrOwojZW5kaWYKCX0KI2VuZGlmCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENTSVpFKSB7CgkJY2FzZSBDUzU6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDU7CgkJCWJyZWFrOwoJCWNhc2UgQ1M2OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA2OwoJCQlicmVhazsKCQljYXNlIENTNzoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNzsKCQkJYnJlYWs7CgkJY2FzZSBDUzg6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDg7CgkJCWJyZWFrOwoJfQkKCQogICAgICAgIGlmKHBvcnQuY19pZmxhZyAmIElOUENLKQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKSkgewoJCWNhc2UgMDoKCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIFBBUkVOQjoKCQkJbHBkY2ItPlBhcml0eSA9IEVWRU5QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgKFBBUkVOQiB8IFBBUk9ERCk6CgkJCWxwZGNiLT5QYXJpdHkgPSBPRERQQVJJVFk7CQkKCQkJYnJlYWs7Cgl9CgoJaWYgKHBvcnQuY19jZmxhZyAmIENTVE9QQikKCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCWVsc2UKCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoKCWxwZGNiLT5SbHNUaW1lb3V0ID0gNTA7CglscGRjYi0+Q3RzVGltZW91dCA9IDUwOyAKCWxwZGNiLT5Ec3JUaW1lb3V0ID0gNTA7CglscGRjYi0+Zk51bGwgPSAwOwoJbHBkY2ItPmZDaEV2dCA9IDA7CglscGRjYi0+ZkJpbmFyeSA9IDE7CglscGRjYi0+ZkR0ckRpc2FibGUgPSAwOwoKI2lmZGVmIENSVFNDVFMKCglpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewoJCWxwZGNiLT5mRHRyZmxvdyA9IDE7CgkJbHBkY2ItPmZSdHNmbG93ID0gMTsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gMTsKCX0gZWxzZSAKI2VuZGlmCgkJbHBkY2ItPmZEdHJEaXNhYmxlID0gMTsKCglpZiAocG9ydC5jX2lmbGFnICYgSVhPTikKCQlscGRjYi0+ZkluWCA9IDE7CgllbHNlCgkJbHBkY2ItPmZJblggPSAwOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9GRikKCQlscGRjYi0+Zk91dFggPSAxOwoJZWxzZQoJCWxwZGNiLT5mT3V0WCA9IDA7Ci8qCglscGRjYi0+WG9uQ2hhciA9IAoJbHBkY2ItPlhvZmZDaGFyID0gCiAqLwoJbHBkY2ItPlhvbkxpbSA9IDEwOwoJbHBkY2ItPlhvZmZMaW0gPSAxMDsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKFVTRVIuMjA2KQogKi8KSU5UMTYgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFRyYW5zbWl0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKGNvbW0sICJjaWQgJWQsIGRhdGEgJWQgXG4iLCBjaWQsIGNoVHJhbnNtaXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYgKHdyaXRlKHB0ci0+ZmQsICh2b2lkICopICZjaFRyYW5zbWl0LCAxKSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQlyZXR1cm4gLTE7CQoJfSAgZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVW5nZXRDb21tQ2hhcgkoVVNFUi4yMTIpCiAqLwpJTlQxNiBXSU5BUEkgVW5nZXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVW5nZXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoY29tbSwiY2lkICVkIChjaGFyICVkKVxuIiwgY2lkLCBjaFVuZ2V0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCXB0ci0+dW5nZXQgPSAxOwoJcHRyLT51bmdldF9ieXRlID0gY2hVbmdldDsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUmVhZENvbW0JKFVTRVIuMjA0KQogKi8KSU5UMTYgV0lOQVBJIFJlYWRDb21tMTYoSU5UMTYgY2lkLExQU1RSIGxwdkJ1ZixJTlQxNiBjYlJlYWQpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoY29tbSwgImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsIGNpZCwgbHB2QnVmLCBjYlJlYWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYgKHB0ci0+dW5nZXQpIHsKCQkqbHB2QnVmID0gcHRyLT51bmdldF9ieXRlOwoJCWxwdkJ1ZisrOwoJCXB0ci0+dW5nZXQgPSAwOwoKCQlsZW5ndGggPSAxOwoJfSBlbHNlCgkgCWxlbmd0aCA9IDA7CgoJc3RhdHVzID0gcmVhZChwdHItPmZkLCAodm9pZCAqKSBscHZCdWYsIGNiUmVhZCk7CgoJaWYgKHN0YXR1cyA9PSAtMSkgewogICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgewoJCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJCXJldHVybiAtMSAtIGxlbmd0aDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJCXB0ci0+Y29tbWVycm9yID0gMDsKCQkJcmV0dXJuIGxlbmd0aDsKICAgICAgICAgICAgICAgIH0KIAl9IGVsc2UgewoJICAgICAgICBUUkFDRShjb21tLCIlLipzXG4iLCBsZW5ndGgrc3RhdHVzLCBscHZCdWYpOwoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gbGVuZ3RoICsgc3RhdHVzOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJV3JpdGVDb21tCShVU0VSLjIwNSkKICovCklOVDE2IFdJTkFQSSBXcml0ZUNvbW0xNihJTlQxNiBjaWQsIExQU1RSIGxwdkJ1ZiwgSU5UMTYgY2JXcml0ZSkKewoJaW50IGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoY29tbSwiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCgkJY2lkLCBscHZCdWYsIGNiV3JpdGUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgkKCVRSQUNFKGNvbW0sIiUuKnNcbiIsIGNiV3JpdGUsIGxwdkJ1ZiApOwoJbGVuZ3RoID0gd3JpdGUocHRyLT5mZCwgKHZvaWQgKikgbHB2QnVmLCBjYldyaXRlKTsKCQoJaWYgKGxlbmd0aCA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQlyZXR1cm4gLTE7CQoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CQoJCXJldHVybiBsZW5ndGg7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbiAgIChVU0VSLjI0NikKICovCkJPT0wxNiBXSU5BUEkgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbjE2KCBJTlQxNiBjaWQsIEhXTkQxNiBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNiV3JpdGVOb3RpZnksIElOVDE2IGNiT3V0UXVldWUgKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJRklYTUUoY29tbSwgIiglZCwgJXgsICVkLCAlZCk6c3R1Yi5cbiIsIGNpZCwgaHduZCwgY2JXcml0ZU5vdGlmeSwgY2JPdXRRdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9CQURJRDsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnduZCA9IGh3bmQ7CglwdHItPm5fcmVhZCA9IGNiV3JpdGVOb3RpZnk7CglwdHItPm5fd3JpdGUgPSBjYk91dFF1ZXVlOwoJcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBCQkoS0VSTkVMMzIuMTQpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBKExQQ1NUUiBkZXZpY2UsTFBEQ0IgbHBkY2IpCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoZGV2aWNlLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EJKEtFUk5FTDMyLjE1KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNBKExQQ1NUUiBkZXZpY2UsIExQRENCIGxwZGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpCnsKCWludAlwb3J0OwoJY2hhcgkqcHRyLCp0ZW1wOwoKCVRSQUNFKGNvbW0sIiglcywlcCwlcClcbiIsZGV2aWNlLGxwZGNiLGxwdGltZW91dHMpOwoKCWlmICghbHN0cm5jbXBpQShkZXZpY2UsIkNPTSIsMykpIHsKCQlwb3J0PWRldmljZVszXS0nMCc7CgkJaWYgKHBvcnQtLT09MCkgewoJCQlFUlIoY29tbSwiQlVHISBDT00wIGNhbid0IGV4aXN0cyEuXG4iKTsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkKCQkJcmV0dXJuIEZBTFNFOwoJCWlmICgqKGRldmljZSs0KSE9JzonKQoJCQlyZXR1cm4gRkFMU0U7CgkJdGVtcD0oTFBTVFIpKGRldmljZSs1KTsKCX0gZWxzZQoJCXRlbXA9KExQU1RSKWRldmljZTsKCgltZW1zZXQobHBkY2IsIDAsIHNpemVvZihEQ0IpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCWxwZGNiLT5EQ0JsZW5ndGgJPSBzaXplb2YoRENCKTsKCWlmIChzdHJjaHIodGVtcCwnLCcpKSB7CS8qIG9sZCBzdHlsZSAqLwoJCURDQjE2CWRjYjE2OwoJCUJPT0wxNglyZXQ7CgkJY2hhcglsYXN0PXRlbXBbc3RybGVuKHRlbXApLTFdOwoKCQlyZXQ9QnVpbGRDb21tRENCMTYoZGV2aWNlLCZkY2IxNik7CgkJaWYgKCFyZXQpCgkJCXJldHVybiBGQUxTRTsKCQlscGRjYi0+QmF1ZFJhdGUJCT0gZGNiMTYuQmF1ZFJhdGU7CgkJbHBkY2ItPkJ5dGVTaXplCQk9IGRjYjE2LkJ5dGVTaXplOwoJCWxwZGNiLT5mQmluYXJ5CQk9IGRjYjE2LmZCaW5hcnk7CgkJbHBkY2ItPlBhcml0eQkJPSBkY2IxNi5QYXJpdHk7CgkJbHBkY2ItPmZQYXJpdHkJCT0gZGNiMTYuZlBhcml0eTsKCQlscGRjYi0+Zk51bGwJCT0gZGNiMTYuZk51bGw7CgkJbHBkY2ItPlN0b3BCaXRzCQk9IGRjYjE2LlN0b3BCaXRzOwoJCWlmIChsYXN0ID09ICd4JykgewoJCQlscGRjYi0+ZkluWAkJPSBUUlVFOwoJCQlscGRjYi0+Zk91dFgJCT0gVFJVRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0gZWxzZSBpZiAobGFzdD09J3AnKSB7CgkJCWxwZGNiLT5mSW5YCQk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dFgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eEN0c0Zsb3cJPSBUUlVFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gVFJVRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfSEFORFNIQUtFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9IQU5EU0hBS0U7CgkJfSBlbHNlIHsKCQkJbHBkY2ItPmZJblgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0WAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0KCQlscGRjYi0+WG9uQ2hhcgk9IGRjYjE2LlhvbkNoYXI7CgkJbHBkY2ItPlhvZmZDaGFyCT0gZGNiMTYuWG9mZkNoYXI7CgkJbHBkY2ItPkVycm9yQ2hhcj0gZGNiMTYuUGVDaGFyOwoJCWxwZGNiLT5mRXJyb3JDaGFyPSBkY2IxNi5mUGVDaGFyOwoJCWxwZGNiLT5Fb2ZDaGFyCT0gZGNiMTYuRW9mQ2hhcjsKCQlscGRjYi0+RXZ0Q2hhcgk9IGRjYjE2LkV2dENoYXI7CgkJbHBkY2ItPlhvbkxpbQk9IGRjYjE2LlhvbkxpbTsKCQlscGRjYi0+WG9mZkxpbQk9IGRjYjE2LlhvZmZMaW07CgkJcmV0dXJuIFRSVUU7Cgl9CglwdHI9c3RydG9rKHRlbXAsIiAiKTsgCgl3aGlsZSAocHRyKSB7CgkJRFdPUkQJZmxhZyx4OwoKCQlmbGFnPTA7CgkJaWYgKCFzdHJuY21wKCJiYXVkPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oY29tbSwiQ291bGRuJ3QgcGFyc2UgJXNcbiIscHRyKTsKCQkJbHBkY2ItPkJhdWRSYXRlID0geDsKCQkJZmxhZz0xOwoJCX0KCQlpZiAoIXN0cm5jbXAoInN0b3A9IixwdHIsNSkpIHsKCQkJaWYgKCFzc2NhbmYocHRyKzUsIiVsZCIsJngpKQoJCQkJV0FSTihjb21tLCJDb3VsZG4ndCBwYXJzZSAlc1xuIixwdHIpOwoJCQlscGRjYi0+U3RvcEJpdHMgPSB4OwoJCQlmbGFnPTE7CgkJfQoJCWlmICghc3RybmNtcCgiZGF0YT0iLHB0ciw1KSkgewoJCQlpZiAoIXNzY2FuZihwdHIrNSwiJWxkIiwmeCkpCgkJCQlXQVJOKGNvbW0sIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJwYXJpdHk9IixwdHIsNykpIHsKCQkJbHBkY2ItPmZQYXJpdHkJPSBUUlVFOwoJCQlzd2l0Y2ggKHB0cls4XSkgewoJCQljYXNlICdOJzpjYXNlICduJzoKCQkJCWxwZGNiLT5mUGFyaXR5CT0gRkFMU0U7CgkJCQlscGRjYi0+UGFyaXR5CT0gTk9QQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnRSc6Y2FzZSAnZSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gRVZFTlBBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdPJzpjYXNlICdvJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBPRERQQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnTSc6Y2FzZSAnbSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gTUFSS1BBUklUWTsKCQkJCWJyZWFrOwoJCQl9CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFmbGFnKQoJCQlFUlIoY29tbSwiVW5oYW5kbGVkIHNwZWNpZmllciAnJXMnLCBwbGVhc2UgcmVwb3J0LlxuIixwdHIpOwoJCXB0cj1zdHJ0b2soTlVMTCwiICIpOwoJfQoJaWYgKGxwZGNiLT5CYXVkUmF0ZT09MTEwKQoJCWxwZGNiLT5TdG9wQml0cyA9IDI7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCQW5kVGltZW91dHNXCQkoS0VSTkVMMzIuMTYpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1coIExQQ1dTVFIgZGV2aWQsIExQRENCIGxwZGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzICkKewoJTFBTVFIJZGV2aWRBOwoJQk9PTAlyZXQ7CgoJVFJBQ0UoY29tbSwiKCVwLCVwLCVwKVxuIixkZXZpZCxscGRjYixscHRpbWVvdXRzKTsKCWRldmlkQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV2aWQgKTsKCXJldD1CdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoZGV2aWRBLGxwZGNiLGxwdGltZW91dHMpOwogICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXZpZEEgKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQlcJCShLRVJORUwzMi4xNykKICovCkJPT0wgV0lOQVBJIEJ1aWxkQ29tbURDQlcoTFBDV1NUUiBkZXZpZCxMUERDQiBscGRjYikKewoJcmV0dXJuIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVyhkZXZpZCxscGRjYixOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQ09NTV9IYW5kbGUyZmQKICogIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHJlYWRpbmcgZnJvbSBvciB3cml0aW5nIHRvCiAqICBtb2RlIGlzIEdFTkVSSUNfUkVBRCBvciBHRU5FUklDX1dSSVRFLiBNYWtlIHN1cmUgdG8gY2xvc2UKICogIHRoZSBoYW5kbGUgYWZ0ZXJ3YXJkcyEKICovCmludCBDT01NX0hhbmRsZTJmZChIQU5ETEUgaGFuZGxlLCBpbnQgbW9kZSkgewogICAgc3RydWN0IGdldF9yZWFkX2ZkX3JlcXVlc3Qgcl9yZXE7CiAgICBzdHJ1Y3QgZ2V0X3dyaXRlX2ZkX3JlcXVlc3Qgd19yZXE7CiAgICBpbnQgZmQ7CgogICAgd19yZXEuaGFuZGxlID0gcl9yZXEuaGFuZGxlID0gaGFuZGxlOwoKICAgIHN3aXRjaChtb2RlKSB7CiAgICBjYXNlIEdFTkVSSUNfV1JJVEU6CiAgICAgICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfR0VUX1dSSVRFX0ZELCAtMSwgMSwgJndfcmVxLCBzaXplb2Yod19yZXEpICk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEdFTkVSSUNfUkVBRDoKICAgICAgICBDTElFTlRfU2VuZFJlcXVlc3QoIFJFUV9HRVRfUkVBRF9GRCwgLTEsIDEsICZyX3JlcSwgc2l6ZW9mKHJfcmVxKSApOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBFUlIoY29tbSwiQ09NTV9IYW5kbGUyZmQ6IERvbid0IGtub3cgd2hhdCB0eXBlIG9mIGZkIGlzIHJlcXVpcmVkLlxuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgQ0xJRU5UX1dhaXRSZXBseSggTlVMTCwgJmZkLCAwICk7CgogICAgcmV0dXJuIGZkOwp9CgovKiBGSVhNRTogaGF2aW5nIHRoZXNlIGdsb2JhbCBmb3Igd2luMzIgZm9yIG5vdyAqLwppbnQgY29tbWVycm9yPTAsZXZlbnRtYXNrPTA7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUJyZWFrCQkoS0VSTkVMMzIuNDQ5KQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbUJyZWFrKEhBTkRMRSBoYW5kbGUpCnsKCUZJWE1FKGNvbW0sImhhbmRsZSAlZCwgc3R1YiFcbiIsIGhhbmRsZSk7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCQkoS0VSTkVMMzIuMjApCiAqLwpCT09MIFdJTkFQSSBDbGVhckNvbW1CcmVhayhIQU5ETEUgaGFuZGxlKQp7CglGSVhNRShjb21tLCJoYW5kbGUgJWQsIHN0dWIhXG4iLCBoYW5kbGUpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKEtFUk5FTDMyLjIxNCkKICovCkJPT0wgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbihIQU5ETEUgaGFuZGxlLFVJTlQgbkZ1bmN0aW9uKQp7CglpbnQgZmQ7CglzdHJ1Y3QgdGVybWlvcwlwb3J0OwoKICAgIAlUUkFDRShjb21tLCJoYW5kbGUgJWQsIGZ1bmN0aW9uPSVkXG4iLCBoYW5kbGUsIG5GdW5jdGlvbik7CglmZCA9IENPTU1fSGFuZGxlMmZkKGhhbmRsZSwgR0VORVJJQ19XUklURSk7CglpZihmZDwwKQoJCXJldHVybiBGQUxTRTsKCglpZiAodGNnZXRhdHRyKGZkLCZwb3J0KSA9PSAtMSkgewoJCWNvbW1lcnJvcj1XaW5FcnJvcigpOwoJCWNsb3NlKGZkKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJc3dpdGNoIChuRnVuY3Rpb24pIHsKCQljYXNlIFJFU0VUREVWOgoJCQlicmVhazsJCQkJCQoKI2lmZGVmIFRJT0NNX0RUUgoJCWNhc2UgQ0xSRFRSOgoJCQlwb3J0LmNfY2ZsYWcgJj0gVElPQ01fRFRSOwoJCQlicmVhazsKI2VuZGlmCgojaWZkZWYgVElPQ01fUlRTCgkJY2FzZSBDTFJSVFM6CgkJCXBvcnQuY19jZmxhZyAmPSBUSU9DTV9SVFM7CgkJCWJyZWFrOwojZW5kaWYKCQojaWZkZWYgQ1JUU0NUUwoJCWNhc2UgU0VURFRSOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKCQkJYnJlYWs7CgoJCWNhc2UgU0VUUlRTOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIFNFVFhPRkY6CgkJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCQkJYnJlYWs7CgoJCWNhc2UgU0VUWE9OOgoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCQkJYnJlYWs7CgkJY2FzZSBTRVRCUkVBSzoKCQkJRklYTUUoY29tbSwic2V0YnJlYWssIHN0dWJcbiIpOwovKgkJCXB0ci0+c3VzcGVuZGVkID0gMTsgKi8KCQkJYnJlYWs7CgkJY2FzZSBDTFJCUkVBSzoKCQkJRklYTUUoY29tbSwiY2xyYnJlYWssIHN0dWJcbiIpOwovKgkJCXB0ci0+c3VzcGVuZGVkID0gMDsgKi8KCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJV0FSTihjb21tLCIoaGFuZGxlPSVkLG5GdW5jdGlvbj0lZCk6IFVua25vd24gZnVuY3Rpb25cbiIsIAoJCQloYW5kbGUsIG5GdW5jdGlvbik7CgkJCWJyZWFrOwkJCQkKCX0KCQoJaWYgKHRjc2V0YXR0cihmZCwgVENTQURSQUlOLCAmcG9ydCkgPT0gLTEpIHsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCWNsb3NlKGZkKTsKCQlyZXR1cm4gRkFMU0U7CQoJfSBlbHNlIHsKCQljb21tZXJyb3IgPSAwOwoJCWNsb3NlKGZkKTsKCQlyZXR1cm4gVFJVRTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgUHVyZ2VDb21tICAgICAgICAoS0VSTkVMMzIuNTU3KQogKi8KQk9PTCBXSU5BUEkgUHVyZ2VDb21tKCBIQU5ETEUgaGFuZGxlLCBEV09SRCBmbGFncykgCnsKICAgICBpbnQgZmQ7CgogICAgIFRSQUNFKGNvbW0sImhhbmRsZSAlZCwgZmxhZ3MgJWx4XG4iLCBoYW5kbGUsIGZsYWdzKTsKCiAgICAgZmQgPSBDT01NX0hhbmRsZTJmZChoYW5kbGUsIEdFTkVSSUNfV1JJVEUpOwogICAgIGlmKGZkPDApCiAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgLyoKICAgICAqKiBub3QgZXhhY3RseSBzdXJlIGhvdyB0aGVzZSBhcmUgZGlmZmVyZW50CiAgICAgKiogUGVyaGFwcyBpZiB3ZSBoYWQgb3VyIG93biBpbnRlcm5hbCBxdWV1ZXMsIG9uZSBmbHVzaGVzIHRoZW0KICAgICAqKiBhbmQgdGhlIG90aGVyIGZsdXNoZXMgdGhlIGtlcm5lbCdzIGJ1ZmZlcnMuCiAgICAgKi8KICAgICBpZihmbGFncyZQVVJHRV9UWEFCT1JUKQogICAgIHsKICAgICAgICAgdGNmbHVzaChmZCxUQ09GTFVTSCk7CiAgICAgfQogICAgIGlmKGZsYWdzJlBVUkdFX1JYQUJPUlQpCiAgICAgewogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICB9CiAgICAgaWYoZmxhZ3MmUFVSR0VfVFhDTEVBUikKICAgICB7CiAgICAgICAgIHRjZmx1c2goZmQsVENPRkxVU0gpOwogICAgIH0KICAgICBpZihmbGFncyZQVVJHRV9SWENMRUFSKQogICAgIHsKICAgICAgICAgdGNmbHVzaChmZCxUQ0lGTFVTSCk7CiAgICAgfQogICAgIGNsb3NlKGZkKTsKCiAgICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1FcnJvcgkoS0VSTkVMMzIuMjEpCiAqLwpCT09MIFdJTkFQSSBDbGVhckNvbW1FcnJvcihJTlQgaGFuZGxlLExQRFdPUkQgZXJyb3JzLExQQ09NU1RBVCBscFN0YXQpCnsKICAgIGludCBmZDsKCiAgICBmZD1DT01NX0hhbmRsZTJmZChoYW5kbGUsR0VORVJJQ19SRUFEKTsKICAgIGlmKDA+ZmQpIAogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAobHBTdGF0KSAKICAgIHsKCWxwU3RhdC0+c3RhdHVzID0gMDsKCglpZihpb2N0bChmZCwgVElPQ09VVFEsICZscFN0YXQtPmNiT3V0UXVlKSkKCSAgICBXQVJOKGNvbW0sICJpb2N0bCByZXR1cm5lZCBlcnJvclxuIik7CgoJaWYoaW9jdGwoZmQsIFRJT0NJTlEsICZscFN0YXQtPmNiSW5RdWUpKQoJICAgIFdBUk4oY29tbSwgImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKICAgIH0KCiAgICBjbG9zZShmZCk7CgogICAgVFJBQ0UoY29tbSwiaGFuZGxlICVkIGNiSW5RdWUgPSAlbGQgY2JPdXRRdWUgPSAlbGRcbiIsCiAgICAgICAgICAgICAgICBoYW5kbGUsCiAgICAgICAgICAgICAgICBscFN0YXQtPmNiSW5RdWUsCiAgICAgICAgICAgICAgICBscFN0YXQtPmNiT3V0UXVlKTsKCiAgICBpZihlcnJvcnMpCiAgICAgICAgKmVycm9ycyA9IDA7CgogICAgLyoKICAgICoqIEFmdGVyIGFuIGFzeW5jaHJvbm91cyB3cml0ZSBvcHBlcmF0aW9uLCB0aGUKICAgICoqIGFwcCB3aWxsIGNhbGwgQ2xlYXJDb21tRXJyb3IgdG8gc2VlIGlmIHRoZQogICAgKiogcmVzdWx0cyBhcmUgcmVhZHkgeWV0LiBJdCB3YWl0cyBmb3IgRVJST1JfSU9fUEVORElORwogICAgKi8KICAgIGNvbW1lcnJvciA9IEVSUk9SX0lPX1BFTkRJTkc7CgogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNldHVwQ29tbSAgICAgICAoS0VSTkVMMzIuNjc2KQogKi8KQk9PTCBXSU5BUEkgU2V0dXBDb21tKCBIQU5ETEUgaGFuZGxlLCBEV09SRCBpbnNpemUsIERXT1JEIG91dHNpemUpCnsKICAgIGludCBmZDsKCiAgICBGSVhNRShjb21tLCAiaW5zaXplICVsZCBvdXRzaXplICVsZCB1bmltcGxlbWVudGVkIHN0dWJcbiIsIGluc2l6ZSwgb3V0c2l6ZSk7CiAgICBmZD1DT01NX0hhbmRsZTJmZChoYW5kbGUsR0VORVJJQ19XUklURSk7CiAgICBpZigwPmZkKQogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgIHJldHVybiBUUlVFOwp9IAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1NYXNrCShLRVJORUwzMi4xNTYpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tTWFzayhIQU5ETEUgaGFuZGxlLExQRFdPUkQgZXZ0bWFzaykKewogICAgaW50IGZkOwoKICAgIFRSQUNFKGNvbW0sICJoYW5kbGUgJWQsIG1hc2sgJXBcbiIsIGhhbmRsZSwgZXZ0bWFzayk7CiAgICBpZigwPihmZD1DT01NX0hhbmRsZTJmZChoYW5kbGUsR0VORVJJQ19SRUFEKSkpIAogICAgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgICpldnRtYXNrID0gZXZlbnRtYXNrOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tTWFzawkoS0VSTkVMMzIuNDUxKQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbU1hc2soSU5UIGhhbmRsZSxEV09SRCBldnRtYXNrKQp7CiAgICBpbnQgZmQ7CgogICAgVFJBQ0UoY29tbSwgImhhbmRsZSAlZCwgbWFzayAlbHhcbiIsIGhhbmRsZSwgZXZ0bWFzayk7CiAgICBpZigwPihmZD1DT01NX0hhbmRsZTJmZChoYW5kbGUsR0VORVJJQ19XUklURSkpKSB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgY2xvc2UoZmQpOwogICAgZXZlbnRtYXNrID0gZXZ0bWFzazsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVN0YXRlICAgIChLRVJORUwzMi40NTIpCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tU3RhdGUoSU5UIGhhbmRsZSxMUERDQiBscGRjYikKewogICAgIHN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAgICAgaW50IGZkOwogICAgIHN0cnVjdCBnZXRfd3JpdGVfZmRfcmVxdWVzdCByZXE7CgogICAgIFRSQUNFKGNvbW0sImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKCiAgICAgcmVxLmhhbmRsZSA9IGhhbmRsZTsKICAgICBDTElFTlRfU2VuZFJlcXVlc3QoIFJFUV9HRVRfV1JJVEVfRkQsIC0xLCAxLCAmcmVxLCBzaXplb2YocmVxKSApOwogICAgIENMSUVOVF9XYWl0UmVwbHkoIE5VTEwsICZmZCwgMCApOwoKICAgICBpZihmZDwwKQogICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgIGlmICh0Y2dldGF0dHIoZmQsJnBvcnQpID09IC0xKSB7CiAgICAgICAgIGNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQoKCXBvcnQuY19jY1tWTUlOXSA9IDA7Cglwb3J0LmNfY2NbVlRJTUVdID0gMTsKCiNpZmRlZiBJTUFYQkVMCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSfElNQVhCRUwpOwojZWxzZQoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUik7CiNlbmRpZgoJcG9ydC5jX2lmbGFnIHw9IChJR05CUkspOwoKCXBvcnQuY19vZmxhZyAmPSB+KE9QT1NUKTsKCglwb3J0LmNfY2ZsYWcgJj0gfihIVVBDTCk7Cglwb3J0LmNfY2ZsYWcgfD0gQ0xPQ0FMIHwgQ1JFQUQ7CgoJcG9ydC5jX2xmbGFnICY9IH4oSUNBTk9OfEVDSE98SVNJRyk7Cglwb3J0LmNfbGZsYWcgfD0gTk9GTFNIOwoKICAgICAvKgogICAgICoqIE1KTSAtIHJlbW92ZWQgZGVmYXVsdCBiYXVkcmF0ZSBzZXR0aW5ncwogICAgICoqIFRSQUNFKGNvbW0sImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwogICAgICovCiNpZmRlZiBDQkFVRAoJcG9ydC5jX2NmbGFnICY9IH5DQkFVRDsKCXN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CgkJY2FzZSAxMTA6CgkJY2FzZSBDQlJfMTEwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjExMDsKCQkJYnJlYWs7CQkKCQljYXNlIDMwMDoKCQljYXNlIENCUl8zMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMzAwOwoJCQlicmVhazsJCQoJCWNhc2UgNjAwOgoJCWNhc2UgQ0JSXzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI2MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAxMjAwOgoJCWNhc2UgQ0JSXzEyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTIwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDI0MDA6CgkJY2FzZSBDQlJfMjQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyNDAwOwoJCQlicmVhazsJCQoJCWNhc2UgNDgwMDoKCQljYXNlIENCUl80ODAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjQ4MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA5NjAwOgoJCWNhc2UgQ0JSXzk2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCOTYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDE5MjAwOgoJCWNhc2UgQ0JSXzE5MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjE5MjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMzg0MDA6CgkJY2FzZSBDQlJfMzg0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMzg0MDA7CgkJCWJyZWFrOwkJCgkJZGVmYXVsdDoKCQkJY29tbWVycm9yID0gSUVfQkFVRFJBVEU7CgkJCXJldHVybiBGQUxTRTsKCX0KI2VsaWYgIWRlZmluZWQoX19FTVhfXykKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewogICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTEwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzI0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ4MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl80ODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfOTYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI5NjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTkyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xOTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxOTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM4NDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzg0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzg0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICAgICAgcG9ydC5jX2lzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgCVRSQUNFKGNvbW0sImJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7Cglwb3J0LmNfY2ZsYWcgJj0gfkNTSVpFOwoJc3dpdGNoIChscGRjYi0+Qnl0ZVNpemUpIHsKCQljYXNlIDU6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzU7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQljYXNlIDg6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzg7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CgogICAgCVRSQUNFKGNvbW0sImZQYXJpdHkgJWQgUGFyaXR5ICVkXG4iLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5KTsKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CglpZiAobHBkY2ItPmZQYXJpdHkpCiAgICAgICAgICAgIHBvcnQuY19pZmxhZyB8PSBJTlBDSzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgc3dpdGNoIChscGRjYi0+UGFyaXR5KSB7CiAgICAgICAgICAgICAgICBjYXNlIE5PUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgT0REUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IFBBUk9ERCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBFVkVOUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gUEFSRU5COwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQoJCgogICAgCVRSQUNFKGNvbW0sInN0b3BiaXRzICVkXG4iLGxwZGNiLT5TdG9wQml0cyk7Cglzd2l0Y2ggKGxwZGNiLT5TdG9wQml0cykgewoJCWNhc2UgT05FU1RPUEJJVDoKCQkJCXBvcnQuY19jZmxhZyAmPSB+Q1NUT1BCOwoJCQkJYnJlYWs7CgkJY2FzZSBUV09TVE9QQklUUzoKCQkJCXBvcnQuY19jZmxhZyB8PSBDU1RPUEI7CgkJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKCQkJcmV0dXJuIEZBTFNFOwoJfQojaWZkZWYgQ1JUU0NUUwoJaWYgKAlscGRjYi0+Zk91dHhDdHNGbG93IAkJCXx8CgkJbHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0VOQUJMRXx8CgkJbHBkY2ItPmZSdHNDb250cm9sID09IFJUU19DT05UUk9MX0VOQUJMRQoJKQoJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwoJaWYgKGxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9ESVNBQkxFKQoJCXBvcnQuY19jZmxhZyAmPSB+Q1JUU0NUUzsKCiNlbmRpZgkKCWlmIChscGRjYi0+ZkluWCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT047CglpZiAobHBkY2ItPmZPdXRYKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT0ZGOwoKCWlmICh0Y3NldGF0dHIoZmQsVENTQURSQUlOLCZwb3J0KT09LTEpIHsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gRkFMU0U7Cgl9IGVsc2UgewoJCWNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIFRSVUU7Cgl9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVN0YXRlCShLRVJORUwzMi4xNTkpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tU3RhdGUoSU5UIGhhbmRsZSwgTFBEQ0IgbHBkY2IpCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZDsKICAgICBzdHJ1Y3QgZ2V0X3JlYWRfZmRfcmVxdWVzdCByZXE7CgogICAgIFRSQUNFKGNvbW0sImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKICAgICByZXEuaGFuZGxlID0gaGFuZGxlOwogICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX0dFVF9SRUFEX0ZELCAtMSwgMSwgJnJlcSwgc2l6ZW9mKHJlcSkgKTsKICAgICBDTElFTlRfV2FpdFJlcGx5KCBOVUxMLCAmZmQsIDAgKTsKCiAgICAgaWYoZmQ8MCkKICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICBpZiAodGNnZXRhdHRyKGZkLCAmcG9ydCkgPT0gLTEpIHsKICAgICAgICBUUkFDRShjb21tLCJ0Y2dldGF0dHIoJWQsIC4uLikgcmV0dXJuZWQgLTEiLGZkKTsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gRkFMU0U7Cgl9CiNpZm5kZWYgX19FTVhfXwojaWZkZWYgQ0JBVUQKICAgICAgICBzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENCQVVEKSB7CiNlbHNlCiAgICAgICAgc3dpdGNoIChwb3J0LmNfb3NwZWVkKSB7CiNlbmRpZgoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKCX0KI2VuZGlmCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENTSVpFKSB7CgkJY2FzZSBDUzU6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDU7CgkJCWJyZWFrOwoJCWNhc2UgQ1M2OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA2OwoJCQlicmVhazsKCQljYXNlIENTNzoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNzsKCQkJYnJlYWs7CgkJY2FzZSBDUzg6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDg7CgkJCWJyZWFrOwoJfQkKCQogICAgICAgIGlmKHBvcnQuY19pZmxhZyAmIElOUENLKQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKSkgewoJCWNhc2UgMDoKCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIFBBUkVOQjoKCQkJbHBkY2ItPlBhcml0eSA9IEVWRU5QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgKFBBUkVOQiB8IFBBUk9ERCk6CgkJCWxwZGNiLT5QYXJpdHkgPSBPRERQQVJJVFk7CQkKCQkJYnJlYWs7Cgl9CgoJaWYgKHBvcnQuY19jZmxhZyAmIENTVE9QQikKCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCWVsc2UKCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoKCWxwZGNiLT5mTnVsbCA9IDA7CglscGRjYi0+ZkJpbmFyeSA9IDE7CgojaWZkZWYgQ1JUU0NUUwoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0VOQUJMRTsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gMTsKCX0gZWxzZSAKI2VuZGlmCgl7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfRElTQUJMRTsKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPSBSVFNfQ09OVFJPTF9ESVNBQkxFOwoJfQoJaWYgKHBvcnQuY19pZmxhZyAmIElYT04pCgkJbHBkY2ItPmZJblggPSAxOwoJZWxzZQoJCWxwZGNiLT5mSW5YID0gMDsKCglpZiAocG9ydC5jX2lmbGFnICYgSVhPRkYpCgkJbHBkY2ItPmZPdXRYID0gMTsKCWVsc2UKCQlscGRjYi0+Zk91dFggPSAwOwovKgoJbHBkY2ItPlhvbkNoYXIgPSAKCWxwZGNiLT5Yb2ZmQ2hhciA9IAogKi8KCWxwZGNiLT5Yb25MaW0gPSAxMDsKCWxwZGNiLT5Yb2ZmTGltID0gMTA7CgoJY29tbWVycm9yID0gMDsKCiAgICAgVFJBQ0UoY29tbSwiT0tcbiIpOwogCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKEtFUk5FTDMyLjUzNSkKICovCkJPT0wgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIoSU5UIGNpZCxDSEFSIGNoVHJhbnNtaXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJRklYTUUoY29tbSwiKCVkLCclYycpLCB1c2Ugd2luMzIgaGFuZGxlIVxuIixjaWQsY2hUcmFuc21pdCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIEZBTFNFOwoJfQoJaWYgKHdyaXRlKHB0ci0+ZmQsICh2b2lkICopICZjaFRyYW5zbWl0LCAxKSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQlyZXR1cm4gRkFMU0U7Cgl9ICBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIFRSVUU7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tVGltZW91dHMJCShLRVJORUwzMi4xNjApCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tVGltZW91dHMoSU5UIGNpZCxMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKQp7CglGSVhNRShjb21tLCIoJXgsJXApOnN0dWIuXG4iLGNpZCxscHRpbWVvdXRzKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVRpbWVvdXRzCQkoS0VSTkVMMzIuNDUzKQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVRpbWVvdXRzKElOVCBjaWQsTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykgewoJRklYTUUoY29tbSwiKCV4LCVwKTpzdHViLlxuIixjaWQsbHB0aW1lb3V0cyk7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRDb21tTW9kZW1TdGF0dXMgICAoS0VSTkVMMzIuMjg1KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbU1vZGVtU3RhdHVzKEhBTkRMRSBoRmlsZSxMUERXT1JEIGxwTW9kZW1TdGF0ICkKewoJRklYTUUoY29tbSwgIiglZCAlcClcbiIsaEZpbGUsbHBNb2RlbVN0YXQgKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgV2FpdENvbW1FdmVudCAgIChLRVJORUwzMi43MTkpCiAqLwpCT09MIFdJTkFQSSBXYWl0Q29tbUV2ZW50KEhBTkRMRSBoRmlsZSxMUERXT1JEIGV2ZW50bWFzayAsTFBPVkVSTEFQUEVEIG92ZXJsYXBwZWQpCnsKCUZJWE1FKGNvbW0sICIoJWQgJXAgJXAgKVxuIixoRmlsZSwgZXZlbnRtYXNrLG92ZXJsYXBwZWQpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0Q29tbVByb3BlcnRpZXMgICAoS0VSTkVMMzIuPz8/KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVByb3BlcnRpZXMoSEFORExFIGhGaWxlLCBMUERDQiAqZGNiKQp7CiAgICBGSVhNRShjb21tLCAiKCVkICVwIClcbiIsaEZpbGUsZGNiKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldENvbW1Qcm9wZXJ0aWVzICAgKEtFUk5FTDMyLj8/PykKICovCkJPT0wgV0lOQVBJIFNldENvbW1Qcm9wZXJ0aWVzKEhBTkRMRSBoRmlsZSwgTFBEQ0IgZGNiKQp7CiAgICBGSVhNRShjb21tLCAiKCVkICVwIClcbiIsaEZpbGUsZGNiKTsKICAgIHJldHVybiBUUlVFOwp9Cgo=