LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxzc2kuaD4KI2luY2x1ZGUgPG5ldGRldi5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vcGNpLmg+CiNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KCkRFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKLyoKICogVGhlb3J5OgogKiBXZSBmaXJzdCBzZXQgdXAgYWxsIElSUXMgdG8gYmUgbm9uLXBjaSwgZWRnZSB0cmlnZ2VyZWQsCiAqIHdoZW4gd2UgbGF0ZXIgZW51bWVyYXRlIHRoZSBwY2kgYnVzIGFuZCBwY2lfc2M1MjBfZml4dXBfaXJxKCkgZ2V0cwogKiBjYWxsZWQgd2UgcmVhbGxvY2F0ZSBpcnFzIHRvIHRoZSBwY2kgYnVzIHdpdGggc2M1MjBfcGNpX3NldF9pcnEoKQogKiBhcyBuZWVkZWQuIFdoZSBjaG9vc2UgdGhlIGlycXMgdG8gZ3JhbSBmcm9tIGEgY29uZmlndXJhYmxlIGxpc3QKICogaW5zaWRlIHBjaV9zYzUyMF9maXh1cF9pcnEoKSAoSWYgdGhpcyBsaXN0IGNvbnRhaW5zIHN0dXBpZCBpcnEncwogKiBzdWNoIGFzIDAgdGhuZ2FzIHdpbGwgbm90IHdvcmspCiAqLwoKc3RhdGljIHZvaWQgaXJxX2luaXQodm9pZCkKewoJLyogZGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0IG1vZGUgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSUNJQ1IsIDB4NDApOwoKCS8qIHNldCBhbGwgaXJxcyB0byBlZGdlICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfTVBJQ01PREUsIDB4MDApOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NMMVBJQ01PREUsIDB4MDApOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NMMlBJQ01PREUsIDB4MDApOwoKCS8qIGFjdGl2ZSBsb3cgcG9sYXJpdHkgb24gUElDIGludGVycnVwdCBwaW5zLAoJICogIGFjdGl2ZSBoaWdoIHBvbGFyaXR5IG9uIGFsbCBvdGhlciBpcnEgcGlucyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCwgMHgwMDAwKTsKCgkvKiBzZXQgaXJxIG51bWJlciBtYXBwaW5nICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BUTVIwTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgIC8qIGRpc2FibGUgR1AgdGltZXIgMCBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgLyogZGlzYWJsZSBHUCB0aW1lciAxIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SMk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDIgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElUME1BUCwgU0M1MjBfSVJRMCk7ICAgICAgICAgICAgIC8qIFNldCBQSVQgdGltZXIgMCBJTlQgdG8gSVJRMCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAvKiBkaXNhYmxlIFBJVCB0aW1lciAxIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAvKiBkaXNhYmxlIFBJVCB0aW1lciAyIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVENNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVERNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgRCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RNQUJDSU5UTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAvKiBkaXNhYmxlIERNQSBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lNQVAsIFNDNTIwX0lSUTYpOyAgICAgICAgICAgICAgLyogU2V0IFN5bmNocm9uaXVzIHNlcmlhbCBJTlQgdG8gSVJRNiovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfV0RUTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgIC8qIGRpc2FibGUgV2F0Y2hkb2cgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUlRDTUFQLCBTQzUyMF9JUlE4KTsgICAgICAgICAgICAgIC8qIFNldCBSVEMgaW50IHRvIDggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9XUFZNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAgLyogZGlzYWJsZSB3cml0ZSBwcm90ZWN0IElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0lDRU1BUCwgU0M1MjBfSVJRMSk7ICAgICAgICAgICAgICAvKiBTZXQgSUNFIERlYnVnIFNlcmllbHBvcnQgSU5UIHRvIElSUTEgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9GRVJSTUFQLFNDNTIwX0lSUTEzKTsgICAgICAgICAgICAgLyogU2V0IEZQIGVycm9yIElOVCB0byBJUlExMyAqLwoKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMU1BUCwgU0M1MjBfSVJRNCk7ICAgICAgICAgICAgLyogU2V0IGludGVybmFsIFVBUlQyIElOVCB0byBJUlE0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJNQVAsIFNDNTIwX0lSUTMpOyAgICAgICAgICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRMyAqLwoKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDBJTUFQLCBTQzUyMF9JUlE3KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRMCAoUEMtQ2FyZCBBVVggSVJRKSB0byBJUlE3ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AxSU1BUCwgU0M1MjBfSVJRMTQpOyAgICAgICAgICAgIC8qIFNldCBHUElSUTEgKENGIElSUSkgdG8gSVJRMTQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDNJTUFQLCBTQzUyMF9JUlE1KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRMyAoIENBTiBJUlEgKSB0aSBJUlE1ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A0SU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAgIC8qIGRpc2JhbGUgR0lSUTQgKCBJUlIgSVJRICkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDVJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBHUElSUTUgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDZJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBHUElSUTYgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDdJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBHUElSUTcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDhJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBHUElSUTggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDlJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBHUElSUTkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDJJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBHUElSUTIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDEwSU1BUCxTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBHUElSUTEwICovCgoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BDSUhPU1RNQVAsIDB4MTFmKTsgICAgICAgICAgICAgICAvKiBNYXAgUENJIGhvc3RicmlkZ2UgSU5UIHRvIE5NSSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0VDQ01BUCwgMHgxMDApOyAgICAgICAgICAgICAgICAgICAvKiBNYXAgU0RSQU0gRUNDIGZhaWx1cmUgSU5UIHRvIE5NSSAqLwoKfQoKCi8qIFBDSSBzdHVmZiAqLwpzdGF0aWMgdm9pZCBwY2lfc2M1MjBfc3B1bmtfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKewoJaW50IHZlcnNpb24gPSByZWFkX21tY3JfYnl0ZShTQzUyMF9TWVNJTkZPKTsKCgkvKiBhIGNvbmZpZ3VyYWJsZSBsaXN0cyBvZiBpcnFzIHRvIHN0ZWFsCgkgKiB3aGVuIHdlIG5lZWQgb25lIChhIGJvYXJkIHdpdGggbW9yZSBwY2kgaW50ZXJydXB0IHBpbnMKCSAqIHdvdWxkIHVzZSBhIGxhcmdlciB0YWJsZSAqLwoJc3RhdGljIGludCBpcnFfbGlzdFtdID0gewoJCUNGR19GSVJTVF9QQ0lfSVJRLAoJCUNGR19TRUNPTkRfUENJX0lSUSwKCQlDRkdfVEhJUkRfUENJX0lSUSwKCQlDRkdfRk9SVEhfUENJX0lSUQoJfTsKCXN0YXRpYyBpbnQgbmV4dF9pcnFfaW5kZXg9MDsKCgljaGFyIHRtcF9waW47CglpbnQgcGluOwoKCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnRtcF9waW4pOwoJcGluID0gdG1wX3BpbjsKCglwaW4tPTE7IC8qIHBjaSBjb25maWcgc3BhY2UgdXNlIDEtYmFzZWQgbnVtYmVyaW5nICovCglpZiAoLTEgPT0gcGluKSB7CgkJcmV0dXJuOyAvKiBkZXZpY2UgdXNlIG5vIGlycSAqLwoJfQoKCgkvKiBtYXAgZGV2aWNlIG51bWJlciArICBwaW4gdG8gYSBwaW4gb24gdGhlIHNjNTIwICovCglzd2l0Y2ggKFBDSV9ERVYoZGV2KSkgewoJY2FzZSA2OiAgLyogRVRIMCAqLwoJCXBpbis9U0M1MjBfUENJX0lOVEE7CgkJYnJlYWs7CgoJY2FzZSA3OiAgLyogRVRIMSAqLwoJCXBpbis9U0M1MjBfUENJX0lOVEI7CgkJYnJlYWs7CgoJY2FzZSA4OiAgLyogQ3J5cHRvICovCgkJcGluKz1TQzUyMF9QQ0lfSU5UQzsKCQlicmVhazsKCgljYXNlIDk6IC8qIFBNQyBzbG90ICovCgkJcGluKz1TQzUyMF9QQ0lfSU5URDsKCQlicmVhazsKCgljYXNlIDEwOiAvKiBQQy1DYXJkICovCgoJCWlmICh2ZXJzaW9uIDwgMTApIHsKCQkJcGluKz1TQzUyMF9QQ0lfSU5URDsKCQl9IGVsc2UgewoJCQlwaW4rPVNDNTIwX1BDSV9JTlRDOwoJCX0KCQlicmVhazsKCglkZWZhdWx0OgoJCXJldHVybjsKCX0KCglwaW4mPTM7IC8qIHdyYXAgYXJvdW5kICovCgoJaWYgKHNjNTIwX3BjaV9pbnRzW3Bpbl0gPT0gLTEpIHsKCQkvKiByZS1yb3V0ZSBvbmUgaW50ZXJydXB0IGZvciB1cyAqLwoJCWlmIChuZXh0X2lycV9pbmRleCA+IDMpIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAocGNpX3NjNTIwX3NldF9pcnEocGluLCBpcnFfbGlzdFtuZXh0X2lycV9pbmRleF0pKSB7CgkJCXJldHVybjsKCQl9CgkJbmV4dF9pcnFfaW5kZXgrKzsKCX0KCgoJaWYgKC0xICE9IHNjNTIwX3BjaV9pbnRzW3Bpbl0pIHsKCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKCQkJCQkgICBzYzUyMF9wY2lfaW50c1twaW5dKTsKCX0KI2lmIDAKCXByaW50ZigiZml4dXBfaXJxOiBkZXZpY2UgJWQgcGluICVjIGlycSAlZFxuIiwKCSAgICAgICBQQ0lfREVWKGRldiksICdBJyArIHBpbiwgc2M1MjBfcGNpX2ludHNbcGluXSk7CiNlbmRpZgp9CgoKc3RhdGljIHZvaWQgcGNpX3NjNTIwX3NwdW5rX2NvbmZpZ3VyZV9jYXJkYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKCQkJCQkgICAgICBwY2lfZGV2X3QgZGV2LCBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqdGUpCnsKCXUzMiBpb19iYXNlOwoJdTMyIHRlbXA7CgoJcGNpYXV0b19jb25maWdfZGV2aWNlKGhvc2UsIGRldik7CgoJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgMHgwNyk7ICAvKiBlbmFibGUgZGV2aWNlICovCglwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4MGMsIDB4MTApOyAgICAgICAgIC8qIGNhY2hlbGluZSBzaXplICovCglwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4MGQsIDB4NDApOyAgICAgICAgIC8qIGxhdGVuY3kgdGltZXIgKi8KCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHgxYiwgMHg0MCk7ICAgICAgICAgLyogY2FyZGJ1cyBsYXRlbmN5IHRpbWVyICovCglwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9CUklER0VfQ09OVFJPTCwgMHgwMDQwKTsgIC8qIHJlc2V0IGNhcmRidXMgKi8KCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0JSSURHRV9DT05UUk9MLCAweDAwODApOyAgLyogcm91dGUgaW50ZXJydXB0cyB0aG91Z2ggRXhDQSAqLwoJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAgMHg0NCwgMHgzZTApOyAvKiBtYXAgbGVnYWN5IEkvTyBwb3J0IHRvIDB4M2UwICovCgoJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCAgMHg4MCwgJnRlbXApOyAvKiBTeXN0ZW0gY29udHJvbCAqLwoJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgIDB4ODAsIHRlbXAgfCAweDYwKTsgLyogU3lzdGVtIGNvbnRyb2w6IGRpc2FibGUgY2xvY2tydW4gKi8KCS8qIHJvdXRlIE1GMCB0byB+SU5UIGFuZCBNRjMgdG8gSVJRNwoJICogcmVzZXJ2ZSBhbGwgb3RoZXJzICovCglwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCAweDhjLCAweDAwMDA3MDAyKTsKCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHg5MSwgMHgwMCk7ICAgIC8qIGNhcmQgY29udHJvbCAqLwoJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCAweDkyLCAweDYyKTsgICAgLyogZGV2aWNlIGNvbnRyb2wgKi8KCglpZiAodGUtPmRldmljZSAhPSAweGFjNTYpIHsKCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4OTMsIDB4MjEpOyAgICAvKiBhc3luYyBpbnRlcnJ1cHQgZW5hYmxlICovCgkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAweGE4LCAweDAwMDApOyAgLyogcmVzZXQgR1BJTyAqLwoJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgMHhhYywgMHgwMDAwKTsgIC8qIHJlc2V0IEdQSU8gKi8KCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIDB4YWEsIDB4MDAwMCk7ICAvKiByZXNldCBHUElPICovCgkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAweGFlLCAweDAwMDApOyAgLyogcmVzZXQgR1BJTyAqLwoJfSBlbHNlIHsKCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4OTMsIDB4MjApOyAgICAvKiAgKi8KCX0KCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgMHhhNCwgMHg4MDAwKTsgIC8qIHJlc2V0IHBvd2VyIG1hbmFnZW1lbnQgKi8KCgoJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZpb19iYXNlKTsKCWlvX2Jhc2UgJj0gfjB4Zkw7CgoJd3JpdGViKDB4MDcsIGlvX2Jhc2UrMHg4MDMpOyAvKiByb3V0ZSBDU0MgaXJxIHRob3VnaCBFeENBIGFuZCBlbmFibGUgSVJRNyAqLwoJd3JpdGVsKDAsIGlvX2Jhc2UrMHgxMCk7ICAgICAvKiBDTEtSVU4gZGVmYXVsdCAqLwoJd3JpdGVsKDAsIGlvX2Jhc2UrMHgyMCk7ICAgICAvKiBDTEtSVU4gZGVmYXVsdCAqLwoKfQoKCnN0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfc2M1MjBfc3B1bmtfY29uZmlnX3RhYmxlW10gPSB7Cgl7IDB4MTA0YywgMHhhYzUwLCBQQ0lfQU5ZX0lELCAwLCAweDBhLCAwLCBwY2lfc2M1MjBfc3B1bmtfY29uZmlndXJlX2NhcmRidXMsIHsgMCwgMCwgMH0gfSwKCXsgMHgxMDRjLCAweGFjNTYsIFBDSV9BTllfSUQsIDAsIDB4MGEsIDAsIHBjaV9zYzUyMF9zcHVua19jb25maWd1cmVfY2FyZGJ1cywgeyAwLCAwLCAwfSB9LAoJeyAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCB7MCwwLDB9fQp9OwoKc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzYzUyMF9zcHVua19ob3NlID0gewoJZml4dXBfaXJxOiBwY2lfc2M1MjBfc3B1bmtfZml4dXBfaXJxLAoJY29uZmlnX3RhYmxlOiBwY2lfc2M1MjBfc3B1bmtfY29uZmlnX3RhYmxlLAoJZmlyc3RfYnVzbm86IDB4MDAsCglsYXN0X2J1c25vOiAweGZmLAp9OwoKdm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQp7CglwY2lfc2M1MjBfaW5pdCgmc2M1MjBfc3B1bmtfaG9zZSk7Cn0KCgovKiBzZXQgdXAgdGhlIElTQSBidXMgdGltaW5nIGFuZCBzeXN0ZW0gYWRkcmVzcyBtYXBwaW5ncyAqLwpzdGF0aWMgdm9pZCBidXNfaW5pdCh2b2lkKQp7CgkvKiB2ZXJzaW9ucwoJICogMCAgIEh5Z2xvIHZlcnNpb25zIDAuOTUgYW5kIDAuOTYgKGxhcmdlIGJhb3JkcykKCSAqID8/ICBIeWdsbyB2ZXJzaW9uIDAuOTcgKHNtYWxsIGJvYXJkKQoJICogMTAgIFNwdW5rIGJvYXJkCgkgKi8KCWludCB2ZXJzaW9uID0gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1lTSU5GTyk7CgoJaWYgKHZlcnNpb24pIHsKCQkvKiBzZXQgdXAgdGhlIEdQIElPIHBpbnMgKGZvciB0aGUgU3B1bmsgYm9hcmQpICovCgkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1BGUzMxXzE2LCAweGZmZjApOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDMxLTE2IHJlZyAqLwoJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMxNV8wLCAgMHgwMDBmKTsJLyogc2V0IHRoZSBHUElPIHBpbiBmdW5jdGlvbiAxNS0wIHJlZyAqLwoJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9ESVIzMV8xNiwgMHgwMDBmKTsJLyogc2V0IHRoZSBHUElPIGRpcmVjdGlvbiAzMS0xNiByZWcgKi8KCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPRElSMTVfMCwgIDB4MWZmMCk7CS8qIHNldCB0aGUgR1BJTyBkaXJlY3Rpb24gMTUtMCByZWcgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1NQRlMsIDB4YzApOwkJLyogc2V0IHRoZSBDUyBwaW4gZnVuY3Rpb24gcmVnICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NMS1NFTCwgMHg3MCk7CgoJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9DTFIzMV8xNiwgMHgwMDAzKTsgICAgIC8qIHJlc2V0IFNTSSBjaGlwLXNlbGVjdHMgKi8KCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPU0VUMzFfMTYsIDB4MDAwYyk7CgoJfSBlbHNlIHsKCQkvKiBzZXQgdXAgdGhlIEdQIElPIHBpbnMgKGZvciB0aGUgSHlnbG8gYm9hcmQpICovCgkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1BGUzMxXzE2LCAweGZmYzApOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDMxLTE2IHJlZyAqLwoJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMxNV8wLCAweDFlN2YpOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDE1LTAgcmVnICovCgkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT0RJUjMxXzE2LCAweDAwM2YpOwkvKiBzZXQgdGhlIEdQSU8gZGlyZWN0aW9uIDMxLTE2IHJlZyAqLwoJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9ESVIxNV8wLCAweGUxODApOwkvKiBzZXQgdGhlIEdQSU8gZGlyZWN0aW9uIDE1LTAgcmVnICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NTUEZTLCAweDAwKTsJCS8qIHNldCB0aGUgQ1MgcGluIGZ1bmN0aW9uIHJlZyAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DTEtTRUwsIDB4NzApOwoKCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPQ0xSMTVfMCwgMHgwMTgwKTsgICAgICAvKiByZXNldCBTU0kgY2hpcC1zZWxlY3RzICovCgl9CgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQQ1NSVCwgMSk7ICAgLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUFcsIDMpOyAgIC8qIHNldCB0aGUgR1AgQ1MgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTT0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRFcsIDMpOyAgICAvKiBzZXQgdGhlIFJEIHB1bHNlIHdpZHRoICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRE9GRiwgMSk7ICAvKiBzZXQgdGhlIEdQIFJEIG9mZnNldCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JXLCAzKTsgICAgLyogc2V0IHRoZSBHUCBXUiBwdWxzZSB3aWR0aCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBXUiBvZmZzZXQgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfQk9PVENTQ1RMLCAweDA0MDcpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBCT09UQ1MgKi8KCgkvKiBhZGp1c3QgdGhlIG1lbW9yeSBtYXA6CgkgKiBieSBkZWZhdWx0IHRoZSBmaXJzdCAyNTZNQiAoMHgwMDAwMDAwMCAtIDB4MGZmZmZmZmYpIGlzIG1hcHBlZCB0byBTRFJBTQoJICogYW5kIDI1Nk1CIHRvIDFHLTEyOGsgICgweDEwMDAwMDAgLSAweDM3ZmZmZmZmKSBpcyBtYXBwZWQgdG8gUENJIG1taW8KCSAqIHdlIG5lZWQgdG8gbWFwIDFHLTEyOGsgLSAxRyAoMHgzODAwMDAwMCAtIDB4M2ZmZmZmZmYpIHRvIENTMSAqLwoKCgkvKiBib290Y3MgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMiwgMHg4YmZmZTgwMCk7CgoJLyogSURFMCA9IEdQQ1M2IDFmMC0xZjcgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIzLCAgMHgzODA4MDFmMCk7CgoJLyogSURFMSA9IEdQQ1M3IDNmNiAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjQsICAweDNjMDAwM2Y2KTsKCglhc20gKCJ3YmludmRcbiIpOyAvKiBGbHVzaCBjYWNoZSwgcmVxLiBhZnRlciBzZXR0aW5nIHRoZSB1bmNoYWNoZWQgYXR0cmlidXRlIG9uYSBQQVIgKi8KCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCByZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpICYgfihVQVJUMl9ESVN8VUFSVDFfRElTKSk7Cgp9CgoKLyogcGFyIHVzYWdlOgogKiBQQVIwICAgKGxlZ2FjeV92aWRlbykKICogUEFSMSAgIChQQ0kgUk9NIG1hcHBpbmcpCiAqIFBBUjIKICogUEFSMyAgIElERQogKiBQQVI0ICAgSURFCiAqIFBBUjUgICAobGVnYWN5X3ZpZGVvKQogKiBQQVI2CiAqIFBBUjcgICAobGVnYWN5X3ZpZGVvKQogKiBQQVI4ICAgKGxlZ2FjeV92aWRlbykKICogUEFSOSAgIChsZWdhY3lfdmlkZW8pCiAqIFBBUjEwCiAqIFBBUjExICAoSVNBUk9NKQogKiBQQVIxMiAgQk9PVENTCiAqIFBBUjEzCiAqIFBBUjE0CiAqIFBBUjE1CiAqLwoKLyoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFwIGEgY2h1bmsgb2Ygc2l6ZSBieXRlcwogKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIElTQSBidXMKICoKICogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBtZW1vcnkgYWRkcmVzcwogKiBhcyBzZWVuIGJ5IHRoZSBob3N0ICh3aGljaCBtYXkgdmVyeSB3aWxsIGJlIHRoZQogKiBzYW1lIGFzIHRoZSBidXMgYWRkcmVzcykKICovCnUzMiBpc2FfbWFwX3JvbSh1MzIgYnVzX2FkZHIsIGludCBzaXplKQp7Cgl1MzIgcGFyOwoKCXByaW50ZigiaXNhX21hcF9yb20gYXNrZWQgdG8gbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAoJICAgICAgIHNpemUsIGJ1c19hZGRyKTsKCglwYXIgPSBzaXplOwoJaWYgKHBhciA8IDB4ODAwMDApIHsKCQlwYXIgPSAweDgwMDAwOwoJfQoJcGFyID4+PSAxMjsKCXBhci0tOwoJcGFyJj0weDdmOwoJcGFyIDw8PSAxODsKCXBhciB8PSAoYnVzX2FkZHI+PjEyKTsKCXBhciB8PSAweDUwMDAwMDAwOwoKCXByaW50ZiAoInNldHRpbmcgUEFSMTEgdG8gJXhcbiIsIHBhcik7CgoJLyogTWFwIHJvbSAweDEwMDAwIHdpdGggUEFSMSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjExLCAgcGFyKTsKCglyZXR1cm4gYnVzX2FkZHI7Cn0KCi8qCiAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCiAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKICovCnZvaWQgaXNhX3VubWFwX3JvbSh1MzIgYWRkcikKewoJcHJpbnRmKCJpc2FfdW5tYXBfcm9tIGFza2VkIHRvIHVubWFwICV4IiwgYWRkcik7CglpZiAoKGFkZHI+PjEyKSA9PSAocmVhZF9tbWNyX2xvbmcoU0M1MjBfUEFSMTEpJjB4M2ZmZmYpKSB7CgkJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjExLCAwKTsKCQlwcmludGYoIiBkb25lXG4iKTsKCQlyZXR1cm47Cgl9CglwcmludGYoIiBub3Qgb3Vyc1xuIik7Cn0KCiNpZmRlZiBDT05GSUdfUENJCiNkZWZpbmUgUENJX1JPTV9URU1QX1NQQUNFIDB4MTAwMDAKLyoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFwIGEgY2h1bmsgb2Ygc2l6ZSBieXRlcwogKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIFBDSSBidXMsCiAqIHN1aXRhYmxlIHRvIG1hcCBQQ0kgUk9NUyAoYnVzIGFkZHJlc3MgPCAxNk0pCiAqIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaG9zdCBtZW1vcnkgYWRkcmVzcwogKiB3aGljaCBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSBidXMgYWRkcmVzcwogKiBiZWZvcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFBDSSByb20gYWRkcmVzcwogKiBkZWNvZGVyCiAqLwp1MzIgcGNpX2dldF9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IHNpemUpCnsKCXUzMiBwYXI7CgoJcGFyID0gc2l6ZTsKCWlmIChwYXIgPCAweDgwMDAwKSB7CgkJcGFyID0gMHg4MDAwMDsKCX0KCXBhciA+Pj0gMTY7CglwYXItLTsKCXBhciY9MHg3ZmY7CglwYXIgPDw9IDE0OwoJcGFyIHw9IChQQ0lfUk9NX1RFTVBfU1BBQ0U+PjE2KTsKCXBhciB8PSAweDcyMDAwMDAwOwoKCXByaW50ZiAoInNldHRpbmcgUEFSMSB0byAleFxuIiwgcGFyKTsKCgkvKiBNYXAgcm9tIDB4MTAwMDAgd2l0aCBQQVIxICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMSwgIHBhcik7CgoJcmV0dXJuIFBDSV9ST01fVEVNUF9TUEFDRTsKfQoKLyoKICogdGhpcyBmdW5jdGlvbiByZW1vdmVkIGFueSBtYXBwaW5nIGNyZWF0ZWQKICogd2l0aCBwY2lfZ2V0X3JvbV93aW5kb3coKQogKi8Kdm9pZCBwY2lfcmVtb3ZlX3JvbV93aW5kb3coc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1MzIgYWRkcikKewoJcHJpbnRmKCJwY2lfcmVtb3ZlX3JvbV93aW5kb3c6ICV4IiwgYWRkcik7CglpZiAoYWRkciA9PSBQQ0lfUk9NX1RFTVBfU1BBQ0UpIHsKCQl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMSwgMCk7CgkJcHJpbnRmKCIgZG9uZVxuIik7CgkJcmV0dXJuOwoJfQoJcHJpbnRmKCIgbm90IG91cnNcbiIpOwoKfQoKLyoKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhY2NlcyB0byB0aGUKICogbGVnYWN5IHZpZGVvIEkvTyBwb3J0cyBvbiB0aGUgUENJIGJ1cy4KICogQWZ0ZXIgdGhpcyBmdW5jdGlvbiBhY2Nlc3NlcyB0byBJL08gcG9ydHMgMHgzYjAtMHgzYmIgYW5kCiAqIDB4M2MwLTB4M2RmIHNodWxkIHJlc3VsdCBpbiB0cmFuc2FjdGlvbnMgb24gdGhlIFBDSSBidXMuCiAqCiAqLwppbnQgcGNpX2VuYWJsZV9sZWdhY3lfdmlkZW9fcG9ydHMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQp7CgkvKiBNYXAgdmlkZW8gbWVtb3J5IHRvIDB4YTAwMDAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjAsICAweDcyMDA0MDBhKTsKCgkvKiBmb3J3YXJkIGFsbCBJL08gYWNjZXNzZXMgdG8gUENJICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLAoJCQlyZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpIHwgSU9fSE9MRV9ERVNUX1BDSSk7CgoKCS8qIHNvIHdlIG1hcCBhd2F5IGFsbCBpbyBwb3J0cyB0byBwY2kgKG9ubHkgd2F5IHRvIGFjY2VzcyBwY2kgaW8KCSAqIGJlbG93IDB4NDAwLiBCdXQgdGhlbiB3ZSBoYXZlIHRvIG1hcCBiYWNrIHRoZSBwb3J0aW9ucyB0aGF0IHdlIGRvbnQKCSAqIHVzZSBzbyB0aGF0IHRoZSBnZW5lcmF0ZSBjeWNsZXMgb24gdGhlIEdQSU8gYnVzIHdoZXJlIHRoZSBzaW8gYW5kCgkgKiBJU0Egc2xvdHMgYXJlIGNvbm5lY3RlZCwgdGhpcyByZXF1cmUgdGhlIHVzZSBvZiBzZXZlcmFsIFBBUiByZWdpc3RlcnMKCSAqLwoKCS8qIGJyaW5nIDB4MTAwIC0gMHgyZjcgYmFjayB0byBJU0EgdXNpbmcgUEFSNSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjUsIDB4MzFmNzAxMDApOwoKCS8qIGNvbTIgdXNlIDJmOC0yZmYgKi8KCgkvKiBicmluZyAweDMwMCAtIDB4M2FmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjcgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI3LCAweDMwYWYwMzAwKTsKCgkvKiB2Z2EgdXNlIDNiMC0zYmIgKi8KCgkvKiBicmluZyAweDNiYyAtIDB4M2JmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjggKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI4LCAweDMwMDMwM2JjKTsKCgkvKiB2Z2EgdXNlIDNjMC0zZGYgKi8KCgkvKiBicmluZyAweDNlMCAtIDB4M2Y3IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjkgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI5LCAweDMwMTcwM2UwKTsKCgkvKiBjb20xIHVzZSAzZjgtM2ZmICovCgoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiBNaXNjZWxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucwogKi8KCmludCBib2FyZF9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjAoKTsKCWJ1c19pbml0KCk7CglpcnFfaW5pdCgpOwoKCS8qIG1heCBkcml2ZSBjdXJyZW50IG9uIFNEUkFNICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfRFNDVEwsIDB4MDEwMCk7CgoJLyogZW50ZXIgZGVidWcgbW9kZSBhZnRlciBuZXh0IHJlc2V0IChvbmx5IGlmIGp1bXBlciBpcyBhbHNvIHNldCkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9SRVNDRkcsIDB4MDgpOwoJLyogY29uZmlndXJlIHRoZSBzb2Z0d2FyZSB0aW1lciB0byAzMy4wMDBNSHogKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TV1RNUkNGRywgMSk7CglnZC0+YnVzX2NsayA9IDMzMDAwMDAwOwoKCXJldHVybiAwOwp9CgppbnQgZHJhbV9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjBfZHJhbSgpOwoJcmV0dXJuIDA7Cn0KCnZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpCnsKCWludCB2ZXJzaW9uID0gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1lTSU5GTyk7CgoJaWYgKHZhbCA8IC0zMikgdmFsID0gLTE7ICAvKiBsZXQgdGhpbmdzIGNvbXBhdGlibGUgKi8KCWlmICh2ZXJzaW9uID09IDApIHsKCQkvKiBQSU8zMS1QSU8xNiBEYXRhICovCgkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT0RBVEEzMV8xNiwKCQkJCShyZWFkX21tY3Jfd29yZChTQzUyMF9QSU9EQVRBMzFfMTYpICYgMHhmZmMwKXwgKCh2YWwmMHg3ZSk+PjEpKTsgLyogMHgxZjggPj4gMyAqLwoKCQkvKiBQSU8wLVBJTzE1IERhdGEgKi8KCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPREFUQTE1XzAsCgkJCQkocmVhZF9tbWNyX3dvcmQoU0M1MjBfUElPREFUQTE1XzApICYgMHgxZmZmKXwgKCh2YWwmMHg3KTw8MTMpKTsKCX0gZWxzZSB7CgkJLyogbmV3ZXIgYm9hcmRzIHVzZSBQSU80LVBJTzEyICovCgkJLyogUElPMC1QSU8xNSBEYXRhICovCiNpZiAwCgkJdmFsID0gKHZhbCAmIDB4MDA3KSB8ICgodmFsICYgMHgwMzgpIDw8IDMpIHwgKCh2YWwgJiAweDFjMCkgPj4gMyk7CiNlbHNlCgkJdmFsID0gKHZhbCAmIDB4MDA3KSB8ICgodmFsICYgMHgwN2UpIDw8IDIpOwojZW5kaWYKCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPREFUQTE1XzAsCgkJCQkocmVhZF9tbWNyX3dvcmQoU0M1MjBfUElPREFUQTE1XzApICYgMHhlMDBmKSB8ICgodmFsJjB4MDFmZik8PDQpKTsKCX0KfQoKCmludCBsYXN0X3N0YWdlX2luaXQodm9pZCkKewoKCWludCB2ZXJzaW9uID0gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1lTSU5GTyk7CgoJcHJpbnRmKCJPbWljcm9uIENldGkgU0M1MjAgU3B1bmsgcmV2aXNpb24gJXhcbiIsIHZlcnNpb24pOwoKI2lmIDAKCWlmICh2ZXJzaW9uKSB7CgkJaW50IHgsIHk7CgoJCXByaW50ZigiZWVwcm9tIHByb2JlICVkXG4iLCBzcGlfZWVwcm9tX3Byb2JlKDEpKTsKCgkJc3BpX2VlcHJvbV9yZWFkKDEsIDAsICh1OCopJngsIDIpOwoJCXNwaV9lZXByb21fcmVhZCgxLCAxLCAodTgqKSZ5LCAyKTsKCQlwcmludGYoImVlcHJvbSBieXRlcyAlMDR4JTA0eFxuIiwgeCwgeSk7CgkJeCBePSAweGZmZmY7CgkJeSBePSAweGZmZmY7CgkJc3BpX2VlcHJvbV93cml0ZSgxLCAwLCAodTgqKSZ4LCAyKTsKCQlzcGlfZWVwcm9tX3dyaXRlKDEsIDEsICh1OCopJnksIDIpOwoKCQlzcGlfZWVwcm9tX3JlYWQoMSwgMCwgKHU4KikmeCwgMik7CgkJc3BpX2VlcHJvbV9yZWFkKDEsIDEsICh1OCopJnksIDIpOwoJCXByaW50ZigiZWVwcm9tIGJ5dGVzICUwNHglMDR4XG4iLCB4LCB5KTsKCgl9IGVsc2UgewoJCWludCB4LCB5OwoKCQlwcmludGYoImVlcHJvbSBwcm9iZSAlZFxuIiwgbXdfZWVwcm9tX3Byb2JlKDEpKTsKCgkJbXdfZWVwcm9tX3JlYWQoMSwgMCwgKHU4KikmeCwgMik7CgkJbXdfZWVwcm9tX3JlYWQoMSwgMSwgKHU4KikmeSwgMik7CgkJcHJpbnRmKCJlZXByb20gYnl0ZXMgJTA0eCUwNHhcbiIsIHgsIHkpOwoKCQl4IF49IDB4ZmZmZjsKCQl5IF49IDB4ZmZmZjsKCQltd19lZXByb21fd3JpdGUoMSwgMCwgKHU4KikmeCwgMik7CgkJbXdfZWVwcm9tX3dyaXRlKDEsIDEsICh1OCopJnksIDIpOwoKCQltd19lZXByb21fcmVhZCgxLCAwLCAodTgqKSZ4LCAyKTsKCQltd19lZXByb21fcmVhZCgxLCAxLCAodTgqKSZ5LCAyKTsKCQlwcmludGYoImVlcHJvbSBieXRlcyAlMDR4JTA0eFxuIiwgeCwgeSk7CgoKCX0KI2VuZGlmCgoJZHMxNzIyX3Byb2JlKDIpOwoKCXJldHVybiAwOwp9Cgp2b2lkIHNzaV9jaGlwX3NlbGVjdChpbnQgZGV2KQp7CglpbnQgdmVyc2lvbiA9IHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NZU0lORk8pOwoKCWlmICh2ZXJzaW9uKSB7CgkJLyogU3B1bmsgYm9hcmQ6IEVFUFJPTSBhbmQgQ0FOIGFyZSBhY3RvdmUtbG93LCBURU1QIGFuZCBBVVggYXJlIGFjdGl2ZSBoaWdoICovCgkJc3dpdGNoIChkZXYpIHsKCQljYXNlIDE6IC8qIEVFUFJPTSAqLwoJCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPQ0xSMzFfMTYsIDB4MDAwNCk7CgkJCWJyZWFrOwoKCQljYXNlIDI6IC8qIFRlbXAgUHJvYmUgKi8KCQkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1NFVDMxXzE2LCAweDAwMDIpOwoJCQlicmVhazsKCgkJY2FzZSAzOiAvKiBDQU4gKi8KCQkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT0NMUjMxXzE2LCAweDAwMDgpOwoJCQlicmVhazsKCgkJY2FzZSA0OiAvKiBBVVggKi8KCQkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1NFVDMxXzE2LCAweDAwMDEpOwoJCQlicmVhazsKCgkJY2FzZSAwOgoJCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPQ0xSMzFfMTYsIDB4MDAwMyk7CgkJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9TRVQzMV8xNiwgMHgwMDBjKTsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCXByaW50ZigiSWxsZWdhbCBTU0kgZGV2aWNlIHJlcXVlc3RlZDogJWRcbiIsIGRldik7CgkJfQoJfSBlbHNlIHsKCgkJLyogR2xvYm94IGJvYXJkOiBCb3RoIEVFUFJPTSBhbmQgVEVNUCBhcmUgYWN0aXZlLWhpZ2ggKi8KCgkJc3dpdGNoIChkZXYpIHsKCQljYXNlIDE6IC8qIEVFUFJPTSAqLwoJCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPU0VUMTVfMCwgMHgwMTAwKTsKCQkJYnJlYWs7CgoJCWNhc2UgMjogLyogVGVtcCBQcm9iZSAqLwoJCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPU0VUMTVfMCwgMHgwMDgwKTsKCQkJYnJlYWs7CgoJCWNhc2UgMDoKCQkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT0NMUjE1XzAsIDB4MDE4MCk7CgkJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCQlwcmludGYoIklsbGVnYWwgU1NJIGRldmljZSByZXF1ZXN0ZWQ6ICVkXG4iLCBkZXYpOwoJCX0KCX0KfQoKCnZvaWQgc3BpX2luaXRfZih2b2lkKQp7CglyZWFkX21tY3JfYnl0ZShTQzUyMF9TWVNJTkZPKSA/CgkJc3BpX2VlcHJvbV9wcm9iZSgxKSA6Cgltd19lZXByb21fcHJvYmUoMSk7Cgp9Cgpzc2l6ZV90IHNwaV9yZWFkKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IG9mZnNldDsKCWludCBpOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKCXJldHVybglyZWFkX21tY3JfYnl0ZShTQzUyMF9TWVNJTkZPKSA/CgkJc3BpX2VlcHJvbV9yZWFkKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pIDoKCW13X2VlcHJvbV9yZWFkKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwp9Cgpzc2l6ZV90IHNwaV93cml0ZSh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCglvZmZzZXQgPSAwOwoJZm9yIChpPTA7aTxhbGVuO2krKykgewoJCW9mZnNldCA8PD0gODsKCQlvZmZzZXQgfD0gYWRkcltpXTsKCX0KCglyZXR1cm4JcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1lTSU5GTykgPwoJCXNwaV9lZXByb21fd3JpdGUoMSwgb2Zmc2V0LCBidWZmZXIsIGxlbikgOgoJbXdfZWVwcm9tX3dyaXRlKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwp9CgppbnQgYm9hcmRfZXRoX2luaXQoYmRfdCAqYmlzKQp7CglyZXR1cm4gcGNpX2V0aF9pbml0KGJpcyk7Cn0K