LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBTUENMTUFQLkgKKgoqIFNwZWNpYWxNYXBwaW5nIHJlcHJlc2VudHMgZXhjZXB0aW9ucyB0byB0aGUgbm9ybWFsIHVuaWNvZGUgY2F0ZWdvcnkgbWFwcGluZy4KKgoqIEBwYWNrYWdlICBUZXh0IGFuZCBJbnRlcm5hdGlvbmFsCiogQGNhdGVnb3J5IFRleHQgU2Nhbm5pbmcKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMDIvMTgvOTcgICAgYWxpdSAgICAgICAgQ29udmVydGVkIGZyb20gT3BlbkNsYXNzLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBTUENMTUFQX0gKI2RlZmluZSBTUENMTUFQX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIiAvLyBVQ2hhcgojaW5jbHVkZSAidHh0YmRhdC5oIgoKLyoqCiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyByYW5nZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBleGNlcHRpb25zIHRvIHRoZSBub3JtYWwKICogdW5pY29kZSBjYXRlZ29yeSBtYXBwaW5nLiAgQ2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBjaGFyIHRvIHRoZSBlbmQgY2hhciwKICogaW5jbHVzaXZlLCBhcmUgbWFwcGVkIHRvIHRoZSBuZXcgdmFsdWUuCiAqLwpjbGFzcyBTcGVjaWFsTWFwcGluZyB7CnB1YmxpYzoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgc3BlY2lhbCBtYXBwaW5nIGZyb20gdGhlIHNpbmdsZSBjaGFyIGNoIHRvIHRoZSB2YWx1ZSBudi4KICAgICAqLwogICAgU3BlY2lhbE1hcHBpbmcoVUNoYXIgY2gsIFRleHRCb3VuZGFyeURhdGE6OlR5cGUgbnYpIDogZlN0YXJ0Q2hhcihjaCksIGZFbmRDaGFyKGNoKSwgZk5ld1ZhbHVlKG52KSB7fQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgc3BlY2lhbCBtYXBwaW5nIGZyb20gdGhlIHJhbmdlIG9mIGNoYXJzIHNjaCAtIGVjaCwgaW5jbHVzaXZlLCB0byB0aGUgdmFsdWUgbnYuCiAgICAgKi8KICAgIFNwZWNpYWxNYXBwaW5nKFVDaGFyIHNjaCwgVUNoYXIgZWNoLCBUZXh0Qm91bmRhcnlEYXRhOjpUeXBlIG52KSA6IGZTdGFydENoYXIoc2NoKSwgZkVuZENoYXIoZWNoKSwgZk5ld1ZhbHVlKG52KSB7fQoKICAgIC8qKgogICAgICogVGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcmFuZ2UuCiAgICAgKi8KICAgIFVDaGFyIGZTdGFydENoYXI7CgogICAgLyoqCiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHJhbmdlLgogICAgICovCiAgICBVQ2hhciBmRW5kQ2hhcjsKCiAgICAvKioKICAgICAqIFRoZSBjaGFyYWN0ZXIgbWFwcGluZyB0byB1c2UuCiAgICAgKi8KICAgIFRleHRCb3VuZGFyeURhdGE6OlR5cGUgZk5ld1ZhbHVlOwpwcml2YXRlOgogICAgU3BlY2lhbE1hcHBpbmcoKSB7fQp9OwoKI2VuZGlmIC8vIF9TUENMTUFQCi8vZW9mCg==