LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBVTklDRENNLkgKKgoqIFVuaWNvZGVDbGFzc01hcHBpbmcgbWFwcyBjaGFyYWN0ZXJzIHRvIHN0YXRlIGNoYW5nZSBpbnB1dHMgZm9yIFdvcmRCcmVha1RhYmxlLgoqCiogQHBhY2thZ2UgIFRleHQgYW5kIEludGVybmF0aW9uYWwKKiBAY2F0ZWdvcnkgVGV4dCBTY2FubmluZwoqCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwMi8xOC85NyAgICBhbGl1ICAgICAgICBDb252ZXJ0ZWQgZnJvbSBPcGVuQ2xhc3MuCiogICAwNS8wNi85NyAgICBhbGl1ICAgICAgICBNYWRlIFNwZWNpYWxNYXBwaW5nIGFuIGFycmF5IG9mIG9iamVjdHMgaW5zdGVhZCBvZiBwb2ludGVycywKKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGhlbHAgb3V0IG5vbi1jb21wbGlhbnQgY29tcGlsZXJzLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBVTklDRENNX0gKI2RlZmluZSBVTklDRENNX0gKCiNpbmNsdWRlICJzcGNsbWFwLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaWNvZGUuaCIKCi8qKgogKiBUaGlzIGNsYXNzIG1hcHMgY2hhcmFjdGVycyB0byBzdGF0ZSBjaGFuZ2UgaW5wdXRzIGZvcgogKiBXb3JkQnJlYWtUYWJsZS4gIElmIHRoZSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgZXhjZXB0aW9uIGxpc3QsCiAqIHRoZSBtYXBwaW5nIHRoZXJlIGlzIHJldHVuZWQsIG90aGVyd2lzZSB0aGUgbWFwcGluZyByZXR1cm5lZCBieQogKiBJVW5pY29kZTo6dHlwZSBpcyByZXR1cm5lZC4KICoKICogTm90ZSBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGNoYXJhY3RlcnMgZnJvbSAweDAwNDAgdG8gMHgwMDlmIGFsd2F5cyB1c2UgdGhlCiAqIG1hcHBpbmcgcmV0dXJuZWQgYnkgSVVuaWNvZGU6OnR5cGUgYW5kIG5ldmVyIHRoZSBleGNlcHRpb24gbGlzdC4KICovCmNsYXNzIFVuaWNvZGVDbGFzc01hcHBpbmcgewpwdWJsaWM6CiAgICAvLyBGb3IgY29udmVuaWVuY2UKICAgIHR5cGVkZWYgVGV4dEJvdW5kYXJ5RGF0YTo6VHlwZSBUeXBlOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbWFwcGluZyBnaXZlbiBhIG1hcHBpbmcgZnJvbSBjYXRlZ29yaWVzIGFuZCBhIGxpc3QKICAgICAqIG9mIGV4Y2VwdGlvbnMuICBCb3RoIHRoZSBtYXBwaW5nIGxpc3QgYW5kIGV4Y2VwdGlvbkNoYXJzIGxpc3QgbXVzdAogICAgICogYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4KICAgICAqLwogICAgVW5pY29kZUNsYXNzTWFwcGluZyhUeXBlKiBtYXBwZWRWYWx1ZSwgCiAgICAgICAgICAgIGludDMyX3QgbWFwcGVkVmFsdWVfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGVjaWFsTWFwcGluZyogZXhjZXB0aW9uQ2hhcnMsIAogICAgICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNoYXJzX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbF90KiBoYXNFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUqIGFzaWlWYWx1ZXMgKTsKICAgIAogICAgLyoqCiAgICAgKiBNYXAgYSBjaGFyYWN0ZXIgdG8gYSBzdGF0ZSBjaGFuZ2UgaW5wdXQgZm9yIFdvcmRCcmVha1RhYmxlLgogICAgICogQHBhcmFtIGNoIHRoZSBjaGFyYWN0ZXIgdG8gbWFwLgogICAgICogQHJldHVybiB0aGUgbWFwcGVkIHZhbHVlLgogICAgICovCiAgICBUeXBlIG1hcHBlZENoYXIoVUNoYXIgY2gpIGNvbnN0OwoKcHJpdmF0ZToKICAgIGNvbnN0IGJvb2xfdCAgICAgICAgICAgICpmSGFzRXhjZXB0aW9uOwogICAgY29uc3QgVHlwZSogICAgICAgICAgICAgZk1hcHBlZFZhbHVlOwogICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgZk1hcHBlZFZhbHVlX2xlbmd0aDsKICAgIGNvbnN0IFNwZWNpYWxNYXBwaW5nKiAgIGZFeGNlcHRpb25DaGFyczsKICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgIGZFeGNlcHRpb25DaGFyc19sZW5ndGg7CiAgICBjb25zdCBUeXBlKiAgICAgICAgICAgICBmQXNjaWlWYWx1ZXM7Cn07CgojZW5kaWYgLy8gX1VOSUNEQ00KLy9lb2YK