IyBqbmRuLXV0aWxzCgpUaGlzIHByb2plY3QgaXMgYSBjb2xsZWN0aW9uIG9mIHRvb2xzIHRvIHNpbXBsaWZ5IHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBvdmVyIHRoZSBORE4gbmV0d29yay4gSXQgcmVsaWVzIG9uIHRoZSBbTkROIFByb3RvY29sXShodHRwczovL25hbWVkLWRhdGEubmV0KSBhbmQgaXRzIGFzc29jaWF0ZWQgW2NsaWVudCBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9qbmRuKS4KCiMjIEluc3RhbGwKV2l0aCBNYXZlbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBQT006CmBgYAo8ZGVwZW5kZW5jeT4KICA8Z3JvdXBJZD5jb20uaW50ZWwuam5kbi51dGlsczwvZ3JvdXBJZD4KICA8YXJ0aWZhY3RJZD5qbmRuLXV0aWxzPC9hcnRpZmFjdElkPgogIDx2ZXJzaW9uPlJFTEVBU0U8L3ZlcnNpb24+IDwhLS0gb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIC0tPgo8L2RlcGVuZGVuY3k+CmBgYAoKIyMgVXNlClVzZSBgU2ltcGxlQ2xpZW50YCBvciBgU2VnbWVudGVkQ2xpZW50YCB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIG5ldHdvcmsuIEZvciBleGFtcGxlOgpgYGAKLy8gcmV0cmlldmUgYSBzaW5nbGUgRGF0YSBwYWNrZXQgc3luY2hyb25vdXNseSwgd2lsbCBibG9jayB1bnRpbCBjb21wbGV0ZQpEYXRhIHNpbmdsZURhdGEgPSBDbGllbnQuZ2V0RGVmYXVsdCgpLmdldFN5bmMoZmFjZSwgbmFtZSk7CgovLyByZXRyaWV2ZSBhIHNlZ21lbnRlZCBEYXRhIHBhY2tldCAoaS5lLiB3aXRoIGEgbGFzdCBDb21wb25lbnQgY29udGFpbmluZyBhIHNlZ21lbnQgbnVtYmVyIGFuZCBhIHZhbGlkIEZpbmFsQmxvY2tJZCkgYnkgbmFtZQpEYXRhIHNlZ21lbnRlZERhdGEgPSBTZWdtZW50ZWRDbGllbnQuZ2V0RGVmYXVsdCgpLmdldFN5bmMoZmFjZSwgbmFtZSk7CmBgYAoKVXNlIGBTaW1wbGVTZXJ2ZXJgIG9yIGBTZWdtZW50ZWRTZXJ2ZXJgIHRvIHNlcnZlIGRhdGEgb24gdGhlIG5ldHdvcmsuIEZvciBleGFtcGxlOgpgYGAKLy8gc2VnbWVudCBhbmQgc2VydmUgRGF0YSBwYWNrZXQgdW5kZXIgYSBzcGVjaWZpYyBwcmVmaXgKUmVwb3NpdG9yeVNlcnZlciBzZXJ2ZXIgPSBuZXcgU2VnbWVudGVkU2VydmVyKGZhY2UsIHByZWZpeCk7CnNlcnZlci5zZXJ2ZShsYXJnZURhdGFQYWNrZXQpOyAvLyBjYWxsIGZhY2UucHJvY2Vzc0V2ZW50cygpIGluIGFuIGV2ZW50IGxvb3AKCi8vIGFkZCBzaWduYXR1cmVzOyB0aGlzIHBpcGVsaW5lIHN0YWdlIHdpbGwgc2lnbiBlYWNoIERhdGEgcGFja2V0IHByaW9yIHRvIGJlaW5nIGVuY29kZWQgZm9yIHRyYW5zcG9ydApzZXJ2ZXIuYWRkUGlwZWxpbmVTdGFnZShuZXcgU2lnbmluZ1N0YWdlKGtleUNoYWluLCBzaWduaW5nQ2VydGlmaWNhdGVOYW1lKSk7CmBgYAoKRm9yIGZ1bGwgQVBJLCBzZWUgdGhlIFtKYXZhZG9jXShodHRwOi8vMDFvcmcuZ2l0aHViLmlvL2puZG4tdXRpbHMvKS4KCiMjIExpY2Vuc2UKQ29weXJpZ2h0IKkgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBbR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXShodHRwczovL2dpdGh1Yi5jb20vMDFvcmcvam5kbi11dGlscy9ibG9iL21hc3Rlci9MSUNFTlNFKSBmb3IgbW9yZSBkZXRhaWxzLgo=