LyogRGlyZWN0RHJhdyBTdXJmYWNlIEltcGxlbWVudGF0aW9uCiAqCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBMaW9uZWwgVWxtZXIKICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIChpbnRlcm5hbCkgZHJpdmVyIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMsCiAqIGRyaXZlciBlbnVtZXJhdGlvbiBBUElzIGFuZCBEaXJlY3REcmF3IGNyZWF0aW9uIGZ1bmN0aW9ucy4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKI2luY2x1ZGUgImV4Y3B0LmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJVW5rbm93biBwYXJ0cyBmb2xsb3cKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlF1ZXJ5SW50ZXJmYWNlCiAqCiAqIEEgbm9ybWFsIFF1ZXJ5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLiBGb3IgUXVlcnlJbnRlcmZhY2UgcnVsZXMKICogc2VlIGRkcmF3LmMsIElEaXJlY3REcmF3Nzo6UXVlcnlJbnRlcmZhY2UuIFRoaXMgbWV0aG9kCiAqIGNhbiBRdWVyeSBJRGlyZWN0RHJhd1N1cmZhY2UgaW50ZXJmYWNlcyBpbiBhbGwgdmVyc2lvbiwgSURpcmVjdDNEVGV4dHVyZQogKiBpbiBhbGwgdmVyc2lvbnMsIHRoZSBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCBpbnRlcmZhY2UgYW5kIGl0IGNhbgogKiBjcmVhdGUgYW4gSURpcmVjdDNERGV2aWNlLiAoVXNlcyBJRGlyZWN0M0Q3OjpDcmVhdGVEZXZpY2UpCiAqCiAqIFBhcmFtczoKICogIHJpaWQ6IFRoZSBpbnRlcmZhY2UgaWQgcXVlcmllZCBmb3IKICogIG9iajogQWRkcmVzcyB0byB3cml0ZSB0aGUgcG9pbnRlciB0bwogKgogKiBSZXR1cm5zOgogKiAgU19PSyBvbiBzdWNjZXNzCiAqICBFX05PSU5URVJGQUNFIGlmIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlIHdhc24ndCBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKCiAgICAvKiBBY2NvcmRpbmcgdG8gQ09NIGRvY3MsIGlmIHRoZSBRdWVyeUludGVyZmFjZSBmYWlscywgb2JqIHNob3VsZCBiZSBzZXQgdG8gTlVMTCAqLwogICAgKm9iaiA9IE5VTEw7CgogICAgaWYoIXJpaWQpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJpaWQpLG9iaik7CiAgICBpZiAoSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JVW5rbm93bikKICAgICB8fCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTcpCiAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U0KSApCiAgICB7CiAgICAgICAgSVVua25vd25fQWRkUmVmKGlmYWNlKTsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CiAgICAgICAgVFJBQ0UoIiglcCkgcmV0dXJuaW5nIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKICAgICAgICByZXR1cm4gU19PSzsKICAgIH0KICAgIGVsc2UgaWYoIElzRXF1YWxHVUlEKHJpaWQsICZJSURfSURpcmVjdERyYXdTdXJmYWNlMykKICAgICAgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSURpcmVjdERyYXdTdXJmYWNlMikKICAgICAgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSURpcmVjdERyYXdTdXJmYWNlKSApCiAgICB7CiAgICAgICAgSVVua25vd25fQWRkUmVmKGlmYWNlKTsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlMyk7CiAgICAgICAgVFJBQ0UoIiglcCkgcmV0dXJuaW5nIElEaXJlY3REcmF3U3VyZmFjZTMgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKICAgICAgICByZXR1cm4gU19PSzsKICAgIH0KICAgIGVsc2UgaWYoIElzRXF1YWxHVUlEKHJpaWQsICZJSURfSURpcmVjdERyYXdHYW1tYUNvbnRyb2wpICkKICAgIHsKICAgICAgICBJVW5rbm93bl9BZGRSZWYoaWZhY2UpOwogICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCk7CiAgICAgICAgVFJBQ0UoIiglcCkgcmV0dXJuaW5nIElEaXJlY3REcmF3R2FtbWFDb250cm9sIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CiAgICAgICAgcmV0dXJuIFNfT0s7CiAgICB9CiAgICBlbHNlIGlmKCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0QzRERFVklDRV9XaW5lRDNEKSB8fAogICAgICAgICAgICAgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JRGlyZWN0M0RIQUxEZXZpY2UpICkKICAgIHsKICAgICAgICBJRGlyZWN0M0REZXZpY2U3ICpkM2Q7CgogICAgICAgIC8qIENhbGwgaW50byBJRGlyZWN0M0Q3IGZvciBjcmVhdGlvbiAqLwogICAgICAgIElEaXJlY3QzRDdfQ3JlYXRlRGV2aWNlKElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3LCBJRGlyZWN0M0Q3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkM2QpOwoKICAgICAgICAqb2JqID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIElEaXJlY3QzRERldmljZSwgZDNkKTsKICAgICAgICBUUkFDRSgiKCVwKSBSZXR1cm5pbmcgSURpcmVjdDNERGV2aWNlIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CgogICAgICAgIHJldHVybiBTX09LOwogICAgfQogICAgZWxzZSBpZiAoSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEVGV4dHVyZSwgcmlpZCApIHx8CiAgICAgICAgICAgICBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RUZXh0dXJlMiwgcmlpZCApKQogICAgewogICAgICAgIGlmIChJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RUZXh0dXJlLCByaWlkICkpCiAgICAgICAgewogICAgICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVGV4dHVyZSk7CiAgICAgICAgICAgIFRSQUNFKCIgcmV0dXJuaW5nIERpcmVjdDNEVGV4dHVyZSBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JqKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFRleHR1cmUyKTsKICAgICAgICAgICAgVFJBQ0UoIiByZXR1cm5pbmcgRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JqKTsKICAgICAgICB9CiAgICAgICAgSVVua25vd25fQWRkUmVmKCAoSVVua25vd24gKikgKm9iaik7CiAgICAgICAgcmV0dXJuIFNfT0s7CiAgICB9CgogICAgRVJSKCJObyBpbnRlcmZhY2VcbiIpOwogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpBZGRSZWYKICoKICogQSBub3JtYWwgYWRkcmVmIGltcGxlbWVudGF0aW9uCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0FkZFJlZihJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgVUxPTkcgcmVmQ291bnQgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKSA6IEFkZFJlZiBpbmNyZWFzaW5nIGZyb20gJWRcbiIsIFRoaXMsIHJlZkNvdW50IC0gMSk7CiAgICByZXR1cm4gcmVmQ291bnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0Rlc3Ryb3kKICoKICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIElEaXJlY3REcmF3U3VyZmFjZTc6OlJlbGVhc2UKICoKICogRnJlZXMgdGhlIHN1cmZhY2UsIHJlZ2FyZGxlc3Mgb2YgaXRzIHJlZmNvdW50LgogKiAgU2VlIElEaXJlY3REcmF3U3VyZmFjZTc6OlJlbGVhc2UgZm9yIG1vcmUgaW5mb3JtYXRpb24KICoKICogUGFyYW1zOgogKiAgVGhpczogU3VyZmFjZSB0byBmcmVlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9EZXN0cm95KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMpCnsKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICAvKiBDaGVjayB0aGUgcmVmY291bnQgYW5kIGdpdmUgYSB3YXJuaW5nICovCiAgICBpZihUaGlzLT5yZWYgPiAxKQogICAgewogICAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcGxleCBzdXJmYWNlIGlzIGRlc3Ryb3llZCwKICAgICAgICAgKiBiZWNhdXNlIHRoZSAybmQgc3VyZmFjZSB3YXMgYWRkcmVmKCllZCB3aGVuIHRoZSBhcHAKICAgICAgICAgKiBjYWxsZWQgR2V0QXR0YWNoZWRTdXJmYWNlCiAgICAgICAgICovCiAgICAgICAgV0FSTigiKCVwKTogRGVzdHJveWluZyBzdXJmYWNlIHdpdGggcmVmb3VudCAlZFxuIiwgVGhpcywgVGhpcy0+cmVmKTsKICAgIH0KCiAgICAvKiBDaGVjayBmb3IgYXR0YWNoZWQgc3VyZmFjZXMgYW5kIGRldGFjaCB0aGVtICovCiAgICBpZihUaGlzLT5maXJzdF9hdHRhY2hlZCAhPSBUaGlzKQogICAgewogICAgICAgIC8qIFdlbGwsIHRoaXMgc2hvdWxkbid0IGhhcHBlbjogVGhlIHN1cmZhY2UgYmVpbmcgYXR0YWNoZWQgaXMgYWRkcmVmKCllZAogICAgICAgICAgKiBpbiBBZGRBdHRhY2hlZFN1cmZhY2UsIHNvIGl0IHNob3VsZG4ndCBiZSByZWxlYXNlZCB1bnRpbCBEZWxldGVBdHRhY2hlZFN1cmZhY2UKICAgICAgICAgICogaXMgY2FsbGVkLCBiZWNhdXNlIHRoZSByZWZjb3VudCBpcyBoZWxkLiBJdCBsb29rcyBsaWtlIHRoZSBhcHAgcmVsZWFzZWQoKQogICAgICAgICAgKiBpdCBvZnRlbiBlbm91Z2ggdG8gZm9yY2UgdGhpcwogICAgICAgICAgKi8KICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpyb290ID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+Zmlyc3RfYXR0YWNoZWQsIElEaXJlY3REcmF3U3VyZmFjZTcpOwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKmRldGFjaCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpOwoKICAgICAgICBGSVhNRSgiKCVwKSBGcmVlaW5nIGEgc3VyZmFjZSB0aGF0IGlzIGF0dGFjaGVkIHRvIHN1cmZhY2UgJXBcbiIsIFRoaXMsIFRoaXMtPmZpcnN0X2F0dGFjaGVkKTsKCiAgICAgICAgLyogVGhlIHJlZmNvdW50IHdpbGwgZHJvcCB0byAtMSBoZXJlICovCiAgICAgICAgaWYoSURpcmVjdERyYXdTdXJmYWNlN19EZWxldGVBdHRhY2hlZFN1cmZhY2Uocm9vdCwgMCwgZGV0YWNoKSAhPSBERF9PSykKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiKCVwKSBEZWxldGVBdHRhY2hlZFN1cmZhY2UgZmFpbGVkIVxuIiwgVGhpcyk7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlKFRoaXMtPm5leHRfYXR0YWNoZWQgIT0gTlVMTCkKICAgIHsKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpyb290ID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqZGV0YWNoID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+bmV4dF9hdHRhY2hlZCwgSURpcmVjdERyYXdTdXJmYWNlNyk7CgogICAgICAgIGlmKElEaXJlY3REcmF3U3VyZmFjZTdfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKHJvb3QsIDAsIGRldGFjaCkgIT0gRERfT0spCiAgICAgICAgewogICAgICAgICAgICBFUlIoIiglcCkgRGVsZXRlQXR0YWNoZWRTdXJmYWNlIGZhaWxlZCFcbiIsIFRoaXMpOwogICAgICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIE5vdyBkZXN0cm95IHRoZSBzdXJmYWNlLiBXYWl0OiBJdCBjb3VsZCBoYXZlIGJlZW4gcmVsZWFzZWQgaWYgd2UgYXJlIGEgdGV4dHVyZSAqLwogICAgaWYoVGhpcy0+V2luZUQzRFN1cmZhY2UpCiAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1JlbGVhc2UoVGhpcy0+V2luZUQzRFN1cmZhY2UpOwoKICAgIC8qIEhhdmluZyBhIHRleHR1cmUgaGFuZGxlIHNldCBpbXBsaWVzIHRoYXQgdGhlIGRldmljZSBzdGlsbCBleGlzdHMgKi8KICAgIGlmKFRoaXMtPkhhbmRsZSkKICAgIHsKICAgICAgICBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW1RoaXMtPkhhbmRsZSAtIDFdLnB0ciA9IE5VTEw7CiAgICAgICAgVGhpcy0+ZGRyYXctPmQzZGRldmljZS0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS50eXBlID0gRERyYXdIYW5kbGVfVW5rbm93bjsKICAgIH0KCiAgICAvKiBSZWR1Y2UgdGhlIGRkcmF3IHN1cmZhY2UgY291bnQgKi8KICAgIEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5kZHJhdy0+c3VyZmFjZXMpOwogICAgbGlzdF9yZW1vdmUoJlRoaXMtPnN1cmZhY2VfbGlzdF9lbnRyeSk7CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpSZWxlYXNlCiAqCiAqIFJlZHVjZXMgdGhlIHN1cmZhY2UncyByZWZjb3VudCBieSAxLiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlCiAqIHN1cmZhY2UgaXMgZGVzdHJveWVkLgogKgogKiBEZXN0cm95aW5nIHRoZSBzdXJmYWNlIGlzIGEgYml0IHRyaWNreS4gRm9yIHRoZSBjb25uZWN0aW9uIGJldHdlZW4KICogV2luZUQzRFN1cmZhY2VzIGFuZCBEaXJlY3REcmF3U3VyZmFjZXMgc2VlIElEaXJlY3REcmF3Nzo6Q3JlYXRlU3VyZmFjZQogKiBJdCBoYXMgYSBuaWNlIGdyYXBoIGV4cGxhaW5pbmcgdGhlIGNvbm5lY3Rpb24uCiAqCiAqIFdoYXQgaGFwcGVucyBoZXJlIGlzIGJhc2ljYWxseSB0aGlzOgogKiBXaGVuIGEgc3VyZmFjZSBpcyBkZXN0cm95ZWQsIGl0cyBXaW5lRDNEU3VyZmFjZSBpcyByZWxlYXNlZCwKICogYW5kIHRoZSByZWZjb3VudCBvZiB0aGUgRGlyZWN0RHJhdyBpbnRlcmZhY2UgaXMgcmVkdWNlZCBieSAxLiBJZiBpdCBoYXMKICogY29tcGxleCBzdXJmYWNlcyBhdHRhY2hlZCB0byBpdCwgdGhlbiB0aGVzZSBzdXJmYWNlcyBhcmUgZGVzdHJveWVkIHRvbywKICogcmVnYXJkbGVzcyBvZiB0aGVpciByZWZjb3VudC4gSWYgYW55IHN1cmZhY2UgYmVpbmcgZGVzdHJveWVkIGhhcyBhbm90aGVyCiAqIHN1cmZhY2UgYXR0YWNoZWQgdG8gaXQgKHdpdGggYSAic29mdCIgYXR0YWNobWVudCwgbm90IGNvbXBsZXgpLCB0aGVuCiAqIHRoaXMgc3VyZmFjZSBpcyBkZXRhY2hlZCB3aXRoIERlbGV0ZUF0dGFjaGVkU3VyZmFjZS4KICoKICogV2hlbiB0aGUgc3VyZmFjZSBpcyBhIHRleHR1cmUsIHRoZSBXaW5lRDNEVGV4dHVyZSBpcyByZWxlYXNlZC4KICogSWYgdGhlIHN1cmZhY2UgaXMgdGhlIERpcmVjdDNEIHJlbmRlciB0YXJnZXQsIHRoZW4gdGhlIEQzRAogKiBjYXBhYmlsaXRpZXMgb2YgdGhlIFdpbmVEM0REZXZpY2UgYXJlIHVuaW5pdGlhbGl6ZWQsIHdoaWNoIGNhdXNlcyB0aGUKICogc3dhcGNoYWluIHRvIGJlIHJlbGVhc2VkLgogKgogKiBSZXR1cm5zOgogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9SZWxlYXNlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBVTE9ORyByZWY7CiAgICBUUkFDRSgiKCVwKSA6IFJlbGVhc2luZyBmcm9tICVkXG4iLCBUaGlzLCBUaGlzLT5yZWYpOwogICAgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgaWYgKHJlZiA9PSAwKQogICAgewoKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmOwogICAgICAgIElEaXJlY3REcmF3SW1wbCAqZGRyYXc7CiAgICAgICAgSVVua25vd24gKmlmYWNlVG9SZWxlYXNlID0gVGhpcy0+aWZhY2VUb1JlbGVhc2U7CgogICAgICAgIC8qIENvbXBsZXggYXR0YWNoZWQgc3VyZmFjZXMgYXJlIGRlc3Ryb3llZCBpbXBsaWNpdGVseSB3aGVuIHRoZSByb290IGlzIHJlbGVhc2VkICovCiAgICAgICAgaWYoVGhpcy0+Zmlyc3RfY29tcGxleCAhPSBUaGlzKQogICAgICAgIHsKICAgICAgICAgICAgV0FSTigiKCVwKSBBdHRlbXB0IHRvIGRlc3Ryb3kgYSBzdXJmYWNlIHRoYXQgaXMgYXR0YWNoZWQgdG8gYSBjb21wbGV4IHJvb3QgJXBcbiIsIFRoaXMsIFRoaXMtPmZpcnN0X2NvbXBsZXgpOwogICAgICAgICAgICByZXR1cm4gcmVmOwogICAgICAgIH0KICAgICAgICBkZHJhdyA9IFRoaXMtPmRkcmF3OwoKICAgICAgICAvKiBJZiBpdCdzIGEgdGV4dHVyZSwgZGVzdHJveSB0aGUgV2luZUQzRFRleHR1cmUuCiAgICAgICAgICogV2luZUQzRCB3aWxsIGRlc3Ryb3kgdGhlIElQYXJlbnQgaW50ZXJmYWNlcwogICAgICAgICAqIG9mIHRoZSBzdWJsZXZlbHMsIHdoaWNoIGRlc3Ryb3lzIHRoZSBXaW5lRDNEU3VyZmFjZXMuCiAgICAgICAgICogU2V0IHRoZSBzdXJmYWNlcyB0byBOVUxMIHRvIGF2b2lkIGRlc3Ryb3lpbmcgdGhlbSBhZ2FpbiBsYXRlcgogICAgICAgICAqLwogICAgICAgIGlmKFRoaXMtPndpbmVEM0RUZXh0dXJlKQogICAgICAgIHsKICAgICAgICAgICAgSVdpbmVEM0RUZXh0dXJlX1JlbGVhc2UoVGhpcy0+d2luZUQzRFRleHR1cmUpOwogICAgICAgIH0KICAgICAgICAvKiBJZiBpdCdzIHRoZSBSZW5kZXJUYXJnZXQsIGRlc3Ryb3kgdGhlIGQzZGRldmljZSAqLwogICAgICAgIGVsc2UgaWYoIChkZHJhdy0+ZDNkX2luaXRpYWxpemVkKSAmJiAoVGhpcyA9PSBkZHJhdy0+ZDNkX3RhcmdldCkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiKCVwKSBEZXN0cm95aW5nIHRoZSByZW5kZXIgdGFyZ2V0LCB1bmluaXRpYWxpemluZyBEM0RcbiIsIFRoaXMpOwoKICAgICAgICAgICAgLyogVW5zZXQgYW55IGluZGV4IGJ1ZmZlciwganVzdCB0byBiZSBzdXJlICovCiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldEluZGljZXMoZGRyYXctPndpbmVEM0REZXZpY2UsIE5VTEwsIDApOwogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXREZXB0aFN0ZW5jaWxTdXJmYWNlKGRkcmF3LT53aW5lRDNERGV2aWNlLCBOVUxMKTsKCiAgICAgICAgICAgIGlmKElXaW5lRDNERGV2aWNlX1VuaW5pdDNEKGRkcmF3LT53aW5lRDNERGV2aWNlLCBEM0Q3Q0JfRGVzdHJveURlcHRoU3RlbmNpbFN1cmZhY2UsIEQzRDdDQl9EZXN0cm95U3dhcENoYWluKSAhPSBEM0RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIE5vdCBnb29kICovCiAgICAgICAgICAgICAgICBFUlIoIiglcCkgRmFpbGVkIHRvIHVuaW5pdCAzRFxuIiwgVGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBGcmVlIHRoZSBkM2Qgd2luZG93IGlmIG9uZSB3YXMgY3JlYXRlZCAqLwogICAgICAgICAgICAgICAgaWYoZGRyYXctPmQzZF93aW5kb3cgIT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiICglcCkgRGVzdHJveWluZyB0aGUgaGlkZGVuIHJlbmRlciB3aW5kb3cgJXBcbiIsIFRoaXMsIGRkcmF3LT5kM2Rfd2luZG93KTsKICAgICAgICAgICAgICAgICAgICBEZXN0cm95V2luZG93KGRkcmF3LT5kM2Rfd2luZG93KTsKICAgICAgICAgICAgICAgICAgICBkZHJhdy0+ZDNkX3dpbmRvdyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBVbnNldCB0aGUgcG9pbnRlcnMgKi8KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGRyYXctPmQzZF9pbml0aWFsaXplZCA9IEZBTFNFOwogICAgICAgICAgICBkZHJhdy0+ZDNkX3RhcmdldCA9IE5VTEw7CgogICAgICAgICAgICAvKiBXcml0ZSBhIHRyYWNlIGJlY2F1c2UgRDNEIHVubG9hZGluZyB3YXMgdGhlIHJlYXNvbiBmb3IgbWFueQogICAgICAgICAgICAgKiBjcmFzaGVzIGR1cmluZyBkZXZlbG9wbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIFRSQUNFKCIoJXApIEQzRCB1bmxvYWRlZFxuIiwgVGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NBUFNfM0RERVZJQ0UgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NBUFNfVEVYVFVSRSAgICAgICAgKSApCiAgICAgICAgewogICAgICAgICAgICAvKiBJdCdzIGEgcmVuZGVyIHRhcmdldCwgYnV0IG5vIHN3YXBjaGFpbiB3YXMgY3JlYXRlZC4KICAgICAgICAgICAgICogVGhlIElQYXJlbnQgaW50ZXJmYWNlcyBoYXZlIHRvIGJlIHJlbGVhc2VkIG1hbnVhbGx5LgogICAgICAgICAgICAgKiBUaGUgc2FtZSBhcHBsaWVzIGZvciB0ZXh0dXJlcyB3aXRob3V0IGFuCiAgICAgICAgICAgICAqIElXaW5lRDNEVGV4dHVyZSBvYmplY3QgYXR0YWNoZWQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN1cmYgPSBUaGlzOwogICAgICAgICAgICB3aGlsZShzdXJmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJUGFyZW50ICpQYXJlbnQ7CgogICAgICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX0dldFBhcmVudChzdXJmLT5XaW5lRDNEU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElVbmtub3duICoqKSAmUGFyZW50KTsKICAgICAgICAgICAgICAgIElQYXJlbnRfUmVsZWFzZShQYXJlbnQpOyAgLyogRm9yIHRoZSBnZXRQYXJlbnQgKi8KICAgICAgICAgICAgICAgIElQYXJlbnRfUmVsZWFzZShQYXJlbnQpOyAgLyogVG8gcmVsZWFzZSBpdCAqLwogICAgICAgICAgICAgICAgc3VyZiA9IHN1cmYtPm5leHRfY29tcGxleDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogVGhlIHJlZmNvdW50IHRlc3Qgc2hvd3MgdGhhdCB0aGUgcGFsZXR0ZSBpcyBkZXRhY2hlZCB3aGVuIHRoZSBzdXJmYWNlIGlzIGRlc3Ryb3llZCAqLwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfU2V0UGFsZXR0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CgogICAgICAgIC8qIExvb3AgdGhyb3VnaCBhbGwgY29tcGxleCBhdHRhY2hlZCBzdXJmYWNlcywKICAgICAgICAgKiBhbmQgZGVzdHJveSB0aGVtCiAgICAgICAgICovCiAgICAgICAgd2hpbGUoIChzdXJmID0gVGhpcy0+bmV4dF9jb21wbGV4KSApCiAgICAgICAgewogICAgICAgICAgICBUaGlzLT5uZXh0X2NvbXBsZXggPSBzdXJmLT5uZXh0X2NvbXBsZXg7ICAvKiBVbmNoYWluIGl0IGZyb20gdGhlIGNvbXBsZXggbGlzdGluZyAqLwogICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0Rlc3Ryb3koc3VyZik7ICAgICAvKiBEZXN0cm95IGl0ICovCiAgICAgICAgfQoKICAgICAgICAvKiBEZXN0cm95IHRoZSBzdXJmYWNlLgogICAgICAgICAqLwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfRGVzdHJveShUaGlzKTsKCiAgICAgICAgLyogUmVkdWNlIHRoZSBkZHJhdyByZWZjb3VudCAqLwogICAgICAgIGlmKGlmYWNlVG9SZWxlYXNlKSBJVW5rbm93bl9SZWxlYXNlKGlmYWNlVG9SZWxlYXNlKTsKICAgIH0KCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0QXR0YWNoZWRTdXJmYWNlCiAqCiAqIFJldHVybnMgYW4gYXR0YWNoZWQgc3VyZmFjZSB3aXRoIHRoZSByZXF1ZXN0ZWQgY2Fwcy4gU3VyZmFjZSBhdHRhY2htZW50CiAqIGFuZCBjb21wbGV4IHN1cmZhY2VzIGFyZSBub3QgY2xlYXJseSBkZXNjcmliZWQgYnkgdGhlIE1TRE4gb3Igc2RrLAogKiBzbyB0aGlzIG1ldGhvZCBpcyB0cmlja3kgYW5kIGxpa2VseSB0byBjb250YWluIHByb2JsZW1zLgogKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIHRoZSBjb21wbGV4IGNoYWluIGZpcnN0LCB0aGVuIHRoZQogKiBhdHRhY2htZW50IGNoYWluLCBhbmQgdGhlbiBpdCBjaGVja3MgaWYgdGhlIGNhcHMgbWF0Y2ggdG8gaXRzZWxmLgogKgogKiBUaGUgY2hhaW5zIGFyZSBzZWFyY2hlZCBmcm9tIFRoaXMgZG93biB0byB0aGUgbGFzdCBzdXJmYWNlIGluIHRoZSBjaGFpbiwKICogbm90IGZyb20gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGNoYWluLiBUaGUgZmlyc3Qgc3VyZmFjZSBmb3VuZCBpcwogKiByZXR1cm5lZC4gVGhlIE1TRE4gc2F5cyB0aGF0IHRoaXMgbWV0aG9kIGZhaWxzIGlmIG1vcmUgdGhhbiBvbmUgc3VyZmFjZQogKiBtYXRjaGVzIHRoZSBjYXBzLCBidXQgYXBwYXJlbnRseSB0aGlzIGlzIGluY29ycmVjdC4KICoKICogVGhlIGZvdW5kIHN1cmZhY2UgaXMgQWRkUmVmLWVkIGJlZm9yZSBpdCBpcyByZXR1cm5lZC4KICoKICogUGFyYW1zOgogKiAgQ2FwczogUG9pbnRlciB0byBhIEREQ0FQUzIgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNhcHMgYXNrZWQgZm9yCiAqICBTdXJmYWNlOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBmb3VuZCBzdXJmYWNlCiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIENhcHMgb3IgU3VyZmFjZSBpcyBOVUxMCiAqICBEREVSUl9OT1RGT1VORCBpZiBubyBzdXJmYWNlIHdhcyBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldEF0dGFjaGVkU3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0FQUzIgKkNhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKipTdXJmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmOwogICAgRERTQ0FQUzIgb3VyX2NhcHM7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIENhcHMsIFN1cmZhY2UpOwoKICAgIG91cl9jYXBzID0gKkNhcHM7CgogICAgaWYoVGhpcy0+dmVyc2lvbiA8IDcpCiAgICB7CiAgICAgICAgLyogRWFybGllciBkeCBhcHBzIHB1dCBnYXJiYWdlIGludG8gdGhlc2UgbWVtYmVycywgY2xlYXIgdGhlbSAqLwogICAgICAgIG91cl9jYXBzLmR3Q2FwczIgPSAwOwogICAgICAgIG91cl9jYXBzLmR3Q2FwczMgPSAwOwogICAgICAgIG91cl9jYXBzLmR3Q2FwczQgPSAwOwogICAgfQoKICAgIFRSQUNFKCIoJXApOiBMb29raW5nIGZvciBjYXBzOiAleCwleCwleCwleFxuIiwgVGhpcywgb3VyX2NhcHMuZHdDYXBzLCBvdXJfY2Fwcy5kd0NhcHMyLCBvdXJfY2Fwcy5kd0NhcHMzLCBvdXJfY2Fwcy5kd0NhcHM0KTsgLyogRklYTUU6IEJldHRlciBkZWJ1Z2dpbmcgKi8KCiAgICAvKiBGaXJzdCwgbG9vayBhdCB0aGUgY29tcGxleCBjaGFpbiAqLwogICAgc3VyZiA9IFRoaXM7CgogICAgd2hpbGUoIChzdXJmID0gc3VyZi0+bmV4dF9jb21wbGV4KSApCiAgICB7CiAgICAgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJTdXJmYWNlOiAoJXApIGNhcHM6ICV4LCV4LCV4LCV4XG4iLCBzdXJmLAogICAgICAgICAgICAgICAgICAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzLAogICAgICAgICAgICAgICAgICAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiwKICAgICAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczMsCiAgICAgICAgICAgICAgICAgICBzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHM0KTsKICAgICAgICB9CgogICAgICAgIGlmICgoKHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIG91cl9jYXBzLmR3Q2FwcykgPT0gb3VyX2NhcHMuZHdDYXBzKSAmJgogICAgICAgICAgICAoKHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIgJiBvdXJfY2Fwcy5kd0NhcHMyKSA9PSBvdXJfY2Fwcy5kd0NhcHMyKSkgewoKICAgICAgICAgICAgLyogTVNETjogIlRoaXMgbWV0aG9kIGZhaWxzIGlmIG1vcmUgdGhhbiBvbmUgc3VyZmFjZSBpcyBhdHRhY2hlZAogICAgICAgICAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIGNhcGFiaWxpdGllcyByZXF1ZXN0ZWQuIgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBUaGUgbWlwbWFwIGRlbW8gb2YgdGhlIERpcmVjdFg3IHNkayBzaG93cyB3aGF0IHRvIGRvIGhlcmU6CiAgICAgICAgICAgICAqIGFwcGFyZW50bHkgYXBwcyBleHBlY3QgdGhlIGZpcnN0IGZvdW5kIHN1cmZhY2UgdG8gYmUgcmV0dXJuZWQuCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgVFJBQ0UoIiglcCk6IFJldHVybmluZyBzdXJmYWNlICVwXG4iLCBUaGlzLCBzdXJmKTsKICAgICAgICAgICAgVFJBQ0UoIiglcCk6IG1pcG1hcGNvdW50PSVkXG4iLCBUaGlzLCBzdXJmLT5taXBtYXBfbGV2ZWwpOwogICAgICAgICAgICAqU3VyZmFjZSA9IElDT01fSU5URVJGQUNFKHN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcpOwogICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZigqU3VyZmFjZSk7CiAgICAgICAgICAgIHJldHVybiBERF9PSzsKICAgICAgICB9CiAgICB9CgogICAgLyogTmV4dCwgbG9vayBhdCB0aGUgYXR0YWNobWVudCBjaGFpbiAqLwogICAgc3VyZiA9IFRoaXM7CgogICAgd2hpbGUoIChzdXJmID0gc3VyZi0+bmV4dF9hdHRhY2hlZCkgKQogICAgewogICAgICAgIGlmIChUUkFDRV9PTihkZHJhdykpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiU3VyZmFjZTogKCVwKSBjYXBzOiAleCwleCwleCwleFxuIiwgc3VyZiwKICAgICAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcywKICAgICAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIsCiAgICAgICAgICAgICAgICAgICBzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMzLAogICAgICAgICAgICAgICAgICAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzNCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoKChzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBvdXJfY2Fwcy5kd0NhcHMpID09IG91cl9jYXBzLmR3Q2FwcykgJiYKICAgICAgICAgICAgKChzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMyICYgb3VyX2NhcHMuZHdDYXBzMikgPT0gb3VyX2NhcHMuZHdDYXBzMikpIHsKCiAgICAgICAgICAgIC8qIE1TRE46ICJUaGlzIG1ldGhvZCBmYWlscyBpZiBtb3JlIHRoYW4gb25lIHN1cmZhY2UgaXMgYXR0YWNoZWQKICAgICAgICAgICAgICogdGhhdCBtYXRjaGVzIHRoZSBjYXBhYmlsaXRpZXMgcmVxdWVzdGVkLiIKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVGhlIG1pcG1hcCBkZW1vIG9mIHRoZSBEaXJlY3RYNyBzZGsgc2hvd3Mgd2hhdCB0byBkbyBoZXJlOgogICAgICAgICAgICAgKiBhcHBhcmVudGx5IGFwcHMgZXhwZWN0IHRoZSBmaXJzdCBmb3VuZCBzdXJmYWNlIHRvIGJlIHJldHVybmVkLgogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIFRSQUNFKCIoJXApOiBSZXR1cm5pbmcgc3VyZmFjZSAlcFxuIiwgVGhpcywgc3VyZik7CiAgICAgICAgICAgICpTdXJmYWNlID0gSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNyk7CiAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKCpTdXJmYWNlKTsKICAgICAgICAgICAgcmV0dXJuIEREX09LOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBJcyB0aGlzIHZhbGlkPyAqLwojaWYgMAogICAgaWYgKCgoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgb3VyX2NhcHMuZHdDYXBzKSA9PSBvdXJfY2Fwcy5kd0NhcHMpICYmCiAgICAgICAgKChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMyICYgb3VyX2NhcHMuZHdDYXBzMikgPT0gb3VyX2NhcHMuZHdDYXBzMikgJiYgCiAgICAgICAgVGhpcyA9PSBUaGlzLT5maXJzdF9jb21wbGV4KQogICAgewoKICAgICAgICBUUkFDRSgiKCVwKTogUmV0dXJuaW5nIHN1cmZhY2UgJXBcbiIsIFRoaXMsIFRoaXMpOwogICAgICAgICpTdXJmYWNlID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoKlN1cmZhY2UpOwogICAgICAgIHJldHVybiBERF9PSzsKICAgIH0KI2VuZGlmCgogICAgLyogV2hhdCB0byBkbyBoZXJlPyBDb250aW51ZSB3aXRoIHRoZSBzdXJmYWNlIHJvb3Q/PyAqLwoKICAgIFRSQUNFKCIoJXApIERpZG4ndCBmaW5kIGEgdmFsaWQgc3VyZmFjZVxuIiwgVGhpcyk7CiAgICByZXR1cm4gRERFUlJfTk9URk9VTkQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpMb2NrCiAqCiAqIExvY2tzIHRoZSBzdXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3VyZmFjZSdzIG1lbW9yeQogKgogKiBQYXJhbXM6CiAqICBSZWN0OiBSZWN0YW5nbGUgdG8gbG9jay4gSWYgTlVMTCwgdGhlIHdob2xlIHN1cmZhY2UgaXMgbG9ja2VkCiAqICBERFNEOiBQb2ludGVyIHRvIGEgRERTVVJGQUNFREVTQzIgd2hpY2ggc2hhbGwgcmVjZWl2ZSB0aGUgc3VyZmFjZSdzIGRlc2MuCiAqICBGbGFnczogTG9ja2luZyBmbGFncywgZS5nIFJlYWQgb25seSBvciB3cml0ZSBvbmx5CiAqICBoOiBBbiBldmVudCBoYW5kbGUgdGhhdCdzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIE5VTEwKICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRERTRCBpcyBOVUxMCiAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpMb2NrUmVjdAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0xvY2soSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKkREU0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBoKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBXSU5FRDNETE9DS0VEX1JFQ1QgTG9ja2VkUmVjdDsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCV4LCVwKVxuIiwgVGhpcywgUmVjdCwgRERTRCwgRmxhZ3MsIGgpOwoKICAgIGlmKCFERFNEKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIC8qIFNob3VsZCBJIGNoZWNrIGZvciB0aGUgaGFuZGxlIHRvIGJlIE5VTEw/CiAgICAgKgogICAgICogVGhlIERETE9DSyBmbGFncyBhbmQgdGhlIEQzRExPQ0sgZmxhZ3MgYXJlIGVxdWFsCiAgICAgKiBmb3IgdGhlIHN1cHBvcnRlZCB2YWx1ZXMuIFRoZSBvdGhlcnMgYXJlIGlnbm9yZWQgYnkgV2luZUQzRAogICAgICovCgogICAgLyogSG1tLiBBbmFyY2h5IG9ubGluZSBwYXNzZXMgYW4gdW5pbml0aWFsaXplZCBzdXJmYWNlIGRlc2NyaXB0b3IsCiAgICAgKiB0aGF0IG1lYW5zIGl0IGRvZXNuJ3QgaGF2ZSBkd1NpemUgc2V0LiBJbml0IGl0IHRvIHNvbWUgc2FuZQogICAgICogdmFsdWUKICAgICAqLwogICAgaWYoRERTRC0+ZHdTaXplIDw9IHNpemVvZihERFNVUkZBQ0VERVNDKSkKICAgIHsKICAgICAgICBERFNELT5kd1NpemUgPSBzaXplb2YoRERTVVJGQUNFREVTQyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgRERTRC0+ZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKTsKICAgIH0KCiAgICBERF9TVFJVQ1RfQ09QWV9CWVNJWkUoRERTRCwmKFRoaXMtPnN1cmZhY2VfZGVzYykpOwogICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfTG9ja1JlY3QoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9ja2VkUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7CiAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKCiAgICAvKiBPdmVycmlkZSB0aGUgbWVtb3J5IGFyZWEgYW5kIHRoZSBwaXRjaCAqLwogICAgRERTRC0+ZHdGbGFncyB8PSBERFNEX0xQU1VSRkFDRTsKICAgIEREU0QtPmxwU3VyZmFjZSA9IExvY2tlZFJlY3QucEJpdHM7CiAgICBERFNELT5kd0ZsYWdzIHw9IEREU0RfUElUQ0g7CiAgICBERFNELT51MS5sUGl0Y2ggPSBMb2NrZWRSZWN0LlBpdGNoOwoKICAgIFRSQUNFKCJsb2NrZWQgc3VyZmFjZSByZXR1cm5pbmcgZGVzY3JpcHRpb24gOlxuIik7CiAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhERFNEKTsKCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpVbmxvY2sKICoKICogVW5sb2NrcyBhbiBsb2NrZWQgc3VyZmFjZQogKgogKiBQYXJhbXM6CiAqICBSZWN0OiBOb3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEU3VyZmFjZTo6VW5sb2NrUmVjdAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1VubG9jayhJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVCAqcFJlY3QpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBwUmVjdCk7CgogICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KFRoaXMtPldpbmVEM0RTdXJmYWNlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkZsaXAKICoKICogRmxpcHMgYSBzdXJmYWNlIHdpdGggdGhlIEREU0NBUFNfRkxJUCBmbGFnLiBUaGUgZmxpcCBpcyByZWxheWVkIHRvCiAqIElXaW5lRDNEU3VyZmFjZTo6RmxpcC4gQmVjYXVzZSBXaW5lRDNEIGRvZXNuJ3QgaGFuZGxlIGF0dGFjaGVkIHN1cmZhY2VzLAogKiB0aGUgZmxpcCB0YXJnZXQgaXMgcGFzc2VkIHRvIFdpbmVEM0QsIGV2ZW4gaWYgdGhlIGFwcCBkaWRuJ3Qgc3BlY2lmeSBvbmUKICoKICogUGFyYW1zOgogKiAgRGVzdE92ZXJyaWRlOiBTcGVjaWZpZXMgdGhlIHN1cmZhY2UgdGhhdCB3aWxsIGJlY29tZSB0aGUgbmV3IGZyb250CiAqICAgICAgICAgICAgICAgIGJ1ZmZlci4gSWYgTlVMTCwgdGhlIGN1cnJlbnQgYmFjayBidWZmZXIgaXMgdXNlZAogKiAgRmxhZ3M6IHNvbWUgRGlyZWN0RHJhdyBmbGFncywgc2VlIGluY2x1ZGUvZGRyYXcuaAogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfTk9URkxJUFBBQkxFIGlmIG5vIGZsaXAgdGFyZ2V0IGNvdWxkIGJlIGZvdW5kCiAqICBEREVSUl9JTlZBTElET0JKRUNUIGlmIHRoZSBzdXJmYWNlIGlzbid0IGEgZnJvbnQgYnVmZmVyCiAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpGbGlwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfRmxpcChJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKkRlc3RPdmVycmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpPdmVycmlkZSA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIERlc3RPdmVycmlkZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpPdmVycmlkZTc7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglcCwleClcbiIsIFRoaXMsIERlc3RPdmVycmlkZSwgRmxhZ3MpOwoKICAgIC8qIEZsaXAgaGFzIHRvIGJlIGNhbGxlZCBmcm9tIGEgZnJvbnQgYnVmZmVyCiAgICAgKiBXaGF0IGFib3V0IG92ZXJsYXkgc3VyZmFjZXMsIEFGQUlLIHRoZXkgY2FuIGZsaXAgdG9vPwogICAgICovCiAgICBpZiggIShUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0ZST05UQlVGRkVSKSApCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURPQkpFQ1Q7IC8qIFVuY2tlY2tlZCAqLwoKICAgIC8qIFdpbmVEM0QgZG9lc24ndCBrZWVwIHRyYWNrIG9mIGF0dGFjaGVkIHN1cmZhY2UsIHNvIGZpbmQgdGhlIHRhcmdldCAqLwogICAgaWYoIU92ZXJyaWRlKQogICAgewogICAgICAgIEREU0NBUFMyIENhcHM7CgogICAgICAgIG1lbXNldCgmQ2FwcywgMCwgc2l6ZW9mKENhcHMpKTsKICAgICAgICBDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX0JBQ0tCVUZGRVI7CiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShpZmFjZSwgJkNhcHMsICZPdmVycmlkZTcpOwogICAgICAgIGlmKGhyICE9IEREX09LKQogICAgICAgIHsKICAgICAgICAgICAgRVJSKCJDYW4ndCBmaW5kIGEgZmxpcCB0YXJnZXRcbiIpOwogICAgICAgICAgICByZXR1cm4gRERFUlJfTk9URkxJUFBBQkxFOyAvKiBVbmNoZWNrZWQgKi8KICAgICAgICB9CiAgICAgICAgT3ZlcnJpZGUgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBPdmVycmlkZTcpOwoKICAgICAgICAvKiBGb3IgdGhlIEdldEF0dGFjaGVkU3VyZmFjZSAqLwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShPdmVycmlkZTcpOwogICAgfQoKICAgIHJldHVybiAgSVdpbmVEM0RTdXJmYWNlX0ZsaXAoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJyaWRlLT5XaW5lRDNEU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6Qmx0CiAqCiAqIFBlcmZvcm1zIGEgYmxpdCBvbiB0aGUgc3VyZmFjZQogKgogKiBQYXJhbXM6CiAqICBEZXN0UmVjdDogRGVzdGluYXRpb24gcmVjdGFuZ2xlLCBjYW4gYmUgTlVMTAogKiAgU3JjU3VyZmFjZTogU291cmNlIHN1cmZhY2UsIGNhbiBiZSBOVUxMCiAqICBTcmNSZWN0OiBTb3VyY2UgcmVjdGFuZ2UsIGNhbiBiZSBOVUxMCiAqICBGbGFnczogQmx0IGZsYWdzCiAqICBEREJsdEZ4OiBTb21lIGV4dGVuZGVkIGJsdCBwYXJhbWV0ZXJzLCBjb25uZWN0ZWQgdG8gdGhlIGZsYWdzCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgU2VlIElXaW5lRDNEU3VyZmFjZTo6Qmx0IGZvciBtb3JlIGRldGFpbHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9CbHQoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QgKkRlc3RSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpTcmNTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpTcmNSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgRERCTFRGWCAqRERCbHRGeCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqU3JjID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgU3JjU3VyZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwLCV4LCVwKVxuIiwgVGhpcywgRGVzdFJlY3QsIFNyYywgU3JjUmVjdCwgRmxhZ3MsIEREQmx0RngpOwoKICAgIC8qIENoZWNrIGZvciB2YWxpZGl0eSBvZiB0aGUgZmxhZ3MgaGVyZS4gV2luZUQzRCBIYXMgdGhlIHNvZnR3YXJlLW9wZW5nbCBzZWxlY3Rpb24gcGF0aCBhbmQgd291bGQgaGF2ZQogICAgICogdG8gY2hlY2sgYXQgMiBwbGFjZXMsIGFuZCBzb21ldGltZXMgZG8gZG91YmxlIGNoZWNrcy4gVGhpcyBhbHNvIHNhdmVzIHRoZSBjYWxsIHRvIHdpbmVkM2QgOi0pCiAgICAgKi8KICAgIGlmKChGbGFncyAmIEREQkxUX0tFWVNSQ09WRVJSSURFKSAmJiAoIUREQmx0RnggfHwgRmxhZ3MgJiBEREJMVF9LRVlTUkMpKSB7CiAgICAgICAgV0FSTigiSW52YWxpZCBzb3VyY2UgY29sb3Iga2V5IHBhcmFtZXRlcnMsIHJldHVybmluZyBEREVSUl9JTlZBTElEUEFSQU1TXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICBpZigoRmxhZ3MgJiBEREJMVF9LRVlERVNUT1ZFUlJJREUpICYmICghRERCbHRGeCB8fCBGbGFncyAmIEREQkxUX0tFWURFU1QpKSB7CiAgICAgICAgV0FSTigiSW52YWxpZCBkZXN0aW5hdGlvbiBjb2xvciBrZXkgcGFyYW1ldGVycywgcmV0dXJuaW5nIERERVJSX0lOVkFMSURQQVJBTVNcbiIpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKICAgIGlmKEZsYWdzICYgRERCTFRfS0VZU1JDICYmICghU3JjIHx8ICEoU3JjLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmIEREU0RfQ0tTUkNCTFQpKSkgewogICAgICAgIFdBUk4oIkREQkxUX0tFWURFU1QgYmxpdCB3aXRob3V0IGNvbG9yIGtleSBpbiBzdXJmYWNlLCByZXR1cm5pbmcgRERFUlJfSU5WQUxJRFBBUkFNU1xuIik7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9CbHQoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0UmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYyA/IFNyYy0+V2luZUQzRFN1cmZhY2UgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERCbHRGeCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpBZGRBdHRhY2hlZFN1cmZhY2UKICoKICogQXR0YWNoZXMgYSBzdXJmYWNlIHRvIGFub3RoZXIgc3VyZmFjZS4gU3VyZmFjZSBhdHRhY2htZW50cyBhcmUKICogaW5jb3JyZWN0bHkgZGVzY3JpYmVkIGluIHRoZSBTREsgYW5kIHRoZSBNU0ROLCBhbmQgdGhpcyBtZXRob2QKICogaXMgcHJvbmUgdG8gYnVncy4gVGhlIHN1cmZhY2UgdGhhdCBpcyBhdHRhY2hlZCBpcyBBZGRSZWYtZWQuCiAqCiAqIFRoZSBhdHRhY2htZW50IGxpc3QgY29uc2lzdHMgb2YgYSBmaXJzdCBzdXJmYWNlIChmaXJzdF9hdHRhY2hlZCkgYW5kCiAqIGZvciBlYWNoIHN1cmZhY2UgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGF0dGFjaGVkIHN1cmZhY2UgKG5leHRfYXR0YWNoZWQpLgogKiBGb3IgdGhlIGZpcnN0IHN1cmZhY2UsIGFuZCBhIHN1cmZhY2UgdGhhdCBoYXMgbm8gYXR0YWNobWVudHMKICogZmlyc3RfYXR0YWNoZWQgcG9pbnRzIHRvIHRoZSBzdXJmYWNlIGl0c2VsZi4gQSBzdXJmYWNlIHRoYXQgaGFzCiAqIG5vIHN1Y2Nlc3NvcnMgaW4gdGhlIGNoYWluIGhhcyBuZXh0X2F0dGFjaGVkIHNldCB0byBOVUxMLgogKgogKiBOZXdseSBhdHRhY2hlZCBzdXJmYWNlcyBhcmUgYXR0YWNoZWQgcmlnaHQgYWZ0ZXIgdGhlIHJvb3Qgc3VyZmFjZS4gVGhlCiAqIGNvbXBsZXggY2hhaW5zIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgaW4gYSBzaW1pbGFyIGNoYWluLCB3aXRoCiAqIGZpcnN0X2NvbXBsZXggYW5kIG5leHRfY29tcGxleC4gSWYgYSBzdXJmYWNlIGlzIGF0dGFjaGVkIHRvIGEgY29tcGxleAogKiBzdXJmYWNlIGNvbXBvdW5kLCBpdCdzIGF0dGFjaGVkIHRvIHRoZSBzdXJmYWNlIHRoYXQgdGhlIGFwcCByZXF1ZXN0ZWQsCiAqIG5vdCB0aGUgY29tcGxleCByb290LiBTZWUgR2V0QXR0YWNoZWRTdXJmYWNlIGZvciBhIGRlc2NyaXB0aW9uCiAqIGhvdyBzdXJmYWNlcyBhcmUgZm91bmQuCiAqCiAqIFRoaXMgaXMgaG93IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdvcmtzLCBhbmQgaXQgd2FzIGNvZGVkIGJ5IGxvb2tpbmcKICogYXQgdGhlIG5lZWRzIG9mIHRoZSBhcHBsaWNhdGlvbnMuCiAqCiAqIFNvIGZhciBvbmx5IFotQnVmZmVyIGF0dGFjaG1lbnRzIGFyZSB0ZXN0ZWQsIGJ1dCB0aGVyZSdzIG5vIGNvZGUgeWV0CiAqIHRvIGFjdGl2YXRlIHRoZW0uIE1pcG1hcHMgY291bGQgYmUgdHJpY2t5IHRvIGFjdGl2YXRlIGluIFdpbmVEM0QuCiAqIEJhY2sgYnVmZmVycyBzaG91bGQgd29yayBpbiAyRCBtb2RlLCBidXQgdGhleSBhcmUgbm90IHRlc3RlZC4KICogUmVuZGVyaW5nIHRvIHRoZSBwcmltYXJ5IHN1cmZhY2UgYW5kIHN3aXRjaGluZyBiZXR3ZWVuIHRoYXQgYW5kCiAqIGRvdWJsZSBidWZmZXJpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBXaW5lRDNELCBzbyBmb3IgM0QgaXQgbWlnaHQKICogaGF2ZSB1bmV4cGVjdGVkIHJlc3VsdHMuCiAqCiAqIFBhcmFtczoKICogIEF0dGFjaDogU3VyZmFjZSB0byBhdHRhY2ggdG8gaWZhY2UKICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UgaWYgdGhlIHN1cmZhY2UgY2FuJ3QgYmUgYXR0YWNoZWQgZm9yIHNvbWUgcmVhc29uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkQXR0YWNoZWRTdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpBdHRhY2gpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlN1cmYgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBBdHRhY2gpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIFN1cmYpOwoKICAgIC8qIFNob3VsZCBJIG1ha2Ugc3VyZSB0byBhZGQgaXQgdG8gdGhlIGZpcnN0IGNvbXBsZXggc3VyZmFjZT8gKi8KCiAgICBpZihTdXJmID09IFRoaXMpCiAgICAgICAgcmV0dXJuIERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0U7IC8qIHVuY2hlY2tlZCAqLwoKICAgIC8qIFRPRE8gTVNETjogIllvdSBjYW4gYXR0YWNoIG9ubHkgei1idWZmZXIgc3VyZmFjZXMgd2l0aCB0aGlzIG1ldGhvZC4iCiAgICAgKiBCdXQgYXBwYXJlbnRseSBiYWNrYnVmZmVycyBhbmQgbWlwbWFwcyBjYW4gYmUgYXR0YWNoZWQgdG9vLiAqLwoKICAgIC8qIFNldCBNSVBNQVBTVUJMRVZFTCBpZiB0aGlzIHNlZW1zIHRvIGJlIG9uZSAqLwogICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmCiAgICAgICAgU3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCiAgICB7CiAgICAgICAgU3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiB8PSBERFNDQVBTMl9NSVBNQVBTVUJMRVZFTDsKICAgICAgICAvKiBGSVhNRTogd2Ugc2hvdWxkIHByb2JhYmx5IGFsc28gYWRkIHRvIGR3TWlwTWFwQ291bnQgb2YgdGhpcwogICAgICAgICAgKiBhbmQgYWxsIHBhcmVudCBzdXJmYWNlcyAodXBkYXRlIGNyZWF0ZV90ZXh0dXJlIGlmIHlvdSBkbykgKi8KICAgIH0KCiAgICAvKiBDaGVjayBpZiB0aGUgc3VyZmFjZSBpcyBhbHJlYWR5IGF0dGFjaGVkIHNvbWV3aGVyZSAqLwogICAgaWYoIChTdXJmLT5uZXh0X2F0dGFjaGVkICE9IE5VTEwpIHx8CiAgICAgICAgKFN1cmYtPmZpcnN0X2F0dGFjaGVkICE9IFN1cmYpICkKICAgIHsKICAgICAgICAgRVJSKCIoJXApIFRoZSBTdXJmYWNlICVwIGlzIGFscmVhZHkgYXR0YWNoZWQgc29tZXdoZXJlIGVsc2U6IG5leHRfYXR0YWNoZWQgPSAlcCwgZmlyc3RfYXR0YWNoZWQgPSAlcCwgY2FuJ3QgaGFuZGxlIGJ5IG5vd1xuIiwgVGhpcywgU3VyZiwgU3VyZi0+bmV4dF9hdHRhY2hlZCwgU3VyZi0+Zmlyc3RfYXR0YWNoZWQpOwogICAgICAgIHJldHVybiBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFOwogICAgfQoKICAgIC8qIFRoaXMgaW5zZXJ0cyB0aGUgbmV3IHN1cmZhY2UgYXQgdGhlIDJuZCBwb3NpdGlvbiBpbiB0aGUgY2hhaW4sIHJpZ2h0IGFmdGVyIHRoZSByb290IHN1cmZhY2UgKi8KICAgIFN1cmYtPm5leHRfYXR0YWNoZWQgPSBUaGlzLT5uZXh0X2F0dGFjaGVkOwogICAgU3VyZi0+Zmlyc3RfYXR0YWNoZWQgPSBUaGlzLT5maXJzdF9hdHRhY2hlZDsKICAgIFRoaXMtPm5leHRfYXR0YWNoZWQgPSBTdXJmOwoKICAgIC8qIENoZWNrIGlmIHdlIGF0dGFjaCBhIGJhY2sgYnVmZmVyIHRvIHRoZSBwcmltYXJ5ICovCiAgICBpZihTdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1pCVUZGRVIgJiYKICAgICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCiAgICB7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0RGVwdGhTdGVuY2lsU3VyZmFjZShUaGlzLT5kZHJhdy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmYtPldpbmVEM0RTdXJmYWNlKTsKICAgIH0KCiAgICAvKiBNU0ROOiAKICAgICAqICJUaGlzIG1ldGhvZCBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIHN1cmZhY2UgYmVpbmcgYXR0YWNoZWQuIgogICAgICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihBdHRhY2gpOwogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6RGVsZXRlQXR0YWNoZWRTdXJmYWNlCiAqCiAqIFJlbW92ZXMgYSBzdXJmYWNlIGZyb20gdGhlIGF0dGFjaG1lbnQgY2hhaW4uIFRoZSBzdXJmYWNlJ3MgcmVmY291bnQKICogaXMgZGVjcmVhc2VkIGJ5IG9uZSBhZnRlciBpdCBoYXMgYmVlbiByZW1vdmVkCiAqCiAqIFBhcmFtczoKICogIEZsYWdzOiBTb21lIGZsYWdzLCBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCiAqICBBdHRhY2g6IFN1cmZhY2UgdG8gZGV0YWNoCiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9TVVJGQUNFTk9UQVRUQUNIRUQgaWYgdGhlIHN1cmZhY2UgaXNuJ3QgYXR0YWNoZWQgdG8KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9EZWxldGVBdHRhY2hlZFN1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpBdHRhY2gpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlN1cmYgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBBdHRhY2gpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqUHJldiA9IFRoaXM7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApXG4iLCBUaGlzLCBGbGFncywgU3VyZik7CgogICAgaWYgKCFTdXJmIHx8IChTdXJmLT5maXJzdF9hdHRhY2hlZCAhPSBUaGlzKSB8fCAoU3VyZiA9PSBUaGlzKSApCiAgICAgICAgcmV0dXJuIERERVJSX1NVUkZBQ0VOT1RBVFRBQ0hFRDsgLyogdW5jaGVja2VkICovCgogICAgLyogUmVtb3ZlIE1JUE1BUFNVQkxFVkVMIGlmIHRoaXMgc2VlbWVkIHRvIGJlIG9uZSAqLwogICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmCiAgICAgICAgU3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCiAgICB7CiAgICAgICAgU3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiAmPSB+RERTQ0FQUzJfTUlQTUFQU1VCTEVWRUw7CiAgICAgICAgLyogRklYTUU6IHdlIHNob3VsZCBwcm9iYWJseSBhbHNvIHN1YnRyYWN0IGZyb20gZHdNaXBNYXBDb3VudCBvZiB0aGlzCiAgICAgICAgICogYW5kIGFsbCBwYXJlbnQgc3VyZmFjZXMgKi8KICAgIH0KCiAgICAvKiBGaW5kIHRoZSBwcmVkZWNlc3NvciBvZiB0aGUgZGV0YWNoZWQgc3VyZmFjZSAqLwogICAgd2hpbGUoUHJldikKICAgIHsKICAgICAgICBpZihQcmV2LT5uZXh0X2F0dGFjaGVkID09IFN1cmYpIGJyZWFrOwogICAgICAgIFByZXYgPSBQcmV2LT5uZXh0X2F0dGFjaGVkOwogICAgfQoKICAgIC8qIFRoZXJlIG11c3QgYmUgYSBzdXJmYWNlLCBvdGhlcndpc2UgdGhlcmUncyBhIGJ1ZyAqLwogICAgYXNzZXJ0KFByZXYgIT0gTlVMTCk7CgogICAgLyogVW5jaGFpbiB0aGUgc3VyZmFjZSAqLwogICAgUHJldi0+bmV4dF9hdHRhY2hlZCA9IFN1cmYtPm5leHRfYXR0YWNoZWQ7CiAgICBTdXJmLT5uZXh0X2F0dGFjaGVkID0gTlVMTDsKICAgIFN1cmYtPmZpcnN0X2F0dGFjaGVkID0gU3VyZjsKCiAgICAvKiBDaGVjayBpZiB3ZSBhdHRhY2ggYSBiYWNrIGJ1ZmZlciB0byB0aGUgcHJpbWFyeSAqLwogICAgaWYoU3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19aQlVGRkVSICYmCiAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQogICAgewogICAgICAgIElXaW5lRDNERGV2aWNlX1NldERlcHRoU3RlbmNpbFN1cmZhY2UoVGhpcy0+ZGRyYXctPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoQXR0YWNoKTsKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkFkZE92ZXJsYXlEaXJ0eVJlY3QKICoKICogIlRoaXMgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQiCiAqCiAqIFBhcmFtczoKICogIFJlY3Q6ID8KICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVECiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkT3ZlcmxheURpcnR5UmVjdChJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUkVDVCBSZWN0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLFJlY3QpOwoKICAgIC8qIE1TRE4gc2F5cyBpdCdzIG5vdCBpbXBsZW1lbnRlZC4gSSBjb3VsZCBmb3J3YXJkIGl0IHRvIFdpbmVEM0QsIAogICAgICogdGhlbiB3ZSdkIGltcGxlbWVudCBpdCwgYnV0IEkgZG9uJ3QgdGhpbmsgdGhhdCdzIGEgZ29vZCBpZGVhCiAgICAgKiAoU3RlZmFuIET2c2luZ2VyKQogICAgICovCiNpZiAwCiAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX0FkZE92ZXJsYXlEaXJ0eVJlY3QoVGhpcy0+V2luZUQzRFN1cmZhY2UsIHBSZWN0KTsKI2VuZGlmCiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIHVuY2hlY2tlZCAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0REMKICoKICogUmV0dXJucyBhIEdESSBkZXZpY2UgY29udGV4dCBmb3IgdGhlIHN1cmZhY2UKICoKICogUGFyYW1zOgogKiAgaGRjOiBBZGRyZXNzIG9mIGEgSERDIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBkYyB0bwogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBoZGMgaXMgTlVMTAogKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRFN1cmZhY2U6OkdldERDCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0REMoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDICpoZGMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheVxuIiwgVGhpcywgaGRjKTsKCiAgICBpZighaGRjKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfR2V0REMoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkYyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpSZWxlYXNlREMKICoKICogUmVsZWFzZXMgdGhlIERDIHRoYXQgd2FzIGNvbnN0cnVjdGVkIHdpdGggR2V0REMKICoKICogUGFyYW1zOgogKiAgaGRjOiBIREMgdG8gcmVsZWFzZQogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEU3VyZmFjZTo6UmVsZWFzZURDCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfUmVsZWFzZURDKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIREMgaGRjKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXlcbiIsIFRoaXMsIGhkYyk7CgogICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9SZWxlYXNlREMoVGhpcy0+V2luZUQzRFN1cmZhY2UsIGhkYyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRDYXBzCiAqCiAqIFJldHVybnMgdGhlIHN1cmZhY2UncyBjYXBzCiAqCiAqIFBhcmFtczoKICogIENhcHM6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGNhcHMgdG8KICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ2FwcyBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0Q2FwcyhJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NBUFMyICpDYXBzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLENhcHMpOwoKICAgIGlmKCFDYXBzKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgICpDYXBzID0gVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHM7CiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpTZXRQcmlvcml0eQogKgogKiBTZXRzIGEgdGV4dHVyZSBwcmlvcml0eSBmb3IgbWFuYWdlZCB0ZXh0dXJlcy4KICoKICogUGFyYW1zOgogKiAgUHJpb3JpdHk6IFRoZSBuZXcgcHJpb3JpdHkKICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRFN1cmZhY2U6OlNldFByaW9yaXR5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0UHJpb3JpdHkoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsIERXT1JEIFByaW9yaXR5KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVkKTogUmVsYXkhXG4iLFRoaXMsUHJpb3JpdHkpOwoKICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfU2V0UHJpb3JpdHkoVGhpcy0+V2luZUQzRFN1cmZhY2UsIFByaW9yaXR5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldFByaW9yaXR5CiAqCiAqIFJldHVybnMgdGhlIHN1cmZhY2UncyBwcmlvcml0eQogKgogKiBQYXJhbXM6CiAqICBQcmlvcml0eTogQWRkcmVzcyBvZiBhIHZhcmlhYmxlIHRvIHdyaXRlIHRoZSBwcmlvcml0eSB0bwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgUHJpb3JpdHkgPT0gTlVMTAogKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEU3VyZmFjZTo6R2V0UHJpb3JpdHkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRQcmlvcml0eShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqUHJpb3JpdHkpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheVxuIixUaGlzLFByaW9yaXR5KTsKCiAgICBpZighUHJpb3JpdHkpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgKlByaW9yaXR5ID0gSVdpbmVEM0RTdXJmYWNlX0dldFByaW9yaXR5KFRoaXMtPldpbmVEM0RTdXJmYWNlKTsKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldFByaXZhdGVEYXRhCiAqCiAqIFN0b3JlcyBzb21lIGRhdGEgaW4gdGhlIHN1cmZhY2UgdGhhdCBpcyBpbnRlbmRlZCBmb3IgdGhlIGFwcGxpY2F0aW9uJ3MKICogdXNlLgogKgogKiBQYXJhbXM6CiAqICB0YWc6IEdVSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBkYXRhCiAqICBEYXRhOiBQb2ludGVyIHRvIHRoZSBwcml2YXRlIGRhdGEKICogIFNpemU6IFNpemUgb2YgdGhlIHByaXZhdGUgZGF0YQogKiAgRmxhZ3M6IFNvbWUgZmxhZ3MKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpTZXRQcml2YXRlRGF0YQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldFByaXZhdGVEYXRhKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkdVSUQgdGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCwlZCwleCk6IFJlbGF5XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHRhZyksIERhdGEsIFNpemUsIEZsYWdzKTsKCiAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX1NldFByaXZhdGVEYXRhKFRoaXMtPldpbmVEM0RTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldFByaXZhdGVEYXRhCiAqCiAqIFJldHVybnMgdGhlIHByaXZhdGUgZGF0YSBzZXQgd2l0aCBJRGlyZWN0RHJhd1N1cmZhY2U3OjpTZXRQcml2YXRlRGF0YQogKgogKiBQYXJhbXM6CiAqICB0YWc6IEdVSUQgb2YgdGhlIGRhdGEgdG8gcmV0dXJuCiAqICBEYXRhOiBBZGRyZXNzIHdoZXJlIHRvIHdyaXRlIHRoZSBkYXRhIHRvCiAqICBTaXplOiBTaXplIG9mIHRoZSBidWZmZXIgYXQgRGF0YQogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEYXRhIGlzIE5VTEwKICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRFN1cmZhY2U6OkdldFByaXZhdGVEYXRhCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UHJpdmF0ZURhdGEoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGR1VJRCB0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqU2l6ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHRhZyksIERhdGEsIFNpemUpOwoKICAgIGlmKCFEYXRhKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfR2V0UHJpdmF0ZURhdGEoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpGcmVlUHJpdmF0ZURhdGEKICoKICogRnJlZXMgcHJpdmF0ZSBkYXRhIHN0b3JlZCBpbiB0aGUgc3VyZmFjZQogKgogKiBQYXJhbXM6CiAqICB0YWc6IFRhZyBvZiB0aGUgZGF0YSB0byBmcmVlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEU3VyZmFjZTo6RnJlZVByaXZhdGVEYXRhCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfRnJlZVByaXZhdGVEYXRhKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZHVUlEIHRhZykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcyk6IFJlbGF5XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHRhZykpOwoKICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfRnJlZVByaXZhdGVEYXRhKFRoaXMtPldpbmVEM0RTdXJmYWNlLCB0YWcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6UGFnZUxvY2sKICoKICogUHJldmVudHMgYSBzeXNtZW0gc3VyZmFjZSBmcm9tIGJlaW5nIHBhZ2VkIG91dAogKgogKiBQYXJhbXM6CiAqICBGbGFnczogTm90IHVzZWQsIG11c3QgYmUgMCh1bmNoZWNrZWQpCiAqCiAqIFJldHVybnM6CiAqICBERF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhZ2VMb2NrKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBUUkFDRSgiKCVwKS0+KCV4KVxuIiwgaWZhY2UsIEZsYWdzKTsKCiAgICAvKiBUaGlzIGlzIFdpbmRvd3MgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCAtIHdlIGRvbid0IG5lZWQgdGhpcyAqLwogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6UGFnZVVubG9jawogKgogKiBBbGxvd3MgYSBzeXNtZW0gc3VyZmFjZSB0byBiZSBwYWdlZCBvdXQKICoKICogUGFyYW1zOgogKiAgRmxhZ3M6IE5vdCB1c2VkLCBtdXN0IGJlIDAodW5ja2VjaGVkKQogKgogKiBSZXR1cm5zOgogKiAgRERfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9QYWdlVW5sb2NrKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIFRSQUNFKCIoJXApLT4oJXgpXG4iLCBpZmFjZSwgRmxhZ3MpOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkJsdEJhdGNoCiAqCiAqIEFuIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24KICoKICogUGFyYW1zOgogKiAgPwogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfVU5TVVBQT1JURUQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9CbHRCYXRjaChJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwgRERCTFRCQVRDSCAqQmF0Y2gsIERXT1JEIENvdW50LCBEV09SRCBGbGFncykKewogICAgVFJBQ0UoIiglcCktPiglcCwlZCwlMDh4KVxuIixpZmFjZSxCYXRjaCxDb3VudCxGbGFncyk7CgogICAgLyogTVNETjogIm5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQiICovCiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpFbnVtQXR0YWNoZWRTdXJmYWNlcwogKgogKiBFbnVtZXJhdGVzIGFsbCBzdXJmYWNlcyBhdHRhY2hlZCB0byB0aGlzIHN1cmZhY2UKICoKICogUGFyYW1zOgogKiAgY29udGV4dDogUG9pbnRlciB0byBwYXNzIHVubW9kaWZpZWQgdG8gdGhlIGNhbGxiYWNrCiAqICBjYjogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBzdXJmYWNlCiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIGNiIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9FbnVtQXR0YWNoZWRTdXJmYWNlcyhJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgY2IpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmY7CiAgICBERFNVUkZBQ0VERVNDMiBkZXNjOwoKICAgIC8qIEF0dGFjaGVkIHN1cmZhY2VzIGFyZW4ndCBoYW5kbGVkIGluIFdpbmVEM0QgKi8KICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLFRoaXMsY29udGV4dCxjYik7CgogICAgaWYoIWNiKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGZvciAoc3VyZiA9IFRoaXMtPm5leHRfY29tcGxleDsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9jb21wbGV4KQogICAgewogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKHN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKICAgICAgICBkZXNjID0gc3VyZi0+c3VyZmFjZV9kZXNjOwogICAgICAgIC8qIGNoZWNrOiAhPSBEREVOVU1SRVRfT0sgb3IgPT0gRERFTlVNUkVUX0NBTkNFTD8gKi8KICAgICAgICBpZiAoY2IoSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNyksICZkZXNjLCBjb250ZXh0KSA9PSBEREVOVU1SRVRfQ0FOQ0VMKQogICAgICAgICAgICByZXR1cm4gRERfT0s7CiAgICB9CgogICAgZm9yIChzdXJmID0gVGhpcy0+bmV4dF9hdHRhY2hlZDsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9hdHRhY2hlZCkKICAgIHsKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShzdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7CiAgICAgICAgZGVzYyA9IHN1cmYtPnN1cmZhY2VfZGVzYzsKICAgICAgICAvKiBjaGVjazogIT0gRERFTlVNUkVUX09LIG9yID09IERERU5VTVJFVF9DQU5DRUw/ICovCiAgICAgICAgaWYgKGNiKCBJQ09NX0lOVEVSRkFDRShzdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwgJmRlc2MsIGNvbnRleHQpID09IERERU5VTVJFVF9DQU5DRUwpCiAgICAgICAgICAgIHJldHVybiBERF9PSzsKICAgIH0KCiAgICBUUkFDRSgiIGVuZCBvZiBlbnVtZXJhdGlvbi5cbiIpOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkVudW1PdmVybGF5Wk9yZGVycwogKgogKiAiRW51bWVyYXRlcyB0aGUgb3ZlcmxheSBzdXJmYWNlcyBvbiB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIgogKgogKiBQYXJhbXM6CiAqICBGbGFnczogRERFTlVNT1ZFUkxBWVpfQkFDS1RPRlJPTlQgIG9yIERERU5VTU9WRVJMQVlaX0ZST05UVE9CQUNLCiAqICBjb250ZXh0OiBjb250ZXh0IHRvIHBhc3MgYmFjayB0byB0aGUgY2FsbGJhY2sKICogIGNiOiBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudW1lcmF0ZWQgc3VyZmFjZQogKgogKiBSZXR1cm5zOgogKiAgRERfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9FbnVtT3ZlcmxheVpPcmRlcnMoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNiKQp7CiAgICAgRklYTUUoIiglcCktPigleCwlcCwlcCk6IFN0dWIhXG4iLCBpZmFjZSwgRmxhZ3MsIGNvbnRleHQsIGNiKTsKCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRCbHRTdGF0dXMKICoKICogUmV0dXJucyB0aGUgYmxpdHRpbmcgc3RhdHVzCiAqCiAqIFBhcmFtczoKICogIEZsYWdzOiBEREdCU19DQU5CTFQgb3IgRERHQlNfSVNCTFRET05FCiAqCiAqIFJldHVybnM6CiAqICBTZWUgSVdpbmVEM0RTdXJmYWNlOjpCbHQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRCbHRTdGF0dXMoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCV4KTogUmVsYXlcbiIsIFRoaXMsIEZsYWdzKTsKCiAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX0dldEJsdFN0YXR1cyhUaGlzLT5XaW5lRDNEU3VyZmFjZSwgRmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0Q29sb3JLZXkKICoKICogUmV0dXJucyB0aGUgY29sb3Iga2V5IGFzc2lnbmVkIHRvIHRoZSBzdXJmYWNlCiAqCiAqIFBhcmFtczoKICogIEZsYWdzOiBTb21lIGZsYWdzCiAqICBDS2V5OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBrZXkgdG8KICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ0tleSBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0Q29sb3JLZXkoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERDT0xPUktFWSAqQ0tleSkKewogICAgLyogVGhlcmUgaXMgYSBEREVSUl9OT0NPTE9SS0VZIGVycm9yLCBidXQgaG93IGRvIHdlIGtub3cgaWYgYSBjb2xvciBrZXkKICAgICAqIGlzbid0IHRoZXJlPyBUaGF0J3MgbGlrZSBzYXlpbmcgdGhhdCBhbiBpbnQgaXNuJ3QgdGhlcmUuIChXaGljaCBNUwogICAgICogaGFzIGRvbmUgaW4gb3RoZXIgZG9jcy4pICovCiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApXG4iLCBUaGlzLCBGbGFncywgQ0tleSk7CgogICAgaWYoIUNLZXkpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgc3dpdGNoIChGbGFncykKICAgIHsKICAgIGNhc2UgRERDS0VZX0RFU1RCTFQ6CiAgICAgICAgKkNLZXkgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLRGVzdEJsdDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEREQ0tFWV9ERVNUT1ZFUkxBWToKICAgICAgICAqQ0tleSA9IFRoaXMtPnN1cmZhY2VfZGVzYy51My5kZGNrQ0tEZXN0T3ZlcmxheTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEREQ0tFWV9TUkNCTFQ6CiAgICAgICAgKkNLZXkgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLU3JjQmx0OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgRERDS0VZX1NSQ09WRVJMQVk6CiAgICAgICAgKkNLZXkgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLU3JjT3ZlcmxheTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldEZsaXBTdGF0dXMKICoKICogUmV0dXJucyB0aGUgZmxpcHBpbmcgc3RhdHVzIG9mIHRoZSBzdXJmYWNlCiAqCiAqIFBhcmFtczoKICogIEZsYWdzOiBEREdGU19DQU5GTElQIG9mIERER0ZTX0lTRkxJUERPTkUKICoKICogUmV0dXJuczoKICogIFNlZSBJV2luZUQzRFN1cmZhY2U6OkdldEZsaXBTdGF0dXMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRGbGlwU3RhdHVzKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXgpOiBSZWxheVxuIiwgVGhpcywgRmxhZ3MpOwoKICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfR2V0RmxpcFN0YXR1cyhUaGlzLT5XaW5lRDNEU3VyZmFjZSwgRmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0T3ZlcmxheVBvc2l0aW9uCiAqCiAqIFJldHVybnMgdGhlIGRpc3BsYXkgY29vcmRpbmF0ZXMgb2YgYSB2aXNpYmxlIGFuZCBhY3RpdmUgb3ZlcmxheSBzdXJmYWNlCiAqCiAqIFBhcmFtczoKICogIFgKICogIFkKICoKICogUmV0dXJuczoKICogIERERVJSX05PVEFPVkVSTEFZU1VSRkFDRSwgYmVjYXVzZSBpdCdzIGEgc3R1YgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldE92ZXJsYXlQb3NpdGlvbihJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyAqWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyAqWSkgewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBYLCBZKTsKCiAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX0dldE92ZXJsYXlQb3NpdGlvbihUaGlzLT5XaW5lRDNEU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldFBpeGVsRm9ybWF0CiAqCiAqIFJldHVybnMgdGhlIHBpeGVsIGZvcm1hdCBvZiB0aGUgU3VyZmFjZQogKgogKiBQYXJhbXM6CiAqICBQaXhlbEZvcm1hdDogUG9pbnRlciB0byBhIEREUElYRUxGT1JNQVQgc3RydWN0dXJlIHRvIHdoaWNoIHRoZSBwaXhlbAogKiAgICAgICAgICAgICAgIGZvcm1hdCBzaG91bGQgYmUgd3JpdHRlbgogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBQaXhlbEZvcm1hdCBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UGl4ZWxGb3JtYXQoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERQSVhFTEZPUk1BVCAqUGl4ZWxGb3JtYXQpCnsKICAgIC8qIFdoYXQgaXMgRERFUlJfSU5WQUxJRFNVUkZBQ0VUWVBFIGZvciBoZXJlPyAqLwogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxQaXhlbEZvcm1hdCk7CgogICAgaWYoIVBpeGVsRm9ybWF0KQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIEREX1NUUlVDVF9DT1BZX0JZU0laRShQaXhlbEZvcm1hdCwmVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdCk7CgogICAgcmV0dXJuIEREX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldFN1cmZhY2VEZXNjCiAqCiAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgc3VyZmFjZQogKgogKiBQYXJhbXM6CiAqICBERFNEOiBBZGRyZXNzIG9mIGEgRERTVVJGQUNFREVTQzIgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgZmlsbGVkIHdpdGggdGhlCiAqICAgICAgICBzdXJmYWNlIGRlc2MKICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRERTRCBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0U3VyZmFjZURlc2MoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKkREU0QpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLEREU0QpOwoKICAgIGlmKCFERFNEKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGlmICgoRERTRC0+ZHdTaXplIDwgc2l6ZW9mKEREU1VSRkFDRURFU0MpKSB8fAogICAgICAgIChERFNELT5kd1NpemUgPiBzaXplb2YoRERTVVJGQUNFREVTQzIpKSkKICAgIHsKICAgICAgICBFUlIoIkltcG9zc2libGUvU3RyYW5nZSBzdHJ1Y3Qgc2l6ZSAlZC5cbiIsRERTRC0+ZHdTaXplKTsKICAgICAgICByZXR1cm4gRERFUlJfR0VORVJJQzsKICAgIH0KCiAgICBERF9TVFJVQ1RfQ09QWV9CWVNJWkUoRERTRCwmVGhpcy0+c3VyZmFjZV9kZXNjKTsKICAgIFRSQUNFKCJSZXR1cm5pbmcgc3VyZmFjZSBkZXNjOlxuIik7CiAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhERFNEKTsKCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpJbml0aWFsaXplCiAqCiAqIEluaXRpYWxpemVzIHRoZSBzdXJmYWNlLiBUaGlzIGlzIGEgbm8tb3AgaW4gV2luZQogKgogKiBQYXJhbXM6CiAqICBERDogUG9pbnRlciB0byBhbiBEaXJlY3REcmF3IGludGVyZmFjZQogKiAgRERTRDogU3VyZmFjZSBkZXNjcmlwdGlvbiBmb3IgaW5pdGlhbGl6YXRpb24KICoKICogUmV0dXJuczoKICogIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0luaXRpYWxpemUoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhdyAqREQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqRERTRCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgSURpcmVjdERyYXdJbXBsICpkZGltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3LCBERCk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIixUaGlzLGRkaW1wbCxERFNEKTsKCiAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6SXNMb3N0CiAqCiAqIENoZWNrcyBpZiB0aGUgc3VyZmFjZSBpcyBsb3N0CiAqCiAqIFJldHVybnM6CiAqICBERF9PSywgaWYgdGhlIHN1cmZhY2UgaXMgdXNlYWJsZQogKiAgRERFUlJfSVNMT1NUIGlmIHRoZSBzdXJmYWNlIGlzIGxvc3QKICogIFNlZSBJV2luZUQzRFN1cmZhY2U6OklzTG9zdCBmb3IgbW9yZSBkZXRhaWxzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfSXNMb3N0KElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKVxuIiwgVGhpcyk7CgogICAgLyogV2UgbG9zZSB0aGUgc3VyZmFjZSBpZiB0aGUgaW1wbGVtZW50YXRpb24gd2FzIGNoYW5nZWQgKi8KICAgIGlmKFRoaXMtPkltcGxUeXBlICE9IFRoaXMtPmRkcmF3LT5JbXBsVHlwZSkKICAgIHsKICAgICAgICAvKiBCdXQgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBXaGVuIHdlIGNoYW5nZSB0aGUgaW1wbGVtZW50YXRpb24sCiAgICAgICAgICogYWxsIHN1cmZhY2VzIGFyZSByZS1jcmVhdGVkIGF1dG9tYXRpY2FsbHksIGFuZCB0aGVpciBjb250ZW50CiAgICAgICAgICogaXMgY29waWVkCiAgICAgICAgICovCiAgICAgICAgRVJSKCIgKCVwKSBJbXBsZW1lbnRhdGlvbiB3YXMgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLCBUaGlzLCBUaGlzLT5JbXBsVHlwZSwgVGhpcy0+ZGRyYXctPkltcGxUeXBlKTsKICAgICAgICByZXR1cm4gRERFUlJfU1VSRkFDRUxPU1Q7CiAgICB9CgogICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9Jc0xvc3QoVGhpcy0+V2luZUQzRFN1cmZhY2UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6UmVzdG9yZQogKgogKiBSZXN0b3JlcyBhIGxvc3Qgc3VyZmFjZS4gVGhpcyBtYWtlcyB0aGUgc3VyZmFjZSB1c2FibGUgYWdhaW4sIGJ1dAogKiBkb2Vzbid0IHJlbG9hZCBpdHMgb2xkIGNvbnRlbnRzCiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBTZWUgSVdpbmVEM0RTdXJmYWNlOjpSZXN0b3JlIGZvciBtb3JlIGRldGFpbHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9SZXN0b3JlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKVxuIiwgVGhpcyk7CgogICAgaWYoVGhpcy0+SW1wbFR5cGUgIT0gVGhpcy0+ZGRyYXctPkltcGxUeXBlKQogICAgewogICAgICAgIC8qIENhbGwgdGhlIHJlY3JlYXRpb24gY2FsbGJhY2suIE1ha2Ugc3VyZSB0byBBZGRSZWYgZmlyc3QgKi8KICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmKGlmYWNlKTsKICAgICAgICBJRGlyZWN0RHJhd0ltcGxfUmVjcmVhdGVTdXJmYWNlc0NhbGxiYWNrKGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRoaXMtPnN1cmZhY2VfZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogTm90IG5lZWRlZCAqLyk7CiAgICB9CiAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX1Jlc3RvcmUoVGhpcy0+V2luZUQzRFN1cmZhY2UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6U2V0T3ZlcmxheVBvc2l0aW9uCiAqCiAqIENoYW5nZXMgdGhlIGRpc3BsYXkgY29vcmRpbmF0ZXMgb2YgYW4gb3ZlcmxheSBzdXJmYWNlCiAqCiAqIFBhcmFtczoKICogIFg6CiAqICBZOgogKgogKiBSZXR1cm5zOgogKiAgIERERVJSX05PVEFPVkVSTEFZU1VSRkFDRSwgYmVjYXVzZSB3ZSBkb24ndCBzdXBwb3J0IG92ZXJsYXlzIHJpZ2h0IG5vdwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldE92ZXJsYXlQb3NpdGlvbihJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HIFkpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJWQsJWQpOiBSZWxheVxuIiwgVGhpcywgWCwgWSk7CgogICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9TZXRPdmVybGF5UG9zaXRpb24oVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpVcGRhdGVPdmVybGF5CiAqCiAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG92ZXJsYXkgc3VyZmFjZS4KICoKICogUGFyYW1zOgogKiAgU3JjUmVjdDogVGhlIHNlY3Rpb24gb2YgdGhlIHNvdXJjZSBiZWluZyB1c2VkIGZvciB0aGUgb3ZlcmxheQogKiAgRHN0U3VyZmFjZTogQWRkcmVzcyBvZiB0aGUgc3VyZmFjZSB0aGF0IGlzIG92ZXJsYWlkCiAqICBEc3RSZWN0OiBQbGFjZSBvZiB0aGUgb3ZlcmxheQogKiAgRmxhZ3M6IHNvbWUgRERPVkVSXyogZmxhZ3MKICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVELCBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgb3ZlcmxheXMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9VcGRhdGVPdmVybGF5KElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUIFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpEc3RTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUIERzdFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRERPVkVSTEFZRlggRlgpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKkRzdCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIERzdFN1cmZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcCwleCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBTcmNSZWN0LCBEc3QsIERzdFJlY3QsIEZsYWdzLCBGWCk7CgogICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9VcGRhdGVPdmVybGF5KFRoaXMtPldpbmVEM0RTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0ID8gRHN0LT5XaW5lRDNEU3VyZmFjZSA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0UmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORURET1ZFUkxBWUZYICopIEZYKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlVwZGF0ZU92ZXJsYXlEaXNwbGF5CiAqCiAqIFRoZSBEWDcgc2RrIHNheXMgdGhhdCBpdCdzIG5vdCBpbXBsZW1lbnRlZAogKgogKiBQYXJhbXM6CiAqICBGbGFnczogPwogKgogKiBSZXR1cm5zOiBEREVSUl9VTlNVUFBPUlRFRCwgYmVjYXVzZSB3ZSBkb24ndCBzdXBwb3J0IG92ZXJsYXlzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfVXBkYXRlT3ZlcmxheURpc3BsYXkoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXgpXG4iLCBUaGlzLCBGbGFncyk7CiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpVcGRhdGVPdmVybGF5Wk9yZGVyCiAqCiAqIFNldHMgYW4gb3ZlcmxheSdzIFogb3JkZXIKICoKICogUGFyYW1zOgogKiAgRmxhZ3M6IERET1ZFUlpfKiBmbGFncwogKiAgRERTUmVmOiBEZWZpbmVzIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBpbiB0aGUgb3ZlcmxheSBjaGFpbgogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfTk9UT1ZFUkxBWVNVUkZBQ0UsIGJlY2F1c2Ugd2UgZG9uJ3Qgc3VwcG9ydCBvdmVybGF5cwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1VwZGF0ZU92ZXJsYXlaT3JkZXIoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKkREU1JlZikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqUmVmID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgRERTUmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCV4LCVwKTogUmVsYXlcbiIsIFRoaXMsIEZsYWdzLCBSZWYpOwogICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9VcGRhdGVPdmVybGF5Wk9yZGVyKFRoaXMtPldpbmVEM0RTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZiA/IFJlZi0+V2luZUQzRFN1cmZhY2UgOiBOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldERESW50ZXJmYWNlCiAqCiAqIFJldHVybnMgdGhlIElEaXJlY3REcmF3NyBpbnRlcmZhY2UgcG9pbnRlciBvZiB0aGUgRGlyZWN0RHJhdyBvYmplY3QgdGhpcwogKiBzdXJmYWNlIGJlbG9uZ3MgdG8KICoKICogUGFyYW1zOgogKiAgREQ6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGludGVyZmFjZSBwb2ludGVyIHRvCiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEREIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXREREludGVyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqREQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLEREKTsKCiAgICBpZighREQpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgc3dpdGNoKFRoaXMtPnZlcnNpb24pCiAgICB7CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAqKChJRGlyZWN0RHJhdzcgKiopIEREKSA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3LCBJRGlyZWN0RHJhdzcpOwogICAgICAgICAgICBJRGlyZWN0RHJhdzdfQWRkUmVmKCooSURpcmVjdERyYXc3ICoqKSBERCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICooKElEaXJlY3REcmF3NCAqKikgREQpID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3REcmF3NCk7CiAgICAgICAgICAgIElEaXJlY3REcmF3NF9BZGRSZWYoKihJRGlyZWN0RHJhdzQgKiopIEREKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgKigoSURpcmVjdERyYXcyICoqKSBERCkgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5kZHJhdywgSURpcmVjdERyYXcyKTsKICAgICAgICAgICAgSURpcmVjdERyYXdfQWRkUmVmKCAqKElEaXJlY3REcmF3MiAqKikgREQpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAqKChJRGlyZWN0RHJhdyAqKikgREQpID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3REcmF3KTsKICAgICAgICAgICAgSURpcmVjdERyYXdfQWRkUmVmKCAqKElEaXJlY3REcmF3ICoqKSBERCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgIH0KCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qIFRoaXMgc2VlbXMgYWxzbyB3aW5kb3dzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIC0gSSBkb24ndCB0aGluayBXaW5lRDNEIG5lZWRzIHRoaXMgKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQ2hhbmdlVW5pcXVlbmVzc1ZhbHVlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICB2b2xhdGlsZSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiB2VGhpcyA9IFRoaXM7CgogICAgVFJBQ0UoIiglcClcbiIsVGhpcyk7CiAgICAvKiBBIHVuaXF1ZW5lc3MgdmFsdWUgb2YgMCBpcyBhcHBhcmVudGx5IHNwZWNpYWwuCiAgICAqIFRoaXMgbmVlZHMgdG8gYmUgY2hlY2tlZC4gKi8KICAgIHdoaWxlICgxKSB7CiAgICAgICAgRFdPUkQgb2xkX3VuaXF1ZW5lc3NfdmFsdWUgPSB2VGhpcy0+dW5pcXVlbmVzc192YWx1ZTsKICAgICAgICBEV09SRCBuZXdfdW5pcXVlbmVzc192YWx1ZSA9IG9sZF91bmlxdWVuZXNzX3ZhbHVlKzE7CgogICAgICAgIGlmIChvbGRfdW5pcXVlbmVzc192YWx1ZSA9PSAwKSBicmVhazsKICAgICAgICBpZiAobmV3X3VuaXF1ZW5lc3NfdmFsdWUgPT0gMCkgbmV3X3VuaXF1ZW5lc3NfdmFsdWUgPSAxOwoKICAgICAgICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKExPTkcqKSZ2VGhpcy0+dW5pcXVlbmVzc192YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfdW5pcXVlbmVzc192YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdW5pcXVlbmVzc192YWx1ZSkKICAgICAgICAgICAgPT0gb2xkX3VuaXF1ZW5lc3NfdmFsdWUpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBERF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0VW5pcXVlbmVzc1ZhbHVlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLCBMUERXT1JEIHBWYWx1ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwoKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscFZhbHVlKTsKICAgICpwVmFsdWUgPSBUaGlzLT51bmlxdWVuZXNzX3ZhbHVlOwogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6U2V0TE9ECiAqCiAqIFNldHMgdGhlIGxldmVsIG9mIGRldGFpbCBvZiBhIHRleHR1cmUKICoKICogUGFyYW1zOgogKiAgTWF4TE9EOiBMT0QgdG8gc2V0CiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElET0JKRUNUIGlmIHRoZSBzdXJmYWNlIGlzIGludmFsaWQgZm9yIHRoaXMgbWV0aG9kCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0TE9EKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBNYXhMT0QpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJWQpXG4iLCBUaGlzLCBNYXhMT0QpOwoKICAgIGlmICghKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIgJiBERFNDQVBTMl9URVhUVVJFTUFOQUdFKSkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRE9CSkVDVDsKCiAgICBpZighVGhpcy0+d2luZUQzRFRleHR1cmUpCiAgICB7CiAgICAgICAgRVJSKCIoJXApIFRoZSBEaXJlY3REcmF3IHRleHR1cmUgaGFzIG5vIFdpbmVEM0RUZXh0dXJlIVxuIiwgVGhpcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURPQkpFQ1Q7CiAgICB9CgogICAgcmV0dXJuIElXaW5lRDNEVGV4dHVyZV9TZXRMT0QoVGhpcy0+d2luZUQzRFRleHR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhMT0QpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0TE9ECiAqCiAqIFJldHVybnMgdGhlIGxldmVsIG9mIGRldGFpbCBvZiBhIERpcmVjdDNEIHRleHR1cmUKICoKICogUGFyYW1zOgogKiAgTWF4TE9EOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBMT0QgdG8KICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgTWF4TE9EIGlzIE5VTEwKICogIERERVJSX0lOVkFMSURPQkpFQ1QgaWYgdGhlIHN1cmZhY2UgaXMgaW52YWxpZCBmb3IgdGhpcyBtZXRob2QKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRMT0QoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpNYXhMT0QpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBNYXhMT0QpOwoKICAgIGlmKCFNYXhMT0QpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgaWYgKCEoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiAmIEREU0NBUFMyX1RFWFRVUkVNQU5BR0UpKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElET0JKRUNUOwoKICAgICpNYXhMT0QgPSBJV2luZUQzRFRleHR1cmVfR2V0TE9EKFRoaXMtPndpbmVEM0RUZXh0dXJlKTsKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkJsdEZhc3QKICoKICogUGVyZm9ybXMgYSBmYXN0IEJsaXQuCiAqCiAqIFBhcmFtczoKICogIGRzdHg6IFRoZSB4IGNvb3JkaW5hdGUgdG8gYmxpdCB0byBvbiB0aGUgZGVzdGluYXRpb24KICogIGRzdHk6IFRoZSB5IGNvb3JkaW5hdGUgdG8gYmxpdCB0byBvbiB0aGUgZGVzdGluYXRpb24KICogIFNvdXJjZTogVGhlIHNvdXJjZSBzdXJmYWNlCiAqICByc3JjOiBUaGUgc291cmNlIHJlY3RhbmdsZQogKiAgdHJhbnM6IFR5cGUgb2YgdHJhbnNmZXIuIFNvbWUgRERCTFRGQVNUXyogZmxhZ3MKICoKICogUmV0dXJuczoKICogIEREX09LIG9uIHN1Y2Nlc3MKICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRFN1cmZhY2U6OkJsdEZhc3QKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdTdXJmYWNlSW1wbF9CbHRGYXN0KElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRzdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpyc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgdHJhbnMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnNyYyA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIFNvdXJjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVkLCVkLCVwLCVwLCVkKTogUmVsYXlcbiIsIFRoaXMsIGRzdHgsIGRzdHksIFNvdXJjZSwgcnNyYywgdHJhbnMpOwoKICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfQmx0RmFzdChUaGlzLT5XaW5lRDNEU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3R4LCBkc3R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA/IHNyYy0+V2luZUQzRFN1cmZhY2UgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0Q2xpcHBlcgogKgogKiBSZXR1cm5zIHRoZSBJRGlyZWN0RHJhd0NsaXBwZXIgaW50ZXJmYWNlIG9mIHRoZSBjbGlwcGVyIGFzc2lnbmVkIHRvIHRoaXMKICogc3VyZmFjZQogKgogKiBQYXJhbXM6CiAqICBDbGlwcGVyOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBDbGlwcGVyIGlzIE5VTEwKICogIERERVJSX05PQ0xJUFBFUkFUVEFDSEVEIGlmIHRoZXJlJ3Mgbm8gY2xpcHBlciBhdHRhY2hlZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldENsaXBwZXIoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd0NsaXBwZXIgKipDbGlwcGVyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgQ2xpcHBlcik7CgogICAgaWYoIUNsaXBwZXIpCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgaWYoVGhpcy0+Y2xpcHBlciA9PSBOVUxMKQogICAgICAgIHJldHVybiBEREVSUl9OT0NMSVBQRVJBVFRBQ0hFRDsKCiAgICAqQ2xpcHBlciA9IElDT01fSU5URVJGQUNFKFRoaXMtPmNsaXBwZXIsIElEaXJlY3REcmF3Q2xpcHBlcik7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJfQWRkUmVmKCpDbGlwcGVyKTsKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldENsaXBwZXIKICoKICogU2V0cyBhIGNsaXBwZXIgZm9yIHRoZSBzdXJmYWNlCiAqCiAqIFBhcmFtczoKICogIENsaXBwZXI6IElEaXJlY3REcmF3Q2xpcHBlciBpbnRlcmZhY2Ugb2YgdGhlIGNsaXBwZXIgdG8gc2V0CiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0Q2xpcHBlcihJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3Q2xpcHBlciAqQ2xpcHBlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqb2xkQ2xpcHBlciA9IFRoaXMtPmNsaXBwZXI7CgogICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxDbGlwcGVyKTsKICAgIGlmIChJQ09NX09CSkVDVChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsLCBJRGlyZWN0RHJhd0NsaXBwZXIsIENsaXBwZXIpID09IFRoaXMtPmNsaXBwZXIpCiAgICAgICAgcmV0dXJuIEREX09LOwoKICAgIFRoaXMtPmNsaXBwZXIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsLCBJRGlyZWN0RHJhd0NsaXBwZXIsIENsaXBwZXIpOwoKICAgIGlmIChDbGlwcGVyICE9IE5VTEwpCiAgICAgICAgSURpcmVjdERyYXdDbGlwcGVyX0FkZFJlZihDbGlwcGVyKTsKICAgIGlmKG9sZENsaXBwZXIpCiAgICAgICAgSURpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0Uob2xkQ2xpcHBlciwgSURpcmVjdERyYXdDbGlwcGVyKSk7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6U2V0U3VyZmFjZURlc2MKICoKICogU2V0cyB0aGUgc3VyZmFjZSBkZXNjcmlwdGlvbi4gSXQgY2FuIG92ZXJyaWRlIHRoZSBwaXhlbCBmb3JtYXQsIHRoZSBzdXJmYWNlCiAqIG1lbW9yeSwgLi4uCiAqIEl0J3Mgbm90IHJlYWxseSB0ZXN0ZWQuCiAqCiAqIFBhcmFtczoKICogRERTRDogUG9pbnRlciB0byB0aGUgbmV3IHN1cmZhY2UgZGVzY3JpcHRpb24gdG8gc2V0CiAqIEZsYWdzOiBTb21lIGZsYWdzCiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEREU0QgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldFN1cmZhY2VEZXNjKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU1VSRkFDRURFU0MyICpERFNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CiAgICBXSU5FRDNERk9STUFUIG5ld0Zvcm1hdCA9IFdJTkVEM0RGTVRfVU5LTk9XTjsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCV4KVxuIiwgVGhpcywgRERTRCwgRmxhZ3MpOwoKICAgIGlmKCFERFNEKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIGlmIChERFNELT5kd0ZsYWdzICYgRERTRF9MUFNVUkZBQ0UgJiYgRERTRC0+bHBTdXJmYWNlKQogICAgewogICAgICAgIEVSUigiU2V0dGluZyB0aGUgc3VyZmFjZSBtZW1vcnkgaXNuJ3Qgc3VwcG9ydGVkIHlldFxuIik7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgfQogICAgaWYgKEREU0QtPmR3RmxhZ3MgJiBERFNEX1BJWEVMRk9STUFUKQogICAgewogICAgICAgIG5ld0Zvcm1hdCA9IFBpeGVsRm9ybWF0X0REMldpbmVEM0QoJkREU0QtPnU0LmRkcGZQaXhlbEZvcm1hdCk7CgogICAgICAgIGlmKG5ld0Zvcm1hdCA9PSBXSU5FRDNERk1UX1VOS05PV04pCiAgICAgICAgewogICAgICAgICAgICBFUlIoIlJlcXVlc3RlZCB0byBzZXQgYW4gdW5rbm93biBwaXhlbGZvcm1hdFxuIik7CiAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgICAgIH0KICAgICAgICBpZihuZXdGb3JtYXQgIT0gUGl4ZWxGb3JtYXRfREQyV2luZUQzRCgmVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdCkgKQogICAgICAgIHsKICAgICAgICAgICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfU2V0Rm9ybWF0KFRoaXMtPldpbmVEM0RTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybWF0KTsKICAgICAgICAgICAgaWYoaHIgIT0gRERfT0spIHJldHVybiBocjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoRERTRC0+ZHdGbGFncyAmIEREU0RfQ0tERVNUT1ZFUkxBWSkKICAgIHsKICAgICAgICBJV2luZUQzRFN1cmZhY2VfU2V0Q29sb3JLZXkoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREQ0tFWV9ERVNUT1ZFUkxBWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkREU0QtPnUzLmRkY2tDS0Rlc3RPdmVybGF5KTsKICAgIH0KICAgIGlmIChERFNELT5kd0ZsYWdzICYgRERTRF9DS0RFU1RCTFQpCiAgICB7CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1NldENvbG9yS2V5KFRoaXMtPldpbmVEM0RTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERENLRVlfREVTVEJMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkREU0QtPmRkY2tDS0Rlc3RCbHQpOwogICAgfQogICAgaWYgKEREU0QtPmR3RmxhZ3MgJiBERFNEX0NLU1JDT1ZFUkxBWSkKICAgIHsKICAgICAgICBJV2luZUQzRFN1cmZhY2VfU2V0Q29sb3JLZXkoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREQ0tFWV9TUkNPVkVSTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRERTRC0+ZGRja0NLU3JjT3ZlcmxheSk7CiAgICB9CiAgICBpZiAoRERTRC0+ZHdGbGFncyAmIEREU0RfQ0tTUkNCTFQpCiAgICB7CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1NldENvbG9yS2V5KFRoaXMtPldpbmVEM0RTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERENLRVlfU1JDQkxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRERTRC0+ZGRja0NLU3JjQmx0KTsKICAgIH0KICAgIGlmIChERFNELT5kd0ZsYWdzICYgRERTRF9MUFNVUkZBQ0UpCiAgICB7CiAgICAgICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfU2V0TWVtKFRoaXMtPldpbmVEM0RTdXJmYWNlLCBERFNELT5scFN1cmZhY2UpOwogICAgICAgIGlmKGhyICE9IFdJTkVEM0RfT0spCiAgICAgICAgewogICAgICAgICAgICAvKiBObyBuZWVkIGZvciBhIHRyYWNlIGhlcmUsIHdpbmVkM2QgZG9lcyB0aGF0IGZvciB1cyAqLwogICAgICAgICAgICByZXR1cm4gaHI7CiAgICAgICAgfQogICAgfQoKICAgIFRoaXMtPnN1cmZhY2VfZGVzYyA9ICpERFNEOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldFBhbGV0dGUKICoKICogUmV0dXJucyB0aGUgSURpcmVjdERyYXdQYWxldHRlIGludGVyZmFjZSBvZiB0aGUgcGFsZXR0ZSBjdXJyZW50bHkgYXNzaWduZWQKICogdG8gdGhlIHN1cmZhY2UKICoKICogUGFyYW1zOgogKiAgUGFsOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciB0bwogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBQYWwgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldFBhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGUgKipQYWwpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIElXaW5lRDNEUGFsZXR0ZSAqd1BhbDsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXlcbiIsIFRoaXMsIFBhbCk7CgogICAgaWYoIVBhbCkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICBociA9IElXaW5lRDNEU3VyZmFjZV9HZXRQYWxldHRlKFRoaXMtPldpbmVEM0RTdXJmYWNlLCAmd1BhbCk7CiAgICBpZihociAhPSBERF9PSykgcmV0dXJuIGhyOwoKICAgIGlmKHdQYWwpCiAgICB7CiAgICAgICAgaHIgPSBJV2luZUQzRFBhbGV0dGVfR2V0UGFyZW50KHdQYWwsIChJVW5rbm93biAqKikgUGFsKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqUGFsID0gTlVMTDsKICAgICAgICBociA9IERERVJSX05PUEFMRVRURUFUVEFDSEVEOwogICAgfQoKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldENvbG9yS2V5CiAqCiAqIFNldHMgdGhlIGNvbG9yIGtleWluZyBvcHRpb25zIGZvciB0aGUgc3VyZmFjZS4gT2JzZXJ2YXRpb25zIHNob3dlZCB0aGF0CiAqIGluIGNhc2Ugb2YgY29tcGxleCBzdXJmYWNlcyB0aGUgY29sb3Iga2V5IGhhcyB0byBiZSBhc3NpZ25lZCB0byBhbGwKICogc3VibGV2ZWxzLgogKgogKiBQYXJhbXM6CiAqICBGbGFnczogRERDS0VZXyoKICogIENLZXk6IFRoZSBuZXcgY29sb3Iga2V5CiAqCiAqIFJldHVybnM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBTZWUgSVdpbmVEM0RTdXJmYWNlOjpTZXRDb2xvcktleSBmb3IgZGV0YWlscwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldENvbG9yS2V5KElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREQ09MT1JLRVkgKkNLZXkpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmY7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPigleCwlcClcbiIsIFRoaXMsIEZsYWdzLCBDS2V5KTsKCiAgICBpZiAoQ0tleSkKICAgIHsKICAgICAgICBzd2l0Y2ggKEZsYWdzICYgfkREQ0tFWV9DT0xPUlNQQUNFKQogICAgICAgIHsKICAgICAgICBjYXNlIEREQ0tFWV9ERVNUQkxUOgogICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLRGVzdEJsdCA9ICpDS2V5OwogICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX0NLREVTVEJMVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRERDS0VZX0RFU1RPVkVSTEFZOgogICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MudTMuZGRja0NLRGVzdE92ZXJsYXkgPSAqQ0tleTsKICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9DS0RFU1RPVkVSTEFZOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBERENLRVlfU1JDT1ZFUkxBWToKICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmRkY2tDS1NyY092ZXJsYXkgPSAqQ0tleTsKICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9DS1NSQ09WRVJMQVk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEREQ0tFWV9TUkNCTFQ6CiAgICAgICAgICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNCbHQgPSAqQ0tleTsKICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9DS1NSQ0JMVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzd2l0Y2ggKEZsYWdzICYgfkREQ0tFWV9DT0xPUlNQQUNFKQogICAgICAgIHsKICAgICAgICBjYXNlIEREQ0tFWV9ERVNUQkxUOgogICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmPSB+RERTRF9DS0RFU1RCTFQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEREQ0tFWV9ERVNUT1ZFUkxBWToKICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJj0gfkREU0RfQ0tERVNUT1ZFUkxBWTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRERDS0VZX1NSQ09WRVJMQVk6CiAgICAgICAgICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzICY9IH5ERFNEX0NLU1JDT1ZFUkxBWTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRERDS0VZX1NSQ0JMVDoKICAgICAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJj0gfkREU0RfQ0tTUkNCTFQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICB9CiAgICB9CiAgICBmb3Ioc3VyZiA9IFRoaXMtPmZpcnN0X2NvbXBsZXg7IHN1cmY7IHN1cmYgPSBzdXJmLT5uZXh0X2NvbXBsZXgpCiAgICB7CiAgICAgICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfU2V0Q29sb3JLZXkoc3VyZi0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0tleSk7CiAgICAgICAgaWYoRkFJTEVEKGhyKSkKICAgICAgICB7CiAgICAgICAgICAgIFdBUk4oIklXaW5lRDNEU3VyZmFjZTo6U2V0Q29sb3JLZXkgZm9yIHN1cmZhY2UgJXAgZmFpbGVkIHdpdGggaHI9JTA4eFxuIiwKICAgICAgICAgICAgICAgICBzdXJmLT5XaW5lRDNEU3VyZmFjZSwgaHIpOwogICAgICAgICAgICByZXR1cm4gaHI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlNzo6U2V0UGFsZXR0ZQogKgogKiBBc3NpZ25zIGEgRGlyZWN0RHJhd1BhbGV0dGUgb2JqZWN0IHRvIHRoZSBzdXJmYWNlCiAqCiAqIFBhcmFtczoKICogIFBhbDogSW50ZXJmYWNlIHRvIHRoZSBwYWxldHRlIHRvIHNldAogKgogKiBSZXR1cm5zOgogKiAgRERfT0sgb24gc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldFBhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGUgKlBhbCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOwogICAgSURpcmVjdERyYXdQYWxldHRlICpvbGRQYWw7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmOwogICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqUGFsSW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgUGFsKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgUGFsKTsKCiAgICAvKiBGaW5kIHRoZSBvbGQgcGFsZXR0ZSAqLwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGFsZXR0ZShpZmFjZSwgJm9sZFBhbCk7CiAgICBpZihociAhPSBERF9PSyAmJiBociAhPSBEREVSUl9OT1BBTEVUVEVBVFRBQ0hFRCkgcmV0dXJuIGhyOwogICAgaWYob2xkUGFsKSBJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZShvbGRQYWwpOyAgLyogRm9yIHRoZSBHZXRQYWxldHRlICovCgogICAgLyogU2V0IHRoZSBuZXcgUGFsZXR0ZSAqLwogICAgSVdpbmVEM0RTdXJmYWNlX1NldFBhbGV0dGUoVGhpcy0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWxJbXBsID8gUGFsSW1wbC0+d2luZUQzRFBhbGV0dGUgOiBOVUxMKTsKICAgIC8qIEFkZFJlZiB0aGUgUGFsZXR0ZSAqLwogICAgaWYoUGFsKSBJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKFBhbCk7CgogICAgLyogUmVsZWFzZSB0aGUgb2xkIHBhbGV0dGUgKi8KICAgIGlmKG9sZFBhbCkgSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2Uob2xkUGFsKTsKCiAgICAvKiBJZiB0aGlzIGlzIGEgZnJvbnQgYnVmZmVyLCBhbHNvIHVwZGF0ZSB0aGUgYmFjayBidWZmZXJzICovCiAgICBpZihUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0ZST05UQlVGRkVSKQogICAgewogICAgICAgIGZvcihzdXJmID0gVGhpcy0+bmV4dF9jb21wbGV4OyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5uZXh0X2NvbXBsZXgpCiAgICAgICAgewogICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldFBhbGV0dGUoSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWwpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBUaGUgVlRhYmxlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmNvbnN0IElEaXJlY3REcmF3U3VyZmFjZTdWdGJsIElEaXJlY3REcmF3U3VyZmFjZTdfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gKioqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkUmVmLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2UgKioqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9BZGRBdHRhY2hlZFN1cmZhY2UsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0FkZE92ZXJsYXlEaXJ0eVJlY3QsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0JsdCwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQmx0QmF0Y2gsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0JsdEZhc3QsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZSwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfRW51bUF0dGFjaGVkU3VyZmFjZXMsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0VudW1PdmVybGF5Wk9yZGVycywKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfRmxpcCwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0QXR0YWNoZWRTdXJmYWNlLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRCbHRTdGF0dXMsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldENhcHMsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldENsaXBwZXIsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldENvbG9yS2V5LAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXREQywKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0RmxpcFN0YXR1cywKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0T3ZlcmxheVBvc2l0aW9uLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRQYWxldHRlLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRQaXhlbEZvcm1hdCwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0U3VyZmFjZURlc2MsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0luaXRpYWxpemUsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0lzTG9zdCwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfTG9jaywKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfUmVsZWFzZURDLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9SZXN0b3JlLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRDbGlwcGVyLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRDb2xvcktleSwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0T3ZlcmxheVBvc2l0aW9uLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRQYWxldHRlLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9VbmxvY2ssCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1VwZGF0ZU92ZXJsYXksCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1VwZGF0ZU92ZXJsYXlEaXNwbGF5LAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9VcGRhdGVPdmVybGF5Wk9yZGVyLAogICAgLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2UyICoqKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0RERJbnRlcmZhY2UsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhZ2VMb2NrLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9QYWdlVW5sb2NrLAogICAgLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2UzICoqKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0U3VyZmFjZURlc2MsCiAgICAvKioqIElEaXJlY3REcmF3U3VyZmFjZTQgKioqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRQcml2YXRlRGF0YSwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UHJpdmF0ZURhdGEsCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0ZyZWVQcml2YXRlRGF0YSwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0VW5pcXVlbmVzc1ZhbHVlLAogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9DaGFuZ2VVbmlxdWVuZXNzVmFsdWUsCiAgICAvKioqIElEaXJlY3REcmF3U3VyZmFjZTcgKioqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRQcmlvcml0eSwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UHJpb3JpdHksCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldExPRCwKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0TE9ECn07Cg==