LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgUkJUX0RBVEFfSAojZGVmaW5lIFJCVF9EQVRBX0gKCiNpbmNsdWRlICJyYnRfc2V0LmgiCgpjbGFzcyBVbmljb2RlU3RyaW5nOwpjbGFzcyBVbmljb2RlU2V0OwpjbGFzcyBIYXNodGFibGU7CgovKioKICogVGhlIHJ1bGUgZGF0YSBmb3IgYSBSdWxlQmFzZWRUcmFuc2xpdGVyYXRvcnMuICBSQlQgb2JqZWN0cyBob2xkCiAqIGEgY29uc3QgcG9pbnRlciB0byBhIFRSRCBvYmplY3QgdGhhdCB0aGV5IGRvIG5vdCBvd24uICBUUkQgb2JqZWN0cwogKiBhcmUgZXNzZW50aWFsbHkgdGhlIHBhcnNlZCBydWxlcyBpbiBjb21wYWN0LCB1c2FibGUgZm9ybS4gIFRoZQogKiBUUkQgb2JqZWN0cyB0aGVtc2VsdmVzIGFyZSBoZWxkIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2VzcyBpbgogKiBhIHN0YXRpYyBjYWNoZSBvd25lZCBieSBUcmFuc2xpdGVyYXRvci4KICoKICogVGhpcyBjbGFzcycgQVBJIGlzIGEgbGl0dGxlIGFzeW1tZXRyaWMuICBUaGVyZSBpcyBhIG1ldGhvZCB0bwogKiBkZWZpbmUgYSB2YXJpYWJsZSwgYnV0IG5vIHdheSB0byBkZWZpbmUgYSBzZXQuICBUaGlzIGlzIGJlY2F1c2UgdGhlCiAqIHNldHMgYXJlIGRlZmluZWQgYnkgdGhlIHBhcnNlciBpbiBhIFVWZWN0b3IsIGFuZCB0aGUgdmVjdG9yIGlzCiAqIGNvcGllZCBpbnRvIGEgZml4ZWQtc2l6ZSBhcnJheSBoZXJlLiAgT25jZSB0aGlzIGlzIGRvbmUsIG5vIG5ldwogKiBzZXRzIG1heSBiZSBkZWZpbmVkLiAgSW4gcHJhY3RpY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gc28sIHNpbmNlCiAqIGdlbmVyYXRpbmcgdGhlIGRhdGEgYW5kIHVzaW5nIGl0IGFyZSBkaXNjcmV0ZSBwaGFzZXMuICBXaGVuIHRoZXJlCiAqIGlzIGEgbmVlZCB0byBhY2Nlc3MgdGhlIHNldCBkYXRhIGR1cmluZyB0aGUgcGFyc2UgcGhhc2UsIGFub3RoZXIKICogZGF0YSBzdHJ1Y3R1cmUgaGFuZGxlcyB0aGlzLiAgU2VlIHRoZSBwYXJzaW5nIGNvZGUgZm9yIG1vcmUKICogZGV0YWlscy4KICovCmNsYXNzIFRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhIHsKCnB1YmxpYzoKCiAgICAvLyBQVUJMSUMgREFUQSBNRU1CRVJTCgogICAgLyoqCiAgICAgKiBSdWxlIHRhYmxlLiAgTWF5IGJlIGVtcHR5LgogICAgICovCiAgICBUcmFuc2xpdGVyYXRpb25SdWxlU2V0IHJ1bGVTZXQ7CgogICAgLyoqCiAgICAgKiBNYXAgdmFyaWFibGUgbmFtZSAoU3RyaW5nKSB0byB2YXJpYWJsZSAoVW5pY29kZVN0cmluZykuICBBIHZhcmlhYmxlIG5hbWUKICAgICAqIGNvcnJlc3BvbmRzIHRvIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLCBzdG9yZWQgaW4gYSBVbmljb2RlU3RyaW5nIGluCiAgICAgKiB0aGlzIGhhc2guICBPbmUgb3IgbW9yZSBvZiB0aGVzZSBjaGFycyBtYXkgYWxzbyBjb3JyZXNwb25kIHRvIGEKICAgICAqIFVuaWNvZGVTZXQsIGluIHdoaWNoIGNhc2UgdGhlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZVN0cmluZyBpbiB0aGlzIGhhc2ggaXMKICAgICAqIGEgc3RhbmQtaW46IGl0IGlzIGFuIGluZGV4IGZvciBhIHNlY29uZGFyeSBsb29rdXAgaW4KICAgICAqIGRhdGEuc2V0VmFyaWFibGVzLiAgVGhlIHN0YW5kLWluIGFsc28gcmVwcmVzZW50cyB0aGUgVW5pY29kZVNldCBpbgogICAgICogdGhlIHN0b3JlZCBydWxlcy4KICAgICAqLwogICAgSGFzaHRhYmxlKiB2YXJpYWJsZU5hbWVzOwogICAgCiAgICAvKioKICAgICAqIE1hcCBjYXRlZ29yeSB2YXJpYWJsZSAoVUNoYXIpIHRvIHNldCAoVW5pY29kZVNldCkuCiAgICAgKiBWYXJpYWJsZXMgdGhhdCBjb3JyZXNwb25kIHRvIGEgc2V0IG9mIGNoYXJhY3RlcnMgYXJlIG1hcHBlZAogICAgICogZnJvbSB2YXJpYWJsZSBuYW1lIHRvIGEgc3RhbmQtaW4gY2hhcmFjdGVyIGluIGRhdGEudmFyaWFibGVOYW1lcy4KICAgICAqIFRoZSBzdGFuZC1pbiB0aGVuIHNlcnZlcyBhcyBhIGtleSBpbiB0aGlzIGhhc2ggdG8gbG9va3VwIHRoZQogICAgICogYWN0dWFsIFVuaWNvZGVTZXQgb2JqZWN0LiAgSW4gYWRkaXRpb24sIHRoZSBzdGFuZC1pbiBpcwogICAgICogc3RvcmVkIGluIHRoZSBydWxlIHRleHQgdG8gcmVwcmVzZW50IHRoZSBzZXQgb2YgY2hhcmFjdGVycy4KICAgICAqIHNldFZhcmlhYmxlc1tpXSByZXByZXNlbnRzIGNoYXJhY3RlciAoc2V0VmFyaWFibGVzQmFzZSArIGkpLgogICAgICovCiAgICBVbmljb2RlU2V0Kiogc2V0VmFyaWFibGVzOwogICAgCiAgICAvKioKICAgICAqIFRoZSBjaGFyYWN0ZXIgdGhhdCByZXByZXNlbnRzIHNldFZhcmlhYmxlc1swXS4gIENoYXJhY3RlcnMKICAgICAqIHNldFZhcmlhYmxlc0Jhc2UgdGhyb3VnaCBzZXRWYXJpYWJsZXNCYXNlICsKICAgICAqIHNldFZhcmlhYmxlcy5sZW5ndGggLSAxIHJlcHJlc2VudCBVbmljb2RlU2V0IG9iamVjdHMuCiAgICAgKi8KICAgIFVDaGFyIHNldFZhcmlhYmxlc0Jhc2U7CgogICAgLyoqCiAgICAgKiBUaGUgbGVuZ3RoIG9mIHNldFZhcmlhYmxlcy4KICAgICAqLwogICAgaW50MzJfdCBzZXRWYXJpYWJsZXNMZW5ndGg7CgogICAgLyoqCiAgICAgKiBUaGUgY2hhcmFjdGVyIHRoYXQgcmVwcmVzZW50cyBzZWdtZW50IDEuICBDaGFyYWN0ZXJzIHNlZ21lbnRCYXNlCiAgICAgKiB0aHJvdWdoIHNlZ21lbnRCYXNlICsgOCByZXByZXNlbnQgc2VnbWVudHMgMSB0aHJvdWdoIDkuCiAgICAgKi8KICAgIFVDaGFyIHNlZ21lbnRCYXNlOwoKcHVibGljOgoKICAgIFRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhKFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEoY29uc3QgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEmKTsKCiAgICB+VHJhbnNsaXRlcmF0aW9uUnVsZURhdGEoKTsKICAgIAoJY29uc3QgVW5pY29kZVNldCogbG9va3VwU2V0KFVDaGFyIHN0YW5kSW4pIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgogICAgICogY2hhcmFjdGVyLCBvciAtMSBpZiBub25lLiAgUmVwZWF0OiBUaGlzIGlzIGEgemVyby1iYXNlZCByZXR1cm4gdmFsdWUsCiAgICAgKiAwLi44LCBldmVuIHRob3VnaCB0aGVzZSBhcmUgbm90YXRlZCAiJDEiLi4iJDkiLgogICAgICovCiAgICBpbnQzMl90IGxvb2t1cFNlZ21lbnRSZWZlcmVuY2UoVUNoYXIgYykgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciB1c2VkIHRvIHN0YW5kIGZvciB0aGUgZ2l2ZW4gc2VnbWVudCByZWZlcmVuY2UuCiAgICAgKiBUaGUgcmVmZXJlbmNlIG11c3QgYmUgaW4gdGhlIHJhbmdlIDEuLjkuCiAgICAgKi8KICAgIFVDaGFyIGdldFNlZ21lbnRTdGFuZGluKGludDMyX3QgcmVmKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHNlZ21lbnRCYXNlICsgcmVmIC0gMTsKICAgIH0KfTsKCiNlbmRpZgo=