I2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8cGFydGVkL3Z0b2MuaD4KCiNpZmRlZiBERUJVR19EQVNECiNkZWZpbmUgUERFQlVHIGZwcmludGYoc3RkZXJyLCAiJXM6JWQ6JXNcbiIsIFwKICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwojZWxzZQojZGVmaW5lIFBERUJVRwojZW5kaWYKCiNpbmNsdWRlIDxwYXJ0ZWQvcGFydGVkLmg+CgojaW5jbHVkZSA8bGliaW50bC5oPgojaWYgRU5BQkxFX05MUwojICBkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCiNlbHNlCiMgIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKI2VuZGlmIC8qIEVOQUJMRV9OTFMgKi8KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIEVCQ3RvQVNDWzI1Nl0gPQp7Ci8qIDB4MDAgIE5VTCAgIFNPSCAgIFNUWCAgIEVUWCAgKlNFTCAgICBIVCAgKlJOTCAgIERFTCAqLwoJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNywgMHgwOSwgMHgwNywgMHg3RiwKLyogMHgwOCAgLUdFICAtU1BTICAtUlBUICAgIFZUICAgIEZGICAgIENSICAgIFNPICAgIFNJICovCgkweDA3LCAweDA3LCAweDA3LCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAovKiAweDEwICBETEUgICBEQzEgICBEQzIgICBEQzMgIC1SRVMgICAtTkwgICAgQlMgIC1QT0MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5QICAtPkxGICAgICAgICAgICAgICovCgkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDA3LCAweDBBLCAweDA4LCAweDA3LAovKiAweDE4ICBDQU4gICAgRU0gIC1VQlMgIC1DVTEgIC1JRlMgIC1JR1MgIC1JUlMgIC1JVEIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSVVTICovCgkweDE4LCAweDE5LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAovKiAweDIwICAtRFMgIC1TT1MgICAgRlMgIC1XVVMgIC1CWVAgICAgTEYgICBFVEIgICBFU0MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSU5QICAgICAgICAgICAgICAgICAgICovCgkweDA3LCAweDA3LCAweDFDLCAweDA3LCAweDA3LCAweDBBLCAweDE3LCAweDFCLAovKiAweDI4ICAtU0EgIC1TRkUgICAtU00gIC1DU1AgIC1NRkEgICBFTlEgICBBQ0sgICBCRUwKICAgICAgICAgICAgICAgICAgICAgLVNXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAoJMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNSwgMHgwNiwgMHgwNywKLyogMHgzMCAtLS0tICAtLS0tICAgU1lOICAgLUlSICAgLVBQICAtVFJOICAtTkJTICAgRU9UICovCgkweDA3LCAweDA3LCAweDE2LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA0LAovKiAweDM4IC1TQlMgICAtSVQgIC1SRkYgIC1DVTMgICBEQzQgICBOQUsgIC0tLS0gICBTVUIgKi8KCTB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MTQsIDB4MTUsIDB4MDcsIDB4MUEsCi8qIDB4NDAgICBTUCAgIFJTUCAgICAgICAgICAg5CAgICAgICAgICAgICAgLS0tLSAgICAgICAqLwoJMHgyMCwgMHhGRiwgMHg4MywgMHg4NCwgMHg4NSwgMHhBMCwgMHgwNywgMHg4NiwKLyogMHg0OCAgICAgICAgICAgICAgICAgICAgICAuICAgICA8ICAgICAoICAgICArICAgICB8ICovCgkweDg3LCAweEE0LCAweDlCLCAweDJFLCAweDNDLCAweDI4LCAweDJCLCAweDdDLAovKiAweDUwICAgICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0gKi8KCTB4MjYsIDB4ODIsIDB4ODgsIDB4ODksIDB4OEEsIDB4QTEsIDB4OEMsIDB4MDcsCi8qIDB4NTggICAgICAgICAg3yAgICAgISAgICAgJCAgICAgKiAgICAgKSAgICAgOyAgICAgICAqLwoJMHg4RCwgMHhFMSwgMHgyMSwgMHgyNCwgMHgyQSwgMHgyOSwgMHgzQiwgMHhBQSwKLyogMHg2MCAgICAtICAgICAvICAtLS0tICAgICDEICAtLS0tICAtLS0tICAtLS0tICAgICAgICovCgkweDJELCAweDJGLCAweDA3LCAweDhFLCAweDA3LCAweDA3LCAweDA3LCAweDhGLAovKiAweDY4ICAgICAgICAgICAgIC0tLS0gICAgICwgICAgICUgICAgIF8gICAgID4gICAgID8gKi8gCgkweDgwLCAweEE1LCAweDA3LCAweDJDLCAweDI1LCAweDVGLCAweDNFLCAweDNGLAovKiAweDcwICAtLS0gICAgICAgIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gKi8KCTB4MDcsIDB4OTAsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCi8qIDB4NzggICAgKiAgICAgYCAgICAgOiAgICAgIyAgICAgQCAgICAgJyAgICAgPSAgICAgIiAqLwoJMHg3MCwgMHg2MCwgMHgzQSwgMHgyMywgMHg0MCwgMHgyNywgMHgzRCwgMHgyMiwKLyogMHg4MCAgICAqICAgICBhICAgICBiICAgICBjICAgICBkICAgICBlICAgICBmICAgICBnICovCgkweDA3LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAovKiAweDg4ICAgIGggICAgIGkgICAgICAgICAgICAgIC0tLS0gIC0tLS0gIC0tLS0gICAgICAgKi8KCTB4NjgsIDB4NjksIDB4QUUsIDB4QUYsIDB4MDcsIDB4MDcsIDB4MDcsIDB4RjEsCi8qIDB4OTAgICAgsCAgICAgaiAgICAgayAgICAgbCAgICAgbSAgICAgbiAgICAgbyAgICAgcCAqLwoJMHhGOCwgMHg2QSwgMHg2QiwgMHg2QywgMHg2RCwgMHg2RSwgMHg2RiwgMHg3MCwKLyogMHg5OCAgICBxICAgICByICAgICAgICAgICAgICAgICAgICAtLS0tICAgICAgICAtLS0tICovCgkweDcxLCAweDcyLCAweEE2LCAweEE3LCAweDkxLCAweDA3LCAweDkyLCAweDA3LAovKiAweEEwICAgICAgICAgIH4gICAgIHMgICAgIHQgICAgIHUgICAgIHYgICAgIHcgICAgIHggKi8KCTB4RTYsIDB4N0UsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi8qIDB4QTggICAgeSAgICAgeiAgICAgICAgICAgICAgLS0tLSAgLS0tLSAgLS0tLSAgLS0tLSAqLwoJMHg3OSwgMHg3QSwgMHhBRCwgMHhBQiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywKLyogMHhCMCAgICBeICAgICAgICAgICAgICAgICAgICAtLS0tICAgICCnICAtLS0tICAgICAgICovCgkweDVFLCAweDlDLCAweDlELCAweEZBLCAweDA3LCAweDA3LCAweDA3LCAweEFDLAovKiAweEI4ICAgICAgIC0tLS0gICAgIFsgICAgIF0gIC0tLS0gIC0tLS0gIC0tLS0gIC0tLS0gKi8KCTB4QUIsIDB4MDcsIDB4NUIsIDB4NUQsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCi8qIDB4QzAgICAgeyAgICAgQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRyAqLwoJMHg3QiwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywKLyogMHhDOCAgICBIICAgICBJICAtLS0tICAgICAgICAgICD2ICAgICAgICAgICAgICAtLS0tICovCgkweDQ4LCAweDQ5LCAweDA3LCAweDkzLCAweDk0LCAweDk1LCAweEEyLCAweDA3LAovKiAweEQwICAgIH0gICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gICAgIFAgKi8KCTB4N0QsIDB4NEEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NEUsIDB4NEYsIDB4NTAsCi8qIDB4RDggICAgUSAgICAgUiAgLS0tLSAgICAgICAgICAg/CAgICAgICAgICAgICAgICAgICAqLwoJMHg1MSwgMHg1MiwgMHgwNywgMHg5NiwgMHg4MSwgMHg5NywgMHhBMywgMHg5OCwKLyogMHhFMCAgICBcICAgICAgICAgICBTICAgICBUICAgICBVICAgICBWICAgICBXICAgICBYICovCgkweDVDLCAweEY2LCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAovKiAweEU4ICAgIFkgICAgIFogICAgICAgIC0tLS0gICAgINYgIC0tLS0gIC0tLS0gIC0tLS0gKi8KCTB4NTksIDB4NUEsIDB4RkQsIDB4MDcsIDB4OTksIDB4MDcsIDB4MDcsIDB4MDcsCi8qIDB4RjAgICAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAqLwoJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKLyogMHhGOCAgICA4ICAgICA5ICAtLS0tICAtLS0tICAgICDcICAtLS0tICAtLS0tICAtLS0tICovCgkweDM4LCAweDM5LCAweDA3LCAweDA3LCAweDlBLCAweDA3LCAweDA3LCAweDA3Cn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBBU0N0b0VCQ1syNTZdID0KewogICAgLyowMCAgTkwgICAgU0ggICAgU1ggICAgRVggICAgRVQgICAgTlEgICAgQUsgICAgQkwgKi8KCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MzcsIDB4MkQsIDB4MkUsIDB4MkYsCiAgICAvKjA4ICBCUyAgICBIVCAgICBMRiAgICBWVCAgICBGRiAgICBDUiAgICBTTyAgICBTSSAqLwoJMHgxNiwgMHgwNSwgMHgxNSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKICAgIC8qMTAgIERMICAgIEQxICAgIEQyICAgIEQzICAgIEQ0ICAgIE5LICAgIFNOICAgIEVCICovCgkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDNDLCAweDE1LCAweDMyLCAweDI2LAogICAgLyoxOCAgQ04gICAgRU0gICAgU0IgICAgRUMgICAgRlMgICAgR1MgICAgUlMgICAgVVMgKi8KCTB4MTgsIDB4MTksIDB4M0YsIDB4MjcsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsCiAgICAvKjIwICBTUCAgICAgISAgICAgIiAgICAgIyAgICAgJCAgICAgJSAgICAgJiAgICAgJyAqLwoJMHg0MCwgMHg1QSwgMHg3RiwgMHg3QiwgMHg1QiwgMHg2QywgMHg1MCwgMHg3RCwKICAgIC8qMjggICAoICAgICApICAgICAqICAgICArICAgICAsICAgICAtICAgIC4gICAgICAvICovCgkweDRELCAweDVELCAweDVDLCAweDRFLCAweDZCLCAweDYwLCAweDRCLCAweDYxLAogICAgLyozMCAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgKi8KCTB4RjAsIDB4RjEsIDB4RjIsIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsCiAgICAvKjM4ICAgOCAgICAgOSAgICAgOiAgICAgOyAgICAgPCAgICAgPSAgICAgPiAgICAgPyAqLwoJMHhGOCwgMHhGOSwgMHg3QSwgMHg1RSwgMHg0QywgMHg3RSwgMHg2RSwgMHg2RiwKICAgIC8qNDAgICBAICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAgICBHICovCgkweDdDLCAweEMxLCAweEMyLCAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LAogICAgLyo0OCAgIEggICAgIEkgICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gKi8KCTB4QzgsIDB4QzksIDB4RDEsIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsCiAgICAvKjUwICAgUCAgICAgUSAgICAgUiAgICAgUyAgICAgVCAgICAgVSAgICAgViAgICAgVyAqLwoJMHhENywgMHhEOCwgMHhEOSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwKICAgIC8qNTggICBYICAgICBZICAgICBaICAgICBbICAgICBcICAgICBdICAgICBeICAgICBfICovCgkweEU3LCAweEU4LCAweEU5LCAweEFELCAweEUwLCAweEJELCAweDVGLCAweDZELAogICAgLyo2MCAgIGAgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgIGcgKi8KCTB4NzksIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCiAgICAvKjY4ICAgaCAgICAgaSAgICAgaiAgICAgayAgICAgbCAgICAgbSAgICAgbiAgICAgbyAqLwoJMHg4OCwgMHg4OSwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKICAgIC8qNzAgICBwICAgICBxICAgICByICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICovCgkweDk3LCAweDk4LCAweDk5LCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LAogICAgLyo3OCAgIHggICAgIHkgICAgIHogICAgIHsgICAgIHwgICAgIH0gICAgIH4gICAgREwgKi8KCTB4QTcsIDB4QTgsIDB4QTksIDB4QzAsIDB4NEYsIDB4RDAsIDB4QTEsIDB4MDcsCgkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAoJMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCgkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAoJMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCgkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAoJMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCgkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAoJMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCgkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAoJMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCgkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweEZGCn07CgplbnVtIGZhaWx1cmUgewoJdW5hYmxlX3RvX29wZW4sCgl1bmFibGVfdG9fc2VlaywKCXVuYWJsZV90b193cml0ZSwKCXVuYWJsZV90b19yZWFkCn07CgpzdGF0aWMgY2hhciBidWZmZXJbODVdOwoKc3RhdGljIHZvaWQgCnZ0b2NfZXJyb3IgKGVudW0gZmFpbHVyZSB3aHksIGNoYXIgKnMxLCBjaGFyICpzMikgCnsKCVBERUJVRwoJY2hhciBlcnJvcls4MTkyXTsKCglzd2l0Y2ggKHdoeSkgewoJCWNhc2UgdW5hYmxlX3RvX29wZW46CgkJCXNwcmludGYoZXJyb3IsIF8oIiVzIG9wZW5pbmcgZGV2aWNlICclcycgZmFpbGVkLlxuJXNcbiIpLAoJCQkJCVZUT0NfRVJST1IsIHMxLCBzMik7CgkJCWJyZWFrOwoJCWNhc2UgdW5hYmxlX3RvX3NlZWs6CgkJCXNwcmludGYoZXJyb3IsIF8oIiVzIHNlZWtpbmcgZGV2aWNlICclcycgZmFpbGVkLlxuJXNcbiIpLAoJCQkJCVZUT0NfRVJST1IsIHMxLCBzMik7CgkJCWJyZWFrOwoJCWNhc2UgdW5hYmxlX3RvX3dyaXRlOgoJCQlzcHJpbnRmKGVycm9yLCBfKCIlcyB3cml0aW5nIHRvIGRldmljZSAnJXMnIGZhaWxlZCxcbiVzXG4iKSwKCQkJCQlWVE9DX0VSUk9SLCBzMSwgczIpOwoJCQlicmVhazsKCQljYXNlIHVuYWJsZV90b19yZWFkOgoJCQlzcHJpbnRmKGVycm9yLCBfKCIlcyByZWFkaW5nIGZyb20gZGV2aWNlICclcycgZmFpbGVkLlxuJXNcbiIpLAoJCQkJCVZUT0NfRVJST1IsIHMxLCBzMik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXNwcmludGYoZXJyb3IsIF8oIkZhdGFsIGVycm9yXG4iKSk7Cgl9CgoJcGVkX2V4Y2VwdGlvbl90aHJvdyhQRURfRVhDRVBUSU9OX0VSUk9SLCBQRURfRVhDRVBUSU9OX0NBTkNFTCwgZXJyb3IpOwp9CgpjaGFyICogCnZ0b2NfZWJjZGljX2VuYyAoY2hhciBzb3VyY2VbTElORV9MRU5HVEhdLAogICAgICAgICAgICAgICAgIGNoYXIgdGFyZ2V0W0xJTkVfTEVOR1RIXSwKICAgICAgICAgICAgICAgICBpbnQgbCkgCnsKCVBERUJVRwoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IGw7IGkrKykgCgkJdGFyZ2V0W2ldPUFTQ3RvRUJDWyh1bnNpZ25lZCBjaGFyKShzb3VyY2VbaV0pXTsKCglyZXR1cm4gdGFyZ2V0Owp9CgpjaGFyICogCnZ0b2NfZWJjZGljX2RlYyAoY2hhciBzb3VyY2VbTElORV9MRU5HVEhdLAogICAgICAgICAgICAgICAgIGNoYXIgdGFyZ2V0W0xJTkVfTEVOR1RIXSwKICAgICAgICAgICAgICAgICBpbnQgbCkKewoJUERFQlVHCglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSAKCQl0YXJnZXRbaV09RUJDdG9BU0NbKHVuc2lnbmVkIGNoYXIpKHNvdXJjZVtpXSldOwoKCXJldHVybiB0YXJnZXQ7Cn0KCnZvaWQgCnZ0b2Nfc2V0X2V4dGVudCAoZXh0ZW50X3QgKmV4dCwgdV9pbnQ4X3QgdHlwZWluZCwgdV9pbnQ4X3Qgc2Vxbm8sCiAgICAgICAgICAgICAgICAgY2NoaF90ICpsb3dlciwgY2NoaF90ICp1cHBlcikgCnsgCglQREVCVUcKCWV4dC0+dHlwZWluZCA9IHR5cGVpbmQ7CglleHQtPnNlcW5vICAgPSBzZXFubzsKCW1lbWNweSgmZXh0LT5sbGltaXQsbG93ZXIsc2l6ZW9mKGNjaGhfdCkpOwoJbWVtY3B5KCZleHQtPnVsaW1pdCx1cHBlcixzaXplb2YoY2NoaF90KSk7Cn0KCnZvaWQgCnZ0b2Nfc2V0X2NjaGggKGNjaGhfdCAqYWRkciwgdV9pbnQxNl90IGNjLCB1X2ludDE2X3QgaGgpIAp7CglQREVCVUcKCWFkZHItPmNjID0gY2M7CglhZGRyLT5oaCA9IGhoOwp9CgpzdGF0aWMgdm9pZCAKdnRvY19zZXRfdHRyICh0dHJfdCAqYWRkciwgdV9pbnQxNl90IHR0LCB1X2ludDhfdCByKSAKewoJUERFQlVHCglhZGRyLT50dCA9IHR0OwoJYWRkci0+ciA9IHI7Cn0KCnZvaWQgCnZ0b2Nfc2V0X2NjaGhiIChjY2hoYl90ICphZGRyLCB1X2ludDE2X3QgY2MsIHVfaW50MTZfdCBoaCwgdV9pbnQ4X3QgYikgCnsKCVBERUJVRwoJYWRkci0+Y2MgPSBjYzsKCWFkZHItPmhoID0gaGg7CglhZGRyLT5iID0gYjsKfQoKdm9pZCAKdnRvY19zZXRfZGF0ZSAobGFiZWxkYXRlX3QgKiBkLCB1X2ludDhfdCB5ZWFyLCB1X2ludDE2X3QgZGF5KSAKewoJUERFQlVHCglkLT55ZWFyID0geWVhcjsKCWQtPmRheSA9IGRheTsKfQoKLyoKICogaW5pdGlhbGl6ZXMgdGhlIHZvbHVtZSBsYWJlbCB3aXRoIEVCQ0RJQyBzcGFjZXMKICovCnZvaWQKdnRvY192b2x1bWVfbGFiZWxfaW5pdCAodm9sdW1lX2xhYmVsX3QgKnZsYWJlbCkKewoJUERFQlVHCglzcHJpbnRmKGJ1ZmZlciwgIiU4NHMiLCAiICIpOwoJdnRvY19lYmNkaWNfZW5jKGJ1ZmZlciwgYnVmZmVyLCA4NCk7CQoJc3RybmNweSh2bGFiZWwtPnZvbGtleSwgYnVmZmVyLCA4NCk7Cn0KCi8qCiAqIHJlYWRzIHRoZSB2b2x1bWUgbGFiZWwgZnJvbSBkYXNkCiAqLwppbnQgCnZ0b2NfcmVhZF92b2x1bWVfbGFiZWwgKGludCBmLCB1bnNpZ25lZCBsb25nIHZsYWJlbF9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2xhYmVsX3QgKnZsYWJlbCkgCnsKCVBERUJVRwoJaW50IHJjOwoKCWlmIChsc2VlayhmLCB2bGFiZWxfc3RhcnQsIFNFRUtfU0VUKSA9PSAtMSkgewoJCXZ0b2NfZXJyb3IodW5hYmxlX3RvX3NlZWssICJ2dG9jX3JlYWRfdm9sdW1lX2xhYmVsIiwKCQkJCSAgICJDb3VsZCBub3QgcmVhZCB2b2x1bWUgbGFiZWwuIik7CgkJcmV0dXJuIDE7Cgl9CgoJcmMgPSByZWFkKGYsIHZsYWJlbCwgc2l6ZW9mKHZvbHVtZV9sYWJlbF90KSk7CglpZiAocmMgIT0gc2l6ZW9mKHZvbHVtZV9sYWJlbF90KSkgewoJCXZ0b2NfZXJyb3IodW5hYmxlX3RvX3JlYWQsICJ2dG9jX3JlYWRfdm9sdW1lX2xhYmVsIiwKCQkJCSAgICJDb3VsZCBub3QgcmVhZCB2b2x1bWUgbGFiZWwuIik7CgkJcmV0dXJuIDE7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIHdyaXRlcyB0aGUgdm9sdW1lIGxhYmVsIHRvIGRhc2QKICovCmludCAKdnRvY193cml0ZV92b2x1bWVfbGFiZWwgKGludCBmLCB1bnNpZ25lZCBsb25nIHZsYWJlbF9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9sYWJlbF90ICp2bGFiZWwpIAp7CglQREVCVUcKCWludCByYzsKCglpZiAobHNlZWsoZiwgdmxhYmVsX3N0YXJ0LCBTRUVLX1NFVCkgPT0gLTEpCgkJdnRvY19lcnJvcih1bmFibGVfdG9fc2VlaywgInZ0b2Nfd3JpdGVfdm9sdW1lX2xhYmVsIiwKCQkJCSAgICJDb3VsZCBub3Qgd3JpdGUgdm9sdW1lIGxhYmVsLiIpOwoKCXJjID0gd3JpdGUoZiwgdmxhYmVsLCBzaXplb2Yodm9sdW1lX2xhYmVsX3QpKTsgCglpZiAocmMgIT0gc2l6ZW9mKHZvbHVtZV9sYWJlbF90KSkgCgkJdnRvY19lcnJvcih1bmFibGVfdG9fd3JpdGUsICJ2dG9jX3dyaXRlX3ZvbHVtZV9sYWJlbCIsCgkJCQkgICAiQ291bGQgbm90IHdyaXRlIHZvbHVtZSBsYWJlbC4iKTsKCglyZXR1cm4gMDsKfQoKLyoKICogdGFrZXMgYSBzdHJpbmcgYXMgaW5wdXQsIGNvbnZlcnRzIGl0IHRvIHVwcGVyY2FzZSwgdHJhbnNsYXRlcwogKiBpdCB0byBFQkNESUMgYW5kIGZpbGxzIGl0IHVwIHdpdGggc3BhY2VzIGJlZm9yZSBpdCBjb3BpZXMgaXQKICogYXMgdm9sdW1lIHNlcmlhbCB0byB0aGUgdm9sdW1lIGxhYmVsCiAqLwp2b2lkCnZ0b2Nfdm9sdW1lX2xhYmVsX3NldF92b2xzZXIgKHZvbHVtZV9sYWJlbF90ICp2bGFiZWwsIGNoYXIgKnZvbHNlcikKewoJUERFQlVHCglpbnQgaiwgaSA9IHN0cmxlbih2b2xzZXIpOwoJY2hhciBzW1ZPTFNFUl9MRU5HVEggKyAxXTsKCglzdHJjcHkocywgIiAgICAgICIpOwoJdnRvY19lYmNkaWNfZW5jKHMsIHMsIFZPTFNFUl9MRU5HVEgpOwoJc3RybmNweSh2bGFiZWwtPnZvbGlkLCBzLCBWT0xTRVJfTEVOR1RIKTsKCglpZiAoaSA+IFZPTFNFUl9MRU5HVEgpCgkJaSA9IFZPTFNFUl9MRU5HVEg7CgoJc3RybmNweShzLCB2b2xzZXIsIGkpOwoJZm9yIChqPTA7IGo8aTsgaisrKQoJCXNbal0gPSB0b3VwcGVyKHNbal0pOwoKCXNbVk9MU0VSX0xFTkdUSF0gPSAweDAwOwoJdnRvY19lYmNkaWNfZW5jKHMsIHMsIGkpOwoJc3RybmNweSh2bGFiZWwtPnZvbGlkLCBzLCBpKTsKCglyZXR1cm47Cn0KCi8qCiAqIHJldHVybnMgdGhlIHZvbHVtZSBzZXJpYWwgbnVtYmVyIHJpZ2h0IGFmdGVyIGl0IGlzIHRyYW5zbGF0ZWQgCiAqIHRvIEFTQ0lJCiAqLwpjaGFyICoKdnRvY192b2x1bWVfbGFiZWxfZ2V0X3ZvbHNlciAodm9sdW1lX2xhYmVsX3QgKnZsYWJlbCwgY2hhciAqdm9sc2VyKQp7CglQREVCVUcKCXZ0b2NfZWJjZGljX2RlYyh2bGFiZWwtPnZvbGlkLCB2b2xzZXIsIFZPTFNFUl9MRU5HVEgpOwoKCXJldHVybiB2b2xzZXI7Cn0KCi8qCiAqIHNldHMgdGhlIHZvbHVtZSBsYWJlbCBrZXkgcmlnaHQgYWZ0ZXIKICogaXQgaGFzIGJlZW4gdHJhbnNsYXRlZCB0byBFQkNESUMKICovCnZvaWQKdnRvY192b2x1bWVfbGFiZWxfc2V0X2tleSAodm9sdW1lX2xhYmVsX3QgKnZsYWJlbCwgY2hhciAqa2V5KQp7CglQREVCVUcKCWNoYXIgc1s0XTsKIAoJdnRvY19lYmNkaWNfZW5jKGtleSwgcywgNCk7CglzdHJuY3B5KHZsYWJlbC0+dm9sa2V5LCBzLCA0KTsKIAoJcmV0dXJuOwp9ICAgICAgICAgICAgICAgIAoKLyoKICogc2V0cyB0aGUgdm9sdW1lIGxhYmVsIGlkZW50aWZpZXIgcmlnaHQKICogYWZ0ZXIgaXQgaGFzIGJlZW4gdHJhbnNsYXRlZCB0byBFQkNESUMKICovCnZvaWQKdnRvY192b2x1bWVfbGFiZWxfc2V0X2xhYmVsICh2b2x1bWVfbGFiZWxfdCAqdmxhYmVsLCBjaGFyICpsYmwpCnsKCVBERUJVRwoJY2hhciBzWzRdOwoKCXZ0b2NfZWJjZGljX2VuYyhsYmwsIHMsIDQpOwoJc3RybmNweSh2bGFiZWwtPnZvbGxibCwgcywgNCk7CgoJcmV0dXJuOwp9CgovKgogKiByZXR1cm5zIHRoZSB2b2x1bWUgbGFiZWwga2V5ID0gdGhlIGxhYmVsIGlkZW50aWZpZXIKICogcmlnaHQgYWZ0ZXIgaXQgaGFzIGJlZW4gdHJhbnNsYXRlZCB0byBBU0NJSQogKi8KY2hhciAqCnZ0b2Nfdm9sdW1lX2xhYmVsX2dldF9sYWJlbCAodm9sdW1lX2xhYmVsX3QgKnZsYWJlbCwgY2hhciAqbGJsKQp7CglQREVCVUcKCXZ0b2NfZWJjZGljX2RlYyh2bGFiZWwtPnZvbGxibCwgbGJsLCA0KTsKCglyZXR1cm4gbGJsOwp9CgovKgogKiByZWFkcyBlaXRoZXIgYSBmb3JtYXQ0IGxhYmVsIG9yIGEgZm9ybWF0MSBsYWJlbAogKiBmcm9tIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KICovCnZvaWQgCnZ0b2NfcmVhZF9sYWJlbCAoaW50IGYsIHVuc2lnbmVkIGxvbmcgcG9zaXRpb24sIGZvcm1hdDFfbGFiZWxfdCAqZjEsCiAgICAgICAgICAgICAgICAgZm9ybWF0NF9sYWJlbF90ICpmNCwgZm9ybWF0NV9sYWJlbF90ICpmNSwgZm9ybWF0N19sYWJlbF90ICpmNykgCnsgICAgICAgIAoJUERFQlVHCglpbnQgdDsKCglpZiAobHNlZWsoZiwgcG9zaXRpb24sIFNFRUtfU0VUKSA9PSAtMSkgCgkJdnRvY19lcnJvcih1bmFibGVfdG9fc2VlaywgInZ0b2NfcmVhZF9sYWJlbCIsCgkJCQkgICBfKCJDb3VsZCBub3QgcmVhZCBWVE9DIGxhYmVscy4iKSk7CgoJaWYgKGYxICE9IE5VTEwpIHsKCQl0ID0gc2l6ZW9mKGZvcm1hdDFfbGFiZWxfdCk7CgkJaWYgKHJlYWQoZiwgZjEsIHQpICE9IHQpIAoJCQl2dG9jX2Vycm9yKHVuYWJsZV90b19yZWFkLCAidnRvY19yZWFkX2xhYmVsIiwKCQkJCQkgICBfKCJDb3VsZCBub3QgcmVhZCBWVE9DIEZNVDEgRFNDQi4iKSk7Cgl9CgoJaWYgKGY0ICE9IE5VTEwpIHsKCQl0ID0gc2l6ZW9mKGZvcm1hdDRfbGFiZWxfdCk7CgkJaWYgKHJlYWQoZiwgZjQsIHQpICE9IHQpIAoJCQl2dG9jX2Vycm9yKHVuYWJsZV90b19yZWFkLCAidnRvY19yZWFkX2xhYmVsIiwKCQkJCQkgICBfKCJDb3VsZCBub3QgcmVhZCBWVE9DIEZNVDQgRFNDQi4iKSk7Cgl9CgoJaWYgKGY1ICE9IE5VTEwpIHsKCQl0ID0gc2l6ZW9mKGZvcm1hdDVfbGFiZWxfdCk7CgkJaWYgKHJlYWQoZiwgZjUsIHQpICE9IHQpCgkJCXZ0b2NfZXJyb3IodW5hYmxlX3RvX3JlYWQsICJ2dG9jX3JlYWRfbGFiZWwiLAoJCQkJCSAgIF8oIkNvdWxkIG5vdCByZWFkIFZUT0MgRk1UNSBEU0NCLiIpKTsKCX0KCglpZiAoZjcgIT0gTlVMTCkgewoJCXQgPSBzaXplb2YoZm9ybWF0N19sYWJlbF90KTsKCQlpZiAocmVhZChmLCBmNywgdCkgIT0gdCkgCgkJCXZ0b2NfZXJyb3IodW5hYmxlX3RvX3JlYWQsICJ2dG9jX3JlYWRfbGFiZWwiLAoJCQkJCSAgIF8oIkNvdWxkIG5vdCByZWFkIFZUT0MgRk1UNyBEU0NCLiIpKTsKCX0KfQoKLyoKICogd3JpdGVzIGVpdGhlciBhIEZNVDEsIEZNVDQgb3IgRk1UNSBsYWJlbAogKiB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCiAqLwp2b2lkCnZ0b2Nfd3JpdGVfbGFiZWwgKGludCBmLCB1bnNpZ25lZCBsb25nIHBvc2l0aW9uLCBmb3JtYXQxX2xhYmVsX3QgKmYxLCAKICAgICAgICAgICAgICAgICAgZm9ybWF0NF9sYWJlbF90ICpmNCwgZm9ybWF0NV9sYWJlbF90ICpmNSwgZm9ybWF0N19sYWJlbF90ICpmNykKewoJUERFQlVHCglpbnQgdDsKCglpZiAobHNlZWsoZiwgcG9zaXRpb24sIFNFRUtfU0VUKSA9PSAtMSkgCgkJdnRvY19lcnJvcih1bmFibGVfdG9fc2VlaywgInZ0b2Nfd3JpdGVfbGFiZWwiLAoJCQkJICAgXygiQ291bGQgbm90IHdyaXRlIFZUT0MgbGFiZWxzLiIpKTsKCglpZiAoZjEgIT0gTlVMTCkgewoJCXQgPSBzaXplb2YoZm9ybWF0MV9sYWJlbF90KTsKCQlpZiAod3JpdGUoZiwgZjEsIHQpICE9IHQpIAoJCQl2dG9jX2Vycm9yKHVuYWJsZV90b193cml0ZSwgInZ0b2Nfd3JpdGVfbGFiZWwiLAoJCQkJCSAgIF8oIkNvdWxkIG5vdCB3cml0ZSBWVE9DIEZNVDEgRFNDQi4iKSk7Cgl9CgoJaWYgKGY0ICE9IE5VTEwpIHsKCQl0ID0gc2l6ZW9mKGZvcm1hdDRfbGFiZWxfdCk7CgkJaWYgKHdyaXRlKGYsIGY0LCB0KSAhPSB0KSAKCQkJdnRvY19lcnJvcih1bmFibGVfdG9fd3JpdGUsICJ2dG9jX3dyaXRlX2xhYmVsIiwKCQkJCQkgICBfKCJDb3VsZCBub3Qgd3JpdGUgVlRPQyBGTVQ0IERTQ0IuIikpOwoJfQoKCWlmIChmNSAhPSBOVUxMKSB7CgkJdCA9IHNpemVvZihmb3JtYXQ1X2xhYmVsX3QpOwoJCWlmICh3cml0ZShmLCBmNSwgdCkgIT0gdCkgCgkJCXZ0b2NfZXJyb3IodW5hYmxlX3RvX3dyaXRlLCAidnRvY193cml0ZV9sYWJlbCIsCgkJCQkJICAgXygiQ291bGQgbm90IHdyaXRlIFZUT0MgRk1UNSBEU0NCLiIpKTsKCX0KCglpZiAoZjcgIT0gTlVMTCkgewoJCXQgPSBzaXplb2YoZm9ybWF0N19sYWJlbF90KTsKCQlpZiAod3JpdGUoZiwgZjcsIHQpICE9IHQpIAoJCQl2dG9jX2Vycm9yKHVuYWJsZV90b193cml0ZSwgInZ0b2Nfd3JpdGVfbGFiZWwiLAoJCQkJCSAgIF8oIkNvdWxkIG5vdCB3cml0ZSBWVE9DIEZNVDcgRFNDQi4iKSk7Cgl9Cn0KCi8qCiAqIGluaXRpYWxpemVzIGEgZm9ybWF0NCBsYWJlbAogKi8Kdm9pZCAKdnRvY19pbml0X2Zvcm1hdDRfbGFiZWwgKGZvcm1hdDRfbGFiZWxfdCAqZjQsIHVuc2lnbmVkIGludCB1c2FibGVfcGFydGl0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjeWxpbmRlcnMsIHVuc2lnbmVkIGludCB0cmFja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tzLCB1bnNpZ25lZCBpbnQgYmxrc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCBkZXZfdHlwZSkgCnsKCVBERUJVRwoJaW50IGk7CgoJY2NoaF90IGxvd2VyID0ge1ZUT0NfU1RBUlRfQ0MsIFZUT0NfU1RBUlRfSEh9OwoJY2NoaF90IHVwcGVyID0ge1ZUT0NfU1RBUlRfQ0MsIFZUT0NfU1RBUlRfSEh9OwoKCWZvciAoaT0wOyBpPDQ0OyBpKyspIGY0LT5EUzRLRVlDRFtpXSA9IDB4MDQ7CiAgICAgICAgZjQtPkRTNElERk1UID0gMHhmNDsKCgl2dG9jX3NldF9jY2hoYigmZjQtPkRTNEhQQ0hSLCAweDAwMDAsIDB4MDAwMCwgMHgwMCk7CglmNC0+RFM0RFNSRUMgPSBibG9ja3MgLSAyOwoJLyogZnJlZSBzcGFjZSBzdGFydHMgcmlnaHQgYmVoaW5kIFZUT0MKCSAgIHZ0b2Nfc2V0X2NjaGgoJmY0LT5EUzRIQ0NISCwgVlRPQ19TVEFSVF9DQywgVlRPQ19TVEFSVF9ISCArIDEpOyovCgl2dG9jX3NldF9jY2hoKCZmNC0+RFM0SENDSEgsIDB4MDAwMCwgMHgwMDAwKTsKCWY0LT5EUzROT0FUSyA9IDB4MDAwMDsKCWY0LT5EUzRWVE9DSSA9IDB4MDA7CglmNC0+RFM0Tk9FWFQgPSAweDAxOwoJZjQtPkRTNFNNU0ZHID0gMHgwMDsKCWY0LT5EUzRERVZBQyA9IDB4MDA7CgoJLyogLS0gYmVnaW4gZjQtPkRTNERFVkNUIC0tICovCglmNC0+RFM0REVWQ1QuRFM0RFNDWUwgPSBjeWxpbmRlcnM7CglmNC0+RFM0REVWQ1QuRFM0RFNUUksgPSB0cmFja3M7CgoJc3dpdGNoIChkZXZfdHlwZSkgewoJCWNhc2UgREFTRF8zMzgwX1RZUEU6CgkJCWY0LT5EUzRERVZDVC5EUzRERVZUSyA9IERBU0RfMzM4MF9WQUxVRTsKCQkJYnJlYWs7CgkJY2FzZSBEQVNEXzMzOTBfVFlQRToKCQkJZjQtPkRTNERFVkNULkRTNERFVlRLID0gREFTRF8zMzkwX1ZBTFVFOwoJCQlicmVhazsKCQljYXNlIERBU0RfOTM0NV9UWVBFOgoJCQlmNC0+RFM0REVWQ1QuRFM0REVWVEsgPSBEQVNEXzkzNDVfVkFMVUU7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWY0LT5EUzRERVZDVC5EUzRERVZUSyA9IGJsb2NrcyAqIGJsa3NpemU7OwoJfQoKCWY0LT5EUzRERVZDVC5EUzRERVZJICA9IDB4MDA7CglmNC0+RFM0REVWQ1QuRFM0REVWTCAgPSAweDAwOwoJZjQtPkRTNERFVkNULkRTNERFVksgID0gMHgwMDsKCWY0LT5EUzRERVZDVC5EUzRERVZGRyA9IDB4MzA7CglmNC0+RFM0REVWQ1QuRFM0REVWVEwgPSAweDAwMDA7CglmNC0+RFM0REVWQ1QuRFM0REVWRFQgPSBibG9ja3M7CglmNC0+RFM0REVWQ1QuRFM0REVWREIgPSAweDAwOwoJLyogLS0gZW5kIGY0LT5EUzRERVZDVCAtLSAqLwoKCWJ6ZXJvKGY0LT5EUzRBTVRJTSwgc2l6ZW9mKGY0LT5EUzRBTVRJTSkpOwoJYnplcm8oZjQtPkRTNEFNQ0FULCBzaXplb2YoZjQtPkRTNEFNQ0FUKSk7CgliemVybyhmNC0+RFM0UjJUSU0sIHNpemVvZihmNC0+RFM0UjJUSU0pKTsKCWJ6ZXJvKGY0LT5yZXMxLCBzaXplb2YoZjQtPnJlczEpKTsKCWJ6ZXJvKGY0LT5EUzRGNlBUUiwgc2l6ZW9mKGY0LT5EUzRGNlBUUikpOwoKCS8qIC0tIGJlZ2luIGY0bGJsLT5EUzRWVE9DRSAtLSAqLwoJdnRvY19zZXRfZXh0ZW50KCZmNC0+RFM0VlRPQ0UsIDB4MDEsIDB4MDAsICZsb3dlciwgJnVwcGVyKTsKCS8qIC0tIGVuZCBmNGxibC0+RFM0VlRPQ0UgLS0gKi8KCgliemVybyhmNC0+cmVzMiwgc2l6ZW9mKGY0LT5yZXMyKSk7CglmNC0+RFM0RUZMVkwgPSAweDAwOwoJYnplcm8oJmY0LT5EUzRFRlBUUiwgc2l6ZW9mKGY0LT5EUzRFRlBUUikpOwoJYnplcm8oZjQtPnJlczMsIHNpemVvZihmNC0+cmVzMykpOwp9CgovKgogKiBpbml0aWFsaXplcyBhIGZvcm1hdDUgbGFiZWwKICovCnZvaWQKdnRvY19pbml0X2Zvcm1hdDVfbGFiZWwgKGZvcm1hdDVfbGFiZWxfdCAqZjUpIAp7CglQREVCVUcKCWludCBpOwoKCWJ6ZXJvKGY1LCBzaXplb2YoZm9ybWF0NV9sYWJlbF90KSk7Cglmb3IgKGk9MDsgaTw0OyBpKyspCgkJZjUtPkRTNUtFWUlEW2ldID0gMHgwNTsKCWY1LT5EUzVGTVRJRCA9IDB4ZjU7Cn0KCi8qCiAqIGluaXRpYWxpemVzIGEgZm9ybWF0NyBsYWJlbAogKi8Kdm9pZAp2dG9jX2luaXRfZm9ybWF0N19sYWJlbCAoZm9ybWF0N19sYWJlbF90ICpmNykgCnsKCVBERUJVRwoJaW50IGk7CgoJYnplcm8oZjcsIHNpemVvZihmb3JtYXQ3X2xhYmVsX3QpKTsKCWZvciAoaT0wOyBpPDQ7IGkrKykKCQlmNy0+RFM3S0VZSURbaV0gPSAweDA3OwoJZjctPkRTN0ZNVElEID0gMHhmNzsKfQoKLyoKICogaW5pdGlhbGl6ZXMgYSBmb3JtYXQxIGxhYmVsCiAqLwp2b2lkIAp2dG9jX2luaXRfZm9ybWF0MV9sYWJlbCAoY2hhciAqdm9saWQsIHVuc2lnbmVkIGludCBibGtzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50X3QgKnBhcnRfZXh0ZW50LCBmb3JtYXQxX2xhYmVsX3QgKmYxKSAKewoJUERFQlVHCglzdHJ1Y3QgdG0gKiBjcmVhdGltZTsKCXRpbWVfdCB0OwoJY2hhciBzdHJbODBdOwoKCS8qIGdldCBhY3R1YWwgZGF0ZSAqLwoJdCA9IHRpbWUoTlVMTCk7CgljcmVhdGltZSA9IGdtdGltZSgmdCk7CgoJYnplcm8oZjEtPkRTMURTTkFNLCBzaXplb2YoZjEtPkRTMURTTkFNKSk7CglzcHJpbnRmKHN0ciwgIlBBUlQgICAgLk5FVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Cgl2dG9jX2ViY2RpY19lbmMoc3RyLCBzdHIsIDQ0KTsKCXN0cm5jcHkoZjEtPkRTMURTTkFNLCBzdHIsIDQ0KTsKCWYxLT5EUzFGTVRJRCA9IDB4ZjE7CglzdHJuY3B5KGYxLT5EUzFEU1NOLCAiICAgICAgIiwgNik7CglmMS0+RFMxVk9MU1EgPSAweDAwMDE7CgoJdnRvY19zZXRfZGF0ZSgmZjEtPkRTMUNSRURULCAodV9pbnQ4X3QpIGNyZWF0aW1lLT50bV95ZWFyLAoJCQkJICAodV9pbnQxNl90KSBjcmVhdGltZS0+dG1feWRheSk7CgkvKiBleHBpcmVzIG5ldmVyIC0gOTkgMzY1ICovCgl2dG9jX3NldF9kYXRlKCZmMS0+RFMxRVhQRFQsIDB4NjMsIDB4MDE2RCk7CglmMS0+RFMxTk9FUFYgPSAweDAxOwoJZjEtPkRTMU5PQkRCID0gMHgwMDsKCWYxLT5EUzFGTEFHMSA9IDB4MDA7Cgl2dG9jX2ViY2RpY19lbmMoIklCTSBMSU5VWCAgICAiLCBzdHIsIDEzKTsKCXN0cm5jcHkoZjEtPkRTMVNZU0NELCBzdHIsIDEzKTsKCXZ0b2Nfc2V0X2RhdGUoJmYxLT5EUzFSRUZELCAodV9pbnQ4X3QpIGNyZWF0aW1lLT50bV95ZWFyLAoJCQkJICAodV9pbnQxNl90KSBjcmVhdGltZS0+dG1feWRheSk7CglmMS0+RFMxU01TRkcgPSAweDAwOwoJZjEtPkRTMVNDWFRGID0gMHgwMDsKCWYxLT5EUzFTQ1hUViA9IDB4MDAwMDsKCWYxLT5EUzFEU1JHMSA9IDB4MDA7CglmMS0+RFMxRFNSRzIgPSAweDAwOwoJZjEtPkRTMVJFQ0ZNID0gMHg4ODsKCWYxLT5EUzFPUFRDRCA9IDB4MDA7CglmMS0+RFMxQkxLTCAgPSBibGtzaXplOwoJZjEtPkRTMUxSRUNMID0gYmxrc2l6ZTsKCWYxLT5EUzFLRVlMICA9IDB4MDA7CglmMS0+RFMxUktQICAgPSAweDAwMDA7CglmMS0+RFMxRFNJTkQgPSAweDgwOyAvKiBsYXN0IHZvbHVtZSBmb3IgdGhpcyBkYXRhc2V0ICovCglmMS0+RFMxU0NBTDEgPSAweDgwOwoJYnplcm8oJmYxLT5EUzFTQ0FMMywgc2l6ZW9mKGYxLT5EUzFTQ0FMMykpOwoJdnRvY19zZXRfdHRyKCZmMS0+RFMxTFNUQVIsIDB4MDAwMCwgMHgwMCk7CglmMS0+RFMxVFJCQUwgPSAweDAwOwoJYnplcm8oJmYxLT5yZXMxLCBzaXplb2YoZjEtPnJlczEpKTsKCW1lbWNweSgmZjEtPkRTMUVYVDEsIHBhcnRfZXh0ZW50LCBzaXplb2YoZXh0ZW50X3QpKTsKCWJ6ZXJvKCZmMS0+RFMxRVhUMiwgc2l6ZW9mKGV4dGVudF90KSk7CgliemVybygmZjEtPkRTMUVYVDMsIHNpemVvZihleHRlbnRfdCkpOwoJdnRvY19zZXRfY2NoaGIoJmYxLT5EUzFQVFJEUywgMHgwMDAwLCAweDAwMDAsIDB4MDApOwp9CgovKgogKiBkbyBzb21lIHVwZGF0ZXMgdG8gdGhlIFZUT0MgZm9ybWF0NCBsYWJlbAogKi8Kdm9pZCAKdnRvY191cGRhdGVfZm9ybWF0NF9sYWJlbCAoZm9ybWF0NF9sYWJlbF90ICpmNCwgY2NoaGJfdCAqaGlnaGVzdF9mMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90IHVudXNlZF91cGRhdGUpCnsKCVBERUJVRwoJLyogdXBkYXRlIGhpZ2hlc3QgYWRkcmVzcyBvZiBhIGZvcm1hdCAxIGxhYmVsICovCgltZW1jcHkoJmY0LT5EUzRIUENIUiwgaGlnaGVzdF9mMSwgc2l6ZW9mKGNjaGhiX3QpKTsKCgkvKiB1cGRhdGUgdW51c2VkIERTQ0IgY291bnQgKi8KCWY0LT5EUzREU1JFQyA9IHVudXNlZF91cGRhdGU7Cn0KCi8qCiAqIHJlb3JnYW5pemVzIGFsbCBleHRlbnRzIHdpdGhpbiBhIEZNVDUgbGFiZWwKICovCnN0YXRpYyB2b2lkCnZ0b2NfcmVvcmdhbml6ZV9GTVQ1X2V4dGVudHMgKGZvcm1hdDVfbGFiZWxfdCAqZjUpIAp7CglQREVCVUcKCWRzNWV4dF90ICpleHQsICpsYXN0LCB0bXA7CglpbnQgaSwgajsKCglmb3IgKGk9MDsgaTwyNjsgaSsrKSB7CgkJaWYgKGk9PTApIAoJCQlsYXN0ID0gJmY1LT5EUzVBVkVYVDsgCgkJZWxzZSBpZiAoKGkgPiAwKSAmJiAoaSA8IDgpKQoJCQlsYXN0ID0gJmY1LT5EUzVFWFRBVltpLTFdOwoJCWVsc2UKCQkJbGFzdCA9ICZmNS0+RFM1TUFWRVRbaS04XTsKCgkJZm9yIChqPWk7IGo8MjY7IGorKykgewoJCQlpZiAoaj09MCkgCgkJCQlleHQgPSAmZjUtPkRTNUFWRVhUOyAKCQkJZWxzZSBpZiAoKGogPiAwKSAmJiAoaiA8IDgpKQoJCQkJZXh0ID0gJmY1LT5EUzVFWFRBVltqLTFdOwoJCQllbHNlCgkJCQlleHQgPSAmZjUtPkRTNU1BVkVUW2otOF07CgoJCQlpZiAoKChleHQtPnQgPiAwKSAmJiAobGFzdC0+dCA9PSAwKSkgfHwgCgkJCSAgICAoKGV4dC0+dCA+IDApICYmIChleHQtPnQgPCBsYXN0LT50KSkpCgkJCXsKCQkJCXRtcC50ICA9IGxhc3QtPnQ7CgkJCQl0bXAuZmMgPSBsYXN0LT5mYzsKCQkJCXRtcC5mdCA9IGxhc3QtPmZ0OwoJCQkJbGFzdC0+dCAgPSBleHQtPnQ7CgkJCQlsYXN0LT5mYyA9IGV4dC0+ZmM7CgkJCQlsYXN0LT5mdCA9IGV4dC0+ZnQ7CgkJCQlleHQtPnQgID0gdG1wLnQ7CgkJCQlleHQtPmZjID0gdG1wLmZjOwoJCQkJZXh0LT5mdCA9IHRtcC5mdDsKCQkJfQoJCX0KCX0KfQoKLyoKICogYWRkIGEgZnJlZSBzcGFjZSBleHRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIFZUT0MgRk1UNSBEU0NCCiAqLwp2b2lkIAp2dG9jX3VwZGF0ZV9mb3JtYXQ1X2xhYmVsX2FkZCAoZm9ybWF0NV9sYWJlbF90ICpmNSwgaW50IHZlcmJvc2UsIGludCBjeWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJrLCB1X2ludDE2X3QgYSwgdV9pbnQxNl90IGIsIHVfaW50OF90IGMpIAp7CglQREVCVUcKCWRzNWV4dF90ICpleHQgPSBOVUxMLCAqdG1wID0gTlVMTDsKCWludCBpOwkKCglmb3IgKGk9MDsgaTwyNjsgaSsrKSB7CgkJaWYgKGk9PTApIAoJCQlleHQgPSAmZjUtPkRTNUFWRVhUOyAKCQllbHNlIGlmICgoaSA+IDApICYmIChpIDwgOCkpCgkJCWV4dCA9ICZmNS0+RFM1RVhUQVZbaS0xXTsKCQllbHNlCgkJCWV4dCA9ICZmNS0+RFM1TUFWRVRbaS04XTsKCgkJaWYgKCgoYSA8IGV4dC0+dCkgJiYgKGEgKyBiKnRyayArIGMgPiBleHQtPnQpKSB8fCAKCQkgICAgKChhID4gZXh0LT50KSAmJiAoZXh0LT50ICsgZXh0LT5mYyp0cmsgKyBleHQtPmZ0ID4gYSkpKQoJCXsKCQkJcHV0cyAoIkJVRzogb3ZlcmxhcHBpbmcgZnJlZSBzcGFjZSBleHRlbnRzICIKCQkJICAgICAgImluIEZNVDUgRFNDQiFcbmV4aXRpbmcuLi4iKTsKCQkJZXhpdCgxKTsKCQl9CgoJCWlmICgoZXh0LT50ICsgZXh0LT5mYyArIGV4dC0+ZnQpID09IDB4MDAwMCkgewoJCQlleHQtPnQgID0gYTsKCQkJZXh0LT5mYyA9IGI7CgkJCWV4dC0+ZnQgPSBjOwoJCQl0bXAgPSBleHQ7CgkJCWlmICh2ZXJib3NlKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICgiRk1UNSBhZGQgZXh0ZW50OiBhZGQgbmV3IGV4dGVudCIpOwoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKHRtcCA9PSBOVUxMKSB7CgkJLyogQlVHOiBubyBmcmVlIGV4dGVudCBmb3VuZCAqLwoJCXB1dHMgKCJCVUc6IG5vIGZyZWUgRk1UNSBEU0NCIGV4dGVudCBmb3VuZCFcbmV4aXRpbmcuLi4iKTsKCQlleGl0KDEpOwoJfQoKCWZvciAoaT0wOyBpPDI2OyBpKyspIHsKCQlpZiAoaT09MCkKCQkJZXh0ID0gJmY1LT5EUzVBVkVYVDsKCQllbHNlIGlmICgoaSA+IDApICYmIChpIDwgOCkpCgkJCWV4dCA9ICZmNS0+RFM1RVhUQVZbaS0xXTsKCQllbHNlCgkJCWV4dCA9ICZmNS0+RFM1TUFWRVRbaS04XTsKCgkJaWYgKChleHQtPnQgKyBleHQtPmZjICsgZXh0LT5mdCkgPT0gMHgwMDAwKQoJCQljb250aW51ZTsKCgkJaWYgKChleHQtPnQgKyBleHQtPmZjKnRyayArIGV4dC0+ZnQpID09IHRtcC0+dCkgewoJCQkvKiB0aGlzIGV4dGVudCBwcmVjZWRlcyB0aGUgbmV3IG9uZSAqLwoJCQlleHQtPmZjICs9ICh0bXAtPmZjICsgKHRtcC0+ZnQgKyBleHQtPmZ0KS90cmspOwoJCQlleHQtPmZ0ID0gKHRtcC0+ZnQgKyBleHQtPmZ0KSAlIHRyazsKCQkJYnplcm8odG1wLCBzaXplb2YoZHM1ZXh0X3QpKTsKCQkJdG1wID0gZXh0OwoKCQkJaWYgKHZlcmJvc2UpIAoJCQkJcHV0cyAoIkZNVDUgYWRkIGV4dGVudDogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXJnZSB3aXRoIHByZWRlY2Vzc29yIik7CgoJCQlpID0gLTE7CgkJCWNvbnRpbnVlOwoJCX0gCgoJCWlmICgodG1wLT50ICsgdG1wLT5mYyp0cmsgKyB0bXAtPmZ0KSA9PSBleHQtPnQpIHsKCQkJLyogdGhpcyBleHRlbnQgc3VjY2VlZHMgdGhlIG5ldyBvbmUgKi8KCQkJZXh0LT50ID0gdG1wLT50OwoJCQlleHQtPmZjICs9ICh0bXAtPmZjICsgKHRtcC0+ZnQgKyBleHQtPmZ0KS90cmspOwoJCQlleHQtPmZ0ID0gKHRtcC0+ZnQgKyBleHQtPmZ0KSAlIHRyazsKCQkJYnplcm8odG1wLCBzaXplb2YoZHM1ZXh0X3QpKTsKCQkJdG1wID0gZXh0OwoKCQkJaWYgKHZlcmJvc2UpIAoJCQkJcHV0cyAoIkZNVDUgYWRkIGV4dGVudDogIgoJCQkJICAgICAgIm1lcmdlIHdpdGggc3VjY2Vzc29yIik7CgoJCQlpID0gLTE7CgkJCWNvbnRpbnVlOwoJCX0gCgl9Cn0KCi8qCiAqIHJlbW92ZSBhIGZyZWUgc3BhY2UgZXh0ZW50IGRlc2NyaXB0aW9uIGZyb20gdGhlIFZUT0MgRk1UNSBEU0NCCiAqLwp2b2lkIAp2dG9jX3VwZGF0ZV9mb3JtYXQ1X2xhYmVsX2RlbCAoZm9ybWF0NV9sYWJlbF90ICpmNSwgaW50IHZlcmJvc2UsIGludCBjeWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJrLCB1X2ludDE2X3QgYSwgdV9pbnQxNl90IGIsIHVfaW50OF90IGMpIAp7CglQREVCVUcKCWRzNWV4dF90ICpleHQ7CglpbnQgaSwgY291bnRlcj0wOwoJCglmb3IgKGk9MDsgaTwyNjsgaSsrKSB7CgkJaWYgKGk9PTApIAoJCQlleHQgPSAmZjUtPkRTNUFWRVhUOyAKCQllbHNlIGlmICgoaSA+IDApICYmIChpIDwgOCkpCgkJCWV4dCA9ICZmNS0+RFM1RVhUQVZbaS0xXTsKCQllbHNlCgkJCWV4dCA9ICZmNS0+RFM1TUFWRVRbaS04XTsKCgkJaWYgKChhID09IGV4dC0+dCkgJiYgKGIgPT0gZXh0LT5mYykgJiYgKGMgPT0gZXh0LT5mdCkpIHsKCQkJLyogZmlsbHMgdXAgd2hvbGUgZnJlZSBzcGFjZSBnYXAgKi8KCQkJYnplcm8oZXh0LCBzaXplb2YoZHM1ZXh0X3QpKTsKCgkJCWlmICh2ZXJib3NlKSAKCQkJCXB1dHMgKCJGTVQ1IGRlbCBleHRlbnQ6IGZpbGxzIHdob2xlIGdhcCIpOwoKCQkJY291bnRlcisrOwoJCQlicmVhazsKCQl9CgoJCWlmICgoYSA9PSBleHQtPnQpICYmICgoYiA8IGV4dC0+ZmMpIHx8IChjIDwgZXh0LT5mdCkpKSB7CgkJCS8qIGxlZnQtYm91bmRlZCBpbiBmcmVlIHNwYWNlIGdhcCAqLwoJCQlleHQtPnQgPSBleHQtPnQgKyBiKnRyayArIGM7CgoJCQlpZiAoYyA+IGV4dC0+ZnQpIHsKCQkJCWV4dC0+ZmMgLT0gKGIgKyAxKTsKCQkJCWV4dC0+ZnQgLT0gKGMgLSB0cmspOwoJCQl9IGVsc2UgewoJCQkJZXh0LT5mYyAtPSBiOwoJCQkJZXh0LT5mdCAtPSBjOwoJCQl9CgoJCQlpZiAodmVyYm9zZSkgCgkJCQlwdXRzICgiRk1UNSBkZWwgZXh0ZW50OiBsZWZ0IGJvdW5kZWQiKTsKCgkJCWNvdW50ZXIrKzsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoKGV4dC0+dCA8IGEpCgkJICAgICYmICgoZXh0LT50ICsgZXh0LT5mYyp0cmsgKyBleHQtPmZ0KSA9PSAoYSArIGIqdHJrICsgYykpKQoJCXsKCQkJLyogcmlnaHQtYm91bmRlZCBpbiBmcmVlIHNwYWNlIGdhcCAqLwoJCQlpZiAoYyA+IGV4dC0+ZnQpIHsKCQkJCWV4dC0+ZmMgLT0gKGIgKyAxKTsKCQkJCWV4dC0+ZnQgLT0gKGMgLSB0cmspOwoJCQl9IGVsc2UgewoJCQkJZXh0LT5mYyAtPSBiOwoJCQkJZXh0LT5mdCAtPSBjOwoJCQl9CgoJCQlpZiAodmVyYm9zZSkgCgkJCQlwdXRzICgiRk1UNSBkZWwgZXh0ZW50OiByaWdodCBib3VuZGVkIik7CgoJCQljb3VudGVyKys7CgkJCWJyZWFrOwoJCX0KCgkJaWYgKChhID4gZXh0LT50KQoJCQkmJiAoKGV4dC0+dCArIGV4dC0+ZmMqdHJrICsgZXh0LT5mdCkgPiAoYSArIGIqdHJrICsgYykpKQoJCXsKCQkJLyogcGFydGl0aW9uIGRldmlkZXMgZnJlZSBzcGFjZSBpbnRvIDIgcGllY2VzICovCgkJCXVfaW50MTZfdCB4ID0gYSArIGIqdHJrICsgYzsKCQkJdV9pbnQxNl90IHcseTsKCQkJdV9pbnQ4X3QgejsKCgkJCXcgPSAoZXh0LT50ICsgZXh0LT5mYyp0cmsgKyBleHQtPmZ0KSAtIChhICsgYip0cmsgKyBjKTsKCQkJeSA9IHcgLyB0cms7CgkJCXogPSB3ICUgdHJrOwoKCQkJZXh0LT5mYyA9IChhIC0gZXh0LT50KSAvIHRyazsKCQkJZXh0LT5mdCA9IChhIC0gZXh0LT50KSAlIHRyazsKCgkJCXZ0b2NfdXBkYXRlX2Zvcm1hdDVfbGFiZWxfYWRkKGY1LCB2ZXJib3NlLCAKCQkJCQkJICAgICAgY3lsLCB0cmssIHgsIHksIHopOwoKCQkJaWYgKHZlcmJvc2UpIAoJCQkJcHV0cyAoIkZNVDUgZGVsIGV4dGVudDogMiBwaWVjZXMiKTsKCgkJCWNvdW50ZXIrKzsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoKGEgPCBleHQtPnQpICYmIChhICsgYip0cmsgKyBjID4gZXh0LT50KQoJCSAgICAmJiAoYSArIGIqdHJrICsgYyA8IGV4dC0+dCArIGV4dC0+ZmMqdHJrICsgZXh0LT5mdCkpCgkJewoJCQlwdXRzICgiQlVHOiBjb3JyZXNwb25kaW5nIGZyZWUgc3BhY2UgZXh0ZW50ICIKCQkJICAgICAgImRvZXNuJ3QgbWF0Y2ggZnJlZSBzcGFjZSBjdXJyZW50bHkgc2hvd24gIgoJCQkgICAgICAiaW4gRk1UNSBEU0NCIVxuZXhpdGluZy4uLiIpOwoJCQlleGl0KDEpOwoJCX0KCQkKCQlpZiAoKGEgPiBleHQtPnQpICYmIChhIDwgZXh0LT50ICsgZXh0LT5mYyp0cmsgKyBleHQtPmZ0KQoJCSAgICAmJiAoYSArIGIqdHJrICsgYyA+IGV4dC0+dCArIGV4dC0+ZmMqdHJrICsgZXh0LT5mdCkpCgkJewoJCQlwdXRzICgiQlVHOiBzcGVjaWZpZWQgZnJlZSBzcGFjZSBleHRlbnQgZm9yICIKCQkJICAgICAgImRlbGV0aW5nIGRvZXNuJ3QgbWF0Y2ggZnJlZSBzcGFjZSAiCgkJCSAgICAgICJjdXJyZW50bHkgc2hvd24gaW4gRk1UNSBEU0NCIVxuIgoJCQkgICAgICAiZXhpdGluZy4uLiIpOwoJCQlleGl0KDEpOwoJCX0KCX0KCglpZiAoY291bnRlciA+IDApCgkJcmV0dXJuOwoKCXB1dHMgKCJCVUc6IHNwZWNpZmllZCBmcmVlIHNwYWNlIGV4dGVudCBmb3IgIgoJICAgICAgImRlbGV0aW5nIG5vdCBmb3VuZCBpbiBGTVQ1IERTQ0IhXG4iCgkgICAgICAiZXhpdGluZy4uLiIpOwoJZXhpdCgxKTsKfQoKLyoKICogcmVvcmdhbml6ZXMgYWxsIGV4dGVudHMgd2l0aGluIGEgRk1UNyBsYWJlbAogKi8Kc3RhdGljIHZvaWQKdnRvY19yZW9yZ2FuaXplX0ZNVDdfZXh0ZW50cyAoZm9ybWF0N19sYWJlbF90ICpmNykgCnsKCVBERUJVRwoJZHM3ZXh0X3QgKmV4dCwgKmxhc3QsIHRtcDsKCWludCBpLCBqOwoKCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKCQlpZiAoaTw1KSAKCQkJbGFzdCA9ICZmNy0+RFM3RVhUTlRbaV07IAoJCWVsc2UgCgkJCWxhc3QgPSAmZjctPkRTN0FERVhUW2ktNV07CgoJCWZvciAoaj1pOyBqPDE2OyBqKyspIHsKCQkJaWYgKGo8NSkgCgkJCQlleHQgPSAmZjctPkRTN0VYVE5UW2pdOyAKCQkJZWxzZSAKCQkJCWV4dCA9ICZmNy0+RFM3QURFWFRbai01XTsKCgkJCWlmICgoKGV4dC0+YSA+IDApICYmIChsYXN0LT5hID09IDApKQoJCQkgICAgfHwgKChleHQtPmEgPiAwKSAmJiAoZXh0LT5hIDwgbGFzdC0+YSkpKQoJCQl7CgkJCQl0bXAuYSA9IGxhc3QtPmE7CgkJCQl0bXAuYiA9IGxhc3QtPmI7CgkJCQlsYXN0LT5hID0gZXh0LT5hOwoJCQkJbGFzdC0+YiA9IGV4dC0+YjsKCQkJCWV4dC0+YSA9IHRtcC5hOwoJCQkJZXh0LT5iID0gdG1wLmI7CgkJCX0KCQl9Cgl9Cn0KCi8qCiAqIGFkZCBhIGZyZWUgc3BhY2UgZXh0ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBWVE9DIEZNVDcgRFNDQgogKi8Kdm9pZCAKdnRvY191cGRhdGVfZm9ybWF0N19sYWJlbF9hZGQgKGZvcm1hdDdfbGFiZWxfdCAqZjcsIGludCB2ZXJib3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQzMl90IGEsIHVfaW50MzJfdCBiKSAKewoJUERFQlVHCglkczdleHRfdCAqZXh0ID0gTlVMTCwgKnRtcCA9IE5VTEw7CglpbnQgaTsJCgoJZm9yIChpPTA7IGk8MTY7IGkrKykgewoJCWlmIChpPDUpIAoJCQlleHQgPSAmZjctPkRTN0VYVE5UW2ldOyAKCQllbHNlIAoJCQlleHQgPSAmZjctPkRTN0FERVhUW2ktNV07CgoJCWlmICgoKGEgPCBleHQtPmEpICYmIChiID4gZXh0LT5hKSAmJiAoYiA8IGV4dC0+YikpCgkJICAgIHx8ICgoYSA+IGV4dC0+YSkgJiYgKGEgPCBleHQtPmIpICYmIChiID4gZXh0LT5iKSkpCgkJewoJCQlwdXRzICgiQlVHOiBvdmVybGFwcGluZyBmcmVlIHNwYWNlIGV4dGVudHMgIgoJCQkgICAgICAiaW4gRk1UNyBEU0NCIVxuZXhpdGluZy4uLiIpOwoJCQlleGl0KDEpOwoJCX0KCgkJaWYgKChleHQtPmEgKyBleHQtPmIpID09IDB4MDAwMDAwMDApIHsKCQkJZXh0LT5hID0gYTsKCQkJZXh0LT5iID0gYjsKCQkJdG1wID0gZXh0OwoKCQkJaWYgKHZlcmJvc2UpIAoJCQkJcHV0cyAoIkZNVDcgYWRkIGV4dGVudDogYWRkIG5ldyBleHRlbnQiKTsKCgkJCWJyZWFrOwoJCX0KCX0KCglpZiAodG1wID09IE5VTEwpIHsKCQkvKiBCVUc6IG5vIGZyZWUgZXh0ZW50IGZvdW5kICovCgkJcHV0cyAoIkJVRzogbm8gZnJlZSBGTVQ3IERTQ0IgZXh0ZW50IGZvdW5kIVxuZXhpdGluZy4uLiIpOwoJCWV4aXQoMSk7Cgl9CgoJZm9yIChpPTA7IGk8MTY7IGkrKykgewoJCWlmIChpPDUpIAoJCQlleHQgPSAmZjctPkRTN0VYVE5UW2ldOyAKCQllbHNlIAoJCQlleHQgPSAmZjctPkRTN0FERVhUW2ktNV07CgoJCWlmICgoZXh0LT5hICsgZXh0LT5iKSA9PSAweDAwMDAwMDAwKQoJCQljb250aW51ZTsKCgkJaWYgKChleHQtPmIgKyAxKSA9PSB0bXAtPmEpIHsKCQkJLyogdGhpcyBleHRlbnQgcHJlY2VkZXMgdGhlIG5ldyBvbmUgKi8KCQkJZXh0LT5iID0gdG1wLT5iOwoJCQliemVybyh0bXAsIHNpemVvZihkczdleHRfdCkpOwoJCQl0bXAgPSBleHQ7CgoJCQlpZiAodmVyYm9zZSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAoIkZNVDcgYWRkIGV4dGVudDogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXJnZSB3aXRoIHByZWRlY2Vzc29yIik7CgoJCQlpID0gLTE7CgkJCWNvbnRpbnVlOwoJCX0gCgoJCWlmIChleHQtPmEgPT0gKHRtcC0+YiArIDEpKSB7CgkJCS8qIHRoaXMgZXh0ZW50IHN1Y2NlZWRzIHRoZSBuZXcgb25lICovCgkJCWV4dC0+YSA9IHRtcC0+YTsKCQkJYnplcm8odG1wLCBzaXplb2YoZHM3ZXh0X3QpKTsKCQkJdG1wID0gZXh0OwoKCQkJaWYgKHZlcmJvc2UpIAoJCQkJcHV0cyAoIkZNVDcgYWRkIGV4dGVudDogbWVyZ2Ugd2l0aCBzdWNjZXNzb3IiKTsKCgkJCWkgPSAtMTsKCQkJY29udGludWU7CgkJfSAKCX0KfQoKLyoKICogcmVtb3ZlIGEgZnJlZSBzcGFjZSBleHRlbnQgZGVzY3JpcHRpb24gZnJvbSB0aGUgVlRPQyBGTVQ3IERTQ0IKICovCnZvaWQgCnZ0b2NfdXBkYXRlX2Zvcm1hdDdfbGFiZWxfZGVsIChmb3JtYXQ3X2xhYmVsX3QgKmY3LCBpbnQgdmVyYm9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MzJfdCBhLCB1X2ludDMyX3QgYikgCnsKCVBERUJVRwoJZHM3ZXh0X3QgKmV4dDsKCWludCBpLCBjb3VudGVyPTA7CgkKCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKCQlpZiAoaTw1KSAKCQkJZXh0ID0gJmY3LT5EUzdFWFROVFtpXTsgCgkJZWxzZSAKCQkJZXh0ID0gJmY3LT5EUzdBREVYVFtpLTVdOwoKCQlpZiAoKGEgPT0gZXh0LT5hKSAmJiAoYiA9PSBleHQtPmIpKSB7CgkJCS8qIGZpbGxzIHVwIHdob2xlIGZyZWUgc3BhY2UgZ2FwICovCgkJCWJ6ZXJvKGV4dCwgc2l6ZW9mKGRzN2V4dF90KSk7CgoJCQlpZiAodmVyYm9zZSkgCgkJCQlwdXRzICgiRk1UNyBkZWwgZXh0ZW50OiBmaWxscyB3aG9sZSBnYXAiKTsKCgkJCWNvdW50ZXIrKzsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoKGEgPT0gZXh0LT5hKSAmJiAoYiA8IGV4dC0+YikpIHsKCQkJLyogbGVmdC1ib3VuZGVkIGluIGZyZWUgc3BhY2UgZ2FwICovCgkJCWV4dC0+YSA9IGIgKyAxOwoKCQkJaWYgKHZlcmJvc2UpIAoJCQkJcHV0cyAoIkZNVDcgYWRkIGV4dGVudDogbGVmdC1ib3VuZGVkIik7CgoJCQljb3VudGVyKys7CgkJCWJyZWFrOwoJCX0KCgkJaWYgKChhID4gZXh0LT5hKSAmJiAoYiA9PSBleHQtPmIpKSB7CgkJCS8qIHJpZ2h0LWJvdW5kZWQgaW4gZnJlZSBzcGFjZSBnYXAgKi8KCQkJZXh0LT5iID0gYSAtIDE7CgoJCQlpZiAodmVyYm9zZSkgCgkJCQlwdXRzICgiRk1UNyBhZGQgZXh0ZW50OiByaWdodC1ib3VuZGVkIik7CgoJCQljb3VudGVyKys7CgkJCWJyZWFrOwoJCX0KCgkJaWYgKChhID4gZXh0LT5hKSAmJiAoYiA8IGV4dC0+YikpIHsKCQkJLyogcGFydGl0aW9uIGRldmlkZXMgZnJlZSBzcGFjZSBpbnRvIDIgcGllY2VzICovCgkJCXZ0b2NfdXBkYXRlX2Zvcm1hdDdfbGFiZWxfYWRkKGY3LCB2ZXJib3NlLCBiKzEsIGV4dC0+Yik7CgkJCWV4dC0+YiA9IGEgLSAxOwoKCQkJaWYgKHZlcmJvc2UpIAoJCQkJcHV0cyAoIkZNVDcgYWRkIGV4dGVudDogMiBwaWVjZXMiKTsKCgkJCWNvdW50ZXIrKzsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoKChhIDwgZXh0LT5hKSAmJiAoYiA+IGV4dC0+YSkpIHx8ICgoYSA8IGV4dC0+YikgJiYgKGIgPiBleHQtPmIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICgiQlVHOiBzcGVjaWZpZWQgZnJlZSBzcGFjZSBleHRlbnQgZm9yIGRlbGV0aW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggZnJlZSBzcGFjZSBjdXJyZW50bHkgc2hvd24gaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRk1UNyBEU0NCIVxuZXhpdGluZy4uLiIpOwoJCQlwcmludGYgKCIlZCAlZCAlZCAlZFxuIiwgYSwgYiwgZXh0LT5hLCBleHQtPmIpOwoJCQlleGl0KDEpOwoJCX0KCX0KCglpZiAoY291bnRlciA+IDApCgkJcmV0dXJuOwoKCXB1dHMgKCJCVUc6IHNwZWNpZmllZCBmcmVlIHNwYWNlIGV4dGVudCBmb3IgIgoJICAgICAgImRlbGV0aW5nIG5vdCBmb3VuZCBpbiBGTVQ3IERTQ0IhXG4iCgkgICAgICAiZXhpdGluZy4uLiIpOwoJZXhpdCgxKTsKfQoKdm9pZAp2dG9jX3NldF9mcmVlc3BhY2UoZm9ybWF0NF9sYWJlbF90ICpmNCwgZm9ybWF0NV9sYWJlbF90ICpmNSwKICAgICAgICAgICAgICAgICAgIGZvcm1hdDdfbGFiZWxfdCAqZjcsIGNoYXIgY2gsIGludCB2ZXJib3NlLAogICAgICAgICAgICAgICAgICAgdV9pbnQzMl90IHN0YXJ0LCB1X2ludDMyX3Qgc3RvcCwgaW50IGN5bCwgaW50IHRyaykKewoJUERFQlVHCglpZiAoKGN5bCAqIHRyaykgPiBCSUdfRElTS19TSVpFKSB7CgkJaWYgKGNoID09ICcrJykKCQkJdnRvY191cGRhdGVfZm9ybWF0N19sYWJlbF9hZGQoZjcsIHZlcmJvc2UsIHN0YXJ0LCBzdG9wKTsKCQllbHNlIGlmIChjaCA9PSAnLScpCgkJCXZ0b2NfdXBkYXRlX2Zvcm1hdDdfbGFiZWxfZGVsKGY3LCB2ZXJib3NlLCBzdGFydCwgc3RvcCk7CgkJZWxzZQoJCQlwdXRzICgiQlVHOiBzeW50YXggZXJyb3IgaW4gdnRvY19zZXRfZnJlZXNwYWNlIGNhbGwiKTsKCgkJdnRvY19yZW9yZ2FuaXplX0ZNVDdfZXh0ZW50cyAoZjcpOwoKCQlmNC0+RFM0VlRPQ0kgPSAweGEwOwoJCWY0LT5EUzRFRkxWTCA9IDB4MDc7CgkJdnRvY19zZXRfY2NoaGIoJmY0LT5EUzRFRlBUUiwgMHgwMDAwLCAweDAwMDEsIDB4MDMpOwoJfSBlbHNlIHsKCQl1X2ludDE2X3QgeCx5OwoJCXVfaW50OF90IHo7CgoJCXggPSAodV9pbnQxNl90KSBzdGFydDsKCQl5ID0gKHVfaW50MTZfdCkgKChzdG9wIC0gc3RhcnQgKyAxKSAvIHRyayk7CgkJeiA9ICAodV9pbnQ4X3QpICgoc3RvcCAtIHN0YXJ0ICsgMSkgJSB0cmspOwoKCQlpZiAoY2ggPT0gJysnKQoJCQl2dG9jX3VwZGF0ZV9mb3JtYXQ1X2xhYmVsX2FkZChmNSwgdmVyYm9zZSwgY3lsLCB0cmssIHgsIHksIHopOwoJCWVsc2UgaWYgKGNoID09ICctJykKCQkJdnRvY191cGRhdGVfZm9ybWF0NV9sYWJlbF9kZWwoZjUsIHZlcmJvc2UsIGN5bCwgdHJrLCB4LCB5LCB6KTsKCQllbHNlCgkJCXB1dHMgKCJCVUc6IHN5bnRheCBlcnJvciBpbiB2dG9jX3NldF9mcmVlc3BhY2UgY2FsbCIpOwoKCQl2dG9jX3Jlb3JnYW5pemVfRk1UNV9leHRlbnRzIChmNSk7Cgl9Cn0K