LyoKICogVVNCIFZpQ2FtIFdlYkNhbSBkcml2ZXIKICogQ29weXJpZ2h0IChjKSAyMDAyIEpvZSBCdXJrcyAoamJ1cmtzQHdhdmljbGUub3JnKSwKICogICAgICAgICAgICAgICAgICAgIENocmlzdG9waGVyIEwgQ2hlbmV5IChjY2hlbmV5QGNoZW5leS5jeCksCiAqICAgICAgICAgICAgICAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opLAogKiAgICAgICAgICAgICAgICAgICAgSm9obiBUeW5lciAoanR5bmVyQGNzLnVjci5lZHUpLAogKiAgICAgICAgICAgICAgICAgICAgTW9ucm9lIFdpbGxpYW1zIChtb25yb2VAcG9ib3guY29tKQogKgogKiBTdXBwb3J0cyAzQ09NIEhvbWVDb25uZWN0IFBDIERpZ2l0YWwgV2ViQ2FtCiAqIFN1cHBvcnRzIENvbXBybyBQUzM5VSBXZWJDYW0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgYmFzZWQgaGVhdmlseSBvbiB0aGUgQ1BpQSB3ZWJjYW0gZHJpdmVyIHdoaWNoIHdhcwogKiB3cml0dGVuIGJ5IFBldGVyIFByZWdsZXIsIFNjb3R0IEouIEJlcnRpbiBhbmQgSm9oYW5uZXMgRXJkZmVsdAogKgogKiBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgd2VyZSBhbHNvIGNvcGllZCBmcm9tIHVzYnZpZGVvLmMKICoKICogU3BlY2lhbCB0aGFua3MgdG8gdGhlIHdob2xlIHRlYW0gYXQgU291cmNlZm9yZ2UgZm9yIGhlbHAgbWFraW5nCiAqIHRoaXMgZHJpdmVyIGJlY29tZSBhIHJlYWxpdHkuICBOb3RhYmx5OgogKiBBbmR5IEFybXN0cm9uZyB3aG8gcmV2ZXJzZSBlbmdpbmVlcmVkIHRoZSBjb2xvciBlbmNvZGluZyBhbmQKICogUGF2ZWwgTWFjaGVrIGFuZCBDaHJpcyBDaGVuZXkgd2hvIHdvcmtlZCBvbiByZXZlcnNlIGVuZ2luZWVyaW5nIHRoZQogKiAgICBjYW1lcmEgY29udHJvbHMgYW5kIHdyb3RlIHRoZSBmaXJzdCBnZW5lcmF0aW9uIGRyaXZlci4KICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiNpbmNsdWRlIDxsaW51eC91c2IuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiNpbmNsdWRlICJ1c2J2aWRlby5oIgoKLy8gI2RlZmluZSBWSUNBTV9ERUJVRwoKI2lmZGVmIFZJQ0FNX0RFQlVHCiNkZWZpbmUgQURCRyhsaW5lbm8sZm10LGFyZ3MuLi4pIHByaW50ayhmbXQsIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgbGluZW5vLCAjI2FyZ3MpCiNkZWZpbmUgREJHKGZtdCxhcmdzLi4uKSBBREJHKChfX0xJTkVfXyksS0VSTl9ERUJVRyBfX0ZJTEVfXyIoJWxkKTolcyAoJWQpOiJmbXQsIyNhcmdzKQojZWxzZQojZGVmaW5lIERCRyhmbW4sYXJncy4uLikgZG8ge30gd2hpbGUoMCkKI2VuZGlmCgojZGVmaW5lIERSSVZFUl9BVVRIT1IgICAgICAgICAgICJKb2UgQnVya3MsIGpidXJrc0B3YXZpY2xlLm9yZyIKI2RlZmluZSBEUklWRVJfREVTQyAgICAgICAgICAgICAiVmlDYW0gV2ViQ2FtIERyaXZlciIKCi8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KI2RlZmluZSBVU0JfVklDQU1fVkVORE9SX0lECTB4MDRjMQojZGVmaW5lIFVTQl9WSUNBTV9QUk9EVUNUX0lECTB4MDA5ZAojZGVmaW5lIFVTQl9DT01QUk9fVkVORE9SX0lECTB4MDYwMgojZGVmaW5lIFVTQl9DT01QUk9fUFJPRFVDVF9JRAkweDEwMDEKCiNkZWZpbmUgVklDQU1fQllURVNfUEVSX1BJWEVMICAgMwojZGVmaW5lIFZJQ0FNX01BWF9SRUFEX1NJWkUgICAgICg1MTIqMjQyKzEyOCkKI2RlZmluZSBWSUNBTV9NQVhfRlJBTUVfU0laRSAgICAoVklDQU1fQllURVNfUEVSX1BJWEVMKjMyMCoyNDApCiNkZWZpbmUgVklDQU1fRlJBTUVTICAgICAgICAgICAgMgoKI2RlZmluZSBWSUNBTV9IRUFERVJfU0laRSAgICAgICA2NAoKI2RlZmluZSBjbGFtcCggeCwgbCwgaCApICAgICAgICBtYXhfdCggX190eXBlb2ZfXyggeCApLCAgICAgICAgIFwKCQkJCSAgICAgICAoIGwgKSwgICAgICAgICAgICAgICAgICAgXAoJCQkJICAgICAgIG1pbl90KCBfX3R5cGVvZl9fKCB4ICksICBcCgkJCQkJICAgICAgKCBoICksICAgICAgICAgICAgXAoJCQkJCSAgICAgICggeCApICkgKQoKLyogTm90IHN1cmUgd2hhdCBhbGwgdGhlIGJ5dGVzIGluIHRoZXNlIGNoYXIKICogYXJyYXlzIGRvLCBidXQgdGhleSdyZSBuZWNlc3NhcnkgdG8gbWFrZQogKiB0aGUgY2FtZXJhIHdvcmsuCiAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAxW10gPSB7CgkweEI2LCAweEMzLCAweDFGLCAweDAwLCAweDAyLCAweDY0LCAweEU3LCAweDY3LAoJMHhGRCwgMHhGRiwgMHgwRSwgMHhDMCwgMHhFNywgMHgwOSwgMHhERSwgMHgwMCwKCTB4OEUsIDB4MDAsIDB4QzAsIDB4MDksIDB4NDAsIDB4MDMsIDB4QzAsIDB4MTcsCgkweDQ0LCAweDAzLCAweDRCLCAweEFGLCAweEMwLCAweDA3LCAweDAwLCAweDAwLAoJMHg0QiwgMHhBRiwgMHg5NywgMHhDRiwgMHgwMCwgMHgwMAp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAyW10gPSB7CgkweEI2LCAweEMzLCAweDAzLCAweDAwLCAweDAzLCAweDY0LCAweDE4LCAweDAwLAoJMHgwMCwgMHgwMAp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAzW10gPSB7CgkweEI2LCAweEMzLCAweDAxLCAweDAwLCAweDA2LCAweDY0LCAweDAwLCAweDAwCn07CgpzdGF0aWMgdW5zaWduZWQgY2hhciBzZXR1cDRbXSA9IHsKCTB4QjYsIDB4QzMsIDB4OEYsIDB4MDYsIDB4MDIsIDB4NjQsIDB4RTcsIDB4MDcsCgkweDAwLCAweDAwLCAweDA4LCAweEMwLCAweEU3LCAweDA3LCAweDAwLCAweDAwLAoJMHgzRSwgMHhDMCwgMHhFNywgMHgwNywgMHg1NCwgMHgwMSwgMHhBQSwgMHgwMCwKCTB4RTcsIDB4MDcsIDB4QzgsIDB4MDUsIDB4QjYsIDB4MDAsIDB4RTcsIDB4MDcsCgkweDQyLCAweDAxLCAweEQyLCAweDAwLCAweEU3LCAweDA3LCAweDdDLCAweDAwLAoJMHgxNiwgMHgwMCwgMHhFNywgMHgwNywgMHg1NiwgMHgwMCwgMHgxOCwgMHgwMCwKCTB4RTcsIDB4MDcsIDB4MDYsIDB4MDAsIDB4OTIsIDB4QzAsIDB4RTcsIDB4MDcsCgkweDAwLCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDA3LCAweEZGLCAweEZGLAoJMHgyMiwgMHhDMCwgMHhFNywgMHgwNywgMHgwNCwgMHgwMCwgMHgyNCwgMHhDMCwKCTB4RTcsIDB4MDcsIDB4RUMsIDB4MjcsIDB4MjgsIDB4QzAsIDB4RTcsIDB4MDcsCgkweDE2LCAweDAxLCAweDhFLCAweDAwLCAweEU3LCAweDg3LCAweDAxLCAweDAwLAoJMHgwRSwgMHhDMCwgMHg5NywgMHhDRiwgMHhENywgMHgwOSwgMHgwMCwgMHhDMCwKCTB4RTcsIDB4NzcsIDB4MDEsIDB4MDAsIDB4OTIsIDB4QzAsIDB4MDksIDB4QzEsCgkweEU3LCAweDA5LCAweEZFLCAweDA1LCAweDI0LCAweDAxLCAweEU3LCAweDA5LAoJMHgwNCwgMHgwNiwgMHgyNiwgMHgwMSwgMHhFNywgMHgwNywgMHgwNywgMHgwMCwKCTB4OTIsIDB4QzAsIDB4RTcsIDB4MDUsIDB4MDAsIDB4QzAsIDB4QzAsIDB4REYsCgkweDk3LCAweENGLCAweDE3LCAweDAwLCAweDU3LCAweDAwLCAweDE3LCAweDAyLAoJMHhENywgMHgwOSwgMHgwMCwgMHhDMCwgMHhFNywgMHg3NywgMHgwMSwgMHgwMCwKCTB4OTIsIDB4QzAsIDB4MEEsIDB4QzEsIDB4RTcsIDB4NTcsIDB4RkYsIDB4RkYsCgkweEZBLCAweDA1LCAweDBELCAweEMwLCAweEU3LCAweDU3LCAweDAwLCAweDAwLAoJMHhGQSwgMHgwNSwgMHgwRiwgMHhDMCwgMHg5RiwgMHhBRiwgMHhDNiwgMHgwMCwKCTB4RTcsIDB4MDUsIDB4MDAsIDB4QzAsIDB4QzgsIDB4MDUsIDB4QzEsIDB4MDUsCgkweEMwLCAweDA1LCAweEMwLCAweERGLCAweDk3LCAweENGLCAweDI3LCAweERBLAoJMHhGQSwgMHgwNSwgMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwQiwgMHgwNiwKCTB4NzMsIDB4Q0YsIDB4OUYsIDB4QUYsIDB4NzgsIDB4MDEsIDB4OUYsIDB4QUYsCgkweDFBLCAweDAzLCAweDZFLCAweENGLCAweEU3LCAweDA5LCAweEZDLCAweDA1LAoJMHgyNCwgMHgwMSwgMHhFNywgMHgwOSwgMHgwMiwgMHgwNiwgMHgyNiwgMHgwMSwKCTB4RTcsIDB4MDcsIDB4MDcsIDB4MDAsIDB4OTIsIDB4QzAsIDB4RTcsIDB4MDksCgkweEZDLCAweDA1LCAweEZFLCAweDA1LCAweEU3LCAweDA5LCAweDAyLCAweDA2LAoJMHgwNCwgMHgwNiwgMHhFNywgMHgwOSwgMHgwMCwgMHgwNiwgMHhGQywgMHgwNSwKCTB4RTcsIDB4MDksIDB4RkUsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MjcsIDB4REEsCgkweEZBLCAweDA1LCAweEU3LCAweDU3LCAweDAxLCAweDAwLCAweEZBLCAweDA1LAoJMHgwMiwgMHhDQSwgMHgwNCwgMHhDMCwgMHg5NywgMHhDRiwgMHg5RiwgMHhBRiwKCTB4NjYsIDB4MDUsIDB4OTcsIDB4Q0YsIDB4RTcsIDB4MDcsIDB4NDAsIDB4MDAsCgkweDAyLCAweDA2LCAweEM4LCAweDA5LCAweEZDLCAweDA1LCAweDlGLCAweEFGLAoJMHhEQSwgMHgwMiwgMHg5NywgMHhDRiwgMHhDRiwgMHgxNywgMHgwMiwgMHgwMCwKCTB4RUYsIDB4NTcsIDB4ODEsIDB4MDAsIDB4MDksIDB4MDYsIDB4OUYsIDB4QTAsCgkweEI2LCAweDAxLCAweEVGLCAweDU3LCAweDgwLCAweDAwLCAweDA5LCAweDA2LAoJMHg5RiwgMHhBMCwgMHg0MCwgMHgwMiwgMHhFRiwgMHg1NywgMHgwMSwgMHgwMCwKCTB4MEIsIDB4MDYsIDB4OUYsIDB4QTAsIDB4NDYsIDB4MDMsIDB4RTcsIDB4MDcsCgkweDAxLCAweDAwLCAweDBBLCAweEMwLCAweDQ2LCAweEFGLCAweDQ3LCAweEFGLAoJMHg5RiwgMHhBRiwgMHg0MCwgMHgwMiwgMHhFNywgMHgwNywgMHgyRSwgMHgwMCwKCTB4MEEsIDB4QzAsIDB4RUYsIDB4ODcsIDB4ODAsIDB4MDAsIDB4MDksIDB4MDYsCgkweDk3LCAweENGLCAweDAwLCAweDBFLCAweDAxLCAweDAwLCAweEMwLCAweDU3LAoJMHg1MSwgMHgwMCwgMHg5RiwgMHhDMCwgMHg5RSwgMHgwMiwgMHhDMCwgMHg1NywKCTB4NTAsIDB4MDAsIDB4MjAsIDB4QzAsIDB4QzAsIDB4NTcsIDB4NTUsIDB4MDAsCgkweDEyLCAweEMwLCAweEMwLCAweDU3LCAweDU2LCAweDAwLCAweDlGLCAweEMwLAoJMHg3MiwgMHgwMiwgMHg5RiwgMHhDRiwgMHhENiwgMHgwMiwgMHhDMSwgMHgwQiwKCTB4MDgsIDB4MDYsIDB4MDEsIDB4RDAsIDB4NkYsIDB4OTAsIDB4MDgsIDB4MDYsCgkweEMwLCAweDA3LCAweDA4LCAweDAwLCAweEMxLCAweDBCLCAweDA4LCAweDA2LAoJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHg5NywgMHhDRiwgMHgyRiwgMHgwRSwKCTB4MDIsIDB4MDAsIDB4MDgsIDB4MDYsIDB4QzAsIDB4MDcsIDB4MDgsIDB4MDAsCgkweEMxLCAweDBCLCAweDA4LCAweDA2LCAweDlGLCAweEFGLCAweDI4LCAweDA1LAoJMHg5RiwgMHhDRiwgMHhENiwgMHgwMiwgMHgyRiwgMHgwRSwgMHgwMiwgMHgwMCwKCTB4MDksIDB4MDYsIDB4RUYsIDB4ODcsIDB4ODAsIDB4MDAsIDB4MDksIDB4MDYsCgkweDlGLCAweENGLCAweEQ2LCAweDAyLCAweEVGLCAweDY3LCAweDdGLCAweEZGLAoJMHgwOSwgMHgwNiwgMHhFNywgMHg2NywgMHhGRiwgMHhGRCwgMHgyMiwgMHhDMCwKCTB4RTcsIDB4NjcsIDB4RUYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsCgkweDEwLCAweDAwLCAweDI4LCAweEMwLCAweDlGLCAweEFGLCAweEI4LCAweDA1LAoJMHhFNywgMHg4NywgMHhFMCwgMHgyMSwgMHgyNCwgMHhDMCwgMHg5RiwgMHhBRiwKCTB4QTgsIDB4MDUsIDB4RTcsIDB4ODcsIDB4MDgsIDB4MDAsIDB4MjQsIDB4QzAsCgkweEU3LCAweDY3LCAweERGLCAweEZGLCAweDI0LCAweEMwLCAweEM4LCAweDA3LAoJMHgwQSwgMHgwMCwgMHhDMCwgMHgwNywgMHgwMCwgMHgwMCwgMHhDMSwgMHgwNywKCTB4MDEsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4OUYsIDB4QUYsCgkweEI4LCAweDA1LCAweEMwLCAweDA3LCAweDlFLCAweDAwLCAweDlGLCAweEFGLAoJMHg0NCwgMHgwNSwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwgMHgyNCwgMHhDMCwKCTB4QzAsIDB4MDksIDB4MjAsIDB4QzAsIDB4RTcsIDB4ODcsIDB4MDAsIDB4MDEsCgkweDI0LCAweEMwLCAweEMwLCAweDc3LCAweDAwLCAweDAyLCAweDBGLCAweEMxLAoJMHhFNywgMHg2NywgMHhGNywgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg2NywKCTB4RjcsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsIDB4MDgsIDB4MDAsCgkweDI0LCAweEMwLCAweDA4LCAweERBLCAweDVFLCAweEMxLCAweEVGLCAweDA3LAoJMHg4MCwgMHgwMCwgMHgwOSwgMHgwNiwgMHg5NywgMHhDRiwgMHhFRiwgMHgwNywKCTB4MDEsIDB4MDAsIDB4MEEsIDB4MDYsIDB4OTcsIDB4Q0YsIDB4RUYsIDB4MDcsCgkweDAwLCAweDAwLCAweDBCLCAweDA2LCAweEVGLCAweDA3LCAweDAwLCAweDAwLAoJMHgwQSwgMHgwNiwgMHhFRiwgMHg2NywgMHg3RiwgMHhGRiwgMHgwOSwgMHgwNiwKCTB4RUYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDYsIDB4RTcsIDB4NjcsCgkweEVGLCAweEZGLCAweDI4LCAweEMwLCAweEU3LCAweDY3LCAweDE3LCAweEQ4LAoJMHgyNCwgMHhDMCwgMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHgxRSwgMHhDMCwKCTB4RTcsIDB4MDcsIDB4RkYsIDB4RkYsIDB4MjIsIDB4QzAsIDB4OTcsIDB4Q0YsCgkweEM4LCAweDA3LCAweDBFLCAweDA2LCAweDlGLCAweEFGLCAweERBLCAweDAyLAoJMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHhGMiwgMHgwNSwgMHhFNywgMHgwNywKCTB4MTAsIDB4MDAsIDB4RjYsIDB4MDUsIDB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsCgkweEY0LCAweDA1LCAweEU3LCAweDA3LCAweEQ2LCAweDAyLCAweEY4LCAweDA1LAoJMHhDOCwgMHgwNywgMHhGMiwgMHgwNSwgMHhDMSwgMHgwNywgMHgwMCwgMHg4MCwKCTB4NTAsIDB4QUYsIDB4OTcsIDB4Q0YsIDB4MkYsIDB4MEMsIDB4MDIsIDB4MDAsCgkweDA3LCAweDA2LCAweDJGLCAweDBDLCAweDA0LCAweDAwLCAweDA2LCAweDA2LAoJMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHhGMiwgMHgwNSwgMHhFNywgMHgwNywKCTB4MTAsIDB4MDAsIDB4RjYsIDB4MDUsIDB4RTcsIDB4MDcsIDB4RTIsIDB4MDUsCgkweEY0LCAweDA1LCAweEU3LCAweDA3LCAweENFLCAweDAyLCAweEY4LCAweDA1LAoJMHhDOCwgMHgwNywgMHhGMiwgMHgwNSwgMHhDMSwgMHgwNywgMHgwMCwgMHg4MCwKCTB4NTEsIDB4QUYsIDB4OTcsIDB4Q0YsIDB4OUYsIDB4QUYsIDB4NjYsIDB4MDQsCgkweDlGLCAweEFGLCAweDFBLCAweDAzLCAweDU5LCAweEFGLCAweDk3LCAweENGLAoJMHhDMCwgMHgwNywgMHgwRSwgMHgwMCwgMHhDMSwgMHgwQiwgMHgwQywgMHgwNiwKCTB4NDEsIDB4RDEsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsCgkweDNDLCAweDAwLCAweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweDY4LCAweDAwLAoJMHhDMCwgMHgwNywgMHgzQiwgMHgwMCwgMHg5RiwgMHhBRiwgMHg0NCwgMHgwNSwKCTB4NkYsIDB4MDAsIDB4MEMsIDB4MDYsIDB4NjgsIDB4MDAsIDB4RTAsIDB4MDcsCgkweDA0LCAweDAxLCAweEU4LCAweDBCLCAweDBBLCAweDA2LCAweEU4LCAweDA3LAoJMHgwMCwgMHgwMCwgMHhFMCwgMHgwNywgMHgwMCwgMHgwMiwgMHhFMCwgMHgwNywKCTB4RUMsIDB4MDEsIDB4RTAsIDB4MDcsIDB4RkMsIDB4RkYsIDB4OTcsIDB4Q0YsCgkweEU3LCAweDA3LCAweEZGLCAweEZGLCAweEZBLCAweDA1LCAweEVGLCAweDA3LAoJMHgwMCwgMHgwMCwgMHgwQiwgMHgwNiwgMHhFNywgMHgwNywgMHgwRSwgMHgwNiwKCTB4MjQsIDB4MDEsIDB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsIDB4RkUsIDB4MDUsCgkweEU3LCAweDA3LCAweDQwLCAweDAwLCAweDI2LCAweDAxLCAweEU3LCAweDA3LAoJMHg0MCwgMHgwMCwgMHgwNCwgMHgwNiwgMHhFNywgMHgwNywgMHgwNywgMHgwMCwKCTB4OTIsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4RUYsIDB4MDcsIDB4MDIsIDB4MDAsCgkweDBCLCAweDA2LCAweDlGLCAweEFGLCAweDc4LCAweDAxLCAweEVGLCAweDc3LAoJMHg4MCwgMHgwMCwgMHgwNywgMHgwNiwgMHg5RiwgMHhDMCwgMHgxNCwgMHgwNCwKCTB4RUYsIDB4NzcsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDYsIDB4MzcsIDB4QzAsCgkweEVGLCAweDc3LCAweDAxLCAweDAwLCAweDBELCAweDA2LCAweDBGLCAweEMxLAoJMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwRCwgMHgwNiwgMHhDMCwgMHgwNywKCTB4MDIsIDB4MDAsIDB4QzEsIDB4MDcsIDB4MzAsIDB4MDAsIDB4OUYsIDB4QUYsCgkweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDAxLCAweDAwLCAweEMxLCAweDA3LAoJMHgwMiwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDOCwgMHgwNywKCTB4RkYsIDB4NEYsIDB4OUYsIDB4QUYsIDB4QTgsIDB4MDUsIDB4QzAsIDB4MDcsCgkweDM4LCAweDAwLCAweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweEMxLCAweDc3LAoJMHgwMywgMHgwMCwgMHgwMiwgMHhDMSwgMHgwOCwgMHhEQSwgMHg3NSwgMHhDMSwKCTB4QzEsIDB4NzcsIDB4MDEsIDB4MDAsIDB4MEEsIDB4QzEsIDB4QzAsIDB4MDcsCgkweDAxLCAweDAwLCAweEMxLCAweDA3LCAweDAyLCAweDAwLCAweDlGLCAweEFGLAoJMHgyOCwgMHgwNSwgMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwNiwgMHgwNiwKCTB4MkMsIDB4Q0YsIDB4QzAsIDB4MDcsIDB4MDEsIDB4MDAsIDB4QzEsIDB4MDcsCgkweDA0LCAweDAwLCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEVGLCAweDA3LAoJMHgwMCwgMHgwMCwgMHgwNiwgMHgwNiwgMHgyMiwgMHhDRiwgMHhFRiwgMHgwNywKCTB4MDAsIDB4MDAsIDB4MEQsIDB4MDYsIDB4RUYsIDB4NTcsIDB4MDEsIDB4MDAsCgkweDA2LCAweDA2LCAweDFCLCAweEMwLCAweEMwLCAweDA3LCAweDAxLCAweDAwLAoJMHhDMSwgMHgwNywgMHgwMSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKCTB4QzAsIDB4MDcsIDB4MDIsIDB4MDAsIDB4QzEsIDB4MDcsIDB4MzAsIDB4MDAsCgkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEM4LCAweDA3LCAweEZGLCAweDRGLAoJMHg5RiwgMHhBRiwgMHhBOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgzOCwgMHgwMCwKCTB4OUYsIDB4QUYsIDB4NDQsIDB4MDUsIDB4QzEsIDB4NjcsIDB4MDMsIDB4MDAsCgkweEMxLCAweDU3LCAweDAzLCAweDAwLCAweDAyLCAweEMwLCAweDA4LCAweERBLAoJMHg3MywgMHhDMSwgMHhDMCwgMHgwNywgMHgwMiwgMHgwMCwgMHhDMSwgMHgwNywKCTB4MTIsIDB4MDAsIDB4RUYsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDYsCgkweDAyLCAweEMwLCAweEMxLCAweDA3LCAweDIzLCAweDAwLCAweDlGLCAweEFGLAoJMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgxNCwgMHgwMCwgMHhDMSwgMHgwQiwKCTB4RUEsIDB4MDUsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsCgkweDNFLCAweDAwLCAweDlGLCAweEFGLCAweDBBLCAweDA1LCAweEU3LCAweDA5LAoJMHhFNCwgMHgwNSwgMHhGQSwgMHgwNSwgMHgyNywgMHhEOCwgMHhGQSwgMHgwNSwKCTB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsIDB4RkMsIDB4MDUsIDB4RTcsIDB4MDcsCgkweDRFLCAweDA2LCAweDAwLCAweDA2LCAweEU3LCAweDA3LCAweDQwLCAweDAwLAoJMHgwMiwgMHgwNiwgMHg5RiwgMHhBRiwgMHg2NiwgMHgwNSwgMHg5RiwgMHhBRiwKCTB4QzYsIDB4MDAsIDB4OTcsIDB4Q0YsIDB4QzEsIDB4MEIsIDB4RTIsIDB4MDUsCgkweDQxLCAweEQwLCAweDAxLCAweEQyLCAweEMxLCAweDE3LCAweDIzLCAweDAwLAoJMHg5RiwgMHhBRiwgMHhEQywgMHgwNCwgMHhDMCwgMHgwNywgMHgwNCwgMHgwMCwKCTB4QzEsIDB4MEIsIDB4RTMsIDB4MDUsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCgkweEMwLCAweDA3LCAweDA2LCAweDAwLCAweEMxLCAweDA5LCAweEU2LCAweDA1LAoJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgwNywgMHgwMCwKCTB4QzEsIDB4MDksIDB4RTYsIDB4MDUsIDB4QzEsIDB4RDEsIDB4OUYsIDB4QUYsCgkweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBCLCAweDAwLCAweEMxLCAweDA5LAoJMHhFOCwgMHgwNSwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywKCTB4MEMsIDB4MDAsIDB4QzEsIDB4MDksIDB4RTgsIDB4MDUsIDB4QzEsIDB4RDEsCgkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBELCAweDAwLAoJMHhDMSwgMHgwNywgMHgwOSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKCTB4QzAsIDB4MDcsIDB4MDMsIDB4MDAsIDB4QzEsIDB4MDcsIDB4MzIsIDB4MDAsCgkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBGLCAweDAwLAoJMHhDMSwgMHgwNywgMHgwMCwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKCTB4OTcsIDB4Q0YsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RDksIDB4MjQsIDB4QzAsCgkweEM4LCAweDA3LCAweDBBLCAweDAwLCAweDQwLCAweDAwLCAweEMwLCAweDY3LAoJMHgwMCwgMHgwMiwgMHgyNywgMHg4MCwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywKCTB4MDAsIDB4MDQsIDB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RjksCgkweDI0LCAweEMwLCAweDAxLCAweEQyLCAweDA4LCAweERBLCAweDcyLCAweEMxLAoJMHhFNywgMHg4NywgMHgwMCwgMHgyMCwgMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwKCTB4MjcsIDB4MDAsIDB4MUUsIDB4QzAsIDB4RTcsIDB4ODcsIDB4RkYsIDB4MDAsCgkweDIyLCAweEMwLCAweEU3LCAweDY3LCAweDdGLCAweEZGLCAweDI0LCAweEMwLAoJMHhFNywgMHg4NywgMHg4MCwgMHgwMCwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywKCTB4ODAsIDB4MDAsIDB4MjQsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4OUYsIDB4QUYsCgkweDBBLCAweDA1LCAweDY3LCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDY3LAoJMHhCRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywgMHg0MCwgMHgwMCwKCTB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsIDB4NDAsIDB4MDAsIDB4MjQsIDB4QzAsCgkweDk3LCAweENGLCAweDlGLCAweEFGLCAweDBBLCAweDA1LCAweEU3LCAweDY3LAoJMHgwMCwgMHhGRiwgMHgyMiwgMHhDMCwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwKCTB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkUsIDB4MjQsIDB4QzAsCgkweEMxLCAweDA5LCAweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDAwLCAweDAxLAoJMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwgMHhDMCwgMHgwNywgMHg0MCwgMHgwMCwKCTB4QzgsIDB4MDksIDB4RkMsIDB4MDUsIDB4RTcsIDB4NjcsIDB4MDAsIDB4RkYsCgkweDIyLCAweEMwLCAweEU3LCAweDY3LCAweEZGLCAweEZFLCAweDI0LCAweEMwLAoJMHhFNywgMHg2NywgMHhCRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg2NywKCTB4QkYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4MDAsIDB4REEsIDB4RTgsIDB4MDksCgkweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDQwLCAweDAwLCAweDI0LCAweEMwLAoJMHhFNywgMHg4NywgMHg0MCwgMHgwMCwgMHgyNCwgMHhDMCwgMHgwMCwgMHhEQSwKCTB4RTgsIDB4MDksIDB4MjAsIDB4QzAsIDB4NkQsIDB4QzEsIDB4RTcsIDB4ODcsCgkweDAwLCAweDAxLCAweDI0LCAweEMwLCAweDk3LCAweENGLCAweEU3LCAweDA3LAoJMHgzMiwgMHgwMCwgMHgxMiwgMHhDMCwgMHhFNywgMHg3NywgMHgwMCwgMHg4MCwKCTB4MTIsIDB4QzAsIDB4N0MsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4RTcsIDB4MDcsCgkweDIwLCAweDRFLCAweDEyLCAweEMwLCAweEU3LCAweDc3LCAweDAwLCAweDgwLAoJMHgxMiwgMHhDMCwgMHg3QywgMHhDMCwgMHg5NywgMHhDRiwgMHgwOSwgMHgwMiwKCTB4MTksIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4ODAsIDB4OTYsIDB4MDksCgkweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwNywgMHgwNSwgMHg4MSwgMHgwMiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCn07CgpzdGF0aWMgdW5zaWduZWQgY2hhciBzZXR1cDVbXSA9IHsKCTB4QjYsIDB4QzMsIDB4MkYsIDB4MDEsIDB4MDMsIDB4NjQsIDB4MEUsIDB4MDAsCgkweDE0LCAweDAwLCAweDFBLCAweDAwLCAweDIwLCAweDAwLCAweDI2LCAweDAwLAoJMHg0QSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2QSwgMHgwMCwgMHg5MiwgMHgwMCwKCTB4OUEsIDB4MDAsIDB4QTAsIDB4MDAsIDB4QjIsIDB4MDAsIDB4QjgsIDB4MDAsCgkweEJFLCAweDAwLCAweEMyLCAweDAwLCAweEM4LCAweDAwLCAweENFLCAweDAwLAoJMHhEQywgMHgwMCwgMHhEQSwgMHgwMCwgMHhFMiwgMHgwMCwgMHhFMCwgMHgwMCwKCTB4RTgsIDB4MDAsIDB4RTYsIDB4MDAsIDB4RUUsIDB4MDAsIDB4RUMsIDB4MDAsCgkweEYyLCAweDAwLCAweEY4LCAweDAwLCAweDAyLCAweDAxLCAweDBBLCAweDAxLAoJMHgwRSwgMHgwMSwgMHgxMiwgMHgwMSwgMHgxRSwgMHgwMSwgMHgyMiwgMHgwMSwKCTB4MjgsIDB4MDEsIDB4MkMsIDB4MDEsIDB4MzIsIDB4MDEsIDB4MzYsIDB4MDEsCgkweDQ0LCAweDAxLCAweDUwLCAweDAxLCAweDVFLCAweDAxLCAweDcyLCAweDAxLAoJMHg3NiwgMHgwMSwgMHg3QSwgMHgwMSwgMHg4MCwgMHgwMSwgMHg4OCwgMHgwMSwKCTB4OEMsIDB4MDEsIDB4OTQsIDB4MDEsIDB4OUMsIDB4MDEsIDB4QTAsIDB4MDEsCgkweEE0LCAweDAxLCAweEFBLCAweDAxLCAweEIwLCAweDAxLCAweEI0LCAweDAxLAoJMHhCQSwgMHgwMSwgMHhEMCwgMHgwMSwgMHhEQSwgMHgwMSwgMHhGNiwgMHgwMSwKCTB4RkEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MzQsIDB4MDIsIDB4M0MsIDB4MDIsCgkweDQ0LCAweDAyLCAweDRBLCAweDAyLCAweDUwLCAweDAyLCAweDU2LCAweDAyLAoJMHg3NCwgMHgwMiwgMHg3OCwgMHgwMiwgMHg3RSwgMHgwMiwgMHg4NCwgMHgwMiwKCTB4OEEsIDB4MDIsIDB4ODgsIDB4MDIsIDB4OTAsIDB4MDIsIDB4OEUsIDB4MDIsCgkweDk0LCAweDAyLCAweEEyLCAweDAyLCAweEE4LCAweDAyLCAweEFFLCAweDAyLAoJMHhCNCwgMHgwMiwgMHhCQSwgMHgwMiwgMHhCOCwgMHgwMiwgMHhDMCwgMHgwMiwKCTB4QkUsIDB4MDIsIDB4QzQsIDB4MDIsIDB4RDAsIDB4MDIsIDB4RDQsIDB4MDIsCgkweEUwLCAweDAyLCAweEU2LCAweDAyLCAweEVFLCAweDAyLCAweEY4LCAweDAyLAoJMHhGQywgMHgwMiwgMHgwNiwgMHgwMywgMHgxRSwgMHgwMywgMHgyNCwgMHgwMywKCTB4MjgsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MkUsIDB4MDMsIDB4M0MsIDB4MDMsCgkweDRBLCAweDAzLCAweDRFLCAweDAzLCAweDU0LCAweDAzLCAweDU4LCAweDAzLAoJMHg1RSwgMHgwMywgMHg2NiwgMHgwMywgMHg2RSwgMHgwMywgMHg3QSwgMHgwMywKCTB4ODYsIDB4MDMsIDB4OEUsIDB4MDMsIDB4OTYsIDB4MDMsIDB4QjIsIDB4MDMsCgkweEI4LCAweDAzLCAweEM2LCAweDAzLCAweENDLCAweDAzLCAweEQ0LCAweDAzLAoJMHhEQSwgMHgwMywgMHhFOCwgMHgwMywgMHhGNCwgMHgwMywgMHhGQywgMHgwMywKCTB4MDQsIDB4MDQsIDB4MjAsIDB4MDQsIDB4MkEsIDB4MDQsIDB4MzIsIDB4MDQsCgkweDM2LCAweDA0LCAweDNFLCAweDA0LCAweDQ0LCAweDA0LCAweDQyLCAweDA0LAoJMHg0OCwgMHgwNCwgMHg0RSwgMHgwNCwgMHg0QywgMHgwNCwgMHg1NCwgMHgwNCwKCTB4NTIsIDB4MDQsIDB4NUEsIDB4MDQsIDB4NUUsIDB4MDQsIDB4NjIsIDB4MDQsCgkweDY4LCAweDA0LCAweDc0LCAweDA0LCAweDdDLCAweDA0LCAweDgwLCAweDA0LAoJMHg4OCwgMHgwNCwgMHg4QywgMHgwNCwgMHg5NCwgMHgwNCwgMHg5QSwgMHgwNCwKCTB4QTIsIDB4MDQsIDB4QTYsIDB4MDQsIDB4QUUsIDB4MDQsIDB4QjQsIDB4MDQsCgkweEMwLCAweDA0LCAweENDLCAweDA0LCAweEQ4LCAweDA0LCAweDJBLCAweDA1LAoJMHg0NiwgMHgwNSwgMHg2QywgMHgwNSwgMHgwMCwgMHgwMAp9OwoKLyogcnZtYWxsb2MgLyBydmZyZWUgY29waWVkIGZyb20gdXNidmlkZW8uYwogKgogKiBOb3Qgc3VyZSB3aHkgdGhlc2UgYXJlIG5vdCB5ZXQgbm9uLXN0YXRpY3Mgd2hpY2ggSSBjYW4gcmVmZXJlbmNlIHRocm91Z2gKICogdXNidmlkZW8uaCB0aGUgc2FtZSBhcyBpdCBpcyBpbiAyLjQuMjAuICBJIGJldCB0aGlzIHdpbGwgZ2V0IGZpeGVkIHNvbWV0aW1lCiAqIGluIHRoZSBmdXR1cmUuCiAqCiovCnN0YXRpYyB2b2lkICpydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCnsKCXZvaWQgKm1lbTsKCXVuc2lnbmVkIGxvbmcgYWRyOwoKCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwoJbWVtID0gdm1hbGxvY18zMihzaXplKTsKCWlmICghbWVtKQoJCXJldHVybiBOVUxMOwoKCW1lbXNldChtZW0sIDAsIHNpemUpOyAvKiBDbGVhciB0aGUgcmFtIG91dCwgbm8ganVuayB0byB0aGUgdXNlciAqLwoJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKCXdoaWxlIChzaXplID4gMCkgewoJCVNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKCQlhZHIgKz0gUEFHRV9TSVpFOwoJCXNpemUgLT0gUEFHRV9TSVpFOwoJfQoKCXJldHVybiBtZW07Cn0KCnN0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJdW5zaWduZWQgbG9uZyBhZHI7CgoJaWYgKCFtZW0pCgkJcmV0dXJuOwoKCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07Cgl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CgkJQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CgkJYWRyICs9IFBBR0VfU0laRTsKCQlzaXplIC09IFBBR0VfU0laRTsKCX0KCXZmcmVlKG1lbSk7Cn0KCnN0cnVjdCB2aWNhbV9jYW1lcmEgewoJdTE2IHNodXR0ZXJfc3BlZWQ7CS8vIGNhcHR1cmUgc2h1dHRlciBzcGVlZAoJdTE2IGdhaW47CQkvLyBjYXB0dXJlIGdhaW4KCgl1OCAqcmF3X2ltYWdlOwkJLy8gcmF3IGRhdGEgY2FwdHVyZWQgZnJvbSB0aGUgY2FtZXJhCgl1OCAqZnJhbWVidWY7CQkvLyBwcm9jZXNzZWQgZGF0YSBpbiBSR0IyNCBmb3JtYXQKCXU4ICpjbnRybGJ1ZjsJCS8vIGFyZWEgdXNlZCB0byBzZW5kIGNvbnRyb2wgbXNncwoKCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsJLy8gdjRsIHZpZGVvIGRldmljZQoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8vIHVzYiBkZXZpY2UKCgkvKiBndWFyZCBhZ2FpbnN0IHNpbXVsdGFuZW91cyBhY2Nlc3NlcyB0byB0aGUgY2FtZXJhICovCglzdHJ1Y3QgbXV0ZXggY2FtX2xvY2s7CgoJaW50IGlzX2luaXRpYWxpemVkOwoJdTggb3Blbl9jb3VudDsKCXU4IGJ1bGtFbmRwb2ludDsKCWludCBuZWVkc0R1bW15UmVhZDsKCiNpZiBkZWZpbmVkKENPTkZJR19WSURFT19QUk9DX0ZTKQoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2RpcjsKI2VuZGlmCgp9OwoKc3RhdGljIGludCB2aWNhbV9wcm9iZSggc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CnN0YXRpYyB2b2lkIHZpY2FtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwpzdGF0aWMgdm9pZCByZWFkX2ZyYW1lKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lbnVtKTsKc3RhdGljIHZvaWQgdmljYW1fZGVjb2RlX2NvbG9yKGNvbnN0IHU4ICosIHU4ICopOwoKc3RhdGljIGludCBfX3NlbmRfY29udHJvbF9tc2coc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLAoJCQkgICAgICB1OCByZXF1ZXN0LAoJCQkgICAgICB1MTYgdmFsdWUsCgkJCSAgICAgIHUxNiBpbmRleCwKCQkJICAgICAgdW5zaWduZWQgY2hhciAqY3AsCgkJCSAgICAgIHUxNiBzaXplKQp7CglpbnQgc3RhdHVzOwoKCS8qIGNwIG11c3QgYmUgbWVtb3J5IHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IGttYWxsb2MgKi8KCglzdGF0dXMgPSB1c2JfY29udHJvbF9tc2coY2FtLT51ZGV2LAoJCQkJIHVzYl9zbmRjdHJscGlwZShjYW0tPnVkZXYsIDApLAoJCQkJIHJlcXVlc3QsCgkJCQkgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAoJCQkJIFVTQl9SRUNJUF9ERVZJQ0UsIHZhbHVlLCBpbmRleCwKCQkJCSBjcCwgc2l6ZSwgMTAwMCk7CgoJc3RhdHVzID0gbWluKHN0YXR1cywgMCk7CgoJaWYgKHN0YXR1cyA8IDApIHsKCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgc2VuZGluZyBjb250cm9sIG1lc3NhZ2UsIGVycm9yICVkLlxuIiwKCQkgICAgICAgc3RhdHVzKTsKCX0KCglyZXR1cm4gc3RhdHVzOwp9CgpzdGF0aWMgaW50IHNlbmRfY29udHJvbF9tc2coc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLAoJCQkgICAgdTggcmVxdWVzdCwKCQkJICAgIHUxNiB2YWx1ZSwKCQkJICAgIHUxNiBpbmRleCwKCQkJICAgIHVuc2lnbmVkIGNoYXIgKmNwLAoJCQkgICAgdTE2IHNpemUpCnsKCWludCBzdGF0dXMgPSAtRU5PREVWOwoJbXV0ZXhfbG9jaygmY2FtLT5jYW1fbG9jayk7CglpZiAoY2FtLT51ZGV2KSB7CgkJc3RhdHVzID0gX19zZW5kX2NvbnRyb2xfbXNnKGNhbSwgcmVxdWVzdCwgdmFsdWUsCgkJCQkJICAgIGluZGV4LCBjcCwgc2l6ZSk7Cgl9CgltdXRleF91bmxvY2soJmNhbS0+Y2FtX2xvY2spOwoJcmV0dXJuIHN0YXR1czsKfQpzdGF0aWMgaW50CmluaXRpYWxpemVfY2FtZXJhKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSkKewoJY29uc3Qgc3RydWN0IHsKCQl1OCAqZGF0YTsKCQl1MzIgc2l6ZTsKCX0gZmlybXdhcmVbXSA9IHsKCQl7IC5kYXRhID0gc2V0dXAxLCAuc2l6ZSA9IHNpemVvZihzZXR1cDEpIH0sCgkJeyAuZGF0YSA9IHNldHVwMiwgLnNpemUgPSBzaXplb2Yoc2V0dXAyKSB9LAoJCXsgLmRhdGEgPSBzZXR1cDMsIC5zaXplID0gc2l6ZW9mKHNldHVwMykgfSwKCQl7IC5kYXRhID0gc2V0dXA0LCAuc2l6ZSA9IHNpemVvZihzZXR1cDQpIH0sCgkJeyAuZGF0YSA9IHNldHVwNSwgLnNpemUgPSBzaXplb2Yoc2V0dXA1KSB9LAoJCXsgLmRhdGEgPSBzZXR1cDMsIC5zaXplID0gc2l6ZW9mKHNldHVwMykgfSwKCQl7IC5kYXRhID0gTlVMTCwgLnNpemUgPSAwIH0KCX07CgoJaW50IGVyciwgaTsKCglmb3IgKGkgPSAwLCBlcnIgPSAwOyBmaXJtd2FyZVtpXS5kYXRhICYmICFlcnI7IGkrKykgewoJCW1lbWNweShjYW0tPmNudHJsYnVmLCBmaXJtd2FyZVtpXS5kYXRhLCBmaXJtd2FyZVtpXS5zaXplKTsKCgkJZXJyID0gc2VuZF9jb250cm9sX21zZyhjYW0sIDB4ZmYsIDAsIDAsCgkJCQkgICAgICAgY2FtLT5jbnRybGJ1ZiwgZmlybXdhcmVbaV0uc2l6ZSk7Cgl9CgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludApzZXRfY2FtZXJhX3Bvd2VyKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwgaW50IHN0YXRlKQp7CglpbnQgc3RhdHVzOwoKCWlmICgoc3RhdHVzID0gc2VuZF9jb250cm9sX21zZyhjYW0sIDB4NTAsIHN0YXRlLCAwLCBOVUxMLCAwKSkgPCAwKQoJCXJldHVybiBzdGF0dXM7CgoJaWYgKHN0YXRlKSB7CgkJc2VuZF9jb250cm9sX21zZyhjYW0sIDB4NTUsIDEsIDAsIE5VTEwsIDApOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnZpY2FtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgaW9jdGxuciwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXZvaWQgX191c2VyICp1c2VyX2FyZyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCWludCByZXR2YWwgPSAwOwoKCWlmICghY2FtKQoJCXJldHVybiAtRU5PREVWOwoKCXN3aXRjaCAoaW9jdGxucikgewoJCS8qIHF1ZXJ5IGNhcGFiaWxpdGllcyAqLwoJY2FzZSBWSURJT0NHQ0FQOgoJCXsKCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgYjsKCgkJCURCRygiVklESU9DR0NBUFxuIik7CgkJCW1lbXNldCgmYiwgMCwgc2l6ZW9mKGIpKTsKCQkJc3RyY3B5KGIubmFtZSwgIlZpQ2FtLWJhc2VkIENhbWVyYSIpOwoJCQliLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOwoJCQliLmNoYW5uZWxzID0gMTsKCQkJYi5hdWRpb3MgPSAwOwoJCQliLm1heHdpZHRoID0gMzIwOwkvKiBWSURFT1NJWkVfQ0lGICovCgkJCWIubWF4aGVpZ2h0ID0gMjQwOwoJCQliLm1pbndpZHRoID0gMzIwOwkvKiBWSURFT1NJWkVfNDhfNDggKi8KCQkJYi5taW5oZWlnaHQgPSAyNDA7CgoJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmYiwgc2l6ZW9mKGIpKSkKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgoJCQlicmVhazsKCQl9CgkJLyogZ2V0L3NldCB2aWRlbyBzb3VyY2UgLSB3ZSBhcmUgYSBjYW1lcmEgYW5kIG5vdGhpbmcgZWxzZSAqLwoJY2FzZSBWSURJT0NHQ0hBTjoKCQl7CgkJCXN0cnVjdCB2aWRlb19jaGFubmVsIHY7CgoJCQlEQkcoIlZJRElPQ0dDSEFOXG4iKTsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2LCB1c2VyX2FyZywgc2l6ZW9mKHYpKSkgewoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmICh2LmNoYW5uZWwgIT0gMCkgewoJCQkJcmV0dmFsID0gLUVJTlZBTDsKCQkJCWJyZWFrOwoJCQl9CgoJCQl2LmNoYW5uZWwgPSAwOwoJCQlzdHJjcHkodi5uYW1lLCAiQ2FtZXJhIik7CgkJCXYudHVuZXJzID0gMDsKCQkJdi5mbGFncyA9IDA7CgkJCXYudHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOwoJCQl2Lm5vcm0gPSAwOwoKCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJnYsIHNpemVvZih2KSkpCgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgoJY2FzZSBWSURJT0NTQ0hBTjoKCQl7CgkJCWludCB2OwoKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2LCB1c2VyX2FyZywgc2l6ZW9mKHYpKSkKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCURCRygiVklESU9DU0NIQU4gJWRcbiIsIHYpOwoKCQkJaWYgKHJldHZhbCA9PSAwICYmIHYgIT0gMCkKCQkJCXJldHZhbCA9IC1FSU5WQUw7CgoJCQlicmVhazsKCQl9CgoJCS8qIGltYWdlIHByb3BlcnRpZXMgKi8KCWNhc2UgVklESU9DR1BJQ1Q6CgkJewoJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cDsKCQkJREJHKCJWSURJT0NHUElDVFxuIik7CgkJCW1lbXNldCgmdnAsIDAsIHNpemVvZiAoc3RydWN0IHZpZGVvX3BpY3R1cmUpKTsKCQkJdnAuYnJpZ2h0bmVzcyA9IGNhbS0+Z2FpbiA8PCA4OwoJCQl2cC5kZXB0aCA9IDI0OwoJCQl2cC5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IyNDsKCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJnZwLCBzaXplb2YgKHN0cnVjdCB2aWRlb19waWN0dXJlKSkpCgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgoJY2FzZSBWSURJT0NTUElDVDoKCQl7CgkJCXN0cnVjdCB2aWRlb19waWN0dXJlIHZwOwoKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2cCwgdXNlcl9hcmcsIHNpemVvZih2cCkpKSB7CgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQkJYnJlYWs7CgkJCX0KCgkJCURCRygiVklESU9DU1BJQ1QgZGVwdGggPSAlZCwgcGFsID0gJWRcbiIsIHZwLmRlcHRoLAoJCQkgICAgdnAucGFsZXR0ZSk7CgoJCQljYW0tPmdhaW4gPSB2cC5icmlnaHRuZXNzID4+IDg7CgoJCQlpZiAodnAuZGVwdGggIT0gMjQKCQkJICAgIHx8IHZwLnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9SR0IyNCkKCQkJCXJldHZhbCA9IC1FSU5WQUw7CgoJCQlicmVhazsKCQl9CgoJCS8qIGdldC9zZXQgY2FwdHVyZSB3aW5kb3cgKi8KCWNhc2UgVklESU9DR1dJTjoKCQl7CgkJCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7CgkJCXZ3LnggPSAwOwoJCQl2dy55ID0gMDsKCQkJdncud2lkdGggPSAzMjA7CgkJCXZ3LmhlaWdodCA9IDI0MDsKCQkJdncuY2hyb21ha2V5ID0gMDsKCQkJdncuZmxhZ3MgPSAwOwoJCQl2dy5jbGlwcyA9IE5VTEw7CgkJCXZ3LmNsaXBjb3VudCA9IDA7CgoJCQlEQkcoIlZJRElPQ0dXSU5cbiIpOwoKCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgKHZvaWQgKikmdncsIHNpemVvZih2dykpKQoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCgkJCS8vIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBkZWFsIHdpdGggYSBjYXB0dXJlIHdpbmRvdyBpcywgaXQgaXMgdmVyeSBwb29ybHkgZGVzY3JpYmVkCgkJCS8vIGluIHRoZSBkb2MuICBTbyBJIHdvbid0IHN1cHBvcnQgaXQgbm93LgoJCQlicmVhazsKCQl9CgoJY2FzZSBWSURJT0NTV0lOOgoJCXsKCgkJCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7CgoJCQlpZiAoY29weV9mcm9tX3VzZXIoJnZ3LCB1c2VyX2FyZywgc2l6ZW9mKHZ3KSkpIHsKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCQlicmVhazsKCQkJfQoKCQkJREJHKCJWSURJT0NTV0lOICVkIHggJWRcbiIsIHZ3LndpZHRoLCB2dy5oZWlnaHQpOwoKCQkJaWYgKCB2dy53aWR0aCAhPSAzMjAgfHwgdncuaGVpZ2h0ICE9IDI0MCApCgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoKCQkJYnJlYWs7CgkJfQoKCQkvKiBtbWFwIGludGVyZmFjZSAqLwoJY2FzZSBWSURJT0NHTUJVRjoKCQl7CgkJCXN0cnVjdCB2aWRlb19tYnVmIHZtOwoJCQlpbnQgaTsKCgkJCURCRygiVklESU9DR01CVUZcbiIpOwoJCQltZW1zZXQoJnZtLCAwLCBzaXplb2YgKHZtKSk7CgkJCXZtLnNpemUgPQoJCQkgICAgVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVM7CgkJCXZtLmZyYW1lcyA9IFZJQ0FNX0ZSQU1FUzsKCQkJZm9yIChpID0gMDsgaSA8IFZJQ0FNX0ZSQU1FUzsgaSsrKQoJCQkJdm0ub2Zmc2V0c1tpXSA9IFZJQ0FNX01BWF9GUkFNRV9TSVpFICogaTsKCgkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICh2b2lkICopJnZtLCBzaXplb2Yodm0pKSkKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgoJCQlicmVhazsKCQl9CgoJY2FzZSBWSURJT0NNQ0FQVFVSRToKCQl7CgkJCXN0cnVjdCB2aWRlb19tbWFwIHZtOwoJCQkvLyBpbnQgdmlkZW9fc2l6ZTsKCgkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZ2bSwgdXNlcl9hcmcsIHNpemVvZih2bSkpKSB7CgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQkJYnJlYWs7CgkJCX0KCgkJCURCRygiVklESU9DTUNBUFRVUkUgZnJhbWU9JWQsIGhlaWdodD0lZCwgd2lkdGg9JWQsIGZvcm1hdD0lZC5cbiIsdm0uZnJhbWUsdm0ud2lkdGgsdm0uaGVpZ2h0LHZtLmZvcm1hdCk7CgoJCQlpZiAoIHZtLmZyYW1lID49IFZJQ0FNX0ZSQU1FUyB8fCB2bS5mb3JtYXQgIT0gVklERU9fUEFMRVRURV9SR0IyNCApCgkJCQlyZXR2YWwgPSAtRUlOVkFMOwoKCQkJLy8gaW4gdGhlb3J5IHJpZ2h0IGhlcmUgd2UnZCBzdGFydCB0aGUgaW1hZ2UgY2FwdHVyaW5nCgkJCS8vIChmaWxsIGluIGEgYnVsayB1cmIgYW5kIHN1Ym1pdCBpdCBhc3luY2hyb25vdXNseSkKCQkJLy8KCQkJLy8gSW5zdGVhZCB3ZSdyZSBnb2luZyB0byBkbyBhIHRvdGFsIGhhY2sgam9iIGZvciBub3cgYW5kCgkJCS8vIHJldHJpZXZlIHRoZSBmcmFtZSBpbiBWSURJT0NTWU5DCgoJCQlicmVhazsKCQl9CgoJY2FzZSBWSURJT0NTWU5DOgoJCXsKCQkJaW50IGZyYW1lOwoKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmZyYW1lLCB1c2VyX2FyZywgc2l6ZW9mKGludCkpKSB7CgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQkJYnJlYWs7CgkJCX0KCQkJREJHKCJWSURJT0NTWU5DOiAlZFxuIiwgZnJhbWUpOwoKCQkJcmVhZF9mcmFtZShjYW0sIGZyYW1lKTsKCQkJdmljYW1fZGVjb2RlX2NvbG9yKGNhbS0+cmF3X2ltYWdlLAoJCQkJCSAgIGNhbS0+ZnJhbWVidWYgKwoJCQkJCSAgIGZyYW1lICogVklDQU1fTUFYX0ZSQU1FX1NJWkUgKTsKCgkJCWJyZWFrOwoJCX0KCgkJLyogcG9pbnRsZXNzIHRvIGltcGxlbWVudCBvdmVybGF5IHdpdGggdGhpcyBjYW1lcmEgKi8KCWNhc2UgVklESU9DQ0FQVFVSRToKCWNhc2UgVklESU9DR0ZCVUY6CgljYXNlIFZJRElPQ1NGQlVGOgoJY2FzZSBWSURJT0NLRVk6CgkJcmV0dmFsID0gLUVJTlZBTDsKCQlicmVhazsKCgkJLyogdHVuZXIgaW50ZXJmYWNlIC0gd2UgaGF2ZSBub25lICovCgljYXNlIFZJRElPQ0dUVU5FUjoKCWNhc2UgVklESU9DU1RVTkVSOgoJY2FzZSBWSURJT0NHRlJFUToKCWNhc2UgVklESU9DU0ZSRVE6CgkJcmV0dmFsID0gLUVJTlZBTDsKCQlicmVhazsKCgkJLyogYXVkaW8gaW50ZXJmYWNlIC0gd2UgaGF2ZSBub25lICovCgljYXNlIFZJRElPQ0dBVURJTzoKCWNhc2UgVklESU9DU0FVRElPOgoJCXJldHZhbCA9IC1FSU5WQUw7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHZhbCA9IC1FTk9JT0NUTENNRDsKCQlicmVhazsKCX0KCglyZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgaW50CnZpY2FtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPQoJICAgIChzdHJ1Y3QgdmljYW1fY2FtZXJhICopIGRldi0+cHJpdjsKCURCRygib3BlblxuIik7CgoJaWYgKCFjYW0pIHsKCQlwcmludGsoS0VSTl9FUlIKCQkgICAgICAgInZpY2FtIHZpZGVvX2RldmljZSBpbXByb3Blcmx5IGluaXRpYWxpemVkIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogdGhlIHZpZGVvZGV2X2xvY2sgaGVsZCBhYm92ZSB1cyBwcm90ZWN0cyB1cyBmcm9tCgkgKiBzaW11bHRhbmVvdXMgb3BlbnMuLi5mb3Igbm93LiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QKCSAqIHJlbHkgb24gdGhpcyBmYWN0IGZvcmV2ZXIuCgkgKi8KCglpZiAoY2FtLT5vcGVuX2NvdW50ID4gMCkgewoJCXByaW50ayhLRVJOX0lORk8KCQkgICAgICAgInZpY2FtX29wZW4gY2FsbGVkIG9uIGFscmVhZHkgb3BlbmVkIGNhbWVyYSIpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJY2FtLT5yYXdfaW1hZ2UgPSBrbWFsbG9jKFZJQ0FNX01BWF9SRUFEX1NJWkUsIEdGUF9LRVJORUwpOwoJaWYgKCFjYW0tPnJhd19pbWFnZSkgewoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWNhbS0+ZnJhbWVidWYgPSBydm1hbGxvYyhWSUNBTV9NQVhfRlJBTUVfU0laRSAqIFZJQ0FNX0ZSQU1FUyk7CglpZiAoIWNhbS0+ZnJhbWVidWYpIHsKCQlrZnJlZShjYW0tPnJhd19pbWFnZSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJY2FtLT5jbnRybGJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKCWlmICghY2FtLT5jbnRybGJ1ZikgewoJCWtmcmVlKGNhbS0+cmF3X2ltYWdlKTsKCQlydmZyZWUoY2FtLT5mcmFtZWJ1ZiwgVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCS8vIEZpcnN0IHVwbG9hZCBmaXJtd2FyZSwgdGhlbiB0dXJuIHRoZSBjYW1lcmEgb24KCglpZiAoIWNhbS0+aXNfaW5pdGlhbGl6ZWQpIHsKCQlpbml0aWFsaXplX2NhbWVyYShjYW0pOwoKCQljYW0tPmlzX2luaXRpYWxpemVkID0gMTsKCX0KCglzZXRfY2FtZXJhX3Bvd2VyKGNhbSwgMSk7CgoJY2FtLT5uZWVkc0R1bW15UmVhZCA9IDE7CgljYW0tPm9wZW5fY291bnQrKzsKCglmaWxlLT5wcml2YXRlX2RhdGEgPSBjYW07CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKdmljYW1fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCWludCBvcGVuX2NvdW50OwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CgoJREJHKCJjbG9zZVxuIik7CgoJLyogaXQncyBub3QgdGhlIGVuZCBvZiB0aGUgd29ybGQgaWYKCSAqIHdlIGZhaWwgdG8gdHVybiB0aGUgY2FtZXJhIG9mZi4KCSAqLwoKCXNldF9jYW1lcmFfcG93ZXIoY2FtLCAwKTsKCglrZnJlZShjYW0tPnJhd19pbWFnZSk7CglydmZyZWUoY2FtLT5mcmFtZWJ1ZiwgVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOwoJa2ZyZWUoY2FtLT5jbnRybGJ1Zik7CgoJbXV0ZXhfbG9jaygmY2FtLT5jYW1fbG9jayk7CgoJY2FtLT5vcGVuX2NvdW50LS07CglvcGVuX2NvdW50ID0gY2FtLT5vcGVuX2NvdW50OwoJdWRldiA9IGNhbS0+dWRldjsKCgltdXRleF91bmxvY2soJmNhbS0+Y2FtX2xvY2spOwoKCWlmICghb3Blbl9jb3VudCAmJiAhdWRldikgewoJCWtmcmVlKGNhbSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHZpY2FtX2RlY29kZV9jb2xvcihjb25zdCB1OCAqZGF0YSwgdTggKnJnYikKewoJLyogdmljYW1fZGVjb2RlX2NvbG9yIC0gQ29udmVydCBmcm9tIFZpY2FtIFktQ3ItQ2IgdG8gUkdCCgkgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9ucm9lIFdpbGxpYW1zIChtb25yb2VAcG9ib3guY29tKQoJICovCgoJaW50IGksIHByZXZZLCBuZXh0WTsKCglwcmV2WSA9IDUxMjsKCW5leHRZID0gNTEyOwoKCWRhdGEgKz0gVklDQU1fSEVBREVSX1NJWkU7CgoJZm9yKCBpID0gMDsgaSA8IDI0MDsgaSsrLCBkYXRhICs9IDUxMiApIHsKCQljb25zdCBpbnQgeSA9ICggaSAqIDI0MiApIC8gMjQwOwoKCQlpbnQgaiwgcHJldlgsIG5leHRYOwoJCWludCBZLCBDciwgQ2I7CgoJCWlmICggeSA9PSAyNDIgLSAxICkgewoJCQluZXh0WSA9IC01MTI7CgkJfQoKCQlwcmV2WCA9IDE7CgkJbmV4dFggPSAxOwoKCQlmb3IgKCBqID0gMDsgaiA8IDMyMDsgaisrLCByZ2IgKz0gMyApIHsKCQkJY29uc3QgaW50IHggPSAoIGogKiA1MTIgKSAvIDMyMDsKCQkJY29uc3QgdTggKiBjb25zdCBzcmMgPSAmZGF0YVt4XTsKCgkJCWlmICggeCA9PSA1MTIgLSAxICkgewoJCQkJbmV4dFggPSAtMTsKCQkJfQoKCQkJQ3IgPSAoIHNyY1twcmV2WF0gLSBzcmNbMF0gKSArCgkJCQkoIHNyY1tuZXh0WF0gLSBzcmNbMF0gKTsKCQkJQ3IgLz0gMjsKCgkJCUNiID0gKCBzcmNbcHJldlldIC0gc3JjW3ByZXZYICsgcHJldlldICkgKwoJCQkJKCBzcmNbcHJldlldIC0gc3JjW25leHRYICsgcHJldlldICkgKwoJCQkJKCBzcmNbbmV4dFldIC0gc3JjW3ByZXZYICsgbmV4dFldICkgKwoJCQkJKCBzcmNbbmV4dFldIC0gc3JjW25leHRYICsgbmV4dFldICk7CgkJCUNiIC89IDQ7CgoJCQlZID0gMTE2MCAqICggc3JjWzBdICsgKCBDciAvIDIgKSAtIDE2ICk7CgoJCQlpZiAoIGkgJiAxICkgewoJCQkJaW50IEN0ID0gQ3I7CgkJCQlDciA9IENiOwoJCQkJQ2IgPSBDdDsKCQkJfQoKCQkJaWYgKCAoIHggXiBpICkgJiAxICkgewoJCQkJQ3IgPSAtQ3I7CgkJCQlDYiA9IC1DYjsKCQkJfQoKCQkJcmdiWzBdID0gY2xhbXAoICggKCBZICsgKCAyMDE3ICogQ2IgKSApICsKCQkJCQk1MDAgKSAvIDkwMCwgMCwgMjU1ICk7CgkJCXJnYlsxXSA9IGNsYW1wKCAoICggWSAtICggMzkyICogQ2IgKSAtCgkJCQkJICAoIDgxMyAqIENyICkgKSArCgkJCQkJICA1MDAgKSAvIDEwMDAsIDAsIDI1NSApOwoJCQlyZ2JbMl0gPSBjbGFtcCggKCAoIFkgKyAoIDE1OTQgKiBDciApICkgKwoJCQkJCTUwMCApIC8gMTMwMCwgMCwgMjU1ICk7CgoJCQlwcmV2WCA9IC0xOwoJCX0KCgkJcHJldlkgPSAtNTEyOwoJfQp9CgpzdGF0aWMgdm9pZApyZWFkX2ZyYW1lKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lbnVtKQp7Cgl1bnNpZ25lZCBjaGFyICpyZXF1ZXN0ID0gY2FtLT5jbnRybGJ1ZjsKCWludCByZWFsU2h1dHRlcjsKCWludCBuOwoJaW50IGFjdHVhbF9sZW5ndGg7CgoJaWYgKGNhbS0+bmVlZHNEdW1teVJlYWQpIHsKCQljYW0tPm5lZWRzRHVtbXlSZWFkID0gMDsKCQlyZWFkX2ZyYW1lKGNhbSwgZnJhbWVudW0pOwoJfQoKCW1lbXNldChyZXF1ZXN0LCAwLCAxNik7CglyZXF1ZXN0WzBdID0gY2FtLT5nYWluOwkvLyAwID0gMCUgZ2FpbiwgRkYgPSAxMDAlIGdhaW4KCglyZXF1ZXN0WzFdID0gMDsJLy8gNTEyeDI0MiBjYXB0dXJlCgoJcmVxdWVzdFsyXSA9IDB4OTA7CS8vIHRoZSBmdW5jdGlvbiBvZiB0aGVzZSB0d28gYnl0ZXMKCXJlcXVlc3RbM10gPSAweDA3OwkvLyBpcyBub3QgeWV0IHVuZGVyc3Rvb2QKCglpZiAoY2FtLT5zaHV0dGVyX3NwZWVkID4gNjApIHsKCQkvLyBTaG9ydCBleHBvc3VyZQoJCXJlYWxTaHV0dGVyID0KCQkgICAgKCgtMTU2MzE5MDAgLyBjYW0tPnNodXR0ZXJfc3BlZWQpICsgMjYwNTMzKSAvIDEwMDA7CgkJcmVxdWVzdFs0XSA9IHJlYWxTaHV0dGVyICYgMHhGRjsKCQlyZXF1ZXN0WzVdID0gKHJlYWxTaHV0dGVyID4+IDgpICYgMHhGRjsKCQlyZXF1ZXN0WzZdID0gMHgwMzsKCQlyZXF1ZXN0WzddID0gMHgwMTsKCX0gZWxzZSB7CgkJLy8gTG9uZyBleHBvc3VyZQoJCXJlYWxTaHV0dGVyID0gMTU2MDAgLyBjYW0tPnNodXR0ZXJfc3BlZWQgLSAxOwoJCXJlcXVlc3RbNF0gPSAwOwoJCXJlcXVlc3RbNV0gPSAwOwoJCXJlcXVlc3RbNl0gPSByZWFsU2h1dHRlciAmIDB4RkY7CgkJcmVxdWVzdFs3XSA9IHJlYWxTaHV0dGVyID4+IDg7Cgl9CgoJLy8gUGVyIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4sIGJ5dGUgYXQgaW5kZXggOCBjYXVzZXMgcHJvYmxlbXMgaWYgaXQgaXNuJ3QgMAoJcmVxdWVzdFs4XSA9IDA7CgkvLyBieXRlcyA5LTE1IGRvIG5vdCBzZWVtIHRvIGFmZmVjdCBleHBvc3VyZSBvciBpbWFnZSBxdWFsaXR5CgoJbXV0ZXhfbG9jaygmY2FtLT5jYW1fbG9jayk7CgoJaWYgKCFjYW0tPnVkZXYpIHsKCQlnb3RvIGRvbmU7Cgl9CgoJbiA9IF9fc2VuZF9jb250cm9sX21zZyhjYW0sIDB4NTEsIDB4ODAsIDAsIHJlcXVlc3QsIDE2KTsKCglpZiAobiA8IDApIHsKCQlwcmludGsoS0VSTl9FUlIKCQkgICAgICAgIiBQcm9ibGVtIHNlbmRpbmcgZnJhbWUgY2FwdHVyZSBjb250cm9sIG1lc3NhZ2UiKTsKCQlnb3RvIGRvbmU7Cgl9CgoJbiA9IHVzYl9idWxrX21zZyhjYW0tPnVkZXYsCgkJCSB1c2JfcmN2YnVsa3BpcGUoY2FtLT51ZGV2LCBjYW0tPmJ1bGtFbmRwb2ludCksCgkJCSBjYW0tPnJhd19pbWFnZSwKCQkJIDUxMiAqIDI0MiArIDEyOCwgJmFjdHVhbF9sZW5ndGgsIDEwMDAwKTsKCglpZiAobiA8IDApIHsKCQlwcmludGsoS0VSTl9FUlIgIlByb2JsZW0gZHVyaW5nIGJ1bGsgcmVhZCBvZiBmcmFtZSBkYXRhOiAlZFxuIiwKCQkgICAgICAgbik7Cgl9CgogZG9uZToKCW11dGV4X3VubG9jaygmY2FtLT5jYW1fbG9jayk7Cn0KCnN0YXRpYyBzc2l6ZV90CnZpY2FtX3JlYWQoIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyApCnsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCglEQkcoInJlYWQgJWQgYnl0ZXMuXG4iLCAoaW50KSBjb3VudCk7CgoJaWYgKCpwcG9zID49IFZJQ0FNX01BWF9GUkFNRV9TSVpFKSB7CgkJKnBwb3MgPSAwOwoJCXJldHVybiAwOwoJfQoKCWlmICgqcHBvcyA9PSAwKSB7CgkJcmVhZF9mcmFtZShjYW0sIDApOwoJCXZpY2FtX2RlY29kZV9jb2xvcihjYW0tPnJhd19pbWFnZSwKCQkJCSAgIGNhbS0+ZnJhbWVidWYgKwoJCQkJICAgMCAqIFZJQ0FNX01BWF9GUkFNRV9TSVpFKTsKCX0KCgljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIFZJQ0FNX01BWF9GUkFNRV9TSVpFIC0gKnBwb3MpOwoKCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmY2FtLT5mcmFtZWJ1ZlsqcHBvc10sIGNvdW50KSkgewoJCWNvdW50ID0gLUVGQVVMVDsKCX0gZWxzZSB7CgkJKnBwb3MgKz0gY291bnQ7Cgl9CgoJaWYgKGNvdW50ID09IFZJQ0FNX01BWF9GUkFNRV9TSVpFKSB7CgkJKnBwb3MgPSAwOwoJfQoKCXJldHVybiBjb3VudDsKfQoKCnN0YXRpYyBpbnQKdmljYW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCnsKCS8vIFRPRE86IGFsbG9jYXRlIHRoZSByYXcgZnJhbWUgYnVmZmVyIGlmIG5lY2Vzc2FyeQoJdW5zaWduZWQgbG9uZyBwYWdlLCBwb3M7Cgl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKCXVuc2lnbmVkIGxvbmcgc2l6ZSAgPSB2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0OwoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoKCWlmICghY2FtKQoJCXJldHVybiAtRU5PREVWOwoKCURCRygidmljYW1fbW1hcDogJWxkXG4iLCBzaXplKTsKCgkvKiBXZSBsZXQgbW1hcCBhbGxvY2F0ZSBhcyBtdWNoIGFzIGl0IHdhbnRzIGJlY2F1c2UgTGludXggd2FzIGFkZGluZyAyMDQ4IGJ5dGVzCgkgKiB0byB0aGUgc2l6ZSB0aGUgYXBwbGljYXRpb24gcmVxdWVzdGVkIGZvciBtbWFwIGFuZCBpdCB3YXMgc2NyZXdpbmcgYXBwcyB1cC4KCSBpZiAoc2l6ZSA+IFZJQ0FNX0ZSQU1FUypWSUNBTV9NQVhfRlJBTUVfU0laRSkKCSByZXR1cm4gLUVJTlZBTDsKCSAqLwoKCXBvcyA9ICh1bnNpZ25lZCBsb25nKWNhbS0+ZnJhbWVidWY7Cgl3aGlsZSAoc2l6ZSA+IDApIHsKCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOwoJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpCgkJCXJldHVybiAtRUFHQUlOOwoKCQlzdGFydCArPSBQQUdFX1NJWkU7CgkJcG9zICs9IFBBR0VfU0laRTsKCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKCQkJc2l6ZSAtPSBQQUdFX1NJWkU7CgkJZWxzZQoJCQlzaXplID0gMDsKCX0KCglyZXR1cm4gMDsKfQoKI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX1BST0NfRlMpCgpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aWNhbV9wcm9jX3Jvb3QgPSBOVUxMOwoKc3RhdGljIGludCB2aWNhbV9yZWFkX2hlbHBlcihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKCQkJCWludCBjb3VudCwgaW50ICplb2YsIGludCB2YWx1ZSkKewoJY2hhciAqb3V0ID0gcGFnZTsKCWludCBsZW47CgoJb3V0ICs9IHNwcmludGYob3V0LCAiJWQiLHZhbHVlKTsKCglsZW4gPSBvdXQgLSBwYWdlOwoJbGVuIC09IG9mZjsKCWlmIChsZW4gPCBjb3VudCkgewoJCSplb2YgPSAxOwoJCWlmIChsZW4gPD0gMCkKCQkJcmV0dXJuIDA7Cgl9IGVsc2UKCQlsZW4gPSBjb3VudDsKCgkqc3RhcnQgPSBwYWdlICsgb2ZmOwoJcmV0dXJuIGxlbjsKfQoKc3RhdGljIGludCB2aWNhbV9yZWFkX3Byb2Nfc2h1dHRlcihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKCQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCnsKCXJldHVybiB2aWNhbV9yZWFkX2hlbHBlcihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsCgkJCQkoKHN0cnVjdCB2aWNhbV9jYW1lcmEgKilkYXRhKS0+c2h1dHRlcl9zcGVlZCk7Cn0KCnN0YXRpYyBpbnQgdmljYW1fcmVhZF9wcm9jX2dhaW4oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCgkJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQp7CglyZXR1cm4gdmljYW1fcmVhZF9oZWxwZXIocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLAoJCQkJKChzdHJ1Y3QgdmljYW1fY2FtZXJhICopZGF0YSktPmdhaW4pOwp9CgpzdGF0aWMgaW50CnZpY2FtX3dyaXRlX3Byb2Nfc2h1dHRlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAoJCQkgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJdTE2IHN0bXA7CgljaGFyIGtidWZbOF07CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSAoc3RydWN0IHZpY2FtX2NhbWVyYSAqKSBkYXRhOwoKCWlmIChjb3VudCA+IDYpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZmZlciwgY291bnQpKQoJCXJldHVybiAtRUZBVUxUOwoKCXN0bXAgPSAodTE2KSBzaW1wbGVfc3RydG91bChrYnVmLCBOVUxMLCAxMCk7CglpZiAoc3RtcCA8IDQgfHwgc3RtcCA+IDMyMDAwKQoJCXJldHVybiAtRUlOVkFMOwoKCWNhbS0+c2h1dHRlcl9zcGVlZCA9IHN0bXA7CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgaW50CnZpY2FtX3dyaXRlX3Byb2NfZ2FpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAoJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCnsKCXUxNiBndG1wOwoJY2hhciBrYnVmWzhdOwoKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IChzdHJ1Y3QgdmljYW1fY2FtZXJhICopIGRhdGE7CgoJaWYgKGNvdW50ID4gNCkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJZ3RtcCA9ICh1MTYpIHNpbXBsZV9zdHJ0b3VsKGtidWYsIE5VTEwsIDEwKTsKCWlmIChndG1wID4gMjU1KQoJCXJldHVybiAtRUlOVkFMOwoJY2FtLT5nYWluID0gZ3RtcDsKCglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyB2b2lkCnZpY2FtX2NyZWF0ZV9wcm9jX3Jvb3Qodm9pZCkKewoJdmljYW1fcHJvY19yb290ID0gcHJvY19ta2RpcigidmlkZW8vdmljYW0iLCBOVUxMKTsKCglpZiAodmljYW1fcHJvY19yb290KQoJCXZpY2FtX3Byb2Nfcm9vdC0+b3duZXIgPSBUSElTX01PRFVMRTsKCWVsc2UKCQlwcmludGsoS0VSTl9FUlIKCQkgICAgICAgImNvdWxkIG5vdCBjcmVhdGUgL3Byb2MgZW50cnkgZm9yIHZpY2FtISIpOwp9CgpzdGF0aWMgdm9pZAp2aWNhbV9kZXN0cm95X3Byb2Nfcm9vdCh2b2lkKQp7CglpZiAodmljYW1fcHJvY19yb290KQoJCXJlbW92ZV9wcm9jX2VudHJ5KCJ2aWRlby92aWNhbSIsIDApOwp9CgpzdGF0aWMgdm9pZAp2aWNhbV9jcmVhdGVfcHJvY19lbnRyeShzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0pCnsKCWNoYXIgbmFtZVs2NF07CglzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKCglEQkcoS0VSTl9JTkZPICJ2aWNhbTogY3JlYXRpbmcgcHJvYyBlbnRyeVxuIik7CgoJaWYgKCF2aWNhbV9wcm9jX3Jvb3QgfHwgIWNhbSkgewoJCXByaW50ayhLRVJOX0lORk8KCQkgICAgICAgInZpY2FtOiBjb3VsZCBub3QgY3JlYXRlIHByb2MgZW50cnksICVzIHBvaW50ZXIgaXMgbnVsbC5cbiIsCgkJICAgICAgICghY2FtID8gImNhbWVyYSIgOiAicm9vdCIpKTsKCQlyZXR1cm47Cgl9CgoJc3ByaW50ZihuYW1lLCAidmlkZW8lZCIsIGNhbS0+dmRldi5taW5vcik7CgoJY2FtLT5wcm9jX2RpciA9IHByb2NfbWtkaXIobmFtZSwgdmljYW1fcHJvY19yb290KTsKCglpZiAoICFjYW0tPnByb2NfZGlyICkKCQlyZXR1cm47IC8vIEZJWE1FOiBXZSBzaG91bGQgcHJvYmFibHkgcmV0dXJuIGFuIGVycm9yIGhlcmUKCgllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgic2h1dHRlciIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKCQkJCWNhbS0+cHJvY19kaXIpOwoJaWYgKGVudCkgewoJCWVudC0+ZGF0YSA9IGNhbTsKCQllbnQtPnJlYWRfcHJvYyA9IHZpY2FtX3JlYWRfcHJvY19zaHV0dGVyOwoJCWVudC0+d3JpdGVfcHJvYyA9IHZpY2FtX3dyaXRlX3Byb2Nfc2h1dHRlcjsKCQllbnQtPnNpemUgPSA2NDsKCX0KCgllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgiZ2FpbiIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKCQkJCWNhbS0+cHJvY19kaXIpOwoJaWYgKGVudCkgewoJCWVudC0+ZGF0YSA9IGNhbTsKCQllbnQtPnJlYWRfcHJvYyA9IHZpY2FtX3JlYWRfcHJvY19nYWluOwoJCWVudC0+d3JpdGVfcHJvYyA9IHZpY2FtX3dyaXRlX3Byb2NfZ2FpbjsKCQllbnQtPnNpemUgPSA2NDsKCX0KfQoKc3RhdGljIHZvaWQKdmljYW1fZGVzdHJveV9wcm9jX2VudHJ5KHZvaWQgKnB0cikKewoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgcHRyOwoJY2hhciBuYW1lWzE2XTsKCglpZiAoICFjYW0tPnByb2NfZGlyICkKCQlyZXR1cm47CgoJc3ByaW50ZihuYW1lLCAidmlkZW8lZCIsIGNhbS0+dmRldi5taW5vcik7CglyZW1vdmVfcHJvY19lbnRyeSgic2h1dHRlciIsIGNhbS0+cHJvY19kaXIpOwoJcmVtb3ZlX3Byb2NfZW50cnkoImdhaW4iLCBjYW0tPnByb2NfZGlyKTsKCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsdmljYW1fcHJvY19yb290KTsKCWNhbS0+cHJvY19kaXIgPSBOVUxMOwoKfQoKI2Vsc2UKc3RhdGljIGlubGluZSB2b2lkIHZpY2FtX2NyZWF0ZV9wcm9jX3Jvb3Qodm9pZCkgeyB9CnN0YXRpYyBpbmxpbmUgdm9pZCB2aWNhbV9kZXN0cm95X3Byb2Nfcm9vdCh2b2lkKSB7IH0Kc3RhdGljIGlubGluZSB2b2lkIHZpY2FtX2NyZWF0ZV9wcm9jX2VudHJ5KHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSkgeyB9CnN0YXRpYyBpbmxpbmUgdm9pZCB2aWNhbV9kZXN0cm95X3Byb2NfZW50cnkodm9pZCAqcHRyKSB7IH0KI2VuZGlmCgpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWNhbV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4JCT0gdmljYW1fb3BlbiwKCS5yZWxlYXNlCT0gdmljYW1fY2xvc2UsCgkucmVhZAkJPSB2aWNhbV9yZWFkLAoJLm1tYXAJCT0gdmljYW1fbW1hcCwKCS5pb2N0bAkJPSB2aWNhbV9pb2N0bCwKCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCgkubGxzZWVrCQk9IG5vX2xsc2VlaywKfTsKCnN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpY2FtX3RlbXBsYXRlID0gewoJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKCS5uYW1lIAkJPSAiVmlDYW0tYmFzZWQgVVNCIENhbWVyYSIsCgkudHlwZSAJCT0gVklEX1RZUEVfQ0FQVFVSRSwKCS5oYXJkd2FyZSAJPSBWSURfSEFSRFdBUkVfVklDQU0sCgkuZm9wcyAJCT0gJnZpY2FtX2ZvcHMsCgkubWlub3IgCQk9IC0xLAp9OwoKLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwpzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdmljYW1fdGFibGVbXSA9IHsKCXtVU0JfREVWSUNFKFVTQl9WSUNBTV9WRU5ET1JfSUQsIFVTQl9WSUNBTV9QUk9EVUNUX0lEKX0sCgl7VVNCX0RFVklDRShVU0JfQ09NUFJPX1ZFTkRPUl9JRCwgVVNCX0NPTVBST19QUk9EVUNUX0lEKX0sCgl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdmljYW1fdGFibGUpOwoKc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHZpY2FtX2RyaXZlciA9IHsKCS5uYW1lCQk9ICJ2aWNhbSIsCgkucHJvYmUJCT0gdmljYW1fcHJvYmUsCgkuZGlzY29ubmVjdAk9IHZpY2FtX2Rpc2Nvbm5lY3QsCgkuaWRfdGFibGUJPSB2aWNhbV90YWJsZQp9OwoKLyoqCiAqCXZpY2FtX3Byb2JlCiAqCUBpbnRmOiB0aGUgaW50ZXJmYWNlCiAqCUBpZDogdGhlIGRldmljZSBpZAogKgogKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcwogKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgogKi8Kc3RhdGljIGludAp2aWNhbV9wcm9iZSggc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKewoJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CglpbnQgYnVsa0VuZHBvaW50ID0gMDsKCWNvbnN0IHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW07CgoJcHJpbnRrKEtFUk5fSU5GTyAiVmlDYW0gYmFzZWQgd2ViY2FtIGNvbm5lY3RlZFxuIik7CgoJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CgoJREJHKEtFUk5fREVCVUcgIkludGVyZmFjZSAlZC4gaGFzICV1LiBlbmRwb2ludHMhXG4iLAoJICAgICAgIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAodW5zaWduZWQpIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cykpOwoJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwoKCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgoJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDIpKSB7CgkJLyogd2UgZm91bmQgYSBidWxrIGluIGVuZHBvaW50ICovCgkJYnVsa0VuZHBvaW50ID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Cgl9IGVsc2UgewoJCXByaW50ayhLRVJOX0VSUgoJCSAgICAgICAiTm8gYnVsayBpbiBlbmRwb2ludCB3YXMgZm91bmQgPyEgKHRoaXMgaXMgYmFkKVxuIik7Cgl9CgoJaWYgKChjYW0gPQoJICAgICBrbWFsbG9jKHNpemVvZiAoc3RydWN0IHZpY2FtX2NhbWVyYSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORwoJCSAgICAgICAiY291bGQgbm90IGFsbG9jYXRlIGtlcm5lbCBtZW1vcnkgZm9yIHZpY2FtX2NhbWVyYSBzdHJ1Y3RcbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCW1lbXNldChjYW0sIDAsIHNpemVvZiAoc3RydWN0IHZpY2FtX2NhbWVyYSkpOwoKCWNhbS0+c2h1dHRlcl9zcGVlZCA9IDE1OwoKCW11dGV4X2luaXQoJmNhbS0+Y2FtX2xvY2spOwoKCW1lbWNweSgmY2FtLT52ZGV2LCAmdmljYW1fdGVtcGxhdGUsCgkgICAgICAgc2l6ZW9mICh2aWNhbV90ZW1wbGF0ZSkpOwoJY2FtLT52ZGV2LnByaXYgPSBjYW07CS8vIHNvcnQgb2YgYSByZXZlcnNlIG1hcHBpbmcgZm9yIHRob3NlIGZ1bmN0aW9ucyB0aGF0IGdldCB2ZGV2IG9ubHkKCgljYW0tPnVkZXYgPSBkZXY7CgljYW0tPmJ1bGtFbmRwb2ludCA9IGJ1bGtFbmRwb2ludDsKCglpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKSA9PSAtMSkgewoJCWtmcmVlKGNhbSk7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZFxuIik7CgkJcmV0dXJuIC1FSU87Cgl9CgoJdmljYW1fY3JlYXRlX3Byb2NfZW50cnkoY2FtKTsKCglwcmludGsoS0VSTl9JTkZPICJWaUNhbSB3ZWJjYW0gZHJpdmVyIG5vdyBjb250cm9sbGluZyB2aWRlbyBkZXZpY2UgJWRcbiIsY2FtLT52ZGV2Lm1pbm9yKTsKCgl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBjYW0pOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZAp2aWNhbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQp7CglpbnQgb3Blbl9jb3VudDsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CgoJLyogd2UgbXVzdCB1bnJlZ2lzdGVyIHRoZSBkZXZpY2UgYmVmb3JlIHRha2luZyBpdHMKCSAqIGNhbV9sb2NrLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHZpZGVvIG9wZW4gY2FsbAoJICogaG9sZHMgdGhlIHNhbWUgbG9jayBhcyB2aWRlbyB1bnJlZ2lzdGVyLiBpZiB3ZQoJICogdW5yZWdpc3RlciBpbnNpZGUgb2YgdGhlIGNhbV9sb2NrIGFuZCBvcGVuIGFsc28KCSAqIHVzZXMgdGhlIGNhbV9sb2NrLCB3ZSBnZXQgZGVhZGxvY2suCgkgKi8KCgl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmY2FtLT52ZGV2KTsKCgkvKiBzdG9wIHRoZSBjYW1lcmEgZnJvbSBiZWluZyB1c2VkICovCgoJbXV0ZXhfbG9jaygmY2FtLT5jYW1fbG9jayk7CgoJLyogbWFyayB0aGUgY2FtZXJhIGFzIGdvbmUgKi8KCgljYW0tPnVkZXYgPSBOVUxMOwoKCXZpY2FtX2Rlc3Ryb3lfcHJvY19lbnRyeShjYW0pOwoKCS8qIHRoZSBvbmx5IHRoaW5nIGxlZnQgdG8gZG8gaXMgc3luY2hyb25pemUgd2l0aAoJICogb3VyIGNsb3NlL3JlbGVhc2UgZnVuY3Rpb24gb24gd2hvIHNob3VsZCByZWxlYXNlCgkgKiB0aGUgY2FtZXJhIG1lbW9yeS4gaWYgdGhlcmUgYXJlIGFueSB1c2VycyB1c2luZyB0aGUKCSAqIGNhbWVyYSwgaXQncyB0aGVpciBqb2IuIGlmIHRoZXJlIGFyZSBubyB1c2VycywKCSAqIGl0J3Mgb3Vycy4KCSAqLwoKCW9wZW5fY291bnQgPSBjYW0tPm9wZW5fY291bnQ7CgoJbXV0ZXhfdW5sb2NrKCZjYW0tPmNhbV9sb2NrKTsKCglpZiAoIW9wZW5fY291bnQpIHsKCQlrZnJlZShjYW0pOwoJfQoKCXByaW50ayhLRVJOX0RFQlVHICJWaUNhbS1iYXNlZCBXZWJDYW0gZGlzY29ubmVjdGVkXG4iKTsKfQoKLyoKICovCnN0YXRpYyBpbnQgX19pbml0CnVzYl92aWNhbV9pbml0KHZvaWQpCnsKCWludCByZXR2YWw7CglEQkcoS0VSTl9JTkZPICJWaUNhbS1iYXNlZCBXZWJDYW0gZHJpdmVyIHN0YXJ0dXBcbiIpOwoJdmljYW1fY3JlYXRlX3Byb2Nfcm9vdCgpOwoJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ2aWNhbV9kcml2ZXIpOwoJaWYgKHJldHZhbCkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1c2JfcmVnaXN0ZXIgZmFpbGVkIVxuIik7CglyZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQKdXNiX3ZpY2FtX2V4aXQodm9pZCkKewoJREJHKEtFUk5fSU5GTwoJICAgICAgICJWaUNhbS1iYXNlZCBXZWJDYW0gZHJpdmVyIHNodXRkb3duXG4iKTsKCgl1c2JfZGVyZWdpc3RlcigmdmljYW1fZHJpdmVyKTsKCXZpY2FtX2Rlc3Ryb3lfcHJvY19yb290KCk7Cn0KCm1vZHVsZV9pbml0KHVzYl92aWNhbV9pbml0KTsKbW9kdWxlX2V4aXQodXNiX3ZpY2FtX2V4aXQpOwoKTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=