LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgRG1pdHJ5IFN0YWRuaWsgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgIEFsZXhhbmRlciBTaGF0YWxpbiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICovCgqrSU1QT1JUICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA4L0dlbk1vZGVsIrsKCqtERUZJTkUgTWFpbiBGT1IgZ21mZ2VuOjpHZW5FeHRlcm5hbE5vZGVMYWJlbC27CqtFWFBBTkQgeHB0OjpDb21tb246OmNvcHlyaWdodCBGT1IgZ2V0RGlhZ3JhbSgpLmVkaXRvckdlbi27CnBhY2thZ2Ugq2dldERpYWdyYW0oKS5lZGl0UGFydHNQYWNrYWdlTmFtZbs7CgqrRVhQQU5EIHhwdDo6Q29tbW9uOjpnZW5lcmF0ZWRDbGFzc0NvbW1lbnS7CnB1YmxpYyBjbGFzcyCrZWRpdFBhcnRDbGFzc05hbWW7IKtFWFBBTkQgZXh0ZW5kc0xpc3S7IKtFWFBBTkQgaW1wbGVtZW50c0xpc3S7IHsKCgmrRVhQQU5EIGF0dHJpYnV0ZXMtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6RXh0ZXJuYWxOb2RlTGFiZWxFZGl0UGFydDo6aW5pdGlhbGl6ZXItuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6RXh0ZXJuYWxOb2RlTGFiZWxFZGl0UGFydDo6Y29uc3RydWN0b3ItuwoJCgmrRVhQQU5EIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6RXh0ZXJuYWxOb2RlTGFiZWxFZGl0UGFydDo6Z2V0Qm9yZGVySXRlbUxvY2F0b3ItuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6RXh0ZXJuYWxOb2RlTGFiZWxFZGl0UGFydDo6cmVmcmVzaEJvdW5kcy27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpUZXh0QXdhcmU6Om1ldGhvZHMoZmFsc2UsIHJlYWRPbmx5LCBlbGVtZW50SWNvbiwgdmlld21hcCwgbW9kZWxGYWNldCwgbm9kZSwgZ2V0RGlhZ3JhbSgpKS27CgkKCatFWFBBTkQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6RXh0ZXJuYWxOb2RlTGFiZWxFZGl0UGFydDo6Y3JlYXRlRmlndXJlLbsKCQoJq0VYUEFORCBhZGRpdGlvbnMtuwp9CqtFTkRERUZJTkW7CgqrREVGSU5FIGV4dGVuZHNMaXN0IEZPUiBnbWZnZW46OkdlbkV4dGVybmFsTm9kZUxhYmVsu2V4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydKtFTkRERUZJTkW7CgqrREVGSU5FIGltcGxlbWVudHNMaXN0IEZPUiBnbWZnZW46OkdlbkV4dGVybmFsTm9kZUxhYmVsu2ltcGxlbWVudHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0LCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0q0VORERFRklORbsKCqtERUZJTkUgYXR0cmlidXRlcyBGT1IgZ21mZ2VuOjpHZW5FeHRlcm5hbE5vZGVMYWJlbC27CgmrRVhQQU5EIHhwdDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpDb21tb246OnZpc3VhbElEQ29uc3RhbnQgRk9SIHRoaXMtuwoKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpUZXh0QXdhcmU6OmZpZWxkcyBGT1IgdGhpcy27CqtFTkRERUZJTkW7CgqrREVGSU5FIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMgRk9SIGdtZmdlbjo6R2VuRXh0ZXJuYWxOb2RlTGFiZWwtuwoJq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkTWVtYmVyQ29tbWVudLsKCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7CgkJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkV4dGVybmFsTm9kZUxhYmVsRWRpdFBhcnQ6OmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXNCb2R5LbsKCX0Kq0VORERFRklORbsKCqtERUZJTkUgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQgRk9SIGdtZmdlbjo6R2VuRXh0ZXJuYWxOb2RlTGFiZWwtuwoJq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkTWVtYmVyQ29tbWVudLsKCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBldmVudCkgewoJCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpFeHRlcm5hbE5vZGVMYWJlbEVkaXRQYXJ0OjpoYW5kbGVOb3RpZmljYXRpb25FdmVudEJvZHktuwoJfQqrRU5EREVGSU5FuwoKq0RFRklORSBhZGRpdGlvbnMgRk9SIGdtZmdlbjo6R2VuRXh0ZXJuYWxOb2RlTGFiZWy7q0VORERFRklORbsK