LyoKICogSVBhcmVudCBpbXBsZW1lbnRhdGlvbgogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBBIHVuaXZlcnNhbCBwYXJlbnQgaW50ZXJmYWNlIGZvciBldmVyeXRoaW5nIGluIFdpbmVEM0QgdGhhdCBkb2Vzbid0IGhhdmUKICogYSBERHJhdyBjb3VudGVycGFydAogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgoKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkM2QuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Cgpjb25zdCBHVUlEIElJRF9JUGFyZW50ID0gezB4YzIwZTRjODgsIDB4NzRlNywgMHg0OTQwLCB7MHhiYSwgMHg5ZiwgMHgyZSwgMHgzMiwgMHgzZiwgMHg5ZCwgMHhjOSwgMHg4MX19OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIG1ldGhvZHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQ6OlF1ZXJ5aW50ZXJmYWNlCiAqCiAqIEl0IGNhbid0IHF1ZXJ5IGFueSBpbnRlcmZhY2VzLCBhbmQgaXQncyBub3QgdXNlZCBmb3IgYW55dGhpbmcuIFNvCiAqIGl0IGp1c3QgcmV0dXJucyBFX05PSU5URVJGQUNFCiAqCiAqIFBhcmFtczoKICogIHJpaWQ6IGd1aWQgb2YgcXVlcmllZCBpbnRlcmZhY2UKICogIG9iajogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZQogKgogKiBSZXR1cm4gdmFsdWVzCiAqICBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIEVfTk9JTlRFUkZBQ0UgYW5kIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSVBhcmVudEltcGxfUXVlcnlJbnRlcmZhY2UoSVBhcmVudCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJUGFyZW50SW1wbCwgSVBhcmVudCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CgogICAgKm9iaiA9IE5VTEw7CiAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByaWlkICkgfHwKICAgICAgICAgSXNFcXVhbEdVSUQoICZJSURfSVBhcmVudCwgcmlpZCApICkKICAgIHsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSVBhcmVudCk7CiAgICAgICAgSVBhcmVudF9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSVBhcmVudCkpOwogICAgICAgIHJldHVybiBERF9PSzsKICAgIH0KICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVBhcmVudDo6QWRkUmVmCiAqCiAqIEluY3JlYXNlcyB0aGUgcmVmY291bnQKICoKICogUGFyYW1zOgogKgogKiBSZXR1cm4gdmFsdWVzCiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJUGFyZW50SW1wbF9BZGRSZWYoSVBhcmVudCAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElQYXJlbnRJbXBsLCBJUGFyZW50LCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKSA6IEFkZFJlZiBmcm9tICVkXG4iLCBUaGlzLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQ6OlJlbGVhc2UKICoKICogUmVsZWFzZXMgdGhlIHJlZmNvdW50LCBhbmQgZGVzdHJveXMgdGhlIG9iamVjdCBpZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMAogKiBBbHNvIHJlbGVhc2VzIHRoZSBjaGlsZCBvYmplY3QsIGlmIGRlc3Ryb3llZC4gVGhhdCdzIGFsbW9zdCB0aGUgd2hvbGUgc2Vuc2UKICogb2YgdGhpcyBpbnRlcmZhY2UuCiAqCiAqIFBhcmFtczoKICoKICogUmV0dXJuIHZhbHVlcwogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkgCklQYXJlbnRJbXBsX1JlbGVhc2UoSVBhcmVudCAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElQYXJlbnRJbXBsLCBJUGFyZW50LCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKSA6IFJlbGVhc2VSZWYgdG8gJWRcbiIsIFRoaXMsIHJlZik7CgogICAgaWYgKHJlZiA9PSAwKQogICAgewogICAgICAgIFRSQUNFKCIoJXApIFJlbGVhc2luZyBjaGlsZCBhdCAlcFxuIiwgVGhpcywgVGhpcy0+Y2hpbGQpOwogICAgICAgIGlmKFRoaXMtPmNoaWxkKQogICAgICAgICAgICBJVW5rbm93bl9SZWxlYXNlKFRoaXMtPmNoaWxkKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgICAgICBUUkFDRSgiUmVsZWFzZWRcbiIpOwogICAgfQogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFRoZSBWVGFibGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpjb25zdCBJUGFyZW50VnRibCBJUGFyZW50X1Z0YmwgPQp7CiAgICAgSVBhcmVudEltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICAgSVBhcmVudEltcGxfQWRkUmVmLAogICAgIElQYXJlbnRJbXBsX1JlbGVhc2UsCn07Cg==