LyoKICogQ29weXJpZ2h0IDIwMDMgVWxyaWNoIEN6ZWthbGxhIGZvciBDb2RlV2VhdmVycwogKiBDb3B5cmlnaHQgMjAwNiBNaWtvbGFqIFphbGV3c2tpCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQKClVJSU5TRVJUT0JKRUNUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMzEwLCAxNTEKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiV3N0YXcgb2JpZWt0IgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMSVNUQk9YICAgICAgICAgSURDX09CSlRZUEVMSVNULDgyLDE5LDEzMSw2NixMQlNfU09SVCB8CiAgICAgICAgICAgICAgICAgICAgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WSVNJQkxFIHwgV1NfVlNDUk9MTCB8CiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUAogICAgTFRFWFQgICAgICAgICAgICJUeXAgb2JpZWt0dToiLElEQ19PQkpUWVBFTEJMLDgyLDcsNTMsOCxXU19WSVNJQkxFCiAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDIyOSw3LDY2LDE0CiAgICBQVVNIQlVUVE9OICAgICAgIkFudWx1aiIsSURDQU5DRUwsMjI5LDI0LDY2LDE0CiAgICBHUk9VUEJPWCAgICAgICAgIld5bmlrIixJRENfUkVTVUxULDcsMTAzLDIwOCw0MQogICAgQ09OVFJPTCAgICAgICAgICJVdHfzcnogbm93eSIsSURDX0NSRUFURU5FVywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfCAKICAgICAgICAgICAgICAgICAgICBXU19HUk9VUCw3LDIwLDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIlV0d/NyeiBrb250cm9sa+oiLElEQ19DUkVBVEVDT05UUk9MLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiB8IE5PVCBXU19WSVNJQkxFLDcsNTQsNzIsMTAKICAgIENPTlRST0wgICAgICAgICAiVXR383J6IHogcGxpa3UiLElEQ19DUkVBVEVGUk9NRklMRSwiQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04sNywzNyw2NywxMAogICAgTFRFWFQgICAgICAgICAgICIiLElEQ19SRVNVTFRERVNDLDQ5LDExMiwxNTksMjMKICAgIFBVU0hCVVRUT04gICAgICAiJkRvZGFqIGtvbnRyb2xr6i4uLiIsSURDX0FERENPTlRST0wsODEsODgsNjMsMTQsTk9UIFdTX1ZJU0lCTEUKICAgIENPTlRST0wgICAgICAgICAiV3mcd2lldGxhaiBqYWtvIGlrb27qIixJRENfQVNJQ09OLCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8IAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AgfCBOT1QgV1NfVklTSUJMRSwyMjMsNTgsODQsMTAKICAgIFBVU0hCVVRUT04gICAgICAiUHJ6ZWdsuWRhai4uLiIsSURDX0JST1dTRSw4Myw1Myw1MCwxNCxOT1QgV1NfVklTSUJMRQogICAgTFRFWFQgICAgICAgICAgICJQbGlrOiIsSURDX0ZJTEVMQkwsODMsMjcsMjAsOCwgTk9UIFdTX1ZJU0lCTEUKICAgIEVESVRURVhUICAgICAgICBJRENfRklMRSw4MywzNywxMzIsMTMsRVNfQVVUT0hTQ1JPTEwgfCBOT1QgV1NfVklTSUJMRQpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICBJRFNfUkVTVUxUT0JKREVTQwkiV3N0YXcgbm93eSBvYmlla3QgJXMgZG8gZG9rdW1lbnR1IgogIElEU19SRVNVTFRGSUxFT0JKREVTQwkiV3N0YXcgemF3YXJ0b5zmIHBsaWt1IGpha28gb2JpZWt0IGRvIGRva3VtZW50dS4gQupkemllIG1vv25hIGdvIGFrdHl3b3dh5iB1v3l3YWq5YyBwcm9ncmFtdSwga3TzcnkgZ28gc3R3b3J6ebMuIgogIElEU19CUk9XU0UgICAgICAgICAgICAiUHJ6ZWdsuWRhaiIKICBJRFNfTk9UT0xFTU9EICAgICAgICAgIlBsaWsgbmllIHd5ZGFqZSBzaeogYnnmIHBvcHJhd255bSBtb2R1s2VtIE9MRS4gTmllIHVkYbNvIHNp6iB6YXJlamVzdHJvd2HmIGtvbnRyb2xraSBPTEUuIgogIElEU19OT1RPTEVNT0RDQVBUSU9OICAiRG9kYWoga29udHJvbGvqIgp9CgpJRERfUEFTVEVTUEVDSUFMNCBESUFMT0cgRElTQ0FSREFCTEUgMywgMTUsIDMwOSwgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJXa2xlaiBzcGVjamFsbmllIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMVEVYVCAgICAgICAgICKPcvNks286IiwgLTEsIDYsIDksIDMwLCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIENPTlRST0wgICAgICAgIiZXa2xlaiIsIElEQ19QU19QQVNURSwgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDM4LCA1NSwgMTAKICAgIENPTlRST0wgICAgICAgIldrbGVqICazuWN6ZSIsIElEQ19QU19QQVNURUxJTkssICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCA2MywgNTUsIDEwCiAgICBMVEVYVCAgICAgICAgICImSmFrbzoiLCAtMSwgNjUsIDI1LCAxNiwgOCwgV1NfVklTSUJMRSB8IFdTX0dST1VQCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19QQVNURUxJU1QsICAgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgTk9UIFdTX1ZJU0lCTEUKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElOS0xJU1QsIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfRElTUExBWUxJU1QsICAgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUKICAgIENPTlRST0wgICAgICAgIk9LIiwgSURPSywgIkJ1dHRvbiIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCAyMzIsIDYsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiQW51bHVqIiwgSURDQU5DRUwsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIzMiwgMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiJlBvbW9jIiwgSURDX09MRVVJSEVMUCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjMyLCA0MiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJXJnmcd2lldGxhaiBqYWtvIGlrb27qIiwgSURDX1BTX0RJU1BMQVlBU0lDT04sICJCdXR0b24iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCA1OSwgODQsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfSUNPTkRJU1BMQVksICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgMjMyLCA3NSwgNjYsIDQ0CiAgICBDT05UUk9MICAgICAgICJabWll8SAmaWtvbuouLi4iLCBJRENfUFNfQ0hBTkdFSUNPTiwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjMyLCAxMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1JFU1VMVElNQUdFLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDgsIDEwMSwgNDIsIDM0CiAgICBDT05UUk9MICAgICAgICI8PCByZXN1bHQgdGV4dCBnb2VzIGhlcmUgPj4iLCBJRENfUFNfUkVTVUxUVEVYVCwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgNTQsIDEwMCwgMTU5LCAzNQogICAgQ09OVFJPTCAgICAgICAiV3luaWsiLCAtMSwgIkJ1dHRvbiIsIEJTX0dST1VQQk9YIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCA2LCA5MCwgMjEyLCA0OAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1NPVVJDRVRFWFQsICJFZGl0IiwgRVNfUkVBRE9OTFkgfCBFU19BVVRPSFNDUk9MTCB8IFdTX1ZJU0lCTEUsIDM3LCA5LCAxODAsIDgKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfUFNfUEFTVEVfREFUQSAgICAgICAgICAgICAgICAgICAgICJXc3Rhd2lhIHphd2FydG+c5iBzY2hvd2thIGRvIGRva3VtZW50dSBqYWtvICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1LCB0YWsgYWJ5IG3zZ7MgYnnmIGFrdHl3b3dhbnkgemEgcG9tb2O5ICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1RfQVNfSUNPTiAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1LCB0YWsgYWJ5IG3zZ7MgYnnmIGFrdHl3b3dhbnkgemEgcG9tb2O5ICVzLiBC6mR6aWUgd3mcd2lldGxhbnkgamFrbyBpa29uYS4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19EQVRBICAgICAgICAgICAgICAgICJXc3Rhd2lhIHphd2FydG+c5iBzY2hvd2thIGRvIGRva3VtZW50dSBqYWtvICVzLiBEYW5lIGLqZLkgcG+zuWN6b25lIHogcGxpa2llbSCfcvNks293eW0sIGR6aepraSBjemVtdSB6bWlhbnkgdyBwbGlrdSBi6mS5IG9kendpZXJjaWVkbG9uZSB3IGRva3VtZW5jaWUuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUICAgICAgICAgICAgICAiV3N0YXdpYSB6YXdhcnRvnOYgc2Nob3drYSBkbyBkb2t1bWVudHUgamFrbyBvYnJhei4gT2JyYXogYupkemllIHBvs7ljem9ueSB6IHBsaWtpZW0gn3LzZLNvd3ltLCBkemnqa2kgY3plbXUgem1pYW55IHcgcGxpa3UgYupkuSBvZHp3aWVyY2llZGxvbmUgdyBkb2t1bWVuY2llLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVF9BU19JQ09OICAgICAgIldzdGF3aWEgZG8gZG9jdW1lbnR1IHNrcvN0IGRvIHphd2FydG+cY2kgc2Nob3drYS4gU2ty83QgYupkemllIHBvs7ljem9ueSB6IHBsaWtpZW0gn3LzZLNvd3ltLCBkemnqa2kgY3plbXUgem1pYW55IHcgcGxpa3UgYupkuSBvZHp3aWVyY2llZGxvbmUgdyBkb2t1bWVuY2llLiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1IgogICAgSURTX1BTX1VOS05PV05fVFlQRSAgICAgICAgICAgICAgICAgICAiTmllem5hbnkgdHlwIgogICAgSURTX1BTX1VOS05PV05fU1JDICAgICAgICAgICAgICAgICAgICAiTmllem5hbmUgn3LzZLNvIgogICAgSURTX1BTX1VOS05PV05fQVBQICAgICAgICAgICAgICAgICAgICAicHJvZ3JhbSwga3TzcnkgZ28gc3R3b3J6ebMiCn0K