LyoKICogb2xlZGxnIGRsbCByZXNvdXJjZXMKICogRnJlbmNoIGxhbmd1YWdlIHN1cHBvcnQKICoKICogQ29weXJpZ2h0IChDKSAyMDA1IEpvbmF0aGFuIEVybnN0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCgpMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCgpVSUlOU0VSVE9CSkVDVCBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDI5NCwgMTUxClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkluc+lyZXIgT2JqZXQiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBJRENfT0JKVFlQRUxJU1QsODIsMTksMTMxLDY2LExCU19TT1JUIHwKICAgICAgICAgICAgICAgICAgICBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QCiAgICBMVEVYVCAgICAgICAgICAgIlR5cGUgZCdvYmpldDoiLElEQ19PQkpUWVBFTEJMLDgyLDcsNTMsOCxXU19WSVNJQkxFCiAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDIyMSw3LDY2LDE0CiAgICBQVVNIQlVUVE9OICAgICAgIkFubnVsZXIiLElEQ0FOQ0VMLDIyMSwyNCw2NiwxNAogICAgR1JPVVBCT1ggICAgICAgICJS6XN1bHRhdCIsSURDX1JFU1VMVCw3LDEwMywyMDgsNDEKICAgIENPTlRST0wgICAgICAgICAiQ3LpZXIgTm91dmVhdSIsSURDX0NSRUFURU5FVywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfCAKICAgICAgICAgICAgICAgICAgICBXU19HUk9VUCw3LDIwLDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIkNy6WVyIENvbnRy9GxlIixJRENfQ1JFQVRFQ09OVFJPTCwiQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04gfCBOT1QgV1NfVklTSUJMRSw3LDU0LDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIkNy6WVyIERlcHVpcyBGaWNoaWVyIixJRENfQ1JFQVRFRlJPTUZJTEUsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OLDcsMzcsNjcsMTAKICAgIExURVhUICAgICAgICAgICAiIixJRENfUkVTVUxUREVTQyw0OSwxMTIsMTU5LDIzCiAgICBQVVNIQlVUVE9OICAgICAgIiZBam91dGUgQ29udHL0bGUuLi4iLElEQ19BRERDT05UUk9MLDgxLDg4LDYzLDE0LE5PVCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICAgIkFmZmljaGVyIENvbW1lIElj9G5lIixJRENfQVNJQ09OLCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8IAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AgfCBOT1QgV1NfVklTSUJMRSwyMjMsNTgsNjQsMTAKICAgIFBVU0hCVVRUT04gICAgICAiUGFyY291cmlyLi4uIixJRENfQlJPV1NFLDgzLDUzLDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIkZpY2hpZXI6IixJRENfRklMRUxCTCw4MywyNywyMCw4LCBOT1QgV1NfVklTSUJMRQogICAgRURJVFRFWFQgICAgICAgIElEQ19GSUxFLDgzLDM3LDEzMiwxMyxFU19BVVRPSFNDUk9MTCB8IE5PVCBXU19WSVNJQkxFCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogIElEU19SRVNVTFRPQkpERVNDCSJJbnPpcmVyIHVuIG5vdXZlbCBvYmplY3QgJXMgZGFucyB2b3RyZSBkb2N1bWVudCIKICBJRFNfUkVTVUxURklMRU9CSkRFU0MJIkluc+hyZSBsZSBjb250ZW51IGR1IGZpY2hpZXIgY29tbWUgdW4gb2JqZXQgZGFucyB2b3RyZSBkb2N1bWVudCBhZmluIHF1ZSB2b3VzIHB1aXNzaWV6IGwnYWN0aXZlciBlbiB1dGlsaXNhbnQgbGUgcHJvZ3JhbW1lIGF2ZWMgbGVxdWVsIHZvdXMgbCdhdmV6IGNy6ekuIgogIElEU19CUk9XU0UgICAgICAgICAgICAiUGFyY291cmlyIgogIElEU19OT1RPTEVNT0QgICAgICAgICAiTGUgZmljaGllciBuZSBzZW1ibGUgcGFzIOp0cmUgdW4gbW9kdWxlIE9MRSB2YWxpZGUuIEltcG9zc2libGUgZCdlbnJlZ2lzdHJlciBsZSBjb250cvRsZSBPTEUuIgogIElEU19OT1RPTEVNT0RDQVBUSU9OICAiQWpvdXRlciBDb250cvRsZSIKfQo=