LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgRG1pdHJ5IFN0YWRuaWsgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgIEFsZXhhbmRlciBTaGF0YWxpbiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICovCgqrSU1QT1JUICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA4L0dlbk1vZGVsIrsKCqtERUZJTkUgTWFpbiBGT1IgZ21mZ2VuOjpHZW5Ob2RlLbsKq0VYUEFORCB4cHQ6OkNvbW1vbjo6Y29weXJpZ2h0IEZPUiBnZXREaWFncmFtKCkuZWRpdG9yR2VuLbsKcGFja2FnZSCrZ2V0RGlhZ3JhbSgpLmVkaXRQYXJ0c1BhY2thZ2VOYW1luzsKCqtFWFBBTkQgeHB0OjpDb21tb246OmdlbmVyYXRlZENsYXNzQ29tbWVudLsKcHVibGljIGNsYXNzIKtlZGl0UGFydENsYXNzTmFtZbsgq0VYUEFORCBleHRlbmRzTGlzdLsgq0VYUEFORCBpbXBsZW1lbnRzTGlzdLsgewoKCatFWFBBTkQgYXR0cmlidXRlcy27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmNvbnN0cnVjdG9yLbsKCQoJq0VYUEFORCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6Ok5vZGVFZGl0UGFydDo6Y3JlYXRlTGF5b3V0RWRpdFBvbGljeS27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmNyZWF0ZU5vZGVTaGFwZSh0aGlzKSBGT1Igdmlld21hcC27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmFkZEZpeGVkQ2hpbGQtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Tm9kZUVkaXRQYXJ0OjpyZW1vdmVGaXhlZENoaWxkLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6Ok5vZGVFZGl0UGFydDo6YWRkQ2hpbGRWaXN1YWwtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Tm9kZUVkaXRQYXJ0OjpyZW1vdmVDaGlsZFZpc3VhbC27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmdldENvbnRlbnRQYW5lRm9yLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6Ok5vZGVFZGl0UGFydDo6YWRkQm9yZGVySXRlbS27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmNyZWF0ZU5vZGVQbGF0ZS27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmdldFByaW1hcnlEcmFnRWRpdFBvbGljeS27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmNyZWF0ZUZpZ3VyZS27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OnNldHVwQ29udGVudFBhbmUtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Tm9kZUVkaXRQYXJ0OjpnZXRDb250ZW50UGFuZS27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmdldFByaW1hcnlDaGlsZEVkaXRQYXJ0LbsKCQoJq0VYUEFORCBoYW5kbGVOb3RpZmljYXRpb25FdmVudC27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmlubmVyQ2xhc3NEZWNsYXJhdGlvbiBGT1Igdmlld21hcC27CgoJq0VYUEFORCBhZGRpdGlvbnMtuwp9CqtFTkRERUZJTkW7CgqrREVGSU5FIGV4dGVuZHNMaXN0IEZPUiBnbWZnZW46Okdlbk5vZGW7ZXh0ZW5kcyCrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Tm9kZUVkaXRQYXJ0OjpleHRlbmRzTGlzdENvbnRlbnRzu6tFTkRERUZJTkW7CgqrREVGSU5FIGltcGxlbWVudHNMaXN0IEZPUiBnbWZnZW46Okdlbk5vZGW7q0VORERFRklORbsKCqtERUZJTkUgYXR0cmlidXRlcyBGT1IgZ21mZ2VuOjpHZW5Ob2RlLbsKCatFWFBBTkQgeHB0OjpkaWFncmFtOjplZGl0cGFydHM6OkNvbW1vbjo6dmlzdWFsSURDb25zdGFudCBGT1IgdGhpcy27CgoJq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkTWVtYmVyQ29tbWVudLsKCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZSBjb250ZW50UGFuZTsKCgmrRVhQQU5EIHhwdDo6Q29tbW9uOjpnZW5lcmF0ZWRNZW1iZXJDb21tZW50uwoJcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlIHByaW1hcnlTaGFwZTsKq0VORERFRklORbsKCqtERUZJTkUgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcyBGT1IgZ21mZ2VuOjpHZW5Ob2RlLbsKCatFWFBBTkQgeHB0OjpDb21tb246OmdlbmVyYXRlZE1lbWJlckNvbW1lbnS7Cglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewoJCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpOb2RlRWRpdFBhcnQ6OmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXNCb2R5LbsKCX0Kq0VORERFRklORbsKCqtERUZJTkUgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQgRk9SIGdtZmdlbjo6R2VuTm9kZS27CqtFTkRERUZJTkW7CgqrREVGSU5FIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50IEZPUiBnbWZnZW46OkdlblRvcExldmVsTm9kZS27CgmrUkVNu1RoaXMgY29kZSBpcyBpbXBvcnRhbnQgZm9yIHJlZnJlc2hpbmcgc2hvcnRjdXQgZGVjb3JhdGlvbgoJb24gYWRkaW5nIGNvcnJlc3BvbmRpbmcgYW5ub3RhdGlvbiB0byB0aGUgVmlldyBpbnN0YW5jZS6rRU5EUkVNuwoJq0lGIGdldERpYWdyYW0oKS5nZW5lcmF0ZVNob3J0Y3V0SWNvbigpLbsKCQmrRVhQQU5EIHhwdDo6Q29tbW9uOjpnZW5lcmF0ZWRNZW1iZXJDb21tZW50uwoJCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBldmVudCkgewoJCQmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Tm9kZUVkaXRQYXJ0OjpoYW5kbGVOb3RpZmljYXRpb25FdmVudEJvZHktuwoJCX0KCatFTkRJRi27CqtFTkRERUZJTkW7CgqrREVGSU5FIGFkZGl0aW9ucyBGT1IgZ21mZ2VuOjpHZW5Ob2RlLbsKq0VORERFRklORbs=