LyogRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDAgKGMpIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgMjAwMCAoYykgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KICogQ29weXJpZ2h0IDIwMDYgKGMpIFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIG1ldGhvZHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6UXVlcnlJbnRlcmZhY2UKICoKICogQ2FuIHF1ZXJ5IHRoZSBJVW5rbm93biBhbmQgSURpcmVjdERyYXdDbGlwcGVyIGludGVyZmFjZSBmcm9tIGEKICogQ2xpcHBlciBvYmplY3QuIFRoZSBJVW5rbm93biBJbnRlcmZhY2UgaXMgZXF1YWwgdG8gdGhlIElEaXJlY3REcmF3Q2xpcHBlcgogKiBpbnRlcmZhY2UuIENhbid0IGNyZWF0ZSBvdGhlciBpbnRlcmZhY2VzLgogKgogKiBBcmd1bWVudHM6CiAqICByaWlkOiBJbnRlcmZhY2UgaWQgYXNrZWQgZm9yCiAqICBwcHZPYmo6IFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZQogKgogKiBSZXR1cm4gdmFsdWVzOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRV9OT0lOVEVSRkFDRSBpZiB0aGUgcmVxdWVzdGVkIGludGVyZmFjZSB3YXNuJ3QgZm91bmQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfUXVlcnlJbnRlcmZhY2UoCiAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmoKKSB7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKCiAgICBpZiAoSXNFcXVhbEdVSUQoJklJRF9JVW5rbm93biwgcmlpZCkKCXx8IElzRXF1YWxHVUlEKCZJSURfSURpcmVjdERyYXdDbGlwcGVyLCByaWlkKSkKICAgIHsKCSpwcHZPYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd0NsaXBwZXIpOwoJSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGVsc2UKICAgIHsKCXJldHVybiBFX05PSU5URVJGQUNFOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdDbGlwcGVyOjpBZGRSZWYKICoKICogSW5jcmVhc2VzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGludGVyZmFjZSwgcmV0dXJucyB0aGUgbmV3IGNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0FkZFJlZiggTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSApCnsKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCAqKWlmYWNlOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiAtIDEpOwoKICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd0NsaXBwZXI6OlJlbGVhc2UKICoKICogRGVjcmVhc2VzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGludGVyZmFjZSwgcmV0dXJucyB0aGUgbmV3IGNvdW50CiAqIElmIHRoZSByZWZjb3VudCBpcyBkZWNyZWFzZWQgdG8gMCwgdGhlIGludGVyZmFjZSBpcyBkZXN0cm95ZWQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1JlbGVhc2UoSURpcmVjdERyYXdDbGlwcGVyICppZmFjZSkgewogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmICsgMSk7CgogICAgaWYgKHJlZiA9PSAwKQogICAgewoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CglyZXR1cm4gMDsKICAgIH0KICAgIGVsc2UgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6U2V0SHduZAogKgogKiBBc3NpZ25zIGEgaFduZCB0byB0aGUgY2xpcHBlciBpbnRlcmZhY2UuCiAqCiAqIEFyZ3VtZW50czoKICogIEZsYWdzOiBVbnN1cHBvcnRlZCBzbyBmYXIKICogIGhXbmQ6IFRoZSBoV25kIHRvIHNldAogKgogKiBSZXR1cm4gdmFsdWVzOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBGbGFncyB3YXMgIT0gMAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9TZXRId25kKAogICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgRFdPUkQgZHdGbGFncywgSFdORCBoV25kCikgewogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CgogICAgVFJBQ0UoIiglcCktPigweCUwOGx4LDB4JTA4bHgpXG4iLCBUaGlzLCBkd0ZsYWdzLCAoRFdPUkQpaFduZCk7CiAgICBpZiggZHdGbGFncyApIHsKCUZJWE1FKCJkd0ZsYWdzID0gMHglMDhseCwgbm90IHN1cHBvcnRlZC5cbiIsZHdGbGFncyk7CglyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICBUaGlzLT5oV25kID0gaFduZDsKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6R2V0Q2xpcExpc3QKICoKICogUmV0cmlldmUgYSBjb3B5IG9mIHRoZSBjbGlwIGxpc3QKICoKICogQXJndW1lbnRzOgogKiAgUmVjdDogUmVjdGFuZ2xlIHRvIGJlIHVzZWQgdG8gY2xpcCB0aGUgY2xpcCBsaXN0IG9yIE5VTEwgZm9yIHRoZQogKiAgICAgICAgZW50aXJlIGNsaXAgbGlzdAogKiAgQ2xpcExpc3Q6IHN0cnVjdHVyZSBmb3IgdGhlIHJlc3VsdGluZyBjb3B5IG9mIHRoZSBjbGlwIGxpc3QuCiAqICAgICAgICAgICAgSWYgTlVMTCwgZmlsbHMgU2l6ZSB1cCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lY2Vzc2FyeSB0byBob2xkCiAqICAgICAgICAgICAgdGhlIGVudGlyZSBjbGlwLgogKiAgU2l6ZTogU2l6ZSBvZiByZXN1bHRpbmcgY2xpcCBsaXN0OyBzaXplIG9mIHRoZSBidWZmZXIgYXQgQ2xpcExpc3QKICogICAgICAgIG9yLCBpZiBDbGlwTGlzdCBpcyBOVUxMLCByZWNlaXZlcyB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgYnVmZmVyCiAqICAgICAgICBpbiBieXRlcwogKgogKiBSRVRVUk5TCiAqICBFaXRoZXIgRERfT0sgb3IgRERFUlJfKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9HZXRDbGlwTGlzdCgKICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIExQUkVDVCBscFJlY3QsIExQUkdOREFUQSBscENsaXBMaXN0LAogICAgTFBEV09SRCBscGR3U2l6ZSkKewogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CgogICAgVFJBQ0UoIiglcCwlcCwlcCwlcClcbiIsIFRoaXMsIGxwUmVjdCwgbHBDbGlwTGlzdCwgbHBkd1NpemUpOwoKICAgIGlmIChUaGlzLT5oV25kKQogICAgewogICAgICAgIEhEQyBoREMgPSBHZXREQ0V4KFRoaXMtPmhXbmQsIE5VTEwsIERDWF9XSU5ET1cpOwogICAgICAgIGlmIChoREMpCiAgICAgICAgewogICAgICAgICAgICBIUkdOIGhSZ24gPSBDcmVhdGVSZWN0UmduKDAsMCwwLDApOwogICAgICAgICAgICBpZiAoR2V0UmFuZG9tUmduKGhEQywgaFJnbiwgU1lTUkdOKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEdldFZlcnNpb24oKSAmIDB4ODAwMDAwMDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogbWFwIHJlZ2lvbiB0byBzY3JlZW4gY29vcmRpbmF0ZXMgKi8KICAgICAgICAgICAgICAgICAgICBQT0lOVCBvcmc7CiAgICAgICAgICAgICAgICAgICAgR2V0RENPcmdFeCggaERDLCAmb3JnICk7CiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmduKCBoUmduLCBvcmcueCwgb3JnLnkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChscFJlY3QpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSFJHTiBoUmduQ2xpcCA9IENyZWF0ZVJlY3RSZ24obHBSZWN0LT5sZWZ0LCBscFJlY3QtPnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgbHBSZWN0LT5yaWdodCwgbHBSZWN0LT5ib3R0b20pOwogICAgICAgICAgICAgICAgICAgIENvbWJpbmVSZ24oaFJnbiwgaFJnbiwgaFJnbkNsaXAsIFJHTl9BTkQpOwogICAgICAgICAgICAgICAgICAgIERlbGV0ZU9iamVjdChoUmduQ2xpcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqbHBkd1NpemUgPSBHZXRSZWdpb25EYXRhKGhSZ24sICpscGR3U2l6ZSwgbHBDbGlwTGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhSZ24pOwogICAgICAgICAgICBSZWxlYXNlREMoVGhpcy0+aFduZCwgaERDKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEREX09LOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHN0YXRpYyBpbnQgd2FybmVkID0gMDsKICAgICAgICBpZiAod2FybmVkKysgPCAxMCkKICAgICAgICAgICAgRklYTUUoIiglcCwlcCwlcCwlcCksc3R1YiFcbiIsVGhpcyxscFJlY3QsbHBDbGlwTGlzdCxscGR3U2l6ZSk7CiAgICAgICAgaWYgKGxwZHdTaXplKSAqbHBkd1NpemU9MDsKICAgICAgICByZXR1cm4gRERFUlJfTk9DTElQTElTVDsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6U2V0Q2xpcExpc3QKICoKICogU2V0cyBvciBkZWxldGVzIChpZiBscHJnbiBpcyBOVUxMKSB0aGUgY2xpcCBsaXN0CiAqCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBzdHViIGFuZCByZXR1cm5zIEREX09LIGFsd2F5cyB0byBtYWtlIHRoZSBhcHAKICogaGFwcHkuCiAqCiAqIFBBUkFNUwogKiAgbHByZ24gICBQb2ludGVyIHRvIGEgTFJHTkRBVEEgc3RydWN0dXJlIG9yIE5VTEwKICogIGR3RmxhZ3Mgbm90IHVzZWQsIG11c3QgYmUgMAogKiBSRVRVUk5TCiAqICBFaXRoZXIgRERfT0sgb3IgRERFUlJfKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1NldENsaXBMaXN0KAogICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSxMUFJHTkRBVEEgbHByZ24sRFdPUkQgZHdGbGFnCikgewogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CiAgICBzdGF0aWMgaW50IHdhcm5lZCA9IDA7CiAgICBpZiAod2FybmVkKysgPCAxMCB8fCBscHJnbiA9PSBOVUxMKQogICAgICAgIEZJWE1FKCIoJXAsJXAsJWxkKSxzdHViIVxuIixUaGlzLGxwcmduLGR3RmxhZyk7CiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd0NsaXBwZXI6OkdldEh3bmQKICoKICogUmV0dXJucyB0aGUgaHduZCBhc3NpZ25lZCB3aXRoIFNldEh3bmQKICoKICogQXJndW1lbnRzOgogKiAgaFduZFB0cjogQWRkcmVzcyB0byBzdG9yZSB0aGUgSFdORCBhdAogKgogKiBSZXR1cm4gdmFsdWVzOgogKiAgQWx3YXlzIHJldHVybnMgRERfT0s7CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfR2V0SFduZCgKICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIEhXTkQqIGhXbmRQdHIKKSB7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBoV25kUHRyKTsKCiAgICAqaFduZFB0ciA9IFRoaXMtPmhXbmQ7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdDbGlwcGVyOjpJbml0aWFsaXplCiAqCiAqIEluaXRpYWxpemVzIHRoZSBpbnRlcmZhY2UuIFdlbGwsIHRoZXJlIGlzbid0IG11Y2ggdG8gZG8gZm9yIHRoaXMKICogaW1wbGVtZW50YXRpb24sIGJ1dCBpdCBzdG9yZXMgdGhlIERpcmVjdERyYXcgSW50ZXJmYWNlLgogKgogKiBBcmd1bWVudHM6CiAqICBERDogUG9pbnRlciB0byBhIElEaXJlY3REcmF3IGludGVyZmFjZQogKiAgRmxhZ3M6IFVuc3VwcG9ydGVkIGJ5IG5vdwogKgogKiBSZXR1cm4gdmFsdWVzOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEIGlmIHRoaXMgaW50ZXJmYWNlIGlzbid0IGluaXRpYWxpemVkIGFscmVhZHkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9Jbml0aWFsaXplKAogICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIExQRElSRUNURFJBVyBscERELCBEV09SRCBkd0ZsYWdzCikgewogICAgSURpcmVjdERyYXdJbXBsKiBwT3duZXI7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKICAgIFRSQUNFKCIoJXApLT4oJXAsMHglMDhseClcbiIsIFRoaXMsIGxwREQsIGR3RmxhZ3MpOwoKICAgIGlmIChUaGlzLT5kZHJhd19vd25lciAhPSBOVUxMKSByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwoKICAgIHBPd25lciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXcsIGxwREQpOwogICAgVGhpcy0+ZGRyYXdfb3duZXIgPSBwT3duZXI7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdDbGlwcGVyOjpJc0NsaXBMaXN0Q2hhbmdlZAogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgc3R1YgogKgogKiBBcmd1bWVudHM6CiAqICBDaGFuZ2VkOgogKgogKiBSZXR1cm4gdmFsdWVzOgogKiAgRERfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9Jc0NsaXBMaXN0Q2hhbmdlZCgKICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIEJPT0wqIGxwYkNoYW5nZWQKKSB7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKICAgIEZJWE1FKCIoJXApLT4oJXApLHN0dWIhXG4iLFRoaXMsbHBiQ2hhbmdlZCk7CgogICAgLyogWFhYIFdoYXQgaXMgc2FmZXN0PyAqLwogICAgKmxwYkNoYW5nZWQgPSBGQUxTRTsKCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBUaGUgVlRhYmxlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KY29uc3QgSURpcmVjdERyYXdDbGlwcGVyVnRibCBJRGlyZWN0RHJhd0NsaXBwZXJfVnRibCA9CnsKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0FkZFJlZiwKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfUmVsZWFzZSwKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfR2V0Q2xpcExpc3QsCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0dldEhXbmQsCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0luaXRpYWxpemUsCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0lzQ2xpcExpc3RDaGFuZ2VkLAogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9TZXRDbGlwTGlzdCwKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfU2V0SHduZAp9Owo=