LyogRGlyZWN0M0QgVmVydGV4IEJ1ZmZlcgogKiBDb3B5cmlnaHQgKGMpIDIwMDIgTGlvbmVsIFVMTUVSCiAqIENvcHlyaWdodCAoYykgMjAwNiBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QzRFZlcnRleEJ1ZmZlciBDT00gb2JqZWN0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCiNpbmNsdWRlICJleGNwdC5oIgoKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkM2QuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2Q3KTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoZGRyYXdfdGh1bmspOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJVW5rbm93biBNZXRob2RzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3OjpRdWVyeUludGVyZmFjZQogKgogKiBUaGUgUXVlcnlJbnRlcmZhY2UgTWV0aG9kIGZvciBWZXJ0ZXggQnVmZmVycwogKiBGb3IgYSBsaW5rIHRvIFF1ZXJ5SW50ZXJmYWNlIHJ1bGVzLCBzZWUgSURpcmVjdERyYXc3OjpRdWVyeUludGVyZmFjZQogKgogKiBQYXJhbXMKICogIHJpaWQ6IFF1ZXJ5aWVkIEludGVyZmFjZSBpZAogKiAgb2JqOiBBZGRyZXNzIHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKICoKICogUmV0dXJuczoKICogIFNfT0sgb24gc3VjY2VzcwogKiAgRV9OT0lOVEVSRkFDRSBpZiB0aGUgaW50ZXJmYWNlIHdhc24ndCBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKCiAgICAvKiBCeSBkZWZhdWx0LCBzZXQgdGhlIG9iamVjdCBwb2ludGVyIHRvIE5VTEwgKi8KICAgICpvYmogPSBOVUxMOwoKICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sICByaWlkICkgKQogICAgewogICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOwogICAgICAgICpvYmogPSBpZmFjZTsKICAgICAgICBUUkFDRSgiICBDcmVhdGluZyBJVW5rbm93biBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JqKTsKICAgICAgICByZXR1cm4gU19PSzsKICAgIH0KICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEVmVydGV4QnVmZmVyLCByaWlkICkgKQogICAgewogICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOwogICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIpOwogICAgICAgIFRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRFZlcnRleEJ1ZmZlciBpbnRlcmZhY2UgJXBcbiIsICpvYmopOwogICAgICAgIHJldHVybiBTX09LOwogICAgfQogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCByaWlkICkgKQogICAgewogICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOwogICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KTsKICAgICAgICBUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZSAlcFxuIiwgKm9iaik7CiAgICAgICAgcmV0dXJuIFNfT0s7CiAgICB9CiAgICBGSVhNRSgiKCVwKTogaW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSk7CiAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIsIGlmYWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVmVydGV4QnVmZmVyNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYmopOwoKICAgIHJldHVybiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3OjpBZGRSZWYKICoKICogQWRkUmVmIGZvciBWZXJ0ZXggQnVmZmVycwogKgogKiBSZXR1cm5zOgogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkKSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9BZGRSZWYoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIFRSQUNFKCIoJXAvJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIGlmYWNlLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9BZGRSZWYoSURpcmVjdDNEVmVydGV4QnVmZmVyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6UmVsZWFzZQogKgogKiBSZWxlYXNlIGZvciBWZXJ0ZXggQnVmZmVycwogKgogKiBSZXR1cm5zOgogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkKSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9SZWxlYXNlKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgKyAxKTsKCiAgICBpZiAocmVmID09IDApCiAgICB7CiAgICAgICAgSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfUmVsZWFzZShUaGlzLT53aW5lRDNEVmVydGV4QnVmZmVyKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiByZWY7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1JlbGVhc2UoSURpcmVjdDNEVmVydGV4QnVmZmVyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmVydGV4QnVmZmVyIE1ldGhvZHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OkxvY2sKICoKICogTG9ja3MgdGhlIHZlcnRleCBidWZmZXIgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2ZXJ0ZXggZGF0YQogKiBMb2NraW5nIHZlcnRleCBidWZmZXJzIGlzIHNpbWlsYXIgdG8gbG9ja2luZyBzdXJmYWNlcywgYmVjYXVzZSBXaW5kb3dzCiAqIHVzZXMgc3VyZmFjZXMgdG8gc3RvcmUgdmVydGV4IGRhdGEgaW50ZXJuYWxseSAoQWNjb3JkaW5nIHRvIHRoZSBEWCBzZGspCiAqCiAqIFBhcmFtczoKICogIEZsYWdzOiBMb2NraW5nIGZsYWdzLiBSZWxldmFudCBoZXJlIGFyZSBERExPQ0tfUkVBRE9OTFksIERETE9DS19XUklURU9OTFksCiAqICAgICAgICAgRERMT0NLX0RJU0NBUkRDT05URU5UUyBhbmQgRERMT0NLX05PT1ZFUldSSVRFLgogKiAgRGF0YTogIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2ZXJ0ZXggZGF0YQogKiAgU2l6ZTogIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpZiBub3QgTlVMTAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGF0YSBpcyBOVUxMCiAqICBEM0RFUlJfVkVSVEVYQlVGRkVST1BUSU1JWkVEIGlmIGNhbGxlZCBvbiBhbiBvcHRpbWl6ZWQgYnVmZmVyKFdpbmVEM0QpCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfTG9jayhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqU2l6ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpOwogICAgV0lORUQzRFZFUlRFWEJVRkZFUl9ERVNDIERlc2M7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwLCVwKVxuIiwgVGhpcywgRmxhZ3MsIERhdGEsIFNpemUpOwoKICAgIGlmKFNpemUpCiAgICB7CiAgICAgICAgLyogR2V0IHRoZSBzaXplLCBmb3IgcmV0dXJuaW5nIGl0LCBhbmQgZm9yIGxvY2tpbmcgKi8KICAgICAgICBociA9IElXaW5lRDNEVmVydGV4QnVmZmVyX0dldERlc2MoVGhpcy0+d2luZUQzRFZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlc2MpOwogICAgICAgIGlmKGhyICE9IEQzRF9PSykKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiKCVwKSBJV2luZUQzRFZlcnRleEJ1ZmZlcjo6R2V0RGVzYyBmYWlsZWQgd2l0aCBocj0lMDh4XG4iLCBUaGlzLCBocik7CiAgICAgICAgICAgIHJldHVybiBocjsKICAgICAgICB9CiAgICAgICAgKlNpemUgPSBEZXNjLlNpemU7CiAgICB9CgogICAgcmV0dXJuIElXaW5lRDNEVmVydGV4QnVmZmVyX0xvY2soVGhpcy0+d2luZUQzRFZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogT2Zmc2V0VG9Mb2NrICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBTaXplVG9Mb2NrLCAwID09IEZ1bGwgbG9jayAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFICoqKSBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX0xvY2soSURpcmVjdDNEVmVydGV4QnVmZmVyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqU2l6ZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVmVydGV4QnVmZmVyNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBGbGFncywgRGF0YSwgU2l6ZSk7CgogICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfTG9jayhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6VW5sb2NrCiAqCiAqIFVubG9ja3MgYSB2ZXJ0ZXggQnVmZmVyCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1VubG9jayhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpXG4iLCBUaGlzKTsKCiAgICAvKiBUaGlzIGlzIGVhc3kgOikgKi8KICAgIHJldHVybiBJV2luZUQzRFZlcnRleEJ1ZmZlcl9VbmxvY2soVGhpcy0+d2luZUQzRFZlcnRleEJ1ZmZlcik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfVW5sb2NrKElEaXJlY3QzRFZlcnRleEJ1ZmZlciAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVmVydGV4QnVmZmVyNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19VbmxvY2soSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OlByb2Nlc3NWZXJ0aWNlcwogKgogKiBQcm9jZXNzZXMgdW50cmFuc2Zvcm1lZCBWZXJ0aWNlcyBpbnRvIGEgdHJhbnNmb3JtZWQgb3Igb3B0aW1pemVkIHZlcnRleAogKiBidWZmZXIuIEl0IGNhbiBhbHNvIHBlcmZvcm0gb3RoZXIgb3BlcmF0aW9ucywgc3VjaCBhcyBsaWdodGluZyBvciBjbGlwcGluZwogKgogKiBQYXJhbXMKICogIFZlcnRleE9wOiBPcGVyYXRpb24ocykgdG8gcGVyZm9ybTogRDNEVk9QX0NMSVAsIF9FWFRFTlRTLCBfTElHSFQsIF9UUkFOU0ZPUk0KICogIERlc3RJbmRleDogSW5kZXggaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcihUaGlzKSwgd2hlcmUgdGhlIHZlcnRpY2VzIGFyZQogKiAgICAgICAgICAgICBwbGFjZWQKICogIENvdW50OiBOdW1iZXIgb2YgVmVydGljZXMgaW4gdGhlIFNvdXJjZSBidWZmZXIgdG8gcHJvY2VzcwogKiAgU3JjQnVmZmVyOiBTb3VyY2UgdmVydGV4IGJ1ZmZlcgogKiAgU3JjSW5kZXg6IEluZGV4IG9mIHRoZSBmaXJzdCB2ZXJ0ZXggaW4gdGhlIHNyYyBidWZmZXIgdG8gcHJvY2VzcwogKiAgRDNERGV2aWNlOiBEZXZpY2UgdG8gdXNlIGZvciB0cmFuc2Zvcm1hdGlvbgogKiAgRmxhZ3M6IDAgZm9yIGRlZmF1bHQsIEQzRFBWX0RPTk9UQ09QWURBVEEgdG8gcHJldmVudCBjb3B5aW5nCiAqICAgICAgICAgdW5jaGFuZWQgdmVydGljZXMKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIElmIEQzRFZPUF9UUkFOU0ZPUk0gd2Fzbid0IHBhc3NlZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1Byb2Nlc3NWZXJ0aWNlcyhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4T3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIERlc3RJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKlNyY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3JjSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTcgKkQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKlNyYyA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIFNyY0J1ZmZlcik7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpEM0QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBEM0REZXZpY2UpOwogICAgQk9PTCBvbGRDbGlwLCBkb0NsaXA7CiAgICBIUkVTVUxUIGhyOwoKICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlZCwlZCwlcCwlZCwlcCwlMDh4KVxuIiwgVGhpcywgVmVydGV4T3AsIERlc3RJbmRleCwgQ291bnQsIFNyYywgU3JjSW5kZXgsIEQzRCwgRmxhZ3MpOwoKICAgIC8qIFZlcnRleCBvcGVyYXRpb25zOgogICAgICogRDNEVk9QX0NMSVA6IENsaXBzIHZlcnRpY2VzIG91dHNpZGUgdGhlIHZpZXdpbmcgZnJ1c3RydW0uIE5lZWRzIGNsaXBwaW5nIGluZm9ybWF0aW9uCiAgICAgKiBpbiB0aGUgdmVydGV4IGJ1ZmZlciAoQnVmZmVyIG1heSBub3QgYmUgY3JlYXRlZCB3aXRoIEQzRFZCQ0FQU19ET05PVENMSVApCiAgICAgKiBEM0RWT1BfRVhURU5UUzogQ2F1c2VzIHRoZSBzY3JlZW4gZXh0ZW50cyB0byBiZSB1cGRhdGVkIHdoZW4gcmVuZGVyaW5nIHRoZSB2ZXJ0aWNlcwogICAgICogRDNEVk9QX0xJR0hUOiBMaWdodHMgdGhlIHZlcnRpY2VzCiAgICAgKiBEM0RWT1BfVFJBTlNGT1JNOiBUcmFuc2Zvcm0gdGhlIHZlcnRpY2VzLiBUaGlzIGZsYWcgaXMgbmVjZXNzYXJ5CiAgICAgKgogICAgICogV2luZUQzRCBvbmx5IHRyYW5zZm9ybXMgYW5kIGNsaXBzIHRoZSB2ZXJ0aWNlcyBieSBub3csIHNvIEVYVEVOVFMgYW5kIExJR0hUCiAgICAgKiBhcmUgbm90IGltcGxlbWVudGVkLiBDbGlwcGluZyBpcyBkaXNhYmxlZCBBVE0sIGJlY2F1c2Ugb2YgdW5zdXJlIGNvbmRpdGlvbnMuCiAgICAgKi8KICAgIGlmKCAhKFZlcnRleE9wICYgRDNEVk9QX1RSQU5TRk9STSkgKSByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICAvKiBXaW5lRDNEIGRvZXNuJ3Qga25vdyBkM2Q3IHZlcnRleCBvcGVyYXRpb24sIGl0IHVzZXMKICAgICAqIHJlbmRlciBzdGF0ZXMgaW5zdGVhZC4gU2V0IHRoZSByZW5kZXIgc3RhdGVzIGFjY29yZGluZyB0bwogICAgICogdGhlIHZlcnRleCBvcHMKICAgICAqLwogICAgZG9DbGlwID0gVmVydGV4T3AgJiBEM0RWT1BfQ0xJUCA/IFRSVUUgOiBGQUxTRTsKICAgIElXaW5lRDNERGV2aWNlX0dldFJlbmRlclN0YXRlKEQzRC0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RSU19DTElQUElORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCAqKSAmb2xkQ2xpcCk7CiAgICBpZihkb0NsaXAgIT0gb2xkQ2xpcCkKICAgIHsKICAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShEM0QtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFJTX0NMSVBQSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvQ2xpcCk7CiAgICB9CgoKICAgIGhyID0gSVdpbmVEM0REZXZpY2VfUHJvY2Vzc1ZlcnRpY2VzKEQzRC0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT53aW5lRDNEVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLT53aW5lRDNEVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwoKICAgIC8qIFJlc3RvcmUgdGhlIHN0YXRlcyBpZiBuZWVkZWQgKi8KICAgIGlmKGRvQ2xpcCAhPSBvbGRDbGlwKQogICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKEQzRC0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUlNfQ0xJUFBJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2xpcCk7CiAgICByZXR1cm4gaHI7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfUHJvY2Vzc1ZlcnRpY2VzKElEaXJlY3QzRFZlcnRleEJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4T3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRGVzdEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlciAqU3JjQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFNyY0luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTMgKkQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICpTcmMgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIsIFNyY0J1ZmZlcik7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpEM0QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBEM0REZXZpY2UpOwoKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOHgsJTA4eCwlcCwlMDh4LCVwLCUwOHgpIHRodW5raW5nIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlLlxuIiwgVGhpcywgVmVydGV4T3AsIERlc3RJbmRleCwgQ291bnQsIFNyYywgU3JjSW5kZXgsIEQzRCwgRmxhZ3MpOwoKICAgIHJldHVybiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Byb2Nlc3NWZXJ0aWNlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhPcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UoU3JjLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShEM0QsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OkdldFZlcnRleEJ1ZmZlckRlc2MKICoKICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgYSB2ZXJ0ZXggYnVmZmVyCiAqCiAqIFBhcmFtczoKICogIERlc2M6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGRlc2NyaXB0aW9uIHRvCiAqCiAqIFJldHVybnMKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGVzYyBpcyBOVUxMCiAqICBEM0RfT0sgb24gc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX0dldFZlcnRleEJ1ZmZlckRlc2MoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRVJURVhCVUZGRVJERVNDICpEZXNjKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7CiAgICBXSU5FRDNEVkVSVEVYQlVGRkVSX0RFU0MgV0Rlc2M7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgc2l6ZTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBEZXNjKTsKCiAgICBpZighRGVzYykgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgaHIgPSBJV2luZUQzRFZlcnRleEJ1ZmZlcl9HZXREZXNjKFRoaXMtPndpbmVEM0RWZXJ0ZXhCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldEZXNjKTsKICAgIGlmKGhyICE9IEQzRF9PSykKICAgIHsKICAgICAgICBFUlIoIiglcCkgSVdpbmVEM0RWZXJ0ZXhCdWZmZXI6OkdldERlc2MgZmFpbGVkIHdpdGggaHI9JTA4eFxuIiwgVGhpcywgaHIpOwogICAgICAgIHJldHVybiBocjsKICAgIH0KCiAgICAvKiBDbGVhciB0aGUgcmV0dXJuIHZhbHVlIG9mIGdhcmJhZ2UgKi8KICAgIHNpemUgPSBEZXNjLT5kd1NpemU7CiAgICBtZW1zZXQoRGVzYywgMCwgc2l6ZSk7CgogICAgLyogTm93IGZpbGwgdGhlIERlc2Mgc3RydWN0dXJlICovCiAgICBEZXNjLT5kd1NpemUgPSBzaXplOwogICAgRGVzYy0+ZHdDYXBzID0gVGhpcy0+Q2FwczsKICAgIERlc2MtPmR3RlZGID0gV0Rlc2MuRlZGOwogICAgRGVzYy0+ZHdOdW1WZXJ0aWNlcyA9IFdEZXNjLlNpemUgLyBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoV0Rlc2MuRlZGKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX0dldFZlcnRleEJ1ZmZlckRlc2MoSURpcmVjdDNEVmVydGV4QnVmZmVyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYQlVGRkVSREVTQyAqRGVzYykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGVzYyk7CgogICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfR2V0VmVydGV4QnVmZmVyRGVzYyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYyk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6T3B0aW1pemUKICoKICogQ29udmVydHMgYW4gdW5vcHRpbWl6ZWQgdmVydGV4IGJ1ZmZlciBpbnRvIGFuIG9wdGltaXplZCBidWZmZXIKICoKICogUGFyYW1zOgogKiAgRDNERGV2aWNlOiBEZXZpY2UgZm9yIHdoaWNoIHRoaXMgYnVmZmVyIGlzIG9wdGltaXplZAogKiAgRmxhZ3M6IE5vdCB1c2VkLCBzaG91bGQgYmUgc2V0IHRvIDAKICoKICogUmV0dXJucwogKiAgRDNEX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfT3B0aW1pemUoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlNyAqRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpEM0QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBEM0REZXZpY2UpOwogICAgRklYTUUoIiglcCktPiglcCwlMDh4KTogc3R1YiFcbiIsIFRoaXMsIEQzRCwgRmxhZ3MpOwoKICAgIC8qIFdlIGNvdWxkIGZvcndhcmQgdGhpcyBjYWxsIHRvIFdpbmVEM0QgYW5kIHRha2UgYWR2YW50YWdlCiAgICAgKiBvZiBpdCBvbmNlIHdlIHVzZSBPcGVuR0wgdmVydGV4IGJ1ZmZlcnMKICAgICAqLwogICAgVGhpcy0+Q2FwcyB8PSBEM0RWQkNBUFNfT1BUSU1JWkVEOwoKICAgIHJldHVybiBERF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9PcHRpbWl6ZShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMyAqRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgaWZhY2UpOwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAqRDNEID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgRDNERGV2aWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlMDh4KSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMsIEQzRCwgRmxhZ3MpOwoKICAgIHJldHVybiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X09wdGltaXplKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UoRDNELCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OlByb2Nlc3NWZXJ0aWNlc1N0cmlkZWQKICoKICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIHVudHJhbnNmb3JtZWQgc3RyaWRlZCB2ZXJ0aWNlcyBpbnRvIGEgcHJvY2Vzc2VkCiAqIG9yIG9wdGltaXplZCB2ZXJ0ZXggYnVmZmVyLgogKgogKiBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBwYXJhbWV0ZXJzLCBzZWUKICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6UHJvY2Vzc1ZlcnRpY2VzCiAqCiAqIFBhcmFtczoKICogIFZlcnRleE9wOiBPcGVyYXRpb25zIHRvIHBlcmZvcm0KICogIERlc3RJbmRleDogRGVzdGluYXRpb24gaW5kZXggdG8gd3JpdGUgdGhlIHZlcnRpY2VzIHRvCiAqICBDb3VudDogTnVtYmVyIG9mIGlucHV0IHZlcnRpY2VzCiAqICBTdHJpZGVEYXRhOiBBcnJheSBjb250YWluaW5nIHRoZSBpbnB1dCB2ZXJ0aWNlcwogKiAgVmVydGV4VHlwZURlc2M6IFZlcnRleCBEZXNjcmlwdGlvbiBvciBzb3VyY2UgaW5kZXg/Pz8/Pz8/Pz8KICogIEQzRERldmljZTogSURpcmVjdDNERGV2aWNlNyB0byB1c2UgZm9yIHByb2Nlc3NpbmcKICogIEZsYWdzOiBDYW4gYmUgRDNEUFZfRE9OT1RDT1BZREFUQSB0byBhdm9pZCBjb3B5aW5nIHVubW9kaWZpZWQgdmVydGljZXMKICoKICogUmV0dXJucwogKiAgRDNEX09LIG9uIHN1Y2Nlc3MsIG9yIERERVJSXyoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9Qcm9jZXNzVmVydGljZXNTdHJpZGVkKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4T3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBEZXN0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSAqU3RyaWRlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleFR5cGVEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlNyAqRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKkQzRCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIEQzRERldmljZSk7CiAgICBGSVhNRSgiKCVwKS0+KCUwOHgsJTA4eCwlMDh4LCVwLCUwOHgsJXAsJTA4eCk6IHN0dWIhXG4iLCBUaGlzLCBWZXJ0ZXhPcCwgRGVzdEluZGV4LCBDb3VudCwgU3RyaWRlRGF0YSwgVmVydGV4VHlwZURlc2MsIEQzRCwgRmxhZ3MpOwogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhlIFZUYWJsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKY29uc3QgSURpcmVjdDNEVmVydGV4QnVmZmVyN1Z0YmwgSURpcmVjdDNEVmVydGV4QnVmZmVyN19WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX0FkZFJlZiwKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNEVmVydGV4QnVmZmVyIE1ldGhvZHMgKioqLwogICAgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9Mb2NrLAogICAgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9VbmxvY2ssCiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1Byb2Nlc3NWZXJ0aWNlcywKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfR2V0VmVydGV4QnVmZmVyRGVzYywKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfT3B0aW1pemUsCiAgICAvKioqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1Byb2Nlc3NWZXJ0aWNlc1N0cmlkZWQKfTsKCmNvbnN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlclZ0YmwgSURpcmVjdDNEVmVydGV4QnVmZmVyMV9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNEVmVydGV4QnVmZmVyIE1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX0xvY2ssCiAgICBUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfVW5sb2NrLAogICAgVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1Byb2Nlc3NWZXJ0aWNlcywKICAgIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9HZXRWZXJ0ZXhCdWZmZXJEZXNjLAogICAgVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX09wdGltaXplCn07Cg==