LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoQykgMjAxNyBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBBdXRob3I6IEFudGhvbnkgTOlvbmFyZCA8YW50aG9ueS5sZW9uYXJkQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgoqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI3ByYWdtYSBvbmNlCgovLyBRdCBpbmNsdWRlCiNpbmNsdWRlIDxRQWJzdHJhY3RJdGVtTW9kZWw+CgovLyBMUkMKI2luY2x1ZGUgImFwaS9hY2NvdW50LmgiCiNpbmNsdWRlICJhcGkvY29udmVyc2F0aW9uLmgiCiNpbmNsdWRlICJhcGkvY29udGFjdC5oIgoKbmFtZXNwYWNlIGxyYyB7IG5hbWVzcGFjZSBhcGkgeyBjbGFzcyBDb252ZXJzYXRpb25Nb2RlbDsgfSB9CgpjbGFzcyBTbWFydExpc3RNb2RlbCA6IHB1YmxpYyBRQWJzdHJhY3RJdGVtTW9kZWwKewogICAgUV9PQkpFQ1QKcHVibGljOgogICAgdXNpbmcgQWNjb3VudEluZm8gPSBscmM6OmFwaTo6YWNjb3VudDo6SW5mbzsKICAgIHVzaW5nIENvbnZlcnNhdGlvbkluZm8gPSBscmM6OmFwaTo6Y29udmVyc2F0aW9uOjpJbmZvOwogICAgdXNpbmcgQ29udGFjdEluZm8gPSBscmM6OmFwaTo6Y29udGFjdDo6SW5mbzsKCgogICAgZW51bSBSb2xlIHsKICAgICAgICBEaXNwbGF5TmFtZSA9IFF0OjpVc2VyUm9sZSArIDEsCiAgICAgICAgRGlzcGxheUlELAogICAgICAgIFBpY3R1cmUsCiAgICAgICAgUHJlc2VuY2UsCiAgICAgICAgVVJJLAogICAgICAgIFVucmVhZE1lc3NhZ2VzQ291bnQsCiAgICAgICAgTGFzdEludGVyYWN0aW9uRGF0ZSwKICAgICAgICBMYXN0SW50ZXJhY3Rpb24sCiAgICAgICAgTGFzdEludGVyYWN0aW9uVHlwZSwKICAgICAgICBDb250YWN0VHlwZSwKICAgICAgICBVSUQsCiAgICAgICAgQ29udGV4dE1lbnVPcGVuCiAgICB9OwoKICAgIGV4cGxpY2l0IFNtYXJ0TGlzdE1vZGVsKGNvbnN0IGxyYzo6YXBpOjphY2NvdW50OjpJbmZvJiBhY2MsIFFPYmplY3QgKnBhcmVudCA9IDApOwoKICAgIC8vIFFBYnN0cmFjdEl0ZW1Nb2RlbAogICAgaW50IHJvd0NvdW50KGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQgPSBRTW9kZWxJbmRleCgpKSBjb25zdCBvdmVycmlkZTsKICAgIGludCBjb2x1bW5Db3VudChjb25zdCBRTW9kZWxJbmRleCAmcGFyZW50KSBjb25zdCBvdmVycmlkZTsKICAgIFFWYXJpYW50IGRhdGEoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4LCBpbnQgcm9sZSA9IFF0OjpEaXNwbGF5Um9sZSkgY29uc3Qgb3ZlcnJpZGU7CiAgICBRTW9kZWxJbmRleCBpbmRleChpbnQgcm93LCBpbnQgY29sdW1uID0gMCwgY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCA9IFFNb2RlbEluZGV4KCkpIGNvbnN0OwogICAgUU1vZGVsSW5kZXggcGFyZW50KGNvbnN0IFFNb2RlbEluZGV4ICZjaGlsZCkgY29uc3Q7CiAgICBRdDo6SXRlbUZsYWdzIGZsYWdzKGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCkgY29uc3Q7CgogICAgLy8gaGFjayBmb3IgY29udGV4dCBtZW51IGhpZ2hsaWdodCByZXRlbnRpb24KICAgIGJvb2wgaXNDb250ZXh0TWVudU9wZW57IGZhbHNlIH07Cgpwcml2YXRlOgogICAgY29uc3QgQWNjb3VudEluZm8mIGFjY187Cn07Cg==