LyoKICogIGxpbnV4L2ZzL2JpbmZtdF9lbTg2LmMKICoKICogIEJhc2VkIG9uIGxpbnV4L2ZzL2JpbmZtdF9zY3JpcHQuYwogKiAgQ29weXJpZ2h0IChDKSAxOTk2ICBNYXJ0aW4gdm9uIEz2d2lzCiAqICBvcmlnaW5hbCAjIS1jaGVja2luZyBpbXBsZW1lbnRlZCBieSB0eXRzby4KICoKICogIGVtODYgY2hhbmdlcyBDb3B5cmlnaHQgKEMpIDE5OTcgIEppbSBQYXJhZGlzCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9sb2Nrcy5oPgojaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvZmlsZS5oPgoKCiNkZWZpbmUgRU04Nl9JTlRFUlAJIi91c3IvYmluL2VtODYiCiNkZWZpbmUgRU04Nl9JX05BTUUJImVtODYiCgpzdGF0aWMgaW50IGxvYWRfZW04NihzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7CgljaGFyICppbnRlcnAsICppX25hbWUsICppX2FyZzsKCXN0cnVjdCBmaWxlICogZmlsZTsKCWludCByZXR2YWw7CglzdHJ1Y3QgZWxmaGRyCWVsZl9leDsKCgkvKiBNYWtlIHN1cmUgdGhpcyBpcyBhIExpbnV4L0ludGVsIEVMRiBleGVjdXRhYmxlLi4uICovCgllbGZfZXggPSAqKChzdHJ1Y3QgZWxmaGRyICopYnBybS0+YnVmKTsKCglpZiAobWVtY21wKGVsZl9leC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCgkJcmV0dXJuICAtRU5PRVhFQzsKCgkvKiBGaXJzdCBvZiBhbGwsIHNvbWUgc2ltcGxlIGNvbnNpc3RlbmN5IGNoZWNrcyAqLwoJaWYgKChlbGZfZXguZV90eXBlICE9IEVUX0VYRUMgJiYgZWxmX2V4LmVfdHlwZSAhPSBFVF9EWU4pIHx8CgkJKCEoKGVsZl9leC5lX21hY2hpbmUgPT0gRU1fMzg2KSB8fCAoZWxmX2V4LmVfbWFjaGluZSA9PSBFTV80ODYpKSkgfHwKCQkoIWJwcm0tPmZpbGUtPmZfb3AgfHwgIWJwcm0tPmZpbGUtPmZfb3AtPm1tYXApKSB7CgkJCXJldHVybiAtRU5PRVhFQzsKCX0KCglicHJtLT5zaF9iYW5nKys7CS8qIFdlbGwsIHRoZSBiYW5nLXNoZWxsIGlzIGltcGxpY2l0Li4uICovCglhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CglmcHV0KGJwcm0tPmZpbGUpOwoJYnBybS0+ZmlsZSA9IE5VTEw7CgoJLyogVW5saWtlIGluIHRoZSBzY3JpcHQgY2FzZSwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgaGFpcnkKCSAqIHBhcnNpbmcgdG8gZmluZCBvdXIgaW50ZXJwcmV0ZXIuLi4gaXQncyBoYXJkY29kZWQhCgkgKi8KCWludGVycCA9IEVNODZfSU5URVJQOwoJaV9uYW1lID0gRU04Nl9JX05BTUU7CglpX2FyZyA9IE5VTEw7CQkvKiBXZSByZXNlcnZlIHRoZSByaWdodCB0byBhZGQgYW4gYXJnIGxhdGVyICovCgoJLyoKCSAqIFNwbGljZSBpbiAoMSkgdGhlIGludGVycHJldGVyJ3MgbmFtZSBmb3IgYXJndlswXQoJICogICAgICAgICAgICgyKSAob3B0aW9uYWwpIGFyZ3VtZW50IHRvIGludGVycHJldGVyCgkgKiAgICAgICAgICAgKDMpIGZpbGVuYW1lIG9mIGVtdWxhdGVkIGZpbGUgKHJlcGxhY2UgYXJndlswXSkKCSAqCgkgKiBUaGlzIGlzIGRvbmUgaW4gcmV2ZXJzZSBvcmRlciwgYmVjYXVzZSBvZiBob3cgdGhlCgkgKiB1c2VyIGVudmlyb25tZW50IGFuZCBhcmd1bWVudHMgYXJlIHN0b3JlZC4KCSAqLwoJcmVtb3ZlX2FyZ196ZXJvKGJwcm0pOwoJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmYnBybS0+ZmlsZW5hbWUsIGJwcm0pOwoJaWYgKHJldHZhbCA8IDApIHJldHVybiByZXR2YWw7IAoJYnBybS0+YXJnYysrOwoJaWYgKGlfYXJnKSB7CgkJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmaV9hcmcsIGJwcm0pOwoJCWlmIChyZXR2YWwgPCAwKSByZXR1cm4gcmV0dmFsOyAKCQlicHJtLT5hcmdjKys7Cgl9CglyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZpX25hbWUsIGJwcm0pOwoJaWYgKHJldHZhbCA8IDApCXJldHVybiByZXR2YWw7CglicHJtLT5hcmdjKys7CgoJLyoKCSAqIE9LLCBub3cgcmVzdGFydCB0aGUgcHJvY2VzcyB3aXRoIHRoZSBpbnRlcnByZXRlcidzIGlub2RlLgoJICogTm90ZSB0aGF0IHdlIHVzZSBvcGVuX2V4ZWMoKSBhcyB0aGUgbmFtZSBpcyBub3cgaW4ga2VybmVsCgkgKiBzcGFjZSwgYW5kIHdlIGRvbid0IG5lZWQgdG8gY29weSBpdC4KCSAqLwoJZmlsZSA9IG9wZW5fZXhlYyhpbnRlcnApOwoJaWYgKElTX0VSUihmaWxlKSkKCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKCglicHJtLT5maWxlID0gZmlsZTsKCglyZXR2YWwgPSBwcmVwYXJlX2JpbnBybShicHJtKTsKCWlmIChyZXR2YWwgPCAwKQoJCXJldHVybiByZXR2YWw7CgoJcmV0dXJuIHNlYXJjaF9iaW5hcnlfaGFuZGxlcihicHJtLCByZWdzKTsKfQoKc3RydWN0IGxpbnV4X2JpbmZtdCBlbTg2X2Zvcm1hdCA9IHsKCU5VTEwsIFRISVNfTU9EVUxFLCBsb2FkX2VtODYsIE5VTEwsIE5VTEwsIDAKfTsKCnN0YXRpYyBpbnQgX19pbml0IGluaXRfZW04Nl9iaW5mbXQodm9pZCkKewoJcmV0dXJuIHJlZ2lzdGVyX2JpbmZtdCgmZW04Nl9mb3JtYXQpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9lbTg2X2JpbmZtdCh2b2lkKQp7Cgl1bnJlZ2lzdGVyX2JpbmZtdCgmZW04Nl9mb3JtYXQpOwp9Cgptb2R1bGVfaW5pdChpbml0X2VtODZfYmluZm10KQptb2R1bGVfZXhpdChleGl0X2VtODZfYmluZm10KQpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==