LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAiZDNkLmgiCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6UXVlcnlJbnRlcmZhY2UKICoKICogUXVlcnlJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gd2l0aCB0aHVua3MgdG8gSURpcmVjdERyYXc3CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19RdWVyeUludGVyZmFjZShJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIG9iaik7CgogICAgcmV0dXJuIElEaXJlY3REcmF3N19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3N1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwoKICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgb2JqKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9RdWVyeUludGVyZmFjZShJRGlyZWN0M0QgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3N1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwoKICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6QWRkUmVmCiAqCiAqIERpcmVjdERyYXcgcmVmY291bnRpbmcgaXMgYSBiaXQgb2RkLiBFdmVyeSB2ZXJzaW9uIG9mIHRoZSBkZHJhdyBpbnRlcmZhY2UKICogaGFzIGl0cyBvd24gcmVmY291bnQsIGJ1dCBJRGlyZWN0M0QgMS8yLzMgcmVmY291bnRzIGFyZSBsaW5rZWQgdG8KICogSURpcmVjdERyYXcsIGFuZCBJRGlyZWN0M0Q3IGlzIGxpbmtlZCB0byBJRGlyZWN0RHJhdzcKICoKICogSURpcmVjdDNENyAtPiBJRGlyZWN0RHJhdzcKICogSURpcmVjdDNEMyAtPiBJRGlyZWN0RHJhdwogKiBJRGlyZWN0M0QyIC0+IElEaXJlY3REcmF3CiAqIElEaXJlY3QzRCAgLT4gSURpcmVjdERyYXcKICoKICogU28gZXZlcnkgQWRkUmVmIGltcGxlbWVudGF0aW9uIHRodW5rcyB0byBhIGRpZmZlcmVudCBpbnRlcmZhY2UsIGFuZCB0aGUKICogSURpcmVjdERyYXdYOjpBZGRSZWYgaW1wbGVtZW50YXRpb25zIGhhdmUgZGlmZmVyZW50IGNvdW50ZXJzLi4uCiAqCiAqIFJldHVybnMKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19BZGRSZWYoSURpcmVjdDNENyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCkgOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXc3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfQWRkUmVmKElEaXJlY3QzRDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3KSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0FkZFJlZihJRGlyZWN0M0QyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9BZGRSZWYoSURpcmVjdDNEICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpSZWxlYXNlCiAqCiAqIFNhbWUgc3RvcnkgYXMgSURpcmVjdDNENzo6QWRkUmVmCiAqCiAqIFJldHVybnM6IFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19SZWxlYXNlKElEaXJlY3QzRDcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3N19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19SZWxlYXNlKElEaXJlY3QzRDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9SZWxlYXNlKElEaXJlY3QzRDIgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9SZWxlYXNlKElEaXJlY3QzRCAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCBNZXRob2RzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q6OkluaXRpYWxpemUKICoKICogSW5pdGlhbGl6ZXMgdGhlIElEaXJlY3QzRCBpbnRlcmZhY2UuIFRoaXMgaXMgYSBuby1vcCBpbXBsZW1lbnRhdGlvbiwKICogYXMgYWxsIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgYXQgY3JlYXRlIHRpbWUuCiAqCiAqIFZlcnNpb24gMQogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6ID8KICoKICogUmV0dXJuczoKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgbm8tb3AKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF8xX0luaXRpYWxpemUoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVzKSBuby1vcC4uLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpFbnVtRGV2aWNlcwogKgogKiBUaGUgRW51bURldmljZXMgbWV0aG9kIGZvciBJRGlyZWN0M0Q3LiBJdCBlbnVtZXJhdGVzIGFsbCBzdXBwb3J0ZWQKICogRDNENyBkZXZpY2VzLiBDdXJyZW50bHkgdGhlcmUncyBvbmx5IG9uZS4KICoKICogUGFyYW1zOgogKiAgQ2FsbGJhY2s6IEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW51bWVyYXRlZCBkZXZpY2UKICogIENvbnRleHQ6IFBvaW50ZXIgdG8gcGFzcyBiYWNrIHRvIHRoZSBhcHAKICoKICogUmV0dXJuczoKICogIEQzRF9PSywgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgR2V0Q2FwcyBjYWxsCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19FbnVtRGV2aWNlcyhJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0s3IENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgY2hhciBpbnRlcmZhY2VfbmFtZVtdID0gIldJTkUgRGlyZWN0M0Q3IHVzaW5nIFdpbmVEM0QiOwogICAgY2hhciBkZXZpY2VfbmFtZVtdID0gIldpbmUgRDNENyBkZXZpY2UiOwogICAgRDNEREVWSUNFREVTQzcgZGRlc2M7CiAgICBEM0RERVZJQ0VERVNDIG9sZERlc2M7CiAgICBIUkVTVUxUIGhyOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBDYWxsYmFjaywgQ29udGV4dCk7CiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwoKICAgIFRSQUNFKCIoJXApIEVudW1lcmF0aW5nIFdpbmVEM0QgRDNEZXZpY2U3IGludGVyZmFjZVxuIiwgVGhpcyk7CiAgICBociA9IElEaXJlY3QzREltcGxfR2V0Q2FwcyhUaGlzLT53aW5lRDNELCAmb2xkRGVzYywgJmRkZXNjKTsKICAgIGlmKGhyICE9IEQzRF9PSykKICAgIHsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBocjsKICAgIH0KICAgIENhbGxiYWNrKGludGVyZmFjZV9uYW1lLCBkZXZpY2VfbmFtZSwgJmRkZXNjLCBDb250ZXh0KTsKCiAgICBUUkFDRSgiKCVwKSBFbmQgb2YgZW51bWVyYXRpb25cbiIsIFRoaXMpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0QzOjpFbnVtRGV2aWNlcwogKgogKiBFbnVtZXJhdGVzIGFsbCBzdXBwb3J0ZWQgRGlyZWN0M0REZXZpY2UgaW50ZXJmYWNlcy4gVGhpcyBpcyB0aGUKICogaW1wbGVtZW50YXRpb24gZm9yIERpcmVjdDNEIDEgdG8gRGlyZWMzRCAzLCBWZXJzaW9uIDcgaGFzIGl0cyBvd24uCiAqCiAqIFZlcnNpb24gMSwgMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBDYWxsYmFjazogQXBwbGljYXRpb24tcHJvdmlkZWQgcm91dGluZSB0byBjYWxsIGZvciBlYWNoIGVudW1lcmF0ZWQgZGV2aWNlCiAqICBDb250ZXh0OiBQb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcywKICogIFRoZSByZXN1bHQgb2YgSURpcmVjdDNESW1wbF9HZXRDYXBzIGlmIGl0IGZhaWxlZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzNfRW51bURldmljZXMoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIEQzRERFVklDRURFU0MgZHJlZiwgZDEsIGQyOwogICAgRDNEREVWSUNFREVTQzcgbmV3RGVzYzsKICAgIHN0YXRpYyBDSEFSIHdpbmVkM2RfZGVzY3JpcHRpb25bXSA9ICJXaW5lIEQzRERldmljZSB1c2luZyBXaW5lRDNEIGFuZCBPcGVuR0wiOwogICAgSFJFU1VMVCBocjsKCiAgICAvKiBTb21lIGdhbWVzIChNb3RvcmFjZXIgMiBkZW1vKSBoYXZlIHRoZSBiYWQgaWRlYSB0byBtb2RpZnkgdGhlIGRldmljZSBuYW1lIHN0cmluZy4KICAgICAgIExldCdzIHB1dCB0aGUgc3RyaW5nIGluIGEgc3VmZmljaWVudGx5IHNpemVkIGFycmF5IGluIHdyaXRhYmxlIG1lbW9yeS4gKi8KICAgIGNoYXIgZGV2aWNlX25hbWVbNTBdOwogICAgc3RyY3B5KGRldmljZV9uYW1lLCJkaXJlY3QzZCIpOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBDYWxsYmFjaywgQ29udGV4dCk7CiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwoKICAgIGhyID0gSURpcmVjdDNESW1wbF9HZXRDYXBzKFRoaXMtPndpbmVEM0QsICZkcmVmLCAmbmV3RGVzYyk7CiAgICBpZihociAhPSBEM0RfT0spCiAgICB7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gaHI7CiAgICB9CgogICAgLyogRG8gSSBoYXZlIHRvIGVudW1lcmF0ZSB0aGUgcmVmZXJlbmNlIGlkPyBOb3RlIGZyb20gb2xkIGQzZDc6CiAgICAgKiAiSXQgc2VlbXMgdGhhdCBlbnVtZXJhdGluZyB0aGUgcmVmZXJlbmNlIElJRCBvbiBEaXJlY3QzRCAxIGdhbWVzCiAgICAgKiAoQXZQIC8gTW90b3JhY2VyMikgYnJlYWtzIHRoZW0iLiBTbyBkbyBub3QgZW51bWVyYXRlIHRoaXMgaWlkIGluIFYxCiAgICAgKgogICAgICogVGhlcmUncyBhIHJlZ2lzdHJ5IGtleSBIS0xNXFNvZnR3YXJlXE1pY3Jvc29mdFxEaXJlY3QzRFxEcml2ZXJzLCBFbnVtUmVmZXJlbmNlCiAgICAgKiB3aGljaCBlbmFibGVzIC8gZGlzYWJsZXMgZW51bWVyYXRpbmcgdGhlIHJlZmVyZW5jZSByYXN0ZXJpemVyLiBJdCdzIGEgRFdPUkQsCiAgICAgKiAwIG1lYW5zIGRpc2FibGVkLCAyIG1lYW5zIGVuYWJsZWQuIFRoZSBlbmFibGVyZWZyYXN0LnJlZyBhbmQgZGlzYWJsZXJlZnJhc3QucmVnCiAgICAgKiBmaWxlcyBpbiB0aGUgRGlyZWN0WCA3LjAgc2RrIGRlbW8gZGlyZWN0b3J5IHN1Z2dlc3QgdGhpcy4KICAgICAqCiAgICAgKiBTb21lIGdhbWVzKEdUQSAyKSBzZWVtIHRvIHVzZSB0aGUgc2Vjb25kIGVudW1lcmF0ZWQgZGV2aWNlLCBzbyBJIGhhdmUgdG8gZW51bWVyYXRlCiAgICAgKiBhdCBsZWFzdCAyIGRldmljZXMuIFNvIGVudW1lcmF0ZSB0aGUgcmVmZXJlbmNlIGRldmljZSB0byBoYXZlIDIgZGV2aWNlcy4KICAgICAqCiAgICAgKiBPdGhlciBnYW1lcyhSb2xsY2FnZSkgdGVsbCBlbXVsYXRpb24gYW5kIGhhbCBkZXZpY2UgYXBwYXJ0IGJ5IGNlcnRhaW4gZmxhZ3MuCiAgICAgKiBSb2xsY2FnZSBleHBlY3RzIEQzRFBURVhUVVJFQ0FQU19QT1cyIHRvIGJlIHNldCh5ZWFoLCBpdCBpcyBhIGxpbWl0YXRpb24gZmxhZyksCiAgICAgKiBhbmQgaXQgcmVmdXNlcyBhbGwgZGV2aWNlcyB0aGF0IGhhdmUgdGhlIHBlcnNwZWN0aXZlIGZsYWcgc2V0LiBUaGlzIHdheSBpdCByZWZ1c2VzCiAgICAgKiB0aGUgZW11bGF0aW9uIGRldmljZSwgYW5kIEhBTCBkZXZpY2VzIG5ldmVyIGhhdmUgUE9XMiB1bnNldCBpbiBkM2Q3IG9uIHdpbmRvd3MuCiAgICAgKi8KCiAgICBpZihUaGlzLT5kM2R2ZXJzaW9uICE9IDEpCiAgICB7CiAgICAgICAgc3RhdGljIENIQVIgcmVmZXJlbmNlX2Rlc2NyaXB0aW9uW10gPSAiUkdCIERpcmVjdDNEIGVtdWxhdGlvbiI7CgogICAgICAgIFRSQUNFKCIoJXApIEVudW1lcmF0aW5nIFdpbmVEM0QgRDNERGV2aWNlIGludGVyZmFjZVxuIiwgVGhpcyk7CiAgICAgICAgZDEgPSBkcmVmOwogICAgICAgIGQyID0gZHJlZjsKICAgICAgICAvKiBUaGUgcmdiIGRldmljZSBoYXMgdGhlIHBvdzIgZmxhZyBzZXQgaW4gdGhlIGhlbCBjYXBzLCBidXQgbm90IGluIHRoZSBoYWwgY2FwcyAqLwogICAgICAgIGQxLmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJj0gfihEM0RQVEVYVFVSRUNBUFNfUE9XMiB8IEQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwgfCBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUpOwogICAgICAgIGQxLmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmPSB+KEQzRFBURVhUVVJFQ0FQU19QT1cyIHwgRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTCB8IEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSk7CiAgICAgICAgaHIgPSBDYWxsYmFjayggKExQSUlEKSAmSUlEX0lEaXJlY3QzRFJHQkRldmljZSwgcmVmZXJlbmNlX2Rlc2NyaXB0aW9uLCBkZXZpY2VfbmFtZSwgJmQxLCAmZDIsIENvbnRleHQpOwogICAgICAgIGlmKGhyICE9IEQzREVOVU1SRVRfT0spCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiQXBwbGljYXRpb24gY2FuY2VsbGVkIHRoZSBlbnVtZXJhdGlvblxuIik7CiAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgIHJldHVybiBEM0RfT0s7CiAgICAgICAgfQogICAgfQoKICAgIFRSQUNFKCIoJXApIEVudW1lcmF0aW5nIEhBTCBEaXJlY3QzRCBkZXZpY2VcbiIsIFRoaXMpOwogICAgZDEgPSBkcmVmOwogICAgZDIgPSBkcmVmOwogICAgLyogVGhlIGhhbCBkZXZpY2UgZG9lcyBub3QgaGF2ZSB0aGUgcG93MiBmbGFnIHNldCBpbiBoZWwsIGJ1dCBpbiBoYWwgKi8KICAgIGQyLmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJj0gfihEM0RQVEVYVFVSRUNBUFNfUE9XMiB8IEQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwgfCBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUpOwogICAgZDIuZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzICY9IH4oRDNEUFRFWFRVUkVDQVBTX1BPVzIgfCBEM0RQVEVYVFVSRUNBUFNfTk9OUE9XMkNPTkRJVElPTkFMIHwgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFKTsKICAgIGhyID0gQ2FsbGJhY2soIChMUElJRCkgJklJRF9JRGlyZWN0M0RIQUxEZXZpY2UsIHdpbmVkM2RfZGVzY3JpcHRpb24sIGRldmljZV9uYW1lLCAmZDEsICZkMiwgQ29udGV4dCk7CiAgICBpZihociAhPSBEM0RFTlVNUkVUX09LKQogICAgewogICAgICAgIFRSQUNFKCJBcHBsaWNhdGlvbiBjYW5jZWxsZWQgdGhlIGVudW1lcmF0aW9uXG4iKTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBEM0RfT0s7CiAgICB9CiAgICBUUkFDRSgiKCVwKSBFbmQgb2YgZW51bWVyYXRpb25cbiIsIFRoaXMpOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0VudW1EZXZpY2VzKElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29udGV4dCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIENhbGxiYWNrLCBDb250ZXh0KTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0VudW1EZXZpY2VzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9FbnVtRGV2aWNlcyhJRGlyZWN0M0QgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29udGV4dCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgQ2FsbGJhY2ssIENvbnRleHQpOwogICAgcmV0dXJuIElEaXJlY3QzRDNfRW51bURldmljZXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEMzo6Q3JlYXRlTGlnaHQKICoKICogQ3JlYXRlcyBhbiBJRGlyZWN0M0RMaWdodCBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgaW4KICogRGlyZWN0M0QzIG9yIGVhcmxpZXIgZm9yIGxpZ2h0aW5nLiBJbiBEaXJlY3QzRDcgaXQgaGFzIGJlZW4gcmVwbGFjZWQKICogYnkgdGhlIERJUkVDVDNETElHSFQ3IHN0cnVjdHVyZS4gV2luZSdzIERpcmVjdDNETGlnaHQgaW1wbGVtZW50YXRpb24KICogdXNlcyB0aGUgSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2Ugd2l0aCBEM0Q3IGxpZ2h0cy4KICoKICogVmVyc2lvbiAxLCAyIGFuZCAzCiAqCiAqIFBhcmFtczoKICogIExpZ2h0OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBuZXcgaW50ZXJmYWNlIHBvaW50ZXIKICogIFVua091dGVyOiBCYXNpY2FsbHkgZm9yIGFnZ3JlZ2F0aW9uLCBidXQgZGRyYXcgZG9lc24ndCBzdXBwb3J0IGl0LgogKiAgICAgICAgICAgIE11c3QgYmUgTlVMTAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX09VVE9GTUVNT1JZIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAogKiAgQ0xBU1NfRV9OT0FHR1JFR0FUSU9OIGlmIFVua091dGVyICE9IE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF8zX0NyZWF0ZUxpZ2h0KElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETGlnaHQgKipMaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlciApCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgSURpcmVjdDNETGlnaHRJbXBsICpvYmplY3Q7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIExpZ2h0LCBVbmtPdXRlcik7CgogICAgaWYoVW5rT3V0ZXIpCiAgICAgICAgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKCiAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElEaXJlY3QzRExpZ2h0SW1wbCkpOwogICAgaWYgKG9iamVjdCA9PSBOVUxMKQogICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKCiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETGlnaHQsIElEaXJlY3QzRExpZ2h0X1Z0YmwpOwogICAgb2JqZWN0LT5yZWYgPSAxOwogICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CiAgICBvYmplY3QtPm5leHQgPSBOVUxMOwogICAgb2JqZWN0LT5hY3RpdmVfdmlld3BvcnQgPSBOVUxMOwoKICAgIC8qIFVwZGF0ZSBmdW5jdGlvbnMgKi8KICAgIG9iamVjdC0+YWN0aXZhdGUgPSBsaWdodF91cGRhdGU7CiAgICBvYmplY3QtPmRlc2FjdGl2YXRlID0gbGlnaHRfYWN0aXZhdGU7CiAgICBvYmplY3QtPnVwZGF0ZSA9IGxpZ2h0X2Rlc2FjdGl2YXRlOwogICAgb2JqZWN0LT5hY3RpdmVfdmlld3BvcnQgPSBOVUxMOwoKICAgICpMaWdodCA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETGlnaHQpOwoKICAgIFRSQUNFKCIoJXApIGNyZWF0aW5nIGltcGxlbWVudGF0aW9uIGF0ICVwLlxuIiwgVGhpcywgb2JqZWN0KTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZUxpZ2h0KElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETGlnaHQgKipEaXJlY3QzRExpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0RMaWdodCwgVW5rT3V0ZXIpOwogICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlTGlnaHQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3QzRExpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rT3V0ZXIpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZUxpZ2h0KElEaXJlY3QzRCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RMaWdodCAqKkRpcmVjdDNETGlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNETGlnaHQsIFVua091dGVyKTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0NyZWF0ZUxpZ2h0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0M0RMaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDM6OkNyZWF0ZU1hdGVyaWFsCiAqCiAqIENyZWF0ZXMgYW4gSURpcmVjdDNETWF0ZXJpYWwgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IERpcmVjdDNEMwogKiBhbmQgb2xkZXIgdmVyc2lvbnMuIFRoZSBJRGlyZWN0M0RNYXRlcmlhbCBpbXBsZW1lbnRhdGlvbiB3cmFwcyBpdHMKICogZnVuY3Rpb25hbGl0eSB0byBJRGlyZWN0M0REZXZpY2U3OjpTZXRNYXRlcmlhbCBhbmQgZnJpZW5kcy4KICoKICogVmVyc2lvbiAxLCAyIGFuZCAzCiAqCiAqIFBhcmFtczoKICogIE1hdGVyaWFsOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBuZXcgaW50ZXJmYWNlJ3MgcG9pbnRlciB0bwogKiAgVW5rT3V0ZXI6IEJhc2ljYWxseSBmb3IgYWdncmVnYXRpb24sIGJ1dCBkZHJhdyBkb2Vzbid0IHN1cHBvcnQgaXQuCiAqICAgICAgICAgICAgTXVzdCBiZSBOVUxMCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCiAqICBDTEFTU19FX05PQUdHUkVHQVRJT04gaWYgVW5rT3V0ZXIgIT0gTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlTWF0ZXJpYWwoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbDMgKipNYXRlcmlhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlciApCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsICpvYmplY3Q7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIE1hdGVyaWFsLCBVbmtPdXRlcik7CgogICAgaWYoVW5rT3V0ZXIpCiAgICAgICAgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKCiAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElEaXJlY3QzRE1hdGVyaWFsSW1wbCkpOwogICAgaWYgKG9iamVjdCA9PSBOVUxMKQogICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKCiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwzLCBJRGlyZWN0M0RNYXRlcmlhbDNfVnRibCk7CiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDJfVnRibCk7CiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsX1Z0YmwpOwogICAgb2JqZWN0LT5yZWYgPSAxOwogICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CiAgICBvYmplY3QtPmFjdGl2YXRlID0gbWF0ZXJpYWxfYWN0aXZhdGU7CgogICAgKk1hdGVyaWFsID0gSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RNYXRlcmlhbDMpOwoKICAgIFRSQUNFKCIoJXApIGNyZWF0aW5nIGltcGxlbWVudGF0aW9uIGF0ICVwLlxuIiwgVGhpcywgb2JqZWN0KTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZU1hdGVyaWFsKElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETWF0ZXJpYWwyICoqRGlyZWN0M0RNYXRlcmlhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBVbmtPdXRlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBIUkVTVUxUIHJldDsKICAgIElEaXJlY3QzRE1hdGVyaWFsMyAqcmV0X3ZhbDsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNETWF0ZXJpYWwsIFVua091dGVyKTsKICAgIHJldCA9IElEaXJlY3QzRDNfQ3JlYXRlTWF0ZXJpYWwoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7CgogICAgKkRpcmVjdDNETWF0ZXJpYWwgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIElEaXJlY3QzRE1hdGVyaWFsMiwgcmV0X3ZhbCk7CgogICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwLlxuIiwgKkRpcmVjdDNETWF0ZXJpYWwpOwoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlTWF0ZXJpYWwoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRE1hdGVyaWFsICoqRGlyZWN0M0RNYXRlcmlhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBVbmtPdXRlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIEhSRVNVTFQgcmV0OwogICAgTFBESVJFQ1QzRE1BVEVSSUFMMyByZXRfdmFsOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0RNYXRlcmlhbCwgVW5rT3V0ZXIpOwogICAgcmV0ID0gSURpcmVjdDNEM19DcmVhdGVNYXRlcmlhbChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldF92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKCiAgICAqRGlyZWN0M0RNYXRlcmlhbCA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgSURpcmVjdDNETWF0ZXJpYWwsIHJldF92YWwpOwoKICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcC5cbiIsICpEaXJlY3QzRE1hdGVyaWFsKTsKCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEMzo6Q3JlYXRlVmlld3BvcnQKICoKICogQ3JlYXRlcyBhbiBJRGlyZWN0M0RWaWV3cG9ydCBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQKICogYnkgRGlyZWN0M0QgYW5kIGVhcmxpZXIgdmVyc2lvbnMgZm9yIFZpZXdwb3J0IG1hbmFnZW1lbnQuIEluIERpcmVjdDNENwogKiBpdCBoYXMgYmVlbiByZXBsYWNlZCBieSBhIHZpZXdwb3J0IHN0cnVjdHVyZSBhbmQKICogSURpcmVjdDNERGV2aWNlNzo6KlZpZXdwb3J0LiBXaW5lJ3MgSURpcmVjdDNEVmlld3BvcnQgaW1wbGVtZW50YXRpb24KICogdXNlcyB0aGUgSURpcmVjdDNERGV2aWNlNyBtZXRob2RzIGZvciBpdHMgZnVuY3Rpb25hbGl0eQogKgogKiBQYXJhbXM6CiAqICBWaWV3cG9ydDogQWRkcmVzcyB0byBzdG9yZSB0aGUgbmV3IGludGVyZmFjZSBwb2ludGVyCiAqICBVbmtPdXRlcjogQmFzaWNhbGx5IGZvciBhZ2dyZWdhdGlvbiwgYnV0IGRkcmF3IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICogICAgICAgICAgICBNdXN0IGJlIE5VTEwKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKICogIENMQVNTX0VfTk9BR0dSRUdBVElPTiBpZiBVbmtPdXRlciAhPSBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfM19DcmVhdGVWaWV3cG9ydChJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQzICoqVmlld3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlciApCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpvYmplY3Q7CgogICAgaWYoVW5rT3V0ZXIpCiAgICAgICAgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKCiAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElEaXJlY3QzRFZpZXdwb3J0SW1wbCkpOwogICAgaWYgKG9iamVjdCA9PSBOVUxMKQogICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKCiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmlld3BvcnQzLCBJRGlyZWN0M0RWaWV3cG9ydDNfVnRibCk7CiAgICBvYmplY3QtPnJlZiA9IDE7CiAgICBvYmplY3QtPmRkcmF3ID0gVGhpczsKICAgIG9iamVjdC0+YWN0aXZhdGUgPSB2aWV3cG9ydF9hY3RpdmF0ZTsKICAgIG9iamVjdC0+dXNlX3ZwMiA9IDB4RkY7CiAgICBvYmplY3QtPm5leHQgPSBOVUxMOwogICAgb2JqZWN0LT5saWdodHMgPSBOVUxMOwogICAgb2JqZWN0LT5udW1fbGlnaHRzID0gMDsKICAgIG9iamVjdC0+bWFwX2xpZ2h0cyA9IDA7CgogICAgKlZpZXdwb3J0ID0gSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RWaWV3cG9ydDMpOwoKICAgIFRSQUNFKCIoJXApIGNyZWF0aW5nIGltcGxlbWVudGF0aW9uIGF0ICVwLlxuIixUaGlzLCBvYmplY3QpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDIgKipEM0RWaWV3cG9ydDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEM0RWaWV3cG9ydDIsIFVua091dGVyKTsKCiAgICByZXR1cm4gSURpcmVjdDNEM19DcmVhdGVWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0RWaWV3cG9ydDMgKiopIEQzRFZpZXdwb3J0MiAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVWaWV3cG9ydChJRGlyZWN0M0QgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQgKipEM0RWaWV3cG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBVbmtPdXRlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNEVmlld3BvcnQsIFVua091dGVyKTsKCiAgICByZXR1cm4gSURpcmVjdDNEM19DcmVhdGVWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0RWaWV3cG9ydDMgKiopIEQzRFZpZXdwb3J0IC8qIE5vIG5lZWQgdG8gY2FzdCBoZXJlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rT3V0ZXIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEMzo6RmluZERldmljZQogKgogKiBUaGlzIG1ldGhvZCBmaW5kcyBhIGRldmljZSB3aXRoIHRoZSByZXF1ZXN0ZWQgcHJvcGVydGllcyBhbmQgcmV0dXJucyBhCiAqIGRldmljZSBkZXNjcmlwdGlvbgogKgogKiBWZXJpb24gMSwgMiBhbmQgMwogKiBQYXJhbXM6CiAqICBEM0RERlM6IERlc2NyaWJlcyB0aGUgcmVxdWVzdGVkIGRldmljZSBjaGFyYWN0ZXJpc3RpY3MKICogIEQzREZEUjogUmV0dXJucyB0aGUgZGV2aWNlIGRlc2NyaXB0aW9uCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBubyBkZXZpY2Ugd2FzIGZvdW5kCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfM19GaW5kRGV2aWNlKElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RGSU5EREVWSUNFU0VBUkNIICpEM0RERlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREZJTkRERVZJQ0VSRVNVTFQgKkQzREZEUikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CiAgICBEM0RERVZJQ0VERVNDIGRlc2M7CiAgICBEM0RERVZJQ0VERVNDNyBuZXdEZXNjOwogICAgSFJFU1VMVCBocjsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgRDNEREZTLCBEM0RGRFIpOwoKICAgIGlmICgoRDNEREZTLT5kd0ZsYWdzICYgRDNERkRTX0NPTE9STU9ERUwpICYmCiAgICAgICAgKEQzRERGUy0+ZGNtQ29sb3JNb2RlbCAhPSBEM0RDT0xPUl9SR0IpKQogICAgewogICAgICAgIFRSQUNFKCIgdHJ5aW5nIHRvIHJlcXVlc3QgYSBub24tUkdCIEQzRCBjb2xvciBtb2RlbC4gTm90IHN1cHBvcnRlZC5cbiIpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOyAvKiBObyByZWFsIGlkZWEgd2hhdCB0byByZXR1cm4gaGVyZSA6LSkgKi8KICAgIH0KICAgIGlmIChEM0RERlMtPmR3RmxhZ3MgJiBEM0RGRFNfR1VJRCkKICAgIHsKICAgICAgICBUUkFDRSgiIHRyeWluZyB0byBtYXRjaCBndWlkICVzLlxuIiwgZGVidWdzdHJfZ3VpZCgmKEQzRERGUy0+Z3VpZCkpKTsKICAgICAgICBpZiAoKElzRXF1YWxHVUlEKCZJSURfRDNEREVWSUNFX1dpbmVEM0QsICYoRDNEREZTLT5ndWlkKSkgPT0gMCkgJiYKICAgICAgICAgICAgKElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNESEFMRGV2aWNlLCAmKEQzRERGUy0+Z3VpZCkpID09IDApICYmCiAgICAgICAgICAgIChJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzRFJlZkRldmljZSwgJihEM0RERlMtPmd1aWQpKSA9PSAwKSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCIgbm8gbWF0Y2ggZm9yIHRoaXMgR1VJRC5cbiIpOwogICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICB9CiAgICB9CgogICAgLyogR2V0IHRoZSBjYXBzICovCiAgICBociA9IElEaXJlY3QzREltcGxfR2V0Q2FwcyhUaGlzLT53aW5lRDNELCAmZGVzYywgJm5ld0Rlc2MpOwogICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CgogICAgLyogTm93IHJldHVybiBvdXIgb3duIEdVSUQgKi8KICAgIEQzREZEUi0+Z3VpZCA9IElJRF9EM0RERVZJQ0VfV2luZUQzRDsKICAgIEQzREZEUi0+ZGRId0Rlc2MgPSBkZXNjOwogICAgRDNERkRSLT5kZFN3RGVzYyA9IGRlc2M7CgogICAgVFJBQ0UoIiByZXR1cm5pbmcgV2luZSdzIFdpbmVEM0QgZGV2aWNlIHdpdGggKHVuZHVtcGVkKSBjYXBhYmlsaXRpZXNcbiIpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzJfRmluZERldmljZShJRGlyZWN0M0QyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVNFQVJDSCAqRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RGSU5EREVWSUNFUkVTVUxUICpEM0RGRFIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgRDNEREZTLCBEM0RGRFIpOwogICAgcmV0dXJuIElEaXJlY3QzRDNfRmluZERldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RGRFIpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8xX0ZpbmREZXZpY2UoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RGSU5EREVWSUNFU0VBUkNIICpEM0RERlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVJFU1VMVCAqRDNERGV2aWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEM0RERlMsIEQzRERldmljZSk7CiAgICByZXR1cm4gSURpcmVjdDNEM19GaW5kRGV2aWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERldmljZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpDcmVhdGVEZXZpY2UKICoKICogQ3JlYXRlcyBhbiBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS4KICoKICogVmVyc2lvbiAyLCAzIGFuZCA3LiBJRGlyZWN0M0REZXZpY2UgMSBpbnRlcmZhY2VzIGFyZSBpbnRlcmZhY2VzIHRvCiAqIERpcmVjdERyYXcgc3VyZmFjZXMgYW5kIGFyZSBjcmVhdGVkIHdpdGgKICogSURpcmVjdERyYXdTdXJmYWNlOjpRdWVyeUludGVyZmFjZS4gVGhpcyBtZXRob2QgdXNlcyBDcmVhdGVEZXZpY2UgdG8KICogY3JlYXRlIHRoZSBkZXZpY2Ugb2JqZWN0IGFuZCBRdWVyeUludGVyZmFjZXMgZm9yIElEaXJlY3QzRERldmljZQogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6IElJRCBvZiB0aGUgZGV2aWNlIHRvIGNyZWF0ZQogKiAgU3VyZmFjZTogSW5pdGl0aWFsIHJlbmRlcnRhcmdldAogKiAgRGV2aWNlOiBBZGRyZXNzIHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgYSBkZXZpY2UgZXhpc3RzIGFscmVhZHkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF83X0NyZWF0ZURldmljZShJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2U3ICoqRGV2aWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKm9iamVjdDsKICAgIElQYXJlbnRJbXBsICpJbmRleEJ1ZmZlclBhcmVudDsKICAgIEhSRVNVTFQgaHI7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0YXJnZXQgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBTdXJmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBTdXJmYWNlLCBEZXZpY2UpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAqRGV2aWNlID0gTlVMTDsKCiAgICAvKiBGYWlsIGRldmljZSBjcmVhdGlvbiBpZiBub24tb3BlbmdsIHN1cmZhY2VzIGFyZSB1c2VkICovCiAgICBpZihUaGlzLT5JbXBsVHlwZSAhPSBTVVJGQUNFX09QRU5HTCkKICAgIHsKICAgICAgICBFUlIoIlRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBjcmVhdGUgYSBEaXJlY3QzRCBkZXZpY2UsIGJ1dCBub24tb3BlbmdsIHN1cmZhY2VzIGFyZSBzZXQgaW4gdGhlIHJlZ2lzdHJ5LiBQbGVhc2Ugc2V0IHRoZSBzdXJmYWNlIGltcGxlbWVudGF0aW9uIHRvIG9wZW5nbCBvciBhdXRvZGV0ZWN0aW9uIHRvIGFsbG93IDNEIHJlbmRlcmluZ1xuIik7CgogICAgICAgIC8qIFdlIG9ubHkgaGl0IHRoaXMgcGF0aCBpZiBhIGRlZmF1bHQgc3VyZmFjZSBpcyBzZXQgaW4gdGhlIHJlZ2lzdHJ5LiBJbmNvcnJlY3QgYXV0b2RldGVjdGlvbgogICAgICAgICAqIGlzIGNhdWdodCBpbiBDcmVhdGVTdXJmYWNlIG9yIFF1ZXJ5SW50ZXJmYWNlCiAgICAgICAgICovCiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfTk8zRDsKICAgIH0KCiAgICAvKiBTbyBmYXIgd2UgY2FuIG9ubHkgY3JlYXRlIG9uZSBkZXZpY2UgcGVyIGRkcmF3IG9iamVjdCAqLwogICAgaWYoVGhpcy0+ZDNkZGV2aWNlKQogICAgewogICAgICAgIEZJWE1FKCIoJXApOiBPbmx5IG9uZSBEaXJlY3QzRCBkZXZpY2UgcGVyIERpcmVjdERyYXcgb2JqZWN0IHN1cHBvcnRlZFxuIiwgVGhpcyk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KCiAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKElEaXJlY3QzRERldmljZUltcGwpKTsKICAgIGlmKCFvYmplY3QpCiAgICB7CiAgICAgICAgRVJSKCJPdXQgb2YgbWVtb3J5IHdoZW4gYWxsb2NhdGluZyBhIElEaXJlY3QzRERldmljZSBpbXBsZW1lbnRhdGlvblxuIik7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CiAgICB9CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZTcsIElEaXJlY3QzRERldmljZTdfVnRibCk7CiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlM19WdGJsKTsKICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UyX1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlMV9WdGJsKTsKCiAgICBvYmplY3QtPnJlZiA9IDE7CiAgICBvYmplY3QtPmRkcmF3ID0gVGhpczsKICAgIG9iamVjdC0+dmlld3BvcnRfbGlzdCA9IE5VTEw7CiAgICBvYmplY3QtPmN1cnJlbnRfdmlld3BvcnQgPSBOVUxMOwogICAgb2JqZWN0LT5tYXRlcmlhbCA9IDA7CiAgICBvYmplY3QtPnRhcmdldCA9IHRhcmdldDsKCiAgICBvYmplY3QtPkhhbmRsZXMgPSBOVUxMOwogICAgb2JqZWN0LT5udW1IYW5kbGVzID0gMDsKCiAgICAvKiBUaGlzIGlzIGZvciBjb252ZW5pZW5jZSAqLwogICAgb2JqZWN0LT53aW5lRDNERGV2aWNlID0gVGhpcy0+d2luZUQzRERldmljZTsKCiAgICAvKiBDcmVhdGUgYW4gaW5kZXggYnVmZmVyLCBpdCdzIG5lZWRlZCBmb3IgaW5kZXhlZCBkcmF3aW5nICovCiAgICBJbmRleEJ1ZmZlclBhcmVudCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoSVBhcmVudEltcGwgKikpOwogICAgaWYoIUluZGV4QnVmZmVyUGFyZW50KQogICAgewogICAgICAgIEVSUigiQWxsb2NhdGluZyBtZW1vcnkgZm9yIGFuIGluZGV4IGJ1ZmZlciBwYXJlbnQgZmFpbGVkXG4iKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwogICAgfQogICAgSUNPTV9JTklUX0lOVEVSRkFDRShJbmRleEJ1ZmZlclBhcmVudCwgSVBhcmVudCwgSVBhcmVudF9WdGJsKTsKICAgIEluZGV4QnVmZmVyUGFyZW50LT5yZWYgPSAxOwoKICAgIC8qIENyZWF0ZSBhbiBJbmRleCBCdWZmZXIuIFdpbmVEM0QgbmVlZHMgb25lIGZvciBEcmF3aW5nIGluZGV4ZWQgcHJpbWl0aXZlcwogICAgICogQ3JlYXRlIGEgKGhvcGVmdWxseSkgbG9uZyBlbm91Z2ggYnVmZmVyLCBhbmQgY29weSB0aGUgaW5kaWNlcyBpbnRvIGl0CiAgICAgKiBJZGVhbGx5LCBhIElXaW5lRDNESW5kZXhCdWZmZXI6OlNldERhdGEgbWV0aG9kIGNvdWxkIGJlIGNyZWF0ZWQsIHdoaWNoCiAgICAgKiB0YWtlcyB0aGUgcG9pbnRlciBhbmQgYXZvaWRzIHRoZSBtZW1jcHkKICAgICAqLwogICAgaHIgPSBJV2luZUQzRERldmljZV9DcmVhdGVJbmRleEJ1ZmZlcihUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwLCAvKiBMZW5ndGguIERvbid0IGtub3cgaG93IGxvbmcgaXQgc2hvdWxkIGJlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RVU0FHRV9EWU5BTUlDLCAvKiBVc2FnZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk1UX0lOREVYMTYsIC8qIEZvcm1hdC4gRDNENyB1c2VzIFdPUkRTICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQT09MX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3QtPmluZGV4YnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElVbmtub3duICopIElDT01fSU5URVJGQUNFKEluZGV4QnVmZmVyUGFyZW50LCBJUGFyZW50KSk7CgogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICBFUlIoIkZhaWxlZCB0byBjcmVhdGUgYW4gaW5kZXggYnVmZmVyXG4iKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQogICAgSW5kZXhCdWZmZXJQYXJlbnQtPmNoaWxkID0gKElVbmtub3duICopIG9iamVjdC0+aW5kZXhidWZmZXI7CgogICAgLyogTm8gbmVlZCB0byBzZXQgdGhlIGluZGljZXMsIGl0J3MgZG9uZSB3aGVuIG5lY2Vzc2FyeSAqLwoKICAgIC8qIEFkZFJlZiB0aGUgV2luZUQzRCBEZXZpY2UgKi8KICAgIElXaW5lRDNERGV2aWNlX0FkZFJlZihUaGlzLT53aW5lRDNERGV2aWNlKTsKCiAgICAvKiBEb24ndCBmb3JnZXQgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgOykgKi8KICAgICpEZXZpY2UgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZTcpOwoKICAgIFRSQUNFKCIgKCVwKSBDcmVhdGVkIGFuIElEaXJlY3QzRERldmljZUltcGwgb2JqZWN0IGF0ICVwXG4iLCBUaGlzLCBvYmplY3QpOwoKICAgIC8qIFRoaXMgaXMgZm9yIGFwcHMgd2hpY2ggY3JlYXRlIGEgbm9uLWZsaXAsIG5vbi1kM2QgcHJpbWFyeSBzdXJmYWNlCiAgICAgKiBhbmQgYW4gb2Zmc2NyZWVuIEQzRERFVklDRSBzdXJmYWNlLCB0aGVuIHJlbmRlciB0byB0aGUgb2Zmc2NyZWVuIHN1cmZhY2UKICAgICAqIGFuZCBkbyBhIEJsdCBmcm9tIHRoZSBvZmZzY3JlZW4gdG8gdGhlIHByaW1hcnkgc3VyZmFjZS4KICAgICAqCiAgICAgKiBTZXQgdGhlIG9mZnNjcmVlbiBEM0REREVWSUNFIHN1cmZhY2UoPXRhcmdldCkgYXMgdGhlIGJhY2sgYnVmZmVyLAogICAgICogYW5kIHRoZSBwcmltYXJ5IHN1cmZhY2UoPVRoaXMtPmQzZF90YXJnZXQpIGFzIHRoZSBmcm9udCBidWZmZXIuCiAgICAgKgogICAgICogVGhpcyB3YXkgdGhlIGFwcCB3aWxsIHJlbmRlciB0byB0aGUgRDNEREVWSUNFIHN1cmZhY2UgYW5kIFdpbmVEM0QKICAgICAqIHdpbGwgY2F0Y2ggdGhlIEJsdCB3YXMgQmFjayBCdWZmZXIgLT4gRnJvbnQgYnVmZmVyIGJsdCBhbmQgcGVyZm9ybQogICAgICogYSBmbGlwIGluc3RlYWQuIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIGEgbWl4ZWQgR0wgLyBHREkKICAgICAqIGVudmlyb25tZW50LgogICAgICoKICAgICAqIFRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgYWdhaW5zdCB3aW5kb3dlZCBhcHBzLiBUaGUgb25seSBhcHAgdGVzdGVkIHdpdGgKICAgICAqIHRoaXMgaXMgbW90byByYWNlciAyIGR1cmluZyB0aGUgbG9hZGluZyBzY3JlZW4uCiAgICAgKi8KICAgIFRSQUNFKCJJc3JlbmRlcnRhcmdldDogJXMsIGQzZF90YXJnZXQ9JXBcbiIsIHRhcmdldC0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSA/ICJ0cnVlIiA6ICJmYWxzZSIsIFRoaXMtPmQzZF90YXJnZXQpOwogICAgaWYoISh0YXJnZXQtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpICYmCiAgICAgICAoVGhpcy0+ZDNkX3RhcmdldCAhPSB0YXJnZXQpKQogICAgewogICAgICAgIFdJTkVEM0RWSUVXUE9SVCB2cDsKICAgICAgICBUUkFDRSgiKCVwKSBVc2luZyAlcCBhcyBmcm9udCBidWZmZXIsICVwIGFzIGJhY2sgYnVmZmVyXG4iLCBUaGlzLCBUaGlzLT5kM2RfdGFyZ2V0LCB0YXJnZXQpOwogICAgICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0RnJvbnRCYWNrQnVmZmVycyhUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5kM2RfdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSk7CiAgICAgICAgaWYoaHIgIT0gRDNEX09LKQogICAgICAgICAgICBFUlIoIiglcCkgRXJyb3IgJTA4eCBzZXR0aW5nIHRoZSBmcm9udCBhbmQgYmFjayBidWZmZXJcbiIsIFRoaXMsIGhyKTsKCiAgICAgICAgLyogUmVuZGVyIHRvIHRoZSBiYWNrIGJ1ZmZlciAqLwogICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclRhcmdldChUaGlzLT53aW5lRDNERGV2aWNlLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPldpbmVEM0RTdXJmYWNlKTsKCiAgICAgICAgdnAuWCA9IDA7CiAgICAgICAgdnAuWSA9IDA7CiAgICAgICAgdnAuV2lkdGggPSB0YXJnZXQtPnN1cmZhY2VfZGVzYy5kd1dpZHRoOwogICAgICAgIHZwLkhlaWdodCA9IHRhcmdldC0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OwogICAgICAgIHZwLk1pblogPSAwLjA7CiAgICAgICAgdnAuTWF4WiA9IDEuMDsKICAgICAgICBJV2luZUQzRERldmljZV9TZXRWaWV3cG9ydChUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2cCk7CgogICAgICAgIG9iamVjdC0+T2ZmU2NyZWVuVGFyZ2V0ID0gVFJVRTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBvYmplY3QtPk9mZlNjcmVlblRhcmdldCA9IEZBTFNFOwogICAgfQoKICAgIC8qIEFkZFJlZiB0aGUgcmVuZGVyIHRhcmdldC4gQWxzbyBBZGRSZWYgdGhlIHJlbmRlciB0YXJnZXQgZnJvbSBkZHJhdywKICAgICAqIGJlY2F1c2UgaWYgaXQgaXMgcmVsZWFzZWQgYmVmb3JlIHRoZSBhcHAgcmVsZWFzZXMgdGhlIEQzRCBkZXZpY2UsIHRoZSBEM0QgY2FwYWJpbGl0aWVzCiAgICAgKiBvZiBXaW5lRDNEIHdpbGwgYmUgdW5pbml0aWFsaXplZCwgd2hpY2ggaGFzIGJhZCBlZmZlY3RzLgogICAgICoKICAgICAqIEluIG1vc3QgY2FzZXMsIHRob3NlIHN1cmZhY2VzIGFyZSB0aGUgc3VyZmFjZXMgYXJlIHRoZSBzYW1lIGFueXdheSwgYnV0IHRoaXMgd2lsbCBzaW1wbHkKICAgICAqIGFkZCBhbm90aGVyIHJlZiB3aGljaCBpcyByZWxlYXNlZCB3aGVuIHRoZSBkZXZpY2UgaXMgZGVzdHJveWVkLgogICAgICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihTdXJmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMtPmQzZF90YXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKCiAgICBUaGlzLT5kM2RkZXZpY2UgPSBvYmplY3Q7CgogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RSU19aRU5BQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlSW1wbF9VcGRhdGVEZXB0aFN0ZW5jaWwob2JqZWN0KSk7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVEZXZpY2UoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTQgKlN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMyAqKkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXAsJXApOiBUaHVua2luZyB0byBJRGlyZWN0M0Q3XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIFN1cmZhY2UsIERldmljZSwgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyICE9IE5VTEwpCiAgICAgICAgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKCiAgICBociA9ICBJRGlyZWN0M0Q3X0NyZWF0ZURldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0RHJhd1N1cmZhY2U3ICopIFN1cmZhY2UgLyogU2FtZSBWVGFibGVzICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRERldmljZTcgKiopIERldmljZSk7CgogICAgKkRldmljZSA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2UzLCAqRGV2aWNlKTsKICAgIHJldHVybiBocjsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVEZXZpY2UoSURpcmVjdDNEMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UyICoqRGV2aWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdDNEN1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBTdXJmYWNlLCBEZXZpY2UpOwoKICAgIGhyID0gIElEaXJlY3QzRDdfQ3JlYXRlRGV2aWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIElEaXJlY3REcmF3U3VyZmFjZTcsIFN1cmZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRERldmljZTcgKiopIERldmljZSk7CgogICAgKkRldmljZSA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2UyLCAqRGV2aWNlKTsKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDc6OkNyZWF0ZVZlcnRleEJ1ZmZlcgogKgogKiBDcmVhdGVzIGEgbmV3IHZlcnRleCBidWZmZXIgb2JqZWN0IGFuZCByZXR1cm5zIGEgSURpcmVjdDNEVmVydGV4QnVmZmVyNwogKiBpbnRlcmZhY2UuCiAqCiAqIFZlcnNpb24gMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICBEZXNjOiBSZXF1ZXN0ZWQgVmVydGV4IGJ1ZmZlciBwcm9wZXJ0aWVzCiAqICBWZXJ0ZXhCdWZmZXI6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAogKiAgRmxhZ3M6IFNvbWUgZmxhZ3MsIG11c3QgYmUgMAogKgogKiBSZXR1cm5zCiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCiAqICBUaGUgcmV0dXJuIHZhbHVlIG9mIElXaW5lRDNERGV2aWNlOjpDcmVhdGVWZXJ0ZXhCdWZmZXIgaWYgdGhpcyBjYWxsIGZhaWxzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERlc2Mgb3IgVmVydGV4QnVmZmVyIGFyZSBOVUxMLCBvciBGbGFncyAhPSAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19DcmVhdGVWZXJ0ZXhCdWZmZXIoSURpcmVjdDNENyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYQlVGRkVSREVTQyAqRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICoqVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKm9iamVjdDsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCUwOHgpXG4iLCBUaGlzLCBEZXNjLCBWZXJ0ZXhCdWZmZXIsIEZsYWdzKTsKCiAgICBUUkFDRSgiKCVwKSBWZXJ0ZXggYnVmZmVyIGRlc2NyaXB0aW9uOlxuIiwgVGhpcyk7CiAgICBUUkFDRSgiKCVwKSAgZHdTaXplPSVkXG4iLCBUaGlzLCBEZXNjLT5kd1NpemUpOwogICAgVFJBQ0UoIiglcCkgIGR3Q2Fwcz0lMDh4XG4iLCBUaGlzLCBEZXNjLT5kd0NhcHMpOwogICAgVFJBQ0UoIiglcCkgIEZWRj0lMDh4XG4iLCBUaGlzLCBEZXNjLT5kd0ZWRik7CiAgICBUUkFDRSgiKCVwKSAgZHdOdW1WZXJ0aWNlcz0lZFxuIiwgVGhpcywgRGVzYy0+ZHdOdW1WZXJ0aWNlcyk7CgogICAgLyogRDNENyBTREs6ICJObyBGbGFncyBhcmUgY3VycmVudGx5IGRlZmluZWQgZm9yIHRoaXMgbWV0aG9kLiBUaGlzCiAgICAgKiBwYXJhbWV0ZXIgbXVzdCBiZSAwIgogICAgICoKICAgICAqIE5ldmVyIHRydXN0IHRoZSBkb2N1bWVudGF0aW9uIC0gdGhpcyBpcyB3cm9uZwogICAgaWYoRmxhZ3MgIT0gMCkKICAgIHsKICAgICAgICBFUlIoIiglcCkgRmxhZ3MgaXMgJTA4bHgsIHJldHVybmluZyBEREVSUl9JTlZBTElEUEFSQU1TXG4iLCBUaGlzLCBGbGFncyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CiAgICAgKi8KCiAgICAvKiBXZWxsLCB0aGlzIHNvdW5kcyBzYW5lICovCiAgICBpZiggKCFWZXJ0ZXhCdWZmZXIpIHx8ICghRGVzYykgKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIC8qIE5vdyBjcmVhdGUgdGhlIHZlcnRleCBidWZmZXIgKi8KICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCkpOwogICAgaWYoIW9iamVjdCkKICAgIHsKICAgICAgICBFUlIoIiglcCkgT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgYSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsIHN0cnVjdHVyZVxuIiwgVGhpcyk7CiAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwogICAgfQoKICAgIG9iamVjdC0+cmVmID0gMTsKICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyMV9WdGJsKTsKCiAgICBvYmplY3QtPkNhcHMgPSBEZXNjLT5kd0NhcHM7CiAgICBvYmplY3QtPmRkcmF3ID0gVGhpczsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaHIgPSBJV2luZUQzRERldmljZV9DcmVhdGVWZXJ0ZXhCdWZmZXIoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShEZXNjLT5kd0ZWRikgKiBEZXNjLT5kd051bVZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYy0+ZHdDYXBzICYgRDNEVkJDQVBTX1dSSVRFT05MWSA/IFdJTkVEM0RVU0FHRV9XUklURU9OTFkgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYy0+ZHdGVkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjLT5kd0NhcHMgJiBEM0RWQkNBUFNfU1lTVEVNTUVNT1JZID8gV0lORUQzRFBPT0xfU1lTVEVNTUVNIDogV0lORUQzRFBPT0xfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3QtPndpbmVEM0RWZXJ0ZXhCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFNoYXJlZEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVW5rbm93biAqKSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpKTsKICAgIGlmKGhyICE9IEQzRF9PSykKICAgIHsKICAgICAgICBFUlIoIiglcCkgSVdpbmVEM0REZXZpY2U6OkNyZWF0ZVZlcnRleEJ1ZmZlciBmYWlsZWQgd2l0aCBocj0lMDh4XG4iLCBUaGlzLCBocik7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqZWN0KTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIGlmIChociA9PSBXSU5FRDNERVJSX0lOVkFMSURDQUxMKQogICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBocjsKICAgIH0KCiAgICBvYmplY3QtPndpbmVEM0RWZXJ0ZXhEZWNsYXJhdGlvbiA9IElEaXJlY3REcmF3SW1wbF9GaW5kRGVjbChUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYy0+ZHdGVkYpOwogICAgaWYoIW9iamVjdC0+d2luZUQzRFZlcnRleERlY2xhcmF0aW9uKQogICAgewogICAgICAgIEVSUigiQ2Fubm90IGZpbmQgdGhlIHZlcnRleCBkZWNsYXJhdGlvbiBmb3IgZnZmICUwOHhcbiIsIERlc2MtPmR3RlZGKTsKICAgICAgICBJV2luZUQzRFZlcnRleEJ1ZmZlcl9SZWxlYXNlKG9iamVjdC0+d2luZUQzRFZlcnRleEJ1ZmZlcik7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqZWN0KTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQogICAgSVdpbmVEM0RWZXJ0ZXhEZWNsYXJhdGlvbl9BZGRSZWYob2JqZWN0LT53aW5lRDNEVmVydGV4RGVjbGFyYXRpb24pOwoKICAgIC8qIFJldHVybiB0aGUgaW50ZXJmYWNlICovCiAgICAqVmVydGV4QnVmZmVyID0gSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KTsKCiAgICBUUkFDRSgiKCVwKSBDcmVhdGVkIG5ldyB2ZXJ0ZXggYnVmZmVyIGltcGxlbWVudGF0aW9uIGF0ICVwLCByZXR1cm5pbmcgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCBvYmplY3QsICpWZXJ0ZXhCdWZmZXIpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfQ3JlYXRlVmVydGV4QnVmZmVyKElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWEJVRkZFUkRFU0MgKkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyICoqVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCwlMDh4LCVwKTogUmVsYXlpbmcgdG8gSURpcmVjdDNEN1xuIiwgVGhpcywgRGVzYywgVmVydGV4QnVmZmVyLCBGbGFncywgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyICE9IE5VTEwpIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgaHIgPSBJRGlyZWN0M0Q3X0NyZWF0ZVZlcnRleEJ1ZmZlcihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKiopIFZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwoKICAgICpWZXJ0ZXhCdWZmZXIgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgSURpcmVjdDNEVmVydGV4QnVmZmVyLCAqVmVydGV4QnVmZmVyKTsKICAgIHJldHVybiBocjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpFbnVtWkJ1ZmZlckZvcm1hdHMKICoKICogRW51bWVyYXRlcyBhbGwgc3VwcG9ydGVkIFogYnVmZmVyIHBpeGVsIGZvcm1hdHMKICoKICogVmVyc2lvbiAzIGFuZCA3CiAqCiAqIFBhcmFtczoKICogIHJlZmlpZERldmljZToKICogIENhbGxiYWNrOiBDYWxsYmFjayB0byBjYWxsIGZvciBlYWNoIHBpeGVsIGZvcm1hdAogKiAgQ29udGV4dDogUG9pbnRlciB0byBwYXNzIGJhY2sgdG8gdGhlIGNhbGxiYWNrCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBDYWxsYmFjayBpcyBOVUxMCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpFbnVtWkJ1ZmZlckZvcm1hdHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF83X0VudW1aQnVmZmVyRm9ybWF0cyhJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByZWZpaWREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29udGV4dCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgaW50IGk7CgogICAgLyogT3JkZXIgbWF0dGVycy4gU3BlY2lmaWNhbGx5LCBCYXR0bGVab25lIElJIChmdWxsIHZlcnNpb24pIGV4cGVjdHMgdGhlCiAgICAgKiAxNi1iaXQgZGVwdGggZm9ybWF0cyB0byBiZSBsaXN0ZWQgYmVmb3JlIHRoZSAyNCBhbmQgMzIgb25lcy4gKi8KICAgIFdJTkVEM0RGT1JNQVQgRm9ybWF0TGlzdFtdID0gewogICAgICAgIFdJTkVEM0RGTVRfRDE1UzEsCiAgICAgICAgV0lORUQzREZNVF9EMTYsCiAgICAgICAgV0lORUQzREZNVF9EMjRYOCwKICAgICAgICBXSU5FRDNERk1UX0QyNFg0UzQsCiAgICAgICAgV0lORUQzREZNVF9EMjRTOCwKICAgICAgICBXSU5FRDNERk1UX0QzMgogICAgfTsKCiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVwKTogUmVsYXlcbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZERldmljZSksIENhbGxiYWNrLCBDb250ZXh0KTsKCiAgICBpZighQ2FsbGJhY2spCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGZvcihpID0gMDsgaSA8IHNpemVvZihGb3JtYXRMaXN0KSAvIHNpemVvZihXSU5FRDNERk9STUFUKTsgaSsrKQogICAgewogICAgICAgIGhyID0gSVdpbmVEM0RfQ2hlY2tEZXZpY2VGb3JtYXQoVGhpcy0+d2luZUQzRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogQWRhcHRlciAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogRGV2aWNlVHlwZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogQWRhcHRlckZvcm1hdCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUwgLyogVXNhZ2UgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFJlc291cmNlVHlwZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdExpc3RbaV0pOwogICAgICAgIGlmKGhyID09IEQzRF9PSykKICAgICAgICB7CiAgICAgICAgICAgIEREUElYRUxGT1JNQVQgcGZvcm1hdDsKCiAgICAgICAgICAgIG1lbXNldCgmcGZvcm1hdCwgMCwgc2l6ZW9mKHBmb3JtYXQpKTsKICAgICAgICAgICAgcGZvcm1hdC5kd1NpemUgPSBzaXplb2YocGZvcm1hdCk7CiAgICAgICAgICAgIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKCZwZm9ybWF0LCBGb3JtYXRMaXN0W2ldKTsKCiAgICAgICAgICAgIFRSQUNFKCJFbnVtZXJhdGluZyBXaW5lRDNERm9ybWF0ICVkXG4iLCBGb3JtYXRMaXN0W2ldKTsKICAgICAgICAgICAgaHIgPSBDYWxsYmFjaygmcGZvcm1hdCwgQ29udGV4dCk7CiAgICAgICAgICAgIGlmKGhyICE9IERERU5VTVJFVF9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIkZvcm1hdCBlbnVtZXJhdGlvbiBjYW5jZWxsZWQgYnkgYXBwbGljYXRpb25cbiIpOwogICAgICAgICAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RfT0s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBUUkFDRSgiRW5kIG9mIGVudW1lcmF0aW9uXG4iKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8zX0VudW1aQnVmZmVyRm9ybWF0cyhJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByaWlkRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNENyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWREZXZpY2UpLCBDYWxsYmFjaywgQ29udGV4dCk7CiAgICByZXR1cm4gSURpcmVjdDNEN19FbnVtWkJ1ZmZlckZvcm1hdHMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNENyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDc6OkV2aWN0TWFuYWdlZFRleHR1cmVzCiAqCiAqIFJlbW92ZXMgYWxsIG1hbmFnZWQgdGV4dHVyZXMgKD1zdXJmYWNlcyB3aXRoIEREU0NBUFMyX1RFWFRVUkVNQU5BR0Ugb3IKICogRERTQ0FQUzJfRDNEVEVYVFVSRU1BTkFHRSBjYXBzKSB0byBiZSByZW1vdmVkIGZyb20gdmlkZW8gbWVtb3J5LgogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUmV0dXJuczoKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzdfRXZpY3RNYW5hZ2VkVGV4dHVyZXMoSURpcmVjdDNENyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgRklYTUUoIiglcCk6IFN0dWIhXG4iLCBUaGlzKTsKCiAgICAvKiBJbXBsZW1lbnRhdGlvbiBpZGVhOgogICAgICogQWRkIGFuIElXaW5lRDNEU3VyZmFjZSBtZXRob2Qgd2hpY2ggc2V0cyB0aGUgb3BlbmdsIHRleHR1cmUKICAgICAqIHByaW9yaXR5IGxvdyBvciBldmVuIHJlbW92ZXMgdGhlIG9wZW5nbCB0ZXh0dXJlLgogICAgICovCgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19FdmljdE1hbmFnZWRUZXh0dXJlcyhJRGlyZWN0M0QzICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNENyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKICAgIHJldHVybiBJRGlyZWN0M0Q3X0V2aWN0TWFuYWdlZFRleHR1cmVzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREltcGxfR2V0Q2FwcwogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZGV2aWNlIGNhcHMgZnJvbSB3aW5lZDNkCiAqIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgRDNENyBhbmQgRDNEIC0gRDNEMyBzdHJ1Y3R1cmUKICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBjYWxsZWQgZnJvbSB2YXJpb3VzIHBsYWNlcyBpbiBkZHJhdwogKgogKiBQYXJhbXM6CiAqICBXaW5lRDNEOiBUaGUgaW50ZXJmYWNlIHRvIGdldCB0aGUgY2FwcyBmcm9tCiAqICBEZXNjMTIzOiBPbGQgRDNEIDwzIHN0cnVjdHVyZSB0byBmaWxsIChuZWVkZWQpCiAqICBEZXNjNzogRDNENyBkZXZpY2UgZGVzYyBzdHJ1Y3R1cmUgdG8gZmlsbCAobmVlZGVkKQogKgogKiBSZXR1cm5zCiAqICBEM0RfT0sgb24gc3VjY2Vzcywgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiBJV2luZUQzRDo6R2V0Q2FwcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhSRVNVTFQKSURpcmVjdDNESW1wbF9HZXRDYXBzKElXaW5lRDNEICpXaW5lRDNELAogICAgICAgICAgICAgICAgICAgICAgRDNEREVWSUNFREVTQyAqRGVzYzEyMywKICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0M3ICpEZXNjNykKewogICAgV0lORUQzRENBUFMgV0NhcHM7CiAgICBIUkVTVUxUIGhyOwoKICAgIC8qIFNvbWUgVmFyaWFibGVzIHRvIGFzaWduIHRvIHRoZSBwb2ludGVycyBpbiBXQ2FwcyAqLwogICAgV0lORUQzRERFVlRZUEUgRGV2VHlwZTsKICAgIFVJTlQgZHVtbXlfdWludDsKICAgIGZsb2F0IGR1bW15X2Zsb2F0OwogICAgRFdPUkQgZHVtbXlfZHdvcmQsIE1heFRleHR1cmVCbGVuZFN0YWdlcywgTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXM7CiAgICBEV09SRCBNYXhVc2VyQ2xpcFBsYW5lcywgTWF4VmVydGV4QmxlbmRNYXRyaWNlczsKCiAgICBUUkFDRSgiKCktPiglcCwlcCwlcFxuIiwgV2luZUQzRCwgRGVzYzEyMywgRGVzYzcpOwoKICAgIC8qIEFzaWduIHRoZSBwb2ludGVycyBpbiBXQ2FwcyAqLwogICAgV0NhcHMuRGV2aWNlVHlwZSA9ICZEZXZUeXBlOwogICAgV0NhcHMuQWRhcHRlck9yZGluYWwgPSAmZHVtbXlfdWludDsKCiAgICBXQ2Fwcy5DYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuQ2FwczIgPSAmZHVtbXlfZHdvcmQ7CiAgICBXQ2Fwcy5DYXBzMyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLlByZXNlbnRhdGlvbkludGVydmFscyA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5DdXJzb3JDYXBzID0gJmR1bW15X2R3b3JkOwoKICAgIFdDYXBzLkRldkNhcHMgPSAmRGVzYzctPmR3RGV2Q2FwczsKICAgIFdDYXBzLlByaW1pdGl2ZU1pc2NDYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuUmFzdGVyQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdSYXN0ZXJDYXBzOwogICAgV0NhcHMuWkNtcENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3WkNtcENhcHM7CiAgICBXQ2Fwcy5TcmNCbGVuZENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzOwogICAgV0NhcHMuRGVzdEJsZW5kQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdEZXN0QmxlbmRDYXBzOwogICAgV0NhcHMuQWxwaGFDbXBDYXBzID0gJkRlc2M3LT5kcGNMaW5lQ2Fwcy5kd0FscGhhQ21wQ2FwczsKICAgIFdDYXBzLlNoYWRlQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdTaGFkZUNhcHM7CiAgICBXQ2Fwcy5UZXh0dXJlQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwczsKICAgIFdDYXBzLlRleHR1cmVGaWx0ZXJDYXBzID0gJkRlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzOwogICAgV0NhcHMuQ3ViZVRleHR1cmVGaWx0ZXJDYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuVm9sdW1lVGV4dHVyZUZpbHRlckNhcHMgPSAmZHVtbXlfZHdvcmQ7CiAgICBXQ2Fwcy5UZXh0dXJlQWRkcmVzc0NhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzOwogICAgV0NhcHMuVm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0gJmR1bW15X2R3b3JkOwoKICAgIFdDYXBzLkxpbmVDYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuTWF4VGV4dHVyZVdpZHRoID0gJkRlc2M3LT5kd01heFRleHR1cmVXaWR0aDsKICAgIFdDYXBzLk1heFRleHR1cmVIZWlnaHQgPSAmRGVzYzctPmR3TWF4VGV4dHVyZUhlaWdodDsKICAgIFdDYXBzLk1heFZvbHVtZUV4dGVudCA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5NYXhUZXh0dXJlUmVwZWF0ID0gJkRlc2M3LT5kd01heFRleHR1cmVSZXBlYXQ7CiAgICBXQ2Fwcy5NYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSAmRGVzYzctPmR3TWF4VGV4dHVyZUFzcGVjdFJhdGlvOwogICAgV0NhcHMuTWF4QW5pc290cm9weSA9ICZEZXNjNy0+ZHdNYXhBbmlzb3Ryb3B5OwogICAgV0NhcHMuTWF4VmVydGV4VyA9ICZEZXNjNy0+ZHZNYXhWZXJ0ZXhXOwoKICAgIFdDYXBzLkd1YXJkQmFuZExlZnQgPSAmRGVzYzctPmR2R3VhcmRCYW5kTGVmdDsKICAgIFdDYXBzLkd1YXJkQmFuZFRvcCA9ICZEZXNjNy0+ZHZHdWFyZEJhbmRUb3A7CiAgICBXQ2Fwcy5HdWFyZEJhbmRSaWdodCA9ICZEZXNjNy0+ZHZHdWFyZEJhbmRSaWdodDsKICAgIFdDYXBzLkd1YXJkQmFuZEJvdHRvbSA9ICZEZXNjNy0+ZHZHdWFyZEJhbmRCb3R0b207CgogICAgV0NhcHMuRXh0ZW50c0FkanVzdCA9ICZEZXNjNy0+ZHZFeHRlbnRzQWRqdXN0OwogICAgV0NhcHMuU3RlbmNpbENhcHMgPSAmRGVzYzctPmR3U3RlbmNpbENhcHM7CgogICAgV0NhcHMuRlZGQ2FwcyA9ICZEZXNjNy0+ZHdGVkZDYXBzOwogICAgV0NhcHMuVGV4dHVyZU9wQ2FwcyA9ICZEZXNjNy0+ZHdUZXh0dXJlT3BDYXBzOwogICAgV0NhcHMuTWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gJk1heFRleHR1cmVCbGVuZFN0YWdlczsKICAgIFdDYXBzLk1heFNpbXVsdGFuZW91c1RleHR1cmVzID0gJk1heFNpbXVsdGFuZW91c1RleHR1cmVzOwoKICAgIFdDYXBzLlZlcnRleFByb2Nlc3NpbmdDYXBzID0gJkRlc2M3LT5kd1ZlcnRleFByb2Nlc3NpbmdDYXBzOwogICAgV0NhcHMuTWF4QWN0aXZlTGlnaHRzID0gJkRlc2M3LT5kd01heEFjdGl2ZUxpZ2h0czsKICAgIFdDYXBzLk1heFVzZXJDbGlwUGxhbmVzID0gJk1heFVzZXJDbGlwUGxhbmVzOwogICAgV0NhcHMuTWF4VmVydGV4QmxlbmRNYXRyaWNlcyA9ICZNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzOwogICAgV0NhcHMuTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5NYXhQb2ludFNpemUgPSAmZHVtbXlfZmxvYXQ7CiAgICBXQ2Fwcy5NYXhQcmltaXRpdmVDb3VudCA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLk1heFZlcnRleEluZGV4ID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuTWF4U3RyZWFtcyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLk1heFN0cmVhbVN0cmlkZSA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5WZXJ0ZXhTaGFkZXJWZXJzaW9uID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuTWF4VmVydGV4U2hhZGVyQ29uc3QgPSAmZHVtbXlfZHdvcmQ7CgogICAgV0NhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuUGl4ZWxTaGFkZXIxeE1heFZhbHVlID0gJmR1bW15X2Zsb2F0OwoKICAgIC8qIFRoZXNlIGFyZSBkeDkgb25seSwgc2V0IHRoZW0gdG8gTlVMTCAqLwogICAgV0NhcHMuRGV2Q2FwczIgPSBOVUxMOwogICAgV0NhcHMuTWF4TnBhdGNoVGVzc2VsbGF0aW9uTGV2ZWwgPSBOVUxMOwogICAgV0NhcHMuUmVzZXJ2ZWQ1ID0gTlVMTDsKICAgIFdDYXBzLk1hc3RlckFkYXB0ZXJPcmRpbmFsID0gTlVMTDsKICAgIFdDYXBzLkFkYXB0ZXJPcmRpbmFsSW5Hcm91cCA9IE5VTEw7CiAgICBXQ2Fwcy5OdW1iZXJPZkFkYXB0ZXJzSW5Hcm91cCA9IE5VTEw7CiAgICBXQ2Fwcy5EZWNsVHlwZXMgPSBOVUxMOwogICAgV0NhcHMuTnVtU2ltdWx0YW5lb3VzUlRzID0gTlVMTDsKICAgIFdDYXBzLlN0cmV0Y2hSZWN0RmlsdGVyQ2FwcyA9IE5VTEw7CiAgICAvKiBXQ2Fwcy5WUzIwQ2FwcyA9IE5VTEw7ICovCiAgICAvKiBXQ2Fwcy5QUzIwQ2FwcyA9IE5VTEw7ICovCiAgICBXQ2Fwcy5WZXJ0ZXhUZXh0dXJlRmlsdGVyQ2FwcyA9IE5VTEw7CiAgICBXQ2Fwcy5NYXhWU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSBOVUxMOwogICAgV0NhcHMuTWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gTlVMTDsKICAgIFdDYXBzLk1heFZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IE5VTEw7CiAgICBXQ2Fwcy5NYXhQaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IE5VTEw7CiAgICBXQ2Fwcy5SZXNlcnZlZDIgPSBOVUxMOwogICAgV0NhcHMuUmVzZXJ2ZWQzID0gTlVMTDsKCiAgICAvKiBOb3cgZ2V0IHRoZSBjYXBzICovCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaHIgPSBJV2luZUQzRF9HZXREZXZpY2VDYXBzKFdpbmVEM0QsIDAsIFdJTkVEM0RERVZUWVBFX0hBTCwgJldDYXBzKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBpZihociAhPSBEM0RfT0spCiAgICB7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQoKICAgIC8qIFJlbW92ZSBhbGwgbm9uLWQzZDcgY2FwcyAqLwogICAgRGVzYzctPmR3RGV2Q2FwcyAmPSAoCiAgICAgICAgRDNEREVWQ0FQU19GTE9BVFRMVkVSVEVYICAgICAgICAgfCBEM0RERVZDQVBTX1NPUlRJTkNSRUFTSU5HWiAgICAgICAgICB8IEQzRERFVkNBUFNfU09SVERFQ1JFQVNJTkdaICAgICAgICAgIHwKICAgICAgICBEM0RERVZDQVBTX1NPUlRFWEFDVCAgICAgICAgICAgICB8IEQzRERFVkNBUFNfRVhFQ1VURVNZU1RFTU1FTU9SWSAgICAgIHwgRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgICAgICAgfAogICAgICAgIEQzRERFVkNBUFNfVExWRVJURVhTWVNURU1NRU1PUlkgIHwgRDNEREVWQ0FQU19UTFZFUlRFWFZJREVPTUVNT1JZICAgICAgfCBEM0RERVZDQVBTX1RFWFRVUkVTWVNURU1NRU1PUlkgICAgICB8CiAgICAgICAgRDNEREVWQ0FQU19URVhUVVJFVklERU9NRU1PUlkgICAgfCBEM0RERVZDQVBTX0RSQVdQUklNVExWRVJURVggICAgICAgICB8IEQzRERFVkNBUFNfQ0FOUkVOREVSQUZURVJGTElQICAgICAgIHwKICAgICAgICBEM0RERVZDQVBTX1RFWFRVUkVOT05MT0NBTFZJRE1FTSB8IEQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyICAgICAgICAgIHwgRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyAgfAogICAgICAgIEQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyRVggICAgIHwgRDNEREVWQ0FQU19IV1RSQU5TRk9STUFORExJR0hUICAgICAgfCBEM0RERVZDQVBTX0NBTkJMVFNZU1RPTk9OTE9DQUwgICAgICB8CiAgICAgICAgRDNEREVWQ0FQU19IV1JBU1RFUklaQVRJT04pOwoKICAgIERlc2M3LT5kd1N0ZW5jaWxDYXBzICY9ICgKICAgICAgICBEM0RTVEVOQ0lMQ0FQU19LRUVQICAgICAgICAgICAgICB8IEQzRFNURU5DSUxDQVBTX1pFUk8gICAgICAgICAgICAgICAgIHwgRDNEU1RFTkNJTENBUFNfUkVQTEFDRSAgICAgICAgICAgICAgfAogICAgICAgIEQzRFNURU5DSUxDQVBTX0lOQ1JTQVQgICAgICAgICAgIHwgRDNEU1RFTkNJTENBUFNfREVDUlNBVCAgICAgICAgICAgICAgfCBEM0RTVEVOQ0lMQ0FQU19JTlZFUlQgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEU1RFTkNJTENBUFNfSU5DUiAgICAgICAgICAgICAgfCBEM0RTVEVOQ0lMQ0FQU19ERUNSICAgICAgICAgICAgICAgICB8IEQzRFNURU5DSUxDQVBTX1RXT1NJREVEKTsKCiAgICAvKiBGVkYgY2FwcyA/Ki8KCiAgICBEZXNjNy0+ZHdUZXh0dXJlT3BDYXBzICY9ICgKICAgICAgICBEM0RURVhPUENBUFNfRElTQUJMRSAgICAgICAgICAgICB8IEQzRFRFWE9QQ0FQU19TRUxFQ1RBUkcxICAgICAgICAgICAgIHwgRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzIgICAgICAgICAgICAgfAogICAgICAgIEQzRFRFWE9QQ0FQU19NT0RVTEFURSAgICAgICAgICAgIHwgRDNEVEVYT1BDQVBTX01PRFVMQVRFMlggICAgICAgICAgICAgfCBEM0RURVhPUENBUFNfTU9EVUxBVEU0WCAgICAgICAgICAgICB8CiAgICAgICAgRDNEVEVYT1BDQVBTX0FERCAgICAgICAgICAgICAgICAgfCBEM0RURVhPUENBUFNfQUREU0lHTkVEICAgICAgICAgICAgICB8IEQzRFRFWE9QQ0FQU19BRERTSUdORUQyWCAgICAgICAgICAgIHwKICAgICAgICBEM0RURVhPUENBUFNfU1VCVFJBQ1QgICAgICAgICAgICB8IEQzRFRFWE9QQ0FQU19BRERTTU9PVEggICAgICAgICAgICAgIHwgRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBICAgICAgfAogICAgICAgIEQzRFRFWE9QQ0FQU19CTEVOREZBQ1RPUkFMUEhBICAgIHwgRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBUE0gICAgfCBEM0RURVhPUENBUFNfQkxFTkRDVVJSRU5UQUxQSEEgICAgICB8CiAgICAgICAgRDNEVEVYT1BDQVBTX1BSRU1PRFVMQVRFICAgICAgICAgfCBEM0RURVhPUENBUFNfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiB8IEQzRFRFWE9QQ0FQU19NT0RVTEFURUNPTE9SX0FEREFMUEhBIHwKICAgICAgICBEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB8IEQzRFRFWE9QQ0FQU19NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBIHwgRDNEVEVYT1BDQVBTX0JVTVBFTlZNQVAgICAgfAogICAgICAgIEQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQTFVNSU5BTkNFIHwgRDNEVEVYT1BDQVBTX0RPVFBST0RVQ1QzKTsKCiAgICBEZXNjNy0+ZHdWZXJ0ZXhQcm9jZXNzaW5nQ2FwcyAmPSAoCiAgICAgICAgRDNEVlRYUENBUFNfVEVYR0VOICAgICAgICAgICAgICAgfCBEM0RWVFhQQ0FQU19NQVRFUklBTFNPVVJDRTcgICAgICAgICB8IEQzRFZUWFBDQVBTX1ZFUlRFWEZPRyAgICAgICAgICAgICAgIHwKICAgICAgICBEM0RWVFhQQ0FQU19ESVJFQ1RJT05BTExJR0hUUyAgICB8IEQzRFZUWFBDQVBTX1BPU0lUSU9OQUxMSUdIVFMgICAgICAgIHwgRDNEVlRYUENBUFNfTE9DQUxWSUVXRVIpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd01pc2NDYXBzICY9ICgKICAgICAgICBEM0RQTUlTQ0NBUFNfTUFTS1BMQU5FUyAgICAgICAgICB8IEQzRFBNSVNDQ0FQU19NQVNLWiAgICAgICAgICAgICAgICAgIHwgRDNEUE1JU0NDQVBTX0xJTkVQQVRURVJOUkVQICAgICAgICAgfAogICAgICAgIEQzRFBNSVNDQ0FQU19DT05GT1JNQU5UICAgICAgICAgIHwgRDNEUE1JU0NDQVBTX0NVTExOT05FICAgICAgICAgICAgICAgfCBEM0RQTUlTQ0NBUFNfQ1VMTENXICAgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUE1JU0NDQVBTX0NVTExDQ1cpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1Jhc3RlckNhcHMgJj0gKAogICAgICAgIEQzRFBSQVNURVJDQVBTX0RJVEhFUiAgICAgICAgICAgIHwgRDNEUFJBU1RFUkNBUFNfUk9QMiAgICAgICAgICAgICAgICAgfCBEM0RQUkFTVEVSQ0FQU19YT1IgICAgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUFJBU1RFUkNBUFNfUEFUICAgICAgICAgICAgICAgfCBEM0RQUkFTVEVSQ0FQU19aVEVTVCAgICAgICAgICAgICAgICB8IEQzRFBSQVNURVJDQVBTX1NVQlBJWEVMICAgICAgICAgICAgIHwKICAgICAgICBEM0RQUkFTVEVSQ0FQU19TVUJQSVhFTFggICAgICAgICB8IEQzRFBSQVNURVJDQVBTX0ZPR1ZFUlRFWCAgICAgICAgICAgIHwgRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgICAgICAgICAgICAgfAogICAgICAgIEQzRFBSQVNURVJDQVBTX1NUSVBQTEUgICAgICAgICAgIHwgRDNEUFJBU1RFUkNBUFNfQU5USUFMSUFTU09SVERFUEVOREVOVCB8IEQzRFBSQVNURVJDQVBTX0FOVElBTElBU1NPUlRJTkRFUEVOREVOVCB8CiAgICAgICAgRDNEUFJBU1RFUkNBUFNfQU5USUFMSUFTRURHRVMgICAgfCBEM0RQUkFTVEVSQ0FQU19NSVBNQVBMT0RCSUFTICAgICAgICB8IEQzRFBSQVNURVJDQVBTX1pCSUFTICAgICAgICAgICAgICAgIHwKICAgICAgICBEM0RQUkFTVEVSQ0FQU19aQlVGRkVSTEVTU0hTUiAgICB8IEQzRFBSQVNURVJDQVBTX0ZPR1JBTkdFICAgICAgICAgICAgIHwgRDNEUFJBU1RFUkNBUFNfQU5JU09UUk9QWSAgICAgICAgICAgfAogICAgICAgIEQzRFBSQVNURVJDQVBTX1dCVUZGRVIgICAgICAgICAgIHwgRDNEUFJBU1RFUkNBUFNfVFJBTlNMVUNFTlRTT1JUSU5ERVBFTkRFTlQgfCBEM0RQUkFTVEVSQ0FQU19XRk9HICAgICAgICAgICB8CiAgICAgICAgRDNEUFJBU1RFUkNBUFNfWkZPRyk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3WkNtcENhcHMgJj0gKAogICAgICAgIEQzRFBDTVBDQVBTX05FVkVSICAgICAgICAgICAgICAgIHwgRDNEUENNUENBUFNfTEVTUyAgICAgICAgICAgICAgICAgICAgfCBEM0RQQ01QQ0FQU19FUVVBTCAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUENNUENBUFNfTEVTU0VRVUFMICAgICAgICAgICAgfCBEM0RQQ01QQ0FQU19HUkVBVEVSICAgICAgICAgICAgICAgICB8IEQzRFBDTVBDQVBTX05PVEVRVUFMICAgICAgICAgICAgICAgIHwKICAgICAgICBEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgICAgICAgICB8IEQzRFBDTVBDQVBTX0FMV0FZUyk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzICY9ICgKICAgICAgICBEM0RQQkxFTkRDQVBTX1pFUk8gICAgICAgICAgICAgICB8IEQzRFBCTEVORENBUFNfT05FICAgICAgICAgICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSAgICAgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBICAgICAgICAgICB8CiAgICAgICAgRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSAgICAgICAgICB8IEQzRFBCTEVORENBUFNfREVTVENPTE9SICAgICAgICAgICAgIHwKICAgICAgICBEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiAgICAgICB8IEQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgICAgICAgICAgfAogICAgICAgIEQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBKTsKCiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdEZXN0QmxlbmRDYXBzICY9ICgKICAgICAgICBEM0RQQkxFTkRDQVBTX1pFUk8gICAgICAgICAgICAgICB8IEQzRFBCTEVORENBUFNfT05FICAgICAgICAgICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSAgICAgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBICAgICAgICAgICB8CiAgICAgICAgRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSAgICAgICAgICB8IEQzRFBCTEVORENBUFNfREVTVENPTE9SICAgICAgICAgICAgIHwKICAgICAgICBEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiAgICAgICB8IEQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgICAgICAgICAgfAogICAgICAgIEQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBKTsKCiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdBbHBoYUNtcENhcHMgJj0gKAogICAgICAgIEQzRFBDTVBDQVBTX05FVkVSICAgICAgICAgICAgICAgIHwgRDNEUENNUENBUFNfTEVTUyAgICAgICAgICAgICAgICAgICAgfCBEM0RQQ01QQ0FQU19FUVVBTCAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUENNUENBUFNfTEVTU0VRVUFMICAgICAgICAgICAgfCBEM0RQQ01QQ0FQU19HUkVBVEVSICAgICAgICAgICAgICAgICB8IEQzRFBDTVBDQVBTX05PVEVRVUFMICAgICAgICAgICAgICAgIHwKICAgICAgICBEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgICAgICAgICB8IEQzRFBDTVBDQVBTX0FMV0FZUyk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3U2hhZGVDYXBzICY9ICgKICAgICAgICBEM0RQU0hBREVDQVBTX0NPTE9SRkxBVE1PTk8gICAgICB8IEQzRFBTSEFERUNBUFNfQ09MT1JGTEFUUkdCICAgICAgICAgIHwgRDNEUFNIQURFQ0FQU19DT0xPUkdPVVJBVURNT05PICAgICAgfAogICAgICAgIEQzRFBTSEFERUNBUFNfQ09MT1JHT1VSQVVEUkdCICAgIHwgRDNEUFNIQURFQ0FQU19DT0xPUlBIT05HTU9OTyAgICAgICAgfCBEM0RQU0hBREVDQVBTX0NPTE9SUEhPTkdSR0IgICAgICAgICB8CiAgICAgICAgRDNEUFNIQURFQ0FQU19TUEVDVUxBUkZMQVRNT05PICAgfCBEM0RQU0hBREVDQVBTX1NQRUNVTEFSRkxBVFJHQiAgICAgICB8IEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJHT1VSQVVETU9OTyAgIHwKICAgICAgICBEM0RQU0hBREVDQVBTX1NQRUNVTEFSR09VUkFVRFJHQiB8IEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJQSE9OR01PTk8gICAgIHwgRDNEUFNIQURFQ0FQU19TUEVDVUxBUlBIT05HUkdCICAgICAgfAogICAgICAgIEQzRFBTSEFERUNBUFNfQUxQSEFGTEFUQkxFTkQgICAgIHwgRDNEUFNIQURFQ0FQU19BTFBIQUZMQVRTVElQUExFRCAgICAgfCBEM0RQU0hBREVDQVBTX0FMUEhBR09VUkFVREJMRU5EICAgICB8CiAgICAgICAgRDNEUFNIQURFQ0FQU19BTFBIQUdPVVJBVURTVElQUExFRCB8IEQzRFBTSEFERUNBUFNfQUxQSEFQSE9OR0JMRU5EICAgICB8IEQzRFBTSEFERUNBUFNfQUxQSEFQSE9OR1NUSVBQTEVEICAgIHwKICAgICAgICBEM0RQU0hBREVDQVBTX0ZPR0ZMQVQgICAgICAgICAgICB8IEQzRFBTSEFERUNBUFNfRk9HR09VUkFVRCAgICAgICAgICAgIHwgRDNEUFNIQURFQ0FQU19GT0dQSE9ORyk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJj0gKAogICAgICAgIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSAgICAgIHwgRDNEUFRFWFRVUkVDQVBTX1BPVzIgICAgICAgICAgICAgICAgfCBEM0RQVEVYVFVSRUNBUFNfQUxQSEEgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUFRFWFRVUkVDQVBTX1RSQU5TUEFSRU5DWSAgICAgfCBEM0RQVEVYVFVSRUNBUFNfQk9SREVSICAgICAgICAgICAgICB8IEQzRFBURVhUVVJFQ0FQU19TUVVBUkVPTkxZICAgICAgICAgIHwKICAgICAgICBEM0RQVEVYVFVSRUNBUFNfVEVYUkVQRUFUTk9UU0NBTEVEQllTSVpFIHwgRDNEUFRFWFRVUkVDQVBTX0FMUEhBUEFMRVRURXwgRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTCAgfAogICAgICAgIEQzRFBURVhUVVJFQ0FQU19QUk9KRUNURUQgICAgICAgIHwgRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVAgICAgICAgICAgICAgfCBEM0RQVEVYVFVSRUNBUFNfQ09MT1JLRVlCTEVORCk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUZpbHRlckNhcHMgJj0gKAogICAgICAgIEQzRFBURklMVEVSQ0FQU19ORUFSRVNUICAgICAgICAgIHwgRDNEUFRGSUxURVJDQVBTX0xJTkVBUiAgICAgICAgICAgICAgfCBEM0RQVEZJTFRFUkNBUFNfTUlQTkVBUkVTVCAgICAgICAgICB8CiAgICAgICAgRDNEUFRGSUxURVJDQVBTX01JUExJTkVBUiAgICAgICAgfCBEM0RQVEZJTFRFUkNBUFNfTElORUFSTUlQTkVBUkVTVCAgICB8IEQzRFBURklMVEVSQ0FQU19MSU5FQVJNSVBMSU5FQVIgICAgIHwKICAgICAgICBEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UICAgICAgICB8IEQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSICAgICAgICAgIHwgRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyAgICAgfAogICAgICAgIEQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgICAgICAgIHwgRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgICAgICAgICAgfCBEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UICAgICAgICAgICB8CiAgICAgICAgRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgICAgICAgfCBEM0RQVEZJTFRFUkNBUFNfTUFHRkFOSVNPVFJPUElDICAgICB8IEQzRFBURklMVEVSQ0FQU19NQUdGQUZMQVRDVUJJQyAgICAgIHwKICAgICAgICBEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOQ1VCSUMpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVCbGVuZENhcHMgJj0gKAogICAgICAgIEQzRFBUQkxFTkRDQVBTX0RFQ0FMICAgICAgICAgICAgIHwgRDNEUFRCTEVORENBUFNfTU9EVUxBVEUgICAgICAgICAgICAgfCBEM0RQVEJMRU5EQ0FQU19ERUNBTEFMUEhBICAgICAgICAgICB8CiAgICAgICAgRDNEUFRCTEVORENBUFNfTU9EVUxBVEVBTFBIQSAgICAgfCBEM0RQVEJMRU5EQ0FQU19ERUNBTE1BU0sgICAgICAgICAgICB8IEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFTUFTSyAgICAgICAgIHwKICAgICAgICBEM0RQVEJMRU5EQ0FQU19DT1BZICAgICAgICAgICAgICB8IEQzRFBUQkxFTkRDQVBTX0FERCk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzICY9ICgKICAgICAgICBEM0RQVEFERFJFU1NDQVBTX1dSQVAgICAgICAgICAgICB8IEQzRFBUQUREUkVTU0NBUFNfTUlSUk9SICAgICAgICAgICAgIHwgRDNEUFRBRERSRVNTQ0FQU19DTEFNUCAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBUQUREUkVTU0NBUFNfQk9SREVSICAgICAgICAgIHwgRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWKTsKCiAgICBpZighKERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIpKSB7CiAgICAgICAgLyogRGlyZWN0WDcgYWx3YXlzIGhhcyB0aGUgbnAyIGZsYWcgc2V0LCBubyBtYXR0ZXIgd2hhdCB0aGUgY2FyZCBzdXBwb3J0cy4gU29tZSBvbGQgZ2FtZXMocm9sbGNhZ2UpCiAgICAgICAgICogY2hlY2sgdGhlIGNhcHMgaW5jb3JyZWN0bHkuIElmIHdpbmVkM2Qgc3VwcG9ydHMgbm9ucG93MiB0ZXh0dXJlcyBpdCBhbHNvIGhhcyBucDIgY29uZGl0aW9uYWwgc3VwcG9ydAogICAgICAgICAqLwogICAgICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzIHw9IEQzRFBURVhUVVJFQ0FQU19QT1cyIHwgRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTDsKICAgIH0KICAgIC8qIEZpbGwgdGhlIG1pc3NpbmcgbWVtYmVycywgYW5kIGRvIHNvbWUgZml4dXAgKi8KICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1NpemUgPSBzaXplb2YoRGVzYzctPmRwY0xpbmVDYXBzKTsKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVCbGVuZENhcHMgPSBEM0RQVEJMRU5EQ0FQU19BREQgfCBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURU1BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBUQkxFTkRDQVBTX0NPUFkgfCBEM0RQVEJMRU5EQ0FQU19ERUNBTCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFRCTEVORENBUFNfREVDQUxBTFBIQSB8IEQzRFBUQkxFTkRDQVBTX0RFQ0FMTUFTSyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFRCTEVORENBUFNfTU9EVUxBVEUgfCBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURUFMUEhBOwogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3U3RpcHBsZVdpZHRoID0gMzI7CiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTdGlwcGxlSGVpZ2h0ID0gMzI7CiAgICAvKiBVc2UgdGhlIHNhbWUgZm9yIHRoZSBUcmlDYXBzICovCiAgICBEZXNjNy0+ZHBjVHJpQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2FwczsKCiAgICBEZXNjNy0+ZHdEZXZpY2VSZW5kZXJCaXREZXB0aCA9IEREQkRfMTYgfCBEREJEXzI0IHwgRERCRF8zMjsKICAgIERlc2M3LT5kd0RldmljZVpCdWZmZXJCaXREZXB0aCA9IEREQkRfMTYgfCBEREJEXzI0OwogICAgRGVzYzctPmR3TWluVGV4dHVyZVdpZHRoID0gMTsKICAgIERlc2M3LT5kd01pblRleHR1cmVIZWlnaHQgPSAxOwoKICAgIC8qIENvbnZlcnQgRFdPUkRzIHNhZmVseSB0byBXT1JEcyAqLwogICAgaWYoTWF4VGV4dHVyZUJsZW5kU3RhZ2VzID4gNjU1MzUpIERlc2M3LT53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gNjU1MzU7CiAgICBlbHNlIERlc2M3LT53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gKFdPUkQpIE1heFRleHR1cmVCbGVuZFN0YWdlczsKICAgIGlmKE1heFNpbXVsdGFuZW91c1RleHR1cmVzID4gNjU1MzUpIERlc2M3LT53TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSA2NTUzNTsKICAgIGVsc2UgRGVzYzctPndNYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA9IChXT1JEKSBNYXhTaW11bHRhbmVvdXNUZXh0dXJlczsKCiAgICBpZihNYXhVc2VyQ2xpcFBsYW5lcyA+IDY1NTM1KSBEZXNjNy0+d01heFVzZXJDbGlwUGxhbmVzID0gNjU1MzU7CiAgICBlbHNlIERlc2M3LT53TWF4VXNlckNsaXBQbGFuZXMgPSAoV09SRCkgTWF4VXNlckNsaXBQbGFuZXM7CiAgICBpZihNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzID4gNjU1MzUpIERlc2M3LT53TWF4VmVydGV4QmxlbmRNYXRyaWNlcyA9IDY1NTM1OwogICAgZWxzZSBEZXNjNy0+d01heFZlcnRleEJsZW5kTWF0cmljZXMgPSAoV09SRCkgTWF4VmVydGV4QmxlbmRNYXRyaWNlczsKCiAgICBEZXNjNy0+ZGV2aWNlR1VJRCA9IElJRF9JRGlyZWN0M0RUbkxIYWxEZXZpY2U7CgogICAgRGVzYzctPmR3UmVzZXJ2ZWQxID0gMDsKICAgIERlc2M3LT5kd1Jlc2VydmVkMiA9IDA7CiAgICBEZXNjNy0+ZHdSZXNlcnZlZDMgPSAwOwogICAgRGVzYzctPmR3UmVzZXJ2ZWQ0ID0gMDsKCiAgICAvKiBGaWxsIHRoZSBvbGQgc3RydWN0dXJlICovCiAgICBtZW1zZXQoRGVzYzEyMywgMHgwLCBzaXplb2YoRDNEREVWSUNFREVTQykpOwogICAgRGVzYzEyMy0+ZHdTaXplID0gc2l6ZW9mKEQzRERFVklDRURFU0MpOwogICAgRGVzYzEyMy0+ZHdGbGFncyA9IEQzREREX0NPTE9STU9ERUwgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfREVWQ0FQUyAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9UUkFOU0ZPUk1DQVBTICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX0JDTElQUElORyAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfTElHSFRJTkdDQVBTICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9MSU5FQ0FQUyAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX1RSSUNBUFMgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfREVWSUNFUkVOREVSQklUREVQVEggIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9ERVZJQ0VaQlVGRkVSQklUREVQVEggfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX01BWEJVRkZFUlNJWkUgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfTUFYVkVSVEVYQ09VTlQ7CiAgICBEZXNjMTIzLT5kY21Db2xvck1vZGVsID0gRDNEQ09MT1JfUkdCOwogICAgRGVzYzEyMy0+ZHdEZXZDYXBzID0gRGVzYzctPmR3RGV2Q2FwczsKICAgIERlc2MxMjMtPmR0Y1RyYW5zZm9ybUNhcHMuZHdTaXplID0gc2l6ZW9mKEQzRFRSQU5TRk9STUNBUFMpOwogICAgRGVzYzEyMy0+ZHRjVHJhbnNmb3JtQ2Fwcy5kd0NhcHMgPSBEM0RUUkFOU0ZPUk1DQVBTX0NMSVA7CiAgICBEZXNjMTIzLT5iQ2xpcHBpbmcgPSBUUlVFOwogICAgRGVzYzEyMy0+ZGxjTGlnaHRpbmdDYXBzLmR3U2l6ZSA9IHNpemVvZihEM0RMSUdIVElOR0NBUFMpOwogICAgRGVzYzEyMy0+ZGxjTGlnaHRpbmdDYXBzLmR3Q2FwcyA9IEQzRExJR0hUQ0FQU19ESVJFQ1RJT05BTCB8IEQzRExJR0hUQ0FQU19QQVJBTExFTFBPSU5UIHwgRDNETElHSFRDQVBTX1BPSU5UIHwgRDNETElHSFRDQVBTX1NQT1Q7CiAgICBEZXNjMTIzLT5kbGNMaWdodGluZ0NhcHMuZHdMaWdodGluZ01vZGVsID0gRDNETElHSFRJTkdNT0RFTF9SR0I7CiAgICBEZXNjMTIzLT5kbGNMaWdodGluZ0NhcHMuZHdOdW1MaWdodHMgPSBEZXNjNy0+ZHdNYXhBY3RpdmVMaWdodHM7CgogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdTaXplID0gc2l6ZW9mKEQzRFBSSU1DQVBTKTsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3TWlzY0NhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdNaXNjQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3UmFzdGVyQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1Jhc3RlckNhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1pDbXBDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3WkNtcENhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1NyY0JsZW5kQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1NyY0JsZW5kQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3RGVzdEJsZW5kQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd0Rlc3RCbGVuZENhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1NoYWRlQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1NoYWRlQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUZpbHRlckNhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlRmlsdGVyQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVCbGVuZENhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVBZGRyZXNzQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVBZGRyZXNzQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3U3RpcHBsZVdpZHRoID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3U3RpcHBsZVdpZHRoOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdBbHBoYUNtcENhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdBbHBoYUNtcENhcHM7CgogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1NpemUgPSBzaXplb2YoRDNEUFJJTUNBUFMpOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd01pc2NDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdNaXNjQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdSYXN0ZXJDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdSYXN0ZXJDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1pDbXBDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdaQ21wQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdTcmNCbGVuZENhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1NyY0JsZW5kQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdEZXN0QmxlbmRDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdEZXN0QmxlbmRDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1NoYWRlQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3U2hhZGVDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdUZXh0dXJlRmlsdGVyQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3VGV4dHVyZUZpbHRlckNhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQWRkcmVzc0NhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVBZGRyZXNzQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdTdGlwcGxlV2lkdGggPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1N0aXBwbGVXaWR0aDsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdBbHBoYUNtcENhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd0FscGhhQ21wQ2FwczsKCiAgICBEZXNjMTIzLT5kd0RldmljZVJlbmRlckJpdERlcHRoID0gRGVzYzctPmR3RGV2aWNlUmVuZGVyQml0RGVwdGg7CiAgICBEZXNjMTIzLT5kd0RldmljZVpCdWZmZXJCaXREZXB0aCA9IERlc2M3LT5kd0RldmljZVpCdWZmZXJCaXREZXB0aDsKICAgIERlc2MxMjMtPmR3TWF4QnVmZmVyU2l6ZSA9IDA7CiAgICBEZXNjMTIzLT5kd01heFZlcnRleENvdW50ID0gNjU1MzY7CiAgICBEZXNjMTIzLT5kd01pblRleHR1cmVXaWR0aCAgPSBEZXNjNy0+ZHdNaW5UZXh0dXJlV2lkdGg7CiAgICBEZXNjMTIzLT5kd01pblRleHR1cmVIZWlnaHQgPSBEZXNjNy0+ZHdNaW5UZXh0dXJlSGVpZ2h0OwogICAgRGVzYzEyMy0+ZHdNYXhUZXh0dXJlV2lkdGggID0gRGVzYzctPmR3TWF4VGV4dHVyZVdpZHRoOwogICAgRGVzYzEyMy0+ZHdNYXhUZXh0dXJlSGVpZ2h0ID0gRGVzYzctPmR3TWF4VGV4dHVyZUhlaWdodDsKICAgIERlc2MxMjMtPmR3TWluU3RpcHBsZVdpZHRoICA9IDE7CiAgICBEZXNjMTIzLT5kd01pblN0aXBwbGVIZWlnaHQgPSAxOwogICAgRGVzYzEyMy0+ZHdNYXhTdGlwcGxlV2lkdGggID0gMzI7CiAgICBEZXNjMTIzLT5kd01heFN0aXBwbGVIZWlnaHQgPSAzMjsKICAgIERlc2MxMjMtPmR3TWF4VGV4dHVyZVJlcGVhdCA9IERlc2M3LT5kd01heFRleHR1cmVSZXBlYXQ7CiAgICBEZXNjMTIzLT5kd01heFRleHR1cmVBc3BlY3RSYXRpbyA9IERlc2M3LT5kd01heFRleHR1cmVBc3BlY3RSYXRpbzsKICAgIERlc2MxMjMtPmR3TWF4QW5pc290cm9weSA9IERlc2M3LT5kd01heEFuaXNvdHJvcHk7CiAgICBEZXNjMTIzLT5kdkd1YXJkQmFuZExlZnQgPSBEZXNjNy0+ZHZHdWFyZEJhbmRMZWZ0OwogICAgRGVzYzEyMy0+ZHZHdWFyZEJhbmRSaWdodCA9IERlc2M3LT5kdkd1YXJkQmFuZFJpZ2h0OwogICAgRGVzYzEyMy0+ZHZHdWFyZEJhbmRUb3AgPSBEZXNjNy0+ZHZHdWFyZEJhbmRUb3A7CiAgICBEZXNjMTIzLT5kdkd1YXJkQmFuZEJvdHRvbSA9IERlc2M3LT5kdkd1YXJkQmFuZEJvdHRvbTsKICAgIERlc2MxMjMtPmR2RXh0ZW50c0FkanVzdCA9IERlc2M3LT5kdkV4dGVudHNBZGp1c3Q7CiAgICBEZXNjMTIzLT5kd1N0ZW5jaWxDYXBzID0gRGVzYzctPmR3U3RlbmNpbENhcHM7CiAgICBEZXNjMTIzLT5kd0ZWRkNhcHMgPSBEZXNjNy0+ZHdGVkZDYXBzOwogICAgRGVzYzEyMy0+ZHdUZXh0dXJlT3BDYXBzID0gRGVzYzctPmR3VGV4dHVyZU9wQ2FwczsKICAgIERlc2MxMjMtPndNYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSBEZXNjNy0+d01heFRleHR1cmVCbGVuZFN0YWdlczsKICAgIERlc2MxMjMtPndNYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA9IERlc2M3LT53TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXM7CgogICAgcmV0dXJuIEREX09LOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0QgdnRhYmxlcyBpbiB2YXJpb3VzIHZlcnNpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmNvbnN0IElEaXJlY3QzRFZ0YmwgSURpcmVjdDNEMV9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNEIG1ldGhvZHMgKioqLwogICAgSURpcmVjdDNESW1wbF8xX0luaXRpYWxpemUsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfRW51bURldmljZXMsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlTGlnaHQsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlTWF0ZXJpYWwsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlVmlld3BvcnQsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfRmluZERldmljZQp9OwoKY29uc3QgSURpcmVjdDNEMlZ0YmwgSURpcmVjdDNEMl9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNEMiBtZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9FbnVtRGV2aWNlcywKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVMaWdodCwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVWaWV3cG9ydCwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9GaW5kRGV2aWNlLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZURldmljZQp9OwoKY29uc3QgSURpcmVjdDNEM1Z0YmwgSURpcmVjdDNEM19WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNEMyBtZXRob2RzICoqKi8KICAgIElEaXJlY3QzREltcGxfM19FbnVtRGV2aWNlcywKICAgIElEaXJlY3QzREltcGxfM19DcmVhdGVMaWdodCwKICAgIElEaXJlY3QzREltcGxfM19DcmVhdGVNYXRlcmlhbCwKICAgIElEaXJlY3QzREltcGxfM19DcmVhdGVWaWV3cG9ydCwKICAgIElEaXJlY3QzREltcGxfM19GaW5kRGV2aWNlLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX0NyZWF0ZURldmljZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVWZXJ0ZXhCdWZmZXIsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfRW51bVpCdWZmZXJGb3JtYXRzLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX0V2aWN0TWFuYWdlZFRleHR1cmVzCn07Cgpjb25zdCBJRGlyZWN0M0Q3VnRibCBJRGlyZWN0M0Q3X1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNESW1wbF83X1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF83X0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfN19SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0Q3IG1ldGhvZHMgKioqLwogICAgSURpcmVjdDNESW1wbF83X0VudW1EZXZpY2VzLAogICAgSURpcmVjdDNESW1wbF83X0NyZWF0ZURldmljZSwKICAgIElEaXJlY3QzREltcGxfN19DcmVhdGVWZXJ0ZXhCdWZmZXIsCiAgICBJRGlyZWN0M0RJbXBsXzdfRW51bVpCdWZmZXJGb3JtYXRzLAogICAgSURpcmVjdDNESW1wbF83X0V2aWN0TWFuYWdlZFRleHR1cmVzCn07Cg==