LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KICoKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliLmludGVybmFsCgppbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5CmltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuQWNjZXNzb3JzCmltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb24KaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi51dGlsLlRvU3RyaW5nQnVpbGRlcgppbXBvcnQgb3JnLmp1bml0LlRlc3QKCmltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qCmltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuVG9TdHJpbmcKCi8qKgogKiBAYXV0aG9yIEthcnN0ZW4gVGhvbXMgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCiAqLwpjbGFzcyBUb1N0cmluZ0J1aWxkZXJUZXN0IHsKCglAVGVzdCBkZWYgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CgkJdmFsIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG5ldyBNeUVudGl0eShuZXcgTXlFbnRpdHkpKS5hZGRBbGxGaWVsZHMKCQlhc3NlcnRFcXVhbHModG9Vbml4KAoJCQkJJycnCgkJTXlFbnRpdHkgWwoJCSAgYm9vbFByb3AgPSB0cnVlCgkJICBpbnRQcm9wID0gNDIKCQkgIG15TGlzdCA9IEFycmF5TGlzdCAoCgkJICAgICJmb28iLAoJCSAgICAiYmFyIiwKCQkgICAgImJheiIKCQkgICkKCQkgIGZyaWVuZCA9IHRydWUKCQkgIDQyCgkJICBbZm9vLCBiYXIsIGJhel0KCQkgIG51bGwKCQkgIENMQVNTCgkJICBwb2xpY3kgPSBDTEFTUwoJCV0nJycpLCBidWlsZGVyLnRvU3RyaW5nKCkpCgl9CgoJQFRlc3QgZGVmIHZvaWQgdGVzdFNpbmdsZUxpbmUoKSB7CgkJdmFsIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG5ldyBNeUVudGl0eSkuc2luZ2xlTGluZS5hZGRBbGxGaWVsZHMKCgkJYXNzZXJ0RXF1YWxzKAoJCQknTXlFbnRpdHkgW2Jvb2xQcm9wID0gdHJ1ZSwgaW50UHJvcCA9IDQyLCBteUxpc3QgPSBBcnJheUxpc3QgKCJmb28iLCJiYXIiLCJiYXoiKSwgZnJpZW5kID0gbnVsbCwgcG9saWN5ID0gQ0xBU1NdJywKCQkJYnVpbGRlci50b1N0cmluZygpKQoJfQoKCUBUZXN0IGRlZiB2b2lkIHRlc3RIaWRlRmllbGROYW1lcygpIHsKCQl2YWwgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIobmV3IE15RW50aXR5KS5zaW5nbGVMaW5lLmhpZGVGaWVsZE5hbWVzLmFkZEFsbEZpZWxkcwoKCQlhc3NlcnRFcXVhbHMoJ015RW50aXR5IFt0cnVlLCA0MiwgQXJyYXlMaXN0ICgiZm9vIiwiYmFyIiwiYmF6IiksIG51bGwsIENMQVNTXScsIGJ1aWxkZXIudG9TdHJpbmcoKSkKCX0KCglAVGVzdCBkZWYgdm9pZCB0ZXN0U2tpcE51bGxzKCkgewoJCXZhbCBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihuZXcgTXlFbnRpdHkpLnNraXBOdWxscy5hZGRBbGxGaWVsZHMKCgkJYXNzZXJ0RXF1YWxzKHRvVW5peCgKCQkJCScnJwoJCU15RW50aXR5IFsKCQkgIGJvb2xQcm9wID0gdHJ1ZQoJCSAgaW50UHJvcCA9IDQyCgkJICBteUxpc3QgPSBBcnJheUxpc3QgKAoJCSAgICAiZm9vIiwKCQkgICAgImJhciIsCgkJICAgICJiYXoiCgkJICApCgkJICBwb2xpY3kgPSBDTEFTUwoJCV0nJycpLCBidWlsZGVyLnRvU3RyaW5nKQoJfQoKCUBUZXN0IGRlZiB2b2lkIHRlc3RFeHBsaWNpdEZpZWxkTGlzdGluZygpIHsKCQl2YWwgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIobmV3IE15RW50aXR5KS5hZGQoImJvb2xQcm9wIiwgZmFsc2UpLmFkZEZpZWxkKCJpbnRQcm9wIikKCgkJYXNzZXJ0RXF1YWxzKHRvVW5peCgKCQkJCScnJwoJCU15RW50aXR5IFsKCQkgIGJvb2xQcm9wID0gZmFsc2UKCQkgIGludFByb3AgPSA0MgoJCV0nJycpLCBidWlsZGVyLnRvU3RyaW5nKQoJfQoKCUBUZXN0IGRlZiB2b2lkIHJlY3Vyc2lvbkhhbmRsaW5nKCkgewoJCXZhbCBvYmogPSBuZXcgT3RoZXJDbGFzcwoJCW9iai5uYW1lID0gJ2ZvbycKCQlvYmoub3RoZXIgPSBvYmoKCQl2YWwgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIob2JqKS5hZGREZWNsYXJlZEZpZWxkcwoKCQlhc3NlcnRFcXVhbHModG9Vbml4KAoJCQkJJycnCgkJT3RoZXJDbGFzcyBbCgkJICBvdGhlciA9IKtvYmoudG9TdHJpbme7CgkJICBuYW1lID0gImZvbyIKCQldJycnKSwgYnVpbGRlci50b1N0cmluZykKCX0KCglAVGVzdCBkZWYgdm9pZCByZWN1cnNpb25IYW5kbGluZ18wMigpIHsKCQl2YWwgb2JqID0gbmV3IERhdGFDbGFzcygpCgkJb2JqLm90aGVyID0gb2JqCgkJb2JqLm5hbWUgPSAidGVzdCIKCQl2YWwgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIob2JqKS5hZGREZWNsYXJlZEZpZWxkcwoJCWFzc2VydEVxdWFscyh0b1VuaXgoCgkJCQknJycKCQlEYXRhQ2xhc3MgWwoJCSAgb3RoZXIgPSBEYXRhQ2xhc3NAq1N5c3RlbTo6aWRlbnRpdHlIYXNoQ29kZShvYmopuwoJCSAgbmFtZSA9ICJ0ZXN0IgoJCV0nJycpLCBidWlsZGVyLnRvU3RyaW5nKQoJfQoKCXN0YXRpYyBjbGFzcyBPdGhlckNsYXNzIHsKCQlwdWJsaWMgT3RoZXJDbGFzcyBvdGhlcgoJCXB1YmxpYyBTdHJpbmcgbmFtZQoJfQoKCUBBY2Nlc3NvcnMgQFRvU3RyaW5nIHN0YXRpYyBjbGFzcyBEYXRhQ2xhc3MgewoJCXB1YmxpYyBEYXRhQ2xhc3Mgb3RoZXIKCQlwdWJsaWMgU3RyaW5nIG5hbWUKCX0KCglzdGF0aWMgY2xhc3MgTXlFbnRpdHkgewoJCXZhbCBib29sUHJvcCA9IHRydWUKCQl2YWwgaW50UHJvcCA9IDQyCgkJdmFsIG15TGlzdCA9IG5ld0FycmF5TGlzdCgnZm9vJywgJ2JhcicsICdiYXonKQoJCXZhbCBNeUVudGl0eSBmcmllbmQKCQl2YWwgUmV0ZW50aW9uUG9saWN5IHBvbGljeSA9IFJldGVudGlvblBvbGljeTo6Q0xBU1MKCgkJbmV3KCkgewoJCQl0aGlzLmZyaWVuZCA9IG51bGwKCQl9CgoJCW5ldyhNeUVudGl0eSBmcmllbmQpIHsKCQkJdGhpcy5mcmllbmQgPSBmcmllbmQ7CgkJfQoKCQlvdmVycmlkZSB0b1N0cmluZygpIHsKCQkJcmV0dXJuIGJvb2xQcm9wICsgJ1xuJyArIGludFByb3AgKyAnXG4nICsgbXlMaXN0ICsgJ1xuJyArIGZyaWVuZCArICdcbicgKyBwb2xpY3kKCQl9Cgl9CgoJZGVmIHN0YXRpYyBTdHJpbmcgdG9Vbml4KFN0cmluZyBzKSB7CgkJdmFyIFN0cmluZ0NvbmNhdGVuYXRpb24gcmVzdWx0ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIikKCQlyZXN1bHQuYXBwZW5kKHMpCgkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpCgl9Cn0K