LyoKICogJElkOiBkYm94Mi1mbGFzaC5jLHYgMS4xNCAyMDA1LzExLzA3IDExOjE0OjI2IGdsZWl4bmVyIEV4cCAkCiAqCiAqIEQtQm94IDIgZmxhc2ggZHJpdmVyCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgoKLyogcGFydGl0aW9uX2luZm8gZ2l2ZXMgZGV0YWlscyBvbiB0aGUgbG9naWNhbCBwYXJ0aXRpb25zIHRoYXQgdGhlIHNwbGl0IHRoZQogKiBzaW5nbGUgZmxhc2ggZGV2aWNlIGludG8uIElmIHRoZSBzaXplIGlmIHplcm8gd2UgdXNlIHVwIHRvIHRoZSBlbmQgb2YgdGhlCiAqIGRldmljZS4gKi8Kc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW109IHsKCXsKCS5uYW1lCQk9ICJCUiBib290bG9hZGVyIiwKCS5zaXplCQk9IDEyOCAqIDEwMjQsCgkub2Zmc2V0CQk9IDAsCgkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUKCX0sCgl7CgkubmFtZQkJPSAiRkxGUyAoVS1Cb290KSIsCgkuc2l6ZQkJPSAxMjggKiAxMDI0LAoJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCgkubWFza19mbGFncwk9IDAKCX0sCgl7CgkubmFtZQkJPSAiUm9vdCAoU3F1YXNoRlMpIiwKCS5zaXplCQk9IDcwNDAgKiAxMDI0LAoJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCgkubWFza19mbGFncwk9IDAKCX0sCgl7CgkubmFtZQkJPSAidmFyIChKRkZTMikiLAoJLnNpemUJCT0gODk2ICogMTAyNCwKCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAoJLm1hc2tfZmxhZ3MJPSAwCgl9LAoJewoJLm5hbWUJCT0gIkZsYXNoIHdpdGhvdXQgYm9vdGxvYWRlciIsCgkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAoJLm9mZnNldAkJPSAxMjggKiAxMDI0LAoJLm1hc2tfZmxhZ3MJPSAwCgl9LAoJewoJLm5hbWUJCT0gIkNvbXBsZXRlIEZsYXNoIiwKCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCgkub2Zmc2V0CQk9IDAsCgkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUKCX0KfTsKCiNkZWZpbmUgTlVNX1BBUlRJVElPTlMgKHNpemVvZihwYXJ0aXRpb25faW5mbykgLyBzaXplb2YocGFydGl0aW9uX2luZm9bMF0pKQoKI2RlZmluZSBXSU5ET1dfQUREUiAweDEwMDAwMDAwCiNkZWZpbmUgV0lORE9XX1NJWkUgMHg4MDAwMDAKCnN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm15bXRkOwoKCnN0cnVjdCBtYXBfaW5mbyBkYm94Ml9mbGFzaF9tYXAgPSB7CgkubmFtZQkJPSAiRC1Cb3ggMiBmbGFzaCBtZW1vcnkiLAoJLnNpemUJCT0gV0lORE9XX1NJWkUsCgkuYmFua3dpZHRoCT0gNCwKCS5waHlzCQk9IFdJTkRPV19BRERSLAp9OwoKaW50IF9faW5pdCBpbml0X2Rib3gyX2ZsYXNoKHZvaWQpCnsKICAgICAgIAlwcmludGsoS0VSTl9OT1RJQ0UgIkQtQm94IDIgZmxhc2ggZHJpdmVyIChzaXplLT4weCVYIG1lbS0+MHglWClcbiIsIFdJTkRPV19TSVpFLCBXSU5ET1dfQUREUik7CglkYm94Ml9mbGFzaF9tYXAudmlydCA9IGlvcmVtYXAoV0lORE9XX0FERFIsIFdJTkRPV19TSVpFKTsKCglpZiAoIWRib3gyX2ZsYXNoX21hcC52aXJ0KSB7CgkJcHJpbnRrKCJGYWlsZWQgdG8gaW9yZW1hcFxuIik7CgkJcmV0dXJuIC1FSU87Cgl9CglzaW1wbGVfbWFwX2luaXQoJmRib3gyX2ZsYXNoX21hcCk7CgoJLy8gUHJvYmUgZm9yIGR1YWwgSW50ZWwgMjhGMzIwIG9yIGR1YWwgQU1ECglteW10ZCA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgJmRib3gyX2ZsYXNoX21hcCk7CglpZiAoIW15bXRkKSB7CgkgICAgLy8gUHJvYmUgZm9yIHNpbmdsZSBJbnRlbCAyOEY2NDAKCSAgICBkYm94Ml9mbGFzaF9tYXAuYmFua3dpZHRoID0gMjsKCgkgICAgbXltdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZkYm94Ml9mbGFzaF9tYXApOwoJfQoKCWlmIChteW10ZCkgewoJCW15bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwoKICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBNVEQgZGV2aWNlcyBmb3IgZWFjaCBwYXJ0aXRpb24uICovCgkgICAgICAgIGFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydGl0aW9uX2luZm8sIE5VTV9QQVJUSVRJT05TKTsKCgkJcmV0dXJuIDA7Cgl9CgoJaW91bm1hcCgodm9pZCAqKWRib3gyX2ZsYXNoX21hcC52aXJ0KTsKCXJldHVybiAtRU5YSU87Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2Rib3gyX2ZsYXNoKHZvaWQpCnsKCWlmIChteW10ZCkgewoJCWRlbF9tdGRfcGFydGl0aW9ucyhteW10ZCk7CgkJbWFwX2Rlc3Ryb3kobXltdGQpOwoJfQoJaWYgKGRib3gyX2ZsYXNoX21hcC52aXJ0KSB7CgkJaW91bm1hcCgodm9pZCAqKWRib3gyX2ZsYXNoX21hcC52aXJ0KTsKCQlkYm94Ml9mbGFzaF9tYXAudmlydCA9IDA7Cgl9Cn0KCm1vZHVsZV9pbml0KGluaXRfZGJveDJfZmxhc2gpOwptb2R1bGVfZXhpdChjbGVhbnVwX2Rib3gyX2ZsYXNoKTsKCgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIkvhcmkgRGF27fBzc29uIDxrZEBmbGFnYS5pcz4sIEJhc3RpYW4gQmxhbmsgPHdhbGRpQHR1eGJveC5vcmc+LCBBbGV4YW5kZXIgV2lsZCA8d2lsZEB0ZS1lbGVrdHJvbmlrLmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgbWFwIGRyaXZlciBmb3IgRC1Cb3ggMiBib2FyZCIpOwo=