LyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTUgTWlhLVNvZnR3YXJlLg0KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCiAqIA0KICogQ29udHJpYnV0b3JzOg0KICogICAgIEZyZWRlcmljIE1hZGlvdCAoTWlhLVNvZnR3YXJlKSAtIG1ldGFtb2RlbCBkZXNpZ24gYW5kIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCiAqICAgICBHculnb2lyZSBEdXDpIChNaWEtU29mdHdhcmUpIC0gQnVnIDQ4MDE4MyAtIFRoZSBtYW5pZmVzdC5tZiBkaXNjb3ZlcmVyIHNob3VsZCBtYW5hZ2UgJ0V4cG9ydC1QYWNrYWdlJyANCiAqLw0KcGFja2FnZSBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LmltcGw7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0Lk1hbmlmZXN0UGFja2FnZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LlZlcnNpb247DQoNCi8qKg0KICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+Jy4NCiAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KICogPHA+DQogKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCiAqIDwvcD4NCiAqIDx1bD4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LmltcGwuVmVyc2lvbkltcGwjZ2V0TWluaW11bSA8ZW0+TWluaW11bTwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5pbXBsLlZlcnNpb25JbXBsI2lzTWluaW11bUlzSW5jbHVzaXZlIDxlbT5NaW5pbXVtIElzIEluY2x1c2l2ZTwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5pbXBsLlZlcnNpb25JbXBsI2dldE1heGltdW0gPGVtPk1heGltdW08L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuaW1wbC5WZXJzaW9uSW1wbCNpc01heGltdW1Jc0luY2x1c2l2ZSA8ZW0+TWF4aW11bSBJcyBJbmNsdXNpdmU8L2VtPn08L2xpPg0KICogPC91bD4NCiAqDQogKiBAZ2VuZXJhdGVkDQogKi8NCnB1YmxpYyBjbGFzcyBWZXJzaW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmVyc2lvbiB7DQoJLyoqDQoJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbmltdW0oKSA8ZW0+TWluaW11bTwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHNlZSAjZ2V0TWluaW11bSgpDQoJICogQGdlbmVyYXRlZA0KCSAqIEBvcmRlcmVkDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOSU1VTV9FREVGQVVMVCA9IG51bGw7DQoNCgkvKioNCgkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW5pbXVtKCkgPGVtPk1pbmltdW08L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBzZWUgI2dldE1pbmltdW0oKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKiBAb3JkZXJlZA0KCSAqLw0KCXByb3RlY3RlZCBTdHJpbmcgbWluaW11bSA9IE1JTklNVU1fRURFRkFVTFQ7DQoNCgkvKioNCgkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNaW5pbXVtSXNJbmNsdXNpdmUoKSA8ZW0+TWluaW11bSBJcyBJbmNsdXNpdmU8L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBzZWUgI2lzTWluaW11bUlzSW5jbHVzaXZlKCkNCgkgKiBAZ2VuZXJhdGVkDQoJICogQG9yZGVyZWQNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlOSU1VTV9JU19JTkNMVVNJVkVfRURFRkFVTFQgPSBmYWxzZTsNCg0KCS8qKg0KCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWluaW11bUlzSW5jbHVzaXZlKCkgPGVtPk1pbmltdW0gSXMgSW5jbHVzaXZlPC9lbT59JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAc2VlICNpc01pbmltdW1Jc0luY2x1c2l2ZSgpDQoJICogQGdlbmVyYXRlZA0KCSAqIEBvcmRlcmVkDQoJICovDQoJcHJvdGVjdGVkIGJvb2xlYW4gbWluaW11bUlzSW5jbHVzaXZlID0gTUlOSU1VTV9JU19JTkNMVVNJVkVfRURFRkFVTFQ7DQoNCgkvKioNCgkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4aW11bSgpIDxlbT5NYXhpbXVtPC9lbT59JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAc2VlICNnZXRNYXhpbXVtKCkNCgkgKiBAZ2VuZXJhdGVkDQoJICogQG9yZGVyZWQNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhJTVVNX0VERUZBVUxUID0gbnVsbDsNCg0KCS8qKg0KCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heGltdW0oKSA8ZW0+TWF4aW11bTwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHNlZSAjZ2V0TWF4aW11bSgpDQoJICogQGdlbmVyYXRlZA0KCSAqIEBvcmRlcmVkDQoJICovDQoJcHJvdGVjdGVkIFN0cmluZyBtYXhpbXVtID0gTUFYSU1VTV9FREVGQVVMVDsNCg0KCS8qKg0KCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01heGltdW1Jc0luY2x1c2l2ZSgpIDxlbT5NYXhpbXVtIElzIEluY2x1c2l2ZTwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHNlZSAjaXNNYXhpbXVtSXNJbmNsdXNpdmUoKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKiBAb3JkZXJlZA0KCSAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNQVhJTVVNX0lTX0lOQ0xVU0lWRV9FREVGQVVMVCA9IGZhbHNlOw0KDQoJLyoqDQoJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNYXhpbXVtSXNJbmNsdXNpdmUoKSA8ZW0+TWF4aW11bSBJcyBJbmNsdXNpdmU8L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBzZWUgI2lzTWF4aW11bUlzSW5jbHVzaXZlKCkNCgkgKiBAZ2VuZXJhdGVkDQoJICogQG9yZGVyZWQNCgkgKi8NCglwcm90ZWN0ZWQgYm9vbGVhbiBtYXhpbXVtSXNJbmNsdXNpdmUgPSBNQVhJTVVNX0lTX0lOQ0xVU0lWRV9FREVGQVVMVDsNCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXByb3RlY3RlZCBWZXJzaW9uSW1wbCgpIHsNCgkJc3VwZXIoKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCgkJcmV0dXJuIE1hbmlmZXN0UGFja2FnZS5MaXRlcmFscy5WRVJTSU9OOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBTdHJpbmcgZ2V0TWluaW11bSgpIHsNCgkJcmV0dXJuIG1pbmltdW07DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIHZvaWQgc2V0TWluaW11bShTdHJpbmcgbmV3TWluaW11bSkgew0KCQlTdHJpbmcgb2xkTWluaW11bSA9IG1pbmltdW07DQoJCW1pbmltdW0gPSBuZXdNaW5pbXVtOw0KCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQoJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUlOSU1VTSwgb2xkTWluaW11bSwgbWluaW11bSkpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBib29sZWFuIGlzTWluaW11bUlzSW5jbHVzaXZlKCkgew0KCQlyZXR1cm4gbWluaW11bUlzSW5jbHVzaXZlOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyB2b2lkIHNldE1pbmltdW1Jc0luY2x1c2l2ZShib29sZWFuIG5ld01pbmltdW1Jc0luY2x1c2l2ZSkgew0KCQlib29sZWFuIG9sZE1pbmltdW1Jc0luY2x1c2l2ZSA9IG1pbmltdW1Jc0luY2x1c2l2ZTsNCgkJbWluaW11bUlzSW5jbHVzaXZlID0gbmV3TWluaW11bUlzSW5jbHVzaXZlOw0KCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQoJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUlOSU1VTV9JU19JTkNMVVNJVkUsIG9sZE1pbmltdW1Jc0luY2x1c2l2ZSwgbWluaW11bUlzSW5jbHVzaXZlKSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIFN0cmluZyBnZXRNYXhpbXVtKCkgew0KCQlyZXR1cm4gbWF4aW11bTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgdm9pZCBzZXRNYXhpbXVtKFN0cmluZyBuZXdNYXhpbXVtKSB7DQoJCVN0cmluZyBvbGRNYXhpbXVtID0gbWF4aW11bTsNCgkJbWF4aW11bSA9IG5ld01heGltdW07DQoJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCgkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NQVhJTVVNLCBvbGRNYXhpbXVtLCBtYXhpbXVtKSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIGJvb2xlYW4gaXNNYXhpbXVtSXNJbmNsdXNpdmUoKSB7DQoJCXJldHVybiBtYXhpbXVtSXNJbmNsdXNpdmU7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIHZvaWQgc2V0TWF4aW11bUlzSW5jbHVzaXZlKGJvb2xlYW4gbmV3TWF4aW11bUlzSW5jbHVzaXZlKSB7DQoJCWJvb2xlYW4gb2xkTWF4aW11bUlzSW5jbHVzaXZlID0gbWF4aW11bUlzSW5jbHVzaXZlOw0KCQltYXhpbXVtSXNJbmNsdXNpdmUgPSBuZXdNYXhpbXVtSXNJbmNsdXNpdmU7DQoJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCgkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NQVhJTVVNX0lTX0lOQ0xVU0lWRSwgb2xkTWF4aW11bUlzSW5jbHVzaXZlLCBtYXhpbXVtSXNJbmNsdXNpdmUpKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQoJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQoJCQljYXNlIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NSU5JTVVNOg0KCQkJCXJldHVybiBnZXRNaW5pbXVtKCk7DQoJCQljYXNlIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NSU5JTVVNX0lTX0lOQ0xVU0lWRToNCgkJCQlyZXR1cm4gaXNNaW5pbXVtSXNJbmNsdXNpdmUoKTsNCgkJCWNhc2UgTWFuaWZlc3RQYWNrYWdlLlZFUlNJT05fX01BWElNVU06DQoJCQkJcmV0dXJuIGdldE1heGltdW0oKTsNCgkJCWNhc2UgTWFuaWZlc3RQYWNrYWdlLlZFUlNJT05fX01BWElNVU1fSVNfSU5DTFVTSVZFOg0KCQkJCXJldHVybiBpc01heGltdW1Jc0luY2x1c2l2ZSgpOw0KCQl9DQoJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQoJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQoJCQljYXNlIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NSU5JTVVNOg0KCQkJCXNldE1pbmltdW0oKFN0cmluZyluZXdWYWx1ZSk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUlOSU1VTV9JU19JTkNMVVNJVkU6DQoJCQkJc2V0TWluaW11bUlzSW5jbHVzaXZlKChCb29sZWFuKW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NQVhJTVVNOg0KCQkJCXNldE1heGltdW0oKFN0cmluZyluZXdWYWx1ZSk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUFYSU1VTV9JU19JTkNMVVNJVkU6DQoJCQkJc2V0TWF4aW11bUlzSW5jbHVzaXZlKChCb29sZWFuKW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCX0NCgkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUlOSU1VTToNCgkJCQlzZXRNaW5pbXVtKE1JTklNVU1fRURFRkFVTFQpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgTWFuaWZlc3RQYWNrYWdlLlZFUlNJT05fX01JTklNVU1fSVNfSU5DTFVTSVZFOg0KCQkJCXNldE1pbmltdW1Jc0luY2x1c2l2ZShNSU5JTVVNX0lTX0lOQ0xVU0lWRV9FREVGQVVMVCk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUFYSU1VTToNCgkJCQlzZXRNYXhpbXVtKE1BWElNVU1fRURFRkFVTFQpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgTWFuaWZlc3RQYWNrYWdlLlZFUlNJT05fX01BWElNVU1fSVNfSU5DTFVTSVZFOg0KCQkJCXNldE1heGltdW1Jc0luY2x1c2l2ZShNQVhJTVVNX0lTX0lOQ0xVU0lWRV9FREVGQVVMVCk7DQoJCQkJcmV0dXJuOw0KCQl9DQoJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUBPdmVycmlkZQ0KCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQoJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQoJCQljYXNlIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NSU5JTVVNOg0KCQkJCXJldHVybiBNSU5JTVVNX0VERUZBVUxUID09IG51bGwgPyBtaW5pbXVtICE9IG51bGwgOiAhTUlOSU1VTV9FREVGQVVMVC5lcXVhbHMobWluaW11bSk7DQoJCQljYXNlIE1hbmlmZXN0UGFja2FnZS5WRVJTSU9OX19NSU5JTVVNX0lTX0lOQ0xVU0lWRToNCgkJCQlyZXR1cm4gbWluaW11bUlzSW5jbHVzaXZlICE9IE1JTklNVU1fSVNfSU5DTFVTSVZFX0VERUZBVUxUOw0KCQkJY2FzZSBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUFYSU1VTToNCgkJCQlyZXR1cm4gTUFYSU1VTV9FREVGQVVMVCA9PSBudWxsID8gbWF4aW11bSAhPSBudWxsIDogIU1BWElNVU1fRURFRkFVTFQuZXF1YWxzKG1heGltdW0pOw0KCQkJY2FzZSBNYW5pZmVzdFBhY2thZ2UuVkVSU0lPTl9fTUFYSU1VTV9JU19JTkNMVVNJVkU6DQoJCQkJcmV0dXJuIG1heGltdW1Jc0luY2x1c2l2ZSAhPSBNQVhJTVVNX0lTX0lOQ0xVU0lWRV9FREVGQVVMVDsNCgkJfQ0KCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCgkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KDQoJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KCQlyZXN1bHQuYXBwZW5kKCIgKG1pbmltdW06ICIpOw0KCQlyZXN1bHQuYXBwZW5kKG1pbmltdW0pOw0KCQlyZXN1bHQuYXBwZW5kKCIsIG1pbmltdW1Jc0luY2x1c2l2ZTogIik7DQoJCXJlc3VsdC5hcHBlbmQobWluaW11bUlzSW5jbHVzaXZlKTsNCgkJcmVzdWx0LmFwcGVuZCgiLCBtYXhpbXVtOiAiKTsNCgkJcmVzdWx0LmFwcGVuZChtYXhpbXVtKTsNCgkJcmVzdWx0LmFwcGVuZCgiLCBtYXhpbXVtSXNJbmNsdXNpdmU6ICIpOw0KCQlyZXN1bHQuYXBwZW5kKG1heGltdW1Jc0luY2x1c2l2ZSk7DQoJCXJlc3VsdC5hcHBlbmQoJyknKTsNCgkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KCX0NCg0KfSAvL1ZlcnNpb25JbXBsDQo=