LyoKICogV2luZU1pbmUKICogS29yZWFuIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDAgSm9zaHVhIFRoaWVsZW4KICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICogQ29weXJpZ2h0IDIwMDUsMjAwNyBZdW5Tb25nIEh3YW5nCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFIHsKICAgICBJRFNfQVBQTkFNRSwgIldpbmVNaW5lIgogICAgIElEU19OT0JPRFksICAivsa5q7CzIgp9CgpNRU5VX1dJTkVNSU5FIE1FTlUgRElTQ0FSREFCTEUKewogICAgUE9QVVAgIr/JvMcoJk8pIiB7CiAgICAgICAgTUVOVUlURU0gIrv1ILDUwNMoJk4pXHRGMiIsICAgICAgIElETV9ORVcKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiubDAvcelIMelvcMoJk0pIiwgSURNX01BUktRCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIsPKurjA2igmQikiLCAgICAgIElETV9CRUdJTk5FUgogICAgICAgIE1FTlVJVEVNICLB37HewNooJkEpIiwgICAgICBJRE1fQURWQU5DRUQKICAgICAgICBNRU5VSVRFTSAiwPy5rrChKCZFKSIsICAgICAgICBJRE1fRVhQRVJUCiAgICAgICAgTUVOVUlURU0gIrvnv+vA2iDBpMDHKCZDKSIsICAgICAgICBJRE1fQ1VTVE9NCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIrOqsKGx4igmWClcdEFsdCtYIiwgICBJRE1fRVhJVAogICAgfQogICAgUE9QVVAgIrW1v/K4uygmSSkiIHsKICAgICAgICBNRU5VSVRFTSAiw9a03CC9w7CjKCZGKSIsICAgIElETV9USU1FUwogICAgICAgIE1FTlVJVEVNICLBpLq4KCZBKSIsICAgICAgICAgSURNX0FCT1VUCiAgICB9Cn0KCkRMR19USU1FUyBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMTYwLCA4MApTVFlMRSAgRFNfTU9EQUxGUkFNRSB8IERTXzNETE9PSyB8CiAgICBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19QT1BVUApDQVBUSU9OICLD1rTcIL3DsKMiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogICAgR1JPVVBCT1ggICAgICAgICLD1rTcIL3DsKMiLCBJRElHTk9SRSwgIDEwLCAgMTAsIDE0MCwgIDQ1CiAgICBMVEVYVCAgICAgICAgICAgIsPKurjA2iIsICAgICAgSURJR05PUkUsICAyMCwgIDIwLCAgNDAsICAgOAogICAgTFRFWFQgICAgICAgICAgICLB37HewNoiLCAgICAgIElESUdOT1JFLCAgMjAsICAzMCwgIDQwLCAgIDgKICAgIExURVhUICAgICAgICAgICAiwPy5rrChIiwgICAgICAgIElESUdOT1JFLCAgMjAsICA0MCwgIDQwLCAgIDgKICAgIExURVhUICAgICAgICAgICAiOTk5IiwgICAgICAgICAgSURDX1RJTUUxLCAgNzAsICAyMCwgIDE1LCAgIDgKICAgIExURVhUICAgICAgICAgICAiOTk5IiwgICAgICAgICAgSURDX1RJTUUyLCAgNzAsICAzMCwgIDE1LCAgIDgKICAgIExURVhUICAgICAgICAgICAiOTk5IiwgICAgICAgICAgSURDX1RJTUUzLCAgNzAsICA0MCwgIDE1LCAgIDgKICAgIExURVhUICAgICAgICAgICAiIiwgICAgICAgICAgICAgSURDX05BTUUxLCAgOTAsICAyMCwgIDU1LCAgIDgKICAgIExURVhUICAgICAgICAgICAiIiwgICAgICAgICAgICAgSURDX05BTUUyLCAgOTAsICAzMCwgIDU1LCAgIDgKICAgIExURVhUICAgICAgICAgICAiIiwgICAgICAgICAgICAgSURDX05BTUUzLCAgOTAsICA0MCwgIDU1LCAgIDgKICAgIERFRlBVU0hCVVRUT04gICAiyK7AziIsICAgICAgICAgICAgICAgIElET0ssICA1NSwgIDYwLCAgNTAsICAxNQp9CgpETEdfQ09OR1JBVFMgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxNjAsIDYwClNUWUxFICBEU19NT0RBTEZSQU1FIHwgRFNfM0RMT09LIHwKICAgIFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IFdTX1BPUFVQCkNBUFRJT04gIsPgx8/H1bTPtNkhIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKICAgIExURVhUICAgICAgICAgICAitOe9xcDHIMDMuKfAuyDA+77uwda8vL/kIiwgSURJR05PUkUsICAxMCwgIDEwLCAxNTAsICAxMAogICAgRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRENfRURJVE5BTUUsICAyNSwgIDIwLCAxMTAsICAxMgogICAgREVGUFVTSEJVVFRPTiAgICLIrsDOIiwgICAgICAgICAgICAgICAgICAgICAgICAgSURPSywgIDYwLCAgNDAsICA0MCwgIDE1Cn0KCkRMR19DVVNUT00gRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxMDAsIDEwMApTVFlMRSAgRFNfTU9EQUxGUkFNRSB8IERTXzNETE9PSyB8CiAgICBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19QT1BVUApDQVBUSU9OICK757/rwNogwaTAxyCw1MDTIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKICAgIExURVhUICAgICAgICAgICAisKG3zsHZIiwgICBJRElHTk9SRSwgICA1LCAgIDUsICAzMCwgIDEwCiAgICBMVEVYVCAgICAgICAgICAgIrv1t87B2SIsICAgSURJR05PUkUsICAgNSwgIDM1LCAgMzAsICAxMAogICAgTFRFWFQgICAgICAgICAgICLB9rfatekiLCAgSURJR05PUkUsICAgNSwgIDY1LCAgMzAsICAxMAogICAgRURJVFRFWFQgICAgICAgICAgICAgIElEQ19FRElUUk9XUywgICA1LCAgMTUsICAyMCwgIDEyLCBFU19OVU1CRVIKICAgIEVESVRURVhUICAgICAgICAgICAgICBJRENfRURJVENPTFMsICAgNSwgIDQ1LCAgMjAsICAxMiwgRVNfTlVNQkVSCiAgICBFRElUVEVYVCAgICAgICAgICAgICBJRENfRURJVE1JTkVTLCAgIDUsICA3NSwgIDIwLCAgMTIsIEVTX05VTUJFUgogICAgREVGUFVTSEJVVFRPTiAgICLIrsDOIiwgICAgIElET0ssICAgICAgNDAsICAzMCwgIDUwLCAgMTUKICAgIFBVU0hCVVRUT04gICAgICAiw+u80iIsIElEQ0FOQ0VMLCAgNDAsICA1MCwgIDUwLCAgMTUKfQoKRExHX0FCT1VUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMTYwLCA4MApTVFlMRSAgRFNfTU9EQUxGUkFNRSB8IERTXzNETE9PSyB8CiAgICBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19QT1BVUApDQVBUSU9OICLBpLq4IgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKICAgIExURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaW5lbWluZSIsIElESUdOT1JFLCAgMTAsICAxMCwgIDUwLCAgMTAKICAgIExURVhUICAgICAgICAgIkNvcHlyaWdodCAyMDAwLCBKb3NodWEgVGhpZWxlbiIsIElESUdOT1JFLCAgMzUsICAyNSwgMTE1LCAgMTAKICAgIExURVhUICAgICAgICAgICAgICAgICAiTEdQTCC288DMvL69urimILX7uKi0z7TZIiwgSURJR05PUkUsICAzNSwgIDM1LCAxMTUsICAxMAogICAgSUNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJTkVNSU5FIiwgSURJR05PUkUsICAxMCwgIDI1LCAgMjAsICAyMAogICAgREVGUFVTSEJVVFRPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsiuwM4iLCBJRE9LLCAgICAgIDUwLCAgNjAsICA2MCwgIDE1Cn0K