LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAkSWQ6IGxwYzE4eHhfZW1jLmMgODc2NSAyMDExLTEyLTA4IDAwOjUxOjIxWiBueHAyMTM0NiAkCQlscGMxOHh4X2VtYy5jCQkyMDExLTEyLTA3CiovLyoqCiogQGZpbGUJCWxwYzE4eHhfZW1jLmMKKiBAYnJpZWYJQ29udGFpbnMgYWxsIGZ1bmN0aW9ucyBzdXBwb3J0IGZvciBDbG9jayBHZW5lcmF0aW9uIGFuZCBDb250cm9sCiogCQkJZmlybXdhcmUgbGlicmFyeSBvbiBscGMxOHh4CiogQHZlcnNpb24JMS4wCiogQGRhdGUJCTA3LiBEZWNlbWJlci4gMjAxMQoqIEBhdXRob3IJTlhQIE1DVSBTVyBBcHBsaWNhdGlvbiBUZWFtCioKKiBDb3B5cmlnaHQoQykgMjAxMSwgTlhQIFNlbWljb25kdWN0b3IKKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogU29mdHdhcmUgdGhhdCBpcyBkZXNjcmliZWQgaGVyZWluIGlzIGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMgb25seQoqIHdoaWNoIHByb3ZpZGVzIGN1c3RvbWVycyB3aXRoIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUKKiBwcm9kdWN0cy4gVGhpcyBzb2Z0d2FyZSBpcyBzdXBwbGllZCAiQVMgSVMiIHdpdGhvdXQgYW55IHdhcnJhbnRpZXMuCiogTlhQIFNlbWljb25kdWN0b3JzIGFzc3VtZXMgbm8gcmVzcG9uc2liaWxpdHkgb3IgbGlhYmlsaXR5IGZvciB0aGUKKiB1c2Ugb2YgdGhlIHNvZnR3YXJlLCBjb252ZXlzIG5vIGxpY2Vuc2Ugb3IgdGl0bGUgdW5kZXIgYW55IHBhdGVudCwKKiBjb3B5cmlnaHQsIG9yIG1hc2sgd29yayByaWdodCB0byB0aGUgcHJvZHVjdC4gTlhQIFNlbWljb25kdWN0b3JzCiogcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIG1ha2UgY2hhbmdlcyBpbiB0aGUgc29mdHdhcmUgd2l0aG91dAoqIG5vdGlmaWNhdGlvbi4gTlhQIFNlbWljb25kdWN0b3JzIGFsc28gbWFrZSBubyByZXByZXNlbnRhdGlvbiBvcgoqIHdhcnJhbnR5IHRoYXQgc3VjaCBhcHBsaWNhdGlvbiB3aWxsIGJlIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkCiogdXNlIHdpdGhvdXQgZnVydGhlciB0ZXN0aW5nIG9yIG1vZGlmaWNhdGlvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJMUEMxOHh4LmgiCiNpbmNsdWRlICJscGMxOHh4X2VtYy5oIgojaW5jbHVkZSAibHBjMTh4eF9zY3UuaCIKCiNkZWZpbmUgTTMyKHgpCSooKHVpbnQzMl90ICopeCkKI2RlZmluZSBERUxBWUNZQ0xFUyhucykgKG5zIC8gKCgxLjAgLyBfX0VNQ0haKSAqIDFFOSkpCgp2b2lkIGVtY19XYWl0VVModm9sYXRpbGUgdWludDMyX3QgdXMpCnsKCXVzICo9IChTeXN0ZW1Db3JlQ2xvY2sgLyAxMDAwMDAwKSAvIDM7Cgl3aGlsZSh1cy0tKTsKfQoKdm9pZCBlbWNfV2FpdE1TKHVpbnQzMl90IG1zKQp7CgllbWNfV2FpdFVTKG1zICogMTAwMCk7Cn0KCnZvaWQgTWVtb3J5UGluSW5pdCh2b2lkKQp7CiAgLyogc2VsZWN0IGNvcnJlY3QgZnVuY3Rpb25zIG9uIHRoZSBHUElPcyAqLwoKI2lmIDEKICAvKiBEQVRBIExJTkVTIDAuLjMxID4gRDAuLkQzMSAqLwogIAkvKiBQMV83IC0gRVhUQlVTX0QwIJcgRXh0ZXJuYWwgbWVtb3J5IGRhdGEgbGluZSAwICovCiAgICBzY3VfcGlubXV4KDB4MSwgIDcsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQMV83OiBEMCAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4MSwgIDgsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQMV84OiBEMSAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4MSwgIDksICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQMV85OiBEMiAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4MSwgIDEwLCAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQMV8xMDogRDMgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweDEsICAxMSwgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUDFfMTE6IEQ0IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHgxLCAgMTIsIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsgIC8qIFAxXzEyOiBENSAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4MSwgIDEzLCAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQMV8xMzogRDYgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweDEsICAxNCwgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUDFfMTQ6IEQ3IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHg1LCAgNCwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFA1XzQ6IEQ4IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHg1LCAgNSwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFA1XzU6IEQ5IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHg1LCAgNiwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFA1XzY6IEQxMCAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4NSwgIDcsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7ICAvKiBQNV83OiBEMTEgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweDUsICAwLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOyAgLyogUDVfMDogRDEyIChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHg1LCAgMSwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFA1XzE6IEQxMyAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4NSwgIDIsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7ICAvKiBQNV8yOiBEMTQgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweDUsICAzLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOyAgLyogUDVfMzogRDE1IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KI2lmIDAKICAgIHNjdV9waW5tdXgoMHhELCAgMiwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFBEXzI6IEQxNiAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4RCwgIDMsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7ICAvKiBQRF8zOiBEMTcgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweEQsICA0LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOyAgLyogUERfNDogRDE4IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHhELCAgNSwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFBEXzU6IEQxOSAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4RCwgIDYsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7ICAvKiBQRF82OiBEMjAgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweEQsICA3LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOyAgLyogUERfNzogRDIxIChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHhELCAgOCwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFBEXzg6IEQyMiAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4RCwgIDksICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7ICAvKiBQRF85OiBEMjMgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweEUsICA1LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUEVfNTogRDI0IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHhFLCAgNiwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsgIC8qIFBFXzY6IEQyNSAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4RSwgIDcsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQRV83OiBEMjYgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweEUsICA4LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUEVfODogRDI3IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHhFLCAgOSwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsgIC8qIFBFXzk6IEQyOCAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4RSwgMTAsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQRV8xMDogRDI5IChmdW5jdGlvbiAwKSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHhFLCAxMSwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsgIC8qIFBFXzExOiBEMzAgKGZ1bmN0aW9uIDApIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweEUsIDEyLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUEVfMTI6IEQzMSAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiNlbmRpZgogIAogIC8qIEFERFJFU1MgTElORVMgQTAuLkExMSA+IEEwLi5BMTEgKi8KCXNjdV9waW5tdXgoMHgyLCAgOSwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsJLyogUDJfOSAtIEVYVEJVU19BMCCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgMCAqLwoJc2N1X3Bpbm11eCgweDIsIDEwLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOwkvKiBQMl8xMCAtIEVYVEJVU19BMSCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgMSAqLwkKCXNjdV9waW5tdXgoMHgyLCAxMSwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsJLyogUDJfMTEgLSBFWFRCVVNfQTIglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDIgKi8JCglzY3VfcGlubXV4KDB4MiwgMTIsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7CS8qIFAyXzEyIC0gRVhUQlVTX0EzIJcgRXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgbGluZSAzICovCglzY3VfcGlubXV4KDB4MiwgMTMsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7CS8qIFAyXzEzIC0gRVhUQlVTX0E0IJcgRXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgbGluZSA0ICovCQoJc2N1X3Bpbm11eCgweDEsICAwLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOwkvKiBQMV8wIC0gRVhUQlVTX0E1IJcgRXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgbGluZSA1ICovCglzY3VfcGlubXV4KDB4MSwgIDEsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7CS8qIFAxXzEgLSBFWFRCVVNfQTYglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDYgKi8JCglzY3VfcGlubXV4KDB4MSwgIDIsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7CS8qIFAxXzIgLSBFWFRCVVNfQTcglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDcgKi8JCglzY3VfcGlubXV4KDB4MiwgIDgsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7CS8qIFAyXzggLSBFWFRCVVNfQTgglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDggKi8KCXNjdV9waW5tdXgoMHgyLCAgNywgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsJLyogUDJfNyAtIEVYVEJVU19BOSCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgOSAqLwkKCXNjdV9waW5tdXgoMHgyLCAgNiwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsJLyogUDJfNiAtIEVYVEJVU19BMTAglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDEwICovCglzY3VfcGlubXV4KDB4MiwgIDIsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7CS8qIFAyXzIgLSBFWFRCVVNfQTExIJcgRXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgbGluZSAxMSAqLwoJc2N1X3Bpbm11eCgweDIsICAxLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOwkvKiBQMl8xIC0gRVhUQlVTX0ExMiCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgMTIgKi8KCXNjdV9waW5tdXgoMHgyLCAgMCwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsJLyogUDJfMCAtIEVYVEJVU19BMTMglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDEzICovCQoJc2N1X3Bpbm11eCgweDYsICA4LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzEpOwkvKiBQNl84IC0gRVhUQlVTX0ExNCCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgMTQgKi8KCXNjdV9waW5tdXgoMHg2LCAgNywgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMxKTsJLyogUDZfNyAtIEVYVEJVU19BMTUglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDE1ICovCQoJc2N1X3Bpbm11eCgweEQsIDE2LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOwkvKiBQRF8xNiAtIEVYVEJVU19BMTYglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDE2ICovCglzY3VfcGlubXV4KDB4RCwgMTUsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMik7CS8qIFBEXzE1IC0gRVhUQlVTX0ExNyCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgMTcgKi8JCglzY3VfcGlubXV4KDB4RSwgIDAsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7CS8qIFBFXzAgLSBFWFRCVVNfQTE4IJcgRXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgbGluZSAxOCAqLwoJc2N1X3Bpbm11eCgweEUsICAxLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOwkvKiBQRV8xIC0gRVhUQlVTX0ExOSCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgMTkgKi8KCXNjdV9waW5tdXgoMHhFLCAgMiwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsJLyogUEVfMiAtIEVYVEJVU19BMjAglyBFeHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBsaW5lIDIwICovCglzY3VfcGlubXV4KDB4RSwgIDMsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7CS8qIFBFXzMgLSBFWFRCVVNfQTIxIJcgRXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgbGluZSAyMSAqLwoJc2N1X3Bpbm11eCgweEUsICA0LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOwkvKiBQRV80IC0gRVhUQlVTX0EyMiCXIEV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGxpbmUgMjIgKi8JCglzY3VfcGlubXV4KDB4QSwgIDQsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7CS8qIFBBXzQgLSBFWFRCVVNfQTIzIJcgRXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgbGluZSAyMyAqLwoKICAvKiBCWVRFIEVOQUJMRVMgKi8KCXNjdV9waW5tdXgoMHgxLCAgNCwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMzKTsJLyogUDFfNCAtIEVYVEJVU19CTFMwIJcgTE9XIGFjdGl2ZSBCeXRlIExhbmUgc2VsZWN0IHNpZ25hbCAwICovCglzY3VfcGlubXV4KDB4NiwgIDYsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMSk7CS8qIFA2XzYgLSBFWFRCVVNfQkxTMSCXIExPVyBhY3RpdmUgQnl0ZSBMYW5lIHNlbGVjdCBzaWduYWwgMSAqLwkKCXNjdV9waW5tdXgoMHhELCAxMywgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsJLyogUERfMTMgLSBFWFRCVVNfQkxTMiCXIExPVyBhY3RpdmUgQnl0ZSBMYW5lIHNlbGVjdCBzaWduYWwgMiAqLwoJc2N1X3Bpbm11eCgweEQsIDEwLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzIpOwkvKiBQRF8xMCAtIEVYVEJVU19CTFMzIJcgTE9XIGFjdGl2ZSBCeXRlIExhbmUgc2VsZWN0IHNpZ25hbCAzICovCQkKICAgIAogICAgc2N1X3Bpbm11eCgweDYsICA5LCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUDZfOTogRVhUQlVTX0RZQ1MwICAoZnVuY3Rpb24gMCkgPiBDUyMgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4MSwgIDYsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQMV82OiBXRSAoZnVuY3Rpb24gMCkgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4NiwgIDQsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQNl80OiBDQVMgIChmdW5jdGlvbiAwKSA+IENBUyMgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4NiwgIDUsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQNl81OiBSQVMgIChmdW5jdGlvbiAwKSA+IFJBUyMgZXJyYXRhICovCgoJTFBDX1NDVV9DTEsoMCkgPSAwICsgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKTsgLyogU0ZTQ0xLMDogRVhUQlVTX0NMSzAgIChmdW5jdGlvbiAwLCBmcm9tIGRhdGFzaGVldCkgPiBDTEsgZHMgKi8KICAgIExQQ19TQ1VfQ0xLKDEpID0gMCArIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyk7IC8qIFNGU0NMSzE6IEVYVEJVU19DTEsxICAoZnVuY3Rpb24gMiwgZnJvbSBkYXRhc2hlZXQpICovCiAgICBMUENfU0NVX0NMSygyKSA9IDAgKyAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpOyAvKiBTRlNDTEsyOiBFWFRCVVNfQ0xLMiAgKGZ1bmN0aW9uIDIsIGZyb20gZGF0YXNoZWV0KSAqLwogICAgTFBDX1NDVV9DTEsoMykgPSAwICsgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKTsgLyogU0ZTQ0xLMzogRVhUQlVTX0NMSzMgIChmdW5jdGlvbiAyLCBmcm9tIGRhdGFzaGVldCkgKi8KCiAgICBzY3VfcGlubXV4KDB4NiwgMTEsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQNl8xMTogQ0tFT1VUMCAgKGZ1bmN0aW9uIDApID4gQ0tFIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweDYsIDEyLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUDZfMTI6IERRTU9VVDAgIChmdW5jdGlvbiAwKSA+IERRTTAgZXJyYXRhICovCiAgICBzY3VfcGlubXV4KDB4NiwgMTAsICAoTURfUExOIHwgTURfRVpJIHwgTURfWkkgfCBNRF9FSFMpLCBGVU5DMyk7ICAvKiBQNl8xMDogRFFNT1VUMSAgKGZ1bmN0aW9uIDApID4gRFFNMSBlcnJhdGEgKi8KICAgIHNjdV9waW5tdXgoMHhELCAgMCwgIChNRF9QTE4gfCBNRF9FWkkgfCBNRF9aSSB8IE1EX0VIUyksIEZVTkMyKTsgIC8qIFBEXzA6IERRTU9VVDIgIChmdW5jdGlvbiAyLCBmcm9tIGRhdGFzaGVldCkgPiBEUU0yIGVycmF0YSAqLwogICAgc2N1X3Bpbm11eCgweEUsIDEzLCAgKE1EX1BMTiB8IE1EX0VaSSB8IE1EX1pJIHwgTURfRUhTKSwgRlVOQzMpOyAgLyogUEVfMTM6IERRTU9VVDMgIChmdW5jdGlvbiAzLCBmcm9tIGRhdGFzaGVldCkgPiBEUU0zIGVycmF0YSAqLwoKCXNjdV9waW5tdXgoCTEJLAkzCSwJTURfUExOX0ZBU1QJLAkzCSk7CS8vT0UKCXNjdV9waW5tdXgoCTEJLAk0CSwJTURfUExOX0ZBU1QJLAkzCSk7CS8vQkxTMAoJc2N1X3Bpbm11eCgJMQksCTUJLAlNRF9QTE5fRkFTVAksCTMJKTsJLy9DUzAKCXNjdV9waW5tdXgoCTEJLAk2CSwJTURfUExOX0ZBU1QJLAkzCSk7CS8vV0UKCiNlbmRpZgp9Cgp2b2lkIEVNQ0ZsYXNoSW5pdCh2b2lkKQp7CgkvLyBIaXRleCBib2FyZCBTU1QzOVZGMzIwMUIgRmxhc2gKCS8vIFJlYWQgQ3ljbGUgVGltZSA3MCBuUyBtaW5pbXVtCgkvLyBDaGlwIEVuYWJsZSBBY2Nlc3MgVGltZSA3MCBucyBtYXhpbXVtCgkvLyBBZGRyZXNzIEFjY2VzcyBUaW1lIDcwIG5zIG1heAoJLy8gVG9lIDM1IG5zIG1heAoJLy8gQ0UvT0UgaGlnaCB0byBpbmFjdGl2ZSBvdXRwdXQgMTYgbnMKCgkvKiBTZXQgdXAgRU1DIENvbnRyb2xsZXIgKi8KCUxQQ19FTUMtPlNUQVRJQ1dBSVRSRDAgPSBERUxBWUNZQ0xFUyg3MCkrMTsKCglMUENfRU1DLT5TVEFUSUNXQUlUUEFHMCA9IERFTEFZQ1lDTEVTKDcwKSsxOwoKCglMUENfRU1DLT5DT05UUk9MID0gMHgwMTsKCUxQQ19FTUMtPlNUQVRJQ0NPTkZJRzAgPSAoMVVMPDw3KSB8ICgxVUwpOwoJTFBDX0VNQy0+U1RBVElDV0FJVE9FTjAgPSBERUxBWUNZQ0xFUygzNSkrMTsKCiAgICAvKkVuYWJsZSBCdWZmZXIgZm9yIEV4dGVybmFsIEZsYXNoKi8KICAgIExQQ19FTUMtPlNUQVRJQ0NPTkZJRzAgfD0gMTw8MTk7Cn0KCi8qIFNEUkFNIHJlZnJlc2ggdGltZSB0byAxNiBjbG9jayBudW0gKi8KI2RlZmluZSBFTUNfU0RSQU1fUkVGUkVTSChmcmVxLHRpbWUpICBcCiAgKCgodWludDY0X3QpKCh1aW50NjRfdCl0aW1lICogZnJlcSkvMTYwMDAwMDAwMDB1bGwpKzEpCgp2b2lkIHZFTUNfSW5pdFNSRFJBTSh1aW50MzJfdCB1MzJCYXNlQWRkciwgdWludDMyX3QgdTMyV2lkdGgsIHVpbnQzMl90IHUzMlNpemUsIHVpbnQzMl90IHUzMkRhdGFCdXMsIHVpbnQzMl90IHUzMkNvbEFkZHJCaXRzKQp7CiAgIC8vIGFkanVzdCB0aGUgQ0NVIGRlbGF5ZSBmb3IgRU1JIChkZWZhdWx0IHRvIHplcm8pCiAgICAvL0xQQ19TQ1UtPkVNQ0NMS0RFTEFZID0gKENMSzBfREVMQVkgfCAoQ0xLRTBfREVMQVkgPDwgMTYpKTsKCS8vIE1vdmUgYWxsIGNsb2NrIGRlbGF5cyB0b2dldGhlcgoJTFBDX1NDVS0+RU1DREVMQVlDTEsgPSAoKENMSzBfREVMQVkpIAoJCQkJCQkgfCAgKENMSzBfREVMQVkgPDwgNCkKCQkJCQkJIHwgIChDTEswX0RFTEFZIDw8IDgpCgkJCQkJCSB8ICAoQ0xLMF9ERUxBWSA8PCAxMikpOwoKICAgLyogSW5pdGlhbGl6ZSBFTUMgdG8gaW50ZXJmYWNlIHdpdGggU0RSQU0gKi8KCUxQQ19FTUMtPkNPTlRST0wgCQkJPSAweDAwMDAwMDAxOyAgIC8qIEVuYWJsZSB0aGUgZXh0ZXJuYWwgbWVtb3J5IGNvbnRyb2xsZXIgKi8JCglMUENfRU1DLT5DT05GSUcgCQkJPSAwOwoKCUxQQ19FTUMtPkRZTkFNSUNDT05GSUcwIAk9ICgodTMyV2lkdGggPDwgNykgfCAodTMyU2l6ZSA8PCA5KSB8ICgxVUwgPDwgMTIpIHwgKHUzMkRhdGFCdXMgPDwgMTQpKTsKCUxQQ19FTUMtPkRZTkFNSUNDT05GSUcyIAk9ICgodTMyV2lkdGggPDwgNykgfCAodTMyU2l6ZSA8PCA5KSB8ICgxVUwgPDwgMTIpIHwgKHUzMkRhdGFCdXMgPDwgMTQpKTsKCiAgICBMUENfRU1DLT5EWU5BTUlDUkFTQ0FTMCAJPSAoMyA8PCAwKSB8ICgzIDw8IDgpOyAgICAgIC8vIGFlbQogICAgTFBDX0VNQy0+RFlOQU1JQ1JBU0NBUzIgCT0gKDMgPDwgMCkgfCAoMyA8PCA4KTsgIC8vIGFlbQoJCglMUENfRU1DLT5EWU5BTUlDUkVBRENPTkZJRwk9IEVNQ19DT01NQU5EX0RFTEFZRURfU1RSQVRFR1k7CgkKCUxQQ19FTUMtPkRZTkFNSUNSUCAJCQk9IDE7ICAgIC8vIGNhbGN1bGF0ZWQgZnJvbSB4bHMgc2hlZXQKCUxQQ19FTUMtPkRZTkFNSUNSQVMgCQk9IDM7CglMUENfRU1DLT5EWU5BTUlDU1JFWCAJCT0gNTsgICAKCUxQQ19FTUMtPkRZTkFNSUNBUFIgCQk9IDA7CglMUENfRU1DLT5EWU5BTUlDREFMIAkJPSA0OwoJTFBDX0VNQy0+RFlOQU1JQ1dSIAkJCT0gMTsKCUxQQ19FTUMtPkRZTkFNSUNSQyAJCQk9IDU7ICAgCglMUENfRU1DLT5EWU5BTUlDUkZDIAkJPSA1OyAgIAoJTFBDX0VNQy0+RFlOQU1JQ1hTUiAJCT0gNTsgICAKCUxQQ19FTUMtPkRZTkFNSUNSUkQgCQk9IDE7CglMUENfRU1DLT5EWU5BTUlDTVJEIAkJPSAxOwoJCglMUENfRU1DLT5EWU5BTUlDQ09OVFJPTCAJPSBFTUNfQ0VfRU5BQkxFIHwgRU1DX0NTX0VOQUJMRSB8IEVNQ19JTklUKEVNQ19OT1ApOwoJZW1jX1dhaXRVUygxMDApOwoJCglMUENfRU1DLT5EWU5BTUlDQ09OVFJPTCAJPSBFTUNfQ0VfRU5BQkxFIHwgRU1DX0NTX0VOQUJMRSB8IEVNQ19JTklUKEVNQ19QUkVDSEFSR0VfQUxMKTsKCglMUENfRU1DLT5EWU5BTUlDUkVGUkVTSCAJPSAyOwoJZW1jX1dhaXRVUygxMDApOwoJCiAgICBMUENfRU1DLT5EWU5BTUlDUkVGUkVTSCAJPSA1MDsKCQoJTFBDX0VNQy0+RFlOQU1JQ0NPTlRST0wgCT0gRU1DX0NFX0VOQUJMRSB8IEVNQ19DU19FTkFCTEUgfCBFTUNfSU5JVChFTUNfTU9ERSk7CgoJaWYodTMyRGF0YUJ1cyA9PSAwKSAKCXsKCQkvKiBidXJzdCBzaXplIDggKi8KICAgICAgICAqKCh2b2xhdGlsZSB1aW50MzJfdCAqKSh1MzJCYXNlQWRkciB8ICgoMyB8ICgzIDw8IDQpKSA8PCAodTMyQ29sQWRkckJpdHMgKyAxKSkpKTsKCX0KCWVsc2UgCgl7CgkJLyogYnVyc3Qgc2l6ZSA0ICovCgkJKigodm9sYXRpbGUgdWludDMyX3QgKikodTMyQmFzZUFkZHIgfCAoKDJVTCB8ICgyVUwgPDwgNCkpIDw8ICh1MzJDb2xBZGRyQml0cyArIDIpKSkpOwoJfQoKCUxQQ19FTUMtPkRZTkFNSUNDT05UUk9MIAk9IDA7IC8vIEVNQ19DRV9FTkFCTEUgfCBFTUNfQ1NfRU5BQkxFOwoJTFBDX0VNQy0+RFlOQU1JQ0NPTkZJRzAgCT0gKCh1MzJXaWR0aCA8PCA3KSB8ICh1MzJTaXplIDw8IDkpIHwgKDFVTCA8PCAxMikgfCAodTMyRGF0YUJ1cyA8PCAxNCkpIHwgRU1DX0JfRU5BQkxFOwoJTFBDX0VNQy0+RFlOQU1JQ0NPTkZJRzEgCT0gKCh1MzJXaWR0aCA8PCA3KSB8ICh1MzJTaXplIDw8IDkpIHwgKDFVTCA8PCAxMikgfCAodTMyRGF0YUJ1cyA8PCAxNCkpIHwgRU1DX0JfRU5BQkxFOwoJTFBDX0VNQy0+RFlOQU1JQ0NPTkZJRzIgCT0gKCh1MzJXaWR0aCA8PCA3KSB8ICh1MzJTaXplIDw8IDkpIHwgKDFVTCA8PCAxMikgfCAodTMyRGF0YUJ1cyA8PCAxNCkpIHwgRU1DX0JfRU5BQkxFOwoJTFBDX0VNQy0+RFlOQU1JQ0NPTkZJRzMgCT0gKCh1MzJXaWR0aCA8PCA3KSB8ICh1MzJTaXplIDw8IDkpIHwgKDFVTCA8PCAxMikgfCAodTMyRGF0YUJ1cyA8PCAxNCkpIHwgRU1DX0JfRU5BQkxFOwp9Cgo=