LyoKICogU3RhcnQKICogRnJlbmNoIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDMgRGFuIEtlZ2VsCiAqIENvcHlyaWdodCAyMDAzIFZpbmNlbnQgQulyb24KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19GUkVOQ0gsIFNVQkxBTkdfTkVVVFJBTAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfVVNBR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuY2UgdW4gcHJvZ3JhbW1lLCBvdSBvdXZyZSB1biBkb2N1bWVudCBkYW5zIGxlIHByb2dyYW1tZSBub3JtYWxlbWVudCB1dGlsaXPpIGF2ZWMgY2V0dGUgZXh0ZW5zaW9uLiBcblwKVXNhZ2U6IFxuXApzdGFydCBbb3B0aW9uc10gZmljaGllcl9wcm9ncmFtbWUgWy4uLl0gXG5cCnN0YXJ0IFtvcHRpb25zXSBmaWNoaWVyX2RvY3VtZW50IFxuXAogXG5cCk9wdGlvbnM6IFxuXAovTVtpbmltaXplZF0gTGFuY2UgbGUgcHJvZ3JhbW1lIG1pbmltaXPpLiBcblwKL01BWFtpbWl6ZWRdIExhbmNlIGxlIHByb2dyYW1tZSBtYXhpbWlz6S4gXG5cCi9SW2VzdG9yZWRdICBMYW5jZSBsZSBwcm9ncmFtbWUgbm9ybWFsZW1lbnQgKG5pIG1pbmltaXPpIG5pIG1heGltaXPpKS4gXG5cCi9XW2FpdF0gICAgICBBdHRlbmQgcXVlIGxlIHByb2dyYW1tZSBsYW5j6SBzZSB0ZXJtaW5lLCBldCB0ZXJtaW5lIGVuc3VpdGUgYXZlYyBzb24gY29kZSBkZSBzb3J0aWUuIFxuXAovTCAgICAgICAgICAgTW9udHJlIGxhIGxpY2VuY2UgZCd1dGlsaXNhdGlvbi4gXG5cCiBcblwKc3RhcnQuZXhlIHZlcnNpb24gMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsIFxuXApTdGFydCBlc3QgZm91cm5pIHNhbnMgQVVDVU5FIEdBUkFOVElFOyBwb3VyIGxlcyBk6XRhaWxzIGxhbmNleiBhdmVjIGwnb3B0aW9uIC9MLiBcblwKQ2VjaSBlc3QgdW4gbG9naWNpZWwgbGlicmUsIGV0IHZvdXMg6nRlcyBpbnZpdOkg4CBsZSByZWRpc3RyaWJ1ZXJcblwKc291cyBjZXJ0YWluZXMgY29uZGl0aW9uOyBsYW5jZXogJ3N0YXJ0IC9MJyBwb3VyIGxlcyBk6XRhaWxzLiBcblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUgdmVyc2lvbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWwgXG5cClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgXG5cCm9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBcblwKIFxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgXG5cCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIFxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIFxuXAogXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIFxuXApGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gXG5cCiBcblwKU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLiBcblwKIgoKU1RSSU5HX0VYRUNGQUlMICJMZSBwcm9ncmFtbWUgbidhIHBhcyBwdSDqdHJlIGxhbmPpLCBvdSBpbCBuJ3kgYSBwYXMgZGUgcHJvZ3JhbW1lIGFzc29jaekgYXZlYyBsZSBmaWNoaWVyIHNw6WNpZmnpLlxuU2hlbGxFeGVjdXRlRXggYSDpY2hvdekiCn0K