LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBGaWxlIFBBUlNFUE9TLkgKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMDcvMDkvOTcgICAgaGVsZW5hICAgICAgQ29udmVydGVkIGZyb20gamF2YS4KKiAgIDA3LzE3Lzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIGVycm9ySW5kZXggc3VwcG9ydC4KKiAgIDA1LzExLzk5ICAgIHN0ZXBoZW4gICAgIENsZWFuZWQgdXAuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgUEFSU0VQT1NfSAojZGVmaW5lIFBBUlNFUE9TX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgogICAgIAovKioKICogPGNvZGU+UGFyc2VQb3NpdGlvbjwvY29kZT4gaXMgYSBzaW1wbGUgY2xhc3MgdXNlZCBieSA8Y29kZT5Gb3JtYXQ8L2NvZGU+CiAqIGFuZCBpdHMgc3ViY2xhc3NlcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uIGR1cmluZyBwYXJzaW5nLgogKiBUaGUgPGNvZGU+cGFyc2VPYmplY3Q8L2NvZGU+IG1ldGhvZCBpbiB0aGUgdmFyaW91cyA8Y29kZT5Gb3JtYXQ8L2NvZGU+CiAqIGNsYXNzZXMgcmVxdWlyZXMgYSA8Y29kZT5QYXJzZVBvc2l0aW9uPC9jb2RlPiBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAqCiAqIDxwPiAKICogQnkgZGVzaWduLCBhcyB5b3UgcGFyc2UgdGhyb3VnaCBhIHN0cmluZyB3aXRoIGRpZmZlcmVudCBmb3JtYXRzLAogKiB5b3UgY2FuIHVzZSB0aGUgc2FtZSA8Y29kZT5QYXJzZVBvc2l0aW9uPC9jb2RlPiwgc2luY2UgdGhlIGluZGV4IHBhcmFtZXRlcgogKiByZWNvcmRzIHRoZSBjdXJyZW50IHBvc2l0aW9uLgogKgogKiBAdmVyc2lvbiAgICAgMS4zIDEwLzMwLzk3CiAqIEBhdXRob3IgICAgICBNYXJrIERhdmlzLCBIZWxlbmEgU2hpaAogKiBAc2VlICAgICAgICAgamF2YS50ZXh0LkZvcm1hdAogKi8KCmNsYXNzIFVfSTE4Tl9BUEkgUGFyc2VQb3NpdGlvbiB7CnB1YmxpYzoKICAgIC8qKgogICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgdGhlIGluZGV4IHN0YXJ0cyB3aXRoIDAgYXMgZGVmYXVsdC4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgUGFyc2VQb3NpdGlvbigpIAogICAgICB7IHRoaXMtPmluZGV4ID0gMDsgdGhpcy0+ZXJyb3JJbmRleCA9IC0xOyB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUGFyc2VQb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGluZGV4LgogICAgICogQHBhcmFtIG5ld0luZGV4IHRoZSBuZXcgdGV4dCBvZmZzZXQuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFBhcnNlUG9zaXRpb24oVVRleHRPZmZzZXQgbmV3SW5kZXgpIAogICAgICB7ICAgIHRoaXMtPmluZGV4ID0gbmV3SW5kZXg7IHRoaXMtPmVycm9ySW5kZXggPSAtMTsgfSAKICAgIAogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yCiAgICAgKiBAcGFyYW0gY29weSB0aGUgb2JqZWN0IHRvIGJlIGNvcGllZCBmcm9tLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBQYXJzZVBvc2l0aW9uKGNvbnN0IFBhcnNlUG9zaXRpb24mIGNvcHkpIAogICAgICB7ICAgIHRoaXMtPmluZGV4ID0gY29weS5pbmRleDsgdGhpcy0+ZXJyb3JJbmRleCA9IGNvcHkuZXJyb3JJbmRleDsgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvcgogICAgICogQHN0YWJsZQogICAgICovCiAgICB+UGFyc2VQb3NpdGlvbigpIHt9CgogICAgLyoqCiAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFBhcnNlUG9zaXRpb24mICAgICAgb3BlcmF0b3I9KGNvbnN0IFBhcnNlUG9zaXRpb24mIGNvcHkpOwoKICAgIC8qKiAKICAgICAqIEVxdWFsaXR5IG9wZXJhdG9yLgogICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gcGFyc2UgcG9zaXRpb25zIGFyZSBlcXVhbCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBib29sX3QgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgUGFyc2VQb3NpdGlvbiYgdGhhdCkgY29uc3Q7CgogICAgLyoqIAogICAgICogRXF1YWxpdHkgb3BlcmF0b3IuCiAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHR3byBwYXJzZSBwb3NpdGlvbnMgYXJlIG5vdCBlcXVhbCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBib29sX3QgICAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgUGFyc2VQb3NpdGlvbiYgdGhhdCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBwYXJzZSBwb3NpdGlvbi4gIE9uIGlucHV0IHRvIGEgcGFyc2UgbWV0aG9kLCB0aGlzCiAgICAgKiBpcyB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBhdCB3aGljaCBwYXJzaW5nIHdpbGwgYmVnaW47IG9uIG91dHB1dCwgaXQKICAgICAqIGlzIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgbGFzdCBjaGFyYWN0ZXIgcGFyc2VkLgogICAgICogQHJldHVybiB0aGUgY3VycmVudCBpbmRleC4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgVVRleHRPZmZzZXQgZ2V0SW5kZXgodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcGFyc2UgcG9zaXRpb24uCiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIG5ldyBpbmRleC4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRJbmRleChVVGV4dE9mZnNldCBpbmRleCk7CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIGluZGV4IGF0IHdoaWNoIGEgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBGb3JtYXR0ZXJzCiAgICAgKiBzaG91bGQgc2V0IHRoaXMgYmVmb3JlIHJldHVybmluZyBhbiBlcnJvciBjb2RlIGZyb20gdGhlaXIKICAgICAqIHBhcnNlT2JqZWN0IG1ldGhvZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xIGlmIHRoaXMgaXMgbm90CiAgICAgKiBzZXQuICAKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRFcnJvckluZGV4KFVUZXh0T2Zmc2V0IGVpKTsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBpbmRleCBhdCB3aGljaCBhbiBlcnJvciBvY2N1cnJlZCwgb3IgLTEgaWYgdGhlCiAgICAgKiBlcnJvciBpbmRleCBoYXMgbm90IGJlZW4gc2V0LiAgCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFVUZXh0T2Zmc2V0IGdldEVycm9ySW5kZXgodm9pZCkgY29uc3Q7Cgpwcml2YXRlOgogICAgLyoqCiAgICAgKiBJbnB1dDogdGhlIHBsYWNlIHlvdSBzdGFydCBwYXJzaW5nLgogICAgICogPGJyPk91dHB1dDogcG9zaXRpb24gd2hlcmUgdGhlIHBhcnNlIHN0b3BwZWQuCiAgICAgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgc2VyaWFsbHksCiAgICAgKiB3aXRoIGVhY2ggY2FsbCBzZXR0aW5nIGluZGV4IHVwIGZvciB0aGUgbmV4dCBvbmUuCiAgICAgKi8KICAgIFVUZXh0T2Zmc2V0IGluZGV4OwogICAgCiAgICAvKioKICAgICAqIFRoZSBpbmRleCBhdCB3aGljaCBhIHBhcnNlIGVycm9yIG9jY3VycmVkLgogICAgICovCiAgICBVVGV4dE9mZnNldCBlcnJvckluZGV4Owp9OwoKaW5saW5lIFBhcnNlUG9zaXRpb24mClBhcnNlUG9zaXRpb246Om9wZXJhdG9yPShjb25zdCBQYXJzZVBvc2l0aW9uJiBjb3B5KQp7CiAgaW5kZXggPSBjb3B5LmluZGV4OwogIGVycm9ySW5kZXggPSBjb3B5LmVycm9ySW5kZXg7CiAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgYm9vbF90ClBhcnNlUG9zaXRpb246Om9wZXJhdG9yPT0oY29uc3QgUGFyc2VQb3NpdGlvbiYgY29weSkgY29uc3QKewogIGlmKGluZGV4ICE9IGNvcHkuaW5kZXggfHwgZXJyb3JJbmRleCAhPSBjb3B5LmVycm9ySW5kZXgpIAogIHJldHVybiBGQUxTRTsKICBlbHNlCiAgcmV0dXJuIFRSVUU7Cn0KCmlubGluZSBib29sX3QKUGFyc2VQb3NpdGlvbjo6b3BlcmF0b3IhPShjb25zdCBQYXJzZVBvc2l0aW9uJiBjb3B5KSBjb25zdAp7CiAgcmV0dXJuICFvcGVyYXRvcj09KGNvcHkpOwp9CgppbmxpbmUgVVRleHRPZmZzZXQKUGFyc2VQb3NpdGlvbjo6Z2V0SW5kZXgoKSBjb25zdAp7CiAgcmV0dXJuIGluZGV4Owp9CgppbmxpbmUgdm9pZApQYXJzZVBvc2l0aW9uOjpzZXRJbmRleChVVGV4dE9mZnNldCBpZHgpCnsKICB0aGlzLT5pbmRleCA9IGlkeDsKfQoKaW5saW5lIFVUZXh0T2Zmc2V0ClBhcnNlUG9zaXRpb246OmdldEVycm9ySW5kZXgoKSBjb25zdAp7CiAgcmV0dXJuIGVycm9ySW5kZXg7Cn0KCmlubGluZSB2b2lkClBhcnNlUG9zaXRpb246OnNldEVycm9ySW5kZXgoVVRleHRPZmZzZXQgZWkpCnsKICB0aGlzLT5lcnJvckluZGV4ID0gZWk7Cn0KCiNlbmRpZgo=