LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKTGliZ2ZvcnRyYW4gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCnBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAphIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOwpzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KCiNpbmNsdWRlICJsaWJnZm9ydHJhbi5oIgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgoKI2lmIGRlZmluZWQgKEhBVkVfR0ZDX1JFQUxfNCkKCmV4dGVybiB2b2lkIHRyYW5zcG9zZV9yNCAoZ2ZjX2FycmF5X3I0ICogY29uc3QgcmVzdHJpY3QgcmV0LCAKCWdmY19hcnJheV9yNCAqIGNvbnN0IHJlc3RyaWN0IHNvdXJjZSk7CmV4cG9ydF9wcm90byh0cmFuc3Bvc2VfcjQpOwoKdm9pZAp0cmFuc3Bvc2VfcjQgKGdmY19hcnJheV9yNCAqIGNvbnN0IHJlc3RyaWN0IHJldCwgCglnZmNfYXJyYXlfcjQgKiBjb25zdCByZXN0cmljdCBzb3VyY2UpCnsKICAvKiByLiogaW5kaWNhdGVzIHRoZSByZXR1cm4gYXJyYXkuICAqLwogIGluZGV4X3R5cGUgcnhzdHJpZGUsIHJ5c3RyaWRlOwogIEdGQ19SRUFMXzQgKiByZXN0cmljdCBycHRyOwogIC8qIHMuKiBpbmRpY2F0ZXMgdGhlIHNvdXJjZSBhcnJheS4gICovCiAgaW5kZXhfdHlwZSBzeHN0cmlkZSwgc3lzdHJpZGU7CiAgY29uc3QgR0ZDX1JFQUxfNCAqc3B0cjsKCiAgaW5kZXhfdHlwZSB4Y291bnQsIHljb3VudDsKICBpbmRleF90eXBlIHgsIHk7CgogIGFzc2VydCAoR0ZDX0RFU0NSSVBUT1JfUkFOSyAoc291cmNlKSA9PSAyKTsKCiAgaWYgKHJldC0+YmFzZV9hZGRyID09IE5VTEwpCiAgICB7CiAgICAgIGFzc2VydCAoR0ZDX0RFU0NSSVBUT1JfUkFOSyAocmV0KSA9PSAyKTsKICAgICAgYXNzZXJ0IChyZXQtPmR0eXBlID09IHNvdXJjZS0+ZHR5cGUpOwoKICAgICAgR0ZDX0RJTUVOU0lPTl9TRVQocmV0LT5kaW1bMF0sIDAsIEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMSkgLSAxLAoJCQkxKTsKCiAgICAgIEdGQ19ESU1FTlNJT05fU0VUKHJldC0+ZGltWzFdLCAwLCBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDApIC0gMSwKCQkJR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwgMSkpOwoKICAgICAgcmV0LT5iYXNlX2FkZHIgPSB4bWFsbG9jYXJyYXkgKHNpemUwICgoYXJyYXlfdCAqKSByZXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoR0ZDX1JFQUxfNCkpOwogICAgICByZXQtPm9mZnNldCA9IDA7CiAgICB9IGVsc2UgaWYgKHVubGlrZWx5IChjb21waWxlX29wdGlvbnMuYm91bmRzX2NoZWNrKSkKICAgIHsKICAgICAgaW5kZXhfdHlwZSByZXRfZXh0ZW50LCBzcmNfZXh0ZW50OwoKICAgICAgcmV0X2V4dGVudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChyZXQsMCk7CiAgICAgIHNyY19leHRlbnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDEpOwoKICAgICAgaWYgKHNyY19leHRlbnQgIT0gcmV0X2V4dGVudCkKCXJ1bnRpbWVfZXJyb3IgKCJJbmNvcnJlY3QgZXh0ZW50IGluIHJldHVybiB2YWx1ZSBvZiBUUkFOU1BPU0UiCgkJICAgICAgICIgaW50cmluc2ljIGluIGRpbWVuc2lvbiAxOiBpcyAlbGQsIgoJCSAgICAgICAiIHNob3VsZCBiZSAlbGQiLCAobG9uZyBpbnQpIHNyY19leHRlbnQsCgkJICAgICAgIChsb25nIGludCkgcmV0X2V4dGVudCk7CgogICAgICByZXRfZXh0ZW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHJldCwxKTsKICAgICAgc3JjX2V4dGVudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMCk7CgogICAgICBpZiAoc3JjX2V4dGVudCAhPSByZXRfZXh0ZW50KQoJcnVudGltZV9lcnJvciAoIkluY29ycmVjdCBleHRlbnQgaW4gcmV0dXJuIHZhbHVlIG9mIFRSQU5TUE9TRSIKCQkgICAgICAgIiBpbnRyaW5zaWMgaW4gZGltZW5zaW9uIDI6IGlzICVsZCwiCgkJICAgICAgICIgc2hvdWxkIGJlICVsZCIsIChsb25nIGludCkgc3JjX2V4dGVudCwKCQkgICAgICAgKGxvbmcgaW50KSByZXRfZXh0ZW50KTsKCiAgICB9CgogIHN4c3RyaWRlID0gR0ZDX0RFU0NSSVBUT1JfU1RSSURFKHNvdXJjZSwwKTsKICBzeXN0cmlkZSA9IEdGQ19ERVNDUklQVE9SX1NUUklERShzb3VyY2UsMSk7CiAgeGNvdW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwwKTsKICB5Y291bnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDEpOwoKICByeHN0cmlkZSA9IEdGQ19ERVNDUklQVE9SX1NUUklERShyZXQsMCk7CiAgcnlzdHJpZGUgPSBHRkNfREVTQ1JJUFRPUl9TVFJJREUocmV0LDEpOwoKICBycHRyID0gcmV0LT5iYXNlX2FkZHI7CiAgc3B0ciA9IHNvdXJjZS0+YmFzZV9hZGRyOwoKICBmb3IgKHk9MDsgeSA8IHljb3VudDsgeSsrKQogICAgewogICAgICBmb3IgKHg9MDsgeCA8IHhjb3VudDsgeCsrKQogICAgICAgIHsKICAgICAgICAgICpycHRyID0gKnNwdHI7CgogICAgICAgICAgc3B0ciArPSBzeHN0cmlkZTsKICAgICAgICAgIHJwdHIgKz0gcnlzdHJpZGU7CiAgICAgICAgfQogICAgICAgIHNwdHIgKz0gc3lzdHJpZGUgLSAoc3hzdHJpZGUgKiB4Y291bnQpOwogICAgICAgIHJwdHIgKz0gcnhzdHJpZGUgLSAocnlzdHJpZGUgKiB4Y291bnQpOwogICAgfQp9CgojZW5kaWYK