LyoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDQgTGlvbmVsIFVsbWVyCiAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IENocmlzdGlhbiBDb3N0YQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBJRGlyZWN0M0REZXZpY2UgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMSwgMiwgMyBhbmQgNy4gUmVuZGVyaW5nIGlzIHJlbGF5ZWQKICogdG8gV2luZUQzRCwgc29tZSBtaW5pbWFsIERpcmVjdERyYXcgc3BlY2lmaWMgbWFuYWdlbWVudCBpcyBoYW5kbGVkIGhlcmUuCiAqIFRoZSBEaXJlY3QzRERldmljZSBpcyBOT1QgdGhlIHBhcmVudCBvZiB0aGUgV2luZUQzRERldmljZSwgYmVjYXVzZSBkM2QKICogaXMgaW5pdGlhbGl6ZWQgd2hlbiBEaXJlY3REcmF3IGNyZWF0ZXMgdGhlIHByaW1hcnkgc3VyZmFjZS4KICogU29tZSB0eXBlIG1hbmFnZW1lbnQgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHNvbWUgRDNEIHR5cGVzIGNoYW5nZWQgYmV0d2VlbgogKiBEM0Q3IGFuZCBEM0Q5LgogKgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgoKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkM2QuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2Q3KTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoZGRyYXdfdGh1bmspOwoKLyogVGhlIGRldmljZSBJRCAqLwpjb25zdCBHVUlEIElJRF9EM0RERVZJQ0VfV2luZUQzRCA9IHsKICAweGFlZjcyZDQzLAogIDB4YjA5YSwKICAweDRiN2IsCiAgeyAweGI3LDB4OTgsMHhjNiwweDhhLDB4NzcsMHgyZCwweDcyLDB4MmEgfQp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIE1ldGhvZHMuIENvbW1vbiBmb3IgVmVyc2lvbiAxLCAyLCAzIGFuZCA3IAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6UXVlcnlJbnRlcmZhY2UKICoKICogVXNlZCB0byBxdWVyeSBvdGhlciBpbnRlcmZhY2VzIGZyb20gYSBEaXJlY3QzRERldmljZSBpbnRlcmZhY2UuCiAqIEl0IGNhbiByZXR1cm4gaW50ZXJmYWNlIHBvaW50ZXJzIHRvIGFsbCBEaXJlY3QzRERldmljZSB2ZXJzaW9ucyBhcyB3ZWxsCiAqIGFzIElEaXJlY3REcmF3IGFuZCBJRGlyZWN0M0QuIEZvciBhIGxpbmsgdG8gUXVlcnlJbnRlcmZhY2UKICogcnVsZXMgc2VlIGRkcmF3LmMsIElEaXJlY3REcmF3Nzo6UXVlcnlJbnRlcmZhY2UKICoKICogRXhpc3RzIGluIFZlcnNpb24gMSwgMiwgMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6IEludGVyZmFjZSBJRCBxdWVyaWVkIGZvcgogKiAgb2JqOiBVc2VkIHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvciBFX05PSU5URVJGQUNFCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19RdWVyeUludGVyZmFjZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwoKICAgIC8qIEFjY29yZGluZyB0byBDT00gZG9jcywgaWYgdGhlIFF1ZXJ5SW50ZXJmYWNlIGZhaWxzLCBvYmogc2hvdWxkIGJlIHNldCB0byBOVUxMICovCiAgICAqb2JqID0gTlVMTDsKCiAgICBpZighcmVmaWlkKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sIHJlZmlpZCApICkKICAgIHsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyk7CiAgICB9CgogICAgLyogQ2hlY2sgRGlyZWN0RHJhdyBJbnRlcmZhYwFzICovCiAgICBlbHNlIGlmKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzcsIHJlZmlpZCApICkKICAgIHsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3REcmF3Nyk7CiAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3REcmF3NyBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOwogICAgfQogICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3NCwgcmVmaWlkICkgKQogICAgewogICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5kZHJhdywgSURpcmVjdERyYXc0KTsKICAgICAgICBUUkFDRSgiKCVwKSBSZXR1cm5pbmcgSURpcmVjdERyYXc0IGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICB9CiAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcyLCByZWZpaWQgKSApCiAgICB7CiAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3LCBJRGlyZWN0RHJhdzIpOwogICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0RHJhdzIgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKICAgIH0KICAgIGVsc2UgaWYoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3LCByZWZpaWQgKSApCiAgICB7CiAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3LCBJRGlyZWN0RHJhdyk7CiAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3REcmF3IGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICB9CgogICAgLyogRGlyZWN0M0QgKi8KICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QgICwgcmVmaWlkICkgKQogICAgewogICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5kZHJhdywgSURpcmVjdDNEKTsKICAgICAgICBUUkFDRSgiKCVwKSBSZXR1cm5pbmcgSURpcmVjdDNEIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICB9CiAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEMiAsIHJlZmlpZCApICkKICAgIHsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRDIpOwogICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0QyIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICB9CiAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEMyAsIHJlZmlpZCApICkKICAgIHsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRDMpOwogICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0QzIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICB9CiAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNENyAsIHJlZmlpZCApICkKICAgIHsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRDcpOwogICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0Q3IGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICB9CgogICAgLyogRGlyZWN0M0REZXZpY2UgKi8KICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0REZXZpY2UgICwgcmVmaWlkICkgKQogICAgewogICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UpOwogICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0REZXZpY2UgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKICAgIH0KICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0REZXZpY2UyICAsIHJlZmlpZCApICkgewogICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UyKTsKICAgICAgICBUUkFDRSgiKCVwKSBSZXR1cm5pbmcgSURpcmVjdDNERGV2aWNlMiBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOwogICAgfQogICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRERldmljZTMgICwgcmVmaWlkICkgKSB7CiAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpOwogICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICB9CiAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNERGV2aWNlNyAgLCByZWZpaWQgKSApIHsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyk7CiAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKICAgIH0KCiAgICAvKiBVbmtub3duIGludGVyZmFjZSAqLwogICAgZWxzZQogICAgewogICAgICAgIEVSUigiKCVwKS0+KCVzLCAlcCk6IE5vIGludGVyZmFjZSBmb3VuZFxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwogICAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOwogICAgfQoKICAgIC8qIEFkZFJlZiB0aGUgcmV0dXJuZWQgaW50ZXJmYWNlICovCiAgICBJVW5rbm93bl9BZGRSZWYoIChJVW5rbm93biAqKSAqb2JqKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYmopOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9RdWVyeUludGVyZmFjZShJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRERldmljZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYnApCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6QWRkUmVmCiAqCiAqIEluY3JlYXNlcyB0aGUgcmVmY291bnQuLi4uCiAqIFRoZSBtb3N0IGV4Y2l0aW5nIE1ldGhvZCwgZGVmaW5pdGVseQogKgogKiBFeGlzdHMgaW4gVmVyc2lvbiAxLCAyLCAzIGFuZCA3CiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfQWRkUmVmKElEaXJlY3QzRERldmljZTcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKSA6IGluY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmIC0xKTsKCiAgICByZXR1cm4gcmVmOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19BZGRSZWYoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9BZGRSZWYoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9BZGRSZWYoSURpcmVjdDNERGV2aWNlICppZmFjZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTc6OlJlbGVhc2UKICoKICogRGVjcmVhc2VzIHRoZSByZWZjb3VudCBvZiB0aGUgaW50ZXJmYWNlCiAqIFdoZW4gdGhlIHJlZmNvdW50IGlzIHJlZHVjZWQgdG8gMCwgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuCiAqCiAqIEV4aXN0cyBpbiBWZXJzaW9uIDEsIDIsIDMgYW5kIDcKICoKICogUmV0dXJuczpkCiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfUmVsZWFzZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmICsxKTsKCiAgICAvKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGRlc3Ryb3kgdGhlIFdpbmVEM0REZXZpY2UsIGJlY2F1c2UgaXQncyBzdGlsbCBpbiB1c2UgZm9yCiAgICAgKiAyRCByZW5kZXJpbmcuIElEaXJlY3REcmF3U3VyZmFjZTc6OlJlbGVhc2Ugd2lsbCBkZXN0cm95IHRoZSBXaW5lRDNERGV2aWNlCiAgICAgKiB3aGVuIHRoZSByZW5kZXIgdGFyZ2V0IGlzIHJlbGVhc2VkCiAgICAgKi8KICAgIGlmIChyZWYgPT0gMCkKICAgIHsKICAgICAgICBJUGFyZW50ICpJbmRleEJ1ZmZlclBhcmVudDsKICAgICAgICBEV09SRCBpOwoKICAgICAgICAvKiBGcmVlIHRoZSBpbmRleCBidWZmZXIuICovCiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0SW5kaWNlcyhUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgIElXaW5lRDNESW5kZXhCdWZmZXJfR2V0UGFyZW50KFRoaXMtPmluZGV4YnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVW5rbm93biAqKikgJkluZGV4QnVmZmVyUGFyZW50KTsKICAgICAgICBJUGFyZW50X1JlbGVhc2UoSW5kZXhCdWZmZXJQYXJlbnQpOyAvKiBPbmNlIGZvciB0aGUgZ2V0UGFyZW50ICovCiAgICAgICAgaWYoIElQYXJlbnRfUmVsZWFzZShJbmRleEJ1ZmZlclBhcmVudCkgIT0gMCkgIC8qIEFuZCBub3cgdG8gZGVzdHJveSBpdCAqLwogICAgICAgIHsKICAgICAgICAgICAgRVJSKCIgKCVwKSBTb21ldGhpbmcgaXMgc3RpbGwgaG9sZGluZyB0aGUgaW5kZXggYnVmZmVyIHBhcmVudCAlcFxuIiwgVGhpcywgSW5kZXhCdWZmZXJQYXJlbnQpOwogICAgICAgIH0KCiAgICAgICAgLyogVGhlcmUgaXMgbm8gbmVlZCB0byB1bnNldCB0aGUgdmVydGV4IGJ1ZmZlciBoZXJlLCBJV2luZUQzRERldmljZV9VbmluaXQzRCB3aWxsIGRvIHRoYXQgd2hlbgogICAgICAgICAqIGRlc3Ryb3lpbmcgdGhlIHByaW1hcnkgc3RhdGVibG9jay4gSWYgYSB2ZXJ0ZXggYnVmZmVyIGlzIGRlc3Ryb3llZCB3aGlsZSBpdCBpcyBib3VuZAogICAgICAgICAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6UmVsZWFzZSB3aWxsIHVuc2V0IGl0LgogICAgICAgICAqLwoKICAgICAgICAvKiBSZXN0b3JlIHRoZSByZW5kZXIgdGFyZ2V0cyAqLwogICAgICAgIGlmKFRoaXMtPk9mZlNjcmVlblRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIFdJTkVEM0RWSUVXUE9SVCB2cDsKCiAgICAgICAgICAgIHZwLlggPSAwOwogICAgICAgICAgICB2cC5ZID0gMDsKICAgICAgICAgICAgdnAuV2lkdGggPSBUaGlzLT5kZHJhdy0+ZDNkX3RhcmdldC0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7CiAgICAgICAgICAgIHZwLkhlaWdodCA9IFRoaXMtPmRkcmF3LT5kM2RfdGFyZ2V0LT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7CiAgICAgICAgICAgIHZwLk1pblogPSAwLjA7CiAgICAgICAgICAgIHZwLk1heFogPSAxLjA7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFZpZXdwb3J0KFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2cCk7CgogICAgICAgICAgICAvKiBTZXQgdGhlIGRldmljZSB1cCB0byByZW5kZXIgdG8gdGhlIGZyb250IGJ1ZmZlciBzaW5jZSB0aGUgYmFjayBidWZmZXIgd2lsbAogICAgICAgICAgICAgKiB2YW5pc2ggc29vbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclRhcmdldChUaGlzLT53aW5lRDNERGV2aWNlLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+ZGRyYXctPmQzZF90YXJnZXQtPldpbmVEM0RTdXJmYWNlKTsKICAgICAgICAgICAgLyogVGhpcy0+dGFyZ2V0IGlzIHRoZSBvZmZzY3JlZW4gdGFyZ2V0LgogICAgICAgICAgICAgKiBUaGlzLT5kZHJhdy0+ZDNkX3RhcmdldCBpcyB0aGUgdGFyZ2V0IHVzZWQgYnkgRERyYXcKICAgICAgICAgICAgICovCiAgICAgICAgICAgIFRSQUNFKCIoJXApIFJlbGVhc2U6IFVzaW5nICVwIGFzIGZyb250IGJ1ZmZlciwgJXAgYXMgYmFjayBidWZmZXJcbiIsIFRoaXMsIFRoaXMtPmRkcmF3LT5kM2RfdGFyZ2V0LCBOVUxMKTsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0RnJvbnRCYWNrQnVmZmVycyhUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPmRkcmF3LT5kM2RfdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9CgogICAgICAgIC8qIFJlbGVhc2UgdGhlIFdpbmVEM0REZXZpY2UuIFRoaXMgd29uJ3QgZGVzdHJveSBpdCAqLwogICAgICAgIGlmKElXaW5lRDNERGV2aWNlX1JlbGVhc2UoVGhpcy0+d2luZUQzRERldmljZSkgPD0gMCkKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiICglcCkgVGhlIHdpbmVEM0QgZGV2aWNlICVwIHdhcyBkZXN0cm95ZWQgdW5leHBlY3RhZGVseS4gUHJlcGFyZSBmb3IgdHJvdWJsZVxuIiwgVGhpcywgVGhpcy0+d2luZUQzRERldmljZSk7CiAgICAgICAgfQoKICAgICAgICAvKiBUaGUgdGV4dHVyZSBoYW5kbGVzIHNob3VsZCBiZSB1bnNldCBieSBub3csIGJ1dCB0aGVyZSBtaWdodCBiZSBzb21lIGJpdHMKICAgICAgICAgKiBtaXNzaW5nIGluIG91ciByZWZlcmVuY2UgY291bnRpbmcobmVlZHMgdGVzdCkuIERvIGEgc2FuaXR5IGNoZWNrCiAgICAgICAgICovCiAgICAgICAgZm9yKGkgPSAwOyBpIDwgVGhpcy0+bnVtSGFuZGxlczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoVGhpcy0+SGFuZGxlc1tpXS5wdHIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaChUaGlzLT5IYW5kbGVzW2ldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBERHJhd0hhbmRsZV9UZXh0dXJlOgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopIFRoaXMtPkhhbmRsZXNbaV0ucHRyOwogICAgICAgICAgICAgICAgICAgICAgICBGSVhNRSgiVGV4dHVyZSBIYW5kbGUgJWQgbm90IHVuc2V0IHByb3Blcmx5XG4iLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cmYtPkhhbmRsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIEREcmF3SGFuZGxlX01hdGVyaWFsOgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsICptYXQgPSAoSURpcmVjdDNETWF0ZXJpYWxJbXBsICopIFRoaXMtPkhhbmRsZXNbaV0ucHRyOwogICAgICAgICAgICAgICAgICAgICAgICBGSVhNRSgiTWF0ZXJpYWwgaGFuZGxlICVkIG5vdCB1bnNldCBwcm9wZXJseVxuIiwgaSArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBtYXQtPkhhbmRsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIEREcmF3SGFuZGxlX01hdHJpeDoKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGZpeG1lIGhlcmUgYmVjYXVzZSB0aGlzIG1pZ2h0IGhhcHBlbiBiZWNhdXNlIG9mIHNsb3BweSBhcHBzICovCiAgICAgICAgICAgICAgICAgICAgICAgIFdBUk4oIkxlZnRvdmVyIG1hdHJpeCBoYW5kbGUgJWQsIGRlbGV0aW5nXG4iLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZV9EZWxldGVNYXRyaXgoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIEREcmF3SGFuZGxlX1N0YXRlQmxvY2s6CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBmaXhtZSBoZXJlIGJlY2F1c2UgdGhpcyBtaWdodCBoYXBwZW4gYmVjYXVzZSBvZiBzbG9wcHkgYXBwcyAqLwogICAgICAgICAgICAgICAgICAgICAgICBXQVJOKCJMZWZ0b3ZlciBzdGF0ZWJsb2NrIGhhbmRsZSAlZCwgZGVsZXRpbmdcbiIsIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlN19EZWxldGVTdGF0ZUJsb2NrKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgRklYTUUoIlVua25vd24gaGFuZGxlICVkIG5vdCB1bnNldCBwcm9wZXJseVxuIiwgaSArIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5IYW5kbGVzKTsKCiAgICAgICAgVFJBQ0UoIlJlbGVhc2luZyB0YXJnZXQgJXAgJXBcbiIsIFRoaXMtPnRhcmdldCwgVGhpcy0+ZGRyYXctPmQzZF90YXJnZXQpOwogICAgICAgIC8qIFJlbGVhc2UgdGhlIHJlbmRlciB0YXJnZXQgYW5kIHRoZSBXaW5lRDNEIHJlbmRlciB0YXJnZXQKICAgICAgICAgKiAoU2VlIElEaXJlY3QzRDc6OkNyZWF0ZURldmljZSBmb3IgbW9yZSBjb21tZW50cyBvbiB0aGlzKQogICAgICAgICAqLwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLT50YXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXctPmQzZF90YXJnZXQsSURpcmVjdERyYXdTdXJmYWNlNykpOwogICAgICAgIFRSQUNFKCJUYXJnZXQgcmVsZWFzZSBkb25lXG4iKTsKCiAgICAgICAgVGhpcy0+ZGRyYXctPmQzZGRldmljZSA9IE5VTEw7CgogICAgICAgIC8qIE5vdyBmcmVlIHRoZSBzdHJ1Y3R1cmUgKi8KICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgIH0KCiAgICBUUkFDRSgiRG9uZVxuIik7CiAgICByZXR1cm4gcmVmOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19SZWxlYXNlKElEaXJlY3QzRERldmljZTMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1JlbGVhc2UoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0REZXZpY2UgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZSBNZXRob2RzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U6OkluaXRpYWxpemUKICoKICogSW5pdGlhbGl6ZXMgYSBEaXJlY3QzRERldmljZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLCBhcyBhbGwKICogaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBhdCBjcmVhdGUgdGltZS4KICoKICogRXhpc3RzIGluIFZlcnNpb24gMQogKgogKiBQYXJhbWV0ZXJzOgogKiAgTm8gaWRlYSB3aGF0IHRoZXkgbWVhbiwgYXMgdGhlIE1TRE4gcGFnZSBpcyBnb25lCiAqCiAqIFJldHVybnM6IEREX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfMV9Jbml0aWFsaXplKElEaXJlY3QzRERldmljZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqRGlyZWN0M0QsIEdVSUQgKmd1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0MgKkRlc2MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwoKICAgIC8qIEl0IHNob3VsZG4ndCBiZSBjcnVjaWFsLCBidXQgcHJpbnQgYSBGSVhNRSwgSSdtIGludGVyZXN0ZWQgaWYKICAgICAqIGFueSBnYW1lIGNhbGxzIGl0IGFuZCB3aGVuCiAgICAgKi8KICAgIEZJWE1FKCIoJXApLT4oJXAsJXAsJXApOiBOby1vcCFcbiIsIFRoaXMsIERpcmVjdDNELCBndWlkLCBEZXNjKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0Q2FwcwogKgogKiBSZXRyaWV2ZXMgdGhlIGRldmljZSdzIGNhcGFiaWxpdGllcwogKgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgZm9yIFZlcnNpb24gNyBvbmx5LCB0aGUgb2xkZXIgdmVyc2lvbnMgaGF2ZQogKiB0aGVpciBvd24gaW1wbGVtZW50YXRpb24uCiAqCiAqIFBhcmFtZXRlcnM6CiAqICBEZXNjOiBQb2ludGVyIHRvIGEgRDNEREVWSUNFREVTQzcgc3RydWN0dXJlIHRvIGZpbGwKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEM0RFUlJfKiBpZiBhIHByb2JsZW0gb2NjdXJzLiBTZWUgV2luZUQzRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Q2FwcyhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEREVWSUNFREVTQzcgKkRlc2MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEQzRERFVklDRURFU0MgT2xkRGVzYzsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBEZXNjKTsKCiAgICAvKiBDYWxsIHRoZSBzYW1lIGZ1bmN0aW9uIHVzZWQgYnkgSURpcmVjdDNELCB0aGlzIHNhdmVzIGNvZGUgKi8KICAgIHJldHVybiBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+ZGRyYXctPndpbmVEM0QsICZPbGREZXNjLCBEZXNjKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTM6OkdldENhcHMKICoKICogUmV0cmlldmVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlIGRldmljZSBhbmQgdGhlIGVtdWxhdGlvbgogKiBkZXZpY2UuIEZvciBXaW5lLCBoYXJkd2FyZSBhbmQgZW11bGF0aW9uIGFyZSB0aGUgc2FtZSAoaXQncyBhbGwgSFcpLgogKgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgZm9yIFZlcnNpb24gMSwgMiwgYW5kIDMuIFZlcnNpb24gNyBoYXMgaXRzIG93bgogKgogKiBQYXJhbWV0ZXJzOgogKiAgSFdEZXNjOiBTdHJ1Y3R1cmUgdG8gZmlsbCB3aXRoIHRoZSBIVyBjYXBzCiAqICBIZWxEZXNjOiBTdHJ1Y3R1cmUgdG8gZmlsbCB3aXRoIHRoZSBoYXJkYXJlIGVtdWxhdGlvbiBjYXBzCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRDNERVJSXyogaWYgYSBwcm9ibGVtIG9jY3Vycy4gU2VlIFdpbmVEM0QKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldENhcHMoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0MgKkhXRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEREVWSUNFREVTQyAqSGVsRGVzYykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgRDNEREVWSUNFREVTQzcgbmV3RGVzYzsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgaWZhY2UsIEhXRGVzYywgSGVsRGVzYyk7CgogICAgaHIgPSBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+ZGRyYXctPndpbmVEM0QsIEhXRGVzYywgJm5ld0Rlc2MpOwogICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CgogICAgKkhlbERlc2MgPSAqSFdEZXNjOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRDYXBzKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDICpEM0RIV0RldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0MgKkQzREhFTERldkRlc2MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEM0RIV0RldkRlc2MsIEQzREhFTERldkRlc2MpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfR2V0Q2FwcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNESFdEZXZEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RIRUxEZXZEZXNjKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9HZXRDYXBzKElEaXJlY3QzRERldmljZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0MgKkQzREhXRGV2RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEREVWSUNFREVTQyAqRDNESEVMRGV2RGVzYykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNESFdEZXZEZXNjLCBEM0RIRUxEZXZEZXNjKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0dldENhcHMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREhXRGV2RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNESEVMRGV2RGVzYyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2UyOjpTd2FwVGV4dHVyZUhhbmRsZXMKICoKICogU3dhcHMgdGhlIHRleHR1cmUgaGFuZGxlcyBvZiAyIFRleHR1cmUgaW50ZXJmYWNlcy4gVmVyc2lvbiAxIGFuZCAyCiAqCiAqIFBhcmFtZXRlcnM6CiAqICBUZXgxLCBUZXgyOiBUaGUgMiBUZXh0dXJlcyB0byBzd2FwCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8yX1N3YXBUZXh0dXJlSGFuZGxlcyhJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RUZXh0dXJlMiAqVGV4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RUZXh0dXJlMiAqVGV4MikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgRFdPUkQgc3dhcDsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYxID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIFRleDEpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZjIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgVGV4Mik7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgc3VyZjEsIHN1cmYyKTsKCiAgICBUaGlzLT5IYW5kbGVzW3N1cmYxLT5IYW5kbGUgLSAxXS5wdHIgPSBzdXJmMjsKICAgIFRoaXMtPkhhbmRsZXNbc3VyZjItPkhhbmRsZSAtIDFdLnB0ciA9IHN1cmYxOwoKICAgIHN3YXAgPSBzdXJmMi0+SGFuZGxlOwogICAgc3VyZjItPkhhbmRsZSA9IHN1cmYxLT5IYW5kbGU7CiAgICBzdXJmMS0+SGFuZGxlID0gc3dhcDsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX1N3YXBUZXh0dXJlSGFuZGxlcyhJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFRleHR1cmUgKkQzRFRleDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZSAqRDNEVGV4MikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZjEgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBEM0RUZXgxKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYyID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgRDNEVGV4Mik7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTIgaW50ZXJmYWNlLlxuIiwgVGhpcywgc3VyZjEsIHN1cmYyKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UyX1N3YXBUZXh0dXJlSGFuZGxlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShzdXJmMSwgSURpcmVjdDNEVGV4dHVyZTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKHN1cmYyLCBJRGlyZWN0M0RUZXh0dXJlMikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlMzo6R2V0U3RhdHMKICoKICogVGhpcyBtZXRob2Qgc2VlbXMgdG8gcmV0cmlldmUgc29tZSBzdGF0cyBmcm9tIHRoZSBkZXZpY2UuCiAqIFRoZSBNU0ROIGRvY3VtZW50YXRpb24gZG9lc24ndCBleGlzdCBhbnkgbW9yZSwgYnV0IHRoZSBEM0RTVEFUUwogKiBzdHJ1Y3R1cmUgc3VnZ2VzdHMgdGhhdCB0aGUgYW1vdXQgb2YgZHJhd24gcHJpbWl0aXZlcyBhbmQgcHJvY2Vzc2VkCiAqIHZlcnRpY2VzIGlzIHJldHVybmVkLgogKgogKiBFeGlzdHMgaW4gVmVyc2lvbiAxLCAyIGFuZCAzCiAqCiAqIFBhcmFtZXRlcnM6CiAqICBTdGF0czogUG9pbnRlciB0byBhIEQzRFNUQVRTIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFN0YXRzID09IE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFN0YXRzKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEU1RBVFMgKlN0YXRzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVwKTogU3R1YiFcbiIsIFRoaXMsIFN0YXRzKTsKCiAgICBpZighU3RhdHMpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgLyogRmlsbCB0aGUgU3RhdHMgd2l0aCAwICovCiAgICBTdGF0cy0+ZHdUcmlhbmdsZXNEcmF3biA9IDA7CiAgICBTdGF0cy0+ZHdMaW5lc0RyYXduID0gMDsKICAgIFN0YXRzLT5kd1BvaW50c0RyYXduID0gMDsKICAgIFN0YXRzLT5kd1NwYW5zRHJhd24gPSAwOwogICAgU3RhdHMtPmR3VmVydGljZXNQcm9jZXNzZWQgPSAwOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0U3RhdHMoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RTVEFUUyAqU3RhdHMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGF0cyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19HZXRTdGF0cyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9HZXRTdGF0cyhJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEU1RBVFMgKlN0YXRzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGF0cyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19HZXRTdGF0cyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTo6Q3JlYXRlRXhlY3V0ZUJ1ZmZlcgogKgogKiBDcmVhdGVzIGFuIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIHVzZWQgZm9yIHJlbmRlcmluZyB3aXRoIGEKICogRGlyZWN0M0REZXZpY2UuCiAqCiAqIFZlcnNpb24gMSBvbmx5LgogKgogKiBQYXJhbXM6CiAqICBEZXNjOiBCdWZmZXIgZGVzY3JpcHRpb24KICogIEV4ZWN1dGVCdWZmZXI6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBJbnRlcmZhY2UgcG9pbnRlciBhdAogKiAgVW5rT3V0ZXI6IE11c3QgYmUgTlVMTC4gQmFzaWNhbGx5IGZvciBhZ2dyZWdhdGlvbiwgd2hpY2ggZGRyYXcgZG9lc24ndAogKiAgICAgICAgICAgIHN1cHBvcnQKICoKICogUmV0dXJuczoKICogIENMQVNTX0VfTk9BR0dSRUdBVElPTiBpZiBVbmtPdXRlciAhPSBOVUxMCiAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiB3ZSByYW4gb3V0IG9mIG1lbW9yeQogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8xX0NyZWF0ZUV4ZWN1dGVCdWZmZXIoSURpcmVjdDNERGV2aWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgKkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKipFeGVjdXRlQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwqIG9iamVjdDsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJXApIVxuIiwgVGhpcywgRGVzYywgRXhlY3V0ZUJ1ZmZlciwgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgLyogQWxsb2NhdGUgdGhlIG5ldyBFeGVjdXRlIEJ1ZmZlciAqLwogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCkpOwogICAgaWYoIW9iamVjdCkKICAgIHsKICAgICAgICBFUlIoIk91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGEgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgc3RydWN0dXJlXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CiAgICB9CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJfVnRibCk7CgogICAgb2JqZWN0LT5yZWYgPSAxOwogICAgb2JqZWN0LT5kM2RkZXYgPSBUaGlzOwoKICAgIC8qIEluaXRpYWxpemVzIG1lbW9yeSAqLwogICAgbWVtY3B5KCZvYmplY3QtPmRlc2MsIERlc2MsIERlc2MtPmR3U2l6ZSk7CgogICAgLyogTm8gYnVmZmVyIGdpdmVuICovCiAgICBpZiAoKG9iamVjdC0+ZGVzYy5kd0ZsYWdzICYgRDNEREVCX0xQREFUQSkgPT0gMCkKICAgICAgICBvYmplY3QtPmRlc2MubHBEYXRhID0gTlVMTDsKCiAgICAvKiBObyBidWZmZXIgc2l6ZSBnaXZlbiAqLwogICAgaWYgKChvYmplY3QtPmRlc2MuZHdGbGFncyAmIEQzRERFQl9CVUZTSVpFKSA9PSAwKQogICAgICAgIG9iamVjdC0+ZGVzYy5kd0J1ZmZlclNpemUgPSAwOwoKICAgIC8qIENyZWF0ZSBidWZmZXIgaWYgYXNrZWQgKi8KICAgIGlmICgob2JqZWN0LT5kZXNjLmxwRGF0YSA9PSBOVUxMKSAmJiAob2JqZWN0LT5kZXNjLmR3QnVmZmVyU2l6ZSA+IDApKQogICAgewogICAgICAgIG9iamVjdC0+bmVlZF9mcmVlID0gVFJVRTsKICAgICAgICBvYmplY3QtPmRlc2MubHBEYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxvYmplY3QtPmRlc2MuZHdCdWZmZXJTaXplKTsKICAgICAgICBpZighb2JqZWN0LT5kZXNjLmxwRGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgdGhlIGV4ZWN1dGUgYnVmZmVyIGRhdGFcbiIpOwogICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOwogICAgICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG9iamVjdC0+bmVlZF9mcmVlID0gRkFMU0U7CiAgICB9CgogICAgLyogTm8gdmVydGljZXMgZm9yIHRoZSBtb21lbnQgKi8KICAgIG9iamVjdC0+dmVydGV4X2RhdGEgPSBOVUxMOwoKICAgIG9iamVjdC0+ZGVzYy5kd0ZsYWdzIHw9IEQzRERFQl9MUERBVEE7CgogICAgb2JqZWN0LT5pbmRpY2VzID0gTlVMTDsKICAgIG9iamVjdC0+bmJfaW5kaWNlcyA9IDA7CgogICAgKkV4ZWN1dGVCdWZmZXIgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIpOwoKICAgIFRSQUNFKCIgUmV0dXJuaW5nIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgYXQgJXAsIGltcGxlbWVudGF0aW9uIGlzIGF0ICVwXG4iLCAqRXhlY3V0ZUJ1ZmZlciwgb2JqZWN0KTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlOjpFeGVjdXRlCiAqCiAqIEV4ZWN1dGVzIGFsbCB0aGUgc3R1ZmYgaW4gYW4gZXhlY3V0ZSBidWZmZXIuCiAqCiAqIFBhcmFtczoKICogIEV4ZWN1dGVCdWZmZXI6IFRoZSBidWZmZXIgdG8gZXhlY3V0ZQogKiAgVmlld3BvcnQ6IFRoZSB2aWV3cG9ydCB1c2VkIGZvciByZW5kZXJpbmcKICogIEZsYWdzOiBTb21lIGZsYWdzCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEV4ZWN1dGVCdWZmZXIgPT0gTlVMTAogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8xX0V4ZWN1dGUoSURpcmVjdDNERGV2aWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqRXhlY3V0ZUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQgKlZpZXdwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCAqRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBFeGVjdXRlQnVmZmVyKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqRGlyZWN0M0RWaWV3cG9ydEltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgVmlld3BvcnQpOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJTA4eClcbiIsIFRoaXMsIERpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIERpcmVjdDNEVmlld3BvcnRJbXBsLCBGbGFncyk7CgogICAgaWYoIURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgLyogRXhlY3V0ZS4uLiAqLwogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfRXhlY3V0ZShEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBUaGlzLCBEaXJlY3QzRFZpZXdwb3J0SW1wbCk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTM6OkFkZFZpZXdwb3J0CiAqCiAqIEFkZCBhIERpcmVjdDNEVmlld3BvcnQgdG8gdGhlIGRldmljZSdzIHZpZXdwb3J0IGxpc3QuIFRoZXNlIHZpZXdwb3J0cwogKiBhcmUgd3JhcHBlZCB0byBJRGlyZWN0M0REZXZpY2U3IHZpZXdwb3J0cyBpbiB2aWV3cG9ydC5jCiAqCiAqIEV4aXN0cyBpbiBWZXJzaW9uIDEsIDIgYW5kIDMuIE5vdGUgdGhhdCBJRGlyZWN0M0RWaWV3cG9ydCAxLCAyIGFuZCAzCiAqIGFyZSB0aGUgc2FtZSBpbnRlcmZhY2VzLgogKgogKiBQYXJhbXM6CiAqICBWaWV3cG9ydDogVGhlIHZpZXdwb3J0IHRvIGFkZAogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBWaWV3cG9ydCA9PSBOVUxMCiAqICBEM0RfT0sgb24gc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzNfQWRkVmlld3BvcnQoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDMgKlZpZXdwb3J0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZwID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIFZpZXdwb3J0KTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgdnApOwoKICAgIC8qIFNhbml0eSBjaGVjayAqLwogICAgaWYoIXZwKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIHZwLT5uZXh0ID0gVGhpcy0+dmlld3BvcnRfbGlzdDsKICAgIFRoaXMtPnZpZXdwb3J0X2xpc3QgPSB2cDsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0FkZFZpZXdwb3J0KElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQyICpEaXJlY3QzRFZpZXdwb3J0MikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBEaXJlY3QzRFZpZXdwb3J0Mik7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgdnApOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfQWRkVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRSh2cCwgSURpcmVjdDNEVmlld3BvcnQzKSk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfQWRkVmlld3BvcnQoSURpcmVjdDNERGV2aWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0ICpEaXJlY3QzRFZpZXdwb3J0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgRGlyZWN0M0RWaWV3cG9ydCk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgdnApOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfQWRkVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRSh2cCwgSURpcmVjdDNEVmlld3BvcnQzKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2UzOjpEZWxldGVWaWV3cG9ydAogKgogKiBEZWxldGVzIGEgRGlyZWN0M0RWaWV3cG9ydCBmcm9tIHRoZSBkZXZpY2UncyB2aWV3cG9ydCBsaXN0LgogKgogKiBFeGlzdHMgaW4gVmVyc2lvbiAxLCAyIGFuZCAzLiBOb3RlIHRoYXQgYWxsIFZpZXdwb3J0IGludGVyZmFjZSB2ZXJzaW9ucwogKiBhcmUgZXF1YWwuCiAqCiAqIFBhcmFtczoKICogIFZpZXdwb3J0OiBUaGUgdmlld3BvcnQgdG8gZGVsZXRlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiB0aGUgdmlld3BvcnQgd2Fzbid0IGZvdW5kIGluIHRoZSBsaXN0CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfM19EZWxldGVWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqVmlld3BvcnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSAoSURpcmVjdDNEVmlld3BvcnRJbXBsICopIFZpZXdwb3J0OwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpjdXJfdmlld3BvcnQsICpwcmV2X3ZpZXdwb3J0ID0gTlVMTDsKCiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgdnApOwoKICAgIGN1cl92aWV3cG9ydCA9IFRoaXMtPnZpZXdwb3J0X2xpc3Q7CiAgICB3aGlsZSAoY3VyX3ZpZXdwb3J0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgaWYgKGN1cl92aWV3cG9ydCA9PSB2cCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcmV2X3ZpZXdwb3J0ID09IE5VTEwpIFRoaXMtPnZpZXdwb3J0X2xpc3QgPSBjdXJfdmlld3BvcnQtPm5leHQ7CiAgICAgICAgICAgIGVsc2UgcHJldl92aWV3cG9ydC0+bmV4dCA9IGN1cl92aWV3cG9ydC0+bmV4dDsKICAgICAgICAgICAgLyogVE9ETyA6IGFkZCBkZXNhY3RpdmF0ZSBvZiB0aGUgdmlld3BvcnQgYW5kIGFsbCBhc3NvY2lhdGVkIGxpZ2h0cy4uLiAqLwogICAgICAgICAgICByZXR1cm4gRDNEX09LOwogICAgICAgIH0KICAgICAgICBwcmV2X3ZpZXdwb3J0ID0gY3VyX3ZpZXdwb3J0OwogICAgICAgIGN1cl92aWV3cG9ydCA9IGN1cl92aWV3cG9ydC0+bmV4dDsKICAgIH0KCiAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EZWxldGVWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MiAqRGlyZWN0M0RWaWV3cG9ydDIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgRGlyZWN0M0RWaWV3cG9ydDIpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIHZwKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0RlbGV0ZVZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UodnAsIElEaXJlY3QzRFZpZXdwb3J0MykpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0RlbGV0ZVZpZXdwb3J0KElEaXJlY3QzRERldmljZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydCAqRGlyZWN0M0RWaWV3cG9ydCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZwID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIERpcmVjdDNEVmlld3BvcnQpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIHZwKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0RlbGV0ZVZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UodnAsIElEaXJlY3QzRFZpZXdwb3J0MykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlMzo6TmV4dFZpZXdwb3J0CiAqCiAqIFJldHVybnMgYSB2aWV3cG9ydCBmcm9tIHRoZSB2aWV3cG9ydCBsaXN0LCBkZXBlbmRpbmcgb24gdGhlCiAqIHBhc3NlZCB2aWV3cG9ydCBhbmQgdGhlIGZsYWdzLgogKgogKiBFeGlzdHMgaW4gVmVyc2lvbiAxLCAyIGFuZCAzLiBOb3RlIHRoYXQgYWxsIFZpZXdwb3J0IGludGVyZmFjZSB2ZXJzaW9ucwogKiBhcmUgZXF1YWwuCiAqCiAqIFBhcmFtczoKICogIFZpZXdwb3J0OiBWaWV3cG9ydCB0byB1c2UgZm9yIGJlZ2lubmluZyB0aGUgc2VhcmNoCiAqICBGbGFnczogRDNETkVYVF9ORVhULCBEM0RORVhUX0hFQUQgb3IgRDNETkVYVF9UQUlMCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiB0aGUgZmxhZ3Mgd2VyZSB3cm9uZywgb3IgVmlld3BvcnQgd2FzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8zX05leHRWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDMgKlZpZXdwb3J0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDMgKipscGxwRGlyZWN0M0RWaWV3cG9ydDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgVmlld3BvcnQzKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqcmVzID0gTlVMTDsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCUwOHgpXG4iLCBUaGlzLCB2cCwgbHBscERpcmVjdDNEVmlld3BvcnQzLCBGbGFncyk7CgogICAgaWYoIXZwKQogICAgewogICAgICAgICpscGxwRGlyZWN0M0RWaWV3cG9ydDMgPSBOVUxMOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKCiAgICBzd2l0Y2ggKEZsYWdzKQogICAgewogICAgICAgIGNhc2UgRDNETkVYVF9ORVhUOgogICAgICAgIHsKICAgICAgICAgICAgcmVzID0gdnAtPm5leHQ7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRDNETkVYVF9IRUFEOgogICAgICAgIHsKICAgICAgICAgICAgcmVzID0gVGhpcy0+dmlld3BvcnRfbGlzdDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RORVhUX1RBSUw6CiAgICAgICAgewogICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cl92aWV3cG9ydCA9IFRoaXMtPnZpZXdwb3J0X2xpc3Q7CiAgICAgICAgICAgIGlmIChjdXJfdmlld3BvcnQgIT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2hpbGUgKGN1cl92aWV3cG9ydC0+bmV4dCAhPSBOVUxMKSBjdXJfdmlld3BvcnQgPSBjdXJfdmlld3BvcnQtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzID0gY3VyX3ZpZXdwb3J0OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAqbHBscERpcmVjdDNEVmlld3BvcnQzID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgKmxwbHBEaXJlY3QzRFZpZXdwb3J0MyA9IElDT01fSU5URVJGQUNFKHJlcywgSURpcmVjdDNEVmlld3BvcnQzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfTmV4dFZpZXdwb3J0KElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MiAqVmlld3BvcnQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MiAqKmxwbHBEaXJlY3QzRFZpZXdwb3J0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBWaWV3cG9ydDIpOwogICAgSURpcmVjdDNEVmlld3BvcnQzICpyZXM7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwLCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgdnAsIGxwbHBEaXJlY3QzRFZpZXdwb3J0MiwgRmxhZ3MpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2UzX05leHRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UodnAsIElEaXJlY3QzRFZpZXdwb3J0MyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKICAgICpscGxwRGlyZWN0M0RWaWV3cG9ydDIgPSAoSURpcmVjdDNEVmlld3BvcnQyICopIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgSURpcmVjdDNEVmlld3BvcnQzLCByZXMpOwogICAgcmV0dXJuIGhyOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX05leHRWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0ICpWaWV3cG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydCAqKmxwbHBEaXJlY3QzRFZpZXdwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgVmlld3BvcnQpOwogICAgSURpcmVjdDNEVmlld3BvcnQzICpyZXM7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwLCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgdnAsIGxwbHBEaXJlY3QzRFZpZXdwb3J0LCBGbGFncyk7CiAgICBociA9IElEaXJlY3QzRERldmljZTNfTmV4dFZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRSh2cCwgSURpcmVjdDNEVmlld3BvcnQzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwogICAgKmxwbHBEaXJlY3QzRFZpZXdwb3J0ID0gKElEaXJlY3QzRFZpZXdwb3J0ICopIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgSURpcmVjdDNEVmlld3BvcnQzLCByZXMpOwogICAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlOjpQaWNrCiAqCiAqIEV4ZWN1dGVzIGFuIGV4ZWN1dGUgYnVmZmVyIHdpdGhvdXQgcGVyZm9ybWluZyByZW5kZXJpbmcuIEluc3RlYWQsIGEKICogbGlzdCBvZiBwcmltaXRpdmVzIHRoYXQgaW50ZXJzZWN0IHdpdGggKHgxLHkxKSBvZiB0aGUgcGFzc2VkIHJlY3RhbmdsZQogKiBpcyBjcmVhdGVkLiBJRGlyZWN0M0REZXZpY2U6OkdldFBpY2tSZWNvcmRzIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlCiAqIHRoaXMgbGlzdC4KICoKICogVmVyc2lvbiAxIG9ubHkKICoKICogUGFyYW1zOgogKiAgRXhlY3V0ZUJ1ZmZlcjogQnVmZmVyIHRvIGV4ZWN1dGUKICogIFZpZXdwb3J0OiBWaWV3cG9ydCB0byB1c2UgZm9yIGV4ZWN1dGlvbgogKiAgRmxhZ3M6IE5vbmUgYXJlIGRlZmluZWQsIGFjY29yZGluZyB0byB0aGUgU0RLCiAqICBSZWN0OiBTcGVjaWZpZXMgdGhlIGNvb3JkaW5hdGVzIHRvIGJlIHBpY2tlZC4gT25seSB4MSBhbmQgeTIgYXJlIHVzZWQsCiAqICAgICAgICB4MiBhbmQgeTIgYXJlIGlnbm9yZWQuCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzFfUGljayhJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICpFeGVjdXRlQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydCAqVmlld3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRUNUICpSZWN0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsICpleGVjYnVmID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIEV4ZWN1dGVCdWZmZXIpOwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBWaWV3cG9ydCk7CiAgICBGSVhNRSgiKCVwKS0+KCVwLCVwLCUwOHgsJXApOiBzdHViIVxuIiwgVGhpcywgZXhlY2J1ZiwgdnAsIEZsYWdzLCBSZWN0KTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlOjpHZXRQaWNrUmVjb3JkcwogKgogKiBSZXRyaWV2ZXMgdGhlIHBpY2sgcmVjb3JkcyBnZW5lcmF0ZWQgYnkgSURpcmVjdDNERGV2aWNlOjpHZXRQaWNrUmVjb3JkcwogKgogKiBWZXJzaW9uIDEgb25seQogKgogKiBQYXJhbXM6CiAqICBDb3VudDogUG9pbnRlciB0byBhIERXT1JEIGNvbnRhaW5pbmcgdGhlIG51bWJlcnMgb2YgcGljayByZWNvcmRzIHRvCiAqICAgICAgICAgcmV0cmlldmUKICogIEQzRFBpY2tSZWM6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyBEM0RQSUNLUkVDT1JEIGFycnkuCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldFBpY2tSZWNvcmRzKElEaXJlY3QzRERldmljZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQSUNLUkVDT1JEICpEM0RQaWNrUmVjKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIEZJWE1FKCIoJXApLT4oJXAsJXApOiBzdHViIVxuIiwgVGhpcywgQ291bnQsIEQzRFBpY2tSZWMpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpFbnVtVGV4dHVyZWZvcm1hdHMKICoKICogRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIHRleHR1cmUgZm9ybWF0cy4gSXQgaGFzIGEgbGlzdCBvZiBhbGwgcG9zc2libGUKICogZm9ybWF0cyBhbmQgY2FsbHMgSVdpbmVEM0Q6OkNoZWNrRGV2aWNlRm9ybWF0IGZvciBlYWNoIGZvcm1hdCB0byBzZWUgaWYKICogV2luZUQzRCBzdXBwb3J0cyBpdC4gSWYgc28sIHRoZW4gaXQgaXMgcGFzc2VkIHRvIHRoZSBhcHAuCiAqCiAqIFRoaXMgaXMgZm9yIFZlcnNpb24gNyBhbmQgMywgb2xkZXIgdmVyc2lvbnMgaGF2ZSBhIGRpZmZlcmVudAogKiBjYWxsYmFjayBmdW5jdGlvbiBhbmQgdGhlaXIgb3duIGltcGxlbWVudGF0aW9uCiAqCiAqIFBhcmFtczoKICogIENhbGxiYWNrOiBDYWxsYmFjayB0byBjYWxsIGZvciBlYWNoIGVudW1lcmF0ZWQgZm9ybWF0CiAqICBBcmc6IEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBDYWxsYmFjayA9PSBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19FbnVtVGV4dHVyZUZvcm1hdHMoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQXJnKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgaW50IGk7CgogICAgV0lORUQzREZPUk1BVCBGb3JtYXRMaXN0W10gPSB7CiAgICAgICAgLyogMzIgYml0ICovCiAgICAgICAgV0lORUQzREZNVF9BOFI4RzhCOCwKICAgICAgICBXSU5FRDNERk1UX1g4UjhHOEI4LAogICAgICAgIC8qIDI0IGJpdCAqLwogICAgICAgIFdJTkVEM0RGTVRfUjhHOEI4LAogICAgICAgIC8qIDE2IEJpdCAqLwogICAgICAgIFdJTkVEM0RGTVRfQTFSNUc1QjUsCiAgICAgICAgV0lORUQzREZNVF9BNFI0RzRCNCwKICAgICAgICBXSU5FRDNERk1UX1I1RzZCNSwKICAgICAgICBXSU5FRDNERk1UX1gxUjVHNUI1LAogICAgICAgIC8qIDggQml0ICovCiAgICAgICAgV0lORUQzREZNVF9SM0czQjIsCiAgICAgICAgV0lORUQzREZNVF9QOCwKICAgICAgICAvKiBGT1VSQ0MgY29kZXMgKi8KICAgICAgICBXSU5FRDNERk1UX0RYVDEsCiAgICAgICAgV0lORUQzREZNVF9EWFQzLAogICAgICAgIFdJTkVEM0RGTVRfRFhUNSwKICAgIH07CgogICAgV0lORUQzREZPUk1BVCBCdW1wRm9ybWF0TGlzdFtdID0gewogICAgICAgIFdJTkVEM0RGTVRfVjhVOCwKICAgICAgICBXSU5FRDNERk1UX0w2VjVVNSwKICAgICAgICBXSU5FRDNERk1UX1g4TDhWOFU4LAogICAgICAgIFdJTkVEM0RGTVRfUThXOFY4VTgsCiAgICAgICAgV0lORUQzREZNVF9WMTZVMTYsCiAgICAgICAgV0lORUQzREZNVF9XMTFWMTFVMTAsCiAgICAgICAgV0lORUQzREZNVF9BMlcxMFYxMFUxMAogICAgfTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKTogUmVsYXlcbiIsIFRoaXMsIENhbGxiYWNrLCBBcmcpOwoKICAgIGlmKCFDYWxsYmFjaykKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YoRm9ybWF0TGlzdCkgLyBzaXplb2YoV0lORUQzREZPUk1BVCk7IGkrKykKICAgIHsKICAgICAgICBociA9IElXaW5lRDNEX0NoZWNrRGV2aWNlRm9ybWF0KFRoaXMtPmRkcmF3LT53aW5lRDNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBBZGFwdGVyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBEZXZpY2VUeXBlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBBZGFwdGVyRm9ybWF0ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBVc2FnZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogUmVzb3VyY2VUeXBlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0TGlzdFtpXSk7CiAgICAgICAgaWYoaHIgPT0gRDNEX09LKQogICAgICAgIHsKICAgICAgICAgICAgRERQSVhFTEZPUk1BVCBwZm9ybWF0OwoKICAgICAgICAgICAgbWVtc2V0KCZwZm9ybWF0LCAwLCBzaXplb2YocGZvcm1hdCkpOwogICAgICAgICAgICBwZm9ybWF0LmR3U2l6ZSA9IHNpemVvZihwZm9ybWF0KTsKICAgICAgICAgICAgUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoJnBmb3JtYXQsIEZvcm1hdExpc3RbaV0pOwoKICAgICAgICAgICAgVFJBQ0UoIkVudW1lcmF0aW5nIFdpbmVEM0RGb3JtYXQgJWRcbiIsIEZvcm1hdExpc3RbaV0pOwogICAgICAgICAgICBociA9IENhbGxiYWNrKCZwZm9ybWF0LCBBcmcpOwogICAgICAgICAgICBpZihociAhPSBEREVOVU1SRVRfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJGb3JtYXQgZW51bWVyYXRpb24gY2FuY2VsbGVkIGJ5IGFwcGxpY2F0aW9uXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RfT0s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKEJ1bXBGb3JtYXRMaXN0KSAvIHNpemVvZihXSU5FRDNERk9STUFUKTsgaSsrKQogICAgewogICAgICAgIGhyID0gSVdpbmVEM0RfQ2hlY2tEZXZpY2VGb3JtYXQoVGhpcy0+ZGRyYXctPndpbmVEM0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEFkYXB0ZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIERldmljZVR5cGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEFkYXB0ZXJGb3JtYXQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVVNBR0VfUVVFUllfTEVHQUNZQlVNUE1BUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogUmVzb3VyY2VUeXBlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVtcEZvcm1hdExpc3RbaV0pOwogICAgICAgIGlmKGhyID09IEQzRF9PSykKICAgICAgICB7CiAgICAgICAgICAgIEREUElYRUxGT1JNQVQgcGZvcm1hdDsKCiAgICAgICAgICAgIG1lbXNldCgmcGZvcm1hdCwgMCwgc2l6ZW9mKHBmb3JtYXQpKTsKICAgICAgICAgICAgcGZvcm1hdC5kd1NpemUgPSBzaXplb2YocGZvcm1hdCk7CiAgICAgICAgICAgIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKCZwZm9ybWF0LCBCdW1wRm9ybWF0TGlzdFtpXSk7CgogICAgICAgICAgICBUUkFDRSgiRW51bWVyYXRpbmcgV2luZUQzREZvcm1hdCAlZFxuIiwgQnVtcEZvcm1hdExpc3RbaV0pOwogICAgICAgICAgICBociA9IENhbGxiYWNrKCZwZm9ybWF0LCBBcmcpOwogICAgICAgICAgICBpZihociAhPSBEREVOVU1SRVRfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJGb3JtYXQgZW51bWVyYXRpb24gY2FuY2VsbGVkIGJ5IGFwcGxpY2F0aW9uXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RfT0s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBUUkFDRSgiRW5kIG9mIGVudW1lcmF0aW9uXG4iKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRW51bVRleHR1cmVGb3JtYXRzKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkFyZykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIENhbGxiYWNrLCBBcmcpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRW51bVRleHR1cmVGb3JtYXRzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2UyOjpFbnVtVGV4dHVyZWZvcm1hdHMKICoKICogRW51bVRleHR1cmVGb3JtYXRzIGZvciBWZXJzaW9uIDEgYW5kIDIsIHNlZQogKiBJRGlyZWN0M0REZXZpY2U3OjpFbnVtVGV4dXJlRm9ybWF0cyBmb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uLgogKgogKiBUaGlzIHZlcnNpb24gaGFzIGEgZGlmZmVyZW50IGNhbGxiYWNrIGFuZCBkb2VzIG5vdCBlbnVtZXJhdGUgRm91ckNDCiAqIGZvcm1hdHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8yX0VudW1UZXh0dXJlRm9ybWF0cyhJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1URVhUVVJFRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkFyZykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIGludCBpOwoKICAgIFdJTkVEM0RGT1JNQVQgRm9ybWF0TGlzdFtdID0gewogICAgICAgIC8qIDMyIGJpdCAqLwogICAgICAgIFdJTkVEM0RGTVRfQThSOEc4QjgsCiAgICAgICAgV0lORUQzREZNVF9YOFI4RzhCOCwKICAgICAgICAvKiAyNCBiaXQgKi8KICAgICAgICBXSU5FRDNERk1UX1I4RzhCOCwKICAgICAgICAvKiAxNiBCaXQgKi8KICAgICAgICBXSU5FRDNERk1UX0ExUjVHNUI1LAogICAgICAgIFdJTkVEM0RGTVRfQTRSNEc0QjQsCiAgICAgICAgV0lORUQzREZNVF9SNUc2QjUsCiAgICAgICAgV0lORUQzREZNVF9YMVI1RzVCNSwKICAgICAgICAvKiA4IEJpdCAqLwogICAgICAgIFdJTkVEM0RGTVRfUjNHM0IyLAogICAgICAgIFdJTkVEM0RGTVRfUDgsCiAgICAgICAgLyogRk9VUkNDIGNvZGVzIC0gTm90IGluIHRoaXMgdmVyc2lvbiovCiAgICB9OwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApOiBSZWxheVxuIiwgVGhpcywgQ2FsbGJhY2ssIEFyZyk7CgogICAgaWYoIUNhbGxiYWNrKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGZvcihpID0gMDsgaSA8IHNpemVvZihGb3JtYXRMaXN0KSAvIHNpemVvZihXSU5FRDNERk9STUFUKTsgaSsrKQogICAgewogICAgICAgIGhyID0gSVdpbmVEM0RfQ2hlY2tEZXZpY2VGb3JtYXQoVGhpcy0+ZGRyYXctPndpbmVEM0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEFkYXB0ZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIERldmljZVR5cGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEFkYXB0ZXJGb3JtYXQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFVzYWdlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBSZXNvdXJjZVR5cGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRMaXN0W2ldKTsKICAgICAgICBpZihociA9PSBEM0RfT0spCiAgICAgICAgewogICAgICAgICAgICBERFNVUkZBQ0VERVNDIHNkZXNjOwoKICAgICAgICAgICAgbWVtc2V0KCZzZGVzYywgMCwgc2l6ZW9mKHNkZXNjKSk7CiAgICAgICAgICAgIHNkZXNjLmR3U2l6ZSA9IHNpemVvZihzZGVzYyk7CiAgICAgICAgICAgIHNkZXNjLmR3RmxhZ3MgPSBERFNEX1BJWEVMRk9STUFUIHwgRERTRF9DQVBTOwogICAgICAgICAgICBzZGVzYy5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRTsKICAgICAgICAgICAgc2Rlc2MuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihzZGVzYy5kZHBmUGl4ZWxGb3JtYXQpOwogICAgICAgICAgICBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERCgmc2Rlc2MuZGRwZlBpeGVsRm9ybWF0LCBGb3JtYXRMaXN0W2ldKTsKCiAgICAgICAgICAgIFRSQUNFKCJFbnVtZXJhdGluZyBXaW5lRDNERm9ybWF0ICVkXG4iLCBGb3JtYXRMaXN0W2ldKTsKICAgICAgICAgICAgaHIgPSBDYWxsYmFjaygmc2Rlc2MsIEFyZyk7CiAgICAgICAgICAgIGlmKGhyICE9IERERU5VTVJFVF9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIkZvcm1hdCBlbnVtZXJhdGlvbiBjYW5jZWxsZWQgYnkgYXBwbGljYXRpb25cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEQzRF9PSzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFRSQUNFKCJFbmQgb2YgZW51bWVyYXRpb25cbiIpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9FbnVtVGV4dHVyZUZvcm1hdHMoSURpcmVjdDNERGV2aWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1URVhUVVJFRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkFyZykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTIgaW50ZXJmYWNlLlxuIiwgVGhpcywgQ2FsbGJhY2ssIEFyZyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlMl9FbnVtVGV4dHVyZUZvcm1hdHMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTo6Q3JlYXRlTWF0cml4CiAqCiAqIENyZWF0ZXMgYSBtYXRyaXggaGFuZGxlLiBBIGhhbmRsZSBpcyBjcmVhdGVkIGFuZCBtZW1vcnkgZm9yIGEgRDNETUFUUklYIGlzCiAqIGFsbG9jYXRlZCBmb3IgdGhlIGhhbmRsZS4KICoKICogVmVyc2lvbiAxIG9ubHkKICoKICogUGFyYW1zCiAqICBEM0RNYXRIYW5kbGU6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBoYW5kbGUgYXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEQzRE1hdEhhbmRsZSA9IE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8xX0NyZWF0ZU1hdHJpeChJRGlyZWN0M0REZXZpY2UgKmlmYWNlLCBEM0RNQVRSSVhIQU5ETEUgKkQzRE1hdEhhbmRsZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CiAgICBEM0RNQVRSSVggKk1hdHJpeDsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBEM0RNYXRIYW5kbGUpOwoKICAgIGlmKCFEM0RNYXRIYW5kbGUpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgTWF0cml4ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihEM0RNQVRSSVgpKTsKICAgIGlmKCFNYXRyaXgpCiAgICB7CiAgICAgICAgRVJSKCJPdXQgb2YgbWVtb3J5IHdoZW4gYWxsb2NhdGluZyBhIEQzRE1BVFJJWFxuIik7CiAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwogICAgfQogICAgKkQzRE1hdEhhbmRsZSA9IElEaXJlY3QzRERldmljZUltcGxfQ3JlYXRlSGFuZGxlKFRoaXMpOwogICAgaWYoISgqRDNETWF0SGFuZGxlKSkKICAgIHsKICAgICAgICBFUlIoIkZhaWxlZCB0byBjcmVhdGUgYSBtYXRyaXggaGFuZGxlXG4iKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBNYXRyaXgpOwogICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKICAgIH0KICAgIFRoaXMtPkhhbmRsZXNbKERXT1JEKSAqRDNETWF0SGFuZGxlIC0gMV0ucHRyID0gTWF0cml4OwogICAgVGhpcy0+SGFuZGxlc1soRFdPUkQpICpEM0RNYXRIYW5kbGUgLSAxXS50eXBlID0gRERyYXdIYW5kbGVfTWF0cml4OwogICAgVFJBQ0UoIiByZXR1cm5pbmcgbWF0cml4IGhhbmRsZSAlZFxuIiwgKkQzRE1hdEhhbmRsZSk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTo6U2V0TWF0cml4CiAqCiAqIFNldHMgYSBtYXRyaXggZm9yIGEgbWF0cml4IGhhbmRsZS4gVGhlIG1hdHJpeCBpcyBjb3BpZWQgaW50byB0aGUgbWVtb3J5CiAqIGFsbG9jYXRlZCBmb3IgdGhlIGhhbmRsZQogKgogKiBWZXJzaW9uIDEgb25seQogKgogKiBQYXJhbXM6CiAqICBEM0RNYXRIYW5kbGU6IEhhbmRsZSB0byBzZXQgdGhlIG1hdHJpeCB0bwogKiAgRDNETWF0cml4OiBNYXRyaXggdG8gc2V0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiB0aGUgaGFuZGxlIG9mIHRoZSBtYXRyaXggaXMgaW52YWxpZCBvciB0aGUgbWF0cml4CiAqICAgdG8gc2V0IGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8xX1NldE1hdHJpeChJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWEhBTkRMRSBEM0RNYXRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYICpEM0RNYXRyaXgpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKVxuIiwgVGhpcywgKERXT1JEKSBEM0RNYXRIYW5kbGUsIEQzRE1hdHJpeCk7CgogICAgaWYoICghRDNETWF0SGFuZGxlKSB8fCAoIUQzRE1hdHJpeCkgKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGlmKEQzRE1hdEhhbmRsZSA+IFRoaXMtPm51bUhhbmRsZXMpCiAgICB7CiAgICAgICAgRVJSKCJIYW5kbGUgJWQgb3V0IG9mIHJhbmdlXG4iLCBEM0RNYXRIYW5kbGUpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQogICAgZWxzZSBpZihUaGlzLT5IYW5kbGVzW0QzRE1hdEhhbmRsZSAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfTWF0cml4KQogICAgewogICAgICAgIEVSUigiSGFuZGxlICVkIGlzIG5vdCBhIG1hdHJpeCBoYW5kbGVcbiIsIEQzRE1hdEhhbmRsZSk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgaWYgKFRSQUNFX09OKGQzZDcpKQogICAgICAgIGR1bXBfRDNETUFUUklYKEQzRE1hdHJpeCk7CgogICAgKigoRDNETUFUUklYICopIFRoaXMtPkhhbmRsZXNbRDNETWF0SGFuZGxlIC0gMV0ucHRyKSA9ICpEM0RNYXRyaXg7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTo6U2V0TWF0cml4CiAqCiAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgYSBEM0RNQVRSSVggaGFuZGxlCiAqCiAqIFZlcnNpb24gMSBvbmx5CiAqCiAqIFBhcmFtczoKICogIEQzRE1hdEhhbmRsZTogTWF0cml4IGhhbmRsZSB0byByZWFkIHRoZSBjb250ZW50IGZyb20KICogIEQzRE1hdHJpeDogQWRkcmVzcyB0byBzdG9yZSB0aGUgY29udGVudCBhdAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRDNETWF0SGFuZGxlIGlzIGludmFsaWQgb3IgRDNETWF0cml4IGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldE1hdHJpeChJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWEhBTkRMRSBEM0RNYXRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYICpEM0RNYXRyaXgpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKVxuIiwgVGhpcywgKERXT1JEKSBEM0RNYXRIYW5kbGUsIEQzRE1hdHJpeCk7CgogICAgaWYoIUQzRE1hdHJpeCkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIGlmKCFEM0RNYXRIYW5kbGUpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgaWYoRDNETWF0SGFuZGxlID4gVGhpcy0+bnVtSGFuZGxlcykKICAgIHsKICAgICAgICBFUlIoIkhhbmRsZSAlZCBvdXQgb2YgcmFuZ2VcbiIsIEQzRE1hdEhhbmRsZSk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CiAgICBlbHNlIGlmKFRoaXMtPkhhbmRsZXNbRDNETWF0SGFuZGxlIC0gMV0udHlwZSAhPSBERHJhd0hhbmRsZV9NYXRyaXgpCiAgICB7CiAgICAgICAgRVJSKCJIYW5kbGUgJWQgaXMgbm90IGEgbWF0cml4IGhhbmRsZVxuIiwgRDNETWF0SGFuZGxlKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICAvKiBUaGUgaGFuZGxlIGlzIHNpbXBseSBhIHBvaW50ZXIgdG8gYSBEM0RNQVRSSVggc3RydWN0dXJlICovCiAgICAqRDNETWF0cml4ID0gKigoRDNETUFUUklYICopIFRoaXMtPkhhbmRsZXNbRDNETWF0SGFuZGxlIC0gMV0ucHRyKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlOjpEZWxldGVNYXRyaXgKICoKICogRGVzdHJveXMgYSBNYXRyaXggaGFuZGxlLiBGcmVlcyB0aGUgbWVtb3J5IGFuZCB1bnNldHMgdGhlIGhhbmRsZSBkYXRhCiAqCiAqIFZlcnNpb24gMSBvbmx5CiAqCiAqIFBhcmFtczoKICogIEQzRE1hdEhhbmRsZTogSGFuZGxlIHRvIGRlc3Ryb3kKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEQzRE1hdEhhbmRsZSBpcyBpbnZhbGlkCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfMV9EZWxldGVNYXRyaXgoSURpcmVjdDNERGV2aWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVhIQU5ETEUgRDNETWF0SGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJTA4eClcbiIsIFRoaXMsIChEV09SRCkgRDNETWF0SGFuZGxlKTsKCiAgICBpZighRDNETWF0SGFuZGxlKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGlmKEQzRE1hdEhhbmRsZSA+IFRoaXMtPm51bUhhbmRsZXMpCiAgICB7CiAgICAgICAgRVJSKCJIYW5kbGUgJWQgb3V0IG9mIHJhbmdlXG4iLCBEM0RNYXRIYW5kbGUpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQogICAgZWxzZSBpZihUaGlzLT5IYW5kbGVzW0QzRE1hdEhhbmRsZSAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfTWF0cml4KQogICAgewogICAgICAgIEVSUigiSGFuZGxlICVkIGlzIG5vdCBhIG1hdHJpeCBoYW5kbGVcbiIsIEQzRE1hdEhhbmRsZSk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+SGFuZGxlc1tEM0RNYXRIYW5kbGUgLSAxXS5wdHIpOwogICAgVGhpcy0+SGFuZGxlc1tEM0RNYXRIYW5kbGUgLSAxXS5wdHIgPSBOVUxMOwogICAgVGhpcy0+SGFuZGxlc1tEM0RNYXRIYW5kbGUgLSAxXS50eXBlID0gRERyYXdIYW5kbGVfVW5rbm93bjsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6QmVnaW5TY2VuZQogKgogKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlbmRlcmluZyBpcyBwZXJmb3JtZWQuCiAqIElEaXJlY3QzRERldmljZTo6RW5kU2NlbmUgaGFzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgc2NlbmUgaXMgY29tcGxldGUKICoKICogVmVyc2lvbiAxLCAyLCAzIGFuZCA3CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcywgZm9yIGRldGFpbHMgc2VlIElXaW5lRDNERGV2aWNlOjpCZWdpblNjZW5lCiAqICBEM0RFUlJfU0NFTkVfSU5fU0NFTkUgaWYgV2luZUQzRCByZXR1cm5zIGFuIGVycm9yKE9ubHkgaW4gY2FzZSBvZiBhbiBhbHJlYWR5CiAqICBzdGFydGVkIHNjZW5lKS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0JlZ2luU2NlbmUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKTogUmVsYXlcbiIsIFRoaXMpOwoKICAgIGhyID0gSVdpbmVEM0REZXZpY2VfQmVnaW5TY2VuZShUaGlzLT53aW5lRDNERGV2aWNlKTsKICAgIGlmKGhyID09IFdJTkVEM0RfT0spIHJldHVybiBEM0RfT0s7CiAgICBlbHNlIHJldHVybiBEM0RFUlJfU0NFTkVfSU5fU0NFTkU7IC8qIFRPRE86IE90aGVyIHBvc3NpYmxlIGNhdXNlcyBvZiBmYWlsdXJlICovCn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW5TY2VuZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0JlZ2luU2NlbmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNykpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0JlZ2luU2NlbmUoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19CZWdpblNjZW5lKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9CZWdpblNjZW5lKElEaXJlY3QzRERldmljZSAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0JlZ2luU2NlbmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6RW5kU2NlbmUKICoKICogRW5kcyBhIHNjZW5lIHRoYXQgaGFzIGJlZW4gYmVndW4gd2l0aCBJRGlyZWN0M0REZXZpY2U3OjpCZWdpblNjZW5lLgogKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciByZW5kZXJpbmcgaXMgZmluaXNoZWQuCiAqCiAqIFZlcnNpb24gMSwgMiwgMyBhbmQgNwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MsIGZvciBkZXRhaWxzIHNlZSBJV2luZUQzRERldmljZTo6RW5kU2NlbmUKICogIEQzREVSUl9TQ0VORV9OT1RfSU5fU0NFTkUgaXMgcmV0dXJuZWQgaWYgV2luZUQzRCByZXR1cm5zIGFuIGVycm9yLiBJdCBkb2VzCiAqICB0aGF0IG9ubHkgaWYgdGhlIHNjZW5lIHdhcyBhbHJlYWR5IGVuZGVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfRW5kU2NlbmUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKTogUmVsYXlcbiIsIFRoaXMpOwoKICAgIGhyID0gSVdpbmVEM0REZXZpY2VfRW5kU2NlbmUoVGhpcy0+d2luZUQzRERldmljZSk7CiAgICBpZihociA9PSBXSU5FRDNEX09LKSByZXR1cm4gRDNEX09LOwogICAgZWxzZSByZXR1cm4gRDNERVJSX1NDRU5FX05PVF9JTl9TQ0VORTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19FbmRTY2VuZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9FbmRTY2VuZShJRGlyZWN0M0REZXZpY2UyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9FbmRTY2VuZShJRGlyZWN0M0REZXZpY2UgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19FbmRTY2VuZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpHZXREaXJlY3QzRAogKgogKiBSZXR1cm5zIHRoZSBJRGlyZWN0M0QoPSBpbnRlcmZhY2UgdG8gdGhlIERpcmVjdERyYXcgb2JqZWN0KSB1c2VkIHRvIGNyZWF0ZQogKiB0aGlzIGRldmljZS4KICoKICogUGFyYW1zOgogKiAgRGlyZWN0M0Q3OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGlyZWN0M0Q3ID09IE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0dldERpcmVjdDNEKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNENyAqKkRpcmVjdDNENykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIERpcmVjdDNENyk7CgogICAgaWYoIURpcmVjdDNENykKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICAqRGlyZWN0M0Q3ID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRDcpOwogICAgSURpcmVjdDNEN19BZGRSZWYoKkRpcmVjdDNENyk7CgogICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwXG4iLCAqRGlyZWN0M0Q3KTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0RGlyZWN0M0QoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0QzICoqRGlyZWN0M0QzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBIUkVTVUxUIHJldDsKICAgIElEaXJlY3QzRDcgKnJldF9wdHI7CgogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNEMyk7CiAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldERpcmVjdDNEKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0X3B0cik7CiAgICBpZihyZXQgIT0gRDNEX09LKQogICAgICAgIHJldHVybiByZXQ7CiAgICAqRGlyZWN0M0QzID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgSURpcmVjdDNEMywgcmV0X3B0cik7CiAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXBcbiIsICpEaXJlY3QzRDMpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXREaXJlY3QzRChJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRDIgKipEaXJlY3QzRDIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIEhSRVNVTFQgcmV0OwogICAgSURpcmVjdDNENyAqcmV0X3B0cjsKCiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0QyKTsKICAgIHJldCA9IElEaXJlY3QzRERldmljZTdfR2V0RGlyZWN0M0QoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfcHRyKTsKICAgIGlmKHJldCAhPSBEM0RfT0spCiAgICAgICAgcmV0dXJuIHJldDsKICAgICpEaXJlY3QzRDIgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBJRGlyZWN0M0QyLCByZXRfcHRyKTsKICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcFxuIiwgKkRpcmVjdDNEMik7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldERpcmVjdDNEKElEaXJlY3QzRERldmljZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0QgKipEaXJlY3QzRCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CiAgICBIUkVTVUxUIHJldDsKICAgIElEaXJlY3QzRDcgKnJldF9wdHI7CgogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNEKTsKICAgIHJldCA9IElEaXJlY3QzRERldmljZTdfR2V0RGlyZWN0M0QoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfcHRyKTsKICAgIGlmKHJldCAhPSBEM0RfT0spCiAgICAgICAgcmV0dXJuIHJldDsKICAgICpEaXJlY3QzRCA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIElEaXJlY3QzRCwgcmV0X3B0cik7CiAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXBcbiIsICpEaXJlY3QzRCk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlMzo6U2V0Q3VycmVudFZpZXdwb3J0CiAqCiAqIFNldHMgYSBEaXJlY3QzRFZpZXdwb3J0IGFzIHRoZSBjdXJyZW50IHZpZXdwb3J0LgogKiBGb3IgdGhlIHRodW5rcyBub3RlIHRoYXQgYWxsIHZpZXdwb3J0IGludGVyZmFjZSB2ZXJzaW9ucyBhcmUgZXF1YWwKICoKICogUGFyYW1zOgogKiAgRGlyZWN0M0RWaWV3cG9ydDM6IFRoZSB2aWV3cG9ydCB0byBzZXQKICoKICogVmVyc2lvbiAyIGFuZCAzCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgKElzIGEgTlVMTCB2aWV3cG9ydCB2YWxpZD8pCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfM19TZXRDdXJyZW50Vmlld3BvcnQoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQzICpEaXJlY3QzRFZpZXdwb3J0MykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBEaXJlY3QzRFZpZXdwb3J0Myk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgRGlyZWN0M0RWaWV3cG9ydDMpOwoKICAgIC8qIERvIG5vdGhpbmcgaWYgdGhlIHNwZWNpZmllZCB2aWV3cG9ydCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmUgKi8KICAgIGlmIChUaGlzLT5jdXJyZW50X3ZpZXdwb3J0ID09IHZwICkKICAgICAgcmV0dXJuIEQzRF9PSzsKCiAgICAvKiBTaG91bGQgY2hlY2sgaWYgdGhlIHZpZXdwb3J0IHdhcyBhZGRlZCBvciBub3QgKi8KCiAgICAvKiBSZWxlYXNlIHByZXZpb3VzIHZpZXdwb3J0IGFuZCBBZGRSZWYgdGhlIG5ldyBvbmUgKi8KICAgIGlmIChUaGlzLT5jdXJyZW50X3ZpZXdwb3J0KQogICAgewogICAgICAgIFRSQUNFKCJWaWV3cG9ydEltcGwgaXMgYXQgJXAsIGludGVyZmFjZSBpcyBhdCAlcFxuIiwgVGhpcy0+Y3VycmVudF92aWV3cG9ydCwgSUNPTV9JTlRFUkZBQ0UoVGhpcy0+Y3VycmVudF92aWV3cG9ydCwgSURpcmVjdDNEVmlld3BvcnQzKSk7CiAgICAgICAgSURpcmVjdDNEVmlld3BvcnQzX1JlbGVhc2UoIElDT01fSU5URVJGQUNFKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQsIElEaXJlY3QzRFZpZXdwb3J0MykgKTsKICAgIH0KICAgIElEaXJlY3QzRFZpZXdwb3J0M19BZGRSZWYoRGlyZWN0M0RWaWV3cG9ydDMpOwoKICAgIC8qIFNldCB0aGlzIHZpZXdwb3J0IGFzIHRoZSBjdXJyZW50IHZpZXdwb3J0ICovCiAgICBUaGlzLT5jdXJyZW50X3ZpZXdwb3J0ID0gdnA7CgogICAgLyogQWN0aXZhdGUgdGhpcyB2aWV3cG9ydCAqLwogICAgVGhpcy0+Y3VycmVudF92aWV3cG9ydC0+YWN0aXZlX2RldmljZSA9IFRoaXM7CiAgICBUaGlzLT5jdXJyZW50X3ZpZXdwb3J0LT5hY3RpdmF0ZShUaGlzLT5jdXJyZW50X3ZpZXdwb3J0KTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldEN1cnJlbnRWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDIgKkRpcmVjdDNEVmlld3BvcnQyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZwID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIERpcmVjdDNEVmlld3BvcnQyKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCB2cCk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19TZXRDdXJyZW50Vmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UodnAsIElEaXJlY3QzRFZpZXdwb3J0MykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlMzo6R2V0Q3VycmVudFZpZXdwb3J0CiAqCiAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgdmlld3BvcnQuCiAqCiAqIFZlcnNpb24gMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRFZpZXdwb3J0MzogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEaXJlY3QzRFZpZXdwb3J0ID09IE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldEN1cnJlbnRWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDMgKipEaXJlY3QzRFZpZXdwb3J0MykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIERpcmVjdDNEVmlld3BvcnQzKTsKCiAgICBpZighRGlyZWN0M0RWaWV3cG9ydDMpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgKkRpcmVjdDNEVmlld3BvcnQzID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+Y3VycmVudF92aWV3cG9ydCwgSURpcmVjdDNEVmlld3BvcnQzKTsKCiAgICAvKiBBZGRSZWYgdGhlIHJldHVybmVkIHZpZXdwb3J0ICovCiAgICBpZigqRGlyZWN0M0RWaWV3cG9ydDMpIElEaXJlY3QzRFZpZXdwb3J0M19BZGRSZWYoKkRpcmVjdDNEVmlld3BvcnQzKTsKCiAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXBcbiIsICpEaXJlY3QzRFZpZXdwb3J0Myk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRDdXJyZW50Vmlld3BvcnQoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQyICoqRGlyZWN0M0RWaWV3cG9ydDIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0RWaWV3cG9ydDIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2UzX0dldEN1cnJlbnRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdDNEVmlld3BvcnQzICoqKSBEaXJlY3QzRFZpZXdwb3J0Mik7CiAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKICAgICpEaXJlY3QzRFZpZXdwb3J0MiA9IChJRGlyZWN0M0RWaWV3cG9ydDIgKikgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBJRGlyZWN0M0RWaWV3cG9ydDMsICpEaXJlY3QzRFZpZXdwb3J0Mik7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6U2V0UmVuZGVyVGFyZ2V0CiAqCiAqIFNldHMgdGhlIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBEaXJlY3QzRERldmljZS4KICogRm9yIHRoZSB0aHVua3Mgbm90ZSB0aGF0IElEaXJlY3REcmF3U3VyZmFjZTcgPT0gSURpcmVjdERyYXdTdXJmYWNlNCBhbmQKICogSURpcmVjdERyYXdTdXJmYWNlMyA9PSBJRGlyZWN0RHJhd1N1cmZhY2UKICoKICogVmVyc2lvbiAyLCAzIGFuZCA3CiAqCiAqIFBhcmFtczoKICogIE5ld1RhcmdldDogUG9pbnRlciB0byBhbiBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZSB0byBzZXQgYXMgdGhlIG5ldwogKiAgICAgICAgICAgICByZW5kZXIgdGFyZ2V0CiAqICBGbGFnczogU29tZSBmbGFncwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MsIGZvciBkZXRhaWxzIHNlZSBJV2luZUQzRERldmljZTo6U2V0UmVuZGVyVGFyZ2V0CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19TZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqTmV3VGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUYXJnZXQgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBOZXdUYXJnZXQpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXAsJTA4eCk6IFJlbGF5XG4iLCBUaGlzLCBOZXdUYXJnZXQsIEZsYWdzKTsKCiAgICAvKiBGbGFnczogTm90IHVzZWQgKi8KCiAgICBociA9IElXaW5lRDNERGV2aWNlX1NldFJlbmRlclRhcmdldChUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCA/IFRhcmdldC0+V2luZUQzRFN1cmZhY2UgOiBOVUxMKTsKICAgIGlmKGhyICE9IEQzRF9PSykKICAgIHsKICAgICAgICByZXR1cm4gaHI7CiAgICB9CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihOZXdUYXJnZXQpOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMtPnRhcmdldCwgSURpcmVjdERyYXdTdXJmYWNlNykpOwogICAgVGhpcy0+dGFyZ2V0ID0gVGFyZ2V0OwogICAgSURpcmVjdDNERGV2aWNlSW1wbF9VcGRhdGVEZXB0aFN0ZW5jaWwoVGhpcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFJlbmRlclRhcmdldChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U0ICpOZXdSZW5kZXJUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRhcmdldCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIE5ld1JlbmRlclRhcmdldCk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJTA4eCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUYXJnZXQsIEZsYWdzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclRhcmdldChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShUYXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlICpOZXdSZW5kZXJUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRhcmdldCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIE5ld1JlbmRlclRhcmdldCk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJTA4eCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUYXJnZXQsIEZsYWdzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclRhcmdldChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShUYXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTc6OkdldFJlbmRlclRhcmdldAogKgogKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlbmRlciB0YXJnZXQuCiAqIFRoaXMgaXMgaGFuZGxlZCBsb2NhbGx5LCBiZWNhdXNlIHRoZSBXaW5lRDNEIHJlbmRlciB0YXJnZXQncyBwYXJlbnQKICogaXMgYW4gSVBhcmVudAogKgogKiBWZXJzaW9uIDIsIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgUmVuZGVyVGFyZ2V0OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBzdXJmYWNlIGludGVyZmFjZSBwb2ludGVyCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBSZW5kZXJUYXJnZXQgPT0gTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0UmVuZGVyVGFyZ2V0KElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKipSZW5kZXJUYXJnZXQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheVxuIiwgVGhpcywgUmVuZGVyVGFyZ2V0KTsKCiAgICBpZighUmVuZGVyVGFyZ2V0KQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgICpSZW5kZXJUYXJnZXQgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT50YXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoKlJlbmRlclRhcmdldCk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNCAqKlJlbmRlclRhcmdldCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBSZW5kZXJUYXJnZXQpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X0dldFJlbmRlclRhcmdldChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3REcmF3U3VyZmFjZTcgKiopIFJlbmRlclRhcmdldCk7CiAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKICAgICpSZW5kZXJUYXJnZXQgPSAoSURpcmVjdERyYXdTdXJmYWNlNCAqKSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdERyYXdTdXJmYWNlNywgKlJlbmRlclRhcmdldCk7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclRhcmdldChJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2UgKipSZW5kZXJUYXJnZXQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgUmVuZGVyVGFyZ2V0KTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlN19HZXRSZW5kZXJUYXJnZXQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0RHJhd1N1cmZhY2U3ICoqKSBSZW5kZXJUYXJnZXQpOwogICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CiAgICAqUmVuZGVyVGFyZ2V0ID0gKElEaXJlY3REcmF3U3VyZmFjZSAqKSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdERyYXdTdXJmYWNlMywgKlJlbmRlclRhcmdldCk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlMzo6QmVnaW4KICoKICogQmVnaW5zIGEgZGVzY3JpcHRpb24gYmxvY2sgb2YgdmVydGljZXMuIFRoaXMgaXMgc2ltaWxhciB0byBnbEJlZ2luKCkKICogYW5kIGdsRW5kKCkuIEFmdGVyIGEgY2FsbCB0byBJRGlyZWN0M0REZXZpY2UzOjpFbmQsIHRoZSB2ZXJ0aWNlcwogKiBkZXNjcmliZWQgd2l0aCBJRGlyZWN0M0REZXZpY2U6OlZlcnRleCBhcmUgZHJhd24uCiAqCiAqIFZlcnNpb24gMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBQcmltaXRpdmVUeXBlOiBUaGUgdHlwZSBvZiBwcmltaXRpdmVzIHRvIGRyYXcKICogIFZlcnRleFR5cGVEZXNjOiBBIGZsZXhpYmxlIHZlcnRleCBmb3JtYXQgZGVzY3JpcHRpb24gb2YgdGhlIHZlcnRpY2VzCiAqICBGbGFnczogU29tZSBmbGFncy4uCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW4oSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVkLCVkLCUwOHgpXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlRGVzYywgRmxhZ3MpOwoKICAgIFRoaXMtPnByaW1pdGl2ZV90eXBlID0gUHJpbWl0aXZlVHlwZTsKICAgIFRoaXMtPnZlcnRleF90eXBlID0gVmVydGV4VHlwZURlc2M7CiAgICBUaGlzLT5yZW5kZXJfZmxhZ3MgPSBGbGFnczsKICAgIFRoaXMtPnZlcnRleF9zaXplID0gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKFRoaXMtPnZlcnRleF90eXBlKTsKICAgIFRoaXMtPm5iX3ZlcnRpY2VzID0gMDsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0JlZ2luKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZHdWZXJ0ZXhUeXBlRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCnsKICAgIERXT1JEIEZWRjsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcC8lcCktPiglMDh4LCUwOHgsJTA4eCk6IFRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTNcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdCwgZHdWZXJ0ZXhUeXBlRGVzYywgZHdGbGFncyk7CgogICAgc3dpdGNoKGR3VmVydGV4VHlwZURlc2MpCiAgICB7CiAgICAgICAgY2FzZSBEM0RWVF9WRVJURVg6IEZWRiA9IEQzREZWRl9WRVJURVg7IGJyZWFrOwogICAgICAgIGNhc2UgRDNEVlRfTFZFUlRFWDogRlZGID0gRDNERlZGX0xWRVJURVg7IGJyZWFrOwogICAgICAgIGNhc2UgRDNEVlRfVExWRVJURVg6IEZWRiA9IEQzREZWRl9UTFZFUlRFWDsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRVJSKCJVbmV4cGVjdGVkIHZlcnRleCB0eXBlICVkXG4iLCBkd1ZlcnRleFR5cGVEZXNjKTsKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCiAgICB9OwoKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0JlZ2luKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDNkcHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTM6OkJlZ2luSW5kZXhlZAogKgogKiBEcmF3cyBwcmltaXRpdmVzIGJhc2VkIG9uIHZlcnRpY2VzIGluIGEgdmVydGV4IGFycmF5IHdoaWNoIGFyZSBzcGVjaWZpZWQKICogYnkgaW5kaWNlcy4KICoKICogVmVyc2lvbiAyIGFuZCAzCiAqCiAqIFBhcmFtczoKICogIFByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZSB0eXBlIHRvIGRyYXcKICogIFZlcnRleFR5cGU6IEEgRlZGIGRlc2NyaXB0aW9uIG9mIHRoZSB2ZXJ0ZXggZm9ybWF0CiAqICBWZXJ0aWNlczogcG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2ZXJ0aWNlcwogKiAgTnVtVmVydGljZXM6IFRoZSBudW1iZXIgb2YgdmVydGljZXMgaW4gdGhlIHZlcnRleCBhcnJheQogKiAgRmxhZ3M6IFNvbWUgZmxhZ3MgLi4uCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8zX0JlZ2luSW5kZXhlZChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBOdW1WZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgRklYTUUoIiglcCktPiglMDh4LCUwOHgsJXAsJTA4eCwlMDh4KTogc3R1YiFcbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIFZlcnRleFR5cGUsIFZlcnRpY2VzLCBOdW1WZXJ0aWNlcywgRmxhZ3MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQmVnaW5JbmRleGVkKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZDNkdnRWZXJ0ZXhUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxwdlZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TnVtVmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKewogICAgRFdPUkQgRlZGOwogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwLyVwKS0+KCUwOHgsJTA4eCwlcCwlMDh4LCUwOHgpOiBUaHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzXG4iLCBUaGlzLCBpZmFjZSwgZDNkcHRQcmltaXRpdmVUeXBlLCBkM2R2dFZlcnRleFR5cGUsIGxwdlZlcnRpY2VzLCBkd051bVZlcnRpY2VzLCBkd0ZsYWdzKTsKCiAgICBzd2l0Y2goZDNkdnRWZXJ0ZXhUeXBlKQogICAgewogICAgICAgIGNhc2UgRDNEVlRfVkVSVEVYOiBGVkYgPSBEM0RGVkZfVkVSVEVYOyBicmVhazsKICAgICAgICBjYXNlIEQzRFZUX0xWRVJURVg6IEZWRiA9IEQzREZWRl9MVkVSVEVYOyBicmVhazsKICAgICAgICBjYXNlIEQzRFZUX1RMVkVSVEVYOiBGVkYgPSBEM0RGVkZfVExWRVJURVg7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEVSUigiVW5leHBlY3RlZCB2ZXJ0ZXggdHlwZSAlZFxuIiwgZDNkdnRWZXJ0ZXhUeXBlKTsKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCiAgICB9OwoKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0JlZ2luSW5kZXhlZChJQ09NX0lOVEVSRkFDRShUaGlzLElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQzZHB0UHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHB2VmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdOdW1WZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTM6OlZlcnRleAogKgogKiBEcmF3cyBhIHZlcnRleCBhcyBkZXNjcmliZWQgYnkgSURpcmVjdDNERGV2aWNlMzo6QmVnaW4uIEl0IHBsYWNlcyBhbGwKICogZHJhd24gdmVydGljZXMgaW4gYSB2ZXJ0ZXggYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwgaXRzCiAqIHNpemUgaXMgaW5jcmVhc2VkLgogKgogKiBWZXJzaW9uIDIgYW5kIDMKICoKICogUGFyYW1zOgogKiAgVmVydGV4OiBQb2ludGVyIHRvIHRoZSB2ZXJ0ZXgKICoKICogUmV0dXJuczoKICogIEQzRF9PSywgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBWZXJ0ZXggaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzNfVmVydGV4KElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlZlcnRleCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIFZlcnRleCk7CgogICAgaWYoIVZlcnRleCkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICBpZiAoKFRoaXMtPm5iX3ZlcnRpY2VzKzEpKlRoaXMtPnZlcnRleF9zaXplID4gVGhpcy0+YnVmZmVyX3NpemUpCiAgICB7CiAgICAgICAgQllURSAqb2xkX2J1ZmZlcjsKICAgICAgICBUaGlzLT5idWZmZXJfc2l6ZSA9IFRoaXMtPmJ1ZmZlcl9zaXplID8gVGhpcy0+YnVmZmVyX3NpemUgKiAyIDogVGhpcy0+dmVydGV4X3NpemUgKiAzOwogICAgICAgIG9sZF9idWZmZXIgPSBUaGlzLT52ZXJ0ZXhfYnVmZmVyOwogICAgICAgIFRoaXMtPnZlcnRleF9idWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+YnVmZmVyX3NpemUpOwogICAgICAgIGlmIChvbGRfYnVmZmVyKQogICAgICAgIHsKICAgICAgICAgICAgQ29weU1lbW9yeShUaGlzLT52ZXJ0ZXhfYnVmZmVyLCBvbGRfYnVmZmVyLCBUaGlzLT5uYl92ZXJ0aWNlcyAqIFRoaXMtPnZlcnRleF9zaXplKTsKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2xkX2J1ZmZlcik7CiAgICAgICAgfQogICAgfQoKICAgIENvcHlNZW1vcnkoVGhpcy0+dmVydGV4X2J1ZmZlciArIFRoaXMtPm5iX3ZlcnRpY2VzKysgKiBUaGlzLT52ZXJ0ZXhfc2l6ZSwgVmVydGV4LCBUaGlzLT52ZXJ0ZXhfc2l6ZSk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9WZXJ0ZXgoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbHBWZXJ0ZXhUeXBlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgbHBWZXJ0ZXhUeXBlKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX1ZlcnRleChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFZlcnRleFR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlMzo6SW5kZXgKICoKICogU3BlY2lmaWVzIGFuIGluZGV4IHRvIGEgdmVydGV4IHRvIGJlIGRyYXduLiBUaGUgdmVydGV4IGFycmF5IGhhcyB0bwogKiBiZSBzcGVjaWZpZWQgd2l0aCBCZWdpbkluZGV4ZWQgZmlyc3QuCiAqCiAqIFBhcmFtZXRlcnM6CiAqICBWZXJ0ZXhJbmRleDogVGhlIGluZGV4IG9mIHRoZSB2ZXJ0ZXggdG8gZHJhdwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8zX0luZGV4KElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBWZXJ0ZXhJbmRleCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgRklYTUUoIiglcCktPiglMDR4KTogc3R1YiFcbiIsIFRoaXMsIFZlcnRleEluZGV4KTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfSW5kZXgoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHdWZXJ0ZXhJbmRleCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwNHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgd1ZlcnRleEluZGV4KTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0luZGV4KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZlcnRleEluZGV4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTM6OkVuZAogKgogKiBFbmRzIGEgZHJhdyBiZWd1biB3aXRoIElEaXJlY3QzRERldmljZTM6OkJlZ2luIG9yCiAqIElEaXJlY3QzRERldmljZTo6QmVnaW5JbmRleGVkLiBUaGUgdmVydGljZXMgc3BlY2lmaWVkIHdpdGgKICogSURpcmVjdDNERGV2aWNlOjpWZXJ0ZXggb3IgSURpcmVjdDNERGV2aWNlOjpJbmRleCBhcmUgZHJhd24gdXNpbmcKICogdGhlIElEaXJlY3QzRERldmljZTc6OkRyYXdQcmltaXRpdmUgbWV0aG9kLiBTbyBmYXIgb25seQogKiBub24taW5kZXhlZCBtb2RlIGlzIHN1cHBvcnRlZAogKgogKiBWZXJzaW9uIDIgYW5kIDMKICoKICogUGFyYW1zOgogKiAgRmxhZ3M6IFNvbWUgZmxhZ3MsIGFzIHVzdWFsLiBEb24ndCBrbm93IHdoaWNoIGFyZSBkZWZpbmVkCiAqCiAqIFJldHVybnM6CiAqICBUaGUgcmV0dXJuIHZhbHVlIG9mIElEaXJlY3QzRERldmljZTc6OkRyYXdQcmltaXRpdmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF8zX0VuZChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4KVxuIiwgVGhpcywgRmxhZ3MpOwoKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdQcmltaXRpdmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPnByaW1pdGl2ZV90eXBlLCBUaGlzLT52ZXJ0ZXhfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+dmVydGV4X2J1ZmZlciwgVGhpcy0+bmJfdmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPnJlbmRlcl9mbGFncyk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfRW5kKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIGR3RmxhZ3MpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfRW5kKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0UmVuZGVyU3RhdGUKICoKICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSByZW5kZXIgc3RhdGUuIFRoZSBwb3NzaWJsZSByZW5kZXIgc3RhdGVzIGFyZQogKiBkZWZpbmVkIGluIGluY2x1ZGUvZDNkdHlwZXMuaAogKgogKiBWZXJzaW9uIDIsIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgUmVuZGVyU3RhdGVUeXBlOiBSZW5kZXIgc3RhdGUgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmcgb2YKICogIFZhbHVlOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSB2YWx1ZSBhdAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MsIGZvciBkZXRhaWxzIHNlZSBJV2luZUQzRERldmljZTo6R2V0UmVuZGVyU3RhdGUKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgVmFsdWUgPT0gTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0UmVuZGVyU3RhdGUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgUmVuZGVyU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKlZhbHVlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKTogUmVsYXlcbiIsIFRoaXMsIFJlbmRlclN0YXRlVHlwZSwgVmFsdWUpOwoKICAgIGlmKCFWYWx1ZSkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICBzd2l0Y2goUmVuZGVyU3RhdGVUeXBlKQogICAgewogICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUhBTkRMRToKICAgICAgICB7CiAgICAgICAgICAgIC8qIFRoaXMgc3RhdGUgaXMgd3JhcHBlZCB0byBTZXRUZXh0dXJlIGluIFNldFJlbmRlclN0YXRlLCBzbwogICAgICAgICAgICAgKiBpdCBoYXMgdG8gYmUgd3JhcHBlZCB0byBHZXRUZXh0dXJlIGhlcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIElXaW5lRDNEQmFzZVRleHR1cmUgKnRleCA9IE5VTEw7CiAgICAgICAgICAgICpWYWx1ZSA9IDA7CgogICAgICAgICAgICBociA9IElXaW5lRDNERGV2aWNlX0dldFRleHR1cmUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4KTsKCiAgICAgICAgICAgIGlmKGhyID09IFdJTkVEM0RfT0sgJiYgdGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpwYXJlbnQgPSBOVUxMOwogICAgICAgICAgICAgICAgaHIgPSBJV2luZUQzREJhc2VUZXh0dXJlX0dldFBhcmVudCh0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVW5rbm93biAqKikgJnBhcmVudCk7CiAgICAgICAgICAgICAgICBpZihwYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIHBhcmVudCBvZiB0aGUgdGV4dHVyZSBpcyB0aGUgSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UKICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgZGRyYXcgc3VyZmFjZQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleEltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQpOwogICAgICAgICAgICAgICAgICAgICpWYWx1ZSA9IHRleEltcGwtPkhhbmRsZTsKICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocGFyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIElXaW5lRDNEQmFzZVRleHR1cmVfUmVsZWFzZSh0ZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBocjsKICAgICAgICB9CgogICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRU1BRzoKICAgICAgICB7CiAgICAgICAgICAgIFdJTkVEM0RURVhUVVJFRklMVEVSVFlQRSB0ZXhfbWFnOwoKICAgICAgICAgICAgaHIgPSBJV2luZUQzRERldmljZV9HZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgV0lORUQzRFNBTVBfTUFHRklMVEVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4X21hZyk7CgogICAgICAgICAgICBzd2l0Y2ggKHRleF9tYWcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRFRFWEZfUE9JTlQ6CiAgICAgICAgICAgICAgICAgICAgKlZhbHVlID0gRDNERklMVEVSX05FQVJFU1Q7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RURVhGX0xJTkVBUjoKICAgICAgICAgICAgICAgICAgICAqVmFsdWUgPSBEM0RGSUxURVJfTElORUFSOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVuaGFuZGxlZCB0ZXh0dXJlIG1hZyAlZCAhXG4iLHRleF9tYWcpOwogICAgICAgICAgICAgICAgICAgICpWYWx1ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhyOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9URVhUVVJFTUlOOgogICAgICAgIHsKICAgICAgICAgICAgV0lORUQzRFRFWFRVUkVGSUxURVJUWVBFIHRleF9taW47CgogICAgICAgICAgICBociA9IElXaW5lRDNERGV2aWNlX0dldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBXSU5FRDNEU0FNUF9NSU5GSUxURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXhfbWluKTsKCiAgICAgICAgICAgIHN3aXRjaCAodGV4X21pbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEVEVYRl9QT0lOVDoKICAgICAgICAgICAgICAgICAgICAqVmFsdWUgPSBEM0RGSUxURVJfTkVBUkVTVDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRFRFWEZfTElORUFSOgogICAgICAgICAgICAgICAgICAgICpWYWx1ZSA9IEQzREZJTFRFUl9MSU5FQVI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIEVSUigiVW5oYW5kbGVkIHRleHR1cmUgbWFnICVkICFcbiIsdGV4X21pbik7CiAgICAgICAgICAgICAgICAgICAgKlZhbHVlID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaHI7CiAgICAgICAgfQoKICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTOgogICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1NVOgogICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfR2V0U2FtcGxlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgV0lORUQzRFNBTVBfQUREUkVTU1UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUpOwogICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1NWOgogICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfR2V0U2FtcGxlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgV0lORUQzRFNBTVBfQUREUkVTU1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUpOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKiBGSVhNRTogVW5oYW5kbGVkOiBEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjAwIC0gMzEgKi8KICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX0dldFJlbmRlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CiAgICB9Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0UmVuZGVyU3RhdGUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgZHdSZW5kZXJTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqbHBkd1JlbmRlclN0YXRlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkd1JlbmRlclN0YXRlVHlwZSwgbHBkd1JlbmRlclN0YXRlKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZW5kZXJTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3UmVuZGVyU3RhdGUpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclN0YXRlKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIGR3UmVuZGVyU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKmxwZHdSZW5kZXJTdGF0ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZHdSZW5kZXJTdGF0ZVR5cGUsIGxwZHdSZW5kZXJTdGF0ZSk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19HZXRSZW5kZXJTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVuZGVyU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd1JlbmRlclN0YXRlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTc6OlNldFJlbmRlclN0YXRlCiAqCiAqIFNldHMgYSByZW5kZXIgc3RhdGUuIFRoZSBwb3NzaWJsZSByZW5kZXIgc3RhdGVzIGFyZSBkZWZpbmVkIGluCiAqIGluY2x1ZGUvZDNkdHlwZXMuaAogKgogKiBWZXJzaW9uIDIsIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgUmVuZGVyU3RhdGVUeXBlOiBTdGF0ZSB0byBzZXQKICogIFZhbHVlOiBWYWx1ZSB0byBhc3NpZ24gdG8gdGhhdCBzdGF0ZQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MsCiAqICBmb3IgZGV0YWlscyBzZWUgSVdpbmVEM0REZXZpY2U6OlNldFJlbmRlclN0YXRlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19TZXRSZW5kZXJTdGF0ZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBSZW5kZXJTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWYWx1ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVkKTogUmVsYXlcbiIsIFRoaXMsIFJlbmRlclN0YXRlVHlwZSwgVmFsdWUpOwoKICAgIC8qIFNvbWUgcmVuZGVyIHN0YXRlcyBuZWVkIHNwZWNpYWwgY2FyZSAqLwogICAgc3dpdGNoKFJlbmRlclN0YXRlVHlwZSkKICAgIHsKICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVIQU5ETEU6CiAgICAgICAgewogICAgICAgICAgICBpZihWYWx1ZSA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihWYWx1ZSA+IFRoaXMtPm51bUhhbmRsZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJTcGVjaWZpZWQgaGFuZGxlICVkIG91dCBvZiByYW5nZVxuIiwgVmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoVGhpcy0+SGFuZGxlc1tWYWx1ZSAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfVGV4dHVyZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRklYTUUoIkhhbmRsZSAlZCBpc24ndCBhIHRleHR1cmUgaGFuZGxlXG4iLCBWYWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKSBUaGlzLT5IYW5kbGVzW1ZhbHVlIC0gMV0ucHRyOwogICAgICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmLT53aW5lRDNEVGV4dHVyZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRU1BRzoKICAgICAgICB7CiAgICAgICAgICAgIFdJTkVEM0RURVhUVVJFRklMVEVSVFlQRSB0ZXhfbWFnID0gV0lORUQzRFRFWEZfTk9ORTsKCiAgICAgICAgICAgIHN3aXRjaCAoKEQzRFRFWFRVUkVGSUxURVIpIFZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9ORUFSRVNUOgogICAgICAgICAgICAgICAgY2FzZSBEM0RGSUxURVJfTElORUFSTUlQTkVBUkVTVDoKICAgICAgICAgICAgICAgICAgICB0ZXhfbWFnID0gV0lORUQzRFRFWEZfUE9JTlQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9MSU5FQVI6CiAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9MSU5FQVJNSVBMSU5FQVI6CiAgICAgICAgICAgICAgICAgICAgdGV4X21hZyA9IFdJTkVEM0RURVhGX0xJTkVBUjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmhhbmRsZWQgdGV4dHVyZSBtYWcgJWQgIVxuIixWYWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBXSU5FRDNEU0FNUF9NQUdGSUxURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4X21hZyk7CiAgICAgICAgfQoKICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVNSU46CiAgICAgICAgewogICAgICAgICAgICBXSU5FRDNEVEVYVFVSRUZJTFRFUlRZUEUgdGV4X21pbiA9IFdJTkVEM0RURVhGX05PTkU7CiAgICAgICAgICAgIFdJTkVEM0RURVhUVVJFRklMVEVSVFlQRSB0ZXhfbWlwID0gV0lORUQzRFRFWEZfTk9ORTsKCiAgICAgICAgICAgIHN3aXRjaCAoKEQzRFRFWFRVUkVGSUxURVIpIFZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9ORUFSRVNUOgogICAgICAgICAgICAgICAgICAgIHRleF9taW4gPSBXSU5FRDNEVEVYRl9QT0lOVDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRDNERklMVEVSX0xJTkVBUjoKICAgICAgICAgICAgICAgICAgICB0ZXhfbWluID0gV0lORUQzRFRFWEZfTElORUFSOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBEM0RGSUxURVJfTUlQTkVBUkVTVDoKICAgICAgICAgICAgICAgICAgICB0ZXhfbWluID0gV0lORUQzRFRFWEZfTk9ORTsKICAgICAgICAgICAgICAgICAgICB0ZXhfbWlwID0gV0lORUQzRFRFWEZfUE9JTlQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9NSVBMSU5FQVI6CiAgICAgICAgICAgICAgICAgICAgdGV4X21pbiA9IFdJTkVEM0RURVhGX05PTkU7CiAgICAgICAgICAgICAgICAgICAgdGV4X21pcCA9IFdJTkVEM0RURVhGX0xJTkVBUjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRDNERklMVEVSX0xJTkVBUk1JUE5FQVJFU1Q6CiAgICAgICAgICAgICAgICAgICAgdGV4X21pbiA9IFdJTkVEM0RURVhGX1BPSU5UOwogICAgICAgICAgICAgICAgICAgIHRleF9taXAgPSBXSU5FRDNEVEVYRl9MSU5FQVI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9MSU5FQVJNSVBMSU5FQVI6CiAgICAgICAgICAgICAgICAgICAgdGV4X21pbiA9IFdJTkVEM0RURVhGX0xJTkVBUjsKICAgICAgICAgICAgICAgICAgICB0ZXhfbWlwID0gV0lORUQzRFRFWEZfTElORUFSOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmhhbmRsZWQgdGV4dHVyZSBtaW4gJWQgIVxuIixWYWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBXSU5FRDNEU0FNUF9NSVBGSUxURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4X21pcCk7CiAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBXSU5FRDNEU0FNUF9NSU5GSUxURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4X21pbik7CiAgICAgICAgfQoKICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTOgogICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0U2FtcGxlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgV0lORUQzRFNBTVBfQUREUkVTU1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUpOwogICAgICAgICAgICAvKiBEcm9wIHRocm91Z2ggKi8KICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTVToKICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFdJTkVEM0RTQU1QX0FERFJFU1NVLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTVjoKICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFdJTkVEM0RTQU1QX0FERFJFU1NWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKCiAgICAgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9URVhUVVJFTUFQQkxFTkQ6CiAgICAgICAgewogICAgICAgICAgICAvKiBPbGQgdGV4dHVyZSBjb21iaW5lIHNldHVwIHN0eWxlLCBzdXBlcnNlZGVkIGJ5IHRleHR1cmUgc3RhZ2Ugc3RhdGVzCiAgICAgICAgICAgICAqIGluIEQzRDcuIEl0IGlzIHNhZmUgZm9yIHVzIHRvIHdyYXAgaXQgdG8gdGV4dHVyZSBzdGFnZSBzdGF0ZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzd2l0Y2ggKCAoRDNEVEVYVFVSRUJMRU5EKSBWYWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSBEM0RUQkxFTkRfTU9EVUxBVEU6CiAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwgMCwgV0lORUQzRFRTU19DT0xPUkFSRzEsIFdJTkVEM0RUQV9URVhUVVJFKTsKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBXSU5FRDNEVFNTX0FMUEhBQVJHMSwgV0lORUQzRFRBX1RFWFRVUkUpOwogICAgICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsIDAsIFdJTkVEM0RUU1NfQ09MT1JBUkcyLCBXSU5FRDNEVEFfQ1VSUkVOVCk7CiAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwgMCwgV0lORUQzRFRTU19DT0xPUk9QLCBXSU5FRDNEVE9QX01PRFVMQVRFKTsKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBXSU5FRDNEVFNTX0FMUEhBT1AsIFdJTkVEM0RUT1BfU0VMRUNUQVJHMSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBEM0RUQkxFTkRfTU9EVUxBVEVBTFBIQToKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSwgV0lORUQzRFRBX1RFWFRVUkUpOwogICAgICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsIDAsIFdJTkVEM0RUU1NfQUxQSEFBUkcxLCBXSU5FRDNEVEFfVEVYVFVSRSk7CiAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwgMCwgV0lORUQzRFRTU19DT0xPUkFSRzIsIFdJTkVEM0RUQV9DVVJSRU5UKTsKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBXSU5FRDNEVFNTX0FMUEhBQVJHMiwgV0lORUQzRFRBX0NVUlJFTlQpOwogICAgICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsIDAsIFdJTkVEM0RUU1NfQ09MT1JPUCwgV0lORUQzRFRPUF9NT0RVTEFURSk7CiAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwgMCwgV0lORUQzRFRTU19BTFBIQU9QLCBXSU5FRDNEVE9QX01PRFVMQVRFKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIEQzRFRCTEVORF9ERUNBTDoKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSwgV0lORUQzRFRBX1RFWFRVUkUpOwogICAgICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsIDAsIFdJTkVEM0RUU1NfQUxQSEFBUkcxLCBXSU5FRDNEVEFfVEVYVFVSRSk7CiAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwgMCwgV0lORUQzRFRTU19DT0xPUk9QLCBXSU5FRDNEVE9QX1NFTEVDVEFSRzEpOwogICAgICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsIDAsIFdJTkVEM0RUU1NfQUxQSEFPUCwgV0lORUQzRFRPUF9TRUxFQ1RBUkcxKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIEQzRFRCTEVORF9ERUNBTEFMUEhBOgogICAgICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsIDAsIFdJTkVEM0RUU1NfQ09MT1JBUkcxLCBXSU5FRDNEVEFfVEVYVFVSRSk7CiAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwgMCwgV0lORUQzRFRTU19BTFBIQUFSRzEsIFdJTkVEM0RUQV9URVhUVVJFKTsKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBXSU5FRDNEVFNTX0FMUEhBQVJHMiwgV0lORUQzRFRBX0NVUlJFTlQpOwogICAgICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsIDAsIFdJTkVEM0RUU1NfQ09MT1JPUCwgV0lORUQzRFRPUF9TRUxFQ1RBUkcxKTsKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBXSU5FRDNEVFNTX0FMUEhBT1AsIFdJTkVEM0RUT1BfTU9EVUxBVEUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmhhbmRsZWQgdGV4dHVyZSBlbnZpcm9ubWVudCAlZCAhXG4iLFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBEM0RfT0s7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgZGVmYXVsdDoKCiAgICAgICAgICAgIC8qIEZJWE1FOiBVbmhhbmRsZWQ6IEQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMDAgLSAzMSAqLwoKICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CiAgICB9Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0UmVuZGVyU3RhdGUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgUmVuZGVyU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmFsdWUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgUmVuZGVyU3RhdGVUeXBlLCBWYWx1ZSk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRSZW5kZXJTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlclN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRSZW5kZXJTdGF0ZShJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBSZW5kZXJTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWYWx1ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJTA4eCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBSZW5kZXJTdGF0ZVR5cGUsIFZhbHVlKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGlyZWN0M0REZXZpY2UzOjpTZXRMaWdodFN0YXRlCiAqCiAqIFNldHMgYSBsaWdodCBzdGF0ZSBmb3IgRGlyZWN0M0REZXZpY2UzIGFuZCBEaXJlY3QzRERldmljZTIuIFRoZQogKiBsaWdodCBzdGF0ZXMgYXJlIGZvcndhcmRlZCB0byBEaXJlY3QzRERldmljZTcgcmVuZGVyIHN0YXRlcwogKgogKiBWZXJzaW9uIDIgYW5kIDMKICoKICogUGFyYW1zOgogKiAgTGlnaHRTdGF0ZVR5cGU6IFRoZSBsaWdodCBzdGF0ZSB0byBjaGFuZ2UKICogIFZhbHVlOiBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIHRoYXQgbGlnaHQgc3RhdGUKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUgaW5jb3JyZWN0CiAqICBBbHNvIGNoZWNrIElEaXJlY3QzRERldmljZTc6OlNldFJlbmRlclN0YXRlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfM19TZXRMaWdodFN0YXRlKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVFNUQVRFVFlQRSBMaWdodFN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmFsdWUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJTA4eClcbiIsIFRoaXMsIExpZ2h0U3RhdGVUeXBlLCBWYWx1ZSk7CgogICAgaWYgKCFMaWdodFN0YXRlVHlwZSAmJiAoTGlnaHRTdGF0ZVR5cGUgPiBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYKSkKICAgIHsKICAgICAgICBUUkFDRSgiVW5leHBlY3RlZCBMaWdodCBTdGF0ZSBUeXBlXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICBpZiAoTGlnaHRTdGF0ZVR5cGUgPT0gRDNETElHSFRTVEFURV9NQVRFUklBTCAvKiAxICovKQogICAgewogICAgICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqbWF0OwoKICAgICAgICBpZihWYWx1ZSA9PSAwKSBtYXQgPSBOVUxMOwogICAgICAgIGVsc2UgaWYoVmFsdWUgPiBUaGlzLT5udW1IYW5kbGVzKQogICAgICAgIHsKICAgICAgICAgICAgRVJSKCJNYXRlcmlhbCBoYW5kbGUgb3V0IG9mIHJhbmdlKCVkKVxuIiwgVmFsdWUpOwogICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihUaGlzLT5IYW5kbGVzW1ZhbHVlIC0gMV0udHlwZSAhPSBERHJhd0hhbmRsZV9NYXRlcmlhbCkKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiSW52YWxpZCBoYW5kbGUgJWRcbiIsIFZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIG1hdCA9IChJRGlyZWN0M0RNYXRlcmlhbEltcGwgKikgVGhpcy0+SGFuZGxlc1tWYWx1ZSAtIDFdLnB0cjsKICAgICAgICB9CgogICAgICAgIGlmIChtYXQgIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCIgYWN0aXZhdGluZyBtYXRlcmlhbCAlcC5cbiIsIG1hdCk7CiAgICAgICAgICAgIG1hdC0+YWN0aXZhdGUobWF0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgRklYTUUoIiBEM0RMSUdIVFNUQVRFX01BVEVSSUFMIGNhbGxlZCB3aXRoIE5VTEwgbWF0ZXJpYWwgISEhXG4iKTsKICAgICAgICB9CiAgICAgICAgVGhpcy0+bWF0ZXJpYWwgPSBWYWx1ZTsKICAgIH0KICAgIGVsc2UgaWYgKExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfQ09MT1JNT0RFTCAvKiAzICovKQogICAgewogICAgICAgIHN3aXRjaCAoVmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIEQzRENPTE9SX01PTk86CiAgICAgICAgICAgICAgICBFUlIoIkREQ09MT1JfTU9OTyBzaG91bGQgbm90IGhhcHBlbiFcbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRDNEQ09MT1JfUkdCOgogICAgICAgICAgICAgICAgLyogV2UgYXJlIGFscmVhZHkgaW4gdGhpcyBtb2RlICovCiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBjb2xvciBtb2RlbCB0byBSR0IgKG5vLW9wKS5cbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gY29sb3IgbW9kZWwhXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgcnM7CiAgICAgICAgc3dpdGNoIChMaWdodFN0YXRlVHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9BTUJJRU5UOiAgICAgICAvKiAyICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0FNQklFTlQ7CiAgICAgICAgICAgICAgICBicmVhazsJCQogICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HTU9ERTogICAgICAgLyogNCAqLwogICAgICAgICAgICAgICAgcnMgPSBEM0RSRU5ERVJTVEFURV9GT0dWRVJURVhNT0RFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dTVEFSVDogICAgICAvKiA1ICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR1NUQVJUOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dFTkQ6ICAgICAgICAvKiA2ICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0VORDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HREVOU0lUWTogICAgLyogNyAqLwogICAgICAgICAgICAgICAgcnMgPSBEM0RSRU5ERVJTVEFURV9GT0dERU5TSVRZOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9DT0xPUlZFUlRFWDogICAvKiA4ICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0NPTE9SVkVSVEVYOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gRDNETElHSFRTVEFURVRZUEUgJWQuXG4iLCBMaWdodFN0YXRlVHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CiAgICB9CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRMaWdodFN0YXRlKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVFNUQVRFVFlQRSBMaWdodFN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmFsdWUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgTGlnaHRTdGF0ZVR5cGUsIFZhbHVlKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX1NldExpZ2h0U3RhdGUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZ2h0U3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2UzOjpHZXRMaWdodFN0YXRlCiAqCiAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBvZiBhIGxpZ2h0IHN0YXRlLiBUaGUgc3RhdGUgaXMgcmVhZCBmcm9tCiAqIHRoZSBEaXJlY3QzRERldmljZTcgcmVuZGVyIHN0YXRlLgogKgogKiBWZXJzaW9uIDIgYW5kIDMKICoKICogUGFyYW1zOgogKiAgTGlnaHRTdGF0ZVR5cGU6IFRoZSBsaWdodCBzdGF0ZSB0byByZXR1cm4KICogIFZhbHVlOiBUaGUgYWRkcmVzcyB0byBzdG9yZSB0aGUgbGlnaHQgc3RhdGUgc2V0dGluZyBhdAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIEREREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUgaW5jb3JyZWN0CiAqICBBbHNvIHNlZSBJRGlyZWN0M0REZXZpY2U3OjpHZXRSZW5kZXJTdGF0ZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0TGlnaHRTdGF0ZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETElHSFRTVEFURVRZUEUgTGlnaHRTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpWYWx1ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwoKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcClcbiIsIFRoaXMsIExpZ2h0U3RhdGVUeXBlLCBWYWx1ZSk7CgogICAgaWYgKCFMaWdodFN0YXRlVHlwZSAmJiAoTGlnaHRTdGF0ZVR5cGUgPiBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYKSkKICAgIHsKICAgICAgICBUUkFDRSgiVW5leHBlY3RlZCBMaWdodCBTdGF0ZSBUeXBlXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICBpZighVmFsdWUpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgaWYgKExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfTUFURVJJQUwgLyogMSAqLykKICAgIHsKICAgICAgICAqVmFsdWUgPSBUaGlzLT5tYXRlcmlhbDsKICAgIH0KICAgIGVsc2UgaWYgKExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfQ09MT1JNT0RFTCAvKiAzICovKQogICAgewogICAgICAgICpWYWx1ZSA9IEQzRENPTE9SX1JHQjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgcnM7CiAgICAgICAgc3dpdGNoIChMaWdodFN0YXRlVHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9BTUJJRU5UOiAgICAgICAvKiAyICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0FNQklFTlQ7CiAgICAgICAgICAgICAgICBicmVhazsJCQogICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HTU9ERTogICAgICAgLyogNCAqLwogICAgICAgICAgICAgICAgcnMgPSBEM0RSRU5ERVJTVEFURV9GT0dWRVJURVhNT0RFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dTVEFSVDogICAgICAvKiA1ICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR1NUQVJUOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dFTkQ6ICAgICAgICAvKiA2ICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0VORDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HREVOU0lUWTogICAgLyogNyAqLwogICAgICAgICAgICAgICAgcnMgPSBEM0RSRU5ERVJTVEFURV9GT0dERU5TSVRZOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRDNETElHSFRTVEFURV9DT0xPUlZFUlRFWDogICAvKiA4ICovCiAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0NPTE9SVkVSVEVYOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gRDNETElHSFRTVEFURVRZUEUgJWQuXG4iLCBMaWdodFN0YXRlVHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKICAgIH0KCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldExpZ2h0U3RhdGUoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUU1RBVEVUWVBFIExpZ2h0U3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqVmFsdWUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIExpZ2h0U3RhdGVUeXBlLCBWYWx1ZSk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19HZXRMaWdodFN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWdodFN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6U2V0VHJhbnNmb3JtCiAqCiAqIEFzc2lnbnMgYSBEM0RNQVRSSVggdG8gYSB0cmFuc2Zvcm0gdHlwZS4gVGhlIHRyYW5zZm9ybSB0eXBlcyBhcmUgZGVmaW5lZAogKiBpbiBpbmNsdWRlL2QzZHR5cGVzLmguCiAqIFRoZSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCAoPTEpIGlzIHRyYW5zbGF0ZWQgdG8gRDNEVFNfV09STERNQVRSSVgoMCkKICogKD0yNTUpIGZvciB3aW5lZDNkLCBiZWNhdXNlIHRoZSAxIHRyYW5zZm9ybSBzdGF0ZSB3YXMgcmVtb3ZlZCBpbiBkM2Q4CiAqIGFuZCBXaW5lRDNEIGFscmVhZHkgdW5kZXJzdGFuZHMgdGhlIHJlcGxhY2VtZW50IEQzRFRTX1dPUkxETUFUUklYKDApCiAqCiAqIFZlcnNpb24gMiwgMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICBUcmFuc2Zvcm1TdGF0ZVR5cGU6IHRyYW5zZm9ybSBzdGF0ZSB0byBzZXQKICogIE1hdHJpeDogTWF0cml4IHRvIGFzc2lnbiB0byB0aGUgc3RhdGUKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIE1hdHJpeCA9PSBOVUxMCiAqICBGb3IgZGV0YWlscyBzZWUgSVdpbmVEM0REZXZpY2U6OlNldFRyYW5zZm9ybQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0VHJhbnNmb3JtKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYICpNYXRyaXgpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSB0eXBlID0gVHJhbnNmb3JtU3RhdGVUeXBlOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKTogUmVsYXlcbiIsIFRoaXMsIFRyYW5zZm9ybVN0YXRlVHlwZSwgTWF0cml4KTsKCiAgICBpZighTWF0cml4KQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIHN3aXRjaChUcmFuc2Zvcm1TdGF0ZVR5cGUpCiAgICB7CiAgICAgICAgY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCA6ICB0eXBlID0gV0lORUQzRFRTX1dPUkxETUFUUklYKDApOyBicmVhazsKICAgICAgICBjYXNlIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEMTogIHR5cGUgPSBXSU5FRDNEVFNfV09STERNQVRSSVgoMSk7IGJyZWFrOwogICAgICAgIGNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfV09STEQyOiAgdHlwZSA9IFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRDM6ICB0eXBlID0gV0lORUQzRFRTX1dPUkxETUFUUklYKDMpOyBicmVhazsKICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUcmFuc2Zvcm1TdGF0ZVR5cGU7CiAgICB9CgogICAgLyogTm90ZTogRDNETUFUUklYIGlzIGNvbXBhdGlibGUgd2l0aCBXSU5FRDNETUFUUklYICovCiAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0VHJhbnNmb3JtKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFUUklYKikgTWF0cml4KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUcmFuc2Zvcm0oSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIFRyYW5zZm9ybVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVggKkQzRE1hdHJpeCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBEM0RNYXRyaXgpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfU2V0VHJhbnNmb3JtKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNYXRyaXgpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFRyYW5zZm9ybShJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgVHJhbnNmb3JtU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqRDNETWF0cml4KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUcmFuc2Zvcm1TdGF0ZVR5cGUsIEQzRE1hdHJpeCk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRUcmFuc2Zvcm0oSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1hdHJpeCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpHZXRUcmFuc2Zvcm0KICoKICogUmV0dXJucyB0aGUgbWF0cml4IGFzc2lnbmVkIHRvIGEgdHJhbnNmb3JtIHN0YXRlCiAqIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEIGlzIHRyYW5zbGF0ZWQgdG8gRDNEVFNfV09STERNQVRSSVgoMCksIHNlZQogKiBTZXRUcmFuc2Zvcm0KICoKICogUGFyYW1zOgogKiAgVHJhbnNmb3JtU3RhdGVUeXBlOiBTdGF0ZSB0byByZWFkIHRoZSBtYXRyaXggZnJvbQogKiAgTWF0cml4OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBtYXRyaXggYXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIE1hdHJpeCA9PSBOVUxMCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpHZXRUcmFuc2Zvcm0KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFRyYW5zZm9ybShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgVHJhbnNmb3JtU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqTWF0cml4KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgdHlwZSA9IFRyYW5zZm9ybVN0YXRlVHlwZTsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBUcmFuc2Zvcm1TdGF0ZVR5cGUsIE1hdHJpeCk7CgogICAgaWYoIU1hdHJpeCkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICBzd2l0Y2goVHJhbnNmb3JtU3RhdGVUeXBlKQogICAgewogICAgICAgIGNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfV09STEQgOiAgdHlwZSA9IFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRDE6ICB0eXBlID0gV0lORUQzRFRTX1dPUkxETUFUUklYKDEpOyBicmVhazsKICAgICAgICBjYXNlIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEMjogIHR5cGUgPSBXSU5FRDNEVFNfV09STERNQVRSSVgoMik7IGJyZWFrOwogICAgICAgIGNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfV09STEQzOiAgdHlwZSA9IFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gVHJhbnNmb3JtU3RhdGVUeXBlOwogICAgfQoKICAgIC8qIE5vdGU6IEQzRE1BVFJJWCBpcyBjb21wYXRpYmxlIHdpdGggV0lORUQzRE1BVFJJWCAqLwogICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX0dldFRyYW5zZm9ybShUaGlzLT53aW5lRDNERGV2aWNlLCB0eXBlLCAoV0lORUQzRE1BVFJJWCopIE1hdHJpeCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VHJhbnNmb3JtKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYICpEM0RNYXRyaXgpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFRyYW5zZm9ybVN0YXRlVHlwZSwgRDNETWF0cml4KTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldFRyYW5zZm9ybShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1TdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETWF0cml4KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRUcmFuc2Zvcm0oSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIFRyYW5zZm9ybVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVggKkQzRE1hdHJpeCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBEM0RNYXRyaXgpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0VHJhbnNmb3JtKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNYXRyaXgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6TXVsdGlwbHlUcmFuc2Zvcm0KICoKICogTXVsdGlwbGllcyB0aGUgYWxyZWFkeS1zZXQgdHJhbnNmb3JtIG1hdHJpeCBvZiBhIHRyYW5zZm9ybSBzdGF0ZQogKiB3aXRoIGFub3RoZXIgbWF0cml4LiBGb3IgdGhlIHdvcmxkIG1hdHJpeCwgc2VlIFNldFRyYW5zZm9ybQogKgogKiBWZXJzaW9uIDIsIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgVHJhbnNmb3JtU3RhdGVUeXBlOiBUcmFuc2Zvcm0gc3RhdGUgdG8gbXVsdGlwbHkKICogIEQzRE1hdHJpeCBNYXRyaXggdG8gbXVsdGlwbHkgd2l0aC4KICoKICogUmV0dXJucwogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRDNETWF0cml4IGlzIE5VTEwKICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6Ok11bHRpcGx5VHJhbnNmb3JtCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19NdWx0aXBseVRyYW5zZm9ybShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVggKkQzRE1hdHJpeCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHR5cGU7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApOiBSZWxheVxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBEM0RNYXRyaXgpOwoKICAgIHN3aXRjaChUcmFuc2Zvcm1TdGF0ZVR5cGUpCiAgICB7CiAgICAgICAgY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCA6ICB0eXBlID0gV0lORUQzRFRTX1dPUkxETUFUUklYKDApOyBicmVhazsKICAgICAgICBjYXNlIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEMTogIHR5cGUgPSBXSU5FRDNEVFNfV09STERNQVRSSVgoMSk7IGJyZWFrOwogICAgICAgIGNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfV09STEQyOiAgdHlwZSA9IFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRDM6ICB0eXBlID0gV0lORUQzRFRTX1dPUkxETUFUUklYKDMpOyBicmVhazsKICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUcmFuc2Zvcm1TdGF0ZVR5cGU7CiAgICB9CgogICAgLyogTm90ZTogRDNETUFUUklYIGlzIGNvbXBhdGlibGUgd2l0aCBXSU5FRDNETUFUUklYICovCiAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfTXVsdGlwbHlUcmFuc2Zvcm0oVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFUUklYKikgRDNETWF0cml4KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19NdWx0aXBseVRyYW5zZm9ybShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVggKkQzRE1hdHJpeCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBEM0RNYXRyaXgpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfTXVsdGlwbHlUcmFuc2Zvcm0oSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1TdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNYXRyaXgpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX011bHRpcGx5VHJhbnNmb3JtKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIFRyYW5zZm9ybVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqRDNETWF0cml4KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUcmFuc2Zvcm1TdGF0ZVR5cGUsIEQzRE1hdHJpeCk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19NdWx0aXBseVRyYW5zZm9ybShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1hdHJpeCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpEcmF3UHJpbWl0aXZlCiAqCiAqIERyYXdzIHByaW1pdGl2ZXMgYmFzZWQgb24gdmVydGljZXMgaW4gYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgcG9pbnRlcgogKgogKiBWZXJzaW9uIDIsIDMgYW5kIDcuIFRoZSBJRGlyZWN0M0REZXZpY2UyIHRodW5rIGNvbnZlcnRzIHRoZSBmaXhlZCB2ZXJ0ZXggdHlwZSBpbnRvCiAqIGFuIEZWRiBmb3JtYXQgZm9yIEQzRDcKICoKICogUGFyYW1zOgogKiAgUHJpbWl0aXZlVHlwZTogVGhlIHR5cGUgb2YgdGhlIHByaW1pdGl2ZXMgdG8gZHJhdwogKiAgVmVydGV4IHR5cGU6IEZsZXhpYmxlIHZlcnRleCBmb3JtYXQgdmVydGV4IGRlc2NyaXB0aW9uCiAqICBWZXJ0aWNlczogUG9pbnRlciB0byB0aGUgdmVydGV4IGFycmF5CiAqICBWZXJ0ZXhDb3VudDogVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyB0byBkcmF3CiAqICBGbGFnczogQXMgdXN1YWwgYSBmZXcgZmxhZ3MKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFZlcnRpY2VzIGlzIE5VTEwKICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OkRyYXdQcmltaXRpdmVVUAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd1ByaW1pdGl2ZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBVSU5UIFByaW1pdGl2ZUNvdW50LCBzdHJpZGU7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOHgsJXAsJTA4eCwlMDh4KTogUmVsYXkhXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEZsYWdzKTsKCiAgICBpZighVmVydGljZXMpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgLyogR2V0IHRoZSB2ZXJ0ZXggY291bnQgKi8KICAgIHN3aXRjaChQcmltaXRpdmVUeXBlKQogICAgewogICAgICBjYXNlIEQzRFBUX1BPSU5UTElTVDogCiAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgRDNEUFRfTElORUxJU1Q6IAogICAgICAgIFByaW1pdGl2ZUNvdW50ID0gVmVydGV4Q291bnQgLyAyOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBEM0RQVF9MSU5FU1RSSVA6CiAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudCAtIDE7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoKICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC8gMzsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoKICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC0gMjsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CiAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudCAtIDI7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OiByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICAvKiBHZXQgdGhlIHN0cmlkZSAqLwogICAgc3RyaWRlID0gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKFZlcnRleFR5cGUpOwoKICAgIC8qIFNldCB0aGUgRlZGICovCiAgICBociA9IElXaW5lRDNERGV2aWNlX1NldFZlcnRleERlY2xhcmF0aW9uKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3SW1wbF9GaW5kRGVjbChUaGlzLT5kZHJhdywgVmVydGV4VHlwZSkpOwogICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CgogICAgLyogVGhpcyBtZXRob2QgdHJhbnNsYXRlcyB0byB0aGUgdXNlciBwb2ludGVyIGRyYXcgb2YgV2luZUQzRCAqLwogICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX0RyYXdQcmltaXRpdmVVUChUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlMDh4LCVwLCUwOHgsJTA4eCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEZsYWdzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdQcmltaXRpdmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0RyYXdQcmltaXRpdmUoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYVFlQRSBWZXJ0ZXhUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CiAgICBEV09SRCBGVkY7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlMDh4LCVwLCUwOHgsJTA4eCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEZsYWdzKTsKCiAgICBzd2l0Y2goVmVydGV4VHlwZSkKICAgIHsKICAgICAgICBjYXNlIEQzRFZUX1ZFUlRFWDogRlZGID0gRDNERlZGX1ZFUlRFWDsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RWVF9MVkVSVEVYOiBGVkYgPSBEM0RGVkZfTFZFUlRFWDsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RWVF9UTFZFUlRFWDogRlZGID0gRDNERlZGX1RMVkVSVEVYOyBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBFUlIoIlVuZXhwZWN0ZWQgdmVydGV4IHR5cGUgJWRcbiIsIFZlcnRleFR5cGUpOwogICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgIH0KCiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3UHJpbWl0aXZlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6RHJhd0luZGV4ZWRQcmltaXRpdmUKICoKICogRHJhd3MgdmVydGljZXMgZnJvbSBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBwb2ludGVyLCBiYXNlZCBvbiB0aGUgaW5kZXgKICogbnVtYmVycyBpbiBhIFdPUkQgYXJyYXkuCiAqCiAqIFZlcnNpb24gMiwgMyBhbmQgNy4gVGhlIHZlcnNpb24gNyB0aHVuayB0cmFuc2xhdGVzIHRoZSB2ZXJ0ZXggdHlwZSBpbnRvCiAqIGFuIEZWRiBmb3JtYXQgZm9yIEQzRDcKICoKICogUGFyYW1zOgogKiAgUHJpbWl0aXZlVHlwZTogVGhlIHByaW1pdGl2ZSB0eXBlIHRvIGRyYXcKICogIFZlcnRleFR5cGU6IFRoZSBGVkYgdmVydGV4IGRlc2NyaXB0aW9uCiAqICBWZXJ0aWNlczogUG9pbnRlciB0byB0aGUgdmVydGV4IGFycmF5CiAqICBWZXJ0ZXhDb3VudDogPwogKiAgSW5kaWNlczogUG9pbnRlciB0byB0aGUgaW5kZXggYXJyYXkKICogIEluZGV4Q291bnQ6IE51bWJlciBvZiBpbmRpY2VzID0gTnVtYmVyIG9mIHZlcnRpY2VzIHRvIGRyYXcKICogIEZsYWdzOiBBcyB1c3VhbCwgc29tZSBmbGFncwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgVmVydGljZXMgb3IgSW5kaWNlcyBpcyBOVUxMCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpEcmF3SW5kZXhlZFByaW1pdGl2ZVVQCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19EcmF3SW5kZXhlZFByaW1pdGl2ZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVUlOVCBQcmltaXRpdmVDb3VudCA9IDA7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOHgsJXAsJTA4eCwlcCwlMDh4LCUwOHgpOiBSZWxheSFcbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIFZlcnRleFR5cGUsIFZlcnRpY2VzLCBWZXJ0ZXhDb3VudCwgSW5kaWNlcywgSW5kZXhDb3VudCwgRmxhZ3MpOwogICAgLyogR2V0IHRoZSBwcmltaXRpdmUgbnVtYmVyICovCiAgICBzd2l0Y2goUHJpbWl0aXZlVHlwZSkKICAgIHsKICAgICAgY2FzZSBEM0RQVF9QT0lOVExJU1Q6IAogICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgRDNEUFRfTElORUxJU1Q6IAogICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudCAvIDI7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEQzRFBUX0xJTkVTVFJJUDoKICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAxOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CiAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBJbmRleENvdW50IC8gMzsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoKICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAyOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoKICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAyOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDogcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgLyogU2V0IHRoZSBEM0REZXZpY2UncyBGVkYgKi8KICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0VmVydGV4RGVjbGFyYXRpb24oVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdJbXBsX0ZpbmREZWNsKFRoaXMtPmRkcmF3LCBWZXJ0ZXhUeXBlKSk7CiAgICBpZihGQUlMRUQoaHIpKQogICAgewogICAgICAgIEVSUigiICglcCkgU2V0dGluZyB0aGUgRlZGIGZhaWxlZCwgaHIgPSAleCFcbiIsIFRoaXMsIGhyKTsKICAgICAgICByZXR1cm4gaHI7CiAgICB9CgogICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIE1pblZlcnRleEluZGV4ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4Q291bnQgLyogVUlOVCBOdW1WZXJ0ZXhJbmRleCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RGTVRfSU5ERVgxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKFZlcnRleFR5cGUpKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3SW5kZXhlZFByaW1pdGl2ZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJTA4eCwlcCwlMDh4LCVwLCUwOHgsJTA4eCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEluZGljZXMsIEluZGV4Q291bnQsIEZsYWdzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdJbmRleGVkUHJpbWl0aXZlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfRHJhd0luZGV4ZWRQcmltaXRpdmUoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRVJURVhUWVBFIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgRFdPUkQgRlZGOwogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJTA4eCwlcCwlMDh4LCVwLCUwOHgsJTA4eCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEluZGljZXMsIEluZGV4Q291bnQsIEZsYWdzKTsKCiAgICBzd2l0Y2goVmVydGV4VHlwZSkKICAgIHsKICAgICAgICBjYXNlIEQzRFZUX1ZFUlRFWDogRlZGID0gRDNERlZGX1ZFUlRFWDsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RWVF9MVkVSVEVYOiBGVkYgPSBEM0RGVkZfTFZFUlRFWDsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RWVF9UTFZFUlRFWDogRlZGID0gRDNERlZGX1RMVkVSVEVYOyBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBFUlIoIlVuZXhwZWN0ZWQgdmVydGV4IHR5cGUgJWRcbiIsIFZlcnRleFR5cGUpOwogICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgIH0KCiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3SW5kZXhlZFByaW1pdGl2ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRDbGlwU3RhdHVzCiAqCiAqIFNldHMgdGhlIGNsaXAgc3RhdHVzLiBUaGlzIGRlZmluZXMgdGhpbmdzIGFzIGNsaXBwaW5nIGNvbmRpdGlvbnMgYW5kCiAqIHRoZSBleHRlbnRzIG9mIHRoZSBjbGlwcGluZyByZWdpb24uCiAqCiAqIFZlcnNpb24gMiwgMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICBDbGlwU3RhdHVzOgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIGJlY2F1c2UgaXQncyBhIHN0dWIKICogIChEREVSUl9JTlZBTElEUEFSQU1TIGlmIENsaXBTdGF0dXMgPT0gTlVMTCkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X1NldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEZJWE1FKCIoJXApLT4oJXApOiBTdHViIVxuIiwgVGhpcywgQ2xpcFN0YXR1cyk7CgogICAgLyogRDNEQ0xJUFNUQVRVUyBhbmQgV0lORUQzRENMSVBTVEFUVVMgYXJlIGRpZmZlcmVudC4gSSBkb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IHRoZW0KICAgICAqIFBlcmhhcHMgdGhpcyBuZWVkcyBhIG5ldyBkYXRhIHR5cGUgYW5kIGFuIGFkZGl0aW9uYWwgSVdpbmVEM0REZXZpY2UgbWV0aG9kCiAgICAgKi8KICAgIC8qIHJldHVybiBJV2luZUQzRERldmljZV9TZXRDbGlwU3RhdHVzKFRoaXMtPndpbmVEM0REZXZpY2UsIENsaXBTdGF0dXMpOyovCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDbGlwU3RhdHVzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldENsaXBTdGF0dXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBTdGF0dXMpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDbGlwU3RhdHVzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldENsaXBTdGF0dXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBTdGF0dXMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0Q2xpcFN0YXR1cwogKgogKiBSZXR1cm5zIHRoZSBjbGlwIHN0YXR1cwogKgogKiBQYXJhbXM6CiAqICBDbGlwU3RhdHVzOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBjbGlwIHN0YXR1cyB0bwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEZJWE1FKCIoJXApLT4oJXApOiBTdHViIVxuIiwgVGhpcywgQ2xpcFN0YXR1cyk7CgogICAgLyogRDNEQ0xJUFNUQVRVUyBhbmQgV0lORUQzRENMSVBTVEFUVVMgYXJlIGRpZmZlcmVudC4gSSBkb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IHRoZW0gKi8KICAgIC8qIHJldHVybiBJV2luZUQzRERldmljZV9HZXRDbGlwU3RhdHVzKFRoaXMtPndpbmVEM0REZXZpY2UsIENsaXBTdGF0dXMpOyovCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDbGlwU3RhdHVzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldENsaXBTdGF0dXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBTdGF0dXMpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDbGlwU3RhdHVzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldENsaXBTdGF0dXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBTdGF0dXMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlOjpEcmF3UHJpbWl0aXZlU3RyaWRlZAogKgogKiBEcmF3cyB2ZXJ0aWNlcyBkZXNjcmliZWQgYnkgYSBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgc3RydWN0dXJlLgogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgUHJpbWl0aXZlVHlwZTogVGhlIHByaW1pdGl2ZSB0eXBlIHRvIGRyYXcKICogIFZlcnRleFR5cGU6IFRoZSBGVkYgZGVzY3JpcHRpb24gb2YgdGhlIHZlcnRpY2VzIHRvIGRyYXcgKGZvciB0aGUgc3RyaWRlPz8pCiAqICBEM0REcmF3UHJpbVN0cmlkZURhdGE6IEEgRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBIHN0cnVjdHVyZSBkZXNjcmliaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2ZXJ0ZXggZGF0YSBsb2NhdGlvbnMKICogIFZlcnRleENvdW50OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIHRvIGRyYXcKICogIEZsYWdzOiBTb21lIGZsYWdzCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICogIChEREVSUl9JTlZBTElEUEFSQU1TIGlmIEQzRERyYXdQcmltU3RyaWRlRGF0YSBpcyBOVUxMKQogKiAgKEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OkRyYXdQcmltaXRpdmVTdHJpZGVkKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd1ByaW1pdGl2ZVN0cmlkZWQoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBICpEM0REcmF3UHJpbVN0cmlkZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBXaW5lRGlyZWN0M0RWZXJ0ZXhTdHJpZGVkRGF0YSBXaW5lRDNEU3RyaWRlZDsKICAgIGludCBpOwogICAgVUlOVCBQcmltaXRpdmVDb3VudDsKCiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJTA4eCwlcCwlMDh4LCUwOHgpOiBzdHViIVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZSwgRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBWZXJ0ZXhDb3VudCwgRmxhZ3MpOwoKICAgIG1lbXNldCgmV2luZUQzRFN0cmlkZWQsIDAsIHNpemVvZihXaW5lRDNEU3RyaWRlZCkpOwogICAgLyogR2V0IHRoZSBzdHJpZGVkIGRhdGEgcmlnaHQuIHRoZSB3aW5lZDNkIHN0cnVjdHVyZSBpcyBhIGJpdCBiaWdnZXIKICAgICAqIFdhdGNoIG91dDogVGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpZGVkIGRhdGEgYXJlIGRldGVybWluZWQgYnkgdGhlIGZ2ZiwKICAgICAqIG5vdCBieSB0aGUgbWVtYmVycyBzZXQgaW4gRDNERHJhd1ByaW1TdHJpZGVEYXRhLiBTbyBpdCdzIHZhbGlkCiAgICAgKiB0byBoYXZlIGRpZmZ1c2UubHB2RGF0YSBzZXQgdG8gMHhkZWFkYmVlZiBpZiB0aGUgZGlmZnVzZSBmbGFnIGlzCiAgICAgKiBub3Qgc2V0IGluIHRoZSBmdmYuCiAgICAgKi8KICAgIGlmKFZlcnRleFR5cGUgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykKICAgIHsKICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMucG9zaXRpb24ubHBEYXRhID0gRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5wb3NpdGlvbi5scHZEYXRhOwogICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5wb3NpdGlvbi5kd1N0cmlkZSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+cG9zaXRpb24uZHdTdHJpZGU7CiAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnBvc2l0aW9uLmR3VHlwZSA9IFdJTkVEM0RERUNMVFlQRV9GTE9BVDM7CiAgICAgICAgaWYgKFZlcnRleFR5cGUgJiBEM0RGVkZfWFlaUkhXKQogICAgICAgIHsKICAgICAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnBvc2l0aW9uLmR3VHlwZSA9IFdJTkVEM0RERUNMVFlQRV9GTE9BVDQ7CiAgICAgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5wb3NpdGlvbl90cmFuc2Zvcm1lZCA9IFRSVUU7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5wb3NpdGlvbl90cmFuc2Zvcm1lZCA9IEZBTFNFOwogICAgfQoKICAgIGlmKFZlcnRleFR5cGUgJiBEM0RGVkZfTk9STUFMKQogICAgewogICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5ub3JtYWwubHBEYXRhID0gRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5ub3JtYWwubHB2RGF0YTsKICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMubm9ybWFsLmR3U3RyaWRlID0gRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5ub3JtYWwuZHdTdHJpZGU7CiAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLm5vcm1hbC5kd1R5cGUgPSBXSU5FRDNEREVDTFRZUEVfRkxPQVQzOwogICAgfQoKICAgIGlmKFZlcnRleFR5cGUgJiBEM0RGVkZfRElGRlVTRSkKICAgIHsKICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMuZGlmZnVzZS5scERhdGEgPSBEM0REcmF3UHJpbVN0cmlkZURhdGEtPmRpZmZ1c2UubHB2RGF0YTsKICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMuZGlmZnVzZS5kd1N0cmlkZSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5kd1N0cmlkZTsKICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMuZGlmZnVzZS5kd1R5cGUgPSBXSU5FRDNEREVDTFRZUEVfU0hPUlQ0OwogICAgfQoKICAgIGlmKFZlcnRleFR5cGUgJiBEM0RGVkZfU1BFQ1VMQVIpCiAgICB7CiAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnNwZWN1bGFyLmxwRGF0YSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+c3BlY3VsYXIubHB2RGF0YTsKICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMuc3BlY3VsYXIuZHdTdHJpZGUgPSBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnNwZWN1bGFyLmR3U3RyaWRlOwogICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5zcGVjdWxhci5kd1R5cGUgPSBXSU5FRDNEREVDTFRZUEVfU0hPUlQ0OwogICAgfQoKICAgIGZvciggaSA9IDA7IGkgPCBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoVmVydGV4VHlwZSk7IGkrKykKICAgIHsKICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMudGV4Q29vcmRzW2ldLmxwRGF0YSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1tpXS5scHZEYXRhOwogICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy50ZXhDb29yZHNbaV0uZHdTdHJpZGUgPSBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnRleHR1cmVDb29yZHNbaV0uZHdTdHJpZGU7CiAgICAgICAgc3dpdGNoKEdFVF9URVhDT09SRF9TSVpFX0ZST01fRlZGKFZlcnRleFR5cGUsIGkpKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAxOiBXaW5lRDNEU3RyaWRlZC51LnMudGV4Q29vcmRzW2ldLmR3VHlwZSA9IFdJTkVEM0RERUNMVFlQRV9GTE9BVDE7IGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6IFdpbmVEM0RTdHJpZGVkLnUucy50ZXhDb29yZHNbaV0uZHdUeXBlID0gV0lORUQzRERFQ0xUWVBFX0ZMT0FUMjsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzogV2luZUQzRFN0cmlkZWQudS5zLnRleENvb3Jkc1tpXS5kd1R5cGUgPSBXSU5FRDNEREVDTFRZUEVfRkxPQVQzOyBicmVhazsKICAgICAgICAgICAgY2FzZSA0OiBXaW5lRDNEU3RyaWRlZC51LnMudGV4Q29vcmRzW2ldLmR3VHlwZSA9IFdJTkVEM0RERUNMVFlQRV9GTE9BVDQ7IGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OiBFUlIoIlVuZXhwZWN0ZWQgdGV4dHVyZSBjb29yZGluYXRlIHNpemUgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihWZXJ0ZXhUeXBlLCBpKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEdldCB0aGUgcHJpbWl0aXZlIGNvdW50ICovCiAgICBzd2l0Y2goUHJpbWl0aXZlVHlwZSkKICAgIHsKICAgICAgICBjYXNlIEQzRFBUX1BPSU5UTElTVDogCiAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50OwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRDNEUFRfTElORUxJU1Q6IAogICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudCAvIDI7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBEM0RQVF9MSU5FU1RSSVA6CiAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC0gMTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoKICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gVmVydGV4Q291bnQgLyAzOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoKICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gVmVydGV4Q291bnQgLSAyOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CiAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC0gMjsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OiByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICAvKiBXaW5lRDNEIGRvZXNuJ3QgbmVlZCB0aGUgRlZGIGhlcmUgKi8KICAgIHJldHVybiBJV2luZUQzRERldmljZV9EcmF3UHJpbWl0aXZlU3RyaWRlZChUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldpbmVEM0RTdHJpZGVkKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3UHJpbWl0aXZlU3RyaWRlZChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgKkQzRERyYXdQcmltU3RyaWRlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOHgsJXAsJTA4eCwlMDh4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIFZlcnRleFR5cGUsIEQzRERyYXdQcmltU3RyaWRlRGF0YSwgVmVydGV4Q291bnQsIEZsYWdzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdQcmltaXRpdmVTdHJpZGVkKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REcmF3UHJpbVN0cmlkZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTc6OkRyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZAogKgogKiBEcmF3cyBwcmltaXRpdmVzIHNwZWNpZmllZCBieSBzdHJpZGVkIGRhdGEgbG9jYXRpb25zIGJhc2VkIG9uIGluZGljZXMKICoKICogVmVyc2lvbiAzIGFuZCA3CiAqCiAqIFBhcmFtczoKICogIFByaW1pdGl2ZVR5cGU6CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICogIChEREVSUl9JTlZBTElEUEFSQU1TIGlmIEQzRERyYXdQcmltU3RyaWRlRGF0YSBpcyBOVUxMKQogKiAgKERERVJSX0lOVkFMSURQQVJBTVMgaWYgSW5kaWNlcyBpcyBOVUxMKQogKiAgKEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6RHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSAqRDNERHJhd1ByaW1TdHJpZGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKkluZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgSW5kZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgRklYTUUoIiglcCktPiglMDh4LCUwOHgsJXAsJTA4eCwlcCwlMDh4LCUwOHgpOiBzdHViIVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZSwgRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBWZXJ0ZXhDb3VudCwgSW5kaWNlcywgSW5kZXhDb3VudCwgRmxhZ3MpOwoKICAgIC8qIEknbGwgaW1wbGVtZW50IGl0IGFzIHNvb24gYXMgSSBmaW5kIGEgYXBwIHRvIHRlc3QgaXQuCiAgICAgKiBUaGlzIG5lZWRzIGFuIGFkZGl0aW9uYWwgbWV0aG9kIGluIElXaW5lRDNERGV2aWNlLgogICAgICovCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgKkQzRERyYXdQcmltU3RyaWRlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICpJbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOHgsJXAsJTA4eCwlcCwlMDh4LCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIFByaW1pdGl2ZVR5cGUsIFZlcnRleFR5cGUsIEQzRERyYXdQcmltU3RyaWRlRGF0YSwgVmVydGV4Q291bnQsIEluZGljZXMsIEluZGV4Q291bnQsIEZsYWdzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERHJhd1ByaW1TdHJpZGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpEcmF3UHJpbWl0aXZlVkIKICoKICogRHJhd3MgcHJpbWl0aXZlcyBmcm9tIGEgdmVydGV4IGJ1ZmZlciB0byB0aGUgc2NyZWVuLgogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgUHJpbWl0aXZlVHlwZTogVHlwZSBvZiBwcmltaXRpdmUgdG8gYmUgcmVuZGVyZWQuCiAqICBEM0RWZXJ0ZXhCdWY6IFNvdXJjZSBWZXJ0ZXggQnVmZmVyCiAqICBTdGFydFZlcnRleDogSW5kZXggb2YgdGhlIGZpcnN0IHZlcnRleCBmcm9tIHRoZSBidWZmZXIgdG8gYmUgcmVuZGVyZWQKICogIE51bVZlcnRpY2VzOiBOdW1iZXIgb2YgdmVydGljZXMgdG8gYmUgcmVuZGVyZWQKICogIEZsYWdzOiBDYW4gYmUgRDNERFBfV0FJVCB0byB3YWl0IHVudGlsIHJlbmRlcmluZyBoYXMgZmluaXNoZWQKICoKICogUmV0dXJuIHZhbHVlcwogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRDNEVmVydGV4QnVmIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdQcmltaXRpdmVWQihJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqRDNEVmVydGV4QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXJ0VmVydGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIE51bVZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICp2YiA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIEQzRFZlcnRleEJ1Zik7CiAgICBVSU5UIFByaW1pdGl2ZUNvdW50OwogICAgSFJFU1VMVCBocjsKICAgIERXT1JEIHN0cmlkZTsKICAgIFdJTkVEM0RWRVJURVhCVUZGRVJfREVTQyBEZXNjOwoKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCwlMDh4LCUwOHgsJTA4eClcbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIEQzRFZlcnRleEJ1ZiwgU3RhcnRWZXJ0ZXgsIE51bVZlcnRpY2VzLCBGbGFncyk7CgogICAgLyogU2FuaXR5IGNoZWNrcyAqLwogICAgaWYoIXZiKQogICAgewogICAgICAgIEVSUigiKCVwKSBObyBWZXJ0ZXggYnVmZmVyIHNwZWNpZmllZFxuIiwgVGhpcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgLyogR2V0IHRoZSBwcmltaXRpdmUgY291bnQgKi8KICAgIHN3aXRjaChQcmltaXRpdmVUeXBlKQogICAgewogICAgICAgIGNhc2UgRDNEUFRfUE9JTlRMSVNUOiAKICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gTnVtVmVydGljZXM7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBEM0RQVF9MSU5FTElTVDogCiAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IE51bVZlcnRpY2VzIC8gMjsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEQzRFBUX0xJTkVTVFJJUDoKICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gTnVtVmVydGljZXMgLSAxOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOgogICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBOdW1WZXJ0aWNlcyAvIDM7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOgogICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBOdW1WZXJ0aWNlcyAtIDI7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoKICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gTnVtVmVydGljZXMgLSAyOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6IHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKICAgIC8qIEdldCB0aGUgRlZGIG9mIHRoZSB2ZXJ0ZXggYnVmZmVyLCBhbmQgaXRzIHN0cmlkZSAqLwogICAgaHIgPSBJV2luZUQzRFZlcnRleEJ1ZmZlcl9HZXREZXNjKHZiLT53aW5lRDNEVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZXNjKTsKICAgIGlmKGhyICE9IEQzRF9PSykKICAgIHsKICAgICAgICBFUlIoIiglcCkgSVdpbmVEM0RWZXJ0ZXhCdWZmZXI6OkdldERlc2MgZmFpbGVkIHdpdGggaHIgPSAlMDh4XG4iLCBUaGlzLCBocik7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQogICAgc3RyaWRlID0gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERlc2MuRlZGKTsKCiAgICBociA9IElXaW5lRDNERGV2aWNlX1NldFZlcnRleERlY2xhcmF0aW9uKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZiLT53aW5lRDNEVmVydGV4RGVjbGFyYXRpb24pOwogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICBFUlIoIiAoJXApIFNldHRpbmcgdGhlIEZWRiBmYWlsZWQsIGhyID0gJXghXG4iLCBUaGlzLCBocik7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQoKICAgIC8qIFNldCB0aGUgdmVydGV4IHN0cmVhbSBzb3VyY2UgKi8KICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0U3RyZWFtU291cmNlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFN0cmVhbU51bWJlciAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZiLT53aW5lRDNEVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBTdGFydFZlcnRleCAtIHdlIHBhc3MgdGhpcyB0byBEcmF3UHJpbWl0aXZlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKICAgIGlmKGhyICE9IEQzRF9PSykKICAgIHsKICAgICAgICBFUlIoIiglcCkgSURpcmVjdDNERGV2aWNlOjpTZXRTdHJlYW1Tb3VyY2UgZmFpbGVkIHdpdGggaHIgPSAlMDh4XG4iLCBUaGlzLCBocik7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQoKICAgIC8qIE5vdyBkcmF3IHRoZSBwcmltaXRpdmVzICovCiAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfRHJhd1ByaW1pdGl2ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VmVydGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlQ291bnQpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdQcmltaXRpdmVWQihJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyICpEM0RWZXJ0ZXhCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnRWZXJ0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTnVtVmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKnZiID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBEM0RWZXJ0ZXhCdWYpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXAsJTA4eCwlMDh4LCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgIFByaW1pdGl2ZVR5cGUsIHZiLCBTdGFydFZlcnRleCwgTnVtVmVydGljZXMsIEZsYWdzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdQcmltaXRpdmVWQihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKHZiLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydFZlcnRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6RHJhd0luZGV4ZWRQcmltaXRpdmVWQgogKgogKiBEcmF3cyBwcmltaXRpdmVzIGZyb20gYSB2ZXJ0ZXggYnVmZmVyIHRvIHRoZSBzY3JlZW4KICoKICogUGFyYW1zOgogKiAgUHJpbWl0aXZlVHlwZTogVHlwZSBvZiBwcmltaXRpdmUgdG8gYmUgcmVuZGVyZWQuCiAqICBEM0RWZXJ0ZXhCdWY6IFNvdXJjZSBWZXJ0ZXggQnVmZmVyCiAqICBTdGFydFZlcnRleDogSW5kZXggb2YgdGhlIGZpcnN0IHZlcnRleCBmcm9tIHRoZSBidWZmZXIgdG8gYmUgcmVuZGVyZWQKICogIE51bVZlcnRpY2VzOiBOdW1iZXIgb2YgdmVydGljZXMgdG8gYmUgcmVuZGVyZWQKICogIEluZGljZXM6IEFycmF5IG9mIERXT1JEcyB1c2VkIHRvIGluZGV4IGludG8gdGhlIFZlcnRpY2VzCiAqICBJbmRleENvdW50OiBOdW1iZXIgb2YgaW5kaWNlcyBpbiBJbmRpY2VzCiAqICBGbGFnczogQ2FuIGJlIEQzRERQX1dBSVQgdG8gd2FpdCB1bnRpbCByZW5kZXJpbmcgaGFzIGZpbmlzaGVkCiAqCiAqIFJldHVybiB2YWx1ZXMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdJbmRleGVkUHJpbWl0aXZlVkIoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqRDNEVmVydGV4QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFydFZlcnRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTnVtVmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKkluZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICp2YiA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIEQzRFZlcnRleEJ1Zik7CiAgICBEV09SRCBzdHJpZGU7CiAgICBVSU5UIFByaW1pdGl2ZUNvdW50OwogICAgV09SRCAqTG9ja2VkSW5kaWNlczsKICAgIEhSRVNVTFQgaHI7CiAgICBXSU5FRDNEVkVSVEVYQlVGRkVSX0RFU0MgRGVzYzsKCiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXAsJWQsJWQsJXAsJWQsJTA4eClcbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIHZiLCBTdGFydFZlcnRleCwgTnVtVmVydGljZXMsIEluZGljZXMsIEluZGV4Q291bnQsIEZsYWdzKTsKCiAgICAvKiBTdGVwczoKICAgICAqIDEpIENhbGN1bGF0ZSBzb21lIHRoaW5nczogVmVydGV4IGNvdW50IC0+IFByaW1pdGl2ZSBjb3VudCwgc3RyaWRlLCAuLi4KICAgICAqIDIpIFVwbG9hZCB0aGUgSW5kaWNlcyB0byB0aGUgaW5kZXggYnVmZmVyCiAgICAgKiAzKSBTZXQgdGhlIGluZGV4IHNvdXJjZQogICAgICogNCkgU2V0IHRoZSBWZXJ0ZXggQnVmZmVyIGFzIHRoZSBTdHJlYW0gc291cmNlCiAgICAgKiA1KSBDYWxsIElXaW5lRDNERGV2aWNlOjpEcmF3SW5kZXhlZFByaW1pdGl2ZQogICAgICovCgogICAgLyogR2V0IHRoZSBwcmltaXRpdmUgY291bnQgKi8KICAgIHN3aXRjaChQcmltaXRpdmVUeXBlKQogICAgewogICAgICAgIGNhc2UgRDNEUFRfUE9JTlRMSVNUOiAKICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEQzRFBUX0xJTkVMSVNUOiAKICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudCAvIDI7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBEM0RQVF9MSU5FU1RSSVA6CiAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAxOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOgogICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBJbmRleENvdW50IC8gMzsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CiAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAyOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CiAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAyOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6IHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKICAgIC8qIEdldCB0aGUgRlZGIG9mIHRoZSB2ZXJ0ZXggYnVmZmVyLCBhbmQgaXRzIHN0cmlkZSAqLwogICAgaHIgPSBJV2luZUQzRFZlcnRleEJ1ZmZlcl9HZXREZXNjKHZiLT53aW5lRDNEVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZXNjKTsKICAgIGlmKGhyICE9IEQzRF9PSykKICAgIHsKICAgICAgICBFUlIoIiglcCkgSVdpbmVEM0RWZXJ0ZXhCdWZmZXI6OkdldERlc2MgZmFpbGVkIHdpdGggaHIgPSAlMDh4XG4iLCBUaGlzLCBocik7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQogICAgc3RyaWRlID0gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERlc2MuRlZGKTsKICAgIFRSQUNFKCJWZXJ0ZXggYnVmZmVyIEZWRiA9ICUwOHgsIHN0cmlkZT0lZFxuIiwgRGVzYy5GVkYsIHN0cmlkZSk7CgogICAgaHIgPSBJV2luZUQzRERldmljZV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Yi0+d2luZUQzRFZlcnRleERlY2xhcmF0aW9uKTsKICAgIGlmKEZBSUxFRChocikpCiAgICB7CiAgICAgICAgRVJSKCIgKCVwKSBTZXR0aW5nIHRoZSBGVkYgZmFpbGVkLCBociA9ICV4IVxuIiwgVGhpcywgaHIpOwogICAgICAgIHJldHVybiBocjsKICAgIH0KCiAgICAvKiBjb3B5IHRoZSBpbmRleCBzdHJlYW0gaW50byB0aGUgaW5kZXggYnVmZmVyLgogICAgICogQSBuZXcgSVdpbmVEM0REZXZpY2UgbWV0aG9kIGNvdWxkIGJlIGNyZWF0ZWQKICAgICAqIHdoaWNoIHRha2VzIGFuIHVzZXIgcG9pbnRlciBjb250YWluaW5nIHRoZSBpbmRpY2VzCiAgICAgKiBvciBhIFNldERhdGEtTWV0aG9kIGZvciB0aGUgaW5kZXggYnVmZmVyLCB3aGljaAogICAgICogb3ZlcnJpZGVzIHRoZSBpbmRleCBidWZmZXIgZGF0YSB3aXRoIG91ciBwb2ludGVyLgogICAgICovCiAgICBociA9IElXaW5lRDNESW5kZXhCdWZmZXJfTG9jayhUaGlzLT5pbmRleGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogT2ZmU2V0VG9Mb2NrICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhDb3VudCAqIHNpemVvZihXT1JEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFICoqKSAmTG9ja2VkSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogRmxhZ3MgKi8pOwogICAgYXNzZXJ0KEluZGV4Q291bnQgPCAweDEwMDAwMCk7CiAgICBpZihociAhPSBEM0RfT0spCiAgICB7CiAgICAgICAgRVJSKCIoJXApIElXaW5lRDNESW5kZXhCdWZmZXI6OkxvY2sgZmFpbGVkIHdpdGggaHIgPSAlMDh4XG4iLCBUaGlzLCBocik7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQogICAgbWVtY3B5KExvY2tlZEluZGljZXMsIEluZGljZXMsIEluZGV4Q291bnQgKiBzaXplb2YoV09SRCkpOwogICAgaHIgPSBJV2luZUQzREluZGV4QnVmZmVyX1VubG9jayhUaGlzLT5pbmRleGJ1ZmZlcik7CiAgICBpZihociAhPSBEM0RfT0spCiAgICB7CiAgICAgICAgRVJSKCIoJXApIElXaW5lRDNESW5kZXhCdWZmZXI6OlVubG9jayBmYWlsZWQgd2l0aCBociA9ICUwOHhcbiIsIFRoaXMsIGhyKTsKICAgICAgICByZXR1cm4gaHI7CiAgICB9CgogICAgLyogU2V0IHRoZSBpbmRleCBzdHJlYW0gKi8KICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0SW5kaWNlcyhUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPmluZGV4YnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VmVydGV4KTsKCiAgICAvKiBTZXQgdGhlIHZlcnRleCBzdHJlYW0gc291cmNlICovCiAgICBociA9IElXaW5lRDNERGV2aWNlX1NldFN0cmVhbVNvdXJjZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBTdHJlYW1OdW1iZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Yi0+d2luZUQzRFZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogb2Zmc2V0LCB3ZSBwYXNzIHRoaXMgdG8gRHJhd0luZGV4ZWRQcmltaXRpdmUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOwogICAgaWYoaHIgIT0gRDNEX09LKQogICAgewogICAgICAgIEVSUigiKCVwKSBJRGlyZWN0M0REZXZpY2U6OlNldFN0cmVhbVNvdXJjZSBmYWlsZWQgd2l0aCBociA9ICUwOHhcbiIsIFRoaXMsIGhyKTsKICAgICAgICByZXR1cm4gaHI7CiAgICB9CgoKICAgIGhyID0gSVdpbmVEM0REZXZpY2VfRHJhd0luZGV4ZWRQcmltaXRpdmUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBtaW5JbmRleCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogU3RhcnRJbmRleCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlQ291bnQpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd0luZGV4ZWRQcmltaXRpdmVWQihJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKkQzRFZlcnRleEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqSW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgSW5kZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKlZCID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBEM0RWZXJ0ZXhCdWYpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXAsJXAsJTA4eCwlMDh4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIFZCLCBJbmRpY2VzLCBJbmRleENvdW50LCBGbGFncyk7CgogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRHJhd0luZGV4ZWRQcmltaXRpdmVWQihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UoVkIsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpDb21wdXRlU3BoZXJlVmlzaWJpbGl0eQogKgogKiBDYWxjdWxhdGVzIHRoZSB2aXNpYmlsaXR5IG9mIHNwaGVyZXMgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQuIFRoZSBzcGhlcmVzCiAqIGFyZSBwYXNzZWQgaW4gdGhlIENlbnRlcnMgYW5kIFJhZGlpIGFycmF5cywgdGhlIHJlc3VsdHMgYXJlIHBhc3NlZCBiYWNrCiAqIGluIHRoZSBSZXR1cm5WYWx1ZXMgYXJyYXkuIFJldHVybiB2YWx1ZXMgYXJlIGVpdGhlciBjb21wbGV0ZWx5IHZpc2libGUsCiAqIHBhcnRpYWxseSB2aXNpYmxlIG9yIGNvbXBsZXRlbHkgaW52aXNpYmxlLgogKiBUaGUgcmV0dXJuIHZhbHVlIGNvbnNpc3Qgb2YgYSBjb21iaW5hdGlvbiBvZiBEM0RDTElQXyogZmxhZ3MsIG9yIGl0J3MKICogMCBpZiB0aGUgc3BoZXJlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZShhY2NvcmRpbmcgdG8gdGhlIFNESywgbm90IGNoZWNrZWQpCiAqCiAqIFNvdW5kcyBsaWtlIGFuIG92ZXJkb3NlIG9mIG1hdGggOykKICoKICogVmVyc2lvbiAzIGFuZCA3CiAqCiAqIFBhcmFtczoKICogIENlbnRlcnM6IEFycmF5IGNvbnRhaW5pbmcgdGhlIHNwaGVyZSBjZW50ZXJzCiAqICBSYWRpaTogQXJyYXkgY29udGFpbmluZyB0aGUgc3BoZXJlIHJhZGlpCiAqICBOdW1TcGhlcmVzOiBUaGUgbnVtYmVyIG9mIGNlbnRlcnMgYW5kIHJhZGlpIGluIHRoZSBhcnJheXMKICogIEZsYWdzOiBTb21lIGZsYWdzCiAqICBSZXR1cm5WYWx1ZXM6IEFycmF5IHRvIHdyaXRlIHRoZSByZXN1bHRzIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgYmVjYXVzZSBpdCdzIGEgc3R1YgogKiAgKERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ2VudGVycywgUmFkaWkgb3IgUmV0dXJuVmFsdWVzIGFyZSBOVUxMKQogKiAgKEQzREVSUl9JTlZBTElETUFUUklYIGlmIHRoZSBjb21iaW5lZCB3b3JsZCwgdmlldyBhbmQgcHJvaiBtYXRyaXgKICogIGlzIHNpbmd1bGFyKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfQ29tcHV0ZVNwaGVyZVZpc2liaWxpdHkoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRUNUT1IgKkNlbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSAqUmFkaWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBOdW1TcGhlcmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqUmV0dXJuVmFsdWVzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVwLCVwLCUwOHgsJTA4eCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBDZW50ZXJzLCBSYWRpaSwgTnVtU3BoZXJlcywgRmxhZ3MsIFJldHVyblZhbHVlcyk7CgogICAgLyogdGhlIERpcmVjdFggNyBzZGsgc2F5cyB0aGF0IHRoZSB2aXNpYmlsaXR5IGlzIGNvbXB1dGVkIGJ5CiAgICAgKiBiYWNrLXRyYW5zZm9ybWluZyB0aGUgdmlld2luZyBmcnVzdHVtIHRvIG1vZGVsIHNwYWNlCiAgICAgKiB1c2luZyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tYmluZWQgd29ybGQsIHZpZXcgYW5kIHByb2plY3Rpb24KICAgICAqIG1hdHJpeC4gSWYgdGhlIG1hdHJpeCBjYW4ndCBiZSByZXZlcnNlZCwgRDNERVJSX0lOVkFMSURNQVRSSVgKICAgICAqIGlzIHJldHVybmVkLgogICAgICoKICAgICAqIEJhc2ljIGltcGxlbWVudGF0aW9uIGlkZWE6CiAgICAgKiAxKSBDaGVjayBpZiB0aGUgY2VudGVyIGlzIGluIHRoZSB2aWV3aW5nIGZydXN0dW0KICAgICAqIDIpIEN1dCB0aGUgc3BoZXJlIHdpdGggdGhlIHBsYW5lcyBvZiB0aGUgdmlld2luZwogICAgICogICAgZnJ1c3R1bQogICAgICoKICAgICAqIC0+Q2VudGVyIGluc2lkZSB0aGUgZnJ1c3R1bSwgbm8gaW50ZXJzZWN0aW9uczoKICAgICAqICAgIEZ1bGx5IHZpc2libGUKICAgICAqIC0+Q2VudGVyIG91dHNpZGUgdGhlIGZydXN0dW0sIG5vIGludGVyc2VjdGlvbnM6CiAgICAgKiAgICBOb3QgdmlzaWJsZQogICAgICogLT5Tb21lIGludGVyc2VjdGlvbnM6IFBhcnRpYWxseSB2aXNpYmxlCiAgICAgKgogICAgICogSW1wbGVtZW50IHRoaXMgY2FsbCBpbiBXaW5lRDNELiBFaXRoZXIgaW1wbGVtZW50IHRoZQogICAgICogbWF0cml4IGFuZCB2ZWN0b3Igc3R1ZmYgaW4gV2luZUQzRCwgb3IgdXNlIHNvbWUgZXh0ZXJuYWwKICAgICAqIG1hdGggbGlicmFyeS4KICAgICAqLwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQ29tcHV0ZVNwaGVyZVZpc2liaWxpdHkoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRUNUT1IgKkNlbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSAqUmFkaWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBOdW1TcGhlcmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqUmV0dXJuVmFsdWVzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXAsJTA4eCwlMDh4LCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIENlbnRlcnMsIFJhZGlpLCBOdW1TcGhlcmVzLCBGbGFncywgUmV0dXJuVmFsdWVzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU3BoZXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVmFsdWVzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTc6OkdldFRleHR1cmUKICoKICogUmV0dXJucyB0aGUgdGV4dHVyZSBpbnRlcmZhY2UgaGFuZGxlIGFzc2lnbmVkIHRvIGEgdGV4dHVyZSBzdGFnZS4KICogVGhlIHJldHVybmVkIHRleHR1cmUgaXMgQWRkUmVmZWQuIFRoaXMgaXMgdGFrZW4gZnJvbSBvbGQgZGRyYXcsCiAqIG5vdCBjaGVja2VkIGluIFdpbmRvd3MuCiAqCiAqIFZlcnNpb24gMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICBTdGFnZTogVGV4dHVyZSBzdGFnZSB0byByZWFkIHRoZSB0ZXh0dXJlIGZyb20KICogIFRleHR1cmU6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBUZXh0dXJlIGlzIE5VTEwKICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OkdldFRleHR1cmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFRleHR1cmUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICoqVGV4dHVyZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgSVdpbmVEM0RCYXNlVGV4dHVyZSAqU3VyZjsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVkLCVwKTogUmVsYXlcbiIsIFRoaXMsIFN0YWdlLCBUZXh0dXJlKTsKCiAgICBpZighVGV4dHVyZSkKICAgIHsKICAgICAgICBUUkFDRSgiVGV4dHVyZSA9PSBOVUxMLCBmYWlsaW5nIHdpdGggRERFUlJfSU5WQUxJRFBBUkFNU1xuIik7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgaHIgPSBJV2luZUQzRERldmljZV9HZXRUZXh0dXJlKFRoaXMtPndpbmVEM0REZXZpY2UsIFN0YWdlLCAoSVdpbmVEM0RCYXNlVGV4dHVyZSAqKikgJlN1cmYpOwogICAgaWYoIChociAhPSBEM0RfT0spIHx8ICghU3VyZikgKSAKICAgIHsKICAgICAgICAqVGV4dHVyZSA9IE5VTEw7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQoKICAgIC8qIEdldFBhcmVudCBBZGRSZWYoKXMsIHdoaWNoIGlzIHBlcmZlY3RseSBPSy4KICAgICAqIFdlIGhhdmUgcGFzc2VkIHRoZSBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZSB0byBXaW5lRDNELCBzbyB0aGF0J3MgT0sgdG9vLgogICAgICovCiAgICByZXR1cm4gSVdpbmVEM0RCYXNlVGV4dHVyZV9HZXRQYXJlbnQoU3VyZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVVua25vd24gKiopIFRleHR1cmUpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFRleHR1cmUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RUZXh0dXJlMiAqKlRleHR1cmUyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBIUkVTVUxUIHJldDsKICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKnJldF92YWw7CgogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVkLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFN0YWdlLCBUZXh0dXJlMik7CiAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldFRleHR1cmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldF92YWwpOwoKICAgICpUZXh0dXJlMiA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBJRGlyZWN0M0RUZXh0dXJlMiwgcmV0X3ZhbCk7CgogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXAuXG4iLCAqVGV4dHVyZTIpOwoKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRUZXh0dXJlCiAqCiAqIEFzc2lnbnMgYSB0ZXh0dXJlIHRvIGEgdGV4dHVyZSBzdGFnZS4gSXMgdGhlIHRleHR1cmUgQWRkUmVmLWVkPwogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgU3RhZ2U6IFRoZSBzdGFnZSB0byBhc3NpZ24gdGhlIHRleHR1cmUgdG8KICogIFRleHR1cmU6IEludGVyZmFjZSBwb2ludGVyIHRvIHRoZSB0ZXh0dXJlIHN1cmZhY2UKICoKICogUmV0dXJucwogKiBEM0RfT0sgb24gc3VjY2VzcwogKiBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRUZXh0dXJlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19TZXRUZXh0dXJlKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqVGV4dHVyZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIFRleHR1cmUpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKTogUmVsYXkhXG4iLCBUaGlzLCBTdGFnZSwgc3VyZik7CgogICAgLyogVGV4dHVyZSBtYXkgYmUgTlVMTCBoZXJlICovCiAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmID8gc3VyZi0+d2luZUQzRFRleHR1cmUgOiBOVUxMKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUZXh0dXJlKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZTIgKlRleHR1cmUyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0ZXggPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgVGV4dHVyZTIpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVkLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFN0YWdlLCB0ZXgpOwogICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfU2V0VGV4dHVyZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKHRleCwgSURpcmVjdERyYXdTdXJmYWNlNykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0VGV4dHVyZVN0YWdlU3RhdGUKICoKICogUmV0cmlldmVzIGEgc3RhdGUgZnJvbSBhIHRleHR1cmUgc3RhZ2UuCiAqCiAqIFZlcnNpb24gMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICBTdGFnZTogVGhlIHN0YWdlIHRvIHJldHJpZXZlIHRoZSBzdGF0ZSBmcm9tCiAqICBUZXhTdGFnZVN0YXRlVHlwZTogVGhlIHN0YXRlIHR5cGUgdG8gcmV0cmlldmUKICogIFN0YXRlOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBzdGF0ZSdzIHZhbHVlIGF0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBTdGF0ZSBpcyBOVUxMCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpHZXRUZXh0dXJlU3RhZ2VTdGF0ZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0VGV4dHVyZVN0YWdlU3RhdGUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBUZXhTdGFnZVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpTdGF0ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIFN0YWdlLCBUZXhTdGFnZVN0YXRlVHlwZSwgU3RhdGUpOwoKICAgIGlmKCFTdGF0ZSkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICBzd2l0Y2goVGV4U3RhZ2VTdGF0ZVR5cGUpCiAgICB7CiAgICAgICAgLyogTWlwZmlsdGVyIGlzIGEgc2FtcGxlciBzdGF0ZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKi8KICAgICAgICBjYXNlIEQzRFRTU19NSVBGSUxURVI6CiAgICAgICAgewogICAgICAgICAgICBIUkVTVUxUIGhyOwogICAgICAgICAgICBXSU5FRDNEVEVYVFVSRUZJTFRFUlRZUEUgdmFsdWU7CgogICAgICAgICAgICBociA9IElXaW5lRDNERGV2aWNlX0dldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNBTVBfTUlQRklMVEVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwogICAgICAgICAgICBzd2l0Y2godmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRFRFWEZfTk9ORTogKlN0YXRlID0gRDNEVEZQX05PTkU7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEVEVYRl9QT0lOVDogKlN0YXRlID0gRDNEVEZQX1BPSU5UOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRFRFWEZfTElORUFSOiAqU3RhdGUgPSBEM0RURlBfTElORUFSOyBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmV4cGVjdGVkIG1pcGZpbHRlciB2YWx1ZSAlZFxuIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICpTdGF0ZSA9IEQzRFRGUF9OT05FOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBocjsKICAgICAgICB9CgogICAgICAgIC8qIE1pbmZpbHRlciBpcyBhIHNhbXBsZXIgc3RhdGUgdG9vLCBlcXVhbCB2YWx1ZXMgKi8KICAgICAgICBjYXNlIEQzRFRTU19NSU5GSUxURVI6CiAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9HZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU0FNUF9NSU5GSUxURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOwogICAgICAgIC8qIE1hZ2ZpbHRlciBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IHZhbHVlcyAqLwogICAgICAgIGNhc2UgRDNEVFNTX01BR0ZJTFRFUjoKICAgICAgICB7CiAgICAgICAgICAgIEhSRVNVTFQgaHI7CiAgICAgICAgICAgIFdJTkVEM0RURVhUVVJFRklMVEVSVFlQRSB3aW5lZDNkZmlsdGVyOwogICAgICAgICAgICBociA9IElXaW5lRDNERGV2aWNlX0dldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNBTVBfTUFHRklMVEVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZWQzZGZpbHRlcik7CiAgICAgICAgICAgIHN3aXRjaCh3aW5lZDNkZmlsdGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RURVhGX1BPSU5UOiAgICAgICAgICAgICAqU3RhdGUgPSBEM0RURkdfUE9JTlQ7ICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEVEVYRl9MSU5FQVI6ICAgICAgICAgICAgKlN0YXRlID0gRDNEVEZHX0xJTkVBUjsgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRFRFWEZfQU5JU09UUk9QSUM6ICAgICAgICpTdGF0ZSA9IEQzRFRGR19BTklTT1RST1BJQzsgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RURVhGX0ZMQVRDVUJJQzogICAgICAgICAqU3RhdGUgPSBEM0RURkdfRkxBVENVQklDOyAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEVEVYRl9HQVVTU0lBTkNVQklDOiAgICAgKlN0YXRlID0gRDNEVEZHX0dBVVNTSUFOQ1VCSUM7ICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmV4cGVjdGVkIHdpbmVkM2QgbWFnIGZpbHRlciB2YWx1ZSAlZFxuIiwgd2luZWQzZGZpbHRlcik7CiAgICAgICAgICAgICAgICAgICAgKlN0YXRlID0gRDNEVEZHX1BPSU5UOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBocjsKICAgICAgICB9CgogICAgICAgIGNhc2UgRDNEVFNTX0FERFJFU1M6CiAgICAgICAgY2FzZSBEM0RUU1NfQUREUkVTU1U6CiAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9HZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU0FNUF9BRERSRVNTVSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7CiAgICAgICAgY2FzZSBEM0RUU1NfQUREUkVTU1Y6CiAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9HZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU0FNUF9BRERSRVNTViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX0dldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleFN0YWdlU3RhdGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOwogICAgfQp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFRleHR1cmVTdGFnZVN0YXRlKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgVGV4U3RhZ2VTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqU3RhdGUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgU3RhZ2UsIFRleFN0YWdlU3RhdGVUeXBlLCBTdGF0ZSk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19HZXRUZXh0dXJlU3RhZ2VTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4U3RhZ2VTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRUZXh0dXJlU3RhZ2VTdGF0ZQogKgogKiBTZXRzIGEgdGV4dHVyZSBzdGFnZSBzdGF0ZS4gU29tZSBzdGFnZSB0eXBlcyBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5LAogKiBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0IGluIFdpbmVEM0QgYW5kIHdlcmUgbW92ZWQgdG8gYW5vdGhlciBwbGFjZQogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgU3RhZ2U6IFRoZSBzdGFnZSB0byBtb2RpZnkKICogIFRleFN0YWdlU3RhdGVUeXBlOiBUaGUgc3RhdGUgdG8gY2hhbmdlCiAqICBTdGF0ZTogVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHN0YXRlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6U2V0VGV4dHVyZVN0YWdlU3RhdGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFRleHR1cmVTdGFnZVN0YXRlKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgVGV4U3RhZ2VTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGF0ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOHgsJTA4eCk6IFJlbGF5IVxuIiwgVGhpcywgU3RhZ2UsIFRleFN0YWdlU3RhdGVUeXBlLCBTdGF0ZSk7CiAgICBzd2l0Y2goVGV4U3RhZ2VTdGF0ZVR5cGUpCiAgICB7CiAgICAgICAgLyogTWlwZmlsdGVyIGlzIGEgc2FtcGxlciBzdGF0ZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKi8KICAgICAgICBjYXNlIEQzRFRTU19NSVBGSUxURVI6CiAgICAgICAgewogICAgICAgICAgICBXSU5FRDNEVEVYVFVSRUZJTFRFUlRZUEUgdmFsdWU7CiAgICAgICAgICAgIHN3aXRjaChTdGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSBEM0RURlBfTk9ORTogdmFsdWUgPSBXSU5FRDNEVEVYRl9OT05FOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRDNEVEZQX1BPSU5UOiB2YWx1ZSA9IFdJTkVEM0RURVhGX1BPSU5UOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMDogLyogVW5jaGVja2VkICovCiAgICAgICAgICAgICAgICBjYXNlIEQzRFRGUF9MSU5FQVI6IHZhbHVlID0gV0lORUQzRFRFWEZfTElORUFSOyBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmV4cGVjdGVkIG1pcGZpbHRlciB2YWx1ZSAlZFxuIiwgU3RhdGUpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gV0lORUQzRFRFWEZfTk9ORTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0U2FtcGxlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNBTVBfTUlQRklMVEVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qIE1pbmZpbHRlciBpcyBhIHNhbXBsZXIgc3RhdGUgdG9vLCBlcXVhbCB2YWx1ZXMgKi8KICAgICAgICBjYXNlIEQzRFRTU19NSU5GSUxURVI6CiAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU0FNUF9NSU5GSUxURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOwogICAgICAgIC8qIE1hZ2ZpbHRlciBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IHZhbHVlcyAqLwogICAgICAgIGNhc2UgRDNEVFNTX01BR0ZJTFRFUjoKICAgICAgICB7CiAgICAgICAgICAgIFdJTkVEM0RURVhUVVJFRklMVEVSVFlQRSB3aW5lZDNkZmlsdGVyOwogICAgICAgICAgICBzd2l0Y2goKEQzRFRFWFRVUkVNQUdGSUxURVIpIFN0YXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIEQzRFRGR19QT0lOVDogICAgICAgICAgd2luZWQzZGZpbHRlciA9IFdJTkVEM0RURVhGX1BPSU5UOyAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRDNEVEZHX0xJTkVBUjogICAgICAgICB3aW5lZDNkZmlsdGVyID0gV0lORUQzRFRFWEZfTElORUFSOyAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBEM0RURkdfRkxBVENVQklDOiAgICAgIHdpbmVkM2RmaWx0ZXIgPSBXSU5FRDNEVEVYRl9GTEFUQ1VCSUM7ICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEQzRFRGR19HQVVTU0lBTkNVQklDOiAgd2luZWQzZGZpbHRlciA9IFdJTkVEM0RURVhGX0dBVVNTSUFOQ1VCSUM7ICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRDNEVEZHX0FOSVNPVFJPUElDOiAgICB3aW5lZDNkZmlsdGVyID0gV0lORUQzRFRFWEZfQU5JU09UUk9QSUM7ICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVuZXhwZWN0ZWQgZDNkNyBtYWcgZmlsdGVyIHR5cGUgJWRcbiIsIFN0YXRlKTsKICAgICAgICAgICAgICAgICAgICB3aW5lZDNkZmlsdGVyID0gV0lORUQzRFRFWEZfUE9JTlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RTQU1QX01BR0ZJTFRFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lZDNkZmlsdGVyKTsKICAgICAgICB9CgogICAgICAgIGNhc2UgRDNEVFNTX0FERFJFU1M6CiAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU0FNUF9BRERSRVNTViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7CiAgICAgICAgICAgIC8qIERyb3AgdGhyb3VnaCAqLwogICAgICAgIGNhc2UgRDNEVFNTX0FERFJFU1NVOgogICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0U2FtcGxlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNBTVBfQUREUkVTU1UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOwogICAgICAgIGNhc2UgRDNEVFNTX0FERFJFU1NWOgogICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0U2FtcGxlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNBTVBfQUREUkVTU1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOwogICAgICAgIGRlZmF1bHQ6CgogICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4U3RhZ2VTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7CiAgICB9Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0VGV4dHVyZVN0YWdlU3RhdGUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBUZXhTdGFnZVN0YXRlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXRlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlMDh4LCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgU3RhZ2UsIFRleFN0YWdlU3RhdGVUeXBlLCBTdGF0ZSk7CiAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRUZXh0dXJlU3RhZ2VTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4U3RhZ2VTdGF0ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpWYWxpZGF0ZURldmljZQogKgogKiBTREs6ICJSZXBvcnRzIHRoZSBkZXZpY2UncyBhYmlsaXR5IHRvIHJlbmRlciB0aGUgY3VycmVudGx5IHNldAogKiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbnMgaW4gYSBzaW5nbGUgcGFzcyIuIFdoYXRldmVyIHRoYXQgbWVhbnMKICogZXhhY3RseS4uLgogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgTnVtUGFzc2VzOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBudW1iZXIgb2YgbmVjZXNzYXJ5IHBhc3NlcyBmb3IgdGhlCiAqICAgICAgICAgICAgIGRlc2lyZWQgZWZmZWN0IHRvLgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIFNlZSBJV2luZUQzRERldmljZTo6VmFsaWRhdGVEZXZpY2UgZm9yIG1vcmUgZGV0YWlscwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfVmFsaWRhdGVEZXZpY2UoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqTnVtUGFzc2VzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXlcbiIsIFRoaXMsIE51bVBhc3Nlcyk7CgogICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1ZhbGlkYXRlRGV2aWNlKFRoaXMtPndpbmVEM0REZXZpY2UsIE51bVBhc3Nlcyk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfVmFsaWRhdGVEZXZpY2UoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqUGFzc2VzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgUGFzc2VzKTsKICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1ZhbGlkYXRlRGV2aWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc2VzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTc6OkNsZWFyCiAqCiAqIEZpbGxzIHRoZSByZW5kZXIgdGFyZ2V0LCB0aGUgeiBidWZmZXIgYW5kIHRoZSBzdGVuY2lsIGJ1ZmZlciB3aXRoIGEKICogY2xlYXIgY29sb3IgLyB2YWx1ZQogKgogKiBWZXJzaW9uIDcgb25seQogKgogKiBQYXJhbXM6CiAqICBDb3VudDogTnVtYmVyIG9mIHJlY3RhbmdsZXMgaW4gUmVjdHMgbXVzdCBiZSAwIGlmIFJlY3RzIGlzIE5VTEwKICogIFJlY3RzOiBSZWN0YW5nbGVzIHRvIGNsZWFyLiBJZiBOVUxMLCB0aGUgd2hvbGUgc3VyZmFjZSBpcyBjbGVhcmVkCiAqICBGbGFnczogU29tZSBmbGFncywgYXMgdXN1YWwKICogIENvbG9yOiBDbGVhciBjb2xvciBmb3IgdGhlIHJlbmRlciB0YXJnZXQKICogIFo6IENsZWFyIHZhbHVlIGZvciB0aGUgWiBidWZmZXIKICogIFN0ZW5jaWw6IENsZWFyIHZhbHVlIHRvIHN0b3JlIGluIGVhY2ggc3RlbmNpbCBidWZmZXIgZW50cnkKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpDbGVhcgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfQ2xlYXIoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFQ1QgKlJlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDT0xPUiBDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZBTFVFIFosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGVuY2lsKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXAsJTA4eCwlMDh4LCVmLCUwOHgpOiBSZWxheVxuIiwgVGhpcywgQ291bnQsIFJlY3RzLCBGbGFncywgKERXT1JEKSBDb2xvciwgWiwgU3RlbmNpbCk7CgogICAgLyogTm90ZTsgRDNEUkVDVCBpcyBjb21wYXRpYmxlIHdpdGggV0lORUQzRFJFQ1QgKi8KICAgIHJldHVybiBJV2luZUQzRERldmljZV9DbGVhcihUaGlzLT53aW5lRDNERGV2aWNlLCBDb3VudCwgKFdJTkVEM0RSRUNUKikgUmVjdHMsIEZsYWdzLCBDb2xvciwgWiwgU3RlbmNpbCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRWaWV3cG9ydAogKgogKiBTZXRzIHRoZSBjdXJyZW50IHZpZXdwb3J0LgogKgogKiBWZXJzaW9uIDcgb25seSwgYnV0IElEaXJlY3QzRFZpZXdwb3J0IHVzZXMgdGhpcyBjYWxsIGZvciBvbGRlcgogKiB2ZXJzaW9ucwogKgogKiBQYXJhbXM6CiAqICBEYXRhOiBUaGUgbmV3IHZpZXdwb3J0IHRvIHNldAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGF0YSBpcyBOVUxMCiAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVERERldmljZTo6U2V0Vmlld3BvcnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFZpZXdwb3J0KElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQ3ICpEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKSBSZWxheSFcbiIsIFRoaXMsIERhdGEpOwoKICAgIGlmKCFEYXRhKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIC8qIE5vdGU6IEQzRFZJRVdQT1JUNyBpcyBjb21wYXRpYmxlIHdpdGggV0lORUQzRFZJRVdQT1JUICovCiAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0Vmlld3BvcnQoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRFZJRVdQT1JUKikgRGF0YSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U6OkdldFZpZXdwb3J0CiAqCiAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmlld3BvcnQKICoKICogVmVyc2lvbiA3CiAqCiAqIFBhcmFtczoKICogIERhdGE6IEQzRDdWaWV3cG9ydCBzdHJ1Y3R1cmUgdG8gd3JpdGUgdGhlIHZpZXdwb3J0IGluZm9ybWF0aW9uIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEYXRhIGlzIE5VTEwKICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6R2V0Vmlld3BvcnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFZpZXdwb3J0KElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQ3ICpEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglcCkgUmVsYXkhXG4iLCBUaGlzLCBEYXRhKTsKCiAgICBpZighRGF0YSkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICAvKiBOb3RlOiBEM0RWSUVXUE9SVDcgaXMgY29tcGF0aWJsZSB3aXRoIFdJTkVEM0RWSUVXUE9SVCAqLwogICAgaHIgPSBJV2luZUQzRERldmljZV9HZXRWaWV3cG9ydChUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRFZJRVdQT1JUKikgRGF0YSk7CgogICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChocik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRNYXRlcmlhbAogKgogKiBTZXRzIHRoZSBNYXRlcmlhbAogKgogKiBWZXJzaW9uIDcKICoKICogUGFyYW1zOgogKiAgTWF0OiBUaGUgbWF0ZXJpYWwgdG8gc2V0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXQgaXMgTlVMTC4KICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6U2V0TWF0ZXJpYWwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X1NldE1hdGVyaWFsKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUw3ICpNYXQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXkhXG4iLCBUaGlzLCBNYXQpOwoKICAgIC8qIE5vdGU6IEQzRE1BVEVSSUFMNyBpcyBjb21wYXRpYmxlIHdpdGggV0lORUQzRE1BVEVSSUFMICovCiAgICBociA9IElXaW5lRDNERGV2aWNlX1NldE1hdGVyaWFsKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFURVJJQUwqKSBNYXQpOwoKICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0TWF0ZXJpYWwKICoKICogUmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbAogKgogKiBWZXJzaW9uIDcKICoKICogUGFyYW1zOgogKiAgTWF0OiBEM0RNQVRFUklBTDcgc3RydWN0dXJlIHRvIHdyaXRlIHRoZSBtYXRlcmlhbCBwYXJhbWV0ZXJzIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXQgaXMgTlVMTAogKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpHZXRNYXRlcmlhbAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TWF0ZXJpYWwoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRFUklBTDcgKk1hdCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheSFcbiIsIFRoaXMsIE1hdCk7CgogICAgLyogTm90ZTogRDNETUFURVJJQUw3IGlzIGNvbXBhdGlibGUgd2l0aCBXSU5FRDNETUFURVJJQUwgKi8gCiAgICBociA9IElXaW5lRDNERGV2aWNlX0dldE1hdGVyaWFsKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFURVJJQUwqKSBNYXQpOwoKICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6U2V0TGlnaHQKICoKICogQXNzaWducyBhIGxpZ2h0IHRvIGEgbGlnaHQgaW5kZXgsIGJ1dCBkb2Vzbid0IGFjdGl2YXRlIGl0IHlldC4KICoKICogVmVyc2lvbiA3LCBJRGlyZWN0M0RMaWdodCB1c2VzIHRoaXMgbWV0aG9kIGZvciBvbGRlciB2ZXJzaW9ucwogKgogKiBQYXJhbXM6CiAqICBMaWdodEluZGV4OiBUaGUgaW5kZXggb2YgdGhlIG5ldyBsaWdodAogKiAgTGlnaHQ6IEEgRDNETElHSFQ3IHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBsaWdodAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6U2V0TGlnaHQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X1NldExpZ2h0KElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTGlnaHRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUNyAqTGlnaHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIExpZ2h0SW5kZXgsIExpZ2h0KTsKCiAgICAvKiBOb3RlOiBEM0RMSUdIVDcgaXMgY29tcGF0aWJsZSB3aXRoIFdJTkVEM0RMSUdIVCAqLwogICAgaHIgPSBJV2luZUQzRERldmljZV9TZXRMaWdodChUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWdodEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRExJR0hUKikgTGlnaHQpOwoKICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0TGlnaHQKICoKICogUmV0dXJucyB0aGUgbGlnaHQgYXNzaWduZWQgdG8gYSBsaWdodCBpbmRleAogKgogKiBQYXJhbXM6CiAqICBMaWdodDogU3RydWN0dXJlIHRvIHdyaXRlIHRoZSBsaWdodCBpbmZvcm1hdGlvbiB0bwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgTGlnaHQgaXMgTlVMTAogKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6R2V0TGlnaHQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0dldExpZ2h0KElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTGlnaHRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUNyAqTGlnaHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEhSRVNVTFQgcmM7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIExpZ2h0SW5kZXgsIExpZ2h0KTsKCiAgICAvKiBOb3RlOiBEM0RMSUdIVDcgaXMgY29tcGF0aWJsZSB3aXRoIFdJTkVEM0RMSUdIVCAqLwogICAgcmMgPSAgSVdpbmVEM0REZXZpY2VfR2V0TGlnaHQoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZ2h0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRExJR0hUKikgTGlnaHQpOwoKICAgIC8qIFRyYW5zbGF0ZSB0aGUgcmVzdWx0LiBXaW5lRDNEIHJldHVybnMgb3RoZXIgdmFsdWVzIHRoYW4gRDNENyAqLwogICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChyYyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpCZWdpblN0YXRlQmxvY2sKICoKICogQmVnaW5zIHJlY29yZGluZyB0byBhIHN0YXRlYmxvY2sKICoKICogVmVyc2lvbiA3CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRm9yIGRldGFpbHMgc2VlIElXaW5lRDNERGV2aWNlOjpCZWdpblN0YXRlQmxvY2sKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0JlZ2luU3RhdGVCbG9jayhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oKTogUmVsYXkhXG4iLCBUaGlzKTsKCiAgICBociA9IElXaW5lRDNERGV2aWNlX0JlZ2luU3RhdGVCbG9jayhUaGlzLT53aW5lRDNERGV2aWNlKTsKICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6RW5kU3RhdGVCbG9jawogKgogKiBTdG9wcyByZWNvcmRpbmcgdG8gYSBzdGF0ZSBibG9jayBhbmQgcmV0dXJucyB0aGUgY3JlYXRlZCBzdGF0ZWJsb2NrCiAqIGhhbmRsZS4KICoKICogVmVyc2lvbiA3CiAqCiAqIFBhcmFtczoKICogIEJsb2NrSGFuZGxlOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBzdGF0ZWJsb2NrJ3MgaGFuZGxlIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBCbG9ja0hhbmRsZSBpcyBOVUxMCiAqICBTZWUgSVdpbmVEM0REZXZpY2U6OkVuZFN0YXRlQmxvY2sgZm9yIG1vcmUgZGV0YWlscwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfRW5kU3RhdGVCbG9jayhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKkJsb2NrSGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglcCk6IFJlbGF5IVxuIiwgVGhpcywgQmxvY2tIYW5kbGUpOwoKICAgIGlmKCFCbG9ja0hhbmRsZSkKICAgIHsKICAgICAgICBXQVJOKCJCbG9ja0hhbmRsZSA9PSBOVUxMLCByZXR1cm5pbmcgRERFUlJfSU5WQUxJRFBBUkFNU1xuIik7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgKkJsb2NrSGFuZGxlID0gSURpcmVjdDNERGV2aWNlSW1wbF9DcmVhdGVIYW5kbGUoVGhpcyk7CiAgICBpZighKkJsb2NrSGFuZGxlKQogICAgewogICAgICAgIEVSUigiQ2Fubm90IGdldCBhIGhhbmRsZSBudW1iZXIgZm9yIHRoZSBzdGF0ZWJsb2NrXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CiAgICB9CiAgICBUaGlzLT5IYW5kbGVzWypCbG9ja0hhbmRsZSAtIDFdLnR5cGUgPSBERHJhd0hhbmRsZV9TdGF0ZUJsb2NrOwogICAgaHIgPSBJV2luZUQzRERldmljZV9FbmRTdGF0ZUJsb2NrKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElXaW5lRDNEU3RhdGVCbG9jayAqKikgJlRoaXMtPkhhbmRsZXNbKkJsb2NrSGFuZGxlIC0gMV0ucHRyKTsKICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6UHJlTG9hZAogKgogKiBBbGxvd3MgdGhlIGFwcCB0byBzaWduYWwgdGhhdCBhIHRleHR1cmUgd2lsbCBiZSB1c2VkIHNvb24sIHRvIGFsbG93CiAqIHRoZSBEaXJlY3QzRERldmljZSB0byBsb2FkIGl0IHRvIHRoZSB2aWRlbyBjYXJkIGluIHRoZSBtZWFudGltZS4KICoKICogVmVyc2lvbiA3CiAqCiAqIFBhcmFtczoKICogIFRleHR1cmU6IFRoZSB0ZXh0dXJlIHRvIHByZWxvYWQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFRleHR1cmUgaXMgTlVMTAogKiAgU2VlIElXaW5lRDNEU3VyZmFjZTo6UHJlTG9hZCBmb3IgZGV0YWlscwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfUHJlTG9hZChJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqVGV4dHVyZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIFRleHR1cmUpOwoKICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheSFcbiIsIFRoaXMsIHN1cmYpOwoKICAgIGlmKCFUZXh0dXJlKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIElXaW5lRDNEU3VyZmFjZV9QcmVMb2FkKHN1cmYtPldpbmVEM0RTdXJmYWNlKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpBcHBseVN0YXRlQmxvY2sKICoKICogQWN0aXZhdGVzIHRoZSBzdGF0ZSBzdG9yZWQgaW4gYSBzdGF0ZSBibG9jayBoYW5kbGUuCiAqCiAqIFBhcmFtczoKICogIEJsb2NrSGFuZGxlOiBUaGUgc3RhdGVibG9jayBoYW5kbGUgdG8gYWN0aXZhdGUKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEM0RFUlJfSU5WQUxJRFNUQVRFQkxPQ0sgaWYgQmxvY2tIYW5kbGUgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfQXBwbHlTdGF0ZUJsb2NrKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEJsb2NrSGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4KTogUmVsYXkhXG4iLCBUaGlzLCBCbG9ja0hhbmRsZSk7CgogICAgaWYoIUJsb2NrSGFuZGxlIHx8IEJsb2NrSGFuZGxlID4gVGhpcy0+bnVtSGFuZGxlcykKICAgIHsKICAgICAgICBXQVJOKCJPdXQgb2YgcmFuZ2UgaGFuZGxlICVkLCByZXR1cm5pbmcgRDNERVJSX0lOVkFMSURTVEFURUJMT0NLXG4iLCBCbG9ja0hhbmRsZSk7CiAgICAgICAgcmV0dXJuIEQzREVSUl9JTlZBTElEU1RBVEVCTE9DSzsKICAgIH0KICAgIGlmKFRoaXMtPkhhbmRsZXNbQmxvY2tIYW5kbGUgLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX1N0YXRlQmxvY2spCiAgICB7CiAgICAgICAgV0FSTigiSGFuZGxlICVkIGlzIG5vdCBhIHN0YXRlYmxvY2ssIHJldHVybmluZyBEM0RFUlJfSU5WQUxJRFNUQVRFQkxPQ0tcbiIsIEJsb2NrSGFuZGxlKTsKICAgICAgICByZXR1cm4gRDNERVJSX0lOVkFMSURTVEFURUJMT0NLOwogICAgfQoKICAgIGhyID0gSVdpbmVEM0RTdGF0ZUJsb2NrX0FwcGx5KChJV2luZUQzRFN0YXRlQmxvY2sgKikgVGhpcy0+SGFuZGxlc1tCbG9ja0hhbmRsZSAtIDFdLnB0cik7CiAgICByZXR1cm4gaHJfZGRyYXdfZnJvbV93aW5lZDNkKGhyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRERldmljZTc6OkNhcHR1cmVTdGF0ZUJsb2NrCiAqCiAqIFVwZGF0ZXMgYSBzdGF0ZWJsb2NrJ3MgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgY3VycmVudGx5IHNldCBmb3IgdGhlIGRldmljZQogKgogKiBWZXJzaW9uIDcKICoKICogUGFyYW1zOgogKiAgQmxvY2tIYW5kbGU6IFN0YXRlYmxvY2sgdG8gdXBkYXRlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRDNERVJSX0lOVkFMSURTVEFURUJMT0NLIGlmIEJsb2NrSGFuZGxlIGlzIE5VTEwKICogIFNlZSBJV2luZUQzRERldmljZTo6Q2FwdHVyZVN0YXRlQmxvY2sgZm9yIG1vcmUgZGV0YWlscwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfQ2FwdHVyZVN0YXRlQmxvY2soSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBCbG9ja0hhbmRsZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCk6IFJlbGF5IVxuIiwgVGhpcywgQmxvY2tIYW5kbGUpOwoKICAgIGlmKEJsb2NrSGFuZGxlID09IDAgfHwgQmxvY2tIYW5kbGUgPiBUaGlzLT5udW1IYW5kbGVzKQogICAgewogICAgICAgIFdBUk4oIk91dCBvZiByYW5nZSBoYW5kbGUgJWQsIHJldHVybmluZyBEM0RFUlJfSU5WQUxJRFNUQVRFQkxPQ0tcbiIsIEJsb2NrSGFuZGxlKTsKICAgICAgICByZXR1cm4gRDNERVJSX0lOVkFMSURTVEFURUJMT0NLOwogICAgfQogICAgaWYoVGhpcy0+SGFuZGxlc1tCbG9ja0hhbmRsZSAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfU3RhdGVCbG9jaykKICAgIHsKICAgICAgICBXQVJOKCJIYW5kbGUgJWQgaXMgbm90IGEgc3RhdGVibG9jaywgcmV0dXJuaW5nIEQzREVSUl9JTlZBTElEU1RBVEVCTE9DS1xuIiwgQmxvY2tIYW5kbGUpOwogICAgICAgIHJldHVybiBEM0RFUlJfSU5WQUxJRFNUQVRFQkxPQ0s7CiAgICB9CgogICAgaHIgPSBJV2luZUQzRFN0YXRlQmxvY2tfQ2FwdHVyZSgoSVdpbmVEM0RTdGF0ZUJsb2NrICopIFRoaXMtPkhhbmRsZXNbQmxvY2tIYW5kbGUgLSAxXS5wdHIpOwogICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChocik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpEZWxldGVTdGF0ZUJsb2NrCiAqCiAqIERlbGV0ZXMgYSBzdGF0ZWJsb2NrIGhhbmRsZS4gVGhpcyBtZWFucyByZWxlYXNpbmcgdGhlIFdpbmVEM0RTdGF0ZUJsb2NrCiAqCiAqIFZlcnNpb24gNwogKgogKiBQYXJhbXM6CiAqICBCbG9ja0hhbmRsZTogU3RhdGVibG9jayBoYW5kbGUgdG8gZGVsZXRlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRDNERVJSX0lOVkFMSURTVEFURUJMT0NLIGlmIEJsb2NrSGFuZGxlIGlzIDAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0RlbGV0ZVN0YXRlQmxvY2soSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEJsb2NrSGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBVTE9ORyByZWY7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgpOiBSZWxheSFcbiIsIFRoaXMsIEJsb2NrSGFuZGxlKTsKCiAgICBpZihCbG9ja0hhbmRsZSA9PSAwIHx8IEJsb2NrSGFuZGxlID4gVGhpcy0+bnVtSGFuZGxlcykKICAgIHsKICAgICAgICBXQVJOKCJPdXQgb2YgcmFuZ2UgaGFuZGxlICVkLCByZXR1cm5pbmcgRDNERVJSX0lOVkFMSURTVEFURUJMT0NLXG4iLCBCbG9ja0hhbmRsZSk7CiAgICAgICAgcmV0dXJuIEQzREVSUl9JTlZBTElEU1RBVEVCTE9DSzsKICAgIH0KICAgIGlmKFRoaXMtPkhhbmRsZXNbQmxvY2tIYW5kbGUgLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX1N0YXRlQmxvY2spCiAgICB7CiAgICAgICAgV0FSTigiSGFuZGxlICVkIGlzIG5vdCBhIHN0YXRlYmxvY2ssIHJldHVybmluZyBEM0RFUlJfSU5WQUxJRFNUQVRFQkxPQ0tcbiIsIEJsb2NrSGFuZGxlKTsKICAgICAgICByZXR1cm4gRDNERVJSX0lOVkFMSURTVEFURUJMT0NLOwogICAgfQoKICAgIHJlZiA9IElXaW5lRDNEU3RhdGVCbG9ja19SZWxlYXNlKChJV2luZUQzRFN0YXRlQmxvY2sgKikgVGhpcy0+SGFuZGxlc1tCbG9ja0hhbmRsZSAtIDFdLnB0cik7CiAgICBpZihyZWYpCiAgICB7CiAgICAgICAgRVJSKCJTb21ldGhpbmcgaXMgc3RpbGwgaG9sZGluZyB0aGUgc3RhdGVibG9jayAlcChIYW5kbGUgJWQpLiBSZWYgPSAlZFxuIiwgVGhpcy0+SGFuZGxlc1tCbG9ja0hhbmRsZSAtIDFdLnB0ciwgQmxvY2tIYW5kbGUsIHJlZik7CiAgICB9CiAgICBUaGlzLT5IYW5kbGVzW0Jsb2NrSGFuZGxlIC0gMV0ucHRyID0gTlVMTDsKICAgIFRoaXMtPkhhbmRsZXNbQmxvY2tIYW5kbGUgLSAxXS50eXBlID0gRERyYXdIYW5kbGVfVW5rbm93bjsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6Q3JlYXRlU3RhdGVCbG9jawogKgogKiBDcmVhdGVzIGEgbmV3IHN0YXRlIGJsb2NrIGhhbmRsZS4KICoKICogVmVyc2lvbiA3CiAqCiAqIFBhcmFtczoKICogIFR5cGU6IFRoZSBzdGF0ZSBibG9jayB0eXBlCiAqICBCbG9ja0hhbmRsZTogQWRkcmVzcyB0byB3cml0ZSB0aGUgY3JlYXRlZCBoYW5kbGUgdG8KICoKICogUmV0dXJuczoKICogICBEM0RfT0sgb24gc3VjY2VzcwogKiAgIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQmxvY2tIYW5kbGUgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0REZXZpY2VJbXBsXzdfQ3JlYXRlU3RhdGVCbG9jayhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEU1RBVEVCTE9DS1RZUEUgVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKkJsb2NrSGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKSFcbiIsIFRoaXMsIFR5cGUsIEJsb2NrSGFuZGxlKTsKCiAgICBpZighQmxvY2tIYW5kbGUpCiAgICB7CiAgICAgICAgV0FSTigiQmxvY2tIYW5kbGUgPT0gTlVMTCwgcmV0dXJuaW5nIERERVJSX0lOVkFMSURQQVJBTVNcbiIpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKICAgICpCbG9ja0hhbmRsZSA9IElEaXJlY3QzRERldmljZUltcGxfQ3JlYXRlSGFuZGxlKFRoaXMpOwogICAgaWYoISpCbG9ja0hhbmRsZSkKICAgIHsKICAgICAgICBFUlIoIkNhbm5vdCBnZXQgYSBoYW5kbGUgbnVtYmVyIGZvciB0aGUgc3RhdGVibG9ja1xuIik7CiAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwogICAgfQogICAgVGhpcy0+SGFuZGxlc1sqQmxvY2tIYW5kbGUgLSAxXS50eXBlID0gRERyYXdIYW5kbGVfU3RhdGVCbG9jazsKCiAgICAvKiBUaGUgRDNEU1RBVEVCTE9DS1RZUEUgZW51bSBpcyBmaW5lIGhlcmUgKi8KICAgIGhyID0gSVdpbmVEM0REZXZpY2VfQ3JlYXRlU3RhdGVCbG9jayhUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElXaW5lRDNEU3RhdGVCbG9jayAqKikgJlRoaXMtPkhhbmRsZXNbKkJsb2NrSGFuZGxlIC0gMV0ucHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogUGFyZW50LCBob3BlIHRoYXQgd29ya3MgKi8pOwogICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChocik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpMb2FkCiAqCiAqIExvYWRzIGEgcmVjdGFuZ3VsYXIgYXJlYSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgZGVzdGluYXRpb24gdGV4dHVyZS4KICogSXQgY2FuIGFsc28gY29weSB0aGUgc291cmNlIHRvIHRoZSBmYWNlcyBvZiBhIGN1YmljIGVudmlyb25tZW50IG1hcAogKgogKiBWZXJzaW9uIDcKICoKICogUGFyYW1zOgogKiAgRGVzdFRleDogRGVzdGluYXRpb24gdGV4dHVyZQogKiAgRGVzdFBvaW50OiBQb2ludCBpbiB0aGUgZGVzdGluYXRpb24gd2hlcmUgdGhlIHNvdXJjZSBpbWFnZSBzaG91bGQgYmUKICogICAgICAgICAgICAgd3JpdHRlbiB0bwogKiAgU3JjVGV4OiBTb3VyY2UgdGV4dHVyZQogKiAgU3JjUmVjdDogU291cmNlIHJlY3RhbmdsZQogKiAgRmxhZ3M6IFNvbWUgZmxhZ3MKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERlc3RUZXggb3IgU3JjVGV4IGFyZSBOVUxMCiAqICBTZWUgSURpcmVjdDNEVGV4dHVyZTI6OkxvYWQgZm9yIGRldGFpbHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0xvYWQoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKkRlc3RUZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSU5UICpEZXN0UG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKlNyY1RleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVCAqU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmRlc3QgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBEZXN0VGV4KTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnNyYyA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIFNyY1RleCk7CiAgICBGSVhNRSgiKCVwKS0+KCVwLCVwLCVwLCVwLCUwOHgpOiBQYXJ0aWFsbHkgSW1wbGVtZW50ZWQhXG4iLCBUaGlzLCBkZXN0LCBEZXN0UG9pbnQsIHNyYywgU3JjUmVjdCwgRmxhZ3MpOwoKICAgIGlmKCAoIXNyYykgfHwgKCFkZXN0KSApCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgSURpcmVjdDNEVGV4dHVyZTJfTG9hZChJQ09NX0lOVEVSRkFDRShkZXN0LCBJRGlyZWN0M0RUZXh0dXJlMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKHNyYywgSURpcmVjdDNEVGV4dHVyZTIpKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpMaWdodEVuYWJsZQogKgogKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgbGlnaHQKICoKICogVmVyc2lvbiA3LCBJRGlyZWN0M0RMaWdodCB1c2VzIHRoaXMgbWV0aG9kIHRvby4KICoKICogUGFyYW1zOgogKiAgTGlnaHRJbmRleDogVGhlIGluZGV4IG9mIHRoZSBsaWdodCB0byBlbmFibGUgLyBkaXNhYmxlCiAqICBFbmFibGU6IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBsaWdodAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6U2V0TGlnaHRFbmFibGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0xpZ2h0RW5hYmxlKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTGlnaHRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgRW5hYmxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVkKTogUmVsYXkhXG4iLCBUaGlzLCBMaWdodEluZGV4LCBFbmFibGUpOwoKICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0TGlnaHRFbmFibGUoVGhpcy0+d2luZUQzRERldmljZSwgTGlnaHRJbmRleCwgRW5hYmxlKTsKICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0TGlnaHRFbmFibGUKICoKICogUmV0cmlldmVzIGlmIHRoZSBsaWdodCB3aXRoIHRoZSBnaXZlbiBpbmRleCBpcyBlbmFibGVkIG9yIG5vdAogKgogKiBWZXJzaW9uIDcKICoKICogUGFyYW1zOgogKiAgTGlnaHRJbmRleDogSW5kZXggb2YgZGVzaXJlZCBsaWdodAogKiAgRW5hYmxlOiBQb2ludGVyIHRvIGEgQk9PTCB3aGljaCBjb250YWlucyB0aGUgcmVzdWx0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBFbmFibGUgaXMgTlVMTAogKiAgU2VlIElXaW5lRDNERGV2aWNlOjpHZXRMaWdodEVuYWJsZSBmb3IgbW9yZSBkZXRhaWxzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19HZXRMaWdodEVuYWJsZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIExpZ2h0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MKiBFbmFibGUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApOiBSZWxheVxuIiwgVGhpcywgTGlnaHRJbmRleCwgRW5hYmxlKTsKCiAgICBpZighRW5hYmxlKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGhyID0gSVdpbmVEM0REZXZpY2VfR2V0TGlnaHRFbmFibGUoVGhpcy0+d2luZUQzRERldmljZSwgTGlnaHRJbmRleCwgRW5hYmxlKTsKICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6U2V0Q2xpcFBsYW5lCiAqCiAqIFNldHMgY3VzdG9tIGNsaXBwaW5nIHBsYW5lCiAqCiAqIFZlcnNpb24gNwogKgogKiBQYXJhbXM6CiAqICBJbmRleDogVGhlIGluZGV4IG9mIHRoZSBjbGlwcGluZyBwbGFuZQogKiAgUGxhbmVFcXVhdGlvbjogQW4gZXF1YXRpb24gZGVmaW5pbmcgdGhlIGNsaXBwaW5nIHBsYW5lCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBQbGFuZUVxdWF0aW9uIGlzIE5VTEwKICogIFNlZSBJV2luZUQzRERldmljZTo6U2V0Q2xpcFBsYW5lIGZvciBtb3JlIGRldGFpbHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X1NldENsaXBQbGFuZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSogUGxhbmVFcXVhdGlvbikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKTogUmVsYXkhXG4iLCBUaGlzLCBJbmRleCwgUGxhbmVFcXVhdGlvbik7CgogICAgaWYoIVBsYW5lRXF1YXRpb24pCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldENsaXBQbGFuZShUaGlzLT53aW5lRDNERGV2aWNlLCBJbmRleCwgUGxhbmVFcXVhdGlvbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2U3OjpHZXRDbGlwUGxhbmUKICoKICogUmV0dXJucyB0aGUgY2xpcHBpbmcgcGxhbmUgd2l0aCBhIHNwZWNpZmljIGluZGV4CiAqCiAqIFBhcmFtczoKICogIEluZGV4OiBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgcGxhbmUKICogIFBsYW5lRXF1YXRpb246IEFkZHJlc3MgdG8gc3RvcmUgdGhlIHBsYW5lIGVxdWF0aW9uIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBQbGFuZUVxdWF0aW9uIGlzIE5VTEwKICogIFNlZSBJV2luZUQzRERldmljZTo6R2V0Q2xpcFBsYW5lIGZvciBtb3JlIGRldGFpbHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENsaXBQbGFuZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSogUGxhbmVFcXVhdGlvbikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglZCwlcCk6IFJlbGF5IVxuIiwgVGhpcywgSW5kZXgsIFBsYW5lRXF1YXRpb24pOwoKICAgIGlmKCFQbGFuZUVxdWF0aW9uKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIHJldHVybiBJV2luZUQzRERldmljZV9HZXRDbGlwUGxhbmUoVGhpcy0+d2luZUQzRERldmljZSwgSW5kZXgsIFBsYW5lRXF1YXRpb24pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlNzo6R2V0SW5mbwogKgogKiBSZXRyaWV2ZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlLiBUaGUgRGlyZWN0WCBzZGsgc2F5cyB0aGF0CiAqIHRoaXMgdmVyc2lvbiByZXR1cm5zIFNfRkFMU0UgZm9yIGFsbCByZXRhaWwgYnVpbGRzIG9mIERpcmVjdFgsIHRoYXQncyB3aGF0CiAqIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcy4KICoKICogUGFyYW1zOgogKiAgRGV2SW5mb0lEOiBJbmZvcm1hdGlvbiB0eXBlIHJlcXVlc3RlZAogKiAgRGV2SW5mb1N0cnVjdDogUG9pbnRlciB0byBhIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgaW5mbyB0bwogKiAgU2l6ZTogU2l6ZSBvZiB0aGUgc3RydWN0dXJlCiAqCiAqIFJldHVybnM6CiAqICBTX0ZBTFNFLCBiZWNhdXNlIGl0J3MgYSBub24tZGVidWcgZHJpdmVyCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRERldmljZUltcGxfN19HZXRJbmZvKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBEZXZJbmZvSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRldkluZm9TdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFNpemUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCwlMDh4KVxuIiwgVGhpcywgRGV2SW5mb0lELCBEZXZJbmZvU3RydWN0LCBTaXplKTsKCiAgICBpZiAoVFJBQ0VfT04oZDNkNykpCiAgICB7CiAgICAgICAgVFJBQ0UoIiBpbmZvIHJlcXVlc3RlZCA6ICIpOwogICAgICAgIHN3aXRjaCAoRGV2SW5mb0lEKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSBEM0RERVZJTkZPSURfVEVYVFVSRU1BTkFHRVI6IFRSQUNFKCJEM0RERVZJTkZPSURfVEVYVFVSRU1BTkFHRVJcbiIpOyBicmVhazsKICAgICAgICAgICAgY2FzZSBEM0RERVZJTkZPSURfRDNEVEVYVFVSRU1BTkFHRVI6IFRSQUNFKCJEM0RERVZJTkZPSURfRDNEVEVYVFVSRU1BTkFHRVJcbiIpOyBicmVhazsKICAgICAgICAgICAgY2FzZSBEM0RERVZJTkZPSURfVEVYVFVSSU5HOiBUUkFDRSgiRDNEREVWSU5GT0lEX1RFWFRVUklOR1xuIik7IGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OiBFUlIoIiBpbnZhbGlkIGZsYWcgISEhXG4iKTsgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBTX0ZBTFNFOyAvKiBBY2NvcmRpbmcgdG8gTVNETiwgdGhpcyBpcyB2YWxpZCBmb3IgYSBub24tZGVidWcgZHJpdmVyICovCn0KCmNvbnN0IElEaXJlY3QzRERldmljZTdWdGJsIElEaXJlY3QzRERldmljZTdfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfUXVlcnlJbnRlcmZhY2UsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfQWRkUmVmLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRERldmljZTcgKioqLwogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENhcHMsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRW51bVRleHR1cmVGb3JtYXRzLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0JlZ2luU2NlbmUsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRW5kU2NlbmUsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0RGlyZWN0M0QsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0UmVuZGVyVGFyZ2V0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFJlbmRlclRhcmdldCwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19DbGVhciwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRUcmFuc2Zvcm0sCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0VHJhbnNmb3JtLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFZpZXdwb3J0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X011bHRpcGx5VHJhbnNmb3JtLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFZpZXdwb3J0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1NldE1hdGVyaWFsLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldE1hdGVyaWFsLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1NldExpZ2h0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldExpZ2h0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFJlbmRlclN0YXRlLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFJlbmRlclN0YXRlLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0JlZ2luU3RhdGVCbG9jaywKICAgIElEaXJlY3QzRERldmljZUltcGxfN19FbmRTdGF0ZUJsb2NrLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1ByZUxvYWQsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd1ByaW1pdGl2ZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19EcmF3SW5kZXhlZFByaW1pdGl2ZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRDbGlwU3RhdHVzLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENsaXBTdGF0dXMsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd1ByaW1pdGl2ZVN0cmlkZWQsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdQcmltaXRpdmVWQiwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19EcmF3SW5kZXhlZFByaW1pdGl2ZVZCLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFRleHR1cmUsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0VGV4dHVyZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19HZXRUZXh0dXJlU3RhZ2VTdGF0ZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRUZXh0dXJlU3RhZ2VTdGF0ZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19WYWxpZGF0ZURldmljZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19BcHBseVN0YXRlQmxvY2ssCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfQ2FwdHVyZVN0YXRlQmxvY2ssCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRGVsZXRlU3RhdGVCbG9jaywKICAgIElEaXJlY3QzRERldmljZUltcGxfN19DcmVhdGVTdGF0ZUJsb2NrLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0xvYWQsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfTGlnaHRFbmFibGUsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TGlnaHRFbmFibGUsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0Q2xpcFBsYW5lLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENsaXBQbGFuZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfN19HZXRJbmZvCn07Cgpjb25zdCBJRGlyZWN0M0REZXZpY2UzVnRibCBJRGlyZWN0M0REZXZpY2UzX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0REZXZpY2UzICoqKi8KICAgIElEaXJlY3QzRERldmljZUltcGxfM19HZXRDYXBzLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFN0YXRzLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8zX0FkZFZpZXdwb3J0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8zX0RlbGV0ZVZpZXdwb3J0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8zX05leHRWaWV3cG9ydCwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19FbnVtVGV4dHVyZUZvcm1hdHMsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW5TY2VuZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19FbmRTY2VuZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXREaXJlY3QzRCwKICAgIElEaXJlY3QzRERldmljZUltcGxfM19TZXRDdXJyZW50Vmlld3BvcnQsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0Q3VycmVudFZpZXdwb3J0LAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFJlbmRlclRhcmdldCwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRSZW5kZXJUYXJnZXQsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW4sCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW5JbmRleGVkLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8zX1ZlcnRleCwKICAgIElEaXJlY3QzRERldmljZUltcGxfM19JbmRleCwKICAgIElEaXJlY3QzRERldmljZUltcGxfM19FbmQsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0UmVuZGVyU3RhdGUsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0UmVuZGVyU3RhdGUsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0TGlnaHRTdGF0ZSwKICAgIElEaXJlY3QzRERldmljZUltcGxfM19TZXRMaWdodFN0YXRlLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFRyYW5zZm9ybSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRUcmFuc2Zvcm0sCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfTXVsdGlwbHlUcmFuc2Zvcm0sCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3SW5kZXhlZFByaW1pdGl2ZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRDbGlwU3RhdHVzLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldENsaXBTdGF0dXMsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZVN0cmlkZWQsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdQcmltaXRpdmVWQiwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3SW5kZXhlZFByaW1pdGl2ZVZCLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5LAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFRleHR1cmUsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0VGV4dHVyZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRUZXh0dXJlU3RhZ2VTdGF0ZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUZXh0dXJlU3RhZ2VTdGF0ZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19WYWxpZGF0ZURldmljZQp9OwoKY29uc3QgSURpcmVjdDNERGV2aWNlMlZ0YmwgSURpcmVjdDNERGV2aWNlMl9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNERGV2aWNlMiAqKiovCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0Q2FwcywKICAgIElEaXJlY3QzRERldmljZUltcGxfMl9Td2FwVGV4dHVyZUhhbmRsZXMsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0U3RhdHMsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQWRkVmlld3BvcnQsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfRGVsZXRlVmlld3BvcnQsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfTmV4dFZpZXdwb3J0LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8yX0VudW1UZXh0dXJlRm9ybWF0cywKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpblNjZW5lLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0VuZFNjZW5lLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldERpcmVjdDNELAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldEN1cnJlbnRWaWV3cG9ydCwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRDdXJyZW50Vmlld3BvcnQsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0UmVuZGVyVGFyZ2V0LAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclRhcmdldCwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpbiwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpbkluZGV4ZWQsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfVmVydGV4LAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0luZGV4LAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0VuZCwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRSZW5kZXJTdGF0ZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRSZW5kZXJTdGF0ZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRMaWdodFN0YXRlLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldExpZ2h0U3RhdGUsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0VHJhbnNmb3JtLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFRyYW5zZm9ybSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9NdWx0aXBseVRyYW5zZm9ybSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EcmF3UHJpbWl0aXZlLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0RyYXdJbmRleGVkUHJpbWl0aXZlLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldENsaXBTdGF0dXMsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0Q2xpcFN0YXR1cwp9OwoKY29uc3QgSURpcmVjdDNERGV2aWNlVnRibCBJRGlyZWN0M0REZXZpY2UxX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0REZXZpY2UxICoqKi8KICAgIElEaXJlY3QzRERldmljZUltcGxfMV9Jbml0aWFsaXplLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldENhcHMsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfU3dhcFRleHR1cmVIYW5kbGVzLAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8xX0NyZWF0ZUV4ZWN1dGVCdWZmZXIsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0U3RhdHMsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzFfRXhlY3V0ZSwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9BZGRWaWV3cG9ydCwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9EZWxldGVWaWV3cG9ydCwKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9OZXh0Vmlld3BvcnQsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzFfUGljaywKICAgIElEaXJlY3QzRERldmljZUltcGxfMV9HZXRQaWNrUmVjb3JkcywKICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9FbnVtVGV4dHVyZUZvcm1hdHMsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzFfQ3JlYXRlTWF0cml4LAogICAgSURpcmVjdDNERGV2aWNlSW1wbF8xX1NldE1hdHJpeCwKICAgIElEaXJlY3QzRERldmljZUltcGxfMV9HZXRNYXRyaXgsCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzFfRGVsZXRlTWF0cml4LAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0VuZFNjZW5lLAogICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0JlZ2luU2NlbmUsCiAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0RGlyZWN0M0QKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2VJbXBsX0NyZWF0ZUhhbmRsZQogKgogKiBOb3QgY2FsbGVkIGZyb20gdGhlIFZUYWJsZQogKgogKiBTb21lIG9sZGVyIGludGVyZmFjZSB2ZXJzaW9ucyBvcGVyYXRlIHdpdGggaGFuZGxlcywgd2hpY2ggYXJlIGJhc2ljYWxseQogKiBEV09SRHMgd2hpY2ggaWRlbnRpZnkgYW4gaW50ZXJmYWNlLCBmb3IgZXhhbXBsZQogKiBJRGlyZWN0M0REZXZpY2U6OlNldFJlbmRlclN0YXRlIHdpdGggRElSRUNUM0RSRU5ERVJTVEFURV9URVhUVVJFSEFORExFCiAqCiAqIFRob3NlIGhhbmRsZSBjb3VsZCBiZSBqdXN0IGNhc3RzIHRvIHRoZSBpbnRlcmZhY2UgcG9pbnRlcnMgb3IgdmljZSB2ZXJzYSwKICogYnV0IHRoYXQgaXMgbm90IDY0IGJpdCBzYWZlIGFuZCB3b3VsZCBtZWFuIGJsaW5kbHkgZGVyZWZlcmluZyBhIERXT1JECiAqIHBhc3NlZCBieSB0aGUgYXBwLiBJbnN0ZWFkIHRoZXJlIGlzIGEgZHluYW1pYyBhcnJheSBpbiB0aGUgZGV2aWNlIHdoaWNoCiAqIGtlZXBzIGEgRFdPUkQgdG8gcG9pbnRlciBpbmZvcm1hdGlvbiBhbmQgYSB0eXBlIGZvciB0aGUgaGFuZGxlLgogKgogKiBCYXNpY2FsbHkgdGhpcyBhcnJheSBvbmx5IGdyb3dzLCB3aGVuIGEgaGFuZGxlIGlzIGZyZWVkIGl0cyBwb2ludGVyIGlzCiAqIGp1c3Qgc2V0IHRvIE5VTEwuIFRoZXJlIHdpbGwgYmUgbXVjaCBtb3JlIHJlYWRzIGZyb20gdGhlIGFycmF5IHRoYW4KICogaW5zZXJ0aW9uIG9wZXJhdGlvbnMsIHNvIGEgZHluYW1pYyBhcnJheSBpcyBmaW5lLgogKgogKiBQYXJhbXM6CiAqICBUaGlzOiBEM0REZXZpY2UgaW1wbGVtZW50YXRpb24gZm9yIHdoaWNoIHRoaXMgaGFuZGxlIHNob3VsZCBiZSBjcmVhdGVkCiAqCiAqIFJldHVybnM6CiAqICBBIGZyZWUgaGFuZGxlIG9uIHN1Y2Nlc3MKICogIDAgb24gZmFpbHVyZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkRXT1JECklEaXJlY3QzRERldmljZUltcGxfQ3JlYXRlSGFuZGxlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpCnsKICAgIERXT1JEIGk7CiAgICBzdHJ1Y3QgSGFuZGxlRW50cnkgKm9sZEhhbmRsZXMgPSBUaGlzLT5IYW5kbGVzOwoKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICBmb3IoaSA9IDA7IGkgPCBUaGlzLT5udW1IYW5kbGVzOyBpKyspCiAgICB7CiAgICAgICAgaWYoVGhpcy0+SGFuZGxlc1tpXS5wdHIgPT0gTlVMTCAmJgogICAgICAgICAgIFRoaXMtPkhhbmRsZXNbaV0udHlwZSA9PSBERHJhd0hhbmRsZV9Vbmtub3duKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoIlJldXNpbmcgZnJlZWQgaGFuZGxlICVkXG4iLCBpICsgMSk7CiAgICAgICAgICAgIHJldHVybiBpICsgMTsKICAgICAgICB9CiAgICB9CgogICAgVFJBQ0UoIkdyb3dpbmcgdGhlIGhhbmRsZSBhcnJheVxuIik7CgogICAgVGhpcy0+bnVtSGFuZGxlcysrOwogICAgVGhpcy0+SGFuZGxlcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2Yoc3RydWN0IEhhbmRsZUVudHJ5KSAqIFRoaXMtPm51bUhhbmRsZXMpOwogICAgaWYoIVRoaXMtPkhhbmRsZXMpCiAgICB7CiAgICAgICAgRVJSKCJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBUaGlzLT5IYW5kbGVzID0gb2xkSGFuZGxlczsKICAgICAgICBUaGlzLT5udW1IYW5kbGVzLS07CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZihvbGRIYW5kbGVzKQogICAgewogICAgICAgIG1lbWNweShUaGlzLT5IYW5kbGVzLCBvbGRIYW5kbGVzLCAoVGhpcy0+bnVtSGFuZGxlcyAtIDEpICogc2l6ZW9mKHN0cnVjdCBIYW5kbGVFbnRyeSkpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9sZEhhbmRsZXMpOwogICAgfQoKICAgIFRSQUNFKCJSZXR1cm5pbmcgJWRcbiIsIFRoaXMtPm51bUhhbmRsZXMpOwogICAgcmV0dXJuIFRoaXMtPm51bUhhbmRsZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2VJbXBsX1VwZGF0ZURlcHRoU3RlbmNpbAogKgogKiBDaGVja3MgdGhlIGN1cnJlbnQgcmVuZGVyIHRhcmdldCBmb3IgYXR0YWNoZWQgZGVwdGggc3RlbmNpbHMgYW5kIHNldHMgdGhlCiAqIFdpbmVEM0QgZGVwdGggc3RlbmNpbCBhY2NvcmRpbmdseS4KICoKICogUmV0dXJuczoKICogIFRoZSBkZXB0aCBzdGVuY2lsIHN0YXRlIHRvIHNldCBpZiBjcmVhdGluZyB0aGUgZGV2aWNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KV0lORUQzRFpCVUZGRVJUWVBFCklEaXJlY3QzRERldmljZUltcGxfVXBkYXRlRGVwdGhTdGVuY2lsKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpCnsKICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKmRlcHRoU3RlbmNpbCA9IE5VTEw7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpkc2k7CiAgICBzdGF0aWMgRERTQ0FQUzIgZGVwdGhjYXBzID0geyBERFNDQVBTX1pCVUZGRVIsIDAsIDAsIDAgfTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLT50YXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoY2FwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aFN0ZW5jaWwpOwogICAgaWYoIWRlcHRoU3RlbmNpbCkKICAgIHsKICAgICAgICBUUkFDRSgiU2V0dGluZyB3aW5lZDNkIGRlcHRoIHN0ZW5jaWwgdG8gTlVMTFxuIik7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0RGVwdGhTdGVuY2lsU3VyZmFjZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RaQl9GQUxTRTsKICAgIH0KCiAgICBkc2kgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBkZXB0aFN0ZW5jaWwpOwogICAgVFJBQ0UoIlNldHRpbmcgd2luZWQzZCBkZXB0aCBzdGVuY2lsIHRvICVwICh3aW5lZDNkICVwKVxuIiwgZHNpLCBkc2ktPldpbmVEM0RTdXJmYWNlKTsKICAgIElXaW5lRDNERGV2aWNlX1NldERlcHRoU3RlbmNpbFN1cmZhY2UoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNpLT5XaW5lRDNEU3VyZmFjZSk7CgogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKGRlcHRoU3RlbmNpbCk7CiAgICByZXR1cm4gV0lORUQzRFpCX1RSVUU7Cn0K