LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBVTklDRENNLkgKKgoqIFVuaWNvZGVDbGFzc01hcHBpbmcgbWFwcyBjaGFyYWN0ZXJzIHRvIHN0YXRlIGNoYW5nZSBpbnB1dHMgZm9yIFdvcmRCcmVha1RhYmxlLgoqCiogQHBhY2thZ2UgIFRleHQgYW5kIEludGVybmF0aW9uYWwKKiBAY2F0ZWdvcnkgVGV4dCBTY2FubmluZwoqCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwMi8xOC85NyAgICBhbGl1ICAgICAgICBDb252ZXJ0ZWQgZnJvbSBPcGVuQ2xhc3MuCiogICAwNS8wNi85NyAgICBhbGl1ICAgICAgICBNYWRlIFNwZWNpYWxNYXBwaW5nIGFuIGFycmF5IG9mIG9iamVjdHMgaW5zdGVhZCBvZiBwb2ludGVycywKKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGhlbHAgb3V0IG5vbi1jb21wbGlhbnQgY29tcGlsZXJzLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBVTklDRENNX0gKI2RlZmluZSBVTklDRENNX0gKCiNpbmNsdWRlICJzcGNsbWFwLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaWNvZGUuaCIKCi8qKgogKiBUaGlzIGNsYXNzIG1hcHMgY2hhcmFjdGVycyB0byBzdGF0ZSBjaGFuZ2UgaW5wdXRzIGZvcgogKiBXb3JkQnJlYWtUYWJsZS4gIElmIHRoZSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgZXhjZXB0aW9uIGxpc3QsCiAqIHRoZSBtYXBwaW5nIHRoZXJlIGlzIHJldHVuZWQsIG90aGVyd2lzZSB0aGUgbWFwcGluZyByZXR1cm5lZCBieQogKiBJVW5pY29kZTo6dHlwZSBpcyByZXR1cm5lZC4KICoKICogTm90ZSBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGNoYXJhY3RlcnMgZnJvbSAweDAwNDAgdG8gMHgwMDlmIGFsd2F5cyB1c2UgdGhlCiAqIG1hcHBpbmcgcmV0dXJuZWQgYnkgSVVuaWNvZGU6OnR5cGUgYW5kIG5ldmVyIHRoZSBleGNlcHRpb24gbGlzdC4KICovCmNsYXNzIFVuaWNvZGVDbGFzc01hcHBpbmcgewpwdWJsaWM6CiAgICAvLyBGb3IgY29udmVuaWVuY2UKICAgIHR5cGVkZWYgVGV4dEJvdW5kYXJ5RGF0YTo6VHlwZSBUeXBlOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbWFwcGluZyBnaXZlbiBhIG1hcHBpbmcgZnJvbSBjYXRlZ29yaWVzIGFuZCBhIGxpc3QKICAgICAqIG9mIGV4Y2VwdGlvbnMuICBCb3RoIHRoZSBtYXBwaW5nIGxpc3QgYW5kIGV4Y2VwdGlvbkNoYXJzIGxpc3QgbXVzdAogICAgICogYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4KICAgICAqLwogICAgVW5pY29kZUNsYXNzTWFwcGluZyhUeXBlKiBtYXBwZWRWYWx1ZSwgCiAgICAgICAgICAgIGludDMyX3QgbWFwcGVkVmFsdWVfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGVjaWFsTWFwcGluZyogZXhjZXB0aW9uQ2hhcnMsIAogICAgICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNoYXJzX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUJvb2wqIGhhc0V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSogYXNpaVZhbHVlcyApOwogICAgCiAgICAvKioKICAgICAqIE1hcCBhIGNoYXJhY3RlciB0byBhIHN0YXRlIGNoYW5nZSBpbnB1dCBmb3IgV29yZEJyZWFrVGFibGUuCiAgICAgKiBAcGFyYW0gY2ggdGhlIGNoYXJhY3RlciB0byBtYXAuCiAgICAgKiBAcmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUuCiAgICAgKi8KICAgIFR5cGUgbWFwcGVkQ2hhcihVQ2hhciBjaCkgY29uc3Q7Cgpwcml2YXRlOgogICAgY29uc3QgVUJvb2wgICAgICAgICAgICAqZkhhc0V4Y2VwdGlvbjsKICAgIGNvbnN0IFR5cGUqICAgICAgICAgICAgIGZNYXBwZWRWYWx1ZTsKICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgIGZNYXBwZWRWYWx1ZV9sZW5ndGg7CiAgICBjb25zdCBTcGVjaWFsTWFwcGluZyogICBmRXhjZXB0aW9uQ2hhcnM7CiAgICBjb25zdCBpbnQzMl90ICAgICAgICAgICBmRXhjZXB0aW9uQ2hhcnNfbGVuZ3RoOwogICAgY29uc3QgVHlwZSogICAgICAgICAgICAgZkFzY2lpVmFsdWVzOwp9OwoKI2VuZGlmIC8vIF9VTklDRENNCi8vZW9mCg==