LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIDk1IHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKTGliZ2ZvcnRyYW4gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCnBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAphIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOwpzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KCiNpbmNsdWRlICJsaWJnZm9ydHJhbi5oIgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgoKI2lmIGRlZmluZWQgKEhBVkVfR0ZDX0NPTVBMRVhfMTYpCgpleHRlcm4gdm9pZCB0cmFuc3Bvc2VfYzE2IChnZmNfYXJyYXlfYzE2ICogY29uc3QgcmVzdHJpY3QgcmV0LCAKCWdmY19hcnJheV9jMTYgKiBjb25zdCByZXN0cmljdCBzb3VyY2UpOwpleHBvcnRfcHJvdG8odHJhbnNwb3NlX2MxNik7Cgp2b2lkCnRyYW5zcG9zZV9jMTYgKGdmY19hcnJheV9jMTYgKiBjb25zdCByZXN0cmljdCByZXQsIAoJZ2ZjX2FycmF5X2MxNiAqIGNvbnN0IHJlc3RyaWN0IHNvdXJjZSkKewogIC8qIHIuKiBpbmRpY2F0ZXMgdGhlIHJldHVybiBhcnJheS4gICovCiAgaW5kZXhfdHlwZSByeHN0cmlkZSwgcnlzdHJpZGU7CiAgR0ZDX0NPTVBMRVhfMTYgKiByZXN0cmljdCBycHRyOwogIC8qIHMuKiBpbmRpY2F0ZXMgdGhlIHNvdXJjZSBhcnJheS4gICovCiAgaW5kZXhfdHlwZSBzeHN0cmlkZSwgc3lzdHJpZGU7CiAgY29uc3QgR0ZDX0NPTVBMRVhfMTYgKnNwdHI7CgogIGluZGV4X3R5cGUgeGNvdW50LCB5Y291bnQ7CiAgaW5kZXhfdHlwZSB4LCB5OwoKICBhc3NlcnQgKEdGQ19ERVNDUklQVE9SX1JBTksgKHNvdXJjZSkgPT0gMik7CgogIGlmIChyZXQtPmRhdGEgPT0gTlVMTCkKICAgIHsKICAgICAgYXNzZXJ0IChHRkNfREVTQ1JJUFRPUl9SQU5LIChyZXQpID09IDIpOwogICAgICBhc3NlcnQgKHJldC0+ZHR5cGUgPT0gc291cmNlLT5kdHlwZSk7CgogICAgICByZXQtPmRpbVswXS5sYm91bmQgPSAwOwogICAgICByZXQtPmRpbVswXS51Ym91bmQgPSBzb3VyY2UtPmRpbVsxXS51Ym91bmQgLSBzb3VyY2UtPmRpbVsxXS5sYm91bmQ7CiAgICAgIHJldC0+ZGltWzBdLnN0cmlkZSA9IDE7CgogICAgICByZXQtPmRpbVsxXS5sYm91bmQgPSAwOwogICAgICByZXQtPmRpbVsxXS51Ym91bmQgPSBzb3VyY2UtPmRpbVswXS51Ym91bmQgLSBzb3VyY2UtPmRpbVswXS5sYm91bmQ7CiAgICAgIHJldC0+ZGltWzFdLnN0cmlkZSA9IHJldC0+ZGltWzBdLnVib3VuZCsxOwoKICAgICAgcmV0LT5kYXRhID0gaW50ZXJuYWxfbWFsbG9jX3NpemUgKHNpemVvZiAoR0ZDX0NPTVBMRVhfMTYpICogc2l6ZTAgKChhcnJheV90ICopIHJldCkpOwogICAgICByZXQtPm9mZnNldCA9IDA7CiAgICB9IGVsc2UgaWYgKHVubGlrZWx5IChjb21waWxlX29wdGlvbnMuYm91bmRzX2NoZWNrKSkKICAgIHsKICAgICAgaW5kZXhfdHlwZSByZXRfZXh0ZW50LCBzcmNfZXh0ZW50OwoKICAgICAgcmV0X2V4dGVudCA9IHJldC0+ZGltWzBdLnVib3VuZCArIDEgLSByZXQtPmRpbVswXS5sYm91bmQ7CiAgICAgIHNyY19leHRlbnQgPSBzb3VyY2UtPmRpbVsxXS51Ym91bmQgKyAxIC0gc291cmNlLT5kaW1bMV0ubGJvdW5kOwoKICAgICAgaWYgKHNyY19leHRlbnQgIT0gcmV0X2V4dGVudCkKCXJ1bnRpbWVfZXJyb3IgKCJJbmNvcnJlY3QgZXh0ZW50IGluIHJldHVybiB2YWx1ZSBvZiBUUkFOU1BPU0UiCgkJICAgICAgICIgaW50cmluc2ljIGluIGRpbWVuc2lvbiAxOiBpcyAlbGQsIgoJCSAgICAgICAiIHNob3VsZCBiZSAlbGQiLCAobG9uZyBpbnQpIHNyY19leHRlbnQsCgkJICAgICAgIChsb25nIGludCkgcmV0X2V4dGVudCk7CgogICAgICByZXRfZXh0ZW50ID0gcmV0LT5kaW1bMV0udWJvdW5kICsgMSAtIHJldC0+ZGltWzFdLmxib3VuZDsKICAgICAgc3JjX2V4dGVudCA9IHNvdXJjZS0+ZGltWzBdLnVib3VuZCArIDEgLSBzb3VyY2UtPmRpbVswXS5sYm91bmQ7CgogICAgICBpZiAoc3JjX2V4dGVudCAhPSByZXRfZXh0ZW50KQoJcnVudGltZV9lcnJvciAoIkluY29ycmVjdCBleHRlbnQgaW4gcmV0dXJuIHZhbHVlIG9mIFRSQU5TUE9TRSIKCQkgICAgICAgIiBpbnRyaW5zaWMgaW4gZGltZW5zaW9uIDI6IGlzICVsZCwiCgkJICAgICAgICIgc2hvdWxkIGJlICVsZCIsIChsb25nIGludCkgc3JjX2V4dGVudCwKCQkgICAgICAgKGxvbmcgaW50KSByZXRfZXh0ZW50KTsKCiAgICB9CgogIHN4c3RyaWRlID0gc291cmNlLT5kaW1bMF0uc3RyaWRlOwogIHN5c3RyaWRlID0gc291cmNlLT5kaW1bMV0uc3RyaWRlOwogIHhjb3VudCA9IHNvdXJjZS0+ZGltWzBdLnVib3VuZCArIDEgLSBzb3VyY2UtPmRpbVswXS5sYm91bmQ7CiAgeWNvdW50ID0gc291cmNlLT5kaW1bMV0udWJvdW5kICsgMSAtIHNvdXJjZS0+ZGltWzFdLmxib3VuZDsKCiAgcnhzdHJpZGUgPSByZXQtPmRpbVswXS5zdHJpZGU7CiAgcnlzdHJpZGUgPSByZXQtPmRpbVsxXS5zdHJpZGU7CgogIHJwdHIgPSByZXQtPmRhdGE7CiAgc3B0ciA9IHNvdXJjZS0+ZGF0YTsKCiAgZm9yICh5PTA7IHkgPCB5Y291bnQ7IHkrKykKICAgIHsKICAgICAgZm9yICh4PTA7IHggPCB4Y291bnQ7IHgrKykKICAgICAgICB7CiAgICAgICAgICAqcnB0ciA9ICpzcHRyOwoKICAgICAgICAgIHNwdHIgKz0gc3hzdHJpZGU7CiAgICAgICAgICBycHRyICs9IHJ5c3RyaWRlOwogICAgICAgIH0KICAgICAgICBzcHRyICs9IHN5c3RyaWRlIC0gKHN4c3RyaWRlICogeGNvdW50KTsKICAgICAgICBycHRyICs9IHJ4c3RyaWRlIC0gKHJ5c3RyaWRlICogeGNvdW50KTsKICAgIH0KfQoKI2VuZGlmCg==