LyoKICogT0xFMzIgY2FsbG91dHMsIENPTSBpbnRlcmZhY2UgbWFyc2hhbGxpbmcKICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqCiAqIFRPRE86CiAqICAtIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSAqcmVhbGx5KiBnb3QgdGhpcyByaWdodAogKiAgLSBjaGVjayBmb3IgZXJyb3JzIGFuZCB0aHJvdyBleGNlcHRpb25zCiAqICAtIHdoYXQgYXJlIHRoZSBtYXJzaGFsbGluZyBmdW5jdGlvbnMgc3VwcG9zZWQgdG8gcmV0dXJuPwogKiAgLSBmaW5pc2ggUnBjU3RyZWFtX1Z0YmwKICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2luY2x1ZGUgIm9iamJhc2UuaCIKCiNpbmNsdWRlICJuZHJfbWlzYy5oIgojaW5jbHVkZSAicnBjbmRyLmgiCiNpbmNsdWRlICJ3aW5lL3JwY2ZjLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwob2xlKTsKCnN0YXRpYyBITU9EVUxFIGhPTEU7CgpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fR2V0TWFyc2hhbFNpemVNYXgpKFVMT05HICosUkVGSUlELExQVU5LTk9XTixEV09SRCxMUFZPSUQsRFdPUkQpOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fTWFyc2hhbEludGVyZmFjZSkoTFBTVFJFQU0sUkVGSUlELExQVU5LTk9XTixEV09SRCxMUFZPSUQsRFdPUkQpOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fVW5tYXJzaGFsSW50ZXJmYWNlKShMUFNUUkVBTSxSRUZJSUQsTFBWT0lEKik7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9SZWxlYXNlTWFyc2hhbERhdGEpKExQU1RSRUFNKTsKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqQ09NX0dldENsYXNzT2JqZWN0KShSRUZDTFNJRCxEV09SRCxDT1NFUlZFUklORk8gKixSRUZJSUQsTFBWT0lEICopOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fR2V0UFNDbHNpZCkoUkVGSUlELENMU0lEICopOwpzdGF0aWMgTFBWT0lEIChXSU5BUEkgKkNPTV9NZW1BbGxvYykoVUxPTkcpOwpzdGF0aWMgdm9pZCAoV0lOQVBJICpDT01fTWVtRnJlZSkoTFBWT0lEKTsKCnN0YXRpYyBITU9EVUxFIExvYWRDT00odm9pZCkKewogIGlmIChoT0xFKSByZXR1cm4gaE9MRTsKICBoT0xFID0gTG9hZExpYnJhcnlBKCJPTEUzMi5ETEwiKTsKICBpZiAoIWhPTEUpIHJldHVybiAwOwogIENPTV9HZXRNYXJzaGFsU2l6ZU1heCAgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb0dldE1hcnNoYWxTaXplTWF4Iik7CiAgQ09NX01hcnNoYWxJbnRlcmZhY2UgICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvTWFyc2hhbEludGVyZmFjZSIpOwogIENPTV9Vbm1hcnNoYWxJbnRlcmZhY2UgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb1VubWFyc2hhbEludGVyZmFjZSIpOwogIENPTV9SZWxlYXNlTWFyc2hhbERhdGEgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb1JlbGVhc2VNYXJzaGFsRGF0YSIpOwogIENPTV9HZXRDbGFzc09iamVjdCAgICAgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb0dldENsYXNzT2JqZWN0Iik7CiAgQ09NX0dldFBTQ2xzaWQgICAgICAgICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvR2V0UFNDbHNpZCIpOwogIENPTV9NZW1BbGxvYyA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvVGFza01lbUFsbG9jIik7CiAgQ09NX01lbUZyZWUgID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29UYXNrTWVtRnJlZSIpOwogIHJldHVybiBoT0xFOwp9CgovKiBDb01hcnNoYWxJbnRlcmZhY2UvQ29Vbm1hcnNoYWxJbnRlcmZhY2Ugd29ya3Mgb24gc3RyZWFtcywKICogc28gaW1wbGVtZW50IGEgc2ltcGxlIHN0cmVhbSBvbiB0b3Agb2YgdGhlIFJQQyBidWZmZXIKICogKHdoaWNoIGFsc28gaW1wbGVtZW50cyB0aGUgTUludGVyZmFjZVBvaW50ZXIgc3RydWN0dXJlKSAqLwp0eXBlZGVmIHN0cnVjdCBScGNTdHJlYW1JbXBsCnsKICBJU3RyZWFtVnRibCAqbHBWdGJsOwogIERXT1JEIFJlZkNvdW50OwogIFBNSURMX1NUVUJfTUVTU0FHRSBwTXNnOwogIExQRFdPUkQgc2l6ZTsKICBjaGFyICpkYXRhOwogIERXT1JEIHBvczsKfSBScGNTdHJlYW1JbXBsOwoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9RdWVyeUludGVyZmFjZShMUFNUUkVBTSBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpvYmopCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBpZiAoSXNFcXVhbEdVSUQoJklJRF9JVW5rbm93biwgcmlpZCkgfHwKICAgICAgSXNFcXVhbEdVSUQoJklJRF9JU2VxdWVudGlhbFN0cmVhbSwgcmlpZCkgfHwKICAgICAgSXNFcXVhbEdVSUQoJklJRF9JU3RyZWFtLCByaWlkKSkgewogICAgKm9iaiA9IFRoaXM7CiAgICBUaGlzLT5SZWZDb3VudCsrOwogICAgcmV0dXJuIFNfT0s7CiAgfQogIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIFJwY1N0cmVhbV9BZGRSZWYoTFBTVFJFQU0gaWZhY2UpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICByZXR1cm4gKysoVGhpcy0+UmVmQ291bnQpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIFJwY1N0cmVhbV9SZWxlYXNlKExQU1RSRUFNIGlmYWNlKQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpcyA9IChScGNTdHJlYW1JbXBsICopaWZhY2U7CiAgaWYgKCEtLShUaGlzLT5SZWZDb3VudCkpIHsKICAgIFRSQUNFKCJzaXplPSVsZFxuIiwgKlRoaXMtPnNpemUpOwogICAgVGhpcy0+cE1zZy0+QnVmZmVyID0gVGhpcy0+ZGF0YSArICpUaGlzLT5zaXplOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMpOwogICAgcmV0dXJuIDA7CiAgfQogIHJldHVybiBUaGlzLT5SZWZDb3VudDsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9SZWFkKExQU1RSRUFNIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICpwY2JSZWFkKQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpcyA9IChScGNTdHJlYW1JbXBsICopaWZhY2U7CiAgaWYgKFRoaXMtPnBvcyArIGNiID4gKlRoaXMtPnNpemUpIGNiID0gKlRoaXMtPnNpemUgLSBUaGlzLT5wb3M7CiAgaWYgKGNiKSB7CiAgICBtZW1jcHkocHYsIFRoaXMtPmRhdGEgKyBUaGlzLT5wb3MsIGNiKTsKICAgIFRoaXMtPnBvcyArPSBjYjsKICB9CiAgaWYgKHBjYlJlYWQpICpwY2JSZWFkID0gY2I7CiAgcmV0dXJuIFNfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBScGNTdHJlYW1fV3JpdGUoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgKnBjYldyaXR0ZW4pCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBtZW1jcHkoVGhpcy0+ZGF0YSArIFRoaXMtPnBvcywgcHYsIGNiKTsKICBUaGlzLT5wb3MgKz0gY2I7CiAgaWYgKFRoaXMtPnBvcyA+ICpUaGlzLT5zaXplKSAqVGhpcy0+c2l6ZSA9IFRoaXMtPnBvczsKICBpZiAocGNiV3JpdHRlbikgKnBjYldyaXR0ZW4gPSBjYjsKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9TZWVrKExQU1RSRUFNIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIG1vdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG9yaWdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIgKm5ld1BvcykKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIHN3aXRjaCAob3JpZ2luKSB7CiAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6CiAgICBUaGlzLT5wb3MgPSBtb3ZlLnUuTG93UGFydDsKICAgIGJyZWFrOwogIGNhc2UgU1RSRUFNX1NFRUtfQ1VSOgogICAgVGhpcy0+cG9zID0gVGhpcy0+cG9zICsgbW92ZS51Lkxvd1BhcnQ7CiAgICBicmVhazsKICBjYXNlIFNUUkVBTV9TRUVLX0VORDoKICAgIFRoaXMtPnBvcyA9ICpUaGlzLT5zaXplICsgbW92ZS51Lkxvd1BhcnQ7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgcmV0dXJuIFNUR19FX0lOVkFMSURGVU5DVElPTjsKICB9CiAgaWYgKG5ld1BvcykgewogICAgbmV3UG9zLT51Lkxvd1BhcnQgPSBUaGlzLT5wb3M7CiAgICBuZXdQb3MtPnUuSGlnaFBhcnQgPSAwOwogIH0KICByZXR1cm4gU19PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9TZXRTaXplKExQU1RSRUFNIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiBuZXdTaXplKQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpcyA9IChScGNTdHJlYW1JbXBsICopaWZhY2U7CiAgKlRoaXMtPnNpemUgPSBuZXdTaXplLnUuTG93UGFydDsKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIElTdHJlYW1WdGJsIFJwY1N0cmVhbV9WdGJsID0KewogIFJwY1N0cmVhbV9RdWVyeUludGVyZmFjZSwKICBScGNTdHJlYW1fQWRkUmVmLAogIFJwY1N0cmVhbV9SZWxlYXNlLAogIFJwY1N0cmVhbV9SZWFkLAogIFJwY1N0cmVhbV9Xcml0ZSwKICBScGNTdHJlYW1fU2VlaywKICBScGNTdHJlYW1fU2V0U2l6ZSwKICBOVUxMLCAvKiBDb3B5VG8gKi8KICBOVUxMLCAvKiBDb21taXQgKi8KICBOVUxMLCAvKiBSZXZlcnQgKi8KICBOVUxMLCAvKiBMb2NrUmVnaW9uICovCiAgTlVMTCwgLyogVW5sb2NrUmVnaW9uICovCiAgTlVMTCwgLyogU3RhdCAqLwogIE5VTEwgIC8qIENsb25lICovCn07CgpzdGF0aWMgTFBTVFJFQU0gUnBjU3RyZWFtX0NyZWF0ZShQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csIEJPT0wgaW5pdCkKewogIFJwY1N0cmVhbUltcGwgKlRoaXM7CiAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKFJwY1N0cmVhbUltcGwpKTsKICBpZiAoIVRoaXMpIHJldHVybiBOVUxMOwogIFRoaXMtPmxwVnRibCA9ICZScGNTdHJlYW1fVnRibDsKICBUaGlzLT5SZWZDb3VudCA9IDE7CiAgVGhpcy0+cE1zZyA9IHBTdHViTXNnOwogIFRoaXMtPnNpemUgPSAoTFBEV09SRClwU3R1Yk1zZy0+QnVmZmVyOwogIFRoaXMtPmRhdGEgPSAoY2hhciopKFRoaXMtPnNpemUgKyAxKTsKICBUaGlzLT5wb3MgPSAwOwogIGlmIChpbml0KSAqVGhpcy0+c2l6ZSA9IDA7CiAgVFJBQ0UoImluaXQgc2l6ZT0lbGRcbiIsICpUaGlzLT5zaXplKTsKICByZXR1cm4gKExQU1RSRUFNKVRoaXM7Cn0KCmNvbnN0IElJRCogZ2V0X2lwX2lpZChQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBjb25zdCBJSUQgKnJpaWQ7CiAgaWYgKCFwRm9ybWF0KSByZXR1cm4gJklJRF9JVW5rbm93bjsKICBUUkFDRSgiZm9ybWF0PSUwMnggJTAyeFxuIiwgcEZvcm1hdFswXSwgcEZvcm1hdFsxXSk7CiAgaWYgKHBGb3JtYXRbMF0gIT0gUlBDX0ZDX0lQKSBGSVhNRSgiZm9ybWF0PSVkXG4iLCBwRm9ybWF0WzBdKTsKICBpZiAocEZvcm1hdFsxXSA9PSBSUENfRkNfQ09OU1RBTlRfSUlEKSB7CiAgICByaWlkID0gKGNvbnN0IElJRCAqKSZwRm9ybWF0WzJdOwogIH0gZWxzZSB7CiAgICBDb21wdXRlQ29uZm9ybWFuY2UocFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQrMiwgMCk7CiAgICByaWlkID0gKGNvbnN0IElJRCAqKXBTdHViTXNnLT5NYXhDb3VudDsKICB9CiAgaWYgKCFyaWlkKSByaWlkID0gJklJRF9JVW5rbm93bjsKICBUUkFDRSgiZ290ICVzXG4iLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKICByZXR1cm4gcmlpZDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyTWFyc2hhbGwgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyTWFyc2hhbGwoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIGNvbnN0IElJRCAqcmlpZCA9IGdldF9pcF9paWQocFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIExQU1RSRUFNIHN0cmVhbTsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIHBTdHViTXNnLT5NYXhDb3VudCA9IDA7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybiBOVUxMOwogIHN0cmVhbSA9IFJwY1N0cmVhbV9DcmVhdGUocFN0dWJNc2csIFRSVUUpOwogIGhyID0gQ09NX01hcnNoYWxJbnRlcmZhY2Uoc3RyZWFtLCByaWlkLCAoTFBVTktOT1dOKXBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHViTXNnLT5kd0Rlc3RDb250ZXh0LCBwU3R1Yk1zZy0+cHZEZXN0Q29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNITEZMQUdTX05PUk1BTCk7CiAgSVN0cmVhbV9SZWxlYXNlKHN0cmVhbSk7CiAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRySW50ZXJmYWNlUG9pbnRlclVubWFyc2hhbGwgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyVW5tYXJzaGFsbChQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqcHBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk9STUFUX1NUUklORyBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBmTXVzdEFsbG9jKQp7CiAgTFBTVFJFQU0gc3RyZWFtOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJXAsJXAsJWQpXG4iLCBwU3R1Yk1zZywgcHBNZW1vcnksIHBGb3JtYXQsIGZNdXN0QWxsb2MpOwogIGlmICghTG9hZENPTSgpKSByZXR1cm4gTlVMTDsKICAqKExQVk9JRCopcHBNZW1vcnkgPSBOVUxMOwogIHN0cmVhbSA9IFJwY1N0cmVhbV9DcmVhdGUocFN0dWJNc2csIEZBTFNFKTsKICBociA9IENPTV9Vbm1hcnNoYWxJbnRlcmZhY2Uoc3RyZWFtLCAmSUlEX05VTEwsIChMUFZPSUQqKXBwTWVtb3J5KTsKICBJU3RyZWFtX1JlbGVhc2Uoc3RyZWFtKTsKICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyQnVmZmVyU2l6ZSBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyQnVmZmVyU2l6ZShQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk9STUFUX1NUUklORyBwRm9ybWF0KQp7CiAgY29uc3QgSUlEICpyaWlkID0gZ2V0X2lwX2lpZChwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCk7CiAgVUxPTkcgc2l6ZSA9IDA7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIsIHBTdHViTXNnLCBwTWVtb3J5LCBwRm9ybWF0KTsKICBpZiAoIUxvYWRDT00oKSkgcmV0dXJuOwogIGhyID0gQ09NX0dldE1hcnNoYWxTaXplTWF4KCZzaXplLCByaWlkLCAoTFBVTktOT1dOKXBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCwgcFN0dWJNc2ctPnB2RGVzdENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0hMRkxBR1NfTk9STUFMKTsKICBUUkFDRSgic2l6ZT0lbGRcbiIsIHNpemUpOwogIHBTdHViTXNnLT5CdWZmZXJMZW5ndGggKz0gc2l6ZW9mKERXT1JEKSArIHNpemU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRySW50ZXJmYWNlUG9pbnRlck1lbW9yeVNpemUgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgbG9uZyBXSU5BUEkgTmRySW50ZXJmYWNlUG9pbnRlck1lbW9yeVNpemUoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBGSVhNRSgiKCVwLCVwKTogc3R1YlxuIiwgcFN0dWJNc2csIHBGb3JtYXQpOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckludGVyZmFjZVBvaW50ZXJGcmVlIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kckludGVyZmFjZVBvaW50ZXJGcmVlKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwTWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBMUFVOS05PV04gcFVuayA9IChMUFVOS05PV04pcE1lbW9yeTsKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIGlmIChwVW5rKSBJVW5rbm93bl9SZWxlYXNlKHBVbmspOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kck9sZUFsbG9jYXRlIFtSUENSVDQuQF0KICovCnZvaWQgKiBXSU5BUEkgTmRyT2xlQWxsb2NhdGUoc2l6ZV90IFNpemUpCnsKICBpZiAoIUxvYWRDT00oKSkgcmV0dXJuIE5VTEw7CiAgcmV0dXJuIENPTV9NZW1BbGxvYyhTaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJPbGVGcmVlIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kck9sZUZyZWUodm9pZCAqTm9kZVRvRnJlZSkKewogIGlmICghTG9hZENPTSgpKSByZXR1cm47CiAgQ09NX01lbUZyZWUoTm9kZVRvRnJlZSk7Cn0KCi8qIGludGVybmFsICovCkhSRVNVTFQgUlBDUlQ0X0dldFBTRmFjdG9yeShSRUZJSUQgcmlpZCwgTFBQU0ZBQ1RPUllCVUZGRVIgKnBQUykKewogIEhSRVNVTFQgaHI7CiAgQ0xTSUQgY2xzaWQ7CgogIGlmICghTG9hZENPTSgpKSByZXR1cm4gUlBDX0VfVU5FWFBFQ1RFRDsKICBociA9IENPTV9HZXRQU0Nsc2lkKHJpaWQsICZjbHNpZCk7CiAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKICBociA9IENPTV9HZXRDbGFzc09iamVjdCgmY2xzaWQsIENMU0NUWF9JTlBST0NfU0VSVkVSLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICZJSURfSVBTRmFjdG9yeUJ1ZmZlciwgKExQVk9JRCAqKXBQUyk7CiAgcmV0dXJuIGhyOwp9Cg==