LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIJT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8YXNtL2dsb2JhbF9kYXRhLmg+CiNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CgoKLnNlY3Rpb24gLnRleHQKLmNvZGUzMgouZ2xvYmwgX3N0YXJ0Ci50eXBlIF9zdGFydCwgQGZ1bmN0aW9uCi5nbG9ibCBfaTM4NmJvb3Rfc3RhcnQKX2kzODZib290X3N0YXJ0OgoJLyoKCSAqIFRoaXMgaXMgdGhlIGZhaWwgc2FmZSAzMi1iaXQgYm9vdHN0cmFwIGVudHJ5IHBvaW50LiBUaGUKCSAqIGZvbGxvd2luZyBjb2RlIGlzIG5vdCBleGVjdXRlZCBmcm9tIGEgY29sZC1yZXNldCAoYWN0dWFsbHksIGEKCSAqIGxvdCBvZiBpdCBpcywgYnV0IGZyb20gcmVhbC1tb2RlIGFmdGVyIGNvbGQgcmVzZXQuIEl0IGlzCgkgKiByZXBlYXRlZCBoZXJlIHRvIHB1dCB0aGUgYm9hcmQgaW50byBhIHN0YXRlIGFzIGNsb3NlIHRvIGNvbGQKCSAqIHJlc2V0IGFzIG5lY2Vzc2FyeSkKCSAqLwoJY2xpCgljbGQKCgkvKiBUdXJuIG9mIGNhY2hlICh0aGlzIG1pZ2h0IHJlcXVpcmUgYSA0ODYtY2xhc3MgQ1BVKSAqLwoJbW92bAklY3IwLCAlZWF4CglvcmwJJChYODZfQ1IwX05XIHwgWDg2X0NSMF9DRCksICVlYXgKCW1vdmwJJWVheCwgJWNyMAoJd2JpbnZkCgoJLyogVGVsbCAzMi1iaXQgY29kZSBpdCBpcyBiZWluZyBlbnRlcmVkIGZyb20gYW4gaW4tUkFNIGNvcHkgKi8KCW1vdncJJEdEX0ZMR19XQVJNX0JPT1QsICVieApfc3RhcnQ6CgkvKiBUaGlzIGlzIHRoZSAzMi1iaXQgY29sZC1yZXNldCBlbnRyeSBwb2ludCAqLwoKCW1vdmwJJDB4MTgsICVlYXgJLyogTG9hZCBvdXIgc2VnZW1lbnQgcmVnaXN0ZXMsIHRoZQoJCQkJICogZ2R0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZCBieSBzdGFydDE2LlMgKi8KCW1vdncJJWF4LCAlZnMKCW1vdncJJWF4LCAlZHMKCW1vdncJJWF4LCAlZ3MKCW1vdncJJWF4LCAlZXMKCW1vdncJJWF4LCAlc3MKCgkvKiBDbGVhciB0aGUgaW50ZXJ1cHQgdmVjdG9ycyAqLwoJbGlkdAlibGFua19pZHRfcHRyCgoJLyogRWFybHkgcGxhdGZvcm0gaW5pdCAoc2V0dXAgZ3BpbywgZXRjICkgKi8KCWptcAllYXJseV9ib2FyZF9pbml0Ci5nbG9ibCBlYXJseV9ib2FyZF9pbml0X3JldAplYXJseV9ib2FyZF9pbml0X3JldDoKCgkvKiBTa2lwIG1lbW9yeSBpbml0aWFsaXphdGlvbiBpZiBub3Qgc3RhcnRpbmcgZnJvbSBjb2xkLXJlc2V0ICovCgltb3ZsCSVlYngsICVlY3gKCWFuZGwJJEdEX0ZMR19DT0xEX0JPT1QsICVlY3gKCWp6CXNraXBfbWVtX2luaXQKCgkvKiBzaXplIG1lbW9yeSAqLwoJam1wCW1lbV9pbml0Ci5nbG9ibCBtZW1faW5pdF9yZXQKbWVtX2luaXRfcmV0OgoKc2tpcF9tZW1faW5pdDoKCS8qIGZldGNoIG1lbW9yeSBzaXplIChpbnRvICVlYXgpICovCglqbXAJZ2V0X21lbV9zaXplCi5nbG9ibCBnZXRfbWVtX3NpemVfcmV0CmdldF9tZW1fc2l6ZV9yZXQ6CgojaWYgQ09ORklHX1NZU19TRFJBTV9FQ0NfRU5BQkxFCgkvKiBTa2lwIEVDQyBpbml0aWFsaXphdGlvbiBpZiBub3Qgc3RhcnRpbmcgZnJvbSBjb2xkLXJlc2V0ICovCgltb3ZsCSVlYngsICVlY3gKCWFuZGwJJEdEX0ZMR19DT0xEX0JPT1QsICVlY3gKCWp6CWluaXRfZWNjX3JldAoJam1wCWluaXRfZWNjCgouZ2xvYmwgaW5pdF9lY2NfcmV0CmluaXRfZWNjX3JldDoKI2VuZGlmCgoJLyogQ2hlY2sgd2UgaGF2ZSBlbm91Z2ggbWVtb3J5IGZvciBzdGFjayAqLwoJbW92bAkkQ09ORklHX1NZU19TVEFDS19TSVpFLCAlZWN4CgljbXBsCSVlY3gsICVlYXgKCWpiCWRpZQptZW1fb2s6CgkvKiBTZXQgc3RhY2sgcG9pbnRlciB0byB1cHBlciBtZW1vcnkgbGltaXQqLwoJbW92bAklZWF4LCAlZXNwCgoJLyogVGVzdCB0aGUgc3RhY2sgKi8KCXB1c2hsCSQwCglwb3BsCSVlY3gKCWNtcGwJJDAsICVlY3gKCWpuZQlkaWUKCXB1c2gJJDB4NTVhYTU1YWEKCXBvcGwJJWVjeAoJY21wbAkkMHg1NWFhNTVhYSwgJWVjeAoJam5lCWRpZQoKCXdiaW52ZAoKCS8qIERldGVybWluZSBvdXIgbG9hZCBvZmZzZXQgKi8KCWNhbGwJMWYKMToJcG9wbAklZWN4CglzdWJsCSQxYiwgJWVjeAoKCS8qIFNldCB0aGUgdXBwZXIgbWVtb3J5IGxpbWl0IHBhcmFtZXRlciAqLwoJc3VibAkkQ09ORklHX1NZU19TVEFDS19TSVpFLCAlZWF4CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgZ2xvYmFsIGRhdGEgKi8KCXN1YmwJJChHRF9TSVpFICogNCksICVlYXgKCgkvKiAlZWF4IHBvaW50cyB0byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlICovCgltb3ZsCSVlc3AsIChHRF9SQU1fU0laRSAqIDQpKCVlYXgpCgltb3ZsCSVlYngsIChHRF9GTEFHUyAqIDQpKCVlYXgpCgltb3ZsCSVlY3gsIChHRF9MT0FEX09GRiAqIDQpKCVlYXgpCgoJY2FsbAlib2FyZF9pbml0X2YJLyogRW50ZXIsIFUtYm9vdCEgKi8KCgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODUsICVheApkaWU6CWhsdAoJam1wCWRpZQoJaGx0CgpibGFua19pZHRfcHRyOgoJLndvcmQJMAkJLyogbGltaXQgKi8KCS5sb25nCTAJCS8qIGJhc2UgKi8K