LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMTEvMTcvOTkgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KI2lmbmRlZiBVTklGTFRMR19ICiNkZWZpbmUgVU5JRkxUTEdfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCgpjbGFzcyBVbmljb2RlRmlsdGVyOwoKLyoqCiAqIDxjb2RlPlVuaWNvZGVGaWx0ZXJMb2dpYzwvY29kZT4gcHJvdmlkZXMgbG9naWNhbCBvcGVyYXRvcnMgb24KICoge0BsaW5rIFVuaWNvZGVGaWx0ZXJ9IG9iamVjdHMuICBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQ7CiAqIGl0IGNvbnNpc3RzIG9ubHkgb2Ygc3RhdGljIG1ldGhvZHMuICBUaGUgc3RhdGljIG1ldGhvZHMgcmV0dXJuCiAqIGZpbHRlciBvYmplY3RzIHRoYXQgcGVyZm9ybSBsb2dpY2FsIGludmVyc2lvbiAoPHR0Pm5vdDwvdHQ+KSwKICogaW50ZXJzZWN0aW9uICg8dHQ+YW5kPC90dD4pLCBvciB1bmlvbiAoPHR0Pm9yPC90dD4pIG9mIHRoZSBnaXZlbgogKiBmaWx0ZXIgb2JqZWN0cy4KICovCmNsYXNzIFVfSTE4Tl9BUEkgVW5pY29kZUZpbHRlckxvZ2ljIHsKCnB1YmxpYzoKCiAgICAvKioKICAgICAqIFJldHVybnMgYSA8dHQ+VW5pY29kZUZpbHRlcjwvdHQ+IHRoYXQgaW1wbGVtZW50cyB0aGUgaW52ZXJzZSBvZgogICAgICogdGhlIGdpdmVuIGZpbHRlci4KICAgICAqLwogICAgc3RhdGljIFVuaWNvZGVGaWx0ZXIqIGNyZWF0ZU5vdChjb25zdCBVbmljb2RlRmlsdGVyJiBmKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSA8dHQ+VW5pY29kZUZpbHRlcjwvdHQ+IHRoYXQgaW1wbGVtZW50cyBhIHNob3J0CiAgICAgKiBjaXJjdWl0IEFORCBvZiB0aGUgcmVzdWx0IG9mIHRoZSB0d28gZ2l2ZW4gZmlsdGVycy4gIFRoYXQgaXMsCiAgICAgKiBpZiA8dHQ+Zi5jb250YWlucygpPC90dD4gaXMgPHR0PmZhbHNlPC90dD4sIHRoZW4gPHR0PmcuY29udGFpbnMoKTwvdHQ+CiAgICAgKiBpcyBub3QgY2FsbGVkLCBhbmQgPHR0PmNvbnRhaW5zKCk8L3R0PiByZXR1cm5zIDx0dD5mYWxzZTwvdHQ+LgogICAgICoKICAgICAqIDxwPkVpdGhlciA8dHQ+ZjwvdHQ+IG9yIDx0dD5nPC90dD4gbXVzdCBiZSBub24tbnVsbC4KICAgICAqLwogICAgc3RhdGljIFVuaWNvZGVGaWx0ZXIqIGNyZWF0ZUFuZChjb25zdCBVbmljb2RlRmlsdGVyJiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlRmlsdGVyJiBnKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSA8dHQ+VW5pY29kZUZpbHRlcjwvdHQ+IHRoYXQgaW1wbGVtZW50cyBhIHNob3J0CiAgICAgKiBjaXJjdWl0IEFORCBvZiB0aGUgcmVzdWx0IG9mIHRoZSBnaXZlbiBmaWx0ZXJzLiAgVGhhdCBpcywgaWYKICAgICAqIDx0dD5mW2ldLmNvbnRhaW5zKCk8L3R0PiBpcyA8dHQ+ZmFsc2U8L3R0PiwgdGhlbgogICAgICogPHR0PmZbal0uY29udGFpbnMoKTwvdHQ+IGlzIG5vdCBjYWxsZWQsIHdoZXJlIDx0dD5qID4gaTwvdHQ+LCBhbmQKICAgICAqIDx0dD5jb250YWlucygpPC90dD4gcmV0dXJucyA8dHQ+ZmFsc2U8L3R0Pi4KICAgICAqLwogICAgLy8gc3RhdGljIFVuaWNvZGVGaWx0ZXIqIGFuZChjb25zdCBVbmljb2RlRmlsdGVyKiogZik7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgPHR0PlVuaWNvZGVGaWx0ZXI8L3R0PiB0aGF0IGltcGxlbWVudHMgYSBzaG9ydAogICAgICogY2lyY3VpdCBPUiBvZiB0aGUgcmVzdWx0IG9mIHRoZSB0d28gZ2l2ZW4gZmlsdGVycy4gIFRoYXQgaXMsIGlmCiAgICAgKiA8dHQ+Zi5jb250YWlucygpPC90dD4gaXMgPHR0PnRydWU8L3R0PiwgdGhlbiA8dHQ+Zy5jb250YWlucygpPC90dD4gaXMKICAgICAqIG5vdCBjYWxsZWQsIGFuZCA8dHQ+Y29udGFpbnMoKTwvdHQ+IHJldHVybnMgPHR0PnRydWU8L3R0Pi4KICAgICAqCiAgICAgKiA8cD5FaXRoZXIgPHR0PmY8L3R0PiBvciA8dHQ+ZzwvdHQ+IG11c3QgYmUgbm9uLW51bGwuCiAgICAgKi8KICAgIHN0YXRpYyBVbmljb2RlRmlsdGVyKiBjcmVhdGVPcihjb25zdCBVbmljb2RlRmlsdGVyJiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVGaWx0ZXImIGcpOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIDx0dD5Vbmljb2RlRmlsdGVyPC90dD4gdGhhdCBpbXBsZW1lbnRzIGEgc2hvcnQKICAgICAqIGNpcmN1aXQgT1Igb2YgdGhlIHJlc3VsdCBvZiB0aGUgZ2l2ZW4gZmlsdGVycy4gIFRoYXQgaXMsIGlmCiAgICAgKiA8dHQ+ZltpXS5jb250YWlucygpPC90dD4gaXMgPHR0PmZhbHNlPC90dD4sIHRoZW4KICAgICAqIDx0dD5mW2pdLmNvbnRhaW5zKCk8L3R0PiBpcyBub3QgY2FsbGVkLCB3aGVyZSA8dHQ+aiA+IGk8L3R0PiwgYW5kCiAgICAgKiA8dHQ+Y29udGFpbnMoKTwvdHQ+IHJldHVybnMgPHR0PnRydWU8L3R0Pi4KICAgICAqLwogICAgLy8gc3RhdGljIFVuaWNvZGVGaWx0ZXIqIG9yKGNvbnN0IFVuaWNvZGVGaWx0ZXIqKiBmKTsKCiAgICAvLyBUT0RPOiBBZGQgbmFuZCgpICYgbm9yKCkgZm9yIGNvbnZlbmllbmNlLCBpZiBuZWVkZWQuCgpwcml2YXRlOgogICAgLy8gRGlzYWxsb3cgaW5zdGFudGlhdGlvbgogICAgVW5pY29kZUZpbHRlckxvZ2ljKCk7Cn07CgppbmxpbmUgVW5pY29kZUZpbHRlckxvZ2ljOjpVbmljb2RlRmlsdGVyTG9naWMoKSB7fQoKI2VuZGlmCg==