LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBGT1JNQVQuSAoqCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwMi8xOS85NyAgICBhbGl1ICAgICAgICBDb252ZXJ0ZWQgZnJvbSBqYXZhLgoqICAgMDMvMTcvOTcgICAgY2xodWFuZyAgICAgVXBkYXRlZCBwZXIgQysrIGltcGxlbWVudGF0aW9uLgoqICAgMDMvMjcvOTcgICAgaGVsZW5hICAgICAgVXBkYXRlZCB0byBwYXNzIHRoZSBzaW1wbGUgdGVzdCBhZnRlciBjb2RlIHJldmlldy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgamF2YSBzb3VyY2UgZmlsZSBGb3JtYXQuamF2YQovLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiNpZm5kZWYgRk9STUFUX0gKI2RlZmluZSBGT1JNQVRfSAogCgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCiNpbmNsdWRlICJ1bmljb2RlL2ZtdGFibGUuaCIKI2luY2x1ZGUgInVuaWNvZGUvZmllbGRwb3MuaCIKI2luY2x1ZGUgInVuaWNvZGUvcGFyc2Vwb3MuaCIKCi8qKiAKICogQmFzZSBjbGFzcyBmb3IgYWxsIGZvcm1hdHMuICBUaGlzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3Mgd2hpY2gKICogc3BlY2lmaWVzIHRoZSBwcm90b2NvbCBmb3IgY2xhc3NlcyB3aGljaCBjb252ZXJ0IG90aGVyIG9iamVjdHMgb3IKICogdmFsdWVzLCBzdWNoIGFzIG51bWVyaWMgdmFsdWVzIGFuZCBkYXRlcywgYW5kIHRoZWlyIHN0cmluZwogKiByZXByZXNlbnRhdGlvbnMuICBJbiBzb21lIGNhc2VzIHRoZXNlIHJlcHJlc2VudGF0aW9ucyBtYXkgYmUKICogbG9jYWxpemVkIG9yIGNvbnRhaW4gbG9jYWxpemVkIGNoYXJhY3RlcnMgb3Igc3RyaW5ncy4gIEZvciBleGFtcGxlLAogKiBhIG51bWVyaWMgZm9ybWF0dGVyIHN1Y2ggYXMgRGVjaW1hbEZvcm1hdCBtYXkgY29udmVydCBhIG51bWVyaWMKICogdmFsdWUgc3VjaCBhcyAxMjM0NSB0byB0aGUgc3RyaW5nICIkMTIsMzQ1Ii4gIEl0IG1heSBhbHNvIHBhcnNlCiAqIHRoZSBzdHJpbmcgYmFjayBpbnRvIGEgbnVtZXJpYyB2YWx1ZS4gIEEgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZXIKICogbGlrZSBTaW1wbGVEYXRlRm9ybWF0IG1heSByZXByZXNlbnQgYSBzcGVjaWZpYyBkYXRlLCBlbmNvZGVkCiAqIG51bWVyaWNhbGx5LCBhcyBhIHN0cmluZyBzdWNoIGFzICJXZWRuZXNkYXksIEZlYnJ1YXJ5IDI2LCAxOTk3IEFEIi4KICogPFA+CiAqIE1hbnkgb2YgdGhlIGNvbmNyZXRlIHN1YmNsYXNzZXMgb2YgRm9ybWF0IGVtcGxveSB0aGUgbm90aW9uIG9mCiAqIGEgcGF0dGVybi4gIEEgcGF0dGVybiBpcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcnVsZXMgd2hpY2gKICogZ292ZXJuIHRoZSBpbnRlcmNvbnZlcnNpb24gYmV0d2VlbiB2YWx1ZXMgYW5kIHN0cmluZ3MuICBGb3IgZXhhbXBsZSwKICogYSBEZWNpbWFsRm9ybWF0IG9iamVjdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXR0ZXJuCiAqICIkIywjIzAuMDA7KCQjLCMjMC4wMCkiLCB3aGljaCBpcyBhIGNvbW1vbiBVUyBFbmdsaXNoIGZvcm1hdCBmb3IKICogY3VycmVuY3kgdmFsdWVzLCB5aWVsZGluZyBzdHJpbmdzIHN1Y2ggYXMgIiQxLDIzNC40NSIgZm9yIDEyMzQuNDUsCiAqIGFuZCAiKCQ5ODcuNjUpIiBmb3IgOTg3LjY1NDMuICBUaGUgc3BlY2lmaWMgc3ludGF4IG9mIGEgcGF0dGVybgogKiBpcyBkZWZpbmVkIGJ5IGVhY2ggc3ViY2xhc3MuCiAqIDxQPgogKiBFdmVuIHRob3VnaCBtYW55IHN1YmNsYXNzZXMgdXNlIHBhdHRlcm5zLCB0aGUgbm90aW9uIG9mIGEgcGF0dGVybgogKiBpcyBub3QgaW5oZXJlbnQgdG8gRm9ybWF0IGNsYXNzZXMgaW4gZ2VuZXJhbCwgYW5kIGlzIG5vdCBwYXJ0IG9mCiAqIHRoZSBleHBsaWNpdCBiYXNlIGNsYXNzIHByb3RvY29sLgogKiA8UD4KICogVHdvIGNvbXBsZXggZm9ybWF0dGluZyBjbGFzc2VzIGJlYXIgbWVudGlvbmluZy4gIFRoZXNlIGFyZQogKiBNZXNzYWdlRm9ybWF0IGFuZCBDaG9pY2VGb3JtYXQuICBDaG9pY2VGb3JtYXQgaXMgYSBzdWJjbGFzcyBvZgogKiBOdW1iZXJGb3JtYXQgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIGZvcm1hdCBkaWZmZXJlbnQgbnVtYmVyIHJhbmdlcwogKiBhcyBzdHJpbmdzLiAgRm9yIGluc3RhbmNlLCAwIG1heSBiZSByZXByZXNlbnRlZCBhcyAibm8gZmlsZXMiLCAxIGFzCiAqICJvbmUgZmlsZSIsIGFuZCBhbnkgbnVtYmVyIGdyZWF0ZXIgdGhhbiAxIGFzICJtYW55IGZpbGVzIi4KICogTWVzc2FnZUZvcm1hdCBpcyBhIGZvcm1hdHRlciB3aGljaCB1dGlsaXplcyBvdGhlciBGb3JtYXQgb2JqZWN0cyB0bwogKiBmb3JtYXQgYSBzdHJpbmcgY29udGFpbmluZyB3aXRoIG11bHRpcGxlIHZhbHVlcy4gIEZvciBpbnN0YW5jZSwKICogQSBNZXNzYWdlRm9ybWF0IG9iamVjdCBtaWdodCBwcm9kdWNlIHRoZSBzdHJpbmcgIlRoZXJlIGFyZSBubyBmaWxlcwogKiBvbiB0aGUgZGlzayBNeURpc2sgb24gRmVicnVhcnkgMjcsIDE5OTcuIiBnaXZlbiB0aGUgYXJndW1lbnRzIDAsCiAqICJNeURpc2siLCBhbmQgdGhlIGRhdGUgdmFsdWUgb2YgMi8yNy85Ny4gIFNlZSB0aGUgQ2hvaWNlRm9ybWF0CiAqIGFuZCBNZXNzYWdlRm9ybWF0IGhlYWRlcnMgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCiAqIDxQPgogKiBJZiBmb3JtYXR0aW5nIGlzIHVuc3VjY2Vzc2Z1bCwgYSBmYWlsaW5nIFVFcnJvckNvZGUgaXMgcmV0dXJuZWQgd2hlbgogKiB0aGUgRm9ybWF0IGNhbm5vdCBmb3JtYXQgdGhlIHR5cGUgb2Ygb2JqZWN0LCBvdGhlcndpc2UgaWYgdGhlcmUgaXMKICogc29tZXRoaW5nIGlsbGZvcm1lZCBhYm91dCB0aGUgdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCiAqIDB4RkZGRCBpcyByZXR1cm5lZC4KICogPFA+CiAqIElmIHRoZXJlIGlzIG5vIG1hdGNoIHdoZW4gcGFyc2luZywgYSBwYXJzZSBmYWlsdXJlIFVFcnJvckNvZGUgaXMKICogcmV0dXJlZCBmb3IgbWV0aG9kcyB3aGljaCB0YWtlIG5vIFBhcnNlUG9zaXRpb24uICBGb3IgdGhlIG1ldGhvZAogKiB0aGF0IHRha2VzIGEgUGFyc2VQb3NpdGlvbiwgdGhlIGluZGV4IHBhcmFtZXRlciBpcyBsZWZ0IHVuY2hhbmdlZC4KICogPFA+CiAqIFtTdWJjbGFzc2luZy5dIEFsbCBiYXNlIGNsYXNzZXMgdGhhdCBwcm92aWRlIHN0YXRpYyBmdW5jdGlvbnMgdGhhdAogKiBjcmVhdGUgb2JqZWN0cyBmb3IgTG9jYWxlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHN0YXRpYzoKICogPHByZT4KICogLiAgICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgTG9jYWxlKiBnZXRBdmFpbGFibGVMb2NhbGVzKGxvbmcmKQogKiA8L3ByZT4KICovCmNsYXNzIFVfSTE4Tl9BUEkgRm9ybWF0IHsKcHVibGljOgoKICAgIHZpcnR1YWwgfkZvcm1hdCgpOwoKICAgIC8qKgogICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIEZvcm1hdCBvYmplY3RzIGFyZSBzZW1hbnRpY2FsbHkgZXF1YWwuCiAgICAgKiBPYmplY3RzIG9mIGRpZmZlcmVudCBzdWJjbGFzc2VzIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuCiAgICAgKi8KICAgIHZpcnR1YWwgYm9vbF90IG9wZXJhdG9yPT0oY29uc3QgRm9ybWF0JiBvdGhlcikgY29uc3QgPSAwOwoKICAgIC8qKgogICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIEZvcm1hdCBvYmplY3RzIGFyZSBub3Qgc2VtYW50aWNhbGx5CiAgICAgKiBlcXVhbC4KICAgICAqLwogICAgYm9vbF90IG9wZXJhdG9yIT0oY29uc3QgRm9ybWF0JiBvdGhlcikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CgogICAgLyoqCiAgICAgKiBDbG9uZSB0aGlzIG9iamVjdCBwb2x5bW9ycGhpY2FsbHkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCiAgICAgKiBmb3IgZGVsZXRpbmcgdGhlIHJlc3VsdCB3aGVuIGRvbmUuCiAgICAgKi8KICAgIHZpcnR1YWwgRm9ybWF0KiBjbG9uZSgpIGNvbnN0ID0gMDsKCiAgICAvKioKICAgICAqIEZvcm1hdHMgYW4gb2JqZWN0IHRvIHByb2R1Y2UgYSBzdHJpbmcuCiAgICAgKgogICAgICogQHBhcmFtIG9iaiAgICAgICBUaGUgb2JqZWN0IHRvIGZvcm1hdC4KICAgICAqIEBwYXJhbSByZXN1bHQgICAgT3V0cHV0IHBhcmFtZXRlciB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZQogICAgICogICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgc3RyaW5nLgogICAgICogQHBhcmFtIHN0YXR1cyAgICBPdXRwdXQgcGFyYW1ldGVyIGZpbGxlZCBpbiB3aXRoIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBzdGF0dXMuCiAgICAgKiBAcmV0dXJuICAgICAgICAgIFJlZmVyZW5jZSB0byAncmVzdWx0JyBwYXJhbWV0ZXIuCiAgICAgKi8KICAgIFVuaWNvZGVTdHJpbmcmIGZvcm1hdChjb25zdCBGb3JtYXR0YWJsZSYgb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmIHJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpIGNvbnN0OwoKICAgIC8qKgogICAgICogRm9ybWF0IGFuIG9iamVjdCB0byBwcm9kdWNlIGEgc3RyaW5nLiAgVGhpcyBpcyBhIHB1cmUgdmlydHVhbCBtZXRob2Qgd2hpY2gKICAgICAqIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuIFRoaXMgbWV0aG9kIGFsbG93cyBwb2x5bW9ycGhpYyBmb3JtYXR0aW5nCiAgICAgKiBvZiBGb3JtYXR0YWJsZSBvYmplY3RzLiBJZiBhIHN1YmNsYXNzIG9mIEZvcm1hdCByZWNlaXZlcyBhIEZvcm1hdHRhYmxlCiAgICAgKiBvYmplY3QgdHlwZSBpdCBkb2Vzbid0IGhhbmRsZSAoZS5nLiwgaWYgYSBudW1lcmljIEZvcm1hdHRhYmxlIGlzIHBhc3NlZAogICAgICogdG8gYSBEYXRlRm9ybWF0IG9iamVjdCkgdGhlbiBpdCByZXR1cm5zIGEgZmFpbGluZyBVRXJyb3JDb2RlLgogICAgICoKICAgICAqIEBwYXJhbSBvYmogICAgICAgICAgIFRoZSBvYmplY3QgdG8gZm9ybWF0LgogICAgICogQHBhcmFtIHRvQXBwZW5kVG8gICAgV2hlcmUgdGhlIHRleHQgaXMgdG8gYmUgYXBwZW5kZWQuCiAgICAgKiBAcGFyYW0gcG9zICAgICAgICAgICBPbiBpbnB1dDogYW4gYWxpZ25tZW50IGZpZWxkLCBpZiBkZXNpcmVkLgogICAgICogICAgICAgICAgICAgICAgICAgICAgT24gb3V0cHV0OiB0aGUgb2Zmc2V0cyBvZiB0aGUgYWxpZ25tZW50IGZpZWxkLgogICAgICogQHBhcmFtIHN0YXR1cyAgICAgICAgT3V0cHV0IHBhcmFtIGZpbGxlZCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMuCiAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBUaGUgdmFsdWUgcGFzc2VkIGluIGFzIHRvQXBwZW5kVG8gKHRoaXMgYWxsb3dzIGNoYWluaW5nLAogICAgICogICAgICAgICAgICAgICAgICAgICAgYXMgd2l0aCBVbmljb2RlU3RyaW5nOjphcHBlbmQoKSkKICAgICAqLwogICAgdmlydHVhbCBVbmljb2RlU3RyaW5nJiBmb3JtYXQoY29uc3QgRm9ybWF0dGFibGUmIG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmIHRvQXBwZW5kVG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFBvc2l0aW9uJiBwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpIGNvbnN0ID0gMDsKCiAgICAvKioKICAgICAqIFBhcnNlIGEgc3RyaW5nIHRvIHByb2R1Y2UgYW4gb2JqZWN0LiAgVGhpcyBpcyBhIHB1cmUgdmlydHVhbAogICAgICogbWV0aG9kIHdoaWNoIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuICBUaGlzIG1ldGhvZCBhbGxvd3MKICAgICAqIHBvbHltb3JwaGljIHBhcnNpbmcgb2Ygc3RyaW5ncyBpbnRvIEZvcm1hdHRhYmxlIG9iamVjdHMuCiAgICAgKiA8UD4KICAgICAqIEJlZm9yZSBjYWxsaW5nLCBzZXQgcGFyc2VfcG9zLmluZGV4IHRvIHRoZSBvZmZzZXQgeW91IHdhbnQgdG8KICAgICAqIHN0YXJ0IHBhcnNpbmcgYXQgaW4gdGhlIHNvdXJjZS4gIEFmdGVyIGNhbGxpbmcsIHBhcnNlX3Bvcy5pbmRleAogICAgICogaXMgdGhlIGVuZCBvZiB0aGUgdGV4dCB5b3UgcGFyc2VkLiAgSWYgZXJyb3Igb2NjdXJzLCBpbmRleCBpcwogICAgICogdW5jaGFuZ2VkLgogICAgICogPFA+CiAgICAgKiBXaGVuIHBhcnNpbmcsIGxlYWRpbmcgd2hpdGVzcGFjZSBpcyBkaXNjYXJkZWQgKHdpdGggc3VjY2Vzc2Z1bAogICAgICogcGFyc2UpLCB3aGlsZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIGxlZnQgYXMgaXMuCiAgICAgKiA8UD4KICAgICAqIEV4YW1wbGU6CiAgICAgKiA8UD4KICAgICAqIFBhcnNpbmcgIl8xMl94eSIgKHdoZXJlIF8gcmVwcmVzZW50cyBhIHNwYWNlKSBmb3IgYSBudW1iZXIsCiAgICAgKiB3aXRoIGluZGV4ID09IDAgd2lsbCByZXN1bHQgaW4gdGhlIG51bWJlciAxMiwgd2l0aAogICAgICogcGFyc2VfcG9zLmluZGV4IHVwZGF0ZWQgdG8gMyAoanVzdCBiZWZvcmUgdGhlIHNlY29uZCBzcGFjZSkuCiAgICAgKiBQYXJzaW5nIGEgc2Vjb25kIHRpbWUgd2lsbCByZXN1bHQgaW4gYSBmYWlsaW5nIFVFcnJvckNvZGUgc2luY2UKICAgICAqICJ4eSIgaXMgbm90IGEgbnVtYmVyLCBhbmQgbGVhdmUgaW5kZXggYXQgMy4KICAgICAqIDxQPgogICAgICogU3ViY2xhc3NlcyB3aWxsIHR5cGljYWxseSBzdXBwbHkgc3BlY2lmaWMgcGFyc2UgbWV0aG9kcyB0aGF0CiAgICAgKiByZXR1cm4gZGlmZmVyZW50IHR5cGVzIG9mIHZhbHVlcy4gU2luY2UgbWV0aG9kcyBjYW4ndCBvdmVybG9hZAogICAgICogb24gcmV0dXJuIHR5cGVzLCB0aGVzZSB3aWxsIHR5cGljYWxseSBiZSBuYW1lZCAicGFyc2UiLCB3aGlsZQogICAgICogdGhpcyBwb2x5bW9ycGhpYyBtZXRob2Qgd2lsbCBhbHdheXMgYmUgY2FsbGVkIHBhcnNlT2JqZWN0LiAgQW55CiAgICAgKiBwYXJzZSBtZXRob2QgdGhhdCBkb2VzIG5vdCB0YWtlIGEgcGFyc2VfcG9zIHNob3VsZCBzZXQgc3RhdHVzCiAgICAgKiB0byBhbiBlcnJvciB2YWx1ZSB3aGVuIG5vIHRleHQgaW4gdGhlIHJlcXVpcmVkIGZvcm1hdCBpcyBhdCB0aGUKICAgICAqIHN0YXJ0IHBvc2l0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UgICAgVGhlIHN0cmluZyB0byBiZSBwYXJzZWQgaW50byBhbiBvYmplY3QuCiAgICAgKiBAcGFyYW0gcmVzdWx0ICAgIEZvcm1hdHRhYmxlIHRvIGJlIHNldCB0byB0aGUgcGFyc2UgcmVzdWx0LgogICAgICogICAgICAgICAgICAgICAgICBJZiBwYXJzZSBmYWlscywgcmV0dXJuIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQuCiAgICAgKiBAcGFyYW0gcGFyc2VfcG9zIFRoZSBwb3NpdGlvbiB0byBzdGFydCBwYXJzaW5nIGF0LiBVcG9uIHJldHVybgogICAgICogICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtIGlzIHNldCB0byB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlCiAgICAgKiAgICAgICAgICAgICAgICAgIGxhc3QgY2hhcmFjdGVyIHN1Y2Nlc3NmdWxseSBwYXJzZWQuIElmIHRoZQogICAgICogICAgICAgICAgICAgICAgICBzb3VyY2UgaXMgbm90IHBhcnNlZCBzdWNjZXNzZnVsbHksIHRoaXMgcGFyYW0KICAgICAqICAgICAgICAgICAgICAgICAgd2lsbCByZW1haW4gdW5jaGFuZ2VkLgogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgcGFyc2VPYmplY3QoY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRhYmxlJiByZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VQb3NpdGlvbiYgcGFyc2VfcG9zKSBjb25zdCA9IDA7CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgdG8gcHJvZHVjZSBhbiBvYmplY3QuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QKICAgICAqIHdoaWNoIGNhbGxzIHRoZSBwdXJlIHZpcnR1YWwgcGFyc2VPYmplY3QoKSBtZXRob2QsIGFuZCByZXR1cm5zIGEKICAgICAqIGZhaWx1cmUgVUVycm9yQ29kZSBpZiB0aGUgUGFyc2VQb3NpdGlvbiBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlICAgIFRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkIGludG8gYW4gb2JqZWN0LgogICAgICogQHBhcmFtIHJlc3VsdCAgICBGb3JtYXR0YWJsZSB0byBiZSBzZXQgdG8gdGhlIHBhcnNlIHJlc3VsdC4KICAgICAqICAgICAgICAgICAgICAgICAgSWYgcGFyc2UgZmFpbHMsIHJldHVybiBjb250ZW50cyBhcmUgdW5kZWZpbmVkLgogICAgICogQHBhcmFtIHN0YXR1cyAgICBPdXRwdXQgcGFyYW0gdG8gYmUgZmlsbGVkIHdpdGggc3VjY2Vzcy9mYWlsdXJlCiAgICAgKiAgICAgICAgICAgICAgICAgIHJlc3VsdCBjb2RlLgogICAgICovCiAgICB2b2lkIHBhcnNlT2JqZWN0KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGFibGUmIHJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSB1bmlxdWUgY2xhc3MgSUQgUE9MWU1PUlBISUNBTExZLiAgUHVyZSB2aXJ0dWFsIG1ldGhvZC4KICAgICAqIFRoaXMgbWV0aG9kIGlzIHRvIGltcGxlbWVudCBhIHNpbXBsZSB2ZXJzaW9uIG9mIFJUVEksIHNpbmNlIG5vdCBhbGwKICAgICAqIEMrKyBjb21waWxlcnMgc3VwcG9ydCBnZW51aW5lIFJUVEkuICBQb2x5bW9ycGhpYyBvcGVyYXRvcj09KCkgYW5kCiAgICAgKiBjbG9uZSgpIG1ldGhvZHMgY2FsbCB0aGlzIG1ldGhvZC4KICAgICAqIDxQPgogICAgICogQ29uY3JldGUgc3ViY2xhc3NlcyBvZiBGb3JtYXQgbXVzdCBpbXBsZW1lbnQgZ2V0RHluYW1pY0NsYXNzSUQoKQogICAgICogYW5kIGFsc28gYSBzdGF0aWMgbWV0aG9kIGFuZCBkYXRhIG1lbWJlcjoKICAgICAqCiAgICAgKiAgICAgIHN0YXRpYyBVQ2xhc3NJRCBnZXRTdGF0aWNDbGFzc0lEKCkgeyByZXR1cm4gKFVDbGFzc0lEKSZmZ0NsYXNzSUQ7IH0KICAgICAqICAgICAgc3RhdGljIGNoYXIgZmdDbGFzc0lEOwogICAgICoKICAgICAqIEByZXR1cm4gICAgICAgICAgVGhlIGNsYXNzIElEIGZvciB0aGlzIG9iamVjdC4gQWxsIG9iamVjdHMgb2YgYQogICAgICogICAgICAgICAgICAgICAgICBnaXZlbiBjbGFzcyBoYXZlIHRoZSBzYW1lIGNsYXNzIElELiAgT2JqZWN0cyBvZgogICAgICogICAgICAgICAgICAgICAgICBvdGhlciBjbGFzc2VzIGhhdmUgZGlmZmVyZW50IGNsYXNzIElEcy4KICAgICAqLwogICAgdmlydHVhbCBVQ2xhc3NJRCBnZXREeW5hbWljQ2xhc3NJRCgpIGNvbnN0ID0gMDsKCnByb3RlY3RlZDoKICAgIC8qKgogICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc3ViY2xhc3MgdXNlIG9ubHkuICBEb2VzIG5vdGhpbmcuCiAgICAgKi8KICAgIEZvcm1hdCgpOwoKICAgIEZvcm1hdChjb25zdCBGb3JtYXQmKTsgLy8gRG9lcyBub3RoaW5nOyBmb3Igc3ViY2xhc3NlcyBvbmx5CgogICAgRm9ybWF0JiBvcGVyYXRvcj0oY29uc3QgRm9ybWF0Jik7IC8vIERvZXMgbm90aGluZzsgZm9yIHN1YmNsYXNzZXMKfTsKCiNlbmRpZiAvLyBfRk9STUFUCi8vZW9mCg==