LyoKICogQ29weXJpZ2h0IDIwMDcgRGFuaWVsIE55bGFuZGVyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZS5oIgoKTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX05FVVRSQUwKClVJSU5TRVJUT0JKRUNUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjk0LCAxNTEKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiSW5mb2dhIG9iamVrdCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTElTVEJPWCAgICAgICAgIElEQ19PQkpUWVBFTElTVCw4MiwxOSwxMzEsNjYsTEJTX1NPUlQgfAogICAgICAgICAgICAgICAgICAgIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEwgfAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AKICAgIExURVhUICAgICAgICAgICAiT2JqZWt0dHlwOiIsSURDX09CSlRZUEVMQkwsODIsNyw1Myw4LFdTX1ZJU0lCTEUKICAgIERFRlBVU0hCVVRUT04gICAiT0siLElET0ssMjIxLDcsNjYsMTQKICAgIFBVU0hCVVRUT04gICAgICAiQXZicnl0IixJRENBTkNFTCwyMjEsMjQsNjYsMTQKICAgIEdST1VQQk9YICAgICAgICAiUmVzdWx0YXQiLElEQ19SRVNVTFQsNywxMDMsMjA4LDQxCiAgICBDT05UUk9MICAgICAgICAgIlNrYXBhIG55IixJRENfQ1JFQVRFTkVXLCJCdXR0b24iLEJTX0FVVE9SQURJT0JVVFRPTiB8CiAgICAgICAgICAgICAgICAgICAgV1NfR1JPVVAsNywyMCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJDcmVhdGUgQ29udHJvbCIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJTa2FwYSBmcuVuIGZpbCIsSURDX0NSRUFURUZST01GSUxFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiw3LDM3LDY3LDEwCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1JFU1VMVERFU0MsNDksMTEyLDE1OSwyMwogICAgUFVTSEJVVFRPTiAgICAgICImQWRkIENvbnRyb2wuLi4iLElEQ19BRERDT05UUk9MLDgxLDg4LDYzLDE0LE5PVCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICAgIlZpc2Egc29tIGlrb24iLElEQ19BU0lDT04sIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YIHwKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QIHwgTk9UIFdTX1ZJU0lCTEUsMjIzLDU4LDY0LDEwCiAgICBQVVNIQlVUVE9OICAgICAgIkJs5GRkcmEuLi4iLElEQ19CUk9XU0UsODMsNTMsNTAsMTQsTk9UIFdTX1ZJU0lCTEUKICAgIExURVhUICAgICAgICAgICAiRmlsOiIsSURDX0ZJTEVMQkwsODMsMjcsMjAsOCwgTk9UIFdTX1ZJU0lCTEUKICAgIEVESVRURVhUICAgICAgICBJRENfRklMRSw4MywzNywxMzIsMTMsRVNfQVVUT0hTQ1JPTEwgfCBOT1QgV1NfVklTSUJMRQpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICBJRFNfUkVTVUxUT0JKREVTQwkiSW5mb2dhIGV0dCBueXR0ICVzLW9iamVrdCBpIGRpdHQgZG9rdW1lbnQiCiAgSURTX1JFU1VMVEZJTEVPQkpERVNDCSJJbnNlcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFzIGFuIG9iamVjdCBpbnRvIHlvdXIgZG9jdW1lbnQgc28gdGhhdCB5b3UgbWF5IGFjdGl2YXRlIGl0IHVzaW5nIHRoZSBwcm9ncmFtIHdoaWNoIGNyZWF0ZWQgaXQuIgogIElEU19CUk9XU0UgICAgICAgICAgICAiQmzkZGRyYSIKICBJRFNfTk9UT0xFTU9EICAgICAgICAgIkZpbGUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgT0xFIG1vZHVsZS4gVW5hYmxlIHRvIHJlZ2lzdGVyIE9MRSBjb250cm9sLiIKICBJRFNfTk9UT0xFTU9EQ0FQVElPTiAgIkFkZCBDb250cm9sIgp9CgpJRERfUEFTVEVTUEVDSUFMNCBESUFMT0cgRElTQ0FSREFCTEUgMywgMTUsIDI5MywgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJQYXN0ZSBTcGVjaWFsIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMVEVYVCAgICAgICAgICJL5GxsYToiLCAtMSwgNiwgOSwgMzAsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgQ09OVFJPTCAgICAgICAiS2xpc3RyYSAmaW4iLCBJRENfUFNfUEFTVEUsICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCAzOCwgNTUsIDEwCiAgICBDT05UUk9MICAgICAgICJLbGlzdHJhIGluICZs5G5rIiwgSURDX1BTX1BBU1RFTElOSywgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDYzLCA1NSwgMTAKICAgIExURVhUICAgICAgICAgIiZTb206IiwgLTEsIDY1LCAyNSwgMTYsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSVNULCAgICAgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19QQVNURUxJTktMSVNULCA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgTk9UIFdTX1ZJU0lCTEUKICAgIExJU1RCT1ggICAgICAgSURDX1BTX0RJU1BMQVlMSVNULCAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICJPSyIsIElET0ssICJCdXR0b24iLCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwgMjI0LCA2LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIkF2YnJ5dCIsIElEQ0FOQ0VMLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDIzLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiZIauRscCIsIElEQ19PTEVVSUhFTFAsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNDIsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiJlZpc2Egc29tIGlrb24iLCBJRENfUFNfRElTUExBWUFTSUNPTiwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDU5LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19JQ09ORElTUExBWSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCAyMjQsIDc1LCA2NiwgNDQKICAgIENPTlRST0wgICAgICAgIkJ5dCAmaWtvbi4uLiIsIElEQ19QU19DSEFOR0VJQ09OLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDEyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfUkVTVUxUSU1BR0UsICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgOCwgMTAxLCA0MiwgMzQKICAgIENPTlRST0wgICAgICAgIjw8IHJlc3VsdCB0ZXh0IGdvZXMgaGVyZSA+PiIsIElEQ19QU19SRVNVTFRURVhULCAiU3RhdGljIiwgU1NfTk9QUkVGSVggfCBXU19WSVNJQkxFLCA1NCwgMTAwLCAxNTksIDM1CiAgICBDT05UUk9MICAgICAgICJSZXN1bHRhdCIsIC0xLCAiQnV0dG9uIiwgQlNfR1JPVVBCT1ggfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDYsIDkwLCAyMTIsIDQ4CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfU09VUkNFVEVYVCwgIkVkaXQiLCBFU19SRUFET05MWSB8IEVTX0FVVE9IU0NST0xMIHwgV1NfVklTSUJMRSwgMzcsIDksIDE4MCwgOApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19QU19QQVNURV9EQVRBICAgICAgICAgICAgICAgICAgICAgIkluc2VydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgaW50byB5b3VyIGRvY3VtZW50IGFzICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIkluc2VydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgaW50byB5b3VyIGRvY3VtZW50IHNvIHRoYXQgeW91IGNhbiBhY3RpdmF0ZSBpdCB1c2luZyAlcy4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUX0FTX0lDT04gICAgICAgICAgICJJbnNlcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIGludG8geW91ciBkb2N1bWVudCBzbyB0aGF0IHlvdSBjYW4gYWN0aXZhdGUgaXQgdXNpbmcgJXMuICBJdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBhbiBpY29uLiIKICAgIElEU19QU19QQVNURV9MSU5LX0RBVEEgICAgICAgICAgICAgICAgIkluc2VydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgaW50byB5b3VyIGRvY3VtZW50IGFzICVzLiAgVGhlIGRhdGEgaXMgbGlua2VkIHRvIHRoZSBzb3VyY2UgZmlsZSBzbyB0aGF0IGNoYW5nZXMgdG8gdGhlIGZpbGUgd2lsbCBiZSByZWZsZWN0ZWQgaW4geW91ciBkb2N1bWVudC4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19PQkpFQ1QgICAgICAgICAgICAgICJJbnNlcnRzIGEgcGljdHVyZSBvZiB0aGUgY2xpcGJvYXJkIGNvbnRlbnRzIGludG8geW91ciBkb2N1bWVudC4gIFRoZSBwaWN0dXJlIGlzIGxpbmtlZCB0byB0aGUgc291cmNlIGZpbGUgc28gdGhhdCBjaGFuZ2VzIHRvIHRoZSBmaWxlIHdpbGwgYmUgcmVmbGVjdGVkIGluIHlvdXIgZG9jdW1lbnQuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUX0FTX0lDT04gICAgICAiSW5zZXJ0cyBhIHNob3J0Y3V0IHdoaWNoIHBvaW50cyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGNsaXBib2FyZCBjb250ZW50cy4gIFRoZSBzaG9ydGN1dCBpcyBsaW5rZWQgdG8gdGhlIHNvdXJjZSBmaWxlIHNvIHRoYXQgY2hhbmdlcyB0byB0aGUgZmlsZSB3aWxsIGJlIHJlZmxlY3RlZCBpbiB5b3VyIGRvY3VtZW50LiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIkluc2VydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgaW50byB5b3VyIGRvY3VtZW50LiIKICAgIElEU19QU19VTktOT1dOX1RZUEUgICAgICAgICAgICAgICAgICAgIlVua25vd24gVHlwZSIKICAgIElEU19QU19VTktOT1dOX1NSQyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gU291cmNlIgogICAgSURTX1BTX1VOS05PV05fQVBQICAgICAgICAgICAgICAgICAgICAidGhlIHByb2dyYW0gd2hpY2ggY3JlYXRlZCBpdCIKfQo=