LyoKICogQ29weXJpZ2h0IDIwMDcgRGFuaWVsIE55bGFuZGVyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJ3aW5lY29uc29sZV9yZXMuaCIKCkxBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMCgpTVFJJTkdUQUJMRQpCRUdJTgpJRFNfRURJVCwJCSJSJmVkaWdlcmEiCklEU19ERUZBVUxULAkJIlN05GxsIGluIHMmdGFuZGFyZHbkcmRlbiIKSURTX1BST1BFUlRJRVMsCQkiRSZnZW5za2FwZXIiCklEU19NQVJLLAkJIiZNYXJrZXJhIgpJRFNfQ09QWSwJCSImS29waWVyYSIKSURTX1BBU1RFLAkJIktsaXN0cmEgJmluIgpJRFNfU0VMRUNUQUxMLAkJIiZNYXJrZXJhIGFsbHQiCklEU19TQ1JPTEwsCQkiUiZ1bGxhIgpJRFNfU0VBUkNILAkJIlMm9msiCklEU19GTlRfRElTUExBWSwJIlZhcmplIGJva3N0YXYg5HIgJWxkIGJpbGRwdW5rdGVyIGJyZWQgb2NoICVsZCBiaWxkcHVua3RlciBo9mciCklEU19GTlRfUFJFVklFVywJIkRldCBo5HIg5HIgZXR0IHRlc3QiCklEU19ETEdfVElUX0RFRkFVTFQsICAgICJTZXR1cCAtIFN0YW5kYXJkaW5zdORsbG5pbmdhciIKSURTX0RMR19USVRfQ1VSUkVOVCwgICAgIlNldHVwIC0gQWt0dWVsbGEgaW5zdORsbG5pbmdhciIKSURTX0RMR19USVRfRVJST1IsCSJLb25maWd1cmF0aW9uc2ZlbCIKSURTX0RMR19FUlJfU0JXSU5TSVpFLAkiU2NyZWVuIGJ1ZmZlciBzaXplIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgd2luZG93J3Mgb25lIgoKSURTX0NNRF9JTlZBTElEX0VWRU5UX0lEICAgIndpbmVjb25zb2xlOiBDb3VsZG4ndCBwYXJzZSBldmVudCBpZFxuIgpJRFNfQ01EX0lOVkFMSURfQkFDS0VORCAgICAid2luZWNvbnNvbGU6IEludmFsaWQgYmFja2VuZFxuIgpJRFNfQ01EX0lOVkFMSURfT1BUSU9OICAgICAid2luZWNvbnNvbGU6IFVucmVjb2duaXplZCBjb21tYW5kIGxpbmUgb3B0aW9uXG4iCklEU19DTURfQUJPVVQgICAgICAgICAgICAgICJTdGFydGFyIGV0dCBwcm9ncmFtIGkgZW4gV2luZS1rb25zb2xsXG4iCklEU19DTURfTEFVTkNIX0ZBSUxFRCAgICAgICJ3aW5lY29uc29sZTogU3RhcnQgYXYgcHJvZ3JhbW1ldCAlcyBtaXNzbHlja2FkZXMuXG4iXAogICAgICAgICAgICAgICAgICAgICAgICAgICAiS29tbWFuZG90IORyIG9naWx0aWd0LlxuIgoKSURTX1VTQUdFX0hFQURFUiAgICAgICAgICAgIlxuQW525G5kbmluZzpcbiAgd2luZWNvbnNvbGUgW2ZsYWdnb3JdIDxrb21tYW5kbz5cblxuRmxhZ2dvcjpcbiIKSURTX1VTQUdFX0JBQ0tFTkQgICAgICAgICAgIiAgLS1iYWNrZW5kPXt1c2VyfGN1cnNlc30gIFbkbGogdXNlciBm9nIgYXR0IHN0YXJ0YSBldHQgbnl0dCBm9m5zdGVyLFxuIlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzZXMgZvZyIGF0dCBhbmdlIGFrdHVlbGwgdGVybWluYWwgc29tIGVuIFdpbmUta29uc29sbFxuIgpJRFNfVVNBR0VfQ09NTUFORCAgICAgICAgICAiICA8a29tbWFuZG8+ICAgICAgICAgICAgICAgIFdpbmUtcHJvZ3JhbSBhdHQgc3RhcnRhIGkga29uc29sbGVuXG4iCklEU19VU0FHRV9GT09URVIgICAgICAgICAgICJcbkV4ZW1wZWw6XG4gIHdpbmVjb25zb2xlIGNtZFxuU3RhcnRhciBXaW5lcyBrb21tYW5kb3Byb21wdCBpIGVuIFdpbmUta29uc29sbFxuXG4iCgpFTkQKCklERF9PUFRJT04gRElBTE9HIDM2LCAyNCwgMTQwLCAxMDUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiIEFsdGVybmF0aXYgIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUdST1VQQk9YICJDdXJzb3Igc2l6ZSIsIC0xLCAxMCwgMTEsIDYwLCA0NCwgQlNfR1JPVVBCT1gKCUFVVE9SQURJT0JVVFRPTiAiJkxpdGVuIiwgSURDX09QVF9DVVJTT1JfU01BTEwsIDE0LCAyMywgNDQsIDEwLCBXU19UQUJTVE9QCglBVVRPUkFESU9CVVRUT04gIiZNZWRlbCIsIElEQ19PUFRfQ1VSU09SX01FRElVTSwgMTQsIDMzLCA0NCwgMTAsIFdTX1RBQlNUT1AKCUFVVE9SQURJT0JVVFRPTiAiJlN0b3IiLCBJRENfT1BUX0NVUlNPUl9MQVJHRSwgMTQsIDQzLCA0NCwgMTAsIFdTX1RBQlNUT1AKCglHUk9VUEJPWCAiQ29udHJvbCIsIC0xLCA3NSwgMTEsIDEyNSwgNDQsIEJTX0dST1VQQk9YCglMVEVYVCAiUG9wdXAgbWVudSIsIC0xLCA3OSwgMjMsIDQwLCAxMAoJQVVUT0NIRUNLQk9YICImQ29udHJvbCIsIElEQ19PUFRfQ09ORl9DVFJMLCAxMjksIDIzLCA2MCwgMTAsIFdTX1RBQlNUT1AKCUFVVE9DSEVDS0JPWCAiUyZoaWZ0IiwgSURDX09QVF9DT05GX1NISUZULCAxMjksIDMzLCA2MCwgMTAsIFdTX1RBQlNUT1AKCUxURVhUICJRdWljayBlZGl0IiwgLTEsIDc5LCA0MywgNTAsIDEwCglBVVRPQ0hFQ0tCT1ggIiZlbmFibGUiLCBJRENfT1BUX1FVSUNLX0VESVQsIDEyOSwgNDMsIDYwLCAxMCwgV1NfVEFCU1RPUAoKCUdST1VQQk9YICJLb21tYW5kb2hpc3RvcmlrIiwgLTEsIDEwLCA1NywgMTkwLCAzNSwgQlNfR1JPVVBCT1gKCUxURVhUICImTnVtYmVyIG9mIHJlY2FsbGVkIGNvbW1hbmRzIDoiLCAtMSwgMTQsIDY3LCA3OCwgMTgKCUVESVRURVhUIElEQ19PUFRfSElTVF9TSVpFLCA5MiwgNjksIDMxLCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCglDT05UUk9MICIiLCBJRENfT1BUX0hJU1RfU0laRV9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCglBVVRPQ0hFQ0tCT1ggIiZSZW1vdmUgZG91YmxlcyIsIElEQ19PUFRfSElTVF9OT0RPVUJMRSwgMTMwLCA2NywgNTAsIDE4LCBXU19UQUJTVE9QfEJTX01VTFRJTElORQp9CgpJRERfRk9OVCBESUFMT0cgMzYsIDI0LCAxNDAsIDEwNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIgVHlwc25pdHQgIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUxURVhUICImVHlwc25pdHQiLCAtMSwgNSwgNSwgMjQsIDgKCUxJU1RCT1ggSURDX0ZOVF9MSVNUX0ZPTlQsIDUsIDE4LCA5MCwgNDIsIExCU19TT1JUfFdTX1ZTQ1JPTEwKCUxURVhUICImRuRyZyIsIC0xLCAxMDAsIDUsIDUwLCA4CglDT05UUk9MICIiLCBJRENfRk5UX0NPTE9SX0ZHLCAiV2luZUNvbkNvbG9yUHJldmlldyIsIDBMLCAxMDAsIDE4LCA0OCwgMTYKCUNPTlRST0wgIiIsIElEQ19GTlRfQ09MT1JfQkssICJXaW5lQ29uQ29sb3JQcmV2aWV3IiwgMEwsIDEwMCwgNDAsIDQ4LCAxNgoJTFRFWFQgIiZTdG9ybGVrIiwgLTEsIDE1OCwgNSwgNDAsIDgKCUxJU1RCT1ggSURDX0ZOVF9MSVNUX1NJWkUsIDE1OCwgMTgsIDQwLCA2MCwgV1NfVlNDUk9MTAoJQ09OVFJPTCAiIiwgSURDX0ZOVF9QUkVWSUVXLCAiV2luZUNvbkZvbnRQcmV2aWV3IiwgMEwsIDUsIDYwLCAxMDksIDQwCglMVEVYVCAiIiwgSURDX0ZOVF9GT05UX0lORk8sIDEyOCwgNzYsIDgwLCAxOAp9CgpJRERfQ09ORklHIERJQUxPRyAzNiwgMjQsIDE0MCwgMTA1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiBLb25maWd1cmF0aW9uICIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglHUk9VUEJPWCAiQnVmZmVyIHpvbmUiLCAtMSwgMTAsIDExLCAxMDAsIDQyLCBCU19HUk9VUEJPWAoJTFRFWFQgIiZCcmVkZCA6IiwgLTEsIDE0LCAyNSwgNTQsIDkKCUVESVRURVhUIElEQ19DTkZfU0JfV0lEVEgsIDY4LCAyMywgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKCUNPTlRST0wgIiIsIElEQ19DTkZfU0JfV0lEVEhfVUQsICJtc2N0bHNfdXBkb3duMzIiLCBVRFNfU0VUQlVERFlJTlR8VURTX0FMSUdOUklHSFR8VURTX0FVVE9CVUREWXxVRFNfQVJST1dLRVlTfFVEU19OT1RIT1VTQU5EUywgMCwgMCwgMCwgMAoJTFRFWFQgIiZI9mpkIDoiLCAtMSwgMTQsIDM5LCA1NCwgOQoJRURJVFRFWFQgSURDX0NORl9TQl9IRUlHSFQsIDY4LCAzNywgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKCUNPTlRST0wgIiIsIElEQ19DTkZfU0JfSEVJR0hUX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKCglHUk9VUEJPWCAiRvZuc3RlcnN0b3JsZWsiLCAtMSwgMTAsIDU1LCAxMDAsIDQyCglMVEVYVCAiQiZyZWRkIDoiLCAtMSwgMTQsIDY5LCA1NCwgOQoJRURJVFRFWFQgSURDX0NORl9XSU5fV0lEVEgsIDY4LCA2NywgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKCUNPTlRST0wgIiIsIElEQ19DTkZfV0lOX1dJRFRIX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKCUxURVhUICJIJvZqZCA6IiwgLTEsIDE0LCA4MywgNTQsIDkKCUVESVRURVhUIElEQ19DTkZfV0lOX0hFSUdIVCwgNjgsIDgxLCAzNiwgMTIsIFdTX1RBQlNUT1B8V1NfQk9SREVSfEVTX05VTUJFUgoJQ09OVFJPTCAiIiwgSURDX0NORl9XSU5fSEVJR0hUX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKCglHUk9VUEJPWCAiRW5kIG9mIHByb2dyYW0iLCAtMSwgMTE1LCAxMSwgODAsIDQyLCBCU19HUk9VUEJPWAoJQVVUT0NIRUNLQk9YICImQ2xvc2UgY29uc29sZSIsIElEQ19DTkZfQ0xPU0VfRVhJVCwgMTE5LCAyNSwgNzIsIDIwLCBXU19UQUJTVE9QCgoJR1JPVVBCT1ggIkVkaXRpb24iLCAtMSwgMTE1LCA1NSwgODAsIDQyCglDT01CT0JPWCBJRENfQ05GX0VESVRJT05fTU9ERSwgMTE5LCA2OSwgNzIsIDIwLCBDQlNfRFJPUERPV05MSVNUfFdTX1ZTQ1JPTEx8V1NfVEFCU1RPUAp9CgpJRERfU0FWRV9TRVRUSU5HUyBESUFMT0cgMjAsIDIwLCAxNzAsIDYwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04KQ0FQVElPTiAiS29uc29sbHBhcmFtZXRyYXIiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJR1JPVVBCT1ggIiIsIC0xLCAxMCwgMTAsIDE1MCwgMzEsIEJTX0dST1VQQk9YCglBVVRPUkFESU9CVVRUT04gIlJldGFpbiB0aGVzZSBzZXR0aW5ncyBmb3IgbGF0ZXIgc2Vzc2lvbnMiLCBJRENfU0FWX1NBVkUsIDE0LCAxNSwgMTQwLCAxMCwgV1NfVEFCU1RPUAoJQVVUT1JBRElPQlVUVE9OICJNb2RpZnkgb25seSBjdXJyZW50IHNlc3Npb24iLCBJRENfU0FWX1NFU1NJT04sIDE0LCAyNywgMTQwLCAxMCwgV1NfVEFCU1RPUAoKCVBVU0hCVVRUT04gIk9LIiwgSURPSywgMzUsIDQ1LCAzNSwgMTIKCVBVU0hCVVRUT04gIkF2YnJ5dCIsIElEQ0FOQ0VMLCA4MCwgNDUsIDM1LCAxMgp9Cg==