LyoKICogb2xlZGxnIGRsbCByZXNvdXJjZXMKICogRnJlbmNoIGxhbmd1YWdlIHN1cHBvcnQKICoKICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgSm9uYXRoYW4gRXJuc3QKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKCkxBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKClVJSU5TRVJUT0JKRUNUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjk0LCAxNTEKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiSW5z6XJlciBPYmpldCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTElTVEJPWCAgICAgICAgIElEQ19PQkpUWVBFTElTVCw4MiwxOSwxMzEsNjYsTEJTX1NPUlQgfAogICAgICAgICAgICAgICAgICAgIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEwgfAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AKICAgIExURVhUICAgICAgICAgICAiVHlwZSBkJ29iamV0IDoiLElEQ19PQkpUWVBFTEJMLDgyLDcsNTMsOCxXU19WSVNJQkxFCiAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDIyMSw3LDY2LDE0CiAgICBQVVNIQlVUVE9OICAgICAgIkFubnVsZXIiLElEQ0FOQ0VMLDIyMSwyNCw2NiwxNAogICAgR1JPVVBCT1ggICAgICAgICJS6XN1bHRhdCIsSURDX1JFU1VMVCw3LDEwMywyMDgsNDEKICAgIENPTlRST0wgICAgICAgICAiQ3LpZXIgbm91dmVhdSIsSURDX0NSRUFURU5FVywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfCAKICAgICAgICAgICAgICAgICAgICBXU19HUk9VUCw3LDIwLDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIkNy6WVyIGxlIGNvbnRy9GxlIixJRENfQ1JFQVRFQ09OVFJPTCwiQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04gfCBOT1QgV1NfVklTSUJMRSw3LDU0LDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIkNy6WVyIGRlcHVpcyBsZSBmaWNoaWVyIixJRENfQ1JFQVRFRlJPTUZJTEUsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OLDcsMzcsNjcsMTAKICAgIExURVhUICAgICAgICAgICAiIixJRENfUkVTVUxUREVTQyw0OSwxMTIsMTU5LDIzCiAgICBQVVNIQlVUVE9OICAgICAgIiZBam91dGUgQ29udHL0bGUuLi4iLElEQ19BRERDT05UUk9MLDgxLDg4LDYzLDE0LE5PVCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICAgIkFmZmljaGVyIGNvbW1lIGlj9G5lIixJRENfQVNJQ09OLCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8IAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AgfCBOT1QgV1NfVklTSUJMRSwyMjMsNTgsNjQsMTAKICAgIFBVU0hCVVRUT04gICAgICAiUGFyY291cmlyLi4uIixJRENfQlJPV1NFLDgzLDUzLDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIkZpY2hpZXIgOiIsSURDX0ZJTEVMQkwsODMsMjcsMjAsOCwgTk9UIFdTX1ZJU0lCTEUKICAgIEVESVRURVhUICAgICAgICBJRENfRklMRSw4MywzNywxMzIsMTMsRVNfQVVUT0hTQ1JPTEwgfCBOT1QgV1NfVklTSUJMRQpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICBJRFNfUkVTVUxUT0JKREVTQwkiSW5z6XJlciB1biBub3V2ZWwgb2JqZWN0ICVzIGRhbnMgdm90cmUgZG9jdW1lbnQiCiAgSURTX1JFU1VMVEZJTEVPQkpERVNDCSJJbnPocmUgbGUgY29udGVudSBkdSBmaWNoaWVyIGNvbW1lIHVuIG9iamV0IGRhbnMgdm90cmUgZG9jdW1lbnQgYWZpbiBxdWUgdm91cyBwdWlzc2lleiBsJ2FjdGl2ZXIgZW4gdXRpbGlzYW50IGxlIHByb2dyYW1tZSBhdmVjIGxlcXVlbCBpbCBhIOl06SBjcunpLiIKICBJRFNfQlJPV1NFICAgICAgICAgICAgIlBhcmNvdXJpciIKICBJRFNfTk9UT0xFTU9EICAgICAgICAgIkxlIGZpY2hpZXIgbmUgc2VtYmxlIHBhcyDqdHJlIHVuIG1vZHVsZSBPTEUgdmFsaWRlLiBJbXBvc3NpYmxlIGQnZW5yZWdpc3RyZXIgbGUgY29udHL0bGUgT0xFLiIKICBJRFNfTk9UT0xFTU9EQ0FQVElPTiAgIkFqb3V0ZXIgdW4gY29udHL0bGUiCn0KCklERF9QQVNURVNQRUNJQUw0IERJQUxPRyBESVNDQVJEQUJMRSAzLCAxNSwgMjkzLCAxNDAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkNvbGxhZ2Ugc3DpY2lhbCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAiU291cmNlIDoiLCAtMSwgNiwgOSwgMzAsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgQ09OVFJPTCAgICAgICAiQyZvbGxlciIsIElEQ19QU19QQVNURSwgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDM4LCA1NSwgMTAKICAgIENPTlRST0wgICAgICAgIkNvbGxlciBsZSAmbGllbiIsIElEQ19QU19QQVNURUxJTkssICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCA2MywgNTUsIDEwCiAgICBMVEVYVCAgICAgICAgICImQ29tbWUgOiIsIC0xLCA2NSwgMjUsIDE2LCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiT0siLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJBbm51bGVyIiwgSURDQU5DRUwsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiQWlkJmUiLCBJRENfT0xFVUlIRUxQLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDQyLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiZBZmZpY2hlciBjb21tZSBpY/RuZSIsIElEQ19QU19ESVNQTEFZQVNJQ09OLCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNTksIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX0lDT05ESVNQTEFZLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDIyNCwgNzUsIDY2LCA0NAogICAgQ09OVFJPTCAgICAgICAiQ2hhbmdlciBsJyZpY/RuZS4uLiIsIElEQ19QU19DSEFOR0VJQ09OLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDEyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfUkVTVUxUSU1BR0UsICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgOCwgMTAxLCA0MiwgMzQKICAgIENPTlRST0wgICAgICAgIjw8IGxlIHLpc3VsdGF0IHZpZW50IGljaSA+PiIsIElEQ19QU19SRVNVTFRURVhULCAiU3RhdGljIiwgU1NfTk9QUkVGSVggfCBXU19WSVNJQkxFLCA1NCwgMTAwLCAxNTksIDM1CiAgICBDT05UUk9MICAgICAgICJS6XN1bHRhdCIsIC0xLCAiQnV0dG9uIiwgQlNfR1JPVVBCT1ggfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDYsIDkwLCAyMTIsIDQ4CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfU09VUkNFVEVYVCwgIkVkaXQiLCBFU19SRUFET05MWSB8IEVTX0FVVE9IU0NST0xMIHwgV1NfVklTSUJMRSwgMzcsIDksIDE4MCwgOApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19QU19QQVNURV9EQVRBICAgICAgICAgICAgICAgICAgICAgIkluc+hyZSBsZSBjb250ZW51IGR1IHByZXNzZS1wYXBpZXJzIGRhbnMgdm90cmUgZG9jdW1lbnQgY29tbWUgJXMuIgogICAgSURTX1BTX1BBU1RFX09CSkVDVCAgICAgICAgICAgICAgICAgICAiSW5z6HJlIGxlIGNvbnRlbnUgZHUgcHJlc3NlLXBhcGllcnMgZGFucyB2b3RyZSBkb2N1bWVudCBkZSBzb3J0ZSBxdWUgdm91cyBwdWlzc2lleiBsJ2FjdGl2ZXIgZW4gdXRpbGlzYW50ICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1RfQVNfSUNPTiAgICAgICAgICAgIkluc+hyZSBsZSBjb250ZW51IGR1IHByZXNzZS1wYXBpZXJzIGRhbnMgdm90cmUgZG9jdW1lbnQgZGUgc29ydGUgcXVlIHZvdXMgcHVpc3NpZXogbCdhY3RpdmVyIGVuIHV0aWxpc2FudCAlcy4gSWwgc2VyYSBhZmZpY2jpIGNvbW1lIHVuZSBpY/RuZS4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19EQVRBICAgICAgICAgICAgICAgICJJbnPocmUgbGUgY29udGVudSBkdSBwcmVzc2UtcGFwaWVycyBkYW5zIHZvdHJlIGRvY3VtZW50IGNvbW1lICVzLiBMZXMgZG9ubullcyBzb250IGxp6WVzIGF1IGZpY2hpZXIgc291cmNlIGRlIHNvcnRlIHF1ZSBsZXMgbW9kaWZpY2F0aW9ucyBkZSBjZWxsZXMtY2kgc2Vyb250IHLpcGVyY3V06WVzIGRhbnMgdm90cmUgZG9jdW1lbnQuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUICAgICAgICAgICAgICAiSW5z6HJlIGxlIGNvbnRlbnUgZHUgcHJlc3NlLXBhcGllcnMgZGFucyB2b3RyZSBkb2N1bWVudC4gTCdpbWFnZSBlc3QgbGnpZSBhdSBmaWNoaWVyIHNvdXJjZSBkZSBzb3J0ZSBxdWUgbGVzIG1vZGlmaWNhdGlvbnMgZGUgY2VsbGUtY2kgc2Vyb250IHLpcGVyY3V06WVzIGRhbnMgdm90cmUgZG9jdW1lbnQuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUX0FTX0lDT04gICAgICAiSW5z6HJlIHVuIHJhY2NvdXJjaSBxdWkgcG9pbnRlIHZlcnMgbCdlbXBsYWNlbWVudCBkdSBjb250ZW51IGR1IHByZXNzZS1wYXBpZXJzLiBMZSByYWNjb3VyY2kgZXN0IGxp6SBhdSBmaWNoaWVyIHNvdXJjZSBkZSBzb3J0ZSBxdWUgbGVzIG1vZGlmaWNhdGlvbnMgZGUgY2VsdWktY2kgc2Vyb250IHLpcGVyY3V06WVzIGRhbnMgdm90cmUgZG9jdW1lbnQuIgogICAgSURTX1BTX05PTl9PTEUgICAgICAgICAgICAgICAgICAgICAgICAiSW5z6HJlIGxlIGNvbnRlbnUgZHUgcHJlc3NlLXBhcGllcnMgZGFucyB2b3RyZSBkb2N1bWVudC4iCiAgICBJRFNfUFNfVU5LTk9XTl9UWVBFICAgICAgICAgICAgICAgICAgICJUeXBlIGluY29ubnUiCiAgICBJRFNfUFNfVU5LTk9XTl9TUkMgICAgICAgICAgICAgICAgICAgICJTb3VyY2UgaW5jb25udWUiCiAgICBJRFNfUFNfVU5LTk9XTl9BUFAgICAgICAgICAgICAgICAgICAgICJsZSBwcm9ncmFtbWUgYXZlYyBsZXF1ZWwgaWwgYSDpdOkgY3Lp6SIKfQo=