LyoKICogWENPUFkgLSBXaW5lLWNvbXBhdGlibGUgeGNvcHkgcHJvZ3JhbQogKiBSdXNzaWFuIGxhbmd1YWdlIHN1cHBvcnQKICoKICogQ29weXJpZ2h0IChDKSAyMDA3IEouIEVkbWVhZGVzCiAqIENvcHlyaWdodCAoQykgMjAwNyBLaXJpbGwgSy4gU21pcm5vdgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAieGNvcHkuaCIKCkxBTkdVQUdFIExBTkdfUlVTU0lBTiwgU1VCTEFOR19ERUZBVUxUCgpTVFJJTkdUQUJMRQp7CiAgICBTVFJJTkdfSU5WUEFSTVMsCiLN5eTu7/Px8ujs7uUg9+jx6+4g7+Dw4Ozl8vDu4iAtIO/u7/Du4fPp8uUgJ3hjb3B5IC8/JyDk6/8g7+7r8/fl7ej/XG5cCu/u5PDu4e3u4+4g7u/o8eDt6P8uXG4iCiAgICBTVFJJTkdfSU5WUEFSTSwKIs3l5O7v8/Hy6Oz76SDv4PDg7OXy8CAnJXMnIC0g7+7v8O7h8+ny5SAneGNvcHkgLz8nIOTr/yDv7uvz9+Xt6P8g7+7k8O7h7e7j7lxuXAru7+jx4O3o/y5cbiIKICAgIFNUUklOR19QQVVTRSwgICAgIs3g5uzo8uUg6uvg4uj48yA8ZW50ZXI+LCD38u7h+yDt4Pfg8vwg6u7v6PDu4uDt6OUuXG4iCiAgICBTVFJJTkdfU0lNQ09QWSwgICIlZCD04OnrKO7iKSDh++vuIOH7IPHq7u/o8O7i4O3uLlxuIgogICAgU1RSSU5HX0NPUFksICAgICAiJWQg9ODp6yju4ikg8eru7+jw7uLg7e4uXG4iCiAgICBTVFJJTkdfUUlTRElSLCAgICInJXMnIP/i6//l8vH/IPTg6evu7CDo6+gg7+Dv6u7pP1xuIiBcCiAgICAgICAgICAgICAgICAgICAgICIoRiAtINTg6essIEQgLSDP4O/q4ClcbiIKICAgIFNUUklOR19TUkNQUk9NUFQsIiVzPyAoWWVzfE5vKVxuIgogICAgU1RSSU5HX09WRVJXUklURSwiz+Xw5e/o8eDy/CAlcz8gKFllc3xOb3xBbGwpXG4iCiAgICBTVFJJTkdfQ09QWUZBSUwsICLP8Ogg6u7v6PDu4uDt6OggJyVzJyDiICclcycg7/Du6Ofu+OvgIO746OHq4DogJWRcbiIKICAgIFNUUklOR19PUEVORkFJTCwgIs3l4u7n7O7m7e4g7vLq8Pvy/CAnJXMnXG4iCiAgICBTVFJJTkdfUkVBREZBSUwsICLP8Ogg9/Ll7ejoICclcycg7/Du6Ofu+OvgIO746OHq4FxuIgogICAgU1RSSU5HX1lFU19DSEFSLCAiWSIKICAgIFNUUklOR19OT19DSEFSLCAgIk4iCiAgICBTVFJJTkdfQUxMX0NIQVIsICJBIgogICAgU1RSSU5HX0ZJTEVfQ0hBUiwiRiIKICAgIFNUUklOR19ESVJfQ0hBUiwgIkQiCgogICAgU1RSSU5HX0hFTFAsCiJYQ09QWSAtIMru7+jw8+XyIPTg6ev7IOgg5OXw5eL8/yDv4O/u6lxuXApcblwK0ejt8uDq8ejxOlxuXApYQ09QWSBzb3VyY2UgW2Rlc3RdIFsvSV0gWy9TXSBbL1FdIFsvRl0gWy9MXSBbL1ddIFsvVF0gWy9OXSBbL1VdXG5cClx0ICAgICBbL1JdIFsvSF0gWy9DXSBbL1BdIFsvQV0gWy9NXSBbL0VdIFsvRF0gWy9ZXSBbLy1ZXVxuXApcblwKw+TlOlxuXApcblwKWy9JXSAgxfHr6CDq7u3l9+3g/yDv4O/q4CDu8vHz8vHy4vPl8iDoIOru7+jw8+Xy8f8g4e7r5eUg7uTt7uPuIPTg6evgLFxuXAogICAgICDy7iDv8OXk7+7r4OPg5fLx/yDv4O/q4CDiIOrg9+Xx8uLlIOzl8fLgIO3g5+3g9+Xt6P8uXG5cClsvU10gIMru7+jw8+XyIO/g7+roIOgg7+7k7+Dv6uguXG5cClsvRV0gIMru7+jw8+XyIO/g7+roIOgg7+7k7+Dv6ugsIOLq6/734P8g7/Px8vvlLlxuXApbL1FdICDN5SDu8u7h8ODm4OXyIOjs5e3gIOru7+jw8+Xs+/Ug9ODp6+7iLlxuXApbL0ZdICDO8u7h8ODm4OXyIO/u6+375SDo7OXt4CDo8fXu5O379SDoIOru7eX37fv1IPTg6evu4i5cblwKWy9MXSAgwvvi7uTo8iDx7+jx7uog9ODp6+7iLCDq7vLu8PvlIOHz5PPyIPHq7u/o8O7i4O37LlxuXApbL1ddICDH4O/w4Pjo4uDl8iDv7uTy4uXw5uTl7ejlIO/l8OXkIO3g9+Dr7uwg6u7v6PDu4uDt6P8uXG5cClsvVF0gINHu5+Tg5fIg8fLw8+ry8/DzIO/g7+7qLCDt7iDt5SDq7u/o8PPl8iD04Onr+y5cblwKWy9ZXSAgz+7k4OLr/+XyIOfg7/Du8SDt4CDv7uTy4uXw5uTl7ejlIO/l8OXn4O/o8egg9ODp6+7iLlxuXApbLy1ZXSDH4O/w4Pjo4uDl8iDv7uTy4uXw5uTl7ejlIO3gIO/l8OXn4O/o8fwg9ODp6+7iLlxuXApbL1BdICDH4O/w4Pjo4uDl8iDv7uTy4uXw5uTl7ejlIOTr/yDq4Obk7uPuIOru7+jw8+Xs7uPuIPTg6evgLlxuXApbL05dICDI8e/u6/zn8+XyIOru8O7y6ujlIOjs5e3gIPTg6evu4iDv8Ogg6u7v6PDu4uDt6OguXG5cClsvVV0gIMru7+jw8+XyIPLu6/zq7iDy5SD04Onr+ywg6u7y7vD75SDz5uUg8fP55fHy4vP+8iDiIOru7eX37e7pIO/g7+rlLlxuXApbL1JdICDP5fDl5+Dv6PH74uDl8iD04Onr+ywg5O7x8vPv7fvlIPLu6/zq7iDk6/8g9/Ll7ej/LlxuXApbL0hdICDK7u/o8PPl8iDx6vD78vvlIOgg8ejx8uXs7fvlIPTg6ev7LlxuXApbL0NdICDP8O7k7uvm4OXyIPDg4e7y8ywg5ODm5SDl8evoIO/w7ujn7vjr4CDu+Ojh6uAuXG5cClsvQV0gIMru7+jw8+XyIPLu6/zq7iDy5SD04Onr+ywg5Ov/IOru8u7w+/Ug8/Hy4O3u4uvl7SDg8vDo4fPyIFwi4PD16OLt++lcIi5cblwKWy9NXSAgyu7v6PDz5fIg8u7r/OruIPLlIPTg6ev7LCDk6/8g6u7y7vD79SDz8fLg7e7i6+XtIODy8Ojh8/IgXCLg8PXo4u376VwiLFxuXAogICAgICDv8Ogg/fLu7CDg8vDo4fPyIPPk4Ov/5fLx/y5cblwKWy9EIHwgL0Q6bS1kLXldIMru7+jw8+XyIPLu6/zq7iDt7uL75SD04Onr+yDo6+gg8uUsIOru8u7w++Ug4fvr6CDo5+zl7eXt+1xuXAogICAgICAgICAgICAgICAg7+7x6+Ug8+rg5+Dt7e7pIOTg8vsuIMXx6+gg5ODy4CDt5SDz6uDn4O3gLCDq7u/o8PPl8iDy7uv86u5cblwKICAgICAgICAgICAgICAgIPLlIPTg6ev7LCDq7vLu8PvlIO3u4uXlIOIg6PH17uTt7ukg7+Dv6uUuXG4iCn0K