LyoKICogQklPUyBpbnRlcnJ1cHQgMTBoIGhhbmRsZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqIENvcHlyaWdodCAxOTk4IEpvc2VwaCBQcmFuZXZpY2gKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAiZG9zZXhlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChpbnQpOwoKLyoKICogRGlzcGxheSBjb21iaW5hdGlvbiBjb2RlIGZvciBhY3RpdmUgZGlzcGxheS4KICoKICogVmFsdWVzIChoZXgpOgogKiAwMCAtIG5vIGRpc3BsYXkKICogMDEgLSBtb25vY2hyb21lIGFkYXB0ZXIgdy8gbW9ub2Nocm9tZSBkaXNwbGF5CiAqIDAyIC0gQ0dBIHcvIGNvbG9yIGRpc3BsYXkKICogMDMgLSByZXNlcnZlZAogKiAwNCAtIEVHQSB3LyBjb2xvciBkaXNwbGF5CiAqIDA1IC0gRUdBIHcvIG1vbm9jaHJvbWUgZGlzcGxheQogKiAwNiAtIFBHQSB3LyBjb2xvciBkaXNwbGF5CiAqIDA3IC0gVkdBIHcvIG1vbm9jaHJvbWUgYW5hbG9nIGRpc3BsYXkKICogMDggLSBWR0Egdy8gY29sb3IgYW5hbG9nIGRpc3BsYXkKICogMDkgLSByZXNlcnZlZAogKiAwQSAtIE1DR0Egdy8gZGlnaXRhbCBjb2xvciBkaXNwbGF5CiAqIDBCIC0gTUNHQSB3LyBtb25vY2hyb21lIGFuYWxvZyBkaXNwbGF5CiAqIDBDIC0gTUNHQSB3LyBjb2xvciBhbmFsb2cgZGlzcGxheQogKiBGRiAtIHVua25vd24gZGlzcGxheSB0eXBlCiAqLwojZGVmaW5lIElOVDEwX0RDQyAweDA4CgojaW5jbHVkZSAicHNocGFjazEuaCIKCi8qCiAqIFN0cnVjdHVyZSBmb3IgRE9TIGRhdGEgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBhcHBsaWNhdGlvbnMuCiAqIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgY29ycmVjdGx5IHBhY2tlZC4KICovCnR5cGVkZWYgc3RydWN0IF9JTlQxMF9IRUFQIHsKICAgIEJZVEUgIFN0YXRpY01vZGVTdXBwb3J0WzddOyAgICAgLyogbW9kZXMgc3VwcG9ydGVkIDEuLjcgKi8KICAgIEJZVEUgIFN0YXRpY1NjYW5saW5lU3VwcG9ydDsgICAgLyogc2NhbiBsaW5lcyBzdXBwb3J0ZWQgKi8KICAgIEJZVEUgIFN0YXRpY051bWJlckNoYXJCbG9ja3M7ICAgLyogdG90YWwgbnVtYmVyIG9mIGNoYXIgYmxvY2tzICovCiAgICBCWVRFICBTdGF0aWNBY3RpdmVDaGFyQmxvY2tzOyAgIC8qIG1heCBudW1iZXIgb2YgYWN0aXZlIGNoYXIgYmxvY2tzICovCiAgICBXT1JEICBTdGF0aWNNaXNjRmxhZ3M7ICAgICAgICAgIC8qIG1pc2MgZnVuY3Rpb24gc3VwcG9ydCBmbGFncyAqLwogICAgV09SRCAgU3RhdGljUmVzZXJ2ZWQxOyAgICAgICAgICAvKiByZXNlcnZlZCAqLwogICAgQllURSAgU3RhdGljU2F2ZVBvaW50ZXJGbGFnczsgICAvKiBzYXZlIHBvaW50ZXIgZnVuY3Rpb24gZmxhZ3MgKi8KICAgIEJZVEUgIFN0YXRpY1Jlc2VydmVkMjsgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KCiAgICBXT1JEICBWZXNhQ3VycmVudE1vZGU7CiAgICBXT1JEICBWZXNhTW9kZUxpc3RbNjRdOwogICAgY2hhciAgVmVzYU9FTU5hbWVbMzJdOwogICAgY2hhciAgVmVzYVByb2R1Y3ROYW1lWzMyXTsKICAgIGNoYXIgIFZlc2FQcm9kdWN0UmV2WzMyXTsKICAgIGNoYXIgIFZlc2FWZW5kb3JOYW1lWzMyXTsKCiAgICBXT1JEICBXaW5lSGVhcFNlZ21lbnQ7Cn0gSU5UMTBfSEVBUDsKCi8qCiAqIFN0cnVjdHVyZSBmb3IgVkJFIE1vZGUgSW5mbyBCbG9jay4gU2VlIHRoZSBWQkUgMy4wIHN0YW5kYXJkIGZvciBkZXRhaWxzLgogKiBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIGNvcnJlY3RseSBwYWNrZWQuCiAqLwpzdHJ1Y3QgX01vZGVJbmZvQmxvY2sgewogICAgV09SRCAgTW9kZUF0dHJpYnV0ZXM7ICAgICAgIC8qIDB4MDAgKi8KICAgIEJZVEUgIFdpbkFBdHRyaWJ1dGVzOyAgICAgICAvKiAweDAyICovCiAgICBCWVRFICBXaW5CQXR0cmlidXRlczsgICAgICAgLyogMHgwMyAqLwogICAgV09SRCAgV2luR3JhbnVsYXJpdHk7ICAgICAgIC8qIDB4MDQgKi8KICAgIFdPUkQgIFdpblNpemU7ICAgICAgICAgICAgICAvKiAweDA2ICovCiAgICBXT1JEICBXaW5BU2VnbWVudDsgICAgICAgICAgLyogMHgwOCAqLwogICAgV09SRCAgV2luQlNlZ21lbnQ7ICAgICAgICAgIC8qIDB4MEEgKi8KICAgIERXT1JEIFdpbkZ1bmNQdHI7ICAgICAgICAgICAvKiAweDBDICovCiAgICBXT1JEICBCeXRlc1BlclNjYW5MaW5lOyAgICAgLyogMHgxMCAqLwogICAgLyogbWFuZGF0b3J5IGZvciBWQkUgMS4yKyAqLwogICAgV09SRCAgWFJlc29sdXRpb247ICAgICAgICAgIC8qIDB4MTIgKi8KICAgIFdPUkQgIFlSZXNvbHV0aW9uOyAgICAgICAgICAvKiAweDE0ICovCiAgICBCWVRFICBYQ2hhclNpemU7ICAgICAgICAgICAgLyogMHgxNiAqLwogICAgQllURSAgWUNoYXJTaXplOyAgICAgICAgICAgIC8qIDB4MTcgKi8KICAgIEJZVEUgIE51bWJlck9mUGxhbmVzOyAgICAgICAvKiAweDE4ICovCiAgICBCWVRFICBCaXRzUGVyUGl4ZWw7ICAgICAgICAgLyogMHgxOSAqLwogICAgQllURSAgTnVtYmVyT2ZCYW5rczsgICAgICAgIC8qIDB4MUEgKi8KICAgIEJZVEUgIE1lbW9yeU1vZGVsOyAgICAgICAgICAvKiAweDFCICovCiAgICBCWVRFICBCYW5rU2l6ZTsgICAgICAgICAgICAgLyogMHgxQyAqLwogICAgQllURSAgTnVtYmVyT2ZJbWFnZVBhZ2VzOyAgIC8qIDB4MUQgKi8KICAgIEJZVEUgIFJlc2VydmVkMTsgICAgICAgICAgICAvKiAweDFFICovCiAgICBCWVRFICBSZWRNYXNrU2l6ZTsgICAgICAgICAgLyogMHgxRiAqLwogICAgQllURSAgUmVkRmllbGRQb3NpdGlvbjsgICAgIC8qIDB4MjAgKi8KICAgIEJZVEUgIEdyZWVuTWFza1NpemU7ICAgICAgICAvKiAweDIxICovCiAgICBCWVRFICBHcmVlbkZpZWxkUG9zaXRpb247ICAgLyogMHgyMiAqLwogICAgQllURSAgQmx1ZU1hc2tTaXplOyAgICAgICAgIC8qIDB4MjMgKi8KICAgIEJZVEUgIEJsdWVGaWVsZFBvc2l0aW9uOyAgICAvKiAweDI0ICovCiAgICBCWVRFICBSc3ZkTWFza1NpemU7ICAgICAgICAgLyogMHgyNSAqLwogICAgQllURSAgUnN2ZEZpZWxkUG9zaXRpb247ICAgIC8qIDB4MjYgKi8KICAgIEJZVEUgIERpcmVjdENvbG9yTW9kZUluZm87ICAvKiAweDI3ICovCiAgICAvKiBtYW5kYXRvcnkgZm9yIFZCRSAyLjArICovCiAgICBEV09SRCBQaHlzQmFzZVB0cjsgICAgICAgICAgLyogMHgyOCAqLwogICAgRFdPUkQgUmVzZXJ2ZWQyOyAgICAgICAgICAgIC8qIDB4MkMgKi8KICAgIFdPUkQgIFJlc2VydmVkMzsgICAgICAgICAgICAvKiAweDMwICovCiAgICAvKiBtYW5kYXRvcnkgZm9yIFZCRSAzLjArICovCiAgICBXT1JEICBMaW5CeXRlc1BlclNjYW5MaW5lOyAgLyogMHgzMiAqLwogICAgQllURSAgQm5rTnVtYmVyT2ZJbWFnZVBhZ2VzOy8qIDB4MzQgKi8KICAgIEJZVEUgIExpbk51bWJlck9mSW1hZ2VQYWdlczsvKiAweDM1ICovCiAgICBCWVRFICBMaW5SZWRNYXNrU2l6ZTsgICAgICAgLyogMHgzNiAqLwogICAgQllURSAgTGluUmVkRmllbGRQb3NpdGlvbjsgIC8qIDB4MzcgKi8KICAgIEJZVEUgIExpbkdyZWVuTWFza1NpemU7ICAgICAvKiAweDM4ICovCiAgICBCWVRFICBMaW5HcmVlbkZpZWxkUG9zaXRpb247LyogMHgzOSAqLwogICAgQllURSAgTGluQmx1ZU1hc2tTaXplOyAgICAgIC8qIDB4M0EgKi8KICAgIEJZVEUgIExpbkJsdWVGaWVsZFBvc2l0aW9uOyAvKiAweDNCICovCiAgICBCWVRFICBMaW5Sc3ZkTWFza1NpemU7ICAgICAgLyogMHgzQyAqLwogICAgQllURSAgTGluUnN2ZEZpZWxkUG9zaXRpb247IC8qIDB4M0QgKi8KICAgIERXT1JEIE1heFBpeGVsQ2xvY2s7ICAgICAgICAvKiAweDNFICovCiAgICBCWVRFICBSZXNlcnZlZDRbMTkwXTsgICAgICAgLyogMHg0MiAqLwp9OwoKI2luY2x1ZGUgInBvcHBhY2suaCIKCi8qCiAqIFdpbmUgaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgdmlkZW8gbW9kZXMuCiAqIElmIGRlcHRoIGlzIHplcm8sIHRoZSBtb2RlIGlzIGNvbnNpZGVyZWQgdG8KICogYmUgYSB0ZXh0IG1vZGUuCiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBXT1JEIE1vZGU7CiAgICBXT1JEIFdpZHRoOwogICAgV09SRCBIZWlnaHQ7CiAgICBXT1JEIERlcHRoOwp9IElOVDEwX01PREU7CgoKLyoKICogTGlzdCBvZiBzdXBwb3J0ZWQgdmlkZW8gbW9kZXMuCiAqLwpzdGF0aWMgY29uc3QgSU5UMTBfTU9ERSBJTlQxMF9tb2RlbGlzdFtdID0KewogICAgezB4MDAwMCwgICA0MCwgICAyNSwgIDB9LAogICAgezB4MDAwMSwgICA0MCwgICAyNSwgIDB9LAogICAgezB4MDAwMiwgICA4MCwgICAyNSwgIDB9LAogICAgezB4MDAwMywgICA4MCwgICAyNSwgIDB9LAogICAgezB4MDAwNywgICA4MCwgICAyNSwgIDB9LAogICAgezB4MDAwZCwgIDMyMCwgIDIwMCwgIDR9LAogICAgezB4MDAwZSwgIDY0MCwgIDIwMCwgIDR9LAogICAgezB4MDAxMCwgIDY0MCwgIDM1MCwgIDR9LAogICAgezB4MDAxMiwgIDY0MCwgIDQ4MCwgIDR9LAogICAgezB4MDAxMywgIDMyMCwgIDIwMCwgIDh9LAogICAgezB4MDA2YSwgIDgwMCwgIDYwMCwgIDR9LCAgIC8qIFZFU0EgbW9kZSwgc2FtZSBhcyAweDEwMiAqLwogICAgezB4MDEwMCwgIDY0MCwgIDQwMCwgIDh9LAogICAgezB4MDEwMSwgIDY0MCwgIDQ4MCwgIDh9LAogICAgezB4MDEwMiwgIDgwMCwgIDYwMCwgIDR9LAogICAgezB4MDEwMywgIDgwMCwgIDYwMCwgIDh9LAogICAgezB4MDEwNCwgMTAyNCwgIDc2OCwgIDR9LAogICAgezB4MDEwNSwgMTAyNCwgIDc2OCwgIDh9LAogICAgezB4MDEwNiwgMTI4MCwgMTAyNCwgIDR9LAogICAgezB4MDEwNywgMTI4MCwgMTAyNCwgIDh9LAogICAgezB4MDEwOCwgICA4MCwgICA2MCwgIDB9LAogICAgezB4MDEwOSwgIDEzMiwgICAyNSwgIDB9LAogICAgezB4MDEwYSwgIDEzMiwgICA0MywgIDB9LAogICAgezB4MDEwYiwgIDEzMiwgICA1MCwgIDB9LAogICAgezB4MDEwYywgIDEzMiwgICA2MCwgIDB9LAogICAgezB4MDEwZCwgIDMyMCwgIDIwMCwgMTV9LAogICAgezB4MDEwZSwgIDMyMCwgIDIwMCwgMTZ9LAogICAgezB4MDEwZiwgIDMyMCwgIDIwMCwgMjR9LAogICAgezB4MDExMCwgIDY0MCwgIDQ4MCwgMTV9LAogICAgezB4MDExMSwgIDY0MCwgIDQ4MCwgMTZ9LAogICAgezB4MDExMiwgIDY0MCwgIDQ4MCwgMjR9LAogICAgezB4MDExMywgIDgwMCwgIDYwMCwgMTV9LAogICAgezB4MDExNCwgIDgwMCwgIDYwMCwgMTZ9LAogICAgezB4MDExNSwgIDgwMCwgIDYwMCwgMjR9LAogICAgezB4MDExNiwgMTAyNCwgIDc2OCwgMTV9LAogICAgezB4MDExNywgMTAyNCwgIDc2OCwgMTZ9LAogICAgezB4MDExOCwgMTAyNCwgIDc2OCwgMjR9LAogICAgezB4MDExOSwgMTI4MCwgMTAyNCwgMTV9LAogICAgezB4MDExYSwgMTI4MCwgMTAyNCwgMTZ9LAogICAgezB4MDExYiwgMTI4MCwgMTAyNCwgMjR9LAogICAgezB4ZmZmZiwgICAgMCwgICAgMCwgIDB9Cn07CgovKiBUcnVlIGlmIHZpZGVvIG1vZGUgaXMgYSB2ZXNhIG1vZGUsIGZhbHNlIG90aGVyd2lzZS4KICogTW9yZSBjb3JyZWN0IHdvdWxkIGJlIHRvIHVzZSBzb21ldGhpbmcgbGlrZSAoeCA+IDB4ZmYgfHwgeCA9PSAweDZhKQogKiBidXQgYXMgbG9uZyBhcyB3ZSBoYXZlIG9ubHkgdGhlIHN0YW5kYXJkIFZHQSBhbmQgVkVTQSBtb2RlcyB0aGlzIGlzIG9rIHRvbyAqLwojZGVmaW5lIElTX1ZFU0FfTU9ERSh4KSAgICAgICAgICgoeCkgPj0gMHg2YSkKCi8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAqLwpzdGF0aWMgSU5UMTBfSEVBUCAqSU5UMTBfR2V0SGVhcCh2b2lkKTsKc3RhdGljIHZvaWQgSU5UMTBfU2V0Q3Vyc29yUG9zKEJJT1NEQVRBKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCk7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9GaW5kTW9kZQogKi8Kc3RhdGljIGNvbnN0IElOVDEwX01PREUgKklOVDEwX0ZpbmRNb2RlKCBXT1JEIG1vZGUgKQp7CiAgICBjb25zdCBJTlQxMF9NT0RFICpwdHIgPSBJTlQxMF9tb2RlbGlzdDsKICAgIAogICAgLyoKICAgICAqIEZpbHRlciBvdXQgZmxhZ3MuCiAgICAgKi8KICAgIG1vZGUgJj0gMHgxN2Y7CgogICAgd2hpbGUgKHB0ci0+TW9kZSAhPSAweGZmZmYpCiAgICB7CiAgICAgICAgaWYgKHB0ci0+TW9kZSA9PSBtb2RlKQogICAgICAgICAgICByZXR1cm4gcHRyOwogICAgICAgIHB0cisrOwogICAgfQoKICAgIHJldHVybiBOVUxMOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9GaWxsQ29udHJvbGxlckluZm9ybWF0aW9uCiAqCiAqIEZpbGwgMjU2LWJ5dGUgKFZCRTEueCkgb3IgNTEyLWJ5dGUgYnVmZmVyIChWQkUyLjArKSB3aXRoCiAqIGNhcGFiaWxpdGllcyBvZiB0aGUgdmlkZW8gY29udHJvbGxlci4KICovCnN0YXRpYyB2b2lkIElOVDEwX0ZpbGxDb250cm9sbGVySW5mb3JtYXRpb24oIEJZVEUgKmJ1ZmZlciApCnsKICAgIElOVDEwX0hFQVAgKmhlYXAgPSBJTlQxMF9HZXRIZWFwKCk7CgogICAgLyogMDAgLSBCWVRFWzRdOiBzaWduYXR1cmUgKi8KICAgIG1lbW1vdmUoIGJ1ZmZlciwgIlZFU0EiLCA0ICk7CgogICAgLyogMDQgLSBXT1JEOiB2ZXJzaW9uIG51bWJlciAqLwogICAgKihXT1JEKikoYnVmZmVyICsgNCkgPSAweDAzMDA7IC8qIHZlcnNpb24gMy4wICovCiAgICAKICAgIC8qIDA2IC0gRFdPUkQ6IHBvaW50ZXIgdG8gT0VNIG5hbWUgKi8KICAgICooU0VHUFRSKikoYnVmZmVyICsgNikgPSBNQUtFU0VHUFRSKCBoZWFwLT5XaW5lSGVhcFNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoSU5UMTBfSEVBUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXNhT0VNTmFtZSkgKTsKCiAgICAvKgogICAgICogMTAgLSBEV09SRDogY2FwYWJpbGl0aWVzIGZsYWdzIAogICAgICogQml0czoKICAgICAqICAgIDAgLSBEQUMgY2FuIGJlIHN3aXRjaGVkIGludG8gOC1iaXQgbW9kZQogICAgICogICAgMSAtIG5vbi1WR0EgY29udHJvbGxlcgogICAgICogICAgMiAtIHByb2dyYW1tZWQgREFDIHdpdGggYmxhbmsgYml0CiAgICAgKiAgICAzIC0gY29udHJvbGxlciBzdXBwb3J0cyBoYXJkd2FyZSBzdGVyZW9zY29waWMgc2lnbmFsbGluZwogICAgICogICAgNCAtID0wIHN0ZXJlbyBzaWduYWxsaW5nIHZpYSBleHRlcm5hbCBWRVNBIHN0ZXJlbyBjb25uZWN0b3IKICAgICAqICAgICAgICA9MSBzdGVyZW8gc2lnbmFsbGluZyB2aWEgVkVTQSBFVkMgY29ubmVjdG9yCiAgICAgKiAgICA1IC0gY29udHJvbGxlciBzdXBwb3J0cyBoYXJkd2FyZSBtb3VzZSBjdXJzb3IKICAgICAqICAgIDYgLSBjb250cm9sbGVyIHN1cHBvcnRzIGhhcmR3YXJlIGNsaXBwaW5nCiAgICAgKiAgICA3IC0gY29udHJvbGxlciBzdXBwb3J0cyB0cmFuc3BhcmVudCBCaXRCTFQKICAgICAqIDgtMzEgLSByZXNlcnZlZCAoMCkKICAgICAqLwogICAgKihEV09SRCopKGJ1ZmZlciArIDEwKSA9IDA7IC8qIEZJWE1FICovCiAgICAKICAgIC8qIDE0IC0gRFdPUkQ6IHBvaW50ZXIgdG8gbGlzdCBvZiBzdXBwb3J0ZWQgVkVTQSBhbmQgT0VNIHZpZGVvIG1vZGVzICovCiAgICAqKFNFR1BUUiopKGJ1ZmZlciArIDE0KSA9IE1BS0VTRUdQVFIoIGhlYXAtPldpbmVIZWFwU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoSU5UMTBfSEVBUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVzYU1vZGVMaXN0KSApOwoKICAgIC8qIDE4IC0gV09SRDogdG90YWwgYW1vdW50IG9mIHZpZGVvIG1lbW9yeSBpbiA2NEsgYmxvY2tzICovCiAgICAqKFdPUkQqKShidWZmZXIgKyAxOCkgPSAxNjsgLyogRklYTUUgKi8KCiAgICAvKiAyMCAtIFdPUkQ6IE9FTSBzb2Z0d2FyZSB2ZXJzaW9uIChCQ0QsIGhpZ2ggYnl0ZSA9IG1ham9yKSAqLwogICAgKihXT1JEKikoYnVmZmVyICsgMjApID0gMHgwMTAwOyAvKiB2ZXJzaW9uIDEuMCAqLwoKICAgIC8qIDIyIC0gRFdPUkQ6IHBvaW50ZXIgdG8gdmVuZG9yIG5hbWUgKi8KICAgICooU0VHUFRSKikoYnVmZmVyICsgMjIpID0gTUFLRVNFR1BUUiggaGVhcC0+V2luZUhlYXBTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihJTlQxMF9IRUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXNhVmVuZG9yTmFtZSkgKTsKCiAgICAvKiAyNiAtIERXT1JEOiBwb2ludGVyIHRvIHByb2R1Y3QgbmFtZSAqLwogICAgKihTRUdQVFIqKShidWZmZXIgKyAyNikgPSBNQUtFU0VHUFRSKCBoZWFwLT5XaW5lSGVhcFNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKElOVDEwX0hFQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlc2FQcm9kdWN0TmFtZSkgKTsKCiAgICAvKiAzMCAtIERXT1JEOiBwb2ludGVyIHRvIHByb2R1Y3QgcmV2aXNpb24gc3RyaW5nICovCiAgICAqKFNFR1BUUiopKGJ1ZmZlciArIDMwKSA9IE1BS0VTRUdQVFIoIGhlYXAtPldpbmVIZWFwU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoSU5UMTBfSEVBUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVzYVByb2R1Y3RSZXYpICk7CgogICAgLyogMzQgLSBXT1JEOiBWQkUvQUYgdmVyc2lvbiAoaWYgY2FwYWJpbGl0aWVzIGJpdCAzIHNldCkgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDM0KSA9IDA7CgogICAgLyoKICAgICAqIDM2IC0gRFdPUkQ6IHBvaW50ZXIgdG8gbGlzdCBvZiBhY2NlbGVyYXRlZCBtb2RlcyAKICAgICAqICAgICAgICAgICAgIChpZiBjYXBhYmlsaXRpZXMgYml0IDMgc2V0KSAKICAgICAqLwogICAgKihTRUdQVFIqKShidWZmZXIgKyAzNikgPSAwOwoKICAgIC8qIDQwIC0gQllURVsyMTZdOiByZXNlcnZlZCBmb3IgVkJFIGltcGxlbWVudGF0aW9uLCBzZXQgdG8gemVybyAqLwogICAgbWVtc2V0KCBidWZmZXIgKyA0MCwgMCwgMjE2ICk7CgogICAgLyogCiAgICAgKiAyNTYgLSBCWVRFWzI1Nl06IHJlc2VydmVkIGZvciBWQkUzLjAgaW1wbGVtZW50YXRpb24sIAogICAgICogICAgICAgICAgICAgICAgICBpZ25vcmVkIGluIG9yZGVyIHRvIHN1cHBvcnQgb2xkZXIgcHJvZ3JhbXMKICAgICAqLwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9GaWxsTW9kZUluZm9ybWF0aW9uCiAqCiAqIEZpbGwgMjU2LWJ5dGUgYnVmZmVyIHdpdGggZXh0ZW5kZWQgaW5mb3JtYXRpb24gYWJvdXQgZGlzcGxheSBtb2RlLgogKgogKiBSZXR1cm5zIEZBTFNFIGlmIG1vZGUgaXMgdW5rbm93biBhbmQgVFJVRSBpcyBtb2RlIGlzIGtub3duCiAqIGV2ZW4gaWYgaXQgaXMgbm90IHN1cHBvcnRlZC4KICovCnN0YXRpYyBCT09MIElOVDEwX0ZpbGxNb2RlSW5mb3JtYXRpb24oIHN0cnVjdCBfTW9kZUluZm9CbG9jayAqbWliLCBXT1JEIG1vZGUgKQp7CiAgICBjb25zdCBJTlQxMF9NT0RFICpwdHIgPSBJTlQxMF9GaW5kTW9kZSggbW9kZSApOwogICAgaWYgKCFwdHIpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qCiAgICAgKiAwMCAtIFdPUkQ6IG1vZGUgYXR0cmlidXRlcwogICAgICogQml0czoKICAgICAqICAgICAwIC0gTW9kZSBzdXBwb3J0ZWQgYnkgcHJlc2VudCBoYXJkd2FyZSBjb25maWd1cmF0aW9uLgogICAgICogICAgIDEgLSBPcHRpb25hbCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuIE11c3QgYmUgPTEgZm9yIFZCRSB2MS4yKy4KICAgICAqICAgICAyIC0gQklPUyBvdXRwdXQgc3VwcG9ydGVkLgogICAgICogICAgICAgICBJbnQxMCBmdW5jdGlvbnMgMDEsIDAyLCAwNiwgMDcsIDA5LCAwYSBhbmQgMGUgYXJlIHN1cHBvcnRlZC4KICAgICAqICAgICAzIC0gU2V0IGlmIGNvbG9yLCBjbGVhciBpZiBtb25vY2hyb21lLgogICAgICogICAgIDQgLSBTZXQgaWYgZ3JhcGhpY3MgbW9kZSwgY2xlYXIgaWYgdGV4dCBtb2RlLgogICAgICogICAgIDUgLSBNb2RlIGlzIG5vdCBWR0EtY29tcGF0aWJsZSBpZiBzZXQuCiAgICAgKiAgICAgICAgIFZHQS1jb21wYXRpYmxlIG1vZGVzIHN1cHBvcnQgc3RhbmRhcmQgVkdBIEkvTyBwb3J0cy4KICAgICAqICAgICA2IC0gQmFuay1zd2l0Y2hlZCAob3Igd2luZG93ZWQpIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBpZiBzZXQuCiAgICAgKiAgICAgNyAtIExpbmVhciBmcmFtZWJ1ZmZlciBtb2RlIHN1cHBvcnRlZC4KICAgICAqICAgICA4IC0gRG91YmxlIHNjYW5uaW5nIHN1cHBvcnRlZC4KICAgICAqICAgICA5IC0gSW50ZXJsYWNlZCBvcGVyYXRpb24gc3VwcG9ydGVkLgogICAgICogICAgMTAgLSBUcmlwbGUgYnVmZmVyaW5nIHN1cHBvcnRlZC4KICAgICAqICAgIDExIC0gU3RlcmVvc2NvcGljIGRpc3BsYXkgc3VwcG9ydGVkLgogICAgICogICAgMTIgLSBEdWFsIGRpc3BsYXkgc3RhcnQgYWRkcmVzcyBzdXBwb3J0ZWQuCiAgICAgKiAxMy0xNSAtIFJlc2VydmVkLgogICAgICovCiAgICB7CiAgICAgICAgV09SRCBhdHRyID0gMHgwMDBhOyAvKiBjb2xvciBtb2RlLCBvcHRpb25hbCBpbmZvICovCgogICAgICAgIC8qCiAgICAgICAgICogRklYTUU6IEF0dHJpYnV0ZSBoYW5kbGluZyBpcyBpbmNvbXBsZXRlLgogICAgICAgICAqLwoKICAgICAgICAvKiBNb2RlIHN1cHBvcnRlZD8gRklYTUU6IGNvcnJlY3QgdmFsdWUgKi8KICAgICAgICBhdHRyIHw9IDB4MDAwMTsKCiAgICAgICAgLyogR3JhcGhpY2FsIG1vZGU/ICovCiAgICAgICAgaWYgKHB0ci0+RGVwdGgpIAogICAgICAgICAgICBhdHRyIHw9IDB4MDAxMDsKCiAgICAgICAgLyogTm90IFZHQS1jb21wYXRpYmxlPyAqLwogICAgICAgIGlmIChJU19WRVNBX01PREUobW9kZSkpCiAgICAgICAgICAgIGF0dHIgfD0gMHgwMDIwOwoKICAgICAgICBtaWItPk1vZGVBdHRyaWJ1dGVzID0gYXR0cjsKICAgIH0KCiAgICAvKgogICAgICogMDIgLSBCWVRFWzJdOiB3aW5kb3cgYXR0cmlidXRlcywgd2luZG93IEEgYW5kIHdpbmRvdyBCCiAgICAgKiBCaXRzOgogICAgICogICAwIC0gV2luZG93IGV4aXN0cy4KICAgICAqICAgMSAtIFdpbmRvdyBpcyByZWFkYWJsZS4KICAgICAqICAgMiAtIFdpbmRvdyBpcyB3cml0YWJsZS4KICAgICAqIDMtNyAtIFJlc2VydmVkLgogICAgICovCiAgICBtaWItPldpbkFBdHRyaWJ1dGVzID0gMHgwNzsgLyogd2luZG93IEEgZXhpc3RzLCByZWFkYWJsZSBhbmQgd3JpdGFibGUgKi8KICAgIG1pYi0+V2luQkF0dHJpYnV0ZXMgPSAweDAwOyAvKiB3aW5kb3cgQiBub3Qgc3VwcG9ydGVkICovCgogICAgLyogMDQgLSBXT1JEOiB3aW5kb3cgZ3JhbnVsYXJpdHkgaW4gS0IgKi8KICAgIG1pYi0+V2luR3JhbnVsYXJpdHkgPSA2NDsKCiAgICAvKiAwNiAtIFdPUkQ6IHdpbmRvdyBzaXplIGluIEtCICovCiAgICBtaWItPldpblNpemUgPSA2NDsKCiAgICAvKiAwOCAtIFdPUkRbMl06IHN0YXJ0IHNlZ21lbnRzLCB3aW5kb3cgQSBhbmQgd2luZG93IEIgKi8KICAgIG1pYi0+V2luQVNlZ21lbnQgPSAweGEwMDA7IC8qIHdpbmRvdyBBIHNlZ21lbnQgKi8KICAgIG1pYi0+V2luQlNlZ21lbnQgPSAweDAwMDA7IC8qIHdpbmRvdyBCIG5vdCBzdXBwb3J0ZWQgKi8KCiAgICAvKiAxMiAtIERXT1JEOiB3aW5kb3cgcG9zaXRpb25pbmcgZnVuY3Rpb24gKi8KICAgIG1pYi0+V2luRnVuY1B0ciA9IDA7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KICAgIAogICAgLyogMTYgLSBXT1JEOiBieXRlcyBwZXIgc2NhbiBsaW5lICovCiAgICAvKiBGSVhNRTogaXMgdGhpcyBhbHdheXMgY29ycmVjdD8gKi8KICAgIG1pYi0+Qnl0ZXNQZXJTY2FuTGluZSA9IHB0ci0+V2lkdGggKiAocHRyLT5EZXB0aCA/IChwdHItPkRlcHRoICsgNykgLyA4IDogMSk7CgogICAgLyogMTggLSBXT1JEOiB3aWR0aCBpbiBwaXhlbHMgKGdyYXBoaWNzKSBvciBjaGFyYWN0ZXJzICh0ZXh0KSAqLwogICAgbWliLT5YUmVzb2x1dGlvbiA9IHB0ci0+V2lkdGg7CgogICAgLyogMjAgLSBXT1JEOiBoZWlnaHQgaW4gcGl4ZWxzIChncmFwaGljcykgb3IgY2hhcmFjdGVycyAodGV4dCkgKi8KICAgIG1pYi0+WVJlc29sdXRpb24gPSBwdHItPkhlaWdodDsKCiAgICAvKiAyMiAtIEJZVEU6IHdpZHRoIG9mIGNoYXJhY3RlciBjZWxsIGluIHBpeGVscyAqLwogICAgbWliLT5YQ2hhclNpemUgPSAwOyAvKiBGSVhNRSAqLwoKICAgIC8qIDIzIC0gQllURTogaGVpZ2h0IG9mIGNoYXJhY3RlciBjZWxsIGluIHBpeGVscyAqLwogICAgbWliLT5ZQ2hhclNpemUgPSAwOyAvKiBGSVhNRSAqLwoKICAgIC8qIDI0IC0gQllURTogbnVtYmVyIG9mIG1lbW9yeSBwbGFuZXMgKi8KICAgIG1pYi0+TnVtYmVyT2ZQbGFuZXMgPSAxOyAvKiBGSVhNRSAqLwoKICAgIC8qIDI1IC0gQllURTogbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsICovCiAgICBtaWItPkJpdHNQZXJQaXhlbCA9IHB0ci0+RGVwdGg7IC8qIEZJWE1FOiB0ZXh0IG1vZGVzPyByZXNlcnZlZCBiaXRzPyAqLwoKICAgIC8qIDI2IC0gQllURTogbnVtYmVyIG9mIGJhbmtzICovCiAgICBtaWItPk51bWJlck9mQmFua3MgPSAxOyAvKiBGSVhNRSAqLwoKICAgIC8qCiAgICAgKiAyNyAtIEJZVEU6IG1lbW9yeSBtb2RlbCB0eXBlCiAgICAgKiBWYWx1ZXMgKGhleCk6CiAgICAgKiAgICAwMCAtIFRleHQgbW9kZQogICAgICogICAgMDEgLSBDR0EgZ3JhcGhpY3MKICAgICAqICAgIDAyIC0gSGVyY3VsZXMgZ3JhcGhpY3MKICAgICAqICAgIDAzIC0gUGxhbmFyCiAgICAgKiAgICAwNCAtIFBhY2tlZCBwaXhlbAogICAgICogICAgMDUgLSBOb24tY2hhaW4gNCwgMjU2IGNvbG9yCiAgICAgKiAgICAwNiAtIERpcmVjdCBjb2xvcgogICAgICogICAgMDcgLSBZVVYKICAgICAqIDA4LTBGIC0gUmVzZXJ2ZWQgZm9yIFZFU0EuCiAgICAgKiAxMC1GRiAtIE9FTSBtZW1vcnkgbW9kZWxzLgogICAgICovCiAgICBpZiAoIXB0ci0+RGVwdGgpCiAgICAgICAgbWliLT5NZW1vcnlNb2RlbCA9IDA7IC8qIHRleHQgbW9kZSAqLwogICAgZWxzZQogICAgICAgIG1pYi0+TWVtb3J5TW9kZWwgPSAzOyAvKiBGSVhNRSAqLwoKICAgIC8qIDI4IC0gQllURTogc2l6ZSBvZiBiYW5rIGluIEtCICovCiAgICBtaWItPkJhbmtTaXplID0gMDsgLyogRklYTUUgKi8KCiAgICAvKiAyOSAtIEJZVEU6IG51bWJlciBvZiBpbWFnZSBwYWdlcyAobGVzcyBvbmUpIGluIHZpZGVvIFJBTSAqLwogICAgbWliLT5OdW1iZXJPZkltYWdlUGFnZXMgPSAwOyAvKiBGSVhNRSAqLwoKICAgIC8qIDMwIC0gQllURTogcmVzZXJ2ZWQgKDB4MDAgZm9yIFZCRSAxLjAtMi4wLCAweDAxIGZvciBWQkUgMy4wKSAqLwogICAgbWliLT5SZXNlcnZlZDEgPSAweDAxOwoKICAgIC8qIAogICAgICogMzEsMzMsMzUgLSBCWVRFOiByZWQvZ3JlZW4vYmx1ZSBtYXNrIHNpemUgCiAgICAgKiBTaXplIG9mIHJlZC9ncmVlbi9ibHVlIGNvbG9yIGNvbXBvbmVudCBpbiBiaXRzLgogICAgICogMzIsMzQsMzYgLSBCWVRFOiByZWQvZ3JlZW4vYmx1ZSBmaWVsZCBwb3NpdGlvbiAKICAgICAqIEJpdCBwb3NpdGlvbiBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHJlZC9ncmVlbi9ibHVlIGNvbG9yCiAgICAgKiBjb21wb25lbnQuCiAgICAgKiBCb3RoIHNob3VsZCBiZSBvbmx5IHVzZWQgd2hlbiB0aGUgbWVtb3J5IG1vZGVsIGlzIGRpcmVjdCBjb2xvciBvciBZVVYKICAgICAqIGJ1dCAiSW1wZXJpdW0gUm9tYW51bSIgdXNlcyB0aGlzIGZpZWxkIGV2ZW4gd2hlbiB0aGUgbWVtb3J5IG1vZGVsIGlzCiAgICAgKiBwbGFuYXIuIFNvIGFsd2F5cyBmaWxsIHRoaXMgZmllbGQgd2hlbiB3ZSBoYXZlIGEgZGVwdGggYmlnZ2VyIHRoYW4gOCwKICAgICAqIG90aGVyd2lzZSBzZXQgdGhlbSB0byB6ZXJvLgogICAgICovCiAgICBzd2l0Y2ggKHB0ci0+RGVwdGgpIHsKICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICBtaWItPlJlZE1hc2tTaXplID0gODsKICAgICAgICAgICAgbWliLT5HcmVlbk1hc2tTaXplID0gODsKICAgICAgICAgICAgbWliLT5CbHVlTWFza1NpemUgPSA4OwogICAgICAgICAgICBtaWItPlJzdmRNYXNrU2l6ZSA9IDA7CiAgICAgICAgICAgIG1pYi0+UmVkRmllbGRQb3NpdGlvbiA9IDE2OwogICAgICAgICAgICBtaWItPkdyZWVuRmllbGRQb3NpdGlvbiA9IDg7CiAgICAgICAgICAgIG1pYi0+Qmx1ZUZpZWxkUG9zaXRpb24gPSAwOwogICAgICAgICAgICBtaWItPlJzdmRGaWVsZFBvc2l0aW9uID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgbWliLT5SZWRNYXNrU2l6ZSA9IDU7CiAgICAgICAgICAgIG1pYi0+R3JlZW5NYXNrU2l6ZSA9IDY7CiAgICAgICAgICAgIG1pYi0+Qmx1ZU1hc2tTaXplID0gNTsKICAgICAgICAgICAgbWliLT5Sc3ZkTWFza1NpemUgPSAwOwogICAgICAgICAgICBtaWItPlJlZEZpZWxkUG9zaXRpb24gPSAxMTsKICAgICAgICAgICAgbWliLT5HcmVlbkZpZWxkUG9zaXRpb24gPSA1OwogICAgICAgICAgICBtaWItPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKICAgICAgICAgICAgbWliLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgIG1pYi0+UmVkTWFza1NpemUgPSA1OwogICAgICAgICAgICBtaWItPkdyZWVuTWFza1NpemUgPSA1OwogICAgICAgICAgICBtaWItPkJsdWVNYXNrU2l6ZSA9IDU7CiAgICAgICAgICAgIG1pYi0+UnN2ZE1hc2tTaXplID0gMTsKICAgICAgICAgICAgbWliLT5SZWRGaWVsZFBvc2l0aW9uID0gMTA7CiAgICAgICAgICAgIG1pYi0+R3JlZW5GaWVsZFBvc2l0aW9uID0gNTsKICAgICAgICAgICAgbWliLT5CbHVlRmllbGRQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgIG1pYi0+UnN2ZEZpZWxkUG9zaXRpb24gPSAxNTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgbWliLT5SZWRNYXNrU2l6ZSA9IDA7CiAgICAgICAgICAgIG1pYi0+R3JlZW5NYXNrU2l6ZSA9IDA7CiAgICAgICAgICAgIG1pYi0+Qmx1ZU1hc2tTaXplID0gMDsKICAgICAgICAgICAgbWliLT5Sc3ZkTWFza1NpemUgPSAwOwogICAgICAgICAgICBtaWItPlJlZEZpZWxkUG9zaXRpb24gPSAwOwogICAgICAgICAgICBtaWItPkdyZWVuRmllbGRQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgIG1pYi0+Qmx1ZUZpZWxkUG9zaXRpb24gPSAwOwogICAgICAgICAgICBtaWItPlJzdmRGaWVsZFBvc2l0aW9uID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLyoKICAgICAqIDM5IC0gQllURTogZGlyZWN0IGNvbG9yIG1vZGUgaW5mbyAKICAgICAqIEJpdHM6CiAgICAgKiAwIC0gU2V0IGlmIGNvbG9yIHJhbXAgaXMgcHJvZ3JhbW1hYmxlLgogICAgICogMSAtIFNldCBpZiBieXRlcyBpbiByZXNlcnZlZCBmaWVsZCBtYXkgYmUgdXNlZCBieSBhcHBsaWNhdGlvbi4KICAgICAqLwogICAgbWliLT5EaXJlY3RDb2xvck1vZGVJbmZvID0gMDsgLyogbm90IHN1cHBvcnRlZCAqLwoKICAgIC8qIDQwIC0gRFdPUkQ6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgbGluZWFyIHZpZGVvIGJ1ZmZlciAqLwogICAgbWliLT5QaHlzQmFzZVB0ciA9IDA7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KCiAgICAvKiA0NCAtIERXT1JEOiByZXNlcnZlZCwgYWx3YXlzIHplcm8gKi8KICAgIG1pYi0+UmVzZXJ2ZWQyID0gMDsKCiAgICAvKiA0OCAtIFdPUkQ6IHJlc2VydmVkLCBhbHdheXMgemVybyAqLwogICAgbWliLT5SZXNlcnZlZDMgPSAwOwoKICAgIC8qIDUwIC0gV09SRDogYnl0ZXMgcGVyIHNjYW4gbGluZSBpbiBsaW5lYXIgbW9kZXMgKi8KICAgIG1pYi0+TGluQnl0ZXNQZXJTY2FuTGluZSA9IG1pYi0+Qnl0ZXNQZXJTY2FuTGluZTsKCiAgICAvKiA1MiAtIEJZVEU6IG51bWJlciBvZiBpbWFnZXMgKGxlc3Mgb25lKSBmb3IgYmFua2VkIHZpZGVvIG1vZGVzICovCiAgICBtaWItPkJua051bWJlck9mSW1hZ2VQYWdlcyA9IDA7IC8qIEZJWE1FICovCgogICAgLyogNTMgLSBCWVRFOiBudW1iZXIgb2YgaW1hZ2VzIChsZXNzIG9uZSkgZm9yIGxpbmVhciB2aWRlbyBtb2RlcyAqLwogICAgbWliLT5MaW5OdW1iZXJPZkltYWdlUGFnZXMgPSBtaWItPkJua051bWJlck9mSW1hZ2VQYWdlczsKCiAgICAvKiA1NCAtIEJZVEU6IHJlZCBtYXNrIHNpemUgKGxpbmVhciBtb2RlcykgKi8KICAgIG1pYi0+TGluUmVkTWFza1NpemUgPSBtaWItPlJlZE1hc2tTaXplOwoKICAgIC8qIDU1IC0gQllURTogcmVkIGZpZWxkIHBvc2l0aW9uIChsaW5lYXIgbW9kZXMpICovCiAgICBtaWItPkxpblJlZEZpZWxkUG9zaXRpb24gPSBtaWItPlJlZEZpZWxkUG9zaXRpb247CgogICAgLyogNTYgLSBCWVRFOiBncmVlbiBtYXNrIHNpemUgKGxpbmVhciBtb2RlcykgKi8KICAgIG1pYi0+TGluR3JlZW5NYXNrU2l6ZSA9IG1pYi0+R3JlZW5NYXNrU2l6ZTsKCiAgICAvKiA1NyAtIEJZVEU6IGdyZWVuIGZpZWxkIHNpemUgKGxpbmVhciBtb2RlcykgKi8KICAgIG1pYi0+TGluR3JlZW5GaWVsZFBvc2l0aW9uID0gbWliLT5HcmVlbkZpZWxkUG9zaXRpb247CgogICAgLyogNTggLSBCWVRFOiBibHVlIG1hc2sgc2l6ZSAobGluZWFyIG1vZGVzKSAqLwogICAgbWliLT5MaW5CbHVlTWFza1NpemUgPSBtaWItPkJsdWVNYXNrU2l6ZTsKCiAgICAvKiA1OSAtIEJZVEU6IGJsdWUgZmllbGQgcG9zaXRpb24gKGxpbmVhciBtb2RlcykgKi8KICAgIG1pYi0+TGluQmx1ZUZpZWxkUG9zaXRpb24gPSBtaWItPkJsdWVGaWVsZFBvc2l0aW9uOwoKICAgIC8qIDYwIC0gQllURTogcmVzZXJ2ZWQgbWFzayBzaXplIChsaW5lYXIgbW9kZXMpICovCiAgICBtaWItPkxpblJzdmRNYXNrU2l6ZSA9IG1pYi0+UnN2ZE1hc2tTaXplOwoKICAgIC8qIDYxIC0gQllURTogcmVzZXJ2ZWQgbWFzayBwb3NpdGlvbiAobGluZWFyIG1vZGVzKSAqLwogICAgbWliLT5MaW5Sc3ZkRmllbGRQb3NpdGlvbiA9IG1pYi0+UnN2ZEZpZWxkUG9zaXRpb247CgogICAgLyogNjIgLSBEV09SRDogbWF4aW11bSBwaXhlbCBjbG9jayBmb3IgZ3JhcGhpY3MgdmlkZW8gbW9kZSwgaW4gSHogKi8KICAgIG1pYi0+TWF4UGl4ZWxDbG9jayA9IDA7IC8qIEZJWE1FICovCgogICAgLyogNjYgLSBCWVRFWzE5MF06IHJlc2VydmVkLCBzZXQgdG8gemVybyAqLwogICAgbWVtc2V0KCAmbWliLT5SZXNlcnZlZDQsIDAsIDE5MCApOwoKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9GaWxsU3RhdGVJbmZvcm1hdGlvbgogKgogKiBGaWxsIDY0LWJ5dGUgYnVmZmVyIHdpdGggVkdBIHN0YXRlIGFuZCBmdW5jdGlvbmFsaXR5IGluZm9ybWF0aW9uLgogKi8Kc3RhdGljIHZvaWQgSU5UMTBfRmlsbFN0YXRlSW5mb3JtYXRpb24oIEJZVEUgKmJ1ZmZlciwgQklPU0RBVEEgKmRhdGEgKQp7CiAgICBJTlQxMF9IRUFQICpoZWFwID0gSU5UMTBfR2V0SGVhcCgpOwoKICAgIC8qIDAwIC0gRFdPUkQ6IGFkZHJlc3Mgb2Ygc3RhdGljIGZ1bmN0aW9uYWxpdHkgdGFibGUgKi8KICAgICooU0VHUFRSKikoYnVmZmVyICsgMCkgPSBNQUtFU0VHUFRSKCBoZWFwLT5XaW5lSGVhcFNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoSU5UMTBfSEVBUCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljTW9kZVN1cHBvcnQpICk7CgogICAgLyogMDQgLSBCWVRFWzMwXTogY29weSBvZiBCSU9TIGRhdGEgc3RhcnRpbmcgZnJvbSAweDQ5IChWaWRlb01vZGUpICovCiAgICBtZW1tb3ZlKCBidWZmZXIgKyA0LCAmZGF0YS0+VmlkZW9Nb2RlLCAzMCApOwoKICAgIC8qIDM0IC0gQllURTogbnVtYmVyIG9mIHJvd3MgLSAxICovCiAgICBidWZmZXJbMzRdID0gZGF0YS0+Um93c09uU2NyZWVuTWludXMxOwoKICAgIC8qIDM1IC0gV09SRDogYnl0ZXMvY2hhcmFjdGVyICovCiAgICAqKFdPUkQqKShidWZmZXIgKyAzNSkgPSBkYXRhLT5CeXRlc1BlckNoYXI7CgogICAgLyogMzcgLSBCWVRFOiBkaXNwbGF5IGNvbWJpbmF0aW9uIGNvZGUgb2YgYWN0aXZlIGRpc3BsYXkgKi8KICAgIGJ1ZmZlclszN10gPSBJTlQxMF9EQ0M7CgogICAgLyogMzggLSBCWVRFOiBEQ0Mgb2YgYWx0ZXJuYXRlIGRpc3BsYXkgKi8KICAgIGJ1ZmZlclszOF0gPSAwOyAvKiBubyBzZWNvbmRhcnkgZGlzcGxheSAqLwoKICAgIC8qIDM5IC0gV09SRDogbnVtYmVyIG9mIGNvbG9ycyBzdXBwb3J0ZWQgaW4gY3VycmVudCBtb2RlICgwMDAwaCA9IG1vbm8pICovCiAgICAqKFdPUkQqKShidWZmZXIgKyAzOSkgPSAxNjsgLyogRklYTUUgKi8KCiAgICAvKiA0MSAtIEJZVEU6IG51bWJlciBvZiBwYWdlcyBzdXBwb3J0ZWQgaW4gY3VycmVudCBtb2RlICovCiAgICBidWZmZXJbNDFdID0gMTsgLyogRklYTUUgKi8KCiAgICAvKgogICAgICogNDIgLSBCWVRFOiBudW1iZXIgb2Ygc2NhbiBsaW5lcyBhY3RpdmUKICAgICAqIFZhbHVlcyAoaGV4KToKICAgICAqIDAwID0gMjAwCiAgICAgKiAwMSA9IDM1MAogICAgICogMDIgPSA0MDAKICAgICAqIDAzID0gNDgwCiAgICAgKi8KICAgIGJ1ZmZlcls0Ml0gPSAzOyAvKiBGSVhNRSAqLwoKICAgIC8qIDQzIC0gQllURTogcHJpbWFyeSBjaGFyYWN0ZXIgYmxvY2sgKi8KICAgIGJ1ZmZlcls0M10gPSAwOyAvKiBGSVhNRSAqLwoKICAgIC8qIDQ0IC0gQllURTogc2Vjb25kYXJ5IGNoYXJhY3RlciBibG9jayAqLwogICAgYnVmZmVyWzQ0XSA9IDA7IC8qIEZJWE1FICovCgogICAgLyoKICAgICAqIDQ1IC0gQllURTogbWlzY2VsbGFuZW91cyBmbGFncwogICAgICogQml0czoKICAgICAqIDAgLSBhbGwgbW9kZXMgb24gYWxsIGRpc3BsYXlzIG9uCiAgICAgKiAxIC0gZ3JheSBzdW1taW5nIG9uCiAgICAgKiAyIC0gbW9ub2Nocm9tZSBkaXNwbGF5IGF0dGFjaGVkCiAgICAgKiAzIC0gZGVmYXVsdCBwYWxldHRlIGxvYWRpbmcgZGlzYWJsZWQKICAgICAqIDQgLSBjdXJzb3IgZW11bGF0aW9uIGVuYWJsZWQKICAgICAqIDUgLSAwID0gaW50ZW5zaXR5OyAxID0gYmxpbmtpbmcKICAgICAqIDYgLSBmbGF0LXBhbmVsIGRpc3BsYXkgaXMgYWN0aXZlCiAgICAgKiA3IC0gdW51c2VkICgwKQogICAgICovCiAgICAvKiBGSVhNRTogQ29ycmVjdCB2YWx1ZT8gKi8KICAgIGJ1ZmZlcls0NV0gPQogICAgICAgIChkYXRhLT5WR0FTZXR0aW5ncyAmIDB4MGYpIHwKICAgICAgICAoKGRhdGEtPk1vZGVPcHRpb25zICYgMSkgPDwgNCk7IC8qIGN1cnNvciBlbXVsYXRpb24gKi8KCiAgICAvKgogICAgICogNDYgLSBCWVRFOiBub24tVkdBIG1vZGUgc3VwcG9ydCAKICAgICAqIEJpdHM6CiAgICAgKiAgIDAgLSBCSU9TIHN1cHBvcnRzIGluZm9ybWF0aW9uIHJldHVybiBmb3IgYWRhcHRlciBpbnRlcmZhY2UKICAgICAqICAgMSAtIGFkYXB0ZXIgaW50ZXJmYWNlIGRyaXZlciByZXF1aXJlZAogICAgICogICAyIC0gMTYtYml0IFZHQSBncmFwaGljcyBwcmVzZW50CiAgICAgKiAgIDMgLSA9MSBNRkkgYXR0cmlidXRlcyBlbmFibGVkCiAgICAgKiAgICAgICA9MCBWR0EgYXR0cmlidXRlcyBlbmFibGVkCiAgICAgKiAgIDQgLSAxMzItY29sdW1uIG1vZGUgc3VwcG9ydGVkCiAgICAgKiA1LTcgLSByZXNlcnZlZAogICAgICovCiAgICAgYnVmZmVyWzQ2XSA9IDA7IC8qIEZJWE1FOiBjb3JyZWN0IHZhbHVlPyAqLwoKICAgICAvKiA0NyAtIEJZVEVbMl06IHJlc2VydmVkLCBzZXQgdG8gemVybyAqLwogICAgIG1lbXNldCggYnVmZmVyICsgNDcsIDAsIDIgKTsKCiAgICAgLyoKICAgICAgKiA0OSAtIEJZVEU6IHZpZGVvIG1lbW9yeSBhdmFpbGFibGUKICAgICAgKiBWYWx1ZXMgKGhleCk6CiAgICAgICogMDAgLSA2NEsKICAgICAgKiAwMSAtIDEyOEsKICAgICAgKiAwMiAtIDE5MksKICAgICAgKiAwMyAtIDI1NksKICAgICAgKi8KICAgICBidWZmZXJbNDldID0gKGRhdGEtPk1vZGVPcHRpb25zICYgMHg2MCkgPj4gNTsgLyogRklYTUUgKi8KCiAgICAgLyoKICAgICAgKiA1MCAtIEJZVEU6IHNhdmUgcG9pbnRlciBzdGF0ZSBmbGFncwogICAgICAqIEJpdHM6CiAgICAgICogICAwIC0gNTEyIGNoYXJhY3RlciBzZXQgYWN0aXZlCiAgICAgICogICAxIC0gZHluYW1pYyBzYXZlIGFyZWEgcHJlc2VudAogICAgICAqICAgMiAtIGFscGhhIGZvbnQgb3ZlcnJpZGUgYWN0aXZlCiAgICAgICogICAzIC0gZ3JhcGhpY3MgZm9udCBvdmVycmlkZSBhY3RpdmUKICAgICAgKiAgIDQgLSBwYWxldHRlIG92ZXJyaWRlIGFjdGl2ZQogICAgICAqICAgNSAtIERDQyBvdmVycmlkZSBhY3RpdmUKICAgICAgKiA2LTcgLSB1bnVzZWQgKDApCiAgICAgICovCiAgICAgYnVmZmVyWzUwXSA9IGhlYXAtPlN0YXRpY1NhdmVQb2ludGVyRmxhZ3M7CgogICAgIC8qCiAgICAgICogNTEgLSBCWVRFOiBkaXNwbGF5IGluZm9ybWF0aW9uIGFuZCBzdGF0dXMgCiAgICAgICogQml0czoKICAgICAgKiAgIDAgLSBmbGF0LXBhbmVsIGRpc3BsYXkgYXR0YWNoZWQKICAgICAgKiAgIDEgLSBmbGF0LXBhbmVsIGRpc3BsYXkgYWN0aXZlCiAgICAgICogICAyIC0gY29sb3IgZGlzcGxheQogICAgICAqIDMtNiAtIHJlc2VydmVkCiAgICAgICogICA3IC0gNjQweDQ4MCBmbGF0LXBhbmVsIGNhbiBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGggQ1JUCiAgICAgICovCiAgICAgYnVmZmVyWzUxXSA9IDQ7IC8qIEZJWE1FOiBjb3JyZWN0IHZhbHVlPyAqLwoKICAgICAvKiA1MiAtIEJZVEVbMTJdOiByZXNlcnZlZCwgc2V0IHRvIHplcm8gKi8KICAgICBtZW1zZXQoIGJ1ZmZlciArIDUyLCAwLCAxMiApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9HZXRIZWFwCiAqLwpJTlQxMF9IRUFQICpJTlQxMF9HZXRIZWFwKCB2b2lkICkKewogICAgc3RhdGljIElOVDEwX0hFQVAgKmhlYXBfcG9pbnRlciA9IDA7CgogICAgaWYgKCFoZWFwX3BvaW50ZXIpCiAgICB7CiAgICAgICAgV09SRCBzZWdtZW50OwogICAgICAgIGludCAgaTsKCiAgICAgICAgaGVhcF9wb2ludGVyID0gRE9TVk1fQWxsb2NEYXRhVU1CKCBzaXplb2YoSU5UMTBfSEVBUCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCiAgICAgICAgICAgIGhlYXBfcG9pbnRlci0+U3RhdGljTW9kZVN1cHBvcnRbaV0gPSAweGZmOyAvKiBGSVhNRSAqLwoKICAgICAgICBoZWFwX3BvaW50ZXItPlN0YXRpY1NjYW5saW5lU3VwcG9ydCA9IDc7ICAvKiBGSVhNRSAqLwogICAgICAgIGhlYXBfcG9pbnRlci0+U3RhdGljTnVtYmVyQ2hhckJsb2NrcyA9IDA7IC8qIEZJWE1FICovCiAgICAgICAgaGVhcF9wb2ludGVyLT5TdGF0aWNBY3RpdmVDaGFyQmxvY2tzID0gMDsgLyogRklYTUUgKi8KICAgICAgICBoZWFwX3BvaW50ZXItPlN0YXRpY01pc2NGbGFncyA9IDB4OGZmOyAgICAvKiBGSVhNRSAqLwogICAgICAgIGhlYXBfcG9pbnRlci0+U3RhdGljUmVzZXJ2ZWQxID0gMDsKICAgICAgICBoZWFwX3BvaW50ZXItPlN0YXRpY1NhdmVQb2ludGVyRmxhZ3MgPSAweDNmOyAvKiBGSVhNRSAqLwogICAgICAgIGhlYXBfcG9pbnRlci0+U3RhdGljUmVzZXJ2ZWQyID0gMDsKCiAgICAgICAgZm9yIChpPTA7IFRSVUU7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGhlYXBfcG9pbnRlci0+VmVzYU1vZGVMaXN0W2ldID0gSU5UMTBfbW9kZWxpc3RbaV0uTW9kZTsKICAgICAgICAgICAgaWYgKElOVDEwX21vZGVsaXN0W2ldLk1vZGUgPT0gMHhmZmZmKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBzdHJjcHkoIGhlYXBfcG9pbnRlci0+VmVzYU9FTU5hbWUsICJXSU5FIFNWR0EgQk9BUkQiICk7CiAgICAgICAgc3RyY3B5KCBoZWFwX3BvaW50ZXItPlZlc2FWZW5kb3JOYW1lLCAiV0lORSIgKTsKICAgICAgICBzdHJjcHkoIGhlYXBfcG9pbnRlci0+VmVzYVByb2R1Y3ROYW1lLCAiV0lORSBTVkdBIiApOwogICAgICAgIHN0cmNweSggaGVhcF9wb2ludGVyLT5WZXNhUHJvZHVjdFJldiwgIjIwMDMiICk7CiAgICAgICAgCiAgICAgICAgaGVhcF9wb2ludGVyLT5WZXNhQ3VycmVudE1vZGUgPSAwOyAvKiBJbml0aWFsaXplZCBsYXRlci4gKi8KICAgICAgICBoZWFwX3BvaW50ZXItPldpbmVIZWFwU2VnbWVudCA9IHNlZ21lbnQ7CiAgICB9CgogICAgcmV0dXJuIGhlYXBfcG9pbnRlcjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgSU5UMTBfU2V0VmlkZW9Nb2RlCiAqCiAqIENoYW5nZSBjdXJyZW50IHZpZGVvIG1vZGUgdG8gYW55IFZHQSBvciBWRVNBIG1vZGUuCiAqIFJldHVybnMgVFJVRSBpZiBtb2RlIGlzIHN1cHBvcnRlZC4KICoKICogTW9kZSBiaXRmaWVsZHM6CiAqIDAtNjogLi4gTW9kZSBudW1iZXIgKGNvbWJpbmVkIHdpdGggYml0IDgpLgogKiAgIDc6ID0wIENsZWFyIHNjcmVlbi4KICogICAgICA9MSBQcmVzZXJ2ZSBkaXNwbGF5IG1lbW9yeSBvbiBtb2RlIGNoYW5nZSAoVkdBIG1vZGVzKS4KICogICA4OiA9MCBWR0EgbW9kZS4KICogICAgICA9MSBWRVNBIG1vZGUuCiAqICAgOTogLi4gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KICogIDEwOiAuLiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLgogKiAgMTE6ID0wIFVzZSBkZWZhdWx0IHJlZnJlc2ggcmF0ZS4KICogICAgICA9MSBVc2UgdXNlciBzcGVjaWZpZWQgcmVmcmVzaCByYXRlLgogKiAgMTI6IC4uIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uCiAqICAxMzogLi4gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KICogIDE0OiA9MCBVc2Ugd2luZG93ZWQgZnJhbWUgYnVmZmVyIG1vZGVsLgogKiAgICAgID0xIFVzZSBsaW5lYXIgZnJhbWUgYnVmZmVyIG1vZGVsLgogKiAgMTU6ID0wIENsZWFyIHNjcmVlbi4KICogICAgICA9MSBQcmVzZXJ2ZSBkaXNwbGF5IG1lbW9yeSBvbiBtb2RlIGNoYW5nZSAoVkVTQSBtb2RlcykuCiAqLwpzdGF0aWMgQk9PTCBJTlQxMF9TZXRWaWRlb01vZGUoIEJJT1NEQVRBICpkYXRhLCBXT1JEIG1vZGUgKQp7CiAgICBjb25zdCBJTlQxMF9NT0RFICpwdHIgPSBJTlQxMF9GaW5kTW9kZSggbW9kZSApOwogICAgSU5UMTBfSEVBUCAqaGVhcCA9IElOVDEwX0dldEhlYXAoKTsKICAgIEJPT0wgY2xlYXJTY3JlZW4gPSBUUlVFOwoKICAgIGlmICghcHRyKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKgogICAgICogTGluZWFyIGZyYW1lYnVmZmVyIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgKi8KICAgIGlmIChtb2RlICYgMHg0MDAwKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKgogICAgICogQ2hlY2sgZm9yIFZHQSBhbmQgVkVTQSBwcmVzZXJ2ZSB2aWRlbyBtZW1vcnkgZmxhZy4KICAgICAqLwogICAgaWYgKChtb2RlICYgMHgwMDgwKSB8fCAobW9kZSAmIDB4ODAwMCkpCiAgICAgICAgY2xlYXJTY3JlZW4gPSBGQUxTRTsKCiAgICAvKgogICAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCBtYXNrIG91dCBmbGFncyBoZXJlIG9uIHB1cnBvc2UuCiAgICAgKi8KICAgIGhlYXAtPlZlc2FDdXJyZW50TW9kZSA9IG1vZGU7CiAgICBpZiAobW9kZSA8PSAweGZmKQogICAgICAgIGRhdGEtPlZpZGVvTW9kZSA9IG1vZGU7CiAgICBlbHNlCiAgICAgICAgZGF0YS0+VmlkZW9Nb2RlID0gMDsKCiAgICBpZiAocHRyLT5EZXB0aCA9PSAwKQogICAgewogICAgICAgIC8qIFRleHQgbW9kZS4gKi8KICAgICAgICBUUkFDRSggIlNldHRpbmcgJXMgJWR4JWQgdGV4dCBtb2RlIChzY3JlZW4gJXMpXG4iLCAKICAgICAgICAgICAgICAgSVNfVkVTQV9NT0RFKG1vZGUpID8gIlZFU0EiIDogIlZHQSIsIAogICAgICAgICAgICAgICBwdHItPldpZHRoLCBwdHItPkhlaWdodCwgCiAgICAgICAgICAgICAgIGNsZWFyU2NyZWVuID8gImNsZWFyZWQiIDogInByZXNlcnZlZCIgKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIGhlcmUgaWYgYWxwaGEgbW9kZSBjb3VsZCBiZSBzZXQuCiAgICAgICAgICovCiAgICAgICAgVkdBX1NldEFscGhhTW9kZSggcHRyLT5XaWR0aCwgcHRyLT5IZWlnaHQgKTsKCiAgICAgICAgZGF0YS0+VmlkZW9Db2x1bW5zID0gcHRyLT5XaWR0aDsKICAgICAgICBkYXRhLT5Sb3dzT25TY3JlZW5NaW51czEgPSBwdHItPkhlaWdodCAtIDE7CgogICAgICAgIGlmIChjbGVhclNjcmVlbikKICAgICAgICB7ICAgICAgICAgICAgCiAgICAgICAgICAgIFZHQV9DbGVhclRleHQoIDAsIDAsIHB0ci0+SGVpZ2h0LTEsIHB0ci0+V2lkdGgtMSwgMHgwNyApOwogICAgICAgICAgICBJTlQxMF9TZXRDdXJzb3JQb3MoIGRhdGEsIDAsIDAsIDAgKTsKICAgICAgICAgICAgVkdBX1NldEN1cnNvclBvcyggMCwgMCApOyAgICAgICAgICAgIAogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBHcmFwaGljcyBtb2RlLiAqLwogICAgICAgIFRSQUNFKCAiU2V0dGluZyAlcyAlZHglZHglZCBncmFwaGljcyBtb2RlIChzY3JlZW4gJXMpXG4iLCAKICAgICAgICAgICAgICAgSVNfVkVTQV9NT0RFKG1vZGUpID8gIlZFU0EiIDogIlZHQSIsIAogICAgICAgICAgICAgICBwdHItPldpZHRoLCBwdHItPkhlaWdodCwgcHRyLT5EZXB0aCwKICAgICAgICAgICAgICAgY2xlYXJTY3JlZW4gPyAiY2xlYXJlZCIgOiAicHJlc2VydmVkIiApOwoKICAgICAgICBpZiAoVkdBX1NldE1vZGUoIHB0ci0+V2lkdGgsIHB0ci0+SGVpZ2h0LCBwdHItPkRlcHRoICkpCiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgSU5UMTBfR2V0Q3Vyc29yUG9zCiAqLwpzdGF0aWMgdm9pZCBJTlQxMF9HZXRDdXJzb3JQb3MoQklPU0RBVEEqZGF0YSx1bnNpZ25lZCBwYWdlLHVuc2lnbmVkKlgsdW5zaWduZWQqWSkKewogICAgKlggPSBkYXRhLT5WaWRlb0N1cnNvclBvc1twYWdlKjJdOyAgIC8qIGNvbHVtbiAqLwogICAgKlkgPSBkYXRhLT5WaWRlb0N1cnNvclBvc1twYWdlKjIrMV07IC8qIHJvdyAqLwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9TZXRDdXJzb3JQb3MKICovCnN0YXRpYyB2b2lkIElOVDEwX1NldEN1cnNvclBvcyhCSU9TREFUQSpkYXRhLHVuc2lnbmVkIHBhZ2UsdW5zaWduZWQgWCx1bnNpZ25lZCBZKQp7CiAgICBkYXRhLT5WaWRlb0N1cnNvclBvc1twYWdlKjJdID0gWDsKICAgIGRhdGEtPlZpZGVvQ3Vyc29yUG9zW3BhZ2UqMisxXSA9IFk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIElOVDEwX0luaXRpYWxpemVWaWRlb01vZGUKICoKICogVGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgVkdBIGVtdWxhdGlvbiBpcyBzZXQgdG8gdGhlCiAqIGRlZmF1bHQgdGV4dCBtb2RlLgogKi8Kc3RhdGljIHZvaWQgSU5UMTBfSW5pdGlhbGl6ZVZpZGVvTW9kZSggQklPU0RBVEEgKmRhdGEgKQp7CiAgc3RhdGljIEJPT0wgYWxyZWFkeV9pbml0aWFsaXplZCA9IEZBTFNFOwogIHVuc2lnbmVkICAgIHdpZHRoOwogIHVuc2lnbmVkICAgIGhlaWdodDsKCiAgaWYoYWxyZWFkeV9pbml0aWFsaXplZCkKICAgIHJldHVybjsKICBhbHJlYWR5X2luaXRpYWxpemVkID0gVFJVRTsKCiAgVkdBX0luaXRBbHBoYU1vZGUoJndpZHRoLCAmaGVpZ2h0KTsKCiAgLyoKICAgKiBGSVhNRTogQWRkIG1vcmUgbWFwcGluZ3MgYmV0d2VlbiBpbml0aWFsIHNpemUgYW5kCiAgICogICAgICAgIHRleHQgbW9kZXMuCiAgICovCiAgaWYgKHdpZHRoID49IDgwICYmIGhlaWdodCA+PSAyNSkKICAgICAgSU5UMTBfU2V0VmlkZW9Nb2RlKCBkYXRhLCAweDAzICk7CiAgZWxzZQogICAgICBJTlQxMF9TZXRWaWRlb01vZGUoIGRhdGEsIDB4MDEgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIElOVDEwX0hhbmRsZVZFU0EKICoKICogSGFuZGxlciBmb3IgVkVTQSBmdW5jdGlvbnMgKGludDEwIGZ1bmN0aW9uIDB4NGYpLgogKi8Kc3RhdGljIHZvaWQgSU5UMTBfSGFuZGxlVkVTQSggQ09OVEVYVDg2ICpjb250ZXh0ICkKewogICAgQklPU0RBVEEgKmRhdGEgPSBET1NWTV9CaW9zRGF0YSgpOwoKICAgIHN3aXRjaChBTF9yZWcoY29udGV4dCkpIHsKCiAgICBjYXNlIDB4MDA6IC8qIFJFVFVSTiBDT05UUk9MTEVSIElORk9STUFUSU9OICovCiAgICAgICAgVFJBQ0UoICJWRVNBIFJFVFVSTiBDT05UUk9MTEVSIElORk9STUFUSU9OXG4iICk7CiAgICAgICAgewogICAgICAgICAgICBCWVRFICpwdHIgPSBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPlNlZ0VzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkVkaSk7CiAgICAgICAgICAgIElOVDEwX0ZpbGxDb250cm9sbGVySW5mb3JtYXRpb24oIHB0ciApOwogICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4NGYgKTsKICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAwICk7IC8qIDB4MDAgPSBzdWNjZXNzZnVsIDB4MDEgPSBmYWlsZWQgKi8KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAxOiAvKiBSRVRVUk4gTU9ERSBJTkZPUk1BVElPTiAqLwogICAgICAgIFRSQUNFKCAiVkVTQSBSRVRVUk4gTU9ERSBJTkZPUk1BVElPTiAlMDR4XG4iLCBDWF9yZWcoY29udGV4dCkgKTsKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBfTW9kZUluZm9CbG9jayAqcHRyID0gQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPlNlZ0VzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+RWRpKTsKICAgICAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAweDRmICk7CiAgICAgICAgICAgIGlmIChJTlQxMF9GaWxsTW9kZUluZm9ybWF0aW9uKCBwdHIsIENYX3JlZyhjb250ZXh0KSApKQogICAgICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAwICk7IC8qIHN0YXR1czogc3VjY2VzcyAqLwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDEgKTsgLyogc3RhdHVzOiBmYWlsZWQgKi8KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAyOiAvKiBTRVQgU3VwZXJWR0EgVklERU8gTU9ERSAqLwogICAgICAgIFRSQUNFKCAiU2V0IFZFU0EgdmlkZW8gbW9kZSAlMDR4XG4iLCBCWF9yZWcoY29udGV4dCkgKTsKICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4NGYgKTsgLyogZnVuY3Rpb24gc3VwcG9ydGVkICovCiAgICAgICAgaWYgKElOVDEwX1NldFZpZGVvTW9kZSggZGF0YSwgQlhfcmVnKGNvbnRleHQpICkpCiAgICAgICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiBzdWNjZXNzICovCiAgICAgICAgZWxzZQogICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDEgKTsgLyogZmFpbGVkICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAzOiAvKiBWRVNBIFN1cGVyVkdBIEJJT1MgLSBHRVQgQ1VSUkVOVCBWSURFTyBNT0RFICovCiAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAweDRmICk7CiAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAwICk7CiAgICAgICAgU0VUX0JYKCBjb250ZXh0LCBJTlQxMF9HZXRIZWFwKCktPlZlc2FDdXJyZW50TW9kZSApOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNDogLyogVkVTQSBTdXBlclZHQSBCSU9TIC0gU0FWRS9SRVNUT1JFIFN1cGVyVkdBIFZJREVPIFNUQVRFICovCiAgICAgICAgRVJSKCJWRVNBIFNBVkUvUkVTVE9SRSBWaWRlbyBTdGF0ZSAtIE5vdCBJbXBsZW1lbnRlZFxuIik7CiAgICAgICAgLyogQUxfcmVnKGNvbnRleHQpID0gMHg0ZjsgPSBzdXBwb3J0ZWQgc28gbm90IHNldCBzaW5jZSBub3QgaW1wbGVtZW50ZWQgKi8KICAgICAgICAvKiBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBpbnN0ZWFkID8gKi8KICAgICAgICAvKiBBSF9yZWcoY29udGV4dCA9IDB4MDE7ICBub3QgaW1wbGVtZW50ZWQgc28ganVzdCBmYWlsICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA1OiAvKiBWRVNBIFN1cGVyVkdBIEJJT1MgLSBDUFUgVklERU8gTUVNT1JZIENPTlRST0wgKi8KICAgICAgICAvKgogICAgICAgICAqIFRoaXMgc3ViZnVuY3Rpb24gc3VwcG9ydHMgb25seSBXaW5kb3cgQSAoQkxfcmVnID09IDApIGFuZAogICAgICAgICAqIGlzIGFzc3VtZXMgdGhhdCB3aW5kb3cgZ3JhbnVsYXJpdHkgaXMgNjRrLgogICAgICAgICAqLwogICAgICAgIHN3aXRjaChCSF9yZWcoY29udGV4dCkpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIHNlbGVjdCB2aWRlbyBtZW1vcnkgd2luZG93ICovCiAgICAgICAgICAgIFNFVF9BTCggY29udGV4dCwgMHg0ZiApOyAvKiBmdW5jdGlvbiBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgaWYoQkxfcmVnKGNvbnRleHQpID09IDApIHsKICAgICAgICAgICAgICAgIFZHQV9TZXRXaW5kb3dTdGFydChEWF9yZWcoY29udGV4dCkgKiA2NCAqIDEwMjQpOwogICAgICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAwICk7IC8qIHN0YXR1czogc3VjY2Vzc2Z1bCAqLwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMSApOyAvKiBzdGF0dXM6IGZhaWxlZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDE6IC8qIGdldCB2aWRlbyBtZW1vcnkgd2luZG93ICovCiAgICAgICAgICAgIFNFVF9BTCggY29udGV4dCwgMHg0ZiApOyAvKiBmdW5jdGlvbiBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgaWYoQkxfcmVnKGNvbnRleHQpID09IDApIHsKICAgICAgICAgICAgICAgIFNFVF9EWCggY29udGV4dCwgVkdBX0dldFdpbmRvd1N0YXJ0KCkgLyA2NCAvIDEwMjQgKTsKICAgICAgICAgICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiBzdGF0dXM6IHN1Y2Nlc3NmdWwgKi8KICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDEgKTsgLyogc3RhdHVzOiBmYWlsZWQgKi8KICAgICAgICAgICAgYnJlYWs7CglkZWZhdWx0OgogICAgICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgxMCApOwoJfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNjogLyogVkVTQSBHRVQvU0VUIExPR0lDQUwgU0NBTiBMSU5FIExFTkdUSCAqLwogICAgICAgIEVSUigiVkVTQSBHRVQvU0VUIExPR0lDQUwgU0NBTiBMSU5FIExFTkdUSCAtIE5vdCBJbXBsZW1lbnRlZFxuIik7CiAgICAgICAgLyogQUxfcmVnKGNvbnRleHQpID0gMHg0ZjsgPSBzdXBwb3J0ZWQgc28gbm90IHNldCBzaW5jZSBub3QgaW1wbGVtZW50ZWQgKi8KICAgICAgICAvKiBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBpbnN0ZWFkID8gKi8KICAgICAgICAvKiBBSF9yZWcoY29udGV4dCA9IDB4MDAxOyBub3QgaW1wbGVtZW50ZWQgc28ganVzdCBmYWlsICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA3OiAvKiBHRVQvU0VUIERJU1BMQVkgU1RBUlQgKi8KICAgICAgICBFUlIoIlZFU0EgR0VUL1NFVCBESVNQTEFZIFNUQVJUIC0gTm90IEltcGxlbWVudGVkXG4iKTsKICAgICAgICAvKiBBTF9yZWcoY29udGV4dCkgPSAweDRmOyA9IHN1cHBvcnRlZCBzbyBub3Qgc2V0IHNpbmNlIG5vdCBpbXBsZW1lbnRlZCAqLwogICAgICAgIC8qIG1heWJlIHdlIHNob3VsZCBkbyB0aGlzIGluc3RlYWQgPyAqLwogICAgICAgIC8qIEFIX3JlZyhjb250ZXh0ID0gMHgwMDE7IG5vdCBpbXBsZW1lbnRlZCBzbyBqdXN0IGZhaWwgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDg6IC8qIEdFVC9TRVQgREFDIFBBTEVUVEUgQ09OVFJPTCAqLwogICAgICAgIEVSUigiVkVTQSBHRVQvU0VUIERBQyBQQUxFVFRFIENPTlRST0wtIE5vdCBJbXBsZW1lbnRlZFxuIik7CiAgICAgICAgLyogQUxfcmVnKGNvbnRleHQpID0gMHg0ZjsgPSBzdXBwb3J0ZWQgc28gbm90IHNldCBzaW5jZSBub3QgaW1wbGVtZW50ZWQgKi8KICAgICAgICAvKiBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBpbnN0ZWFkID8gKi8KICAgICAgICAvKiBBSF9yZWcoY29udGV4dCA9IDB4MDAxOyBub3QgaW1wbGVtZW50ZWQgc28ganVzdCBmYWlsICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA5OiAvKiBTRVQgUEFMRVRURSBFTlRSSUVTICovCiAgICAgICAgRklYTUUoIlZFU0EgU2V0IHBhbGV0dGUgZW50cmllcyAtIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDBhOiAvKiBHRVQgUFJPVEVDVEVELU1PREUgQ09ERSAqLwogICAgICAgIEZJWE1FKCJWRVNBIEdldCBwcm90ZWN0ZWQtbW9kZSBjb2RlIC0gbm90IGltcGxlbWVudGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MTA6IC8qIERpc3BsYXkgUG93ZXIgTWFuYWdlbWVudCBFeHRlbnNpb25zICovCiAgICAgICAgRklYTUUoIlZFU0EgRGlzcGxheSBQb3dlciBNYW5hZ2VtZW50IEV4dGVuc2lvbnMgLSBub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHhlZjogIC8qIGdldCB2aWRlbyBtb2RlIGZvciBoZXJjdWxlcy1jb21wYXRpYmxlcyAgICovCiAgICAgICAgLyogVGhlcmUncyBubyByZWFzb24gdG8gcmVhbGx5IHN1cHBvcnQgdGhpcyAgKi8KICAgICAgICAvKiBpcyB0aGVyZT8uLi4uLi4uLi4uLi4uLi4uLi4uLihBLkMuKSAgICAgICAqLwogICAgICAgIFRSQUNFKCJKdXN0IHJlcG9ydCB0aGUgdmlkZW8gbm90IGhlcmN1bGVzIGNvbXBhdGlibGVcbiIpOwogICAgICAgIFNFVF9EWCggY29udGV4dCwgMHhmZmZmICk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweGZmOiAvKiBUdXJuIFZFU0EgT04vT0ZGICovCiAgICAgICAgLyogSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJWRVNBIEZ1bmN0aW9uICgweCV4KSAtIE5vdCBTdXBwb3J0ZWRcbiIsIEFIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkgICAgRE9TVk1fSW50MTBIYW5kbGVyCiAqCiAqIEhhbmRsZXIgZm9yIGludCAxMGggKHZpZGVvKS4KICoKICogTk9URToKICogICAgTW9zdCBJTlQgMTAgZnVuY3Rpb25zIGZvciB0ZXh0LW1vZGUsIENHQSwgRUdBLCBhbmQgVkdBIGNhcmRzCiAqICAgIGFyZSBwcmVzZW50IGluIHRoaXMgbGlzdC4gKFNWR0EgYW5kIFhHQSBhcmUgbm90KSBUaGF0IGlzIG5vdAogKiAgICB0byBzYXkgdGhhdCBhbGwgdGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQsIGJ1dCBpZgogKiAgICBhbnlvbmUgaXMgYnJhaW4tZGFtYWdlZCBlbm91Z2ggdG8gd2FudCB0byBlbXVsYXRlIG9uZSBvZiB0aGVzZQogKiAgICBiZWFzdHMgdGhlbiB0aGlzIHNob3VsZCBnZXQgeW91IHN0YXJ0ZWQuCiAqCiAqIE5PVEU6CiAqICAgIFNldmVyYWwgY29tbW9uIGdyYXBoaWNhbCBleHRlbnNpb25zIHVzZWQgYnkgTWljcm9zb2Z0IGhvb2sKICogICAgb2ZmIG9mIGhlcmUuIEkgaGF2ZSAqbm90KiBhZGRlZCB0aGVtIHRvIHRoaXMgbGlzdCAoeWV0KS4gVGhleQogKiAgICBpbmNsdWRlOgogKgogKiAgICBNU0hFUkMuQ09NIC0gTW9yZSBmdW5jdGlvbmFsaXR5IGZvciBIZXJjdWxlcyBjYXJkcy4KICogICAgRUdBLlNZUyAoYWxzbyBNT1VTRS5DT00pIC0gTW9yZSBmb3IgRUdBIGNhcmRzLgogKgogKiAgICBZZXMsIE1TIGFsc28gYWRkZWQgdGhpcyBzdXBwb3J0IGludG8gdGhlaXIgbW91c2UgZHJpdmVyLiBEb24ndAogKiAgICBhc2sgbWUsIEkgZG9uJ3Qgd29yayBmb3IgdGhlbS4KICoKICogSm9zZXBoIFByYW5ldmljaCAtIDkvOTgKICoKICogIEplc3MgSGFhcyAyLzk5CiAqCUFkZGVkIHN1cHBvcnQgZm9yIFZlc2EuIEl0IGlzIG5vdCBjb21wbGV0ZSBidXQgaXMgYSBzdGFydC4KICoJTk9URTogSW0gbm90IHN1cmUgaWYgSSBkaWQgYWxsIHRoaXMgcmlnaHQgb3IgaWYgYW55IG9mIGl0IHdvcmtzLgogKglDdXJyZW50bHkgSSBkb24ndCBoYXZlIGEgcHJvZ3JhbSB0aGF0IHVzZXMgVmVzYSB0aGF0IGFjdHVhbGx5IGdldHMgZmFyCiAqCWVub3VnaCB3aXRob3V0IGNyYXNoaW5nIHRvIGRvIHZlc2Egc3R1ZmYuCiAqCiAqICAgICAgQWRkZWQgYWRkaXRpb25hbCB2Z2EgZ3JhcGhpYyBzdXBwb3J0IC0gMy85OQogKi8Kdm9pZCBXSU5BUEkgRE9TVk1fSW50MTBIYW5kbGVyKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiAgICBCSU9TREFUQSAqZGF0YSA9IERPU1ZNX0Jpb3NEYXRhKCk7CgogICAgSU5UMTBfSW5pdGlhbGl6ZVZpZGVvTW9kZSggZGF0YSApOwoKICAgIHN3aXRjaChBSF9yZWcoY29udGV4dCkpIHsKCiAgICBjYXNlIDB4MDA6IC8qIFNFVCBWSURFTyBNT0RFICovCiAgICAgICAgVFJBQ0UoICJTZXQgVkdBIHZpZGVvIG1vZGUgJTAyeFxuIiwgQUxfcmVnKGNvbnRleHQpICk7CiAgICAgICAgaWYgKCFJTlQxMF9TZXRWaWRlb01vZGUoIGRhdGEsIEFMX3JlZyhjb250ZXh0KSApKQogICAgICAgICAgICBGSVhNRSggIlVuc3VwcG9ydGVkIFZHQSB2aWRlbyBtb2RlIHJlcXVlc3RlZDogJSN4XG4iLCAKICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSApOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMTogLyogU0VUIENVUlNPUiBTSEFQRSAqLwogICAgICAgIFRSQUNFKCJTZXQgQ3Vyc29yIFNoYXBlIHN0YXJ0ICVkIGVuZCAlZCBvcHRpb25zICVkXG4iLAogICAgICAgICAgICAgIENIX3JlZyhjb250ZXh0KSAmIDB4MWYsCiAgICAgICAgICAgICAgQ0xfcmVnKGNvbnRleHQpICYgMHgxZiwKICAgICAgICAgICAgICBDSF9yZWcoY29udGV4dCkgJiAweGUwKTsKICAgICAgICBkYXRhLT5WaWRlb0N1cnNvclR5cGUgPSBDWF9yZWcoY29udGV4dCk7IC8qIGRpcmVjdCBjb3B5ICovCglWR0FfU2V0Q3Vyc29yU2hhcGUoQ0hfcmVnKGNvbnRleHQpLCBDTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMjogLyogU0VUIENVUlNPUiBQT1NJVElPTiAqLwogICAgICAgIC8qIEJIID0gUGFnZSBOdW1iZXIgKi8gLyogTm90IHN1cHBvcnRlZCAqLwogICAgICAgIC8qIERIID0gUm93ICovIC8qIDAgaXMgbGVmdCAqLwogICAgICAgIC8qIERMID0gQ29sdW1uICovIC8qIDAgaXMgdG9wICovCiAgICAgICAgSU5UMTBfU2V0Q3Vyc29yUG9zKGRhdGEsQkhfcmVnKGNvbnRleHQpLERMX3JlZyhjb250ZXh0KSxESF9yZWcoY29udGV4dCkpOwogICAgICAgIGlmIChCSF9yZWcoY29udGV4dCkpCiAgICAgICAgewogICAgICAgICAgIEZJWE1FKCJTZXQgQ3Vyc29yIFBvc2l0aW9uOiBDYW5ub3Qgc2V0IHRvIHBhZ2UgJWRcbiIsCiAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICBWR0FfU2V0Q3Vyc29yUG9zKERMX3JlZyhjb250ZXh0KSwgREhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICBUUkFDRSgiU2V0IEN1cnNvciBQb3NpdGlvbjogJWQvJWRcbiIsIERMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICBESF9yZWcoY29udGV4dCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDM6IC8qIEdFVCBDVVJTT1IgUE9TSVRJT04gQU5EIFNJWkUgKi8KICAgICAgICB7CiAgICAgICAgICB1bnNpZ25lZCByb3csIGNvbDsKCiAgICAgICAgICBUUkFDRSgiR2V0IGN1cnNvciBwb3NpdGlvbiBhbmQgc2l6ZSAocGFnZSAlZClcbiIsIEJIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICBTRVRfQ1goIGNvbnRleHQsIGRhdGEtPlZpZGVvQ3Vyc29yVHlwZSApOwogICAgICAgICAgSU5UMTBfR2V0Q3Vyc29yUG9zKGRhdGEsQkhfcmVnKGNvbnRleHQpLCZjb2wsJnJvdyk7CiAgICAgICAgICBTRVRfREgoIGNvbnRleHQsIHJvdyApOwogICAgICAgICAgU0VUX0RMKCBjb250ZXh0LCBjb2wgKTsKICAgICAgICAgIFRSQUNFKCJDdXJzb3IgUG9zaXRpb246ICVkLyVkXG4iLCBETF9yZWcoY29udGV4dCksIERIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNDogLyogUkVBRCBMSUdIVCBQRU4gUE9TSVRJT04gKi8KICAgICAgICBGSVhNRSgiUmVhZCBMaWdodCBQZW4gUG9zaXRpb24gLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDAgKTsgLyogTm90IGRvd24gKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDU6IC8qIFNFTEVDVCBBQ1RJVkUgRElTUExBWSBQQUdFICovCiAgICAgICAgRklYTUUoIlNlbGVjdCBBY3RpdmUgRGlzcGxheSBQYWdlICglZCkgLSBOb3QgU3VwcG9ydGVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGRhdGEtPlZpZGVvQ3VyUGFnZSA9IEFMX3JlZyhjb250ZXh0KTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDY6IC8qIFNDUk9MTCBVUCBXSU5ET1cgKi8KICAgICAgICAvKiBBTCA9IExpbmVzIHRvIHNjcm9sbCAqLwogICAgICAgIC8qIEJIID0gQXR0cmlidXRlICovCiAgICAgICAgLyogQ0gsQ0wgPSByb3csIGNvbCB1cHBlci1sZWZ0ICovCiAgICAgICAgLyogREgsREwgPSByb3csIGNvbCBsb3dlci1yaWdodCAqLwogICAgICAgIFRSQUNFKCJTY3JvbGwgVXAgV2luZG93ICVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwoKICAgICAgICBpZiAoQUxfcmVnKGNvbnRleHQpID09IDApCiAgICAgICAgICAgIFZHQV9DbGVhclRleHQoIENIX3JlZyhjb250ZXh0KSwgQ0xfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBESF9yZWcoY29udGV4dCksIERMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpICk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBWR0FfU2Nyb2xsVXBUZXh0KCBDSF9yZWcoY29udGV4dCksIENMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREhfcmVnKGNvbnRleHQpLCBETF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSwgQkhfcmVnKGNvbnRleHQpICk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA3OiAvKiBTQ1JPTEwgRE9XTiBXSU5ET1cgKi8KICAgICAgICAvKiBBTCA9IExpbmVzIHRvIHNjcm9sbCAqLwogICAgICAgIC8qIEJIID0gQXR0cmlidXRlICovCiAgICAgICAgLyogQ0gsQ0wgPSByb3csIGNvbCB1cHBlci1sZWZ0ICovCiAgICAgICAgLyogREgsREwgPSByb3csIGNvbCBsb3dlci1yaWdodCAqLwogICAgICAgIFRSQUNFKCJTY3JvbGwgRG93biBXaW5kb3cgJWRcbiIsIEFMX3JlZyhjb250ZXh0KSk7CgogICAgICAgIGlmIChBTF9yZWcoY29udGV4dCkgPT0gMCkKICAgICAgICAgICAgVkdBX0NsZWFyVGV4dCggQ0hfcmVnKGNvbnRleHQpLCBDTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERIX3JlZyhjb250ZXh0KSwgRExfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCSF9yZWcoY29udGV4dCkgKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFZHQV9TY3JvbGxEb3duVGV4dCggQ0hfcmVnKGNvbnRleHQpLCBDTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREhfcmVnKGNvbnRleHQpLCBETF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpLCBCSF9yZWcoY29udGV4dCkgKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDg6IC8qIFJFQUQgQ0hBUkFDVEVSIEFORCBBVFRSSUJVVEUgQVQgQ1VSU09SIFBPU0lUSU9OICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoQkhfcmVnKGNvbnRleHQpKSAvKiBXcml0ZSB0byBkaWZmZXJlbnQgcGFnZSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGSVhNRSgiUmVhZCBjaGFyYWN0ZXIgYW5kIGF0dHJpYnV0ZSBhdCBjdXJzb3IgcG9zaXRpb24gLSIKICAgICAgICAgICAgICAgICAgICAgICIgQ2FuJ3QgcmVhZCBmcm9tIG5vbi0wIHBhZ2VcbiIpOwogICAgICAgICAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAnICcgKTsgLyogVGhhdCBwYWdlIGlzIGJsYW5rICovCiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgQllURSBhc2NpaSwgYXR0cjsKICAgICAgICAgICAgICAgIFRSQUNFKCJSZWFkIENoYXJhY3RlciBhbmQgQXR0cmlidXRlIGF0IEN1cnNvciBQb3NpdGlvblxuIik7CiAgICAgICAgICAgICAgICBWR0FfR2V0Q2hhcmFjdGVyQXRDdXJzb3IoJmFzY2lpLCAmYXR0cik7CiAgICAgICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIGFzY2lpICk7CiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIGF0dHIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDk6IC8qIFdSSVRFIENIQVJBQ1RFUiBBTkQgQVRUUklCVVRFIEFUIENVUlNPUiBQT1NJVElPTiAqLwogICAgY2FzZSAweDBhOiAvKiBXUklURSBDSEFSQUNURVIgT05MWSBBVCBDVVJTT1IgUE9TSVRJT04gKi8KICAgICAgIC8qIEFMID0gQ2hhcmFjdGVyIHRvIGRpc3BsYXkuICovCiAgICAgICAvKiBCSCA9IFBhZ2UgTnVtYmVyICovIC8qIFdlIGNhbid0IHdyaXRlIHRvIG5vbi0wIHBhZ2VzLCB5ZXQuICovCiAgICAgICAvKiBCTCA9IEF0dHJpYnV0ZSAvIENvbG9yICovCiAgICAgICAvKiBDWCA9IFRpbWVzIHRvIFdyaXRlIENoYXIgKi8KICAgICAgIC8qIE5vdGUgaGVyZSB0aGF0IHRoZSBjdXJzb3IgaXMgbm90IGFkdmFuY2VkLiAqLwogICAgICAgewogICAgICAgICAgIHVuc2lnbmVkIHJvdywgY29sOwoKICAgICAgICAgICBJTlQxMF9HZXRDdXJzb3JQb3MoZGF0YSxCSF9yZWcoY29udGV4dCksJmNvbCwmcm93KTsKICAgICAgICAgICBWR0FfV3JpdGVDaGFycyhjb2wsIHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKEFIX3JlZyhjb250ZXh0KSA9PSAweDA5KSA/IEJMX3JlZyhjb250ZXh0KSA6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgaWYgKENYX3JlZyhjb250ZXh0KSA+IDEpCiAgICAgICAgICAgICAgVFJBQ0UoIldyaXRlIENoYXJhY3RlciVzIGF0IEN1cnNvciBQb3NpdGlvbiAoUmVwLiAlZCk6ICVjXG4iLAogICAgICAgICAgICAgICAgICAgIChBSF9yZWcoY29udGV4dCkgPT0gMHgwOSkgPyAiIGFuZCBBdHRyaWJ1dGUiIDogIiIsCiAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBUUkFDRSgiV3JpdGUgQ2hhcmFjdGVyJXMgYXQgQ3Vyc29yIFBvc2l0aW9uOiAlY1xuIiwKICAgICAgICAgICAgICAgICAgICAoQUhfcmVnKGNvbnRleHQpID09IDB4MDkpID8gIiBhbmQgQXR0cmlidXRlIiA6ICIiLAogICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYjoKICAgICAgICBzd2l0Y2ggQkhfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIFNFVCBCQUNLR1JPVU5EL0JPUkRFUiBDT0xPUiAqLwogICAgICAgICAgICAvKiBJbiB0ZXh0IG1vZGVzLCB0aGlzIHNldHMgb25seSB0aGUgYm9yZGVyLi4uICovCiAgICAgICAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgaW50ZXJydXB0IGxpc3QgYW5kIG9uZSBvZiBteSBib29rcy4gKi8KICAgICAgICAgICAgLyogRnVubnkgdGhvdWdoIHRoYXQgQmV5b25kIFpvcmsgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCBpdAogICAgICAgICAgICAgICBhbHNvIHNldHMgdXAgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBhdHRyaWJ1dGVzIGZvciBjbGVhcnMKICAgICAgICAgICAgICAgYW5kIHNjcm9sbHMuLi4gKi8KICAgICAgICAgICAgLyogQmVhciBpbiBtaW5kIGhlcmUgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UsCiAgICAgICAgICAgICAgIGFwcGFyZW50bHksIHRoZSBmb3JlZ3JvdW5kIG9yIGF0dHJpYnV0ZSBvZiB0aGUgYmFja2dyb3VuZAogICAgICAgICAgICAgICB3aXRoIHRoaXMgY2FsbCwgc28gd2Ugc2hvdWxkIGNoZWNrIGZpcnN0IHRvIHNlZSB3aGF0IHRoZQogICAgICAgICAgICAgICBmb3JlZ3JvdW5kIGFscmVhZHkgaXMuLi4gRklYTUUgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBCYWNrZ3JvdW5kL0JvcmRlciBDb2xvcjogJWQvJWRcbiIsCiAgICAgICAgICAgICAgIEJIX3JlZyhjb250ZXh0KSwgQkxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBTRVQgUEFMRVRURSAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFBhbGV0dGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MGIgQkggPSAweCV4IC0gVW5rbm93blxuIiwKICAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYzogLyogV1JJVEUgR1JBUEhJQ1MgUElYRUwgKi8KICAgICAgICAvKiBOb3QgaW4gZ3JhcGhpY3MgbW9kZSwgY2FuIGlnbm9yZSB3L28gZXJyb3IgKi8KICAgICAgICBGSVhNRSgiV3JpdGUgR3JhcGhpY3MgUGl4ZWwgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MGQ6IC8qIFJFQUQgR1JBUEhJQ1MgUElYRUwgKi8KICAgICAgICAvKiBOb3QgaW4gZ3JhcGhpY3MgbW9kZSwgY2FuIGlnbm9yZSB3L28gZXJyb3IgKi8KICAgICAgICBGSVhNRSgiUmVhZCBHcmFwaGljcyBQaXhlbCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwZTogLyogVEVMRVRZUEUgT1VUUFVUICovCiAgICAgICAgVFJBQ0UoIlRlbGV0eXBlIE91dHB1dFxuIik7CiAgICAgICAgRE9TVk1fUHV0Q2hhcihBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwZjogLyogR0VUIENVUlJFTlQgVklERU8gTU9ERSAqLwogICAgICAgIFRSQUNFKCJHZXQgY3VycmVudCB2aWRlbyBtb2RlOiAtPiBtb2RlICVkLCBjb2x1bW5zICVkXG4iLCBkYXRhLT5WaWRlb01vZGUsIGRhdGEtPlZpZGVvQ29sdW1ucyk7CiAgICAgICAgLyogTm90ZTogVGhpcyBzaG91bGQgbm90IGJlIGEgY29uc3RhbnQgdmFsdWUuICovCiAgICAgICAgU0VUX0FMKCBjb250ZXh0LCBkYXRhLT5WaWRlb01vZGUgKTsKICAgICAgICBTRVRfQUgoIGNvbnRleHQsIGRhdGEtPlZpZGVvQ29sdW1ucyApOwogICAgICAgIFNFVF9CSCggY29udGV4dCwgMCApOyAvKiBEaXNwbGF5IHBhZ2UgMCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxMDoKICAgICAgICBzd2l0Y2ggQUxfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIFNFVCBTSU5HTEUgUEFMRVRURSBSRUdJU1RFUiAtIEEuQy4gKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBTaW5nbGUgUGFsZXR0ZSBSZWdpc3RlciAtIFJlZyAweDAleCBWYWx1ZSAweDAleFxuIiwKCQlCTF9yZWcoY29udGV4dCksQkhfcmVnKGNvbnRleHQpKTsKCQkvKiBCSCBpcyB0aGUgdmFsdWUgIEJMIGlzIHRoZSByZWdpc3RlciAqLwoJCVZHQV9TZXRDb2xvcjE2KChpbnQpQkxfcmVnKGNvbnRleHQpLChpbnQpQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBTRVQgQk9SREVSIChPVkVSU0NBTikgKi8KICAgICAgICAgICAgLyogVGV4dCB0ZXJtaW5hbHMgaGF2ZSBubyBvdmVyc2NhbiAqLwoJICAgIC8qIEknbSBzZXR0aW5nIGl0IGFueXdheS4gLSBBLkMuICAgKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBCb3JkZXIgKE92ZXJzY2FuKSAtIElnbm9yZWQgYnV0IHNldC5cbiIpOwoJICAgIFZHQV9TZXRDb2xvcjE2KDE2LChpbnQpQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAyOiAvKiBTRVQgQUxMIFBBTEVUVEUgUkVHSVNURVJTIC0gQS5DLiovCiAgICAgICAgICAgIFRSQUNFKCJTZXQgYWxsIHBhbGV0dGUgcmVnaXN0ZXJzXG4iKTsKCQkvKiBFUzpEWCBwb2ludHMgdG8gYSAxNyBieXRlIHRhYmxlIG9mIGNvbG9ycyAqLwoJCS8qIE5vIHJldHVybiBkYXRhIGxpc3RlZCAqLwoJCS8qIEknbGwgaGF2ZSB0byB1cGRhdGUgbXkgdGFibGUgYW5kIHRoZSBkZWZhdWx0IHBhbGV0dGUgKi8KICAgICAgICAgICAgICAgVkdBX1NldDE2UGFsZXR0ZShDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgY29udGV4dC0+U2VnRXMsIGNvbnRleHQtPkVkeCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDM6IC8qIFRPR0dMRSBJTlRFTlNJVFkvQkxJTktJTkcgQklUICovCiAgICAgICAgICAgIEZJWE1FKCJUb2dnbGUgSW50ZW5zaXR5L0JsaW5raW5nIEJpdCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDc6IC8qIEdFVCBJTkRJVklEVUFMIFBBTEVUVEUgUkVHSVNURVIgIC0gQS5DLiovCiAgICAgICAgICAgIFRSQUNFKCJHZXQgSW5kaXZpZHVhbCBQYWxldHRlIFJlZ2lzdGVyIDB4MCV4XG4iLEJMX3JlZyhjb250ZXh0KSk7CgkJLyogQkwgaXMgcmVnaXN0ZXIgdG8gcmVhZCBbIDAtMTUgXSBCSCBpcyByZXR1cm4gdmFsdWUgKi8KCSAgICAgICAgU0VUX0JIKCBjb250ZXh0LCBWR0FfR2V0Q29sb3IxNigoaW50KUJMX3JlZyhjb250ZXh0KSkgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA4OiAvKiBSRUFEIE9WRVJTQ0FOIChCT1JERVIgQ09MT1IpIFJFR0lTVEVSICAtIEEuQy4gKi8KICAgICAgICAgICAgVFJBQ0UoIlJlYWQgT3ZlcnNjYW4gKEJvcmRlciBDb2xvcikgUmVnaXN0ZXJcbiIpOwoJICAgICAgICBTRVRfQkgoIGNvbnRleHQsIFZHQV9HZXRDb2xvcjE2KDE2KSApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDk6IC8qIFJFQUQgQUxMIFBBTEVUVEUgUkVHSVNURVJTIEFORCBPVkVSU0NBTiBSRUdJU1RFUiAtIEEuQy4qLwogICAgICAgICAgICBUUkFDRSgiUmVhZCBBbGwgUGFsZXR0ZSBSZWdpc3RlcnMgYW5kIE92ZXJzY2FuIFJlZ2lzdGVyXG4iKTsKCQkvKiBFUzpEWCBwb2ludHMgdG8gYSAxNyBieXRlIHRhYmxlIHdoZXJlIHRoZSByZXN1bHRzICovCgkJLyogIG9mIHRoaXMgY2FsbCBzaG91bGQgYmUgc3RvcmVkLiAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICBWR0FfR2V0MTZQYWxldHRlKENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBjb250ZXh0LT5TZWdFcywgY29udGV4dC0+RWR4KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMDogLyogU0VUIElORElWSURVQUwgREFDIFJFR0lTVEVSICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFBBTEVUVEVFTlRSWSBwYWxkYXQ7CgogICAgICAgICAgICAgICAgVFJBQ0UoIlNldCBJbmRpdmlkdWFsIERBQyByZWdpc3RlclxuIik7CiAgICAgICAgICAgICAgICBwYWxkYXQucGVSZWQgICA9IERIX3JlZyhjb250ZXh0KTsKICAgICAgICAgICAgICAgIHBhbGRhdC5wZUdyZWVuID0gQ0hfcmVnKGNvbnRleHQpOwogICAgICAgICAgICAgICAgcGFsZGF0LnBlQmx1ZSAgPSBDTF9yZWcoY29udGV4dCk7CiAgICAgICAgICAgICAgICBwYWxkYXQucGVGbGFncyA9IDA7CiAgICAgICAgICAgICAgICBWR0FfU2V0UGFsZXR0ZSgmcGFsZGF0LEJYX3JlZyhjb250ZXh0KSYweEZGLDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMjogLyogU0VUIEJMT0NLIE9GIERBQyBSRUdJU1RFUlMgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgcGFsZGF0OwogICAgICAgICAgICAgICAgQllURSAqcHQ7CgogICAgICAgICAgICAgICAgVFJBQ0UoIlNldCBCbG9jayBvZiBEQUMgcmVnaXN0ZXJzXG4iKTsKCQlwdCA9IChCWVRFKilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCxjb250ZXh0LT5TZWdFcyxjb250ZXh0LT5FZHgpOwoJCWZvciAoaT0wO2k8Q1hfcmVnKGNvbnRleHQpO2krKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwYWxkYXQucGVSZWQgICA9ICgqKHB0K2kqMyswKSkgPDwgMjsKICAgICAgICAgICAgICAgICAgICBwYWxkYXQucGVHcmVlbiA9ICgqKHB0K2kqMysxKSkgPDwgMjsKICAgICAgICAgICAgICAgICAgICBwYWxkYXQucGVCbHVlICA9ICgqKHB0K2kqMysyKSkgPDwgMjsKICAgICAgICAgICAgICAgICAgICBwYWxkYXQucGVGbGFncyA9IDA7CiAgICAgICAgICAgICAgICAgICAgVkdBX1NldFBhbGV0dGUoJnBhbGRhdCwoQlhfcmVnKGNvbnRleHQpK2kpJjB4RkYsMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDEzOiAvKiBTRUxFQ1QgVklERU8gREFDIENPTE9SIFBBR0UgKi8KICAgICAgICAgICAgRklYTUUoIlNlbGVjdCB2aWRlbyBEQUMgY29sb3IgcGFnZSAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTU6IC8qIFJFQUQgSU5ESVZJRFVBTCBEQUMgUkVHSVNURVIgKi8KICAgICAgICAgICAgRklYTUUoIlJlYWQgaW5kaXZpZHVhbCBEQUMgcmVnaXN0ZXIgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDE3OiAvKiBSRUFEIEJMT0NLIE9GIERBQyBSRUdJU1RFUlMgKi8KICAgICAgICAgICAgRklYTUUoIlJlYWQgYmxvY2sgb2YgREFDIHJlZ2lzdGVycyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTg6IC8qIFNFVCBQRUwgTUFTSyAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFBFTCBtYXNrIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxOTogLyogUkVBRCBQRUwgTUFTSyAqLwogICAgICAgICAgICBGSVhNRSgiUmVhZCBQRUwgbWFzayAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MWE6IC8qIEdFVCBWSURFTyBEQUMgQ09MT1IgUEFHRSBTVEFURSAqLwogICAgICAgICAgICBGSVhNRSgiR2V0IHZpZGVvIERBQyBjb2xvciBwYWdlIHN0YXRlIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxYjogLyogUEVSRk9STSBHUkFZLVNDQUxFIFNVTU1JTkcgKi8KICAgICAgICAgICAgRklYTUUoIlBlcmZvcm0gR3JheS1zY2FsZSBzdW1taW5nIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJJTlQgMTAgQUggPSAweDEwIEFMID0gMHgleCAtIFVua25vd25cbiIsCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MTE6IC8qIFRFWFQgTU9ERSBDSEFSR0VOICovCiAgICAgICAgLyogTm90ZSB0aGF0IHNlY29uZCBzdWJmdW5jdGlvbiBpcyAqYWxtb3N0KiBpZGVudGljYWwuICovCiAgICAgICAgLyogU2VlIElOVEVSUlVQVC5BIGZvciBkZXRhaWxzLiAqLwogICAgICAgIHN3aXRjaCBBTF9yZWcoY29udGV4dCkgewogICAgICAgIGNhc2UgMHgwMDogLyogTE9BRCBVU0VSIFNQRUNJRklFRCBQQVRURVJOUyAqLwogICAgICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgRklYTUUoIkxvYWQgVXNlciBTcGVjaWZpZWQgUGF0dGVybnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBMT0FEIFJPTSBNT05PQ0hST01FIFBBVFRFUk5TICovCiAgICAgICAgY2FzZSAweDExOgogICAgICAgICAgICBGSVhNRSgiTG9hZCBST00gTW9ub2Nocm9tZSBQYXR0ZXJucyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDI6IC8qIExPQUQgUk9NIDh4OCBET1VCTEUtRE9UIFBBVFRFUk5TICovCiAgICAgICAgY2FzZSAweDEyOgogICAgICAgICAgICBGSVhNRSgKICAgICAgICAgICAgICAgICJMb2FkIFJPTSA4eDggRG91YmxlIERvdCBQYXR0ZXJucyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDM6IC8qIFNFVCBCTE9DSyBTUEVDSUZJRVIgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBCbG9jayBTcGVjaWZpZXIgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA0OiAvKiBMT0FEIFJPTSA4eDE2IENIQVJBQ1RFUiBTRVQgKi8KICAgICAgICBjYXNlIDB4MTQ6CiAgICAgICAgICAgIEZJWE1FKCJMb2FkIFJPTSA4eDE2IENoYXJhY3RlciBTZXQgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDIwOiAvKiBTRVQgVVNFUiA4eDE2IEdSQVBISUNTIENIQVJTICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgVXNlciA4eDE2IEdyYXBoaWNzIENoYXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyMTogLyogU0VUIFVTRVIgR1JBUElDUyBDSEFSQUNURVJTICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgVXNlciBHcmFwaGljcyBDaGFyYWN0ZXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyMjogLyogU0VUIFJPTSA4eDE0IEdSQVBISUNTIENIQVJTICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgUk9NIDh4MTQgR3JhcGhpY3MgQ2hhcnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDIzOiAvKiBTRVQgUk9NIDh4OCBEQkwgRE9UIENIQVJTICovCiAgICAgICAgICAgIEZJWE1FKAogICAgICAgICAgICAgICAgIlNldCBST00gOHg4IERibCBEb3QgQ2hhcnMgKEdyYXBoaWNzKSAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjQ6IC8qIExPQUQgOHgxNiBHUkFQSElDIENIQVJTICovCiAgICAgICAgICAgIEZJWE1FKCJMb2FkIDh4MTYgR3JhcGhpYyBDaGFycyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MzA6IC8qIEdFVCBGT05UIElORk9STUFUSU9OICovCiAgICAgICAgICAgIEZJWE1FKCJHZXQgRm9udCBJbmZvcm1hdGlvbiAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiSU5UIDEwIEFIID0gMHgxMSBBTCA9IDB4JXggLSBVbmtub3duXG4iLAogICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDEyOiAvKiBBTFRFUk5BVEUgRlVOQ1RJT04gU0VMRUNUICovCiAgICAgICAgc3dpdGNoIEJMX3JlZyhjb250ZXh0KSB7CiAgICAgICAgY2FzZSAweDEwOiAvKiBHRVQgRUdBIElORk8gKi8KICAgICAgICAgICAgVFJBQ0UoIkVHQSBpbmZvIHJlcXVlc3RlZFxuIik7CiAgICAgICAgICAgIFNFVF9CSCggY29udGV4dCwgMHgwMCApOyAgIC8qIENvbG9yIHNjcmVlbiAqLwogICAgICAgICAgICBTRVRfQkwoIGNvbnRleHQsIGRhdGEtPk1vZGVPcHRpb25zID4+IDUgKTsgLyogRUdBIG1lbW9yeSBzaXplICovCiAgICAgICAgICAgIFNFVF9DWCggY29udGV4dCwgZGF0YS0+RmVhdHVyZUJpdHNTd2l0Y2hlcyApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjA6IC8qIEFMVEVSTkFURSBQUlRTQyAqLwogICAgICAgICAgICBGSVhNRSgiSW5zdGFsbCBBbHRlcm5hdGUgUHJpbnQgU2NyZWVuIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMDogLyogU0VMRUNUIFZFUlRJQ0FMIFJFU09VTFRJT04gKi8KICAgICAgICAgICAgRklYTUUoIlNlbGVjdCB2ZXJ0aWNhbCByZXNvbHV0aW9uIC0gbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMTogLyogRU5BQkxFL0RJU0FCTEUgREVGQVVMVCBQQUxFVFRFIExPQURJTkcgKi8KICAgICAgICAgICAgRklYTUUoIkRlZmF1bHQgcGFsZXR0ZSBsb2FkaW5nIC0gbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGRhdGEtPlZHQVNldHRpbmdzID0KICAgICAgICAgICAgICAgIChkYXRhLT5WR0FTZXR0aW5ncyAmIDB4ZjcpIHwKICAgICAgICAgICAgICAgICgoQUxfcmVnKGNvbnRleHQpID09IDEpIDw8IDMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MzI6IC8qIEVOQUJMRS9ESVNBQkxFIFZJREVPIEFERFJFUlNTSU5HICovCiAgICAgICAgICAgIEZJWE1FKCJWaWRlbyBBZGRyZXNzaW5nIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMzogLyogRU5BQkxFL0RJU0FCTEUgR1JBWSBTQ0FMRSBTVU1NSU5HICovCiAgICAgICAgICAgIEZJWE1FKCJHcmF5IFNjYWxlIFN1bW1pbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDM0OiAvKiBFTkFCTEUvRElTQUJMRSBDVVJTT1IgRU1VTEFUSU9OICovCiAgICAgICAgICAgIFRSQUNFKCJTZXQgY3Vyc29yIGVtdWxhdGlvbiB0byAlZFxuIiwgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgZGF0YS0+TW9kZU9wdGlvbnMgPQogICAgICAgICAgICAgICAgKGRhdGEtPk1vZGVPcHRpb25zICYgMHhmZSl8KEFMX3JlZyhjb250ZXh0KSA9PSAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDM2OiAvKiBWSURFTyBBRERSRVNTIENPTlRST0wgKi8KICAgICAgICAgICAgRklYTUUoIlZpZGVvIEFkZHJlc3MgQ29udHJvbCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiSU5UIDEwIEFIID0gMHgxMSBBTCA9IDB4JXggLSBVbmtub3duXG4iLAogICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDEzOiAvKiBXUklURSBTVFJJTkcgKi8KICAgICAgICAvKiBUaGlzIG9uZSBkb2VzIG5vdCBpbXBseSB0aGF0IHN0cmluZyBiZSBhdCBjdXJzb3IuICovCiAgICAgICAgRklYTUUoIldyaXRlIFN0cmluZyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxYToKICAgICAgICBzd2l0Y2ggQUxfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIEdFVCBESVNQTEFZIENPTUJJTkFUSU9OIENPREUgKi8KICAgICAgICAgICAgVFJBQ0UoIkdldCBEaXNwbGF5IENvbWJpbmF0aW9uIENvZGVcbiIpOwogICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4MWEgKTsgICAgICAvKiBGdW5jdGlvbiBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgU0VUX0JMKCBjb250ZXh0LCBJTlQxMF9EQ0MgKTsgLyogQWN0aXZlIGRpc3BsYXkgKi8KICAgICAgICAgICAgU0VUX0JIKCBjb250ZXh0LCAweDAwICk7ICAgICAgLyogTm8gYWx0ZXJuYXRlIGRpc3BsYXkgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBTRVQgRElTUExBWSBDT01CSU5BVElPTiBDT0RFICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgRGlzcGxheSBDb21iaW5hdGlvbiBDb2RlIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJJTlQgMTAgQUggPSAweDFhIEFMID0gMHgleCAtIFVua25vd25cbiIsCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxYjogLyogRlVOQ1RJT05BTElUWS9TVEFURSBJTkZPUk1BVElPTiAqLwogICAgICAgIFRSQUNFKCJHZXQgZnVuY3Rpb25hbGl0eS9zdGF0ZSBpbmZvcm1hdGlvblxuIik7CiAgICAgICAgaWYgKEJYX3JlZyhjb250ZXh0KSA9PSAweDAwMDApCiAgICAgICAgewogICAgICAgICAgICBCWVRFICpwdHIgPSBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPlNlZ0VzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkVkaSk7CiAgICAgICAgICAgIFNFVF9BTCggY29udGV4dCwgMHgxYiApOyAvKiBGdW5jdGlvbiBpcyBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgSU5UMTBfRmlsbFN0YXRlSW5mb3JtYXRpb24oIHB0ciwgZGF0YSApOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MWM6IC8qIFNBVkUvUkVTVE9SRSBWSURFTyBTVEFURSAqLwogICAgICAgIEZJWE1FKCJTYXZlL1Jlc3RvcmUgVmlkZW8gU3RhdGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAweGVmOiAgLyogZ2V0IHZpZGVvIG1vZGUgZm9yIGhlcmN1bGVzLWNvbXBhdGlibGVzICAgKi8KICAgICAgICAgICAgICAgICAgICAvKiBUaGVyZSdzIG5vIHJlYXNvbiB0byByZWFsbHkgc3VwcG9ydCB0aGlzICAqLwogICAgICAgICAgICAgICAgICAgIC8qIGlzIHRoZXJlPy4uLi4uLi4uLi4uLi4uLi4uLi4uKEEuQy4pICAgICAgICovCiAgICAgICAgICAgICAgICBUUkFDRSgiSnVzdCByZXBvcnQgdGhlIHZpZGVvIG5vdCBoZXJjdWxlcyBjb21wYXRpYmxlXG4iKTsKICAgICAgICAgICAgICAgIFNFVF9EWCggY29udGV4dCwgMHhmZmZmICk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4NGY6IC8qIFZFU0EgKi8KICAgICAgICBJTlQxMF9IYW5kbGVWRVNBKGNvbnRleHQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHhmZTogLyogR0VUIFNIQURPVyBCVUZGRVIgKi8KICAgICAgICBUUkFDRSggIkdFVCBTSEFET1cgQlVGRkVSICV4OiV4IC0gaWdub3JlZFxuIiwKICAgICAgICAgICAgICAgY29udGV4dC0+U2VnRXMsIERJX3JlZyhjb250ZXh0KSApOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gLSAweCV4XG4iLCBBSF9yZWcoY29udGV4dCkpOwogICAgICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDEwICk7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIERPU1ZNX1B1dENoYXIKICoKICogV3JpdGUgc2luZ2xlIGNoYXJhY3RlciB0byBWR0EgY29uc29sZSBhdCB0aGUgY3VycmVudCAKICogY3Vyc29yIHBvc2l0aW9uIGFuZCB1cGRhdGVzIHRoZSBCSU9TIGN1cnNvciBwb3NpdGlvbi4KICovCnZvaWQgV0lOQVBJIERPU1ZNX1B1dENoYXIoIEJZVEUgYXNjaWkgKQp7CiAgQklPU0RBVEEgKmRhdGEgPSBET1NWTV9CaW9zRGF0YSgpOwogIHVuc2lnbmVkICB4cG9zLCB5cG9zOwoKICBUUkFDRSgiY2hhcjogMHglMDJ4KCVjKVxuIiwgYXNjaWksIGFzY2lpKTsKCiAgSU5UMTBfSW5pdGlhbGl6ZVZpZGVvTW9kZSggZGF0YSApOwoKICBWR0FfUHV0Q2hhciggYXNjaWkgKTsKICBWR0FfR2V0Q3Vyc29yUG9zKCAmeHBvcywgJnlwb3MgKTsKICBJTlQxMF9TZXRDdXJzb3JQb3MoIGRhdGEsIDAsIHhwb3MsIHlwb3MgKTsKfQo=