From octave-sources-request at bevo dot che dot wisc dot edu Fri Apr 17 04:39:13 1998 Subject: function to read GIF images From: Georg Thimm To: octave-sources at bevo dot che dot wisc dot edu Date: Fri, 17 Apr 1998 11:39:04 +0200 This is a multipart MIME message. --==_Exmh_524995630 Content-Type: text/plain; charset=us-ascii Hi! I wrote (hmmm - mutilized 8-) some code to read images in GIF format for octave. Usage: [RED, GREEN, BLUE] = gifimage(filename) reads a GIF file into a array triplet of RGB color values. GRAY = gifimage(filename) with no explicit assignement, reads a GIF file and returns an array of gray values. If the image is colored, the gray value is determined by the formula: .299 red + .587 green + .114 blue. Installation: mkoctfile gifimage.cc to compile and move the gifimage.oct into the search path of octave. This code is at best beta, but I will try my best to fix bugs. Regards, Georg --==_Exmh_524995630 Content-Type: text/plain ; name="gifimage.cc"; charset=us-ascii Content-Description: gifimage.cc Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gifimage.cc" Ly8gT2N0YXZlIEludGVyZmFjZSBmb3IgcmVhZGluZyBHSUYgaW1hZ2VzCi8vIG91dHB1dCBp cyBlaXRoZXIgYSBtYXRyaXggd2l0aCBncmF5IHZhbHVlcyAKLy8gdGhlIGNvbnZlcnNpb24g Zm9ybXVsYSBpcyBnID0gIC4yOTkgciArIC41ODcgZyArIC4xMTQgYiAoZnJvbSBuZXRwYm0g dG9vbHMpCi8vIG9yIGVhY2ggY29sb3IgaXMgcmVhZCBpbnRvIGEgc2VwYXJhdGUgbWF0cml4 IGFuZCByZXR1cm5lZAovLwovLyBDb21waWxlIHRoaXMgdXNpbmcgbWtvY3RmaWxlICBnaWZp bWFnZS5jYwovLwovLyBUaGlzIGlzIGJhc2VkIG9uIGNvcHlyaWdodGVkIGNvZGU6Ci8vCi8v ICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSsgKi8KLy8gIHwgQ29weXJpZ2h0IDE5OTAsIERhdmlkIEtvYmxh cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqLwovLyAgfCAgIFBl cm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29m dHdhcmUgICB8ICovCi8vICB8ICAgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVy cG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IHwgKi8KLy8gIHwgICBncmFudGVkLCBw cm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwg fCAqLwovLyAgfCAgIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGlj ZSBhbmQgdGhpcyBwZXJtaXNzaW9uICB8ICovCi8vICB8ICAgbm90aWNlIGFwcGVhciBpbiBz dXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBUaGlzIHNvZnR3YXJlIGlzICAgIHwgKi8KLy8g IHwgICBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJh bnR5LiAgICAgICAgICAgfCAqLwovLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICovCi8vCi8vIE1vZGlm aWNhdGlvbiBmb3IgdGhlIHVzZSB3aXRoIG9jdGF2ZSBhcmUgZG9uZSBieSBHZW9yZyBUaGlt bSAodGhpbW1AaWRpYXAuY2gpCi8vCi8vIAkkSWQ6IGdpZmltYWdlLmNjLHYgMS4zIDE5OTgv MDQvMDEgMTA6MDk6MzcgdGhpbW0gRXhwIHRoaW1tICQJCgovLyAjZGVmaW5lIERFQlVHCmNv bnN0IHZlcmJvc2UgPSBmYWxzZSA7CgojaW5jbHVkZSA8b2N0YXZlL2NvbmZpZy5oPgojaW5j bHVkZSA8ZnN0cmVhbS5oPgoKI2luY2x1ZGUgPG9jdGF2ZS9kZWZ1bi1kbGQuaD4KI2luY2x1 ZGUgPG9jdGF2ZS9lcnJvci5oPgojaW5jbHVkZSA8b2N0YXZlL29jdC1vYmouaD4KI2luY2x1 ZGUgPG9jdGF2ZS9oZWxwLmg+CiNpbmNsdWRlIDxvY3RhdmUvb2N0LW9iai5oPgojaW5jbHVk ZSA8b2N0YXZlL3V0aWxzLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYml0OwoKI2RlZmlu ZQlNQVhDT0xPUk1BUFNJWkUJCTI1NgoKI2RlZmluZSBDTV9SRUQJCTAKI2RlZmluZSBDTV9H UkVFTgkxCiNkZWZpbmUgQ01fQkxVRQkJMgoKI2RlZmluZQlNQVhfTFdaX0JJVFMJCTEyCgoj ZGVmaW5lIElOVEVSTEFDRQkJMHg0MAojZGVmaW5lIExPQ0FMQ09MT1JNQVAJMHg4MAojZGVm aW5lIEJpdFNldChieXRlLCBiaXQpCSgoKGJ5dGUpICYgKGJpdCkpID09IChiaXQpKQojZGVm aW5lIExNX3RvX3VpbnQoYSxiKQkJCSgoKGIpPDw4KXwoYSkpCgovLyAgICBwcm90b3R5cGVz CnN0YXRpYyBib29sIFJlYWRJbWFnZShpZnN0cmVhbSAmZmQsIGludCBsZW4sIGludCBoZWln aHQsCgkJICAgICAgdW5zaWduZWQgY2hhciBjbWFwWzNdW01BWENPTE9STUFQU0laRV0sCgkJ ICAgICAgTWF0cml4ICZSLCBNYXRyaXggJkcsIE1hdHJpeCAmQiwKCQkgICAgICBpbnQgaW50 ZXJsYWNlKTsKc3RhdGljIGJvb2wgUmVhZEdyYXlJbWFnZShpZnN0cmVhbSAmZmQsIGludCBs ZW4sIGludCBoZWlnaHQsCgkJCSAgdW5zaWduZWQgY2hhciBjbWFwWzNdW01BWENPTE9STUFQ U0laRV0sCgkJCSAgTWF0cml4ICZHLAoJCQkgIGludCBpbnRlcmxhY2UpOwpzdGF0aWMgaW50 IEdldENvZGUoaWZzdHJlYW0gJmZkLCBpbnQgY29kZV9zaXplLCBib29sIGZsYWcpOwpzdGF0 aWMgYm9vbCBSZWFkQ29sb3JNYXAoaWZzdHJlYW0gJmZkLCBpbnQgbnVtYmVyLAoJCQkgdW5z aWduZWQgY2hhciBidWZmZXJbM11bTUFYQ09MT1JNQVBTSVpFXSApOwpzdGF0aWMgaW50IExX WlJlYWRCeXRlKGlmc3RyZWFtICZmZCwgYm9vbCBmbGFnLCBpbnQgaW5wdXRfY29kZV9zaXpl KTsKc3RhdGljIGludCBHZXREYXRhQmxvY2soaWZzdHJlYW0gJmZkLCB1bnNpZ25lZCBjaGFy ICpidWYpOwpzdGF0aWMgdm9pZCBEb0V4dGVuc2lvbihpZnN0cmVhbSAmZmQsIHVuc2lnbmVk IGNoYXIgbGFiZWwpOwoKc3RhdGljIGJvb2wgWmVyb0RhdGFCbG9jayA9IGZhbHNlOwoKc3Rh dGljIGJvb2wgcmV0dXJuY29sb3I7Ci8vIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24KREVGVU5f RExEIChnaWZpbWFnZSwgYXJncywgbmFyZ291dCwKCSAgICJVc2FnZTogCglbUkVELCBHUkVF TiwgQkxVRV0gPSBnaWZpbWFnZShmaWxlbmFtZSkKcmVhZHMgYSBHSUYgZmlsZSBpbnRvIGEg YXJyYXkgdHJpcGxldCBvZiBSR0IgY29sb3IgdmFsdWVzLgoKCUdSQVkgPSBnaWZpbWFnZShm aWxlbmFtZSkgCndpdGggbm8gZXhwbGljaXQgYXNzaWduZW1lbnQsIHJlYWRzIGEgR0lGIGZp bGUgYW5kIHJldHVybnMgCmFuIGFycmF5IG9mIGdyYXkgdmFsdWVzLiBJZiB0aGUgaW1hZ2Ug aXMgY29sb3JlZCwgdGhlIGdyYXkgdmFsdWUgaXMgZGV0ZXJtaW5lZApieSB0aGUgZm9ybXVs YTogLjI5OSByZWQgKyAuNTg3IGdyZWVuICsgLjExNCBibHVlLiAiKQp7CiAgb2N0YXZlX3Zh bHVlX2xpc3QgcmV0dmFsOwogIHVuc2lnbmVkIGNoYXIJbG9jYWxDb2xvck1hcFszXVtNQVhD T0xPUk1BUFNJWkVdOwogIGludAkJdXNlR2xvYmFsQ29sb3JtYXA7CiAgaW50CQliaXRQaXhl bDsKICBpbnQgbmFyZ2luID0gYXJncy5sZW5ndGggKCk7CgogIC8vIGNoZWNrIHRoZSBpbiBh bmQgYXV0IGFyZ3MKICByZXR2YWwucmVzaXplICgwKTsKICBpZiAobmFyZ2luICE9IDEgKQog ICAgewogICAgICBwcmludF91c2FnZSAoImdpZmltYWdlIik7CiAgICAgIHJldHVybiByZXR2 YWw7CiAgICB9CgogIGlmIChuYXJnb3V0ID09IDAgfHwgbmFyZ291dCA9PSAxKQogICAgcmV0 dXJuY29sb3IgPSBmYWxzZTsKICBlbHNlCiAgICBpZiAobmFyZ291dCAgPT0gMykKICAgICAg cmV0dXJuY29sb3IgPSB0cnVlOwogICAgZWxzZQogICAgICB7CglwcmludF91c2FnZSAoImdp ZmltYWdlIik7CglyZXR1cm4gcmV0dmFsOwogICAgICB9CiAgLy8gb3BlbiB0aGUgZmlsZQog IHN0cmluZyBmaWxlbmFtZSA9IGFyZ3MoMCkuc3RyaW5nX3ZhbHVlICgpOwoKICBpZnN0cmVh bSBmcm9tKGZpbGVuYW1lLmNfc3RyKCkpOwoKICBpZiAoIWZyb20pIHsKICAgIGNlcnIgPDwg ImVycm9yOiBGaWxlICIgPDwgZmlsZW5hbWUgPDwiY2FuIG5vdCBiZSBvcGVuZWRcbiI7CiAg ICByZXR1cm4gcmV0dmFsOwogIH0KCiAgdW5zaWduZWQgY2hhcglidWZbMTZdOwoKICAvLyBj aGVjayB0aGUgbWFnaWMgbnVtYmVyCiAgaWYgKCEgZnJvbS5yZWFkKGJ1ZiwgNikpIHsKICAg IGNlcnIgPDwgImVycm9yOiBjYW4gbm90IHJlYWQgbWFnaWMgbnVtYmVyXG4iOwogICAgZnJv bS5jbG9zZSgpOwogICAgcmV0dXJuIHJldHZhbDsKICB9CgogIGlmICgoc3RybmNtcCgoY29u c3QgY2hhciopYnVmLCJHSUY4N2EiLCA2KSAhPSAwKSAmJiAKICAgICAgKHN0cm5jbXAoKGNv bnN0IGNoYXIqKWJ1ZiwiR0lGODlhIiwgNikgIT0gMCkpCiAgICB7CiAgICAgIGJ1Zls3XT0w OwogICAgICBjZXJyIDw8ICJlcnJvcjogbm90IGEgR0lGODdhL0dJRjg5YSBmaWxlOiAiPDxi dWYgPDwiXG4iOwogICAgICBmcm9tLmNsb3NlKCk7CiAgICAgIHJldHVybiByZXR2YWw7CiAg ICB9CgoKICAvL3N0YXJ0IHNlcmlvdXMgcmVhZGluZyBzdHVmZiAhICAKCiAgaWYgKCFmcm9t LnJlYWQoYnVmLDcpKQogICAgewogICAgICBjZXJyIDw8ICJlcnJvcjogZmFpbGVkIHRvIHJl YWQgc2NyZWVuIGRlc2NyaXB0b3IiOwogICAgICBmcm9tLmNsb3NlKCk7CiAgICAgIHJldHVy biByZXR2YWw7CiAgICB9CQoKICBpbnQgV2lkdGggICAgICAgICAgID0gTE1fdG9fdWludChi dWZbMF0sYnVmWzFdKTsKICBpbnQgSGVpZ2h0ICAgICAgICAgID0gTE1fdG9fdWludChidWZb Ml0sYnVmWzNdKTsKICBpbnQgQml0UGl4ZWwgICAgICAgID0gMjw8KGJ1Zls0XSYweDA3KTsK ICBpbnQgQXNwZWN0UmF0aW8gICAgID0gYnVmWzZdOwogIHVuc2lnbmVkIGNoYXIJQ29sb3JN YXBbM11bTUFYQ09MT1JNQVBTSVpFXTsKCiNpZmRlZiBERUJVRwogIGZwcmludGYoc3Rkb3V0 LCAiRm91bmQgaW1hZ2UgJWR4JWRcbiIsIFdpZHRoLCBIZWlnaHQpOwojZW5kaWYKCiAgaWYg KEJpdFNldChidWZbNF0sIExPQ0FMQ09MT1JNQVApKSB7CS8qIEdsb2JhbCBDb2xvcm1hcCAq LwogICAgaWYgKFJlYWRDb2xvck1hcChmcm9tLCBCaXRQaXhlbCwgQ29sb3JNYXApKQogICAg ICB7CgljZXJyIDw8ICJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZ2xvYmFsIGNvbG9ybWFwXG4i OwoJZnJvbS5jbG9zZSgpOwoJcmV0dXJuIHJldHZhbDsKICAgICAgfQogIH0KCiAgaWYgKEFz cGVjdFJhdGlvICE9IDAgJiYgQXNwZWN0UmF0aW8gIT0gNDkpIHsKICAgIGZsb2F0CXI7CiAg ICByID0gKCAoZmxvYXQpIEFzcGVjdFJhdGlvICsgMTUuMCApIC8gNjQuMDsKICAgIGNlcnIg PDwgIndhcm5pbmc6IG5vbi1zcXVhcmUgcGl4ZWxzOyB0byBmaXggZG8gYSAncG5tc2NhbGUg LSVjc2NhbGUgJWcnIjsKICB9CgogIGNoYXIgYzsKICBmb3IgKDs7KQogICAgewogICAgICBp ZiAoIWZyb20uZ2V0KGMpKQoJewoJICAvKmNlcnIgPDwiR0lGOkVPRjEgLyByZWFkIGVycm9y IG9uIGltYWdlIGRhdGFcbiI7Ki8KCSAgLyogc2FtLiB3ZSBhbHdheXMgZ2V0IHRoaXMgZXJy b3IgLi4uICovCgkgIGJyZWFrOwoJfQoKICAgICAgaWYgKHZlcmJvc2UpIGNlcnIgPDwgImZv dW5kIGNoYXIgIjw8Yzw8IiAoIjw8aW50KGMpPDwiKVxuIjsKCiAgICAgIGlmIChjID09ICc7 JykgewkJLyogR0lGIHRlcm1pbmF0b3IgKi8KCWNlcnIgPDwgImVycjogaW1hZ2VzIG5vdCBm b3VuZCBpbiBmaWxlIjsKCWZyb20uY2xvc2UoKTsKCXJldHVybiByZXR2YWw7CiAgICAgIH0K CiAgICAgIGlmIChjID09ICchJykgeyAJLyogRXh0ZW5zaW9uICovCglpZiAoISBmcm9tLmdl dChjKSkKCSAgewoJICAgIGNlcnIgPDwgImVycm9yOiBPRiAvIHJlYWQgZXJyb3Igb24gZXh0 ZW50aW9uIGZ1bmN0aW9uIGNvZGVcbiI7CgkgICAgZnJvbS5jbG9zZSgpOwoJICAgIHJldHVy biByZXR2YWw7CgkgIH0KCURvRXh0ZW5zaW9uKGZyb20sIGMpOwogCWNvbnRpbnVlOwogICAg ICB9CgogICAgICBpZiAoYyAhPSAnLCcpIHsJCS8qIE5vdCBhIHZhbGlkIHN0YXJ0IGNoYXJh Y3RlciAqLwoJLyogcG1fbWVzc2FnZSgiYm9ndXMgY2hhcmFjdGVyIDB4JTAyeCwgaWdub3Jp bmciICk7ICovCgljb250aW51ZTsKICAgICAgfSAKCiAgICAgIGlmICghIGZyb20ucmVhZChi dWYsOSkpCgl7CgkgIGNlcnIgPDwgImVycm9yOiBjb3VsZG4ndCByZWFkIGxlZnQvdG9wL3dp ZHRoL2hlaWdodFxuIjsKCSAgZnJvbS5jbG9zZSgpOwoJICByZXR1cm4gcmV0dmFsOwoJfQoK ICAgICAgdXNlR2xvYmFsQ29sb3JtYXAgPSAhIEJpdFNldChidWZbOF0sIExPQ0FMQ09MT1JN QVApOwoKICAgICAgYml0UGl4ZWwgPSAxPDwoKGJ1Zls4XSYweDA3KSsxKTsKCiAgICAgIGlm IChyZXR1cm5jb2xvcil7CiAgICAgIE1hdHJpeCBSKEhlaWdodCwgV2lkdGgpOwogICAgICBN YXRyaXggRyhIZWlnaHQsIFdpZHRoKTsKICAgICAgTWF0cml4IEIoSGVpZ2h0LCBXaWR0aCk7 CgogICAgICBpZiAoISB1c2VHbG9iYWxDb2xvcm1hcCkgewoJaWYgKFJlYWRDb2xvck1hcChm cm9tLCBiaXRQaXhlbCwgbG9jYWxDb2xvck1hcCkpCgkgIHsKCSAgICBjZXJyIDw8ICJlcnJv cjogZmFpbGVkIHRvIHJlYWQgbG9jYWwgY29sb3JtYXBcbiI7CgkgICAgZnJvbS5jbG9zZSgp OwoJICAgIHJldHVybiByZXR2YWw7CgkgIH0KCVJlYWRJbWFnZShmcm9tLCBMTV90b191aW50 KGJ1Zls0XSxidWZbNV0pLAoJCSAgTE1fdG9fdWludChidWZbNl0sYnVmWzddKSwgbG9jYWxD b2xvck1hcCwKCQkgIFIsIEcsIEIsCgkJICBCaXRTZXQoYnVmWzhdLCBJTlRFUkxBQ0UpKTsK ICAgICAgfSBlbHNlIHsKCVJlYWRJbWFnZShmcm9tLCBMTV90b191aW50KGJ1Zls0XSxidWZb NV0pLAoJCSAgTE1fdG9fdWludChidWZbNl0sYnVmWzddKSwgQ29sb3JNYXAsCgkJICBSLCBH LCBCLAoJCSAgQml0U2V0KGJ1Zls4XSwgSU5URVJMQUNFKSk7CiAgICAgIH0KCiAgICAgIC8v IGNyZWF0ZSB0aGUgcmV0dXJuICBhcnJheXMKICAgICAgcmV0dmFsLnJlc2l6ZSAoMyk7CiAg ICAgIHJldHZhbCgwKSA9IFI7CiAgICAgIHJldHZhbCgxKSA9IEc7CiAgICAgIHJldHZhbCgy KSA9IEI7CiAgICAgIGZyb20uY2xvc2UoKTsgCiAgICAgIHJldHVybiByZXR2YWw7CiAgICAg IH0gZWxzZXsKCS8vIHJldHVybiBncmF5IGltYWdlIE1hdHJpeCBSKEhlaWdodCwgV2lkdGgp OwogICAgICBNYXRyaXggRyhIZWlnaHQsIFdpZHRoKTsKICAgICAgTWF0cml4IEIoSGVpZ2h0 LCBXaWR0aCk7CgogICAgICBpZiAoISB1c2VHbG9iYWxDb2xvcm1hcCkgewoJaWYgKFJlYWRD b2xvck1hcChmcm9tLCBiaXRQaXhlbCwgbG9jYWxDb2xvck1hcCkpCgkgIHsKCSAgICBjZXJy IDw8ICJlcnJvcjogZmFpbGVkIHRvIHJlYWQgbG9jYWwgY29sb3JtYXBcbiI7CgkgICAgZnJv bS5jbG9zZSgpOwoJICAgIHJldHVybiByZXR2YWw7CgkgIH0KCVJlYWRHcmF5SW1hZ2UoZnJv bSwgTE1fdG9fdWludChidWZbNF0sYnVmWzVdKSwKCQkgIExNX3RvX3VpbnQoYnVmWzZdLGJ1 Zls3XSksIGxvY2FsQ29sb3JNYXAsCgkJICAgICAgRywKCQkgIEJpdFNldChidWZbOF0sIElO VEVSTEFDRSkpOwogICAgICB9IGVsc2UgewoJUmVhZEdyYXlJbWFnZShmcm9tLCBMTV90b191 aW50KGJ1Zls0XSxidWZbNV0pLAoJCSAgTE1fdG9fdWludChidWZbNl0sYnVmWzddKSwgQ29s b3JNYXAsCgkJICAgRywKCQkgIEJpdFNldChidWZbOF0sIElOVEVSTEFDRSkpOwogICAgICB9 CgogICAgICAvLyBjcmVhdGUgdGhlIHJldHVybiAgYXJyYXlzCiAgICAgIHJldHZhbC5yZXNp emUgKDEpOwogICAgICByZXR2YWwoMCkgPSAgRzsKICAgICAgZnJvbS5jbG9zZSgpOyAKICAg ICAgcmV0dXJuIHJldHZhbDsKICAgICAgfQogICAgfQogIGZyb20uY2xvc2UoKTsgCiAgcmV0 dXJuIHJldHZhbDsKfQoKLy8gcmVhZCB0aGUgY29sb3IgbWFwCi8vIGZ1bmN0aW9uIHJldHVy bnMgdHJ1ZSBpZiBmYWlsZWQKc3RhdGljIGJvb2wgUmVhZENvbG9yTWFwKGlmc3RyZWFtICZm ZCwgaW50IG51bWJlciwKCQkJIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzNdW01BWENPTE9STUFQ U0laRV0gKQp7CiAgaW50CQlpOwogIHVuc2lnbmVkIGNoYXIJcmdiWzNdOwoKICBpZiAodmVy Ym9zZSkgY2VyciA8PCAiZXJyb3I6IHJlYWQgY29sb3JtYXAgd2l0aCAiPDxudW1iZXI8PCIg ZW50cmllc1xuIjsKICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyArK2kpIHsKICAgIGlmICgh IGZkLnJlYWQocmdiLCBzaXplb2YocmdiKSkpCiAgICAgIHsKCWNlcnIgPDwgIkdJRjpiYWQg Y29sb3JtYXBcbiI7CglyZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgIGJ1ZmZlcltDTV9SRURd W2ldID0gcmdiWzBdIDsKICAgIGJ1ZmZlcltDTV9HUkVFTl1baV0gPSByZ2JbMV0gOwogICAg YnVmZmVyW0NNX0JMVUVdW2ldID0gcmdiWzJdIDsKICB9CiAgcmV0dXJuIGZhbHNlOwp9Cgov LyByZWFkIHRoZSBpbWFnZSBwYXJ0IG9mIHRoZSBmaWxlLiBSZXR1cm4gMyBtYXRyaWNlcyB3 aXRoIFJCRyB2YWx1ZXMKc3RhdGljIGJvb2wgUmVhZEltYWdlKGlmc3RyZWFtICZmZCwgaW50 IGxlbiwgaW50IGhlaWdodCwKCQkgICAgICB1bnNpZ25lZCBjaGFyIGNtYXBbM11bTUFYQ09M T1JNQVBTSVpFXSwKCQkgICAgICBNYXRyaXggJlIsIE1hdHJpeCAmRywgTWF0cml4ICZCLAoJ CSAgICAgIGludCBpbnRlcmxhY2UpCnsKICB1bnNpZ25lZCBjaGFyCWM7CQogIGludAkJdjsK ICBpbnQJCXhwb3MgPSAwLCB5cG9zID0gMCwgcGFzcyA9IDA7CiAgCiNpZmRlZiBERUJVRwog IGxvbmcJcGl4X2NvdW50PTA7CiNlbmRpZgoKICAvKgogICoqICBJbml0aWFsaXplIHRoZSBD b21wcmVzc2lvbiByb3V0aW5lcwogICovCgojaWZkZWYgREVCVUcKICBwcmludGYoIlJlYWRp bmcgSW1hZ2UgLi4uXG4iKTsKI2VuZGlmCgogIGlmICghZmQuZ2V0KGMpKQogICAgewogICAg ICBjZXJyIDw8ICJlcnJvcjogRU9GMiAvIHJlYWQgZXJyb3Igb24gaW1hZ2UgZGF0YVxuIjsK ICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICBpZiAoTFdaUmVhZEJ5dGUoZmQsIHRydWUs IGMpIDwgMCkKICAgIHsKICAgICAgY2VyciA8PCAiZXJyb3I6IGNvdWxkIG5vdCByZWFkIGlt YWdlXG4iOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogIGlmICh2ZXJib3NlKQogICAg Y2VyciA8PCAicmVhZGluZyBHSUYgaW1hZ2VcbiI7CgogIHdoaWxlICgodiA9IExXWlJlYWRC eXRlKGZkLGZhbHNlLGMpKSA+PSAwICkgewogICAgUih5cG9zLCB4cG9zKSA9IGNtYXBbQ01f UkVEXVt2XTsKICAgIEcoeXBvcywgeHBvcykgPSBjbWFwW0NNX0dSRUVOXVt2XTsKICAgIEIo eXBvcywgeHBvcykgPSBjbWFwW0NNX0JMVUVdW3ZdOwoJCQojaWZkZWYgREVCVUcKICAgIHBp eF9jb3VudCsrOwojZW5kaWYKCQkKCiAgICArK3hwb3M7CiAgICBpZiAoeHBvcyA9PSBsZW4p IHsKICAgICAgeHBvcyA9IDA7CiAgICAgIGlmIChpbnRlcmxhY2UpIHsKCXN3aXRjaCAocGFz cykgewoJY2FzZSAwOgoJY2FzZSAxOgoJICB5cG9zICs9IDg7IGJyZWFrOwoJY2FzZSAyOgoJ ICB5cG9zICs9IDQ7IGJyZWFrOwoJY2FzZSAzOgoJICB5cG9zICs9IDI7IGJyZWFrOwoJfQoK CWlmICh5cG9zID49IGhlaWdodCkgewoJICArK3Bhc3M7CgkgIHN3aXRjaCAocGFzcykgewoJ ICBjYXNlIDE6CgkgICAgeXBvcyA9IDQ7IGJyZWFrOwoJICBjYXNlIDI6CgkgICAgeXBvcyA9 IDI7IGJyZWFrOwoJICBjYXNlIDM6CgkgICAgeXBvcyA9IDE7IGJyZWFrOwoJICBkZWZhdWx0 OgoJICAgIGdvdG8gZmluaTsKCSAgfQoJfQogICAgICB9IGVsc2UgewoJKyt5cG9zOwogICAg ICB9CiAgICB9CgogICAgaWYgKHlwb3MgPj0gaGVpZ2h0KQogICAgICBicmVhazsKICB9Cgog ZmluaToKICBpZiAoTFdaUmVhZEJ5dGUoZmQsIGZhbHNlLCBjKT49MCkKICAgIGNlcnIgPDwg Indhcm5pbmc6IHRvbyBtdWNoIGlucHV0IGRhdGEsIGlnbm9yaW5nIGV4dHJhLi4uIjsKCiNp ZmRlZiBERUJVRwogIHByaW50ZigiUmVhZCAlbGQgcGl4ZWxzIFxuIixwaXhfY291bnQpOwoj ZW5kaWYKCiAgLyogYW5kIE5PVyBjb252ZXJ0IHRoZSBkYXRhIHRvIGFuIEltcmVjdCAqLwog IHJldHVybiB0cnVlOwp9CgovLyByZWFkIHRoZSBpbWFnZSBwYXJ0IG9mIHRoZSBmaWxlLiBS ZXR1cm4gMSBtYXRyaSB3aXQgZ3JheSB2YWx1ZXMKc3RhdGljIGJvb2wgUmVhZEdyYXlJbWFn ZShpZnN0cmVhbSAmZmQsIGludCBsZW4sIGludCBoZWlnaHQsCgkJICAgICAgdW5zaWduZWQg Y2hhciBjbWFwWzNdW01BWENPTE9STUFQU0laRV0sCgkJICAgICAgIE1hdHJpeCAmRywKCQkg ICAgICBpbnQgaW50ZXJsYWNlKQp7CiAgdW5zaWduZWQgY2hhcgljOwkKICBpbnQJCXY7CiAg aW50CQl4cG9zID0gMCwgeXBvcyA9IDAsIHBhc3MgPSAwOwogIAojaWZkZWYgREVCVUcKICBs b25nCXBpeF9jb3VudD0wOwojZW5kaWYKCiAgLyoKICAqKiAgSW5pdGlhbGl6ZSB0aGUgQ29t cHJlc3Npb24gcm91dGluZXMKICAqLwoKI2lmZGVmIERFQlVHCiAgcHJpbnRmKCJSZWFkaW5n IEltYWdlIC4uLlxuIik7CiNlbmRpZgoKICBpZiAoIWZkLmdldChjKSkKICAgIHsKICAgICAg Y2VyciA8PCAiZXJyb3I6IEVPRjIgLyByZWFkIGVycm9yIG9uIGltYWdlIGRhdGFcbiI7CiAg ICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgaWYgKExXWlJlYWRCeXRlKGZkLCB0cnVlLCBj KSA8IDApCiAgICB7CiAgICAgIGNlcnIgPDwgImVycm9yOiBjb3VsZCBub3QgcmVhZCBpbWFn ZVxuIjsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICBpZiAodmVyYm9zZSkKICAgIGNl cnIgPDwgInJlYWRpbmcgR0lGIGltYWdlXG4iOwoKICB3aGlsZSAoKHYgPSBMV1pSZWFkQnl0 ZShmZCxmYWxzZSxjKSkgPj0gMCApIHsgLy8gZyA9ICAuMjk5IHIgKyAuNTg3IGcgKyAuMTE0 IGIuCiAgICBHKHlwb3MsIHhwb3MpID0gCiAgICAgIC4yOTkgKiBjbWFwW0NNX1JFRF1bdl0r CiAgICAgIC41ODcgKiBjbWFwW0NNX0dSRUVOXVt2XSsKICAgICAgLjExNCAqIGNtYXBbQ01f QkxVRV1bdl07CiAgICAKI2lmZGVmIERFQlVHCiAgICBwaXhfY291bnQrKzsKI2VuZGlmCgkJ CgogICAgKyt4cG9zOwogICAgaWYgKHhwb3MgPT0gbGVuKSB7CiAgICAgIHhwb3MgPSAwOwog ICAgICBpZiAoaW50ZXJsYWNlKSB7Cglzd2l0Y2ggKHBhc3MpIHsKCWNhc2UgMDoKCWNhc2Ug MToKCSAgeXBvcyArPSA4OyBicmVhazsKCWNhc2UgMjoKCSAgeXBvcyArPSA0OyBicmVhazsK CWNhc2UgMzoKCSAgeXBvcyArPSAyOyBicmVhazsKCX0KCglpZiAoeXBvcyA+PSBoZWlnaHQp IHsKCSAgKytwYXNzOwoJICBzd2l0Y2ggKHBhc3MpIHsKCSAgY2FzZSAxOgoJICAgIHlwb3Mg PSA0OyBicmVhazsKCSAgY2FzZSAyOgoJICAgIHlwb3MgPSAyOyBicmVhazsKCSAgY2FzZSAz OgoJICAgIHlwb3MgPSAxOyBicmVhazsKCSAgZGVmYXVsdDoKCSAgICBnb3RvIGZpbmk7Cgkg IH0KCX0KICAgICAgfSBlbHNlIHsKCSsreXBvczsKICAgICAgfQogICAgfQoKICAgIGlmICh5 cG9zID49IGhlaWdodCkKICAgICAgYnJlYWs7CiAgfQoKIGZpbmk6CiAgaWYgKExXWlJlYWRC eXRlKGZkLCBmYWxzZSwgYyk+PTApCiAgICBjZXJyIDw8ICJ3YXJuaW5nOiB0b28gbXVjaCBp bnB1dCBkYXRhLCBpZ25vcmluZyBleHRyYS4uLiI7CgojaWZkZWYgREVCVUcKICBwcmludGYo IlJlYWQgJWxkIHBpeGVscyBcbiIscGl4X2NvdW50KTsKI2VuZGlmCgogIC8qIGFuZCBOT1cg Y29udmVydCB0aGUgZGF0YSB0byBhbiBJbXJlY3QgKi8KICByZXR1cm4gdHJ1ZTsKfQoKc3Rh dGljIGludCBMV1pSZWFkQnl0ZShpZnN0cmVhbSAmZmQsIGJvb2wgZmxhZywgaW50IGlucHV0 X2NvZGVfc2l6ZSkKewogIHN0YXRpYyBib29sCWZyZXNoID0gZmFsc2U7CiAgaW50CQljb2Rl LCBpbmNvZGU7CiAgc3RhdGljIGludAljb2RlX3NpemUsIHNldF9jb2RlX3NpemU7CiAgc3Rh dGljIGludAltYXhfY29kZSwgbWF4X2NvZGVfc2l6ZTsKICBzdGF0aWMgaW50CWZpcnN0Y29k ZSwgb2xkY29kZTsKICBzdGF0aWMgaW50CWNsZWFyX2NvZGUsIGVuZF9jb2RlOwogIHN0YXRp YyBpbnQJdGFibGVbMl1bKDE8PCBNQVhfTFdaX0JJVFMpXTsKICBzdGF0aWMgaW50CXN0YWNr WygxPDwoTUFYX0xXWl9CSVRTKSkqMl0sICpzcDsKICByZWdpc3RlciBpbnQJaTsKCiAgaWYg KGZsYWcpIHsKICAgIHNldF9jb2RlX3NpemUgPSBpbnB1dF9jb2RlX3NpemU7CiAgICBjb2Rl X3NpemUgPSBzZXRfY29kZV9zaXplKzE7CiAgICBjbGVhcl9jb2RlID0gMSA8PCBzZXRfY29k ZV9zaXplIDsKICAgIGVuZF9jb2RlID0gY2xlYXJfY29kZSArIDE7CiAgICBtYXhfY29kZV9z aXplID0gMipjbGVhcl9jb2RlOwogICAgbWF4X2NvZGUgPSBjbGVhcl9jb2RlKzI7CgogICAg R2V0Q29kZShmZCwgMCwgdHJ1ZSk7CgkJCiAgICBmcmVzaCA9IHRydWU7CgogICAgZm9yIChp ID0gMDsgaSA8IGNsZWFyX2NvZGU7ICsraSkgewogICAgICB0YWJsZVswXVtpXSA9IDA7CiAg ICAgIHRhYmxlWzFdW2ldID0gaTsKICAgIH0KICAgIGZvciAoOyBpIDwgKDE8PE1BWF9MV1pf QklUUyk7ICsraSkKICAgICAgdGFibGVbMF1baV0gPSB0YWJsZVsxXVswXSA9IDA7CgogICAg c3AgPSBzdGFjazsKCiAgICByZXR1cm4gMDsKICB9IGVsc2UgaWYgKGZyZXNoKSB7CiAgICBm cmVzaCA9IGZhbHNlOwogICAgZG8gewogICAgICBmaXJzdGNvZGUgPSBvbGRjb2RlID0KCUdl dENvZGUoZmQsIGNvZGVfc2l6ZSwgZmFsc2UpOwogICAgfSB3aGlsZSAoZmlyc3Rjb2RlID09 IGNsZWFyX2NvZGUpOwogICAgcmV0dXJuIGZpcnN0Y29kZTsKICB9CgogIGlmIChzcCA+IHN0 YWNrKQogICAgcmV0dXJuICotLXNwOwoKICB3aGlsZSAoKGNvZGUgPSBHZXRDb2RlKGZkLCBj b2RlX3NpemUsIGZhbHNlKSkgPj0gMCkgewogICAgaWYgKGNvZGUgPT0gY2xlYXJfY29kZSkg ewogICAgICBmb3IgKGkgPSAwOyBpIDwgY2xlYXJfY29kZTsgKytpKSB7Cgl0YWJsZVswXVtp XSA9IDA7Cgl0YWJsZVsxXVtpXSA9IGk7CiAgICAgIH0KICAgICAgZm9yICg7IGkgPCAoMTw8 TUFYX0xXWl9CSVRTKTsgKytpKQoJdGFibGVbMF1baV0gPSB0YWJsZVsxXVtpXSA9IDA7CiAg ICAgIGNvZGVfc2l6ZSA9IHNldF9jb2RlX3NpemUrMTsKICAgICAgbWF4X2NvZGVfc2l6ZSA9 IDIqY2xlYXJfY29kZTsKICAgICAgbWF4X2NvZGUgPSBjbGVhcl9jb2RlKzI7CiAgICAgIHNw ID0gc3RhY2s7CiAgICAgIGZpcnN0Y29kZSA9IG9sZGNvZGUgPQoJR2V0Q29kZShmZCwgY29k ZV9zaXplLCBmYWxzZSk7CiAgICAgIHJldHVybiBmaXJzdGNvZGU7CiAgICB9IGVsc2UgaWYg KGNvZGUgPT0gZW5kX2NvZGUpIHsKICAgICAgaW50CQljb3VudDsKICAgICAgdW5zaWduZWQg Y2hhcglidWZbMjYwXTsKCiAgICAgIGlmIChaZXJvRGF0YUJsb2NrKQoJcmV0dXJuIC0yOwoK ICAgICAgd2hpbGUgKChjb3VudCA9IEdldERhdGFCbG9jayhmZCwgYnVmKSkgPiAwKQoJOwoK ICAgICAgaWYgKGNvdW50ICE9IDApCgljZXJyIDw8ICJlcnJvcjogbWlzc2luZyBFT0QgaW4g ZGF0YSBzdHJlYW0gKGNvbW1vbiBvY2N1cmVuY2UpIjsKICAgICAgcmV0dXJuIC0yOwogICAg fQoKICAgIGluY29kZSA9IGNvZGU7CgogICAgaWYgKGNvZGUgPj0gbWF4X2NvZGUpIHsKICAg ICAgKnNwKysgPSBmaXJzdGNvZGU7CiAgICAgIGNvZGUgPSBvbGRjb2RlOwogICAgfQoKICAg IHdoaWxlIChjb2RlID49IGNsZWFyX2NvZGUpIHsKICAgICAgKnNwKysgPSB0YWJsZVsxXVtj b2RlXTsKICAgICAgaWYgKGNvZGUgPT0gdGFibGVbMF1bY29kZV0pCgl7CgkgIGNlcnIgPDwg ImVycm9yOiBjaXJjdWxhciB0YWJsZSBlbnRyeSBCSUcgRVJST1JcbiI7CgkgIHJldHVybiAt MjsKCX0KICAgICAgY29kZSA9IHRhYmxlWzBdW2NvZGVdOwogICAgfQoKICAgICpzcCsrID0g Zmlyc3Rjb2RlID0gdGFibGVbMV1bY29kZV07CgogICAgaWYgKChjb2RlID0gbWF4X2NvZGUp IDwoMTw8TUFYX0xXWl9CSVRTKSkgewogICAgICB0YWJsZVswXVtjb2RlXSA9IG9sZGNvZGU7 CiAgICAgIHRhYmxlWzFdW2NvZGVdID0gZmlyc3Rjb2RlOwogICAgICArK21heF9jb2RlOwog ICAgICBpZiAoKG1heF9jb2RlID49IG1heF9jb2RlX3NpemUpICYmCgkgIChtYXhfY29kZV9z aXplIDwgKDE8PE1BWF9MV1pfQklUUykpKSB7CgltYXhfY29kZV9zaXplICo9IDI7CgkrK2Nv ZGVfc2l6ZTsKICAgICAgfQogICAgfQoKICAgIG9sZGNvZGUgPSBpbmNvZGU7CgogICAgaWYg KHNwID4gc3RhY2spCiAgICAgIHJldHVybiAqLS1zcDsKICB9CiAgcmV0dXJuIGNvZGU7Cn0K CgpzdGF0aWMgaW50IEdldENvZGUoaWZzdHJlYW0gJmZkLCBpbnQgY29kZV9zaXplLCBib29s IGZsYWcpCnsKICBzdGF0aWMgdW5zaWduZWQgY2hhcglidWZbMjgwXTsKICBzdGF0aWMgaW50 CQljdXJiaXQsIGxhc3RiaXQsIGRvbmUsIGxhc3RfYnl0ZTsKICBpbnQJCQlpLCBqLCByZXQ7 CiAgdW5zaWduZWQgY2hhcgkJY291bnQ7CgogIGlmIChmbGFnKSB7CiAgICBjdXJiaXQgPSAw OwogICAgbGFzdGJpdCA9IDA7CiAgICBkb25lID0gZmFsc2U7CiAgICByZXR1cm4gMDsKICB9 CgogIGlmICggKGN1cmJpdCtjb2RlX3NpemUpID49IGxhc3RiaXQpIHsKICAgIGlmIChkb25l KSB7CiAgICAgIGlmIChjdXJiaXQgPj0gbGFzdGJpdCkKCXsKCSAgY2VyciA8PCAiZXJyb3I6 IHJhbiBvZmYgdGhlIGVuZCBvZiBteSBiaXRzXG4iOwoJICByZXR1cm4gLTE7Cgl9CiAgICAg IHJldHVybiAtMTsKICAgIH0KICAgIGJ1ZlswXSA9IGJ1ZltsYXN0X2J5dGUtMl07CiAgICBi dWZbMV0gPSBidWZbbGFzdF9ieXRlLTFdOwoKICAgIGlmICgoY291bnQgPSBHZXREYXRhQmxv Y2soZmQsICZidWZbMl0pKSA9PSAwKQogICAgICBkb25lID0gdHJ1ZTsKCiAgICBsYXN0X2J5 dGUgPSAyICsgY291bnQ7CiAgICBjdXJiaXQgPSAoY3VyYml0IC0gbGFzdGJpdCkgKyAxNjsK ICAgIGxhc3RiaXQgPSAoMitjb3VudCkqOCA7CiAgfQoKICByZXQgPSAwOwogIGZvciAoaSA9 IGN1cmJpdCwgaiA9IDA7IGogPCBjb2RlX3NpemU7ICsraSwgKytqKQogICAgcmV0IHw9ICgo YnVmWyBpIC8gOCBdICYgKDEgPDwgKGkgJSA4KSkpICE9IDApIDw8IGo7CgogIGN1cmJpdCAr PSBjb2RlX3NpemU7CgogIHJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IEdldERhdGFCbG9j ayhpZnN0cmVhbSAmZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKewogIHVuc2lnbmVkIGNoYXIJ Y291bnQ7CgogIGlmICghIGZkLmdldChjb3VudCkpIHsKICAgIGNlcnI8PCAiZXJyb3IgaW4g Z2V0dGluZyBEYXRhQmxvY2sgc2l6ZSI7CiAgICByZXR1cm4gLTE7CiAgfQoKICBaZXJvRGF0 YUJsb2NrID0gKGNvdW50ID09IDApOwoKICBpZiAoKGNvdW50ICE9IDApICYmICghIGZkLnJl YWQoYnVmLCBjb3VudCkpKSB7CiAgICBjZXJyIDw8ICJlcnJvciBpbiByZWFkaW5nIERhdGFC bG9jayIgOwogICAgcmV0dXJuIC0xOwogIH0KCiAgcmV0dXJuIGNvdW50Owp9CgovLyBoYW5k bGUgZXh0ZW5zaW9ucyBtb3JlIG9yIGxlc3MgY29ycmVjdGx5CnN0YXRpYyB2b2lkIERvRXh0 ZW5zaW9uKGlmc3RyZWFtICZmZCwgdW5zaWduZWQgY2hhciBsYWJlbCkKewogIGNoYXIJYnVm WzI1Nl07CiAgY2hhciBjOwogIHN3aXRjaCAobGFiZWwpIHsKICBjYXNlIDB4MDE6CQkvKiBQ bGFpbiBUZXh0IEV4dGVuc2lvbiAqLwogICAgY2VyciA8PCAiUGxhaW4gVGV4dCBFeHRlbnNp b246IHNraXBwaW5nIGRhdGEuLi5cbiI7CiAgYnJlYWs7CiAgICAKICBjYXNlIDB4ZmY6CQkv KiBBcHBsaWNhdGlvbiBFeHRlbnNpb24gKi8KICAgIGNlcnIgPDwgICJBcHBsaWNhdGlvbiBF eHRlbnNpb246IHNraXBwaW5nIGRhdGEuLi5cbiI7CiAgICBicmVhazsKICBjYXNlIDB4ZmU6 CQkvKiBDb21tZW50IEV4dGVuc2lvbiAqLwogICAgaWYgKHZlcmJvc2UpIGNlcnIgPDwgIkNv bW1lbnQgRXh0ZW5zaW9uXG4iOwogICAgd2hpbGUgKGZkLmdldChjKSkgewogICAgICBpZihj PT0nXHInKSBjPSdcbic7CiAgICAgIGlmIChjID09ICc7JykgcmV0dXJuOwogICAgICBpZiAo dmVyYm9zZSkgY2VyciA8PCBjOwogICAgfSAKICAgICBpZiAodmVyYm9zZSkgY2VyciA8PCAn XG4nOwogICAgcmV0dXJuOwogIGNhc2UgMHhmOToJCS8qIEdyYXBoaWMgQ29udHJvbCBFeHRl bnNpb24gKi8KICAgIGNlcnIgPDwgIkdyYXBoaWMgQ29udHJvbCBFeHRlbnNpb246IHNraXBw aW5nIGRhdGEuLi5cbiI7CiAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBjZXJyIDw8ICJlcnJv cjogVU5LTk9XTiBMQUJFTCAiIDw8IChpbnQpIGxhYmVsPDwiIHNraXBwaW5nIGRhdGEuLi5c biI7CiAKICB9CiAgKHZvaWQpIEdldERhdGFCbG9jayhmZCwgKHVuc2lnbmVkIGNoYXIqKSBi dWYpOyAgCiAgd2hpbGUgKEdldERhdGFCbG9jayhmZCwgKHVuc2lnbmVkIGNoYXIqKSBidWYp ICE9IDApCiAgICA7Cn0K --==_Exmh_524995630--