LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgogLy8gaW5jbHVkZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2luY2x1ZGUgPHNmeDIvc2Z4LmhyYz4KI2luY2x1ZGUgImhlbHBpZC5ocmMiCiNpbmNsdWRlIDxjdWlyZXMuaHJjPgojaW5jbHVkZSAib3B0ZGljdC5ocmMiCiAvLyBwcmFnbWEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIC8vIFJJRF9TRlhETEdfTkVXRElDVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1vZGFsRGlhbG9nIFJJRF9TRlhETEdfTkVXRElDVAp7CglIZWxwSWQgPSBISURfT1BUSU9OU19ESUNUX05FVyA7CglPdXRwdXRTaXplID0gVFJVRSA7CglTVkxvb2sgPSBUUlVFIDsKCVNpemUgPSBNQVBfQVBQRk9OVCAoIDIxMyAsIDY2ICkgOwoJTW92ZWFibGUgPSBUUlVFIDsKCS8qICMjIyBBQ0hUVU5HOiBOZXVlciBUZXh0IGluIFJlc291cmNlPyBCZW51dHplcnf2cnRlcmJ1Y2ggYW5sZWdlbiA6IEJlbnV0emVyd/dydGVyYnVjaCBhbmxlZ2VuICovCgkvKiAjIyMgQUNIVFVORzogTmV1ZXIgVGV4dCBpbiBSZXNvdXJjZT8gQmVudXR6ZXJ39nJ0ZXJidWNoIGFubGVnZW4gOiBCZW51dHplcnf3cnRlcmJ1Y2ggYW5sZWdlbiAqLwoJVGV4dCBbIGVuLVVTIF0gPSAiTmV3IERpY3Rpb25hcnkiIDsKCUZpeGVkVGV4dCBGVF9ESUNUTkFNRQoJewoJCVBvcyA9IE1BUF9BUFBGT05UICggMTEgLCAxNSApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA0MCAsIDEwICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5OYW1lIiA7CgkJTGVmdExhYmVsID0gVFJVRSA7Cgl9OwoJRWRpdCBFRF9ESUNUTkFNRQoJewoJICAgIEhlbHBJRCA9ICJjdWk6RWRpdDpSSURfU0ZYRExHX05FV0RJQ1Q6RURfRElDVE5BTUUiOwoJCUJvcmRlciA9IFRSVUUgOwoJCVBvcyA9IE1BUF9BUFBGT05UICggNTUgLCAxNCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA5MCAsIDEyICkgOwoJCU1heFRleHRMZW5ndGggPSAzMiA7Cgl9OwoJRml4ZWRUZXh0IEZUX0RJQ1RMQU5HCgl7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCAxMiAsIDMwICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDQwICwgMTAgKSA7CgkJVGV4dCBbIGVuLVVTIF0gPSAifkxhbmd1YWdlIiA7CgkJTGVmdExhYmVsID0gVFJVRSA7Cgl9OwoJTGlzdEJveCBMQl9ESUNUTEFORwoJewoJICAgIEhlbHBJRCA9ICJjdWk6TGlzdEJveDpSSURfU0ZYRExHX05FV0RJQ1Q6TEJfRElDVExBTkciOwoJCUJvcmRlciA9IFRSVUUgOwoJCVBvcyA9IE1BUF9BUFBGT05UICggNTUgLCAzMCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA5MCAsIDY2ICkgOwoJCURyb3BEb3duID0gVFJVRSA7Cgl9OwoJQ2hlY2tCb3ggQlROX0VYQ0VQVAoJewoJICAgIEhlbHBJRCA9ICJjdWk6Q2hlY2tCb3g6UklEX1NGWERMR19ORVdESUNUOkJUTl9FWENFUFQiOwoJCVBvcyA9IE1BUF9BUFBGT05UICggMTIgLCA0NCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA1NyAsIDEwICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5FeGNlcHRpb24gKC0pIiA7Cgl9OwogICAgRml4ZWRMaW5lIEdCX05FV0RJQ1QKCXsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDYgLCAzICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDE0NSAsIDggKSA7CgkJLyogIyMjIEFDSFRVTkc6IE5ldWVyIFRleHQgaW4gUmVzb3VyY2U/IFf2cnRlcmJ1Y2ggOiBX93J0ZXJidWNoICovCgkJLyogIyMjIEFDSFRVTkc6IE5ldWVyIFRleHQgaW4gUmVzb3VyY2U/IFf2cnRlcmJ1Y2ggOiBX93J0ZXJidWNoICovCgkJVGV4dCBbIGVuLVVTIF0gPSAiRGljdGlvbmFyeSIgOwoJfTsKCU9LQnV0dG9uIEJUTl9ORVdESUNUX09LCgl7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCAxNTcgLCA2ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDUwICwgMTQgKSA7CgkJRGlzYWJsZSA9IFRSVUUgOwoJCURlZkJ1dHRvbiA9IFRSVUUgOwoJfTsKCUNhbmNlbEJ1dHRvbiBCVE5fTkVXRElDVF9FU0MKCXsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDE1NyAsIDIzICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDUwICwgMTQgKSA7Cgl9OwoJSGVscEJ1dHRvbiBCVE5fTkVXRElDVF9ITFAKCXsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDE1NyAsIDQzICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDUwICwgMTQgKSA7Cgl9Owp9OwoKIC8vIFJJRF9TRlhETEdfRURJVERJQ1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1vZGFsRGlhbG9nIFJJRF9TRlhETEdfRURJVERJQ1QKewoJSGVscElkID0gSElEX09QVElPTlNfRElDVF9FRElUIDsKCU91dHB1dFNpemUgPSBUUlVFIDsKCVNWTG9vayA9IFRSVUUgOwoJU2l6ZSA9IE1BUF9BUFBGT05UKCAyNzAsIDE2MSApOwoKCS8qICMjIyBBQ0hUVU5HOiBOZXVlciBUZXh0IGluIFJlc291cmNlPyBCZW51dHplcnf2cnRlcmJ1Y2ggYmVhcmJlaXRlbiA6IEJlbnV0emVyd/dydGVyYnVjaCBiZWFyYmVpdGVuICovCgkvKiAjIyMgQUNIVFVORzogTmV1ZXIgVGV4dCBpbiBSZXNvdXJjZT8gQmVudXR6ZXJ39nJ0ZXJidWNoIGJlYXJiZWl0ZW4gOiBCZW51dHplcnf3cnRlcmJ1Y2ggYmVhcmJlaXRlbiAqLwoJVGV4dCBbIGVuLVVTIF0gPSAiRWRpdCBDdXN0b20gRGljdGlvbmFyeSIgOwoKCU1vdmVhYmxlID0gVFJVRSA7CglGaXhlZFRleHQgRlRfQk9PSwoJewoJCVBvcyA9IE1BUF9BUFBGT05UICggMTIgLCAxMCApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA4NiAsIDEwICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5Cb29rIiA7Cgl9OwoJTGlzdEJveCBMQl9BTExESUNUUwoJewoJICAgIEhlbHBJRCA9ICJjdWk6TGlzdEJveDpSSURfU0ZYRExHX0VESVRESUNUOkxCX0FMTERJQ1RTIjsKCQlCb3JkZXIgPSBUUlVFIDsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDgyICwgOSApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCAxMjEgLCA2MiApIDsKCQlEcm9wRG93biA9IFRSVUUgOwoJfTsKCUZpeGVkVGV4dCBGVF9ESUNUTEFORwoJewoJCVBvcyA9IE1BUF9BUFBGT05UICggMTIgLCAyNiApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA4NiAsIDEwICkgOwoJCVRleHQgWyBlbi1VUyBdID0gIn5MYW5ndWFnZSIgOwoJfTsKCUxpc3RCb3ggTEJfRElDVExBTkcKCXsKCSAgICBIZWxwSUQgPSAiY3VpOkxpc3RCb3g6UklEX1NGWERMR19FRElURElDVDpMQl9ESUNUTEFORyI7CgkJQm9yZGVyID0gVFJVRSA7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCA4MiAsIDI1ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDEyMSAsIDY2ICkgOwoJCURyb3BEb3duID0gVFJVRSA7Cgl9OwoKICAgIEZpeGVkTGluZSBHQl9FRElURElDVFMKCXsKCQlQb3MgPSBNQVBfQVBQRk9OVCggMSwgMSApOwoJCVNpemUgPSBNQVBfQVBQRk9OVCggMjY4LCAxMzggKTsKCQlIaWRlPVRSVUU7Cgl9OwoKCUZpeGVkVGV4dCBGVF9XT1JECgl7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCAxMyAsIDQ2ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDQwICwgOCApIDsKCQlUZXh0IFsgZW4tVVMgXSA9ICJ+V29yZCI7Cgl9OwoJRWRpdCBFRF9XT1JECgl7CgkgICAgSGVscElEID0gImN1aTpFZGl0OlJJRF9TRlhETEdfRURJVERJQ1Q6RURfV09SRCI7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCAxMiAsIDU2ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDcxICwgMTIgKSA7CgkJQm9yZGVyID0gVFJVRSA7CgkJVGFiU3RvcCA9IFRSVUUgOwoJfTsKCUZpeGVkVGV4dCBGVF9SRVBMQUNFCgl7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCA4NCAsIDQ2ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDYwICwgOCApIDsKCQlUZXh0IFsgZW4tVVMgXSA9ICJSZXBsYWNlIH5CeToiOwoJfTsKCglFZGl0IEVEX1JFUExBQ0UKCXsKCSAgICBIZWxwSUQgPSAiY3VpOkVkaXQ6UklEX1NGWERMR19FRElURElDVDpFRF9SRVBMQUNFIjsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDgzICwgNTYgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggMTIwICwgMTIgKSA7CgkJQm9yZGVyID0gVFJVRSA7CgkJVGFiU3RvcCA9IFRSVUUgOwoJfTsKCglQdXNoQnV0dG9uIFBCX05FV19SRVBMQUNFCgl7CgkgICAgSGVscElEID0gImN1aTpQdXNoQnV0dG9uOlJJRF9TRlhETEdfRURJVERJQ1Q6UEJfTkVXX1JFUExBQ0UiOwoJCVBvcyA9IE1BUF9BUFBGT05UICggMjA5ICwgNTYgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggNTUgLCAxMiApIDsKCQlUYWJTdG9wID0gVFJVRSA7CgkJVGV4dCBbIGVuLVVTIF0gPSAifk5ldyIgOwoJfTsKCVB1c2hCdXR0b24gUEJfREVMRVRFX1JFUExBQ0UKCXsKCSAgICBIZWxwSUQgPSAiY3VpOlB1c2hCdXR0b246UklEX1NGWERMR19FRElURElDVDpQQl9ERUxFVEVfUkVQTEFDRSI7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCAyMDkgLCA3MSApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA1NSAsIDEyICkgOwoJCVRhYlN0b3AgPSBUUlVFIDsKCQlUZXh0IFsgZW4tVVMgXSA9ICJ+RGVsZXRlIiA7Cgl9OwoJQ29udHJvbCBUTEJfUkVQTEFDRQoJewogICAgICAgIEhlbHBJZCA9IEhJRF9PUFRJT05TX0RJQ1RfRURJVF9FTlRSSUVTX0xJU1Q7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCAxMiAsIDcxICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDE5MSAsIDU4ICkgOwoJCUJvcmRlciA9IFRSVUUgOwoJCVRhYlN0b3AgPSBUUlVFIDsKCX07CglTdHJpbmcgU1RSX01PRElGWQoJewoJCVRleHQgWyBlbi1VUyBdID0gIn5SZXBsYWNlIiA7Cgl9OwoKCgoJSGVscEJ1dHRvbiBCVE5fRURJVEhFTFAKCXsKCQlQb3MgPSBNQVBfQVBQRk9OVCggMTQ1LCAxNDMgKTsKCQlTaXplID0gTUFQX0FQUEZPTlQoIDU1LCAxNCApOwoJfTsKCglDYW5jZWxCdXR0b24gQlROX0VESVRDTE9TRQoJewoJCVBvcyA9IE1BUF9BUFBGT05UICggMjA5ICwgMTQzICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDU1ICwgMTQgKSA7CgoJCS8qICMjIyBBQ0hUVU5HOiBOZXVlciBUZXh0IGluIFJlc291cmNlPyB+U2NobGll32VuIDogflNjaGxpZZhlbiAqLwoJCS8qICMjIyBBQ0hUVU5HOiBOZXVlciBUZXh0IGluIFJlc291cmNlPyB+U2NobGll32VuIDogflNjaGxpZZhlbiAqLwoJCVRleHQgWyBlbi1VUyBdID0gIn5DbG9zZSIgOwoJfTsKfTsKCiAvLyBTdHJpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTdHJpbmcgUklEX1NWWFNUUl9PUFRfRE9VQkxFX0RJQ1RTCnsKCVRleHQgWyBlbi1VUyBdID0gIlRoZSBzcGVjaWZpZWQgbmFtZSBhbHJlYWR5IGV4aXN0cy5cblBsZWFzZSBlbnRlciBhIG5ldyBuYW1lLiIgOwp9OwogLy8gUklEX1NGWFFCX1NFVF9MQU5HVUFHRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUXVlcnlCb3ggUklEX1NGWFFCX1NFVF9MQU5HVUFHRQp7CglCdXR0b25zID0gV0JfWUVTX05PIDsKCURlZkJ1dHRvbiA9IFdCX0RFRl9OTyA7CgkvKiAjIyMgQUNIVFVORzogTmV1ZXIgVGV4dCBpbiBSZXNvdXJjZT8gTfZjaHRlbiBTaWUgZGllIFNwcmFjaGUgZGVzIFf2cnRlcmJ1Y2hlcyAnJTEnIORuZGVybj8gOiBN9mNodGVuIFNpZSBkaWUgU3ByYWNoZSBkZXMgV/ZydGVyYnVjaGVzICcnJTEnJyDkbmRlcm4/ICovCgkvKiAjIyMgQUNIVFVORzogTmV1ZXIgVGV4dCBpbiBSZXNvdXJjZT8gTfZjaHRlbiBTaWUgZGllIFNwcmFjaGUgZGVzIFf2cnRlcmJ1Y2hlcyAnJTEnIORuZGVybj8gOiBN9mNodGVuIFNpZSBkaWUgU3ByYWNoZSBkZXMgV/ZydGVyYnVjaGVzICcnJTEnJyDkbmRlcm4/ICovCgkvKiAjIyMgQUNIVFVORzogTmV1ZXIgVGV4dCBpbiBSZXNvdXJjZT8gTfZjaHRlbiBTaWUgZGllIFNwcmFjaGUgZGVzIFf2cnRlcmJ1Y2hlcyAnJTEnIORuZGVybj8gOiBN92NodGVuIFNpZSBkaWUgU3ByYWNoZSBkZXMgV/dydGVyYnVjaGVzICclMScg9W5kZXJuPyAqLwoJLyogIyMjIEFDSFRVTkc6IE5ldWVyIFRleHQgaW4gUmVzb3VyY2U/IE32Y2h0ZW4gU2llIGRpZSBTcHJhY2hlIGRlcyBX9nJ0ZXJidWNoZXMgJyUxJyDkbmRlcm4/IDogTfdjaHRlbiBTaWUgZGllIFNwcmFjaGUgZGVzIFf3cnRlcmJ1Y2hlcyAnJTEnIPVuZGVybj8gKi8KCU1lc3NhZ2UgWyBlbi1VUyBdID0gIkRvIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgJyUxJyBkaWN0aW9uYXJ5IGxhbmd1YWdlPyIgOwp9OwogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFT0YKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK