1 line
13 KiB
C#
1 line
13 KiB
C#
dXNpbmcgQnV0dGVyLkR0b3M7CnVzaW5nIEJ1dHRlci5EdG9zLkFsYnVtOwp1c2luZyBCdXR0ZXIuVHlwZXM7CnVzaW5nIExhY3Rvc2UuTWFwcGVyOwp1c2luZyBMYWN0b3NlLk1vZGVsczsKdXNpbmcgTGFjdG9zZS5SZXBvc2l0b3JpZXM7CnVzaW5nIExhY3Rvc2UuU2VydmljZXM7CnVzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkF1dGhvcml6YXRpb247CnVzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLk12YzsKCm5hbWVzcGFjZSBMYWN0b3NlLkNvbnRyb2xsZXJzOwoKLy8vIDxzdW1tYXJ5PgovLy8gTWFuYWdlcyBhbGJ1bXMg4oCUIGNvbGxlY3Rpb25zIG9mIGFzc2V0cy4KLy8vIDwvc3VtbWFyeT4KLy8vIDxwYXJhbSBuYW1lPSJhdXRoU2VydmljZSI+QXV0aGVudGljYXRpb24gc2VydmljZS48L3BhcmFtPgovLy8gPHBhcmFtIG5hbWU9ImFsYnVtUmVwb3NpdG9yeSI+QWxidW0gcmVwb3NpdG9yeS48L3BhcmFtPgovLy8gPHBhcmFtIG5hbWU9ImFzc2V0UmVwb3NpdG9yeSI+QXNzZXQgcmVwb3NpdG9yeS48L3BhcmFtPgovLy8gPHBhcmFtIG5hbWU9InBlcnNvblJlcG9zaXRvcnkiPlBlcnNvbiByZXBvc2l0b3J5LjwvcGFyYW0+CltBcGlDb250cm9sbGVyXQpbQXV0aG9yaXplXQpbUm91dGUoImFwaS9bY29udHJvbGxlcl0iKV0KcHVibGljIGNsYXNzIEFsYnVtQ29udHJvbGxlcigKICAgIC8vVE9ETzogQWRkIGxvZ2dpbmcKICAgIC8vSUxvZ2dlcjxBbGJ1bUNvbnRyb2xsZXI+IGxvZ2dlciwKICAgIExhY3Rvc2VBdXRoU2VydmljZSBhdXRoU2VydmljZSwKICAgIElBbGJ1bVJlcG9zaXRvcnkgYWxidW1SZXBvc2l0b3J5LAogICAgSUFzc2V0UmVwb3NpdG9yeSBhc3NldFJlcG9zaXRvcnksCiAgICBJUGVyc29uUmVwb3NpdG9yeSBwZXJzb25SZXBvc2l0b3J5CikgOiBDb250cm9sbGVyQmFzZSB7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gR2V0cyBhbiBhbGJ1bSBieSBpdHMgSUQgd2l0aCBmaWx0ZXJlZCBhc3NldHMgYmFzZWQgb24gYWNjZXNzIGxldmVsLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIC8vLyA8cGFyYW0gbmFtZT0iaWQiPlRoZSBhbGJ1bSBJRC48L3BhcmFtPgogICAgLy8vIDxyZXR1cm5zPlRoZSBmdWxsIGFsYnVtIGRldGFpbHMgd2l0aCBhY2Nlc3NpYmxlIGFzc2V0cywgb3IgNDA0IGlmIG5vdCBmb3VuZC48L3JldHVybnM+CiAgICBbSHR0cEdldCgie2lkfSIpXQogICAgcHVibGljIEFjdGlvblJlc3VsdDxBbGJ1bUZ1bGxEdG8+IEdldChbRnJvbVJvdXRlXSBHdWlkIGlkKSB7CiAgICAgICAgR3VpZD8gICAgICAgIHVpZCAgICAgICAgID0gYXV0aFNlcnZpY2UuR2V0VXNlckRhdGEoVXNlcik/LklkOwogICAgICAgIEVBY2Nlc3NMZXZlbCBhY2Nlc3NMZXZlbCA9IGF1dGhTZXJ2aWNlLkdldFVzZXJEYXRhKFVzZXIpPy5BY2Nlc3NMZXZlbCA/PyBFQWNjZXNzTGV2ZWwuVXNlcjsKCiAgICAgICAgdmFyIGFsYnVtID0gYWxidW1SZXBvc2l0b3J5LkZpbmRWaXNpYmxlKGlkLCB1aWQsIGFjY2Vzc0xldmVsKTsKCiAgICAgICAgLy8gSWYgdGhlIGFsYnVtIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSA0MDQKICAgICAgICBpZiAoYWxidW0gPT0gbnVsbCkgcmV0dXJuIE5vdEZvdW5kKCk7CgogICAgICAgIHJldHVybiBPayhhbGJ1bS5Ub0FsYnVtRnVsbER0byhhY2Nlc3NMZXZlbCwgdWlkKSk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFNlYXJjaGVzIGFsYnVtcyB3aXRoIHBhZ2luYXRpb24sIG9wdGlvbmFsIHNlYXJjaCB0ZXJtLCBzb3J0IG9wdGlvbnMsIGFuZCBvcHRpb25hbCB1bmFzc2lnbmVkIGZpbHRlci4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICAvLy8gPHBhcmFtIG5hbWU9InBhZ2luZ09wdGlvbnMiPlBhZ2luYXRpb24sIHNlYXJjaCwgc29ydCwgYW5kIGZpbHRlciBwYXJhbWV0ZXJzLjwvcGFyYW0+CiAgICAvLy8gPHJldHVybnM+QSBsaXN0IG9mIGFsYnVtIHByZXZpZXdzIGFjY2Vzc2libGUgdG8gdGhlIHVzZXIuPC9yZXR1cm5zPgogICAgW0h0dHBHZXRdCiAgICBwdWJsaWMgQWN0aW9uUmVzdWx0PExpc3Q8QWxidW1QcmV2aWV3RHRvPj4gU2VhcmNoKFtGcm9tUXVlcnldIEFsYnVtU2VhcmNoUGFyYW1ldGVyc0R0byBwYWdpbmdPcHRpb25zKSB7CiAgICAgICAgdmFyIHVpZCAgICAgICAgID0gYXV0aFNlcnZpY2UuR2V0VXNlckRhdGEoVXNlcik/LklkOwogICAgICAgIHZhciBhY2Nlc3NMZXZlbCA9IGF1dGhTZXJ2aWNlLkdldFVzZXJEYXRhKFVzZXIpPy5BY2Nlc3NMZXZlbCA/PyBFQWNjZXNzTGV2ZWwuVXNlcjsKCiAgICAgICAgaWYocGFnaW5nT3B0aW9ucy5QYWdlIDwgMCB8fCBwYWdpbmdPcHRpb25zLlBhZ2VTaXplIDwgMSB8fCBwYWdpbmdPcHRpb25zLlBhZ2VTaXplID4gUGFnZWRQYXJhbWV0ZXJzRHRvLk1heFBhZ2VTaXplKSByZXR1cm4gQmFkUmVxdWVzdCgpOwoKICAgICAgICB2YXIgYWxidW1zID0gYWxidW1SZXBvc2l0b3J5LlNlYXJjaFF1ZXJ5KAogICAgICAgICAgICBwYWdpbmdPcHRpb25zLlNlYXJjaCA/PyBzdHJpbmcuRW1wdHksCiAgICAgICAgICAgIHBhZ2luZ09wdGlvbnMuUGFnZSwKICAgICAgICAgICAgcGFnaW5nT3B0aW9ucy5QYWdlU2l6ZSwKICAgICAgICAgICAgcGFnaW5nT3B0aW9ucy5Tb3J0QnksCiAgICAgICAgICAgIHBhZ2luZ09wdGlvbnMuU29ydEFzYywKICAgICAgICAgICAgcGFnaW5nT3B0aW9ucy5VbmFzc2lnbmVkLAogICAgICAgICAgICB1aWQgPz8gZGVmYXVsdCwKICAgICAgICAgICAgYWNjZXNzTGV2ZWwsCiAgICAgICAgICAgIHBhZ2luZ09wdGlvbnMuQXNzZXRVcGxvYWRlZEJ5CiAgICAgICAgKS5Ub0xpc3QoKTsKCiAgICAgICAgcmV0dXJuIE9rKGFsYnVtcyk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFVwZGF0ZXMgYW4gZXhpc3RpbmcgYWxidW0uCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJpZCI+VGhlIGFsYnVtIElELjwvcGFyYW0+CiAgICAvLy8gPHBhcmFtIG5hbWU9ImFsYnVtRHRvIj5UaGUgYWxidW0gdXBkYXRlIGRhdGEuPC9wYXJhbT4KICAgIC8vLyA8cmV0dXJucz4yMDAgb24gc3VjY2VzcywgNDAzIGlmIGZvcmJpZGRlbiwgNDA0IGlmIG5vdCBmb3VuZC48L3JldHVybnM+CiAgICBbSHR0cFBvc3QoIntpZH0iKV0KICAgICAgICBbQXV0aG9yaXplKFJvbGVzID0gIk1haW50YWluZXIsQ3VyYXRvcixBZG1pbiIpXQogICAgcHVibGljIEFjdGlvblJlc3VsdCBVcGRhdGUoW0Zyb21Sb3V0ZV0gR3VpZCBpZCwgW0Zyb21Cb2R5XSBBbGJ1bVVwZGF0ZUR0byBhbGJ1bUR0bykgewogICAgICAgIEd1aWQ/IHVpZCAgICAgICAgID0gYXV0aFNlcnZpY2UuR2V0VXNlckRhdGEoVXNlcik/LklkOwogICAgICAgIHZhciAgIGFjY2Vzc0xldmVsID0gYXV0aFNlcnZpY2UuR2V0VXNlckRhdGEoVXNlcik/LkFjY2Vzc0xldmVsID8/IEVBY2Nlc3NMZXZlbC5Vc2VyOwoKICAgICAgICB2YXIgYWxidW0gPSBhbGJ1bVJlcG9zaXRvcnkuRmluZChpZCk7CgogICAgICAgIC8vIElmIHRoZSBhbGJ1bSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGEgNDA0CiAgICAgICAgaWYgKGFsYnVtID09IG51bGwpIHJldHVybiBOb3RGb3VuZCgpOwoKICAgICAgICAvLyBNYWludGFpbmVyIHNjb3BlIGNoZWNrIOKAlCBtdXN0IG1haW50YWluIHRoZSBhbGJ1bSdzIHBlcnNvbgogICAgICAgIHN3aXRjaCAoYWNjZXNzTGV2ZWwpIHsKICAgICAgICAgICAgY2FzZSBFQWNjZXNzTGV2ZWwuTWFpbnRhaW5lciB3aGVuIGFsYnVtLlBlcnNvbk93bmVySWQgPT0gbnVsbCB8fCAhcGVyc29uUmVwb3NpdG9yeS5Jc01haW50YWluZXJPZih1aWQhLlZhbHVlLCBhbGJ1bS5QZXJzb25Pd25lcklkLlZhbHVlKToKICAgICAgICAgICAgICAgIHJldHVybiBGb3JiaWQoKTsKICAgICAgICAgICAgY2FzZSBFQWNjZXNzTGV2ZWwuVXNlcjoKICAgICAgICAgICAgICAgIHJldHVybiBGb3JiaWQoKTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBhbGJ1bSBwcm9wZXJ0aWVzCiAgICAgICAgYWxidW0uVGl0bGUgICAgICAgICA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFsYnVtRHRvLk5hbWUpID8gYWxidW0uVGl0bGUgOiBhbGJ1bUR0by5OYW1lOwogICAgICAgIGFsYnVtLlVwZGF0ZWRBdCAgICAgPSBEYXRlVGltZS5VdGNOb3c7CiAgICAgICAgYWxidW0uUGVyc29uT3duZXJJZCA9IGFsYnVtRHRvLlJlbW92ZVBlcnNvbiA/IG51bGwgOiBhbGJ1bUR0by5QZXJzb24gPz8gYWxidW0uUGVyc29uT3duZXJJZDsKICAgICAgICBhbGJ1bS5WaXNpYmlsaXR5ICAgID0gYWxidW1EdG8uVmlzaWJpbGl0eSA/PyBhbGJ1bS5WaXNpYmlsaXR5OwogICAgICAgIGFsYnVtLkFzc2V0cyAgICAgICAgPSBhbGJ1bUR0by5Bc3NldHMgIT0gbnVsbCA/IGFzc2V0UmVwb3NpdG9yeS5GaW5kQnVsayhhbGJ1bUR0by5Bc3NldHMpLlRvTGlzdCgpIDogYWxidW0uQXNzZXRzOwogICAgICAgIGFsYnVtLkNvdmVyQXNzZXRJZCAgID0gYWxidW1EdG8uQ292ZXJBc3NldElkID8/IGFsYnVtLkNvdmVyQXNzZXRJZDsKCiAgICAgICAgLy8gU2F2ZSBjaGFuZ2VzCiAgICAgICAgYWxidW1SZXBvc2l0b3J5LlVwZGF0ZShhbGJ1bSk7CiAgICAgICAgYWxidW1SZXBvc2l0b3J5LlNhdmUoKTsKCiAgICAgICAgcmV0dXJuIE9rKCk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFVwZGF0ZXMgbXVsdGlwbGUgYWxidW1zIGluIGEgYnVsayBvcGVyYXRpb24uCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJidWxrRHRvIj5UaGUgYnVsayB1cGRhdGUgZGF0YSB3aXRoIGFsYnVtIElEcyBhbmQgc2hhcmVkIHZhbHVlcy48L3BhcmFtPgogICAgLy8vIDxyZXR1cm5zPjIwMCBvbiBzdWNjZXNzLCA0MDMgaWYgZm9yYmlkZGVuLjwvcmV0dXJucz4KICAgIFtIdHRwUG9zdF0KICAgICAgICBbQXV0aG9yaXplKFJvbGVzID0gIk1haW50YWluZXIsQ3VyYXRvcixBZG1pbiIpXQogICAgcHVibGljIEFjdGlvblJlc3VsdCBCdWxrVXBkYXRlKFtGcm9tQm9keV0gQnVsa0R0bzxBbGJ1bVVwZGF0ZUR0bz4gYnVsa0R0bykgewogICAgICAgIHZhciB1aWQgICAgICAgICA9IGF1dGhTZXJ2aWNlLkdldFVzZXJEYXRhKFVzZXIpPy5JZDsKICAgICAgICB2YXIgYWNjZXNzTGV2ZWwgPSBhdXRoU2VydmljZS5HZXRVc2VyRGF0YShVc2VyKT8uQWNjZXNzTGV2ZWwgPz8gRUFjY2Vzc0xldmVsLlVzZXI7CgogICAgICAgIHZhciBhbGJ1bXMgPSBhbGJ1bVJlcG9zaXRvcnkuRmluZEJ1bGsoYnVsa0R0by5JZHMpLlRvTGlzdCgpOwoKICAgICAgICBzd2l0Y2ggKGFjY2Vzc0xldmVsKSB7CiAgICAgICAgICAgIGNhc2UgRUFjY2Vzc0xldmVsLlVzZXI6CiAgICAgICAgICAgICAgICAvLyBVc2VycyBjYW4ndCB1cGRhdGUgYWxidW1zCiAgICAgICAgICAgICAgICByZXR1cm4gRm9yYmlkKCk7CiAgICAgICAgICAgIGNhc2UgRUFjY2Vzc0xldmVsLk1haW50YWluZXI6CiAgICAgICAgICAgICAgICAvLyBNYWludGFpbmVycyBjYW4gb25seSB1cGRhdGUgYWxidW1zIG9mIHBlcnNvbnMgdGhleSBtYWludGFpbgogICAgICAgICAgICAgICAgYWxidW1zID0gYWxidW1zLldoZXJlKGEgPT4gYS5QZXJzb25Pd25lcklkICE9IG51bGwgJiYgcGVyc29uUmVwb3NpdG9yeS5Jc01haW50YWluZXJPZih1aWQhLlZhbHVlLCBhLlBlcnNvbk93bmVySWQuVmFsdWUpKS5Ub0xpc3QoKTsKICAgICAgICAgICAgICAgIGlmIChhbGJ1bXMuQ291bnQgPT0gMCkgcmV0dXJuIEZvcmJpZCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRUFjY2Vzc0xldmVsLkN1cmF0b3I6CiAgICAgICAgICAgICAgICAvLyBDdXJhdG9ycyBjYW4gdXBkYXRlIGFueSBhbGJ1bQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRUFjY2Vzc0xldmVsLkFkbWluOgogICAgICAgICAgICAgICAgLy8gQWRtaW5zIGNhbiB1cGRhdGUgYW55IGFsYnVtCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKHZhciBhbGJ1bSBpbiBhbGJ1bXMpIHsKICAgICAgICAgICAgYWxidW0uVGl0bGUgPSBidWxrRHRvLkRhdGEuTmFtZSA/PyBhbGJ1bS5UaXRsZTsKICAgICAgICAgICAgYWxidW0uVXBkYXRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93OwogICAgICAgICAgICBhbGJ1bS5QZXJzb25Pd25lcklkID0gYnVsa0R0by5EYXRhLlBlcnNvbiA/PyBhbGJ1bS5QZXJzb25Pd25lcklkOwogICAgICAgICAgICBhbGJ1bS5WaXNpYmlsaXR5ID0gYnVsa0R0by5EYXRhLlZpc2liaWxpdHkgPz8gYWxidW0uVmlzaWJpbGl0eTsKICAgICAgICAgICAgYWxidW0uQXNzZXRzID0gYnVsa0R0by5EYXRhLkFzc2V0cyAhPSBudWxsID8gYXNzZXRSZXBvc2l0b3J5LkZpbmRCdWxrKGJ1bGtEdG8uRGF0YS5Bc3NldHMpLlRvTGlzdCgpIDogYWxidW0uQXNzZXRzOwogICAgICAgICAgICBhbGJ1bS5Db3ZlckFzc2V0SWQgPSBidWxrRHRvLkRhdGEuQ292ZXJBc3NldElkID8/IGFsYnVtLkNvdmVyQXNzZXRJZDsKICAgICAgICB9CgogICAgICAgIGFsYnVtUmVwb3NpdG9yeS5VcGRhdGVCdWxrKGFsYnVtcyk7CiAgICAgICAgYWxidW1SZXBvc2l0b3J5LlNhdmUoKTsKCiAgICAgICAgcmV0dXJuIE9rKCk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIENyZWF0ZXMgYSBuZXcgYWxidW0uCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJhbGJ1bUR0byI+VGhlIGFsYnVtIGNyZWF0aW9uIGRhdGEuPC9wYXJhbT4KICAgIC8vLyA8cmV0dXJucz4yMDAgb24gc3VjY2Vzcy48L3JldHVybnM+CiAgICBbSHR0cFB1dF0KICAgICAgICBbQXV0aG9yaXplKFJvbGVzID0gIkN1cmF0b3IsQWRtaW4iKV0KICAgIHB1YmxpYyBBY3Rpb25SZXN1bHQgQ3JlYXRlKFtGcm9tQm9keV0gQWxidW1DcmVhdGVEdG8gYWxidW1EdG8pIHsKICAgICAgICB2YXIgYWNjZXNzTGV2ZWwgPSBhdXRoU2VydmljZS5HZXRVc2VyRGF0YShVc2VyKT8uQWNjZXNzTGV2ZWwgPz8gRUFjY2Vzc0xldmVsLlVzZXI7CgogICAgICAgIHZhciBhc3NldHMgPSBhbGJ1bUR0by5Bc3NldHMgIT0gbnVsbCA/IGFzc2V0UmVwb3NpdG9yeS5GaW5kQnVsayhhbGJ1bUR0by5Bc3NldHMpLlRvTGlzdCgpIDogbmV3IExpc3Q8QXNzZXQ+KCk7CgogICAgICAgIHZhciBhbGJ1bSA9IG5ldyBBbGJ1bSB7CiAgICAgICAgICAgIElkICAgICAgICAgICAgPSBHdWlkLk5ld0d1aWQoKSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9IGFsYnVtRHRvLk5hbWUsCiAgICAgICAgICAgIENyZWF0ZWRBdCAgICAgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgIFBlcnNvbk93bmVySWQgPSBhbGJ1bUR0by5QZXJzb24gPz8gbnVsbCwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICA9IGFsYnVtRHRvLlZpc2liaWxpdHksCiAgICAgICAgICAgIENvdmVyQXNzZXRJZCAgID0gYWxidW1EdG8uQ292ZXJBc3NldElkID8/IGFzc2V0cy5PcmRlckJ5KGEgPT4gYS5PcmlnaW5hbEZpbGVuYW1lKS5GaXJzdE9yRGVmYXVsdCgpPy5JZCwKICAgICAgICAgICAgQXNzZXRzICAgICAgICA9IGFzc2V0cwogICAgICAgIH07CgogICAgICAgIGFsYnVtUmVwb3NpdG9yeS5JbnNlcnQoYWxidW0pOwogICAgICAgIGFsYnVtUmVwb3NpdG9yeS5TYXZlKCk7CgogICAgICAgIHJldHVybiBPayhhbGJ1bS5JZCk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJlbW92ZXMgbXVsdGlwbGUgYWxidW1zIChzb2Z0IGRlbGV0ZSkuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJhbGJ1bUlkcyI+VGhlIGxpc3Qgb2YgYWxidW0gSURzIHRvIHJlbW92ZS48L3BhcmFtPgogICAgLy8vIDxyZXR1cm5zPjIwMCBvbiBzdWNjZXNzLCA0MDMgaWYgZm9yYmlkZGVuLjwvcmV0dXJucz4KICAgIFtIdHRwRGVsZXRlXQogICAgICAgIFtBdXRob3JpemUoUm9sZXMgPSAiTWFpbnRhaW5lcixDdXJhdG9yLEFkbWluIildCiAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IEJ1bGtEZWxldGUoW0Zyb21Cb2R5XSBMaXN0PEd1aWQ+IGFsYnVtSWRzKSB7CiAgICAgICAgdmFyIHVpZCAgICAgICAgID0gYXV0aFNlcnZpY2UuR2V0VXNlckRhdGEoVXNlcik/LklkOwogICAgICAgIHZhciBhY2Nlc3NMZXZlbCA9IGF1dGhTZXJ2aWNlLkdldFVzZXJEYXRhKFVzZXIpPy5BY2Nlc3NMZXZlbCA/PyBFQWNjZXNzTGV2ZWwuVXNlcjsKCiAgICAgICAgdmFyIGFsYnVtcyA9IGFsYnVtUmVwb3NpdG9yeS5GaW5kQnVsayhhbGJ1bUlkcykuVG9MaXN0KCk7CgogICAgICAgIC8vIEZpbHRlciBieSBhY2Nlc3MgbGV2ZWwKICAgICAgICBzd2l0Y2ggKGFjY2Vzc0xldmVsKSB7CiAgICAgICAgICAgIGNhc2UgRUFjY2Vzc0xldmVsLk1haW50YWluZXI6CiAgICAgICAgICAgICAgICBhbGJ1bXMgPSBhbGJ1bXMuV2hlcmUoYSA9PiBhLlBlcnNvbk93bmVySWQgIT0gbnVsbCAmJiBwZXJzb25SZXBvc2l0b3J5LklzTWFpbnRhaW5lck9mKHVpZCEuVmFsdWUsIGEuUGVyc29uT3duZXJJZC5WYWx1ZSkpLlRvTGlzdCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRUFjY2Vzc0xldmVsLlVzZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gRm9yYmlkKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYWxidW1zLkNvdW50ID09IDApIHJldHVybiBGb3JiaWQoKTsKCiAgICAgICAgYWxidW1zLkZvckVhY2goYWxidW1SZXBvc2l0b3J5LlJlbW92ZSk7CiAgICAgICAgYWxidW1SZXBvc2l0b3J5LlNhdmUoKTsKCiAgICAgICAgcmV0dXJuIE9rKCk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJlbW92ZXMgYW4gYWxidW0gYnkgaXRzIElEIChzb2Z0IGRlbGV0ZSkuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJpZCI+VGhlIGFsYnVtIElELjwvcGFyYW0+CiAgICAvLy8gPHJldHVybnM+MjAwIG9uIHN1Y2Nlc3MsIDQwNCBpZiBub3QgZm91bmQsIDQwMyBpZiBmb3JiaWRkZW4uPC9yZXR1cm5zPgogICAgW0h0dHBEZWxldGUoIntpZH0iKV0KICAgICAgICBbQXV0aG9yaXplKFJvbGVzID0gIk1haW50YWluZXIsQ3VyYXRvcixBZG1pbiIpXQogICAgcHVibGljIEFjdGlvblJlc3VsdCBEZWxldGUoR3VpZCBpZCkgewogICAgICAgIHZhciB1aWQgICAgICAgICA9IGF1dGhTZXJ2aWNlLkdldFVzZXJEYXRhKFVzZXIpPy5JZDsKICAgICAgICB2YXIgYWNjZXNzTGV2ZWwgPSBhdXRoU2VydmljZS5HZXRVc2VyRGF0YShVc2VyKT8uQWNjZXNzTGV2ZWwgPz8gRUFjY2Vzc0xldmVsLlVzZXI7CgogICAgICAgIHZhciBhbGJ1bSA9IGFsYnVtUmVwb3NpdG9yeS5GaW5kKGlkKTsKCiAgICAgICAgLy8gSWYgdGhlIGFsYnVtIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSA0MDQKICAgICAgICBpZiAoYWxidW0gPT0gbnVsbCkgcmV0dXJuIE5vdEZvdW5kKCk7CgogICAgICAgIHN3aXRjaCAoYWNjZXNzTGV2ZWwpIHsKICAgICAgICAgICAgY2FzZSBFQWNjZXNzTGV2ZWwuTWFpbnRhaW5lciB3aGVuIGFsYnVtLlBlcnNvbk93bmVySWQgPT0gbnVsbCB8fCAhcGVyc29uUmVwb3NpdG9yeS5Jc01haW50YWluZXJPZih1aWQhLlZhbHVlLCBhbGJ1bS5QZXJzb25Pd25lcklkLlZhbHVlKToKICAgICAgICAgICAgICAgIHJldHVybiBGb3JiaWQoKTsKICAgICAgICAgICAgY2FzZSBFQWNjZXNzTGV2ZWwuVXNlcjoKICAgICAgICAgICAgICAgIHJldHVybiBGb3JiaWQoKTsKICAgICAgICB9CgogICAgICAgIGFsYnVtUmVwb3NpdG9yeS5SZW1vdmUoYWxidW0pOwogICAgICAgIGFsYnVtUmVwb3NpdG9yeS5TYXZlKCk7CgogICAgICAgIHJldHVybiBPaygpOwogICAgfQp9Cg== |