LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgojaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIGlycV9pbml0KHZvaWQpCnsKCQoJLyogZGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0IG1vZGUgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSUNJQ1IsIDB4NDApOyAKCQoJLyogc2V0IGlycTAtNyB0byBlZGdlICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfTVBJQ01PREUsIDB4MDApOwoJCgkvKiBzZXQgaXJxOS0xMiB0byBsZXZlbCwgYWxsIHRoZSBvdGhlciAoOCwgMTMtMTUpIGFyZSBlZGdlICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU0wxUElDTU9ERSwgMHgxZSk7CgkKCS8qIHNldCBpcnExNi0yNCAodW51c2VkIHNsYXZlIHBpYzIpIHRvIGxldmVsICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU0wyUElDTU9ERSwgMHhmZik7CgkKCS8qIGFjdGl2ZSBsb3cgcG9sYXJpdHkgb24gUElDIGludGVycnVwdCBwaW5zLCAKCSAgIGFjdGl2ZSBoaWdoIHBvbGFyaXR5IG9uIGFsbCBvdGhlciBpcnEgcGlucyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCwgMCk7CgoJLyogc2V0IGlycSBudW1iZXIgbWFwcGluZyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SME1BUCwwKTsgICAgICAgICAgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDAgSU5UICovICAgICAgIAoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SMU1BUCwwKTsgICAgICAgICAgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDEgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BUTVIyTUFQLDApOyAgICAgICAgICAgIC8qIGRpc2FibGUgR1AgdGltZXIgMiBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQwTUFQLDB4MSk7ICAgICAgICAgICAgLyogU2V0IFBJVCB0aW1lciAwIElOVCB0byBJUlEwICovIAoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDFNQVAsMCk7ICAgICAgICAgICAgICAvKiBkaWFibGUgUElUIHRpbWVyIDEgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElUMk1BUCwwKTsgICAgICAgICAgICAgIC8qIGRpYWJsZSBQSVQgdGltZXIgMiBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQLDB4NCk7ICAgICAgICAgLyogU2V0IFBDSSBJTlQgQSB0byBJUlE5ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUENJSU5UQk1BUCwweDUpOyAgICAgICAgIC8qIFNldCBQQ0kgSU5UIEIgdG8gSVJRMTAgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRDTUFQLDB4Nik7ICAgICAgICAgLyogU2V0IFBDSSBJTlQgQyB0byBJUlExMSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVERNQVAsMHg3KTsgICAgICAgICAvKiBTZXQgUENJIElOVCBEIHRvIElSUTEyICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRE1BQkNJTlRNQVAsMCk7ICAgICAgICAgIC8qIGRpc2FibGUgRE1BIElOVCAqLyAKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lNQVAsMCk7ICAgICAgICAgICAgICAgLyogZGlzYWJsZSBTeW5jaHJvbml1cyBzZXJpYWwgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfV0RUTUFQLDApOyAgICAgICAgICAgICAgIC8qIGRpc2FibGUgV2F0Y2hkb3IgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUlRDTUFQLDB4Myk7ICAgICAgICAgICAgIC8qIFNldCBSVEMgaW50IHRvIDggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9XUFZNQVAsMCk7ICAgICAgICAgICAgICAgLyogZGlzYWJsZSB3cml0ZSBwcm90ZWN0IElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0lDRU1BUCwweDIpOyAgICAgICAgICAgICAvKiBTZXQgSUNFIERlYnVnIFNlcmllbHBvcnQgSU5UIHRvIElSUTEgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9GRVJSTUFQLDB4OCk7ICAgICAgICAgICAgLyogU2V0IEZQIGVycm9yIElOVCB0byBJUlExMyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMElNQVAsNik7ICAgICAgICAgICAgICAvKiBTZXQgR1BJUlEwIChJU0EgSVJRMikgdG8gSVJROSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMUlNQVAsMik7ICAgICAgICAgICAgICAvKiBTZXQgR1BJUlExIChTSU8gSVJRMSkgdG8gSVJRMSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMklNQVAsNyk7ICAgICAgICAgICAgICAvKiBTZXQgR1BJUlEyIChJU0EgSVJRMTIpIHRvIElSUTEyICovCgkKCWlmIChDRkdfVVNFX1NJT19VQVJUKSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxTUFQLDApOyAgICAgLyogZGlzYWJsZSBpbnRlcm5hbCBVQVJUMSBJTlQgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJNQVAsMCk7ICAgICAvKiBkaXNhYmxlIGludGVybmFsIFVBUlQyIElOVCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDNJTUFQLDExKTsgICAgIC8qIFNldCBHUElSUTMgKElTQSBJUlEzKSB0byBJUlEzICovIAoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDRJTUFQLDEyKTsgICAgIC8qIFNldCBHUElSUTQgKElTQSBJUlE0KSB0byBJUlE0ICovCgl9IGVsc2UgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMU1BUCwxMik7ICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRNCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwxMSk7ICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRMyAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDNJTUFQLDApOyAgICAgIC8qIGRpc2FibGUgR1BJUlEzIChJU0EgSVJRMykgKi8gCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsMCk7ICAgICAgLyogZGlzYWJsZSBHUElSUTQgKElTQSBJUlE0KSAqLwoJfQoJCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A1SU1BUCwxMyk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTUgKElTQSBJUlE1KSB0byBJUlE1ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A2SU1BUCwyMSk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTYgKElTQSBJUlE2KSB0byBJUlE2ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A3SU1BUCwyMik7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTcgKElTQSBJUlE3KSB0byBJUlE3ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A4SU1BUCwzKTsgICAgICAgICAgICAgIC8qIFNldCBHUElSUTggKFNJTyBJUlE4KSB0byBJUlE4ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A5SU1BUCw0KTsgICAgICAgICAgICAgIC8qIFNldCBHUElSUTkgKElTQSBJUlE5KSB0byBJUlE5ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AxMElNQVAsOSk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTEwIChJU0EgSVJRMTApIHRvIElSUTEwICovICAgICAgICAgIAoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BDSUhPU1RNQVAsMHgxMWYpOyAgICAgICAvKiBNYXAgUENJIGhvc3RicmlkZ2UgSU5UIHRvIE5NSSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0VDQ01BUCwweDEwMCk7ICAgICAgICAgICAvKiBNYXAgU0RSQU0gRUNDIGZhaWx1cmUgSU5UIHRvIE5NSSAqLwogCn0KCi8qIFBDSSBzdHVmZiAqLwpzdGF0aWMgdm9pZCBwY2lfc2M1MjBfY2RwX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCnsKCWNoYXIgcGluOwoJaW50IGlycTsKCQoJCglwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOwoJaXJxID0gcGluLTE7CgkKCXN3aXRjaCAoUENJX0RFVihkZXYpKSB7CgljYXNlIDIwOgoJCWJyZWFrOwoJY2FzZSAxOToKCQlpcnErPTE7CgkJYnJlYWs7CgljYXNlIDE4OgoJCWlycSs9MjsKCQlicmVhazsKCWNhc2UgMTc6CgkJaXJxKz0zOwoJCWJyZWFrOwoJZGVmYXVsdDogCgkJcmV0dXJuOwoJfQoJCglpcnEmPTM7IC8qIHdyYXAgYXJvdW5kICovCglpcnErPTk7IC8qIGxvd2VzdCBJUlEgaXMgOSAqLwoJCglwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKI2lmIDAJCglwcmludGYoImZpeHVwX2lycTogZGV2aWNlICVkIHBpbiAlYyBpcnEgJWRcbiIsIAoJICAgICAgIFBDSV9ERVYoZGV2KSwgJ0EnICsgcGluIC0xLCBpcnEpOwojZW5kaWYKfQogCnN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgc2M1MjBfY2RwX2hvc2UgPSB7CglmaXh1cF9pcnE6IHBjaV9zYzUyMF9jZHBfZml4dXBfaXJxLAp9OwoKdm9pZCBwY2lfaW5pdCh2b2lkKQp7CglwY2lfc2M1MjBfaW5pdCgmc2M1MjBfY2RwX2hvc2UpOwp9CgoKc3RhdGljIHZvaWQgc2lsZW5jZV91YXJ0KGludCBwb3J0KQp7CglvdXRiKDAsIHBvcnQrMSk7Cn0KCnZvaWQgc2V0dXBfYWxpX3NpbyhpbnQgdWFydF9wcmltYXJ5KQp7CglhbGk1MTJ4X2luaXQoKTsKCQoJYWxpNTEyeF9zZXRfZmRjKEFMSV9FTkFCTEVELCAweDNmMiwgNiwgMCk7CglhbGk1MTJ4X3NldF9wcChBTElfRU5BQkxFRCwgMHgyNzgsIDcsIDMpOwoJYWxpNTEyeF9zZXRfdWFydChBTElfRU5BQkxFRCwgQUxJX1VBUlQxLCB1YXJ0X3ByaW1hcnk/MHgzZjg6MHgzZTgsIDQpOwoJYWxpNTEyeF9zZXRfdWFydChBTElfRU5BQkxFRCwgQUxJX1VBUlQyLCB1YXJ0X3ByaW1hcnk/MHgyZjg6MHgyZTgsIDMpOwoJYWxpNTEyeF9zZXRfcnRjKEFMSV9ESVNBQkxFRCwgMCwgMCk7CglhbGk1MTJ4X3NldF9rYmMoQUxJX0VOQUJMRUQsIDEsIDEyKTsKCWFsaTUxMnhfc2V0X2NpbyhBTElfRU5BQkxFRCk7CgkKCS8qIElyRGEgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTIsIDEsIDAsIDApOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTMsIDEsIDAsIDApOwoJCgkvKiBTU0kgY2hpcCBzZWxlY3QgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTQsIDAsIDAsIDApOyAgLyogU1NJX0NTICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNSwgMCwgMCwgMCk7ICAvKiBTU0lfTVYgKi8JCQkJCSAgICAgCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNiwgMCwgMSwgMCk7ICAvKiBTU0lfU1BJIyAoaW52ZXJ0ZWQpICovCgoJLyogQm9hcmQgUkVWIHBpbnMgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIwLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIxLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIyLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIzLCAwLCAwLCAxKTsgICAgICAKfQoKCi8qIHNldCB1cCB0aGUgSVNBIGJ1cyB0aW1pbmcgYW5kIHN5c3RlbSBhZGRyZXNzIG1hcHBpbmdzICovCnN0YXRpYyB2b2lkIGJ1c19pbml0KHZvaWQpCnsKCgkvKiBzZXQgdXAgdGhlIEdQIElPIHBpbnMgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMzMV8xNiwgMHhmN2ZmKTsgCS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMzEtMTYgcmVnICovCQkgICAKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMxNV8wLCAweGZmZmYpOyAgCS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMTUtMCByZWcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DU1BGUywgMHhmOCk7ICAJCS8qIHNldCB0aGUgQ1MgcGluIGZ1bmN0aW9uICByZWcgKi8JCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcwKTsKCgkKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUlQsIDEpOyAgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovICAgIAkKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUFcsIDMpOyAgIC8qIHNldCB0aGUgR1AgQ1MgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTT0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRFcsIDMpOyAgICAvKiBzZXQgdGhlIFJEIHB1bHNlIHdpZHRoICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRE9GRiwgMSk7ICAvKiBzZXQgdGhlIEdQIFJEIG9mZnNldCAqLwogICAgICAgIHdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFdSVywgMyk7ICAgIC8qIHNldCB0aGUgR1AgV1IgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFdST0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgV1Igb2Zmc2V0ICovCgoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0JPT1RDU0NUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgQk9PVENTICovIAoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JPTUNTMUNUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MxICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUk9NQ1MyQ1RMLCAweDE4MjMpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBST01DUzIgKi8gCgkKCS8qIGFkanVzdCB0aGUgbWVtb3J5IG1hcDoKCSAqIGJ5IGRlZmF1bHQgdGhlIGZpcnN0IDI1Nk1CICgweDAwMDAwMDAwIC0gMHgwZmZmZmZmZikgaXMgbWFwcGVkIHRvIFNEUkFNCgkgKiBhbmQgMjU2TUIgdG8gMUctMTI4ayAgKDB4MTAwMDAwMCAtIDB4MzdmZmZmZmYpIGlzIG1hcHBlZCB0byBQQ0kgbW1pbwoJICogd2UgbmVlZCB0byBtYXAgMUctMTI4ayAtIDFHICgweDM4MDAwMDAwIC0gMHgzZmZmZmZmZikgdG8gQ1MxICovIAoJCgkJCgkvKiBTUkFNID0gR1BDUzMgMTI4ayBAIGQwMDAwLWVmZmZmKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIyLCAgMHg0ZTAwNDAwZCk7CQkKCQoJLyogSURFMCA9IEdQQ1M2IDFmMC0xZjcgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIzLCAgMHgzODA4MDFmMCk7CQkKCgkvKiBJREUxID0gR1BDUzcgM2Y2ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSNCwgIDB4M2MwMDAzZjYpOwkJCgkvKiBib290Y3MgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMiwgMHg4YmZmZTgwMCk7CQkKCS8qIHJvbWNzMiAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEzLCAweGNiZmZmMDAwKTsJCQoJLyogcm9tY3MxICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTQsIDB4YWJmZmY4MDApOwkJCgkvKiA2ODAgTEVEUyAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjE1LCAweDMwMDAwNjQwKTsJCQoJCglhc20gKCJ3YmludmRcbiIpOyAvKiBGbHVzaCBjYWNoZSwgcmVxLiBhZnRlciBzZXR0aW5nIHRoZSB1bmNoYWNoZWQgYXR0cmlidXRlIG9uYSBQQVIgKi8JCgoJaWYgKENGR19VU0VfU0lPX1VBUlQpIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCByZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpIHwgVUFSVDJfRElTfFVBUlQxX0RJUyk7CQoJCXNldHVwX2FsaV9zaW8oMSk7Cgl9IGVsc2UgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsIHJlYWRfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCkgJiB+KFVBUlQyX0RJU3xVQVJUMV9ESVMpKTsJCgkJc2V0dXBfYWxpX3NpbygwKTsKCQlzaWxlbmNlX3VhcnQoMHgzZTgpOwoJCXNpbGVuY2VfdWFydCgweDJlOCk7Cgl9Cgp9CgoKCi8qCiAqIE1pc2NlbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zCiAqLwoKaW50IGJvYXJkX2luaXQodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgkKCWluaXRfc2M1MjAoKTsJCglidXNfaW5pdCgpOwoJaXJxX2luaXQoKTsKCQkKCS8qIG1heCBkcml2ZSBjdXJyZW50IG9uIFNEUkFNICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfRFNDVEwsIDB4MDEwMCk7CgkJCgkvKiBlbnRlciBkZWJ1ZyBtb2RlIGFmdGVyIG5leHQgcmVzZXQgKG9ubHkgaWYganVtcGVyIGlzIGFsc28gc2V0KSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1JFU0NGRywgMHgwOCk7CgkKCS8qIGNvbmZpZ3VyZSB0aGUgc29mdHdhcmUgdGltZXIgdG8gMzMuMzMzTUh6ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1dUTVJDRkcsIDApOwoJZ2QtPmJ1c19jbGsgPSAzMzMzMzAwMDsKCQoJcmV0dXJuIDA7Cn0KCmludCBkcmFtX2luaXQodm9pZCkKewoJaW5pdF9zYzUyMF9kcmFtKCk7CglyZXR1cm4gMDsKfQoKdm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MoaW50IHZhbCkKewoJb3V0Yih2YWwmMHhmZiwgMHg4MCk7CglvdXRiKCh2YWwmMHhmZjAwKT4+OCwgMHg2ODApOwp9CgoKaW50IGxhc3Rfc3RhZ2VfaW5pdCh2b2lkKQp7CglpbnQgbWlub3I7CglpbnQgbWFqb3I7CgkKCW1ham9yID0gbWlub3IgPSAwOwoJbWFqb3IgfD0gYWxpNTEyeF9jaW9faW4oMjMpPzI6MDsKCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIyKT8xOjA7CgltaW5vciB8PSBhbGk1MTJ4X2Npb19pbigyMSk/MjowOwoJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjApPzE6MDsKCQoJcHJpbnRmKCJBTUQgU0M1MjAgQ0RQIHJldmlzaW9uICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwp9Cg==