LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfc2FsLmh4eCIKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIElOQ0xfRE9TUFJPQ0VTUwojaW5jbHVkZSA8b3NsL3BpcGUuaD4KI2luY2x1ZGUgPG9zMi5oPgoKLy8gZWluZGV1dGlnZXIgTmFtZSBmgXIgZGllIFBpcGUKY29uc3QgY2hhciBwc3pQaXBlTmFtZVtdID0gIlRlc3RQaXBlIjsKCm9zbFBpcGUgUGlwZTsKCgp2b2lkIGZhaWwoIGNvbnN0IGNoYXIgKiBwc3pUZXh0LCBpbnQgcmV0dmFsICkKewogICAgZnByaW50Ziggc3RkZXJyLCAiVGVzdFBpcGUgQ2xpZW50OiAlcyIsIHBzelRleHQgKTsKICAgIGZwcmludGYoIHN0ZGVyciwgIlRlc3RQaXBlIENsaWVudDogdGVzdCBmYWlsZWQsIEVyck5vOiAlZC5cbiIsIHJldHZhbCApOwogICAgZXhpdCggcmV0dmFsICk7Cn0KICAgIAoKCi8qCiAqIFRlc3RlIGRpZSBQaXBlLUltcGxlbWVudGF0aW9uIGluIG9zbAogKi8KCmludCBtYWluICh2b2lkKQp7CiAgICBjaGFyICAgIHN6QnVmZmVyWyAyNTYgXTsKICAgIHNTaXplX3QgbkNoYXJzOwogICAgCiAgICAvLyBnaWIgZGVtIFNlcnZlciBkaWUgQ2hhbmNlLCBkaWUgUGlwZSB6dSCUZmZuZW4KICAgIERvc1NsZWVwKCAxMDAwICk7CiAgICAKICAgIC8vIGVyemV1Z2UgZGllIFBpcGUKICAgIFBpcGUgPSBvc2xfY3JlYXRlUGlwZSggcHN6UGlwZU5hbWUsIG9zbF9QaXBlX09QRU4sIDAgKTsKICAgIAogICAgaWYoICFQaXBlICkKICAgICAgICBmYWlsKCAidW5hYmxlIHRvIG9wZW4gcGlwZS5cbiIsCiAgICAgICAgICAgICAgb3NsX2dldExhc3RQaXBlRXJyb3IoTlVMTCkpOwoKCiAgICAvLyBlbXBmYW5nZSBEYXRlbiB2b20gU2VydmVyCiAgICBuQ2hhcnMgPSBvc2xfcmVjZWl2ZVBpcGUoIFBpcGUsIHN6QnVmZmVyLCAyNTYgKTsKCiAgICBpZiggbkNoYXJzIDwgMCApCiAgICAgICAgZmFpbCggInVuYWJsZSB0byByZWFkIGZyb20gcGlwZS5cbiIsCiAgICAgICAgICAgICAgb3NsX2dldExhc3RQaXBlRXJyb3IoIFBpcGUgKSApOwoKICAgIHByaW50ZiggIlRlc3RQaXBlIENsaWVudDogZGF0YSByZWNlaXZlZDogJXMuXG4iLCBzekJ1ZmZlciApOwoKICAgIC8vIFNlbmRlIGRpZSBEYXRlbiB3aWVkZXIgenVygWNrLgogICAgbkNoYXJzID0gb3NsX3NlbmRQaXBlKCBQaXBlLCBzekJ1ZmZlciwgbkNoYXJzICk7CiAgICAKICAgIGlmKCBuQ2hhcnMgPCAwICkKICAgICAgICBmYWlsKCAidW5hYmxlIHRvIHdyaXRlIG9uIHBpcGUuXG4iLAogICAgICAgICAgICAgIG9zbF9nZXRMYXN0UGlwZUVycm9yKCBQaXBlICkgKTsKICAgICAgICAgICAgICAKICAgIC8vIHNjaGxpZXNzZSBkaWUgUGlwZQogICAgb3NsX2Rlc3Ryb3lQaXBlKCBQaXBlICk7CgogICAgcHJpbnRmKCAiVGVzdFBpcGUgQ2xpZW50OiB0ZXN0IHBhc3NlZC5cbiIgKTsKICAgIHJldHVybiAwOwp9CgoKCg==