LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKi8KCi8qKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQGZpbGUKKiAgaWgyNjRlX2NhYmFjLmMKKgoqIEBicmllZgoqICBDb250YWlucyBhbGwgZnVuY3Rpb25zIHRvIGVuY29kZSBpbiBDQUJBQyBlbnRyb3B5IG1vZGUKKgoqCiogQGF1dGhvcgoqIERvbmV5IEFsZXgKKgoqIEBwYXIgTGlzdCBvZiBGdW5jdGlvbnM6CioKKgoqIEByZW1hcmtzCiogIE5vbmUKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEZpbGUgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogU3lzdGVtIGluY2x1ZGUgZmlsZXMgKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgovKiBVc2VyIGluY2x1ZGUgZmlsZXMgKi8KI2luY2x1ZGUgImloMjY0ZV9jb25maWcuaCIKI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCiNpbmNsdWRlICJpdjIuaCIKI2luY2x1ZGUgIml2ZTIuaCIKI2luY2x1ZGUgImloMjY0X2RlYnVnLmgiCiNpbmNsdWRlICJpaDI2NF9kZWZzLmgiCiNpbmNsdWRlICJpaDI2NGVfZGVmcy5oIgojaW5jbHVkZSAiaWgyNjRfbWFjcm9zLmgiCiNpbmNsdWRlICJpaDI2NGVfZXJyb3IuaCIKI2luY2x1ZGUgImloMjY0ZV9iaXRzdHJlYW0uaCIKI2luY2x1ZGUgImltZV9kaXN0b3J0aW9uX21ldHJpY3MuaCIKI2luY2x1ZGUgImltZV9kZWZzLmgiCiNpbmNsdWRlICJpbWVfc3RydWN0cy5oIgojaW5jbHVkZSAiaWgyNjRfZXJyb3IuaCIKI2luY2x1ZGUgImloMjY0X3N0cnVjdHMuaCIKI2luY2x1ZGUgImloMjY0X3RyYW5zX3F1YW50X2l0cmFuc19pcXVhbnQuaCIKI2luY2x1ZGUgImloMjY0X2ludGVyX3ByZWRfZmlsdGVycy5oIgojaW5jbHVkZSAiaWgyNjRfbWVtX2Zucy5oIgojaW5jbHVkZSAiaWgyNjRfcGFkZGluZy5oIgojaW5jbHVkZSAiaWgyNjRfcGxhdGZvcm1fbWFjcm9zLmgiCiNpbmNsdWRlICJpaDI2NF9pbnRyYV9wcmVkX2ZpbHRlcnMuaCIKI2luY2x1ZGUgImloMjY0X2RlYmxrX2VkZ2VfZmlsdGVycy5oIgojaW5jbHVkZSAiaWgyNjRfY2FiYWNfdGFibGVzLmgiCiNpbmNsdWRlICJpcmNfY250cmxfcGFyYW0uaCIKI2luY2x1ZGUgImlyY19mcmFtZV9pbmZvX2NvbGxlY3Rvci5oIgojaW5jbHVkZSAiaWgyNjRlX3JhdGVfY29udHJvbC5oIgojaW5jbHVkZSAiaWgyNjRlX2NhYmFjX3N0cnVjdHMuaCIKI2luY2x1ZGUgImloMjY0ZV9zdHJ1Y3RzLmgiCiNpbmNsdWRlICJpaDI2NGVfY2FiYWMuaCIKI2luY2x1ZGUgImloMjY0ZV9lbmNvZGVfaGVhZGVyLmgiCiNpbmNsdWRlICJpaDI2NF9jYXZsY190YWJsZXMuaCIKI2luY2x1ZGUgImloMjY0ZV9jYXZsYy5oIgojaW5jbHVkZSAiaWgyNjRlX3N0YXRpc3RpY3MuaCIKI2luY2x1ZGUgImloMjY0ZV90cmFjZS5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBAYnJpZWYKICogIEVuY29kZXMgbWJfc2tpcF9mbGFnICB1c2luZyBDQUJBQyBlbnRyb3B5IGNvZGluZyBtb2RlLgogKgogKiBAcGFyYW1baW5dIHUxX21iX3NraXBfZmxhZwogKiAgbWJfc2tpcF9mbGFnCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHU0X2N0eGlkeF9vZmZzZXQKICogIGN0eElkeE9mZnNldCBmb3IgbWJfc2tpcF9mbGFnIGNvbnRleHQKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcChVV09SRDggdTFfbWJfc2tpcF9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhpZHhfb2Zmc2V0KQp7CgogICAgVVdPUkQ4IHU0X2N0eF9pbmM7CiAgICBXT1JEOCBhLCBiOwogICAgYSA9ICgocHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm8tPnUxX21iX3R5cGUgJiBDQUJfU0tJUF9NQVNLKSA/CiAgICAgICAgICAgICAgICAgICAgMCA6IDEpOwogICAgYiA9ICgocHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mby0+dTFfbWJfdHlwZSAmIENBQl9TS0lQX01BU0spID8KICAgICAgICAgICAgICAgICAgICAwIDogMSk7CgogICAgdTRfY3R4X2luYyA9IGEgKyBiOwogICAgLyogRW5jb2RlIHRoZSBiaW4gKi8KICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQzMikgdTFfbWJfc2tpcF9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyB1NF9jdHhpZHhfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2luYyk7Cgp9CgoKLyogISA8IFRhYmxlIDktMzYgliBCaW5hcml6YXRpb24gZm9yIG1hY3JvYmxvY2sgdHlwZXMgaW4gSSBzbGljZXMgIGluIElUVV9UX0gyNjQtMjAxNDAyCiAqIEJpdHMgMC03IDogYmluYXJpc2VkIHZhbHVlCiAqIEJpdHMgOC0xNTogbGVuZ3RoIG9mIGJpbmFyeSBzZXF1ZW5jZQogKi8Kc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfbWJfdHlwZV9pbnRyYVsyNl0gPQogICAgeyAweDAxMDAsIDB4MDYyMCwgMHgwNjIxLCAweDA2MjIsIDB4MDYyMywgMHgwNzQ4LCAweDA3NDksIDB4MDc0YSwgMHgwNzRiLAogICAgICAweDA3NGMsIDB4MDc0ZCwgMHgwNzRlLCAweDA3NGYsIDB4MDYyOCwgMHgwNjI5LCAweDA2MmEsIDB4MDYyYiwgMHgwNzU4LAogICAgICAweDA3NTksIDB4MDc1YSwgMHgwNzViLCAweDA3NWMsIDB4MDc1ZCwgMHgwNzVlLCAweDA3NWYsIDB4MDIwMyB9OwoKCi8qIEN0eEluYyBmb3IgbWIgdHlwZXMgKi8Kc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfbWJfY3R4aW5jWzJdWzI2XSA9CnsKICAgIC8qIEludHJhIEN0eEluYydzICovCiAgICB7ICAgMHgwMCwKICAgICAgICAweDAzNDY3LCAweDAzNDY3LCAweDAzNDY3LCAweDAzNDY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LAogICAgICAgIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ2NywgMHgwMzQ2NywKICAgICAgICAweDAzNDY3LCAweDAzNDY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ1NjcsCiAgICAgICAgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMH0sCiAgICAvKiBJbnRlciBDdHhJbmMncyAqLwogICAgeyAgIDB4MDAsCiAgICAgICAgMHgwMDEyMzMsIDB4MDAxMjMzLCAweDAwMTIzMywgMHgwMDEyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsCiAgICAgICAgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjMzLCAweDAwMTIzMywKICAgICAgICAweDAwMTIzMywgMHgwMDEyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLAogICAgICAgIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDB9Cn07CgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBtYl90eXBlIGZvciBhbiBpbnRyYSBNQi4KICoKICogQHBhcmFtW2luXSB1NF9zbGljZV90eXBlCiAqICBzbGljZSB0eXBlCiAqCiAqIEBwYXJhbVtpbl0gdTRfaW50cmFfbWJfdHlwZQogKiAgTUIgdHlwZSAoVGFibGUgNy0xMSkKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqKiBAcGFyYW1baW5dIHU0X2N0eGlkeF9vZmZzZXQKICogIGN0eElkeE9mZnNldCBmb3IgbWJfdHlwZSBjb250ZXh0CiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKFVXT1JEMzIgdTRfc2xpY2VfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfaW50cmFfbWJfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2lkeF9vZmZzZXQpCnsKCiAgICBlbmNvZGluZ19lbnZpcm5vbWVudF90ICpwc19jYWJfZW5jX2VudiA9ICYocHNfY2FiYWNfY3R4dC0+c19jYWJfZW5jX2Vudik7CiAgICBiaW5fY3R4dF9tb2RlbCAqcHUxX21iX2Jpbl9jdHh0LCAqcHUxX2Jpbl9jdHh0OwogICAgVVdPUkQ4IHUxX2JpbjsKICAgIG1iX2luZm9fY3R4dF90ICpwc19sZWZ0X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19sZWZ0X2N0eHRfbWJfaW5mbzsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICBVV09SRDMyIHU0X2JpbnM7CiAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICBXT1JEOCBpMV9iaW5zX2xlbjsKICAgIFVXT1JEMzIgdTRfY29kZV9pbnRfcmFuZ2U7CiAgICBVV09SRDMyIHU0X2NvZGVfaW50X2xvdzsKICAgIFVXT1JEMTYgdTJfcXVhbnRfY29kZV9pbnRfcmFuZ2U7CiAgICBVV09SRDE2IHU0X2NvZGVfaW50X3JhbmdlX2xwczsKICAgIFdPUkQ4IGk7CiAgICBVV09SRDggdTFfY3R4X2luYzsKICAgIFVXT1JEMzIgdTRfdGFibGVfdmFsOwoKICAgIHB1MV9tYl9iaW5fY3R4dCA9IHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgdTRfY3R4X2lkeF9vZmZzZXQ7CgogICAgdTRfYmlucyA9IHU0X21iX3R5cGVfaW50cmFbdTRfaW50cmFfbWJfdHlwZV07CiAgICBpMV9iaW5zX2xlbiA9IChXT1JEOCkgKCh1NF9iaW5zID4+IDgpICYgMHgwZik7CiAgICB1NF9jdHhfaW5jID0gdTRfbWJfY3R4aW5jWyh1NF9zbGljZV90eXBlICE9IElTTElDRSldW3U0X2ludHJhX21iX3R5cGVdOwogICAgdTFfY3R4X2luYyA9IDA7CiAgICBpZiAodTRfc2xpY2VfdHlwZSA9PSBJU0xJQ0UpCiAgICB7CiAgICAgICAgaWYgKHBzX2xlZnRfY3R4dCAhPSBwc19jYWJhY19jdHh0LT5wc19kZWZfY3R4dF9tYl9pbmZvKQogICAgICAgICAgICB1MV9jdHhfaW5jICs9ICgocHNfbGVmdF9jdHh0LT51MV9tYl90eXBlICE9IENBQl9JNHg0KSA/IDEgOiAwKTsKICAgICAgICBpZiAocHNfdG9wX2N0eHQgIT0gcHNfY2FiYWNfY3R4dC0+cHNfZGVmX2N0eHRfbWJfaW5mbykKICAgICAgICAgICAgdTFfY3R4X2luYyArPSAoKHBzX3RvcF9jdHh0LT51MV9tYl90eXBlICE9IENBQl9JNHg0KSA/IDEgOiAwKTsKCiAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgKHUxX2N0eF9pbmMgPDwgKChpMV9iaW5zX2xlbiAtIDEpIDw8IDIpKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHUxX21iX2Jpbl9jdHh0ICs9IDM7CiAgICAgICAgaWYgKHU0X3NsaWNlX3R5cGUgPT0gQlNMSUNFKQogICAgICAgICAgICBwdTFfbWJfYmluX2N0eHQgKz0gMjsKCiAgICB9CgogICAgdTRfY29kZV9pbnRfcmFuZ2UgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfcmFuZ2U7CiAgICB1NF9jb2RlX2ludF9sb3cgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfbG93OwoKICAgIGZvciAoaSA9IChpMV9iaW5zX2xlbiAtIDEpOyBpID49IDA7IGktLSkKICAgIHsKICAgICAgICBXT1JEMzIgc2hpZnQ7CgogICAgICAgIHUxX2N0eF9pbmMgPSAoKHU0X2N0eF9pbmMgPj4gKGkgPDwgMikpICYgMHgwZik7CiAgICAgICAgdTFfYmluID0gKCh1NF9iaW5zID4+IGkpICYgMHgwMSk7CiAgICAgICAgLyogRW5jb2RlIHRoZSBiaW4gKi8KICAgICAgICBwdTFfYmluX2N0eHQgPSBwdTFfbWJfYmluX2N0eHQgKyB1MV9jdHhfaW5jOwogICAgICAgIGlmIChpICE9IChpMV9iaW5zX2xlbiAtIDIpKQogICAgICAgIHsKICAgICAgICAgICAgV09SRDggaTFfbXBzID0gISEoKCpwdTFfYmluX2N0eHQpICYgKDB4NDApKTsKICAgICAgICAgICAgV09SRDggaTFfc3RhdGUgPSAoKnB1MV9iaW5fY3R4dCkgJiAweDNGOwoKICAgICAgICAgICAgdTJfcXVhbnRfY29kZV9pbnRfcmFuZ2UgPSAoKHU0X2NvZGVfaW50X3JhbmdlID4+IDYpICYgMHgwMyk7CiAgICAgICAgICAgIHU0X3RhYmxlX3ZhbCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXU0X2loMjY0X2NhYmFjX3RhYmxlW2kxX3N0YXRlXVt1Ml9xdWFudF9jb2RlX2ludF9yYW5nZV07CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlX2xwcyA9IHU0X3RhYmxlX3ZhbCAmIDB4RkY7CgogICAgICAgICAgICB1NF9jb2RlX2ludF9yYW5nZSAtPSB1NF9jb2RlX2ludF9yYW5nZV9scHM7CiAgICAgICAgICAgIGlmICh1MV9iaW4gIT0gaTFfbXBzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1NF9jb2RlX2ludF9sb3cgKz0gdTRfY29kZV9pbnRfcmFuZ2U7CiAgICAgICAgICAgICAgICB1NF9jb2RlX2ludF9yYW5nZSA9IHU0X2NvZGVfaW50X3JhbmdlX2xwczsKICAgICAgICAgICAgICAgIGlmIChpMV9zdGF0ZSA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIE1QUyhDdHhJZHgpID0gMSAtIE1QUyhDdHhJZHgpICovCiAgICAgICAgICAgICAgICAgICAgaTFfbXBzID0gMSAtIGkxX21wczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpMV9zdGF0ZSA9ICh1NF90YWJsZV92YWwgPj4gMTUpICYgMHgzRjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGkxX3N0YXRlID0gKHU0X3RhYmxlX3ZhbCA+PiA4KSAmIDB4M0Y7CgogICAgICAgICAgICB9CgogICAgICAgICAgICAoKnB1MV9iaW5fY3R4dCkgPSAoaTFfbXBzIDw8IDYpIHwgaTFfc3RhdGU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlIC09IDI7CiAgICAgICAgfQoKICAgICAgICAvKiBSZW5vcm1hbGl6ZSAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiBSZW5vcm1hbGl6YXRpb247IGNhbGN1bGF0ZSBiaXRzIGdlbmVyYXRlZCBiYXNlZCBvbiByYW5nZShSKSAgICovCiAgICAgICAgLyogTm90ZSA6IDYgPD0gUiA8IDUxMjsgUiBpcyAyIG9ubHkgZm9yIHRlcm1pbmF0aW5nIGVuY29kZSAgICAgICAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICBHRVRSQU5HRShzaGlmdCwgdTRfY29kZV9pbnRfcmFuZ2UpOwogICAgICAgIHNoaWZ0ID0gOSAtIHNoaWZ0OwogICAgICAgIHU0X2NvZGVfaW50X2xvdyA8PD0gc2hpZnQ7CiAgICAgICAgdTRfY29kZV9pbnRfcmFuZ2UgPDw9IHNoaWZ0OwoKICAgICAgICAvKiBiaXRzIHRvIGJlIGluc2VydGVkIGluIHRoZSBiaXRzdHJlYW0gKi8KICAgICAgICBwc19jYWJfZW5jX2Vudi0+dTRfYml0c19nZW4gKz0gc2hpZnQ7CiAgICAgICAgcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X3JhbmdlID0gdTRfY29kZV9pbnRfcmFuZ2U7CiAgICAgICAgcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X2xvdyA9IHU0X2NvZGVfaW50X2xvdzsKCiAgICAgICAgLyogZ2VuZXJhdGUgc3RyZWFtIHdoZW4gYSBieXRlIGlzIHJlYWR5ICovCiAgICAgICAgaWYgKHBzX2NhYl9lbmNfZW52LT51NF9iaXRzX2dlbiA+IENBQkFDX0JJVFMpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfcHV0X2J5dGUocHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlID0gcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X3JhbmdlOwogICAgICAgICAgICB1NF9jb2RlX2ludF9sb3cgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfbG93OwoKICAgICAgICB9CiAgICB9Cn0KCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBwcmV2X2ludHJhNHg0X3ByZWRfbW9kZV9mbGFnIGFuZAogKiAgcmVtX2ludHJhNHg0X3ByZWRfbW9kZSB1c2luZyBDQUJBQyBlbnRyb3B5IGNvZGluZyBtb2RlCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiAgQHBhcmFtW2luXSBwdTFfaW50cmFfNHg0X21vZGVzCiAqICBQb2ludGVyIHRvIGFycmF5IGNvbnRhaW5pbmcgcHJldl9pbnRyYTR4NF9wcmVkX21vZGVfZmxhZyBhbmQKICogIHJlbV9pbnRyYTR4NF9wcmVkX21vZGUKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfNHg0bWJfbW9kZXMoY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEOCAqcHUxX2ludHJhXzR4NF9tb2RlcykKewogICAgV09SRDMyIGk7CiAgICBXT1JEOCBieXRlOwogICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpCiAgICB7CiAgICAgICAgLyogc3ViIGJsayBpZHggMSAqLwogICAgICAgIGJ5dGUgPSBwdTFfaW50cmFfNHg0X21vZGVzW2kgPj4gMV07CiAgICAgICAgaWYgKGJ5dGUgJiAweDEpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUFJFVl9JTlRSQTRYNF9QUkVEX01PREVfRkxBRyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIEJpbmFyaXphdGlvbiBpcyBGTCBhbmQgQ21heD03ICovCiAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyhieXRlICYgMHhGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFJFTV9JTlRSQTRYNF9QUkVEX01PREUgLSA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgfQogICAgICAgIC8qIHN1YiBibGsgaWR4IDIgKi8KICAgICAgICBieXRlID4+PSA0OwogICAgICAgIGlmIChieXRlICYgMHgxKQogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBSRVZfSU5UUkE0WDRfUFJFRF9NT0RFX0ZMQUcpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnMoYnl0ZSAmIDB4RiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBSRU1fSU5UUkE0WDRfUFJFRF9NT0RFIC0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KICAgIH0KfQoKCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQGJyaWVmCiAqICBFbmNvZGVzIGNocm9tYSAgaW50cmFwcmVkIG1vZGUgZm9yIHRoZSBNQi4KICoKICogQHBhcmFtW2luXSB1MV9jaHJvbWFfcHJlZF9tb2RlCiAqICBDaHJvbWEgaW50ciBwcmVkaWN0aW9uIG1vZGUKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jX2Nocm9tYV9wcmVkbW9kZShVV09SRDggdTFfY2hyb21hX3ByZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0KQp7CgogICAgV09SRDggaTFfdGVtcDsKICAgIG1iX2luZm9fY3R4dF90ICpwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKICAgIG1iX2luZm9fY3R4dF90ICpwc19sZWZ0X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19sZWZ0X2N0eHRfbWJfaW5mbzsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICBVV09SRDMyIHU0X2JpbnMgPSAwOwogICAgV09SRDggaTFfYmluc19sZW4gPSAxOwogICAgVVdPUkQzMiB1NF9jdHhfaW5jID0gMDsKICAgIFVXT1JEOCBhLCBiOwogICAgYSA9ICgocHNfbGVmdF9jdHh0LT51MV9pbnRyYXByZWRfY2hyb21hX21vZGUgIT0gMCkgPyAxIDogMCk7CiAgICBiID0gKChwc190b3BfY3R4dC0+dTFfaW50cmFwcmVkX2Nocm9tYV9tb2RlICE9IDApID8gMSA6IDApOwoKICAgIC8qIEJpbmFyaXphdGlvbiBpcyBUVSBhbmQgQ21heD0zICovCiAgICBwc19jdXJyX2N0eHQtPnUxX2ludHJhcHJlZF9jaHJvbWFfbW9kZSA9IHUxX2Nocm9tYV9wcmVkX21vZGU7CgogICAgdTRfY3R4X2luYyA9IGEgKyBiOwogICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgMHgzMzApOwogICAgaWYgKHUxX2Nocm9tYV9wcmVkX21vZGUpCiAgICB7CiAgICAgICAgdTRfYmlucyA9IDE7CiAgICAgICAgaTFfdGVtcCA9IHUxX2Nocm9tYV9wcmVkX21vZGU7CiAgICAgICAgaTFfdGVtcC0tOwogICAgICAgIC8qIFB1dCBhIHN0cmVhbSBvZiAxJ3Mgb2YgbGVuZ3RoIENocm9tYXBzX3ByZWRfbW9kZV9jdHh0IHZhbHVlICovCiAgICAgICAgd2hpbGUgKGkxX3RlbXApCiAgICAgICAgewogICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICBpMV90ZW1wLS07CiAgICAgICAgfQogICAgICAgIC8qIElmIENocm9tYXBzX3ByZWRfbW9kZV9jdHh0IDwgQ21heCBpLmUgMy4gVGVybWluYXRlIHB1dCBhIHplcm8gKi8KICAgICAgICBpZiAodTFfY2hyb21hX3ByZWRfbW9kZSA8IDMpCiAgICAgICAgewogICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgIH0KICAgIH0KCiAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJTlRSQV9DSFJPTUFfUFJFRF9NT0RFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKfQoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBAYnJpZWYKICogIEVuY29kZXMgQ0JQIGZvciB0aGUgTUIuCiAqCiAqIEBwYXJhbVtpbl0gdTFfY2JwCiAqICBDQlAgZm9yIHRoZSBNQgogKgogKiBAcGFyYW1baW5dIHBzX2NhYmFjX2N0eHQKICogIFBvaW50ZXIgdG8gY2FiYWMgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfY2JwKFVXT1JEMzIgdTRfY2JwLCBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQpCnsKICAgIG1iX2luZm9fY3R4dF90ICpwc19sZWZ0X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19sZWZ0X2N0eHRfbWJfaW5mbzsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICBXT1JEOCBpMl9jYnBfY2hyb21hLCBpLCBqOwogICAgVVdPUkQ4IHUxX2N0eHRfaW5jLCB1MV9iaW47CiAgICBVV09SRDggYSwgYjsKICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgIFVXT1JEMzIgdTRfYmluczsKICAgIFdPUkQ4IGkxX2JpbnNfbGVuOwoKICAgIC8qIENCUCBMdW1hLCBGTCwgQ21heCA9IDE1LCBMID0gNCAqLwogICAgdTRfY3R4X2luYyA9IDA7CiAgICB1NF9iaW5zID0gMDsKICAgIGkxX2JpbnNfbGVuID0gNTsKICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAgICB7CiAgICAgICAgLyogY2FsdWxhdGUgY3R4dEluYywgZGVwZW5kaW5nIG9uIG5laWdoYm91ciBhdmFpbGFiaWxpdHkgKi8KICAgICAgICAvKiB1MV9jdHh0X2luYyA9IENvbmRUZXJtKEEpICsgMiAqIENvbmRUZXJtKEIpOwogICAgICAgICBBOiBMZWZ0IGJsb2NrIGFuZCBCOiBUb3AgYmxvY2sgKi8KCiAgICAgICAgLyogQ2hlY2sgZm9yIFRvcCBhdmFpbGFiaWxpdHkgKi8KICAgICAgICBpZiAoaSA+PiAxKQogICAgICAgIHsKICAgICAgICAgICAgaiA9IGkgLSAyOwogICAgICAgICAgICAvKiBUb3AgaXMgYXZhaWxhYmxlIGFsd2F5cyBhbmQgaXQncyBjdXJyZW50IE1CICovCiAgICAgICAgICAgIGIgPSAoKCh1NF9jYnAgPj4gaikgJiAweDAxKSAhPSAwID8gMCA6IDEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBmb3IgYmxvY2tzIHdob3NlIHRvcCByZWZlcmVuY2UgaXMgaW4gYW5vdGhlciBNQiAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBqID0gaSArIDI7CiAgICAgICAgICAgICAgICBiID0gKChwc190b3BfY3R4dC0+dTFfY2JwID4+IGopICYgMHgwMSkgPyAwIDogMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQ2hlY2sgZm9yIExlZnQgYXZhaWxhYmlsaXR5ICovCiAgICAgICAgaWYgKGkgJiAweDAxKQogICAgICAgIHsKICAgICAgICAgICAgLyogTGVmdCBpcyBhdmFpbGFibGUgYWx3YXlzIGFuZCBpdCdzIGN1cnJlbnQgTUIgKi8KICAgICAgICAgICAgaiA9IGkgLSAxOwogICAgICAgICAgICBhID0gKCgodTRfY2JwID4+IGopICYgMHgwMSkgIT0gMCA/IDAgOiAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IGkgKyAxOwogICAgICAgICAgICAgICAgYSA9ICgocHNfbGVmdF9jdHh0LT51MV9jYnAgPj4gaikgJiAweDAxKSA/IDAgOiAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHUxX2N0eHRfaW5jID0gYSArIDIgKiBiOwogICAgICAgIHUxX2JpbiA9ICgodTRfY2JwID4+IGkpICYgMHgwMSk7CiAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgKHUxX2N0eHRfaW5jIDw8IChpIDw8IDIpKSk7CiAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKHUxX2JpbiA8PCBpKSk7CiAgICB9CgogICAgLyogQ0JQIENocm9tYSwgVFUsIENtYXggPSAyICovCiAgICBpMl9jYnBfY2hyb21hID0gdTRfY2JwID4+IDQ7CiAgICAvKiBjYWx1bGF0ZSBjdHh0SW5jLCBkZXBlbmRpbmcgb24gbmVpZ2hib3VyIGF2YWlsYWJpbGl0eSAqLwogICAgYSA9IChwc19sZWZ0X2N0eHQtPnUxX2NicCA+IDE1KSA/IDEgOiAwOwogICAgYiA9IChwc190b3BfY3R4dC0+dTFfY2JwID4gMTUpID8gMSA6IDA7CgogICAgdTFfY3R4dF9pbmMgPSBhICsgMiAqIGI7CiAgICBpZiAoaTJfY2JwX2Nocm9tYSkKICAgIHsKICAgICAgICB1NF9jdHhfaW5jID0gdTRfY3R4X2luYyB8ICgoNCArIHUxX2N0eHRfaW5jKSA8PCAxNik7CiAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgMHgxMCk7CiAgICAgICAgLyogY2FsdWxhdGUgY3R4dEluYywgZGVwZW5kaW5nIG9uIG5laWdoYm91ciBhdmFpbGFiaWxpdHkgKi8KICAgICAgICBhID0gKHBzX2xlZnRfY3R4dC0+dTFfY2JwID4gMzEpID8gMSA6IDA7CiAgICAgICAgYiA9IChwc190b3BfY3R4dC0+dTFfY2JwID4gMzEpID8gMSA6IDA7CiAgICAgICAgdTFfY3R4dF9pbmMgPSBhICsgMiAqIGI7CiAgICAgICAgdTRfY3R4X2luYyA9IHU0X2N0eF9pbmMgfCAoKDggKyB1MV9jdHh0X2luYykgPDwgMjApOwogICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8ICgoKGkyX2NicF9jaHJvbWEgPj4gMSkgJiAweDAxKSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgKCg0ICsgdTFfY3R4dF9pbmMpIDw8IDE2KSk7CiAgICB9CiAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywgaTFfYmluc19sZW4sIHU0X2N0eF9pbmMsIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyBDQlBfTFVNQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKfQoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBAYnJpZWYKICogIEVuY29kZXMgbWJfcXBfZGVsdGEgZm9yIHRoZSBNQi4KICoKICogQHBhcmFtW2luXSBpMV9tYl9xcF9kZWx0YQogKiAgbWJfcXBfZGVsdGEKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jX21iX3FwX2RlbHRhKFdPUkQ4IGkxX21iX3FwX2RlbHRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCkKewogICAgVVdPUkQ4IHUxX2NvZGVfbnVtOwogICAgVVdPUkQ4IHUxX2N0eHRfaW5jOwoKICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgIFVXT1JEMzIgdTRfYmluczsKICAgIFdPUkQ4IGkxX2JpbnNfbGVuOwogICAgVVdPUkQ4IHUxX2N0eF9pbmMsIHUxX2JpbjsKICAgIC8qIFJhbmdlIG9mIHBzX21iX3FwX2RlbHRhX2N0eHQ9IC0yNiB0byArMjUgaW5jbHVzaXZlICovCiAgICAgICAgQVNTRVJUKChpMV9tYl9xcF9kZWx0YSA8IDI2KSAmJiAoaTFfbWJfcXBfZGVsdGEgPiAtMjcpKTsKICAgIC8qIGlmIHBzX21iX3FwX2RlbHRhX2N0eHQ9MCwgdGhlbiBjb2RlTnVtPTAgKi8KICAgIHUxX2NvZGVfbnVtID0gMDsKICAgIGlmIChpMV9tYl9xcF9kZWx0YSA+IDApCiAgICAgICAgdTFfY29kZV9udW0gPSAoaTFfbWJfcXBfZGVsdGEgPDwgMSkgLSAxOwogICAgZWxzZSBpZiAoaTFfbWJfcXBfZGVsdGEgPCAwKQogICAgICAgIHUxX2NvZGVfbnVtID0gKEFCUyhpMV9tYl9xcF9kZWx0YSkpIDw8IDE7CgogICAgdTRfY3R4X2luYyA9IDA7CiAgICB1NF9iaW5zID0gMDsKICAgIGkxX2JpbnNfbGVuID0gMTsKICAgIC8qIGNhbGN1bGF0ZSBjdHh0SW5jLCBkZXBlbmRpbmcgb24gbmVpZ2hib3VyIGF2YWlsYWJpbGl0eSAqLwogICAgdTFfY3R4dF9pbmMgPSAoISghKHBzX2NhYmFjX2N0eHQtPmkxX3ByZXZwc19tYl9xcF9kZWx0YV9jdHh0KSkpOwogICAgcHNfY2FiYWNfY3R4dC0+aTFfcHJldnBzX21iX3FwX2RlbHRhX2N0eHQgPSBpMV9tYl9xcF9kZWx0YTsKCiAgICBpZiAodTFfY29kZV9udW0gPT0gMCkKICAgIHsKICAgICAgICAvKiBiMCAqLwogICAgICAgIHUxX2JpbiA9IChVV09SRDgpICh1NF9iaW5zKTsKICAgICAgICB1MV9jdHhfaW5jID0gdTFfY3R4dF9pbmMgJiAweDBmOwogICAgICAgIC8qIEVuY29kZSB0aGUgYmluICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyBNQl9RUF9ERUxUQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1MV9jdHhfaW5jKTsKCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogYjAgKi8KICAgICAgICB1NF9jdHhfaW5jID0gdTFfY3R4dF9pbmM7CiAgICAgICAgdTRfYmlucyA9IDE7CiAgICAgICAgdTFfY29kZV9udW0tLTsKICAgICAgICBpZiAodTFfY29kZV9udW0gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIGIxICovCiAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MjApOwogICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywgaTFfYmluc19sZW4sIHU0X2N0eF9pbmMsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZSArIE1CX1FQX0RFTFRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIGIxICovCiAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MjApOwogICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICB1MV9jb2RlX251bS0tOwogICAgICAgICAgICAvKiBCaW5JZHggZnJvbSBiMiBvbndhcmRzICovCiAgICAgICAgICAgIGlmICh1MV9jb2RlX251bSA8IDMwKQogICAgICAgICAgICB7IC8qIG1heGltdW0gaTFfYmluc19sZW4gPSAzMSAqLwogICAgICAgICAgICAgICAgd2hpbGUgKHUxX2NvZGVfbnVtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8ICgxIDw8IGkxX2JpbnNfbGVuKSk7CiAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgICAgICB1MV9jb2RlX251bS0tOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MzAwKTsKICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNQl9RUF9ERUxUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIG1heGltdW0gaTFfYmluc19sZW4gPSA1MyAqLwogICAgICAgICAgICAgICAgdTRfYmlucyA9IDB4ZmZmZmZmZmY7CiAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiA9IDMyOwogICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgMHgzMDApOwogICAgICAgICAgICAgICAgdTFfY29kZV9udW0gLT0gMzA7CiAgICAgICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNQl9RUF9ERUxUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAwOwogICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSAwOwogICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9IDB4MDMzOwogICAgICAgICAgICAgICAgd2hpbGUgKHUxX2NvZGVfbnVtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8ICgxIDw8IGkxX2JpbnNfbGVuKSk7CiAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgICAgICB1MV9jb2RlX251bS0tOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDMwMCk7CiAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfUVBfREVMVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogIEVuY29kZXMgNHJlc2lkdWFsX2Jsb2NrX2NhYmFjIGFzIGRlZmluZWQgaW4gNy4zLjUuMy4zLgogKgogKiBAcGFyYW1baW5dIHBpMl9yZXNfYmxvY2sKICogIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHJlc2lkdWVzCiAqCiAqIEBwYXJhbVtpbl0gIHUxX25uegogKiAgTnVtYmVyIG9mIG5vbiB6ZXJvIGNvZWZmcyBpbiB0aGUgYmxvY2sKICoKICogQHBhcmFtW2luXSB1MV9tYXhfbnVtX2NvZWZmcwogKiAgTWF4IG51bWJlciBvZiBjb2VmZnMgdGhhdCBjYW4gYmUgdGhlcmUgaW4gdGhlIGJsb2NrCiAqCiAqIEBwYXJhbVtpbl0gdTJfc2lnX2NvZWZmX21hcAogKiAgU2lnbmlmaWNhbnQgY29lZmYgbWFwCiAqCiAqIEBwYXJhbVtpbl0gdTRfY3R4X2NhdF9vZmZzZXQKICogIGN0eElkeE9mZnNldCBmb3IgIGFic29sdXRlIHZhbHVlIGNvbnRleHRzCiAqCiAqIEBwYXJhbVtpbl0gIHB1MV9jdHh0X3NpZ19jb2VmZgogKiAgUG9pbnRlciB0byByZXNpZHVhbCBzdGF0ZSB2YXJpYWJsZXMKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfd3JpdGVfY29lZmY0eDQoV09SRDE2ICpwaTJfcmVzX2Jsb2NrLCBVV09SRDggdTFfbm56LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQ4IHUxX21heF9udW1fY29lZmZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQxNiB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhfY2F0X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbl9jdHh0X21vZGVsICpwdTFfY3R4dF9zaWdfY29lZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQpCnsKCiAgICBXT1JEOCBpOwogICAgV09SRDE2ICpwaTE2X2NvZWZmczsKICAgIFVXT1JEMzIgdTRfc2lnX2NvZWZmLCB1NF9iaW5zOwogICAgVVdPUkQzMiB1NF9jdHhfaW5jOwogICAgVVdPUkQ4IHUxX2xhc3Rfc2lnX2NvZWZfaW5kZXggPSAoMzEgLSBDTFoodTJfc2lnX2NvZWZmX21hcCkpOwoKICAgIC8qIEFsd2F5cyBwdXQgQ29kZWQgQmxvY2sgRmxhZyBhcyAxICovCgogICAgICAgIHBpMTZfY29lZmZzID0gcGkyX3Jlc19ibG9jazsKICAgICAgICB7CiAgICAgICAgICAgIGJpbl9jdHh0X21vZGVsICpwdTFfYmluX2N0eHQ7CiAgICAgICAgICAgIFVXT1JEOCB1MV9iaW4sIHVjX2xhc3Q7CgogICAgICAgICAgICBpID0gMDsKICAgICAgICAgICAgcHUxX2Jpbl9jdHh0ID0gcHUxX2N0eHRfc2lnX2NvZWZmOwogICAgICAgICAgICB1NF9zaWdfY29lZmYgPSAwOwogICAgICAgICAgICB1MV9iaW4gPSAxOwogICAgICAgICAgICBpZiAoKHUxX2xhc3Rfc2lnX2NvZWZfaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1MV9iaW4gPSAhISh1Ml9zaWdfY29lZmZfbWFwICYgMDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVjX2xhc3QgPSAxOwoKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRW5jb2RlIERlY2lzaW9uICovCiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LCB1MV9iaW4sIHB1MV9iaW5fY3R4dCk7CgogICAgICAgICAgICAgICAgaWYgKHUxX2JpbiAmIHVjX2xhc3QpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdTRfc2lnX2NvZWZmID0gKHU0X3NpZ19jb2VmZiB8ICgxIDw8IGkpKTsKICAgICAgICAgICAgICAgICAgICBwdTFfYmluX2N0eHQgPSBwdTFfY3R4dF9zaWdfY29lZmYgKyBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9GTEFHX0ZSQU1FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0lHTklGSUNBTlRfQ09FRkZfRkxBR19GUkFNRTsKICAgICAgICAgICAgICAgICAgICB1MV9iaW4gPSAoaSA9PSB1MV9sYXN0X3NpZ19jb2VmX2luZGV4KTsKICAgICAgICAgICAgICAgICAgICB1Y19sYXN0ID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgcHUxX2Jpbl9jdHh0ID0gcHUxX2N0eHRfc2lnX2NvZWZmICsgaTsKICAgICAgICAgICAgICAgICAgICB1MV9iaW4gPSAoaSA9PSB1MV9sYXN0X3NpZ19jb2VmX2luZGV4KTsKICAgICAgICAgICAgICAgICAgICB1Y19sYXN0ID0gMTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGkgIT0gdTFfbGFzdF9zaWdfY29lZl9pbmRleCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1MV9iaW4gPSAhISgodTJfc2lnX2NvZWZmX21hcCA+PiBpKSAmIDAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH13aGlsZSAoISgoaSA+IHUxX2xhc3Rfc2lnX2NvZWZfaW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaSA+ICh1MV9tYXhfbnVtX2NvZWZmcyAtIDEpKSkpOwogICAgICAgIH0KCiAgICAgICAgLyogRW5jb2RlIGNvZWZmX2Fic19sZXZlbF9taW51czEgYW5kIGNvZWZmX3NpZ25fZmxhZyAqLwogICAgICAgIHsKICAgICAgICAgICAgVVdPUkQ4IHUxX3NpZ247CiAgICAgICAgICAgIFVXT1JEMTYgdTJfYWJzX2xldmVsOwogICAgICAgICAgICBVV09SRDggdTFfYWJzX2xldmVsX2VxdWFsMSA9IDEsIHUxX2Fic19sZXZlbF9ndDEgPSAwOwogICAgICAgICAgICBVV09SRDggdTFfY3R4X2luYzsKICAgICAgICAgICAgVVdPUkQ4IHUxX2NvZmY7CiAgICAgICAgICAgIFdPUkQxNiBpMl9zdWZzOwogICAgICAgICAgICBXT1JEOCBpMV9iaW5zX2xlbjsKICAgICAgICAgICAgaSA9IHUxX2xhc3Rfc2lnX2NvZWZfaW5kZXg7CiAgICAgICAgICAgIHBpMTZfY29lZmZzID0gcGkyX3Jlc19ibG9jayArIHUxX25ueiAtIDE7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9zaWdfY29lZmYgPSB1NF9zaWdfY29lZmYgJiAoKDEgPDwgaSkgLSAxKTsKICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gMDsKICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gMDsKICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgLyogRW5jb2RlIHRoZSBBYnNMZXZlbE1pbnVzMSAqLwogICAgICAgICAgICAgICAgICAgIHUyX2Fic19sZXZlbCA9IEFCUygqKHBpMTZfY29lZmZzKSkgLSAxOwogICAgICAgICAgICAgICAgICAgIC8qIEN0eEluYyBmb3IgYmluMCAqLwogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSBNSU4odTFfYWJzX2xldmVsX2VxdWFsMSwgNCk7CiAgICAgICAgICAgICAgICAgICAgLyogQ3R4SW5jIGZvciByZW1haW5pbmcgKi8KICAgICAgICAgICAgICAgICAgICB1MV9jdHhfaW5jID0gNSArIE1JTih1MV9hYnNfbGV2ZWxfZ3QxLCA0KTsKICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gdTRfY3R4X2luYyArICh1MV9jdHhfaW5jIDw8IDQpOwogICAgICAgICAgICAgICAgICAgIGlmICh1Ml9hYnNfbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1MV9hYnNfbGV2ZWxfZ3QxKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHUxX2Fic19sZXZlbF9lcXVhbDEgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXUxX2Fic19sZXZlbF9ndDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHUxX2Fic19sZXZlbF9lcXVhbDErKzsKCiAgICAgICAgICAgICAgICAgICAgdTFfY29mZiA9IDE0OwogICAgICAgICAgICAgICAgICAgIGlmICh1Ml9hYnNfbGV2ZWwgPj0gdTFfY29mZikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByZWZpeCBUVSBpLmUgc3RyaW5nIG9mIDE0IDEncyAqLwogICAgICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gMHgzZmZmOwogICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLCAxLCBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfY2F0X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VmZml4LCB1c2VzIEVuY29kZUJ5cGFzcyAqLwogICAgICAgICAgICAgICAgICAgICAgICBpMl9zdWZzID0gdTJfYWJzX2xldmVsIC0gdTFfY29mZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIHU0X2JpbnMgPSBpaDI2NGVfY2FiYWNfVUVHazBfYmluYXJpemF0aW9uKGkyX3N1ZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpMV9iaW5zX2xlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2J5cGFzc19iaW5zKHBzX2NhYmFjX2N0eHQsIHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4pOwoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlZml4IG9ubHkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdTRfYmlucyA9ICgxIDw8IHUyX2Fic19sZXZlbCkgLSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiA9IHUyX2Fic19sZXZlbCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuY29kZSBUZXJtaW5hdGluZyBiaXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsIGkxX2JpbnNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywgMSwgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2NhdF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBlbmNvZGUgY29lZmZfc2lnbl9mbGFnW2ldICovCiAgICAgICAgICAgICAgICB1MV9zaWduID0gKCgqcGkxNl9jb2VmZnMpIDwgMCkgPyAxIDogMDsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYnlwYXNzX2Jpbihwc19jYWJhY19jdHh0LCB1MV9zaWduKTsKICAgICAgICAgICAgICAgIGkgPSBDTFoodTRfc2lnX2NvZWZmKTsKICAgICAgICAgICAgICAgIGkgPSAzMSAtIGk7CiAgICAgICAgICAgICAgICBwaTE2X2NvZWZmcy0tOwogICAgICAgICAgICB9d2hpbGUgKHU0X3NpZ19jb2VmZik7CiAgICAgICAgfQoKfQoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogV3JpdGUgREMgY29lZmZzIGZvciBpbnRyYSBwcmVkaWN0ZWQgbHVtYSBibG9jawogKgogKiBAcGFyYW1baW5dIHBzX2VudF9jdHh0CiAqICBQb2ludGVyIHRvIGVudHJvcHkgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZV9sdW1hX2RjKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCkKewoKICAgIC8qIENBQkFDIGNvbnRleHQgKi8KICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCA9IHBzX2VudF9jdHh0LT5wc19jYWJhYzsKICAgIHR1X3NibGtfY29lZmZfZGF0YV90ICpwc19tYl9jb2VmZl9kYXRhOwoKICAgIC8qIHBhY2tlZCByZXNpZHVlICovCiAgICB2b2lkICpwdl9tYl9jb2VmZl9kYXRhID0gcHNfZW50X2N0eHQtPnB2X21iX2NvZWZmX2RhdGE7CiAgICBVV09SRDE2IHUyX3NpZ19jb2VmZl9tYXA7CiAgICBXT1JEMTYgKnBpMl9yZXNfYmxvY2s7CiAgICBVV09SRDggdTFfbm56OwogICAgVVdPUkQ4IHUxX2NiZjsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICBtYl9pbmZvX2N0eHRfdCAqcF9DdXJDdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm87CgogICAgUEFSU0VfQ09FRkZfREFUQV9CTE9DS180eDQocHZfbWJfY29lZmZfZGF0YSwgcHNfbWJfY29lZmZfZGF0YSwgdTFfbm56LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTJfc2lnX2NvZWZmX21hcCwgcGkyX3Jlc19ibG9jayk7CgogICAgdTFfY2JmID0gISEodTFfbm56KTsKCiAgICB7CiAgICAgICAgVVdPUkQzMiB1NF9jdHhfaW5jOwogICAgICAgIFVXT1JEOCB1MV9hLCB1MV9iOwoKICAgICAgICB1MV9hID0gcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJiAweDE7CiAgICAgICAgdTFfYiA9IHBzX3RvcF9jdHh0LT51MV95dXZfZGNfY3NicCAmIDB4MTsKICAgICAgICB1NF9jdHhfaW5jID0gdTFfYSArICh1MV9iIDw8IDEpOwoKICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX2NiZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZSArIENCRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoTFVNQV9EQ19DVFhDQVQgPDwgMikgKyB1NF9jdHhfaW5jKTsKICAgIH0KCiAgICAvKiBXcml0ZSBjb2RlZF9ibG9ja19mbGFnICovCiAgICBpZiAodTFfY2JmKQogICAgewogICAgICAgIGloMjY0ZV9jYWJhY193cml0ZV9jb2VmZjR4NChwaTJfcmVzX2Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX25ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRUZGX0FCU19MRVZFTF9NSU5VUzEgKyBDT0VGRl9BQlNfTEVWRUxfQ0FUXzBfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNJR05JRklDQU5UX0NPRUZGX0ZMQUdfRlJBTUUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU0lHX0NPRUZGX0NUWFRfQ0FUXzBfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSB8PSAweDE7CiAgICAgICAgcF9DdXJDdHh0LT51MV95dXZfZGNfY3NicCB8PSAweDE7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJj0gMHg2OwogICAgICAgIHBfQ3VyQ3R4dC0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgfQoKICAgIHBzX2VudF9jdHh0LT5wdl9tYl9jb2VmZl9kYXRhID0gcHZfbWJfY29lZmZfZGF0YTsKfQoKCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEBicmllZgogKiBXcml0ZSBjaHJvbWEgcmVzaWR1ZXMgdG8gdGhlIGJpdHN0cmVhbQogKgogKiBAcGFyYW1baW5dIHBzX2VudF9jdHh0CiAqICBQb2ludGVyIHRvIGVudHJvcHkgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHBhcmFtW2luXSB1MV9jaHJvbWFfY2JwCiAqIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX3dyaXRlX2Nocm9tYV9yZXNpZHVlKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9jaHJvbWFfY2JwKQp7CiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CiAgICB0dV9zYmxrX2NvZWZmX2RhdGFfdCAqcHNfbWJfY29lZmZfZGF0YTsKICAgIC8qIHBhY2tlZCByZXNpZHVlICovCiAgICB2b2lkICpwdl9tYl9jb2VmZl9kYXRhID0gcHNfZW50X2N0eHQtPnB2X21iX2NvZWZmX2RhdGE7CiAgICBVV09SRDE2IHUyX3NpZ19jb2VmZl9tYXA7CiAgICBVV09SRDggdTFfbm56OwogICAgbWJfaW5mb19jdHh0X3QgKnBzX3RvcF9jdHh0X21iX2luZm8sICpwc19jdXJyX2N0eHQ7CgogICAgcHNfdG9wX2N0eHRfbWJfaW5mbyA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICBwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKCiAgICAvKioqKioqKioqKioqKioqKioqKiovCiAgICAvKiBXcml0ZSBDaHJvbWEgREMgKi8KICAgIC8qKioqKioqKioqKioqKioqKioqKi8KICAgIHsKICAgICAgICBXT1JEMTYgKnBpMl9yZXNfYmxvY2s7CiAgICAgICAgVVdPUkQ4IHUxX2xlZnRfZGNfY3NicCwgdTFfdG9wX2RjX2NzYnAsIHUxX3V2LCB1MV9jYmY7CgogICAgICAgIHUxX2xlZnRfZGNfY3NicCA9IChwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSkgPj4gMTsKICAgICAgICB1MV90b3BfZGNfY3NicCA9IChwc190b3BfY3R4dF9tYl9pbmZvLT51MV95dXZfZGNfY3NicCkgPj4gMTsKCiAgICAgICAgZm9yICh1MV91diA9IDA7IHUxX3V2IDwgMjsgdTFfdXYrKykKICAgICAgICB7CiAgICAgICAgICAgIFBBUlNFX0NPRUZGX0RBVEFfQkxPQ0tfNHg0KHB2X21iX2NvZWZmX2RhdGEsIHBzX21iX2NvZWZmX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX25ueiwgdTJfc2lnX2NvZWZmX21hcCwgcGkyX3Jlc19ibG9jayk7CiAgICAgICAgICAgIHUxX2NiZiA9ICEhKHUxX25ueik7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9hLCB1MV9iOwogICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhfaW5jOwogICAgICAgICAgICAgICAgdTFfYSA9ICh1MV9sZWZ0X2RjX2NzYnAgPj4gdTFfdXYpICYgMHgwMTsKICAgICAgICAgICAgICAgIHUxX2IgPSAodTFfdG9wX2RjX2NzYnAgPj4gdTFfdXYpICYgMHgwMTsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTFfYSArICh1MV9iIDw8IDEpKTsKCiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfY2JmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyBDQkYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoQ0hST01BX0RDX0NUWENBVCA8PCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHU0X2N0eF9pbmMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodTFfY2JmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfd3JpdGVfY29lZmY0eDQocGkyX3Jlc19ibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9ubnosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRUZGX0FCU19MRVZFTF9NSU5VUzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0VGRl9BQlNfTEVWRUxfQ0FUXzNfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNJR05JRklDQU5UX0NPRUZGX0ZMQUdfRlJBTUUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdfQ09FRkZfQ1RYVF9DQVRfM19PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgICAgICBTRVRCSVQodTFfdG9wX2RjX2NzYnAsIHUxX3V2KTsKICAgICAgICAgICAgICAgIFNFVEJJVCh1MV9sZWZ0X2RjX2NzYnAsIHUxX3V2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX3RvcF9kY19jc2JwLCB1MV91dik7CiAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV9sZWZ0X2RjX2NzYnAsIHUxX3V2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiAgICAgIFVwZGF0ZSB0aGUgREMgY3NicCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDE7CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCAmPSAweDE7CiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gfD0gKHUxX2xlZnRfZGNfY3NicCA8PCAxKTsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9kY19jc2JwIHw9ICh1MV90b3BfZGNfY3NicCA8PCAxKTsKICAgIH0KICAgIC8qKioqKioqKioqKioqKioqKioqLwogICAgLyogV3JpdGUgQ2hyb21hIEFDICovCiAgICAvKioqKioqKioqKioqKioqKioqKi8KICAgIHsKICAgICAgICBpZiAodTFfY2hyb21hX2NicCA9PSAyKQogICAgICAgIHsKICAgICAgICAgICAgVVdPUkQ4IHUxX3V2X2Jsa25vLCB1MV9sZWZ0X2FjX2NzYnAsIHUxX3RvcF9hY19jc2JwOwogICAgICAgICAgICBXT1JEMTYgKnBpMl9yZXNfYmxvY2s7CiAgICAgICAgICAgIHUxX2xlZnRfYWNfY3NicCA9IHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3V2X2FjX2NzYnBbMF07CiAgICAgICAgICAgIHUxX3RvcF9hY19jc2JwID0gcHNfdG9wX2N0eHRfbWJfaW5mby0+dTFfeXV2X2FjX2NzYnAgPj4gNDsKCiAgICAgICAgICAgIGZvciAodTFfdXZfYmxrbm8gPSAwOyB1MV91dl9ibGtubyA8IDg7IHUxX3V2X2Jsa25vKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9jYmY7CiAgICAgICAgICAgICAgICBVV09SRDggdTFfYjJiMCwgdTFfYjJiMTsKICAgICAgICAgICAgICAgIFBBUlNFX0NPRUZGX0RBVEFfQkxPQ0tfNHg0KHB2X21iX2NvZWZmX2RhdGEsIHBzX21iX2NvZWZmX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9ubnosIHUyX3NpZ19jb2VmZl9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaTJfcmVzX2Jsb2NrKTsKCiAgICAgICAgICAgICAgICB1MV9jYmYgPSAhISh1MV9ubnopOwogICAgICAgICAgICAgICAgdTFfYjJiMCA9ICgodTFfdXZfYmxrbm8gJiAweDQpID4+IDEpIHwgKHUxX3V2X2Jsa25vICYgMHgxKTsKICAgICAgICAgICAgICAgIHUxX2IyYjEgPSAoKHUxX3V2X2Jsa25vICYgMHg0KSA+PiAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh1MV91dl9ibGtubyAmIDB4MikgPj4gMSk7CgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9hLCB1MV9iOwogICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBjb2RlZF9ibG9ja19mbGFnICovCiAgICAgICAgICAgICAgICAgICAgdTFfYSA9ICh1MV9sZWZ0X2FjX2NzYnAgPj4gdTFfYjJiMSkgJiAweDE7CiAgICAgICAgICAgICAgICAgICAgdTFfYiA9ICh1MV90b3BfYWNfY3NicCA+PiB1MV9iMmIwKSAmIDB4MTsKICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gdTFfYSArICh1MV9iIDw8IDEpOwoKICAgICAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX2NiZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZSArIENCRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoQ0hST01BX0FDX0NUWENBVCA8PCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaW5jKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodTFfY2JmKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY193cml0ZV9jb2VmZjR4NChwaTJfcmVzX2Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9ubnosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0VGRl9BQlNfTEVWRUxfTUlOVVMxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPRUZGX0FCU19MRVZFTF9DQVRfNF9PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICtTSUdOSUZJQ0FOVF9DT0VGRl9GTEFHX0ZSQU1FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNJR19DT0VGRl9DVFhUX0NBVF80X09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICAgICAgICAgIFNFVEJJVCh1MV9sZWZ0X2FjX2NzYnAsIHUxX2IyYjEpOwogICAgICAgICAgICAgICAgICAgIFNFVEJJVCh1MV90b3BfYWNfY3NicCwgdTFfYjJiMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfbGVmdF9hY19jc2JwLCB1MV9iMmIxKTsKICAgICAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV90b3BfYWNfY3NicCwgdTFfYjJiMCk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgICAgICAvKiAgICAgIFVwZGF0ZSB0aGUgQUMgY3NicCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3V2X2FjX2NzYnBbMF0gPSB1MV9sZWZ0X2FjX2NzYnA7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgJj0gMHgwZjsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCB8PSAodTFfdG9wX2FjX2NzYnAgPDwgNCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3V2X2FjX2NzYnBbMF0gPSAwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwICY9IDB4ZjsKICAgICAgICB9CiAgICB9CiAgICBwc19lbnRfY3R4dC0+cHZfbWJfY29lZmZfZGF0YSA9IHB2X21iX2NvZWZmX2RhdGE7Cn0KCgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogRW5jb2RlcyBSZXNpZHVlcyBmb3IgdGhlIE1CIGFzIGRlZmluZWQgaW4gNy4zLjUuMwogKgogKiBAcGFyYW1baW5dIHBzX2VudF9jdHh0CiAqICBQb2ludGVyIHRvIGVudHJvcHkgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHBhcmFtW2luXSB1MV9jYnAKICogY29kZWQgYmxvY2sgcGF0dGVybgogKgogKiBAcGFyYW1baW5dIHUxX2N0eF9jYXQKICogQ29udGV4dCBjYXRlZ29yeSwgTFVNQV9BQ19DVFhDQVQgb3IgTFVNQV80eDRfQ1RYQ0FUCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUoZW50cm9weV9jdHh0X3QgKnBzX2VudF9jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jYnAsIFVXT1JEOCB1MV9jdHhfY2F0KQp7CiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CgogICAgdHVfc2Jsa19jb2VmZl9kYXRhX3QgKnBzX21iX2NvZWZmX2RhdGE7CiAgICAvKiBwYWNrZWQgcmVzaWR1ZSAqLwogICAgdm9pZCAqcHZfbWJfY29lZmZfZGF0YSA9IHBzX2VudF9jdHh0LT5wdl9tYl9jb2VmZl9kYXRhOwogICAgVVdPUkQxNiB1Ml9zaWdfY29lZmZfbWFwOwogICAgVVdPUkQ4IHUxX25uejsKICAgIG1iX2luZm9fY3R4dF90ICpwc19jdXJyX2N0eHQ7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQ7CiAgICBVV09SRDggdTFfbGVmdF9hY19jc2JwOwogICAgVVdPUkQ4IHUxX3RvcF9hY19jc2JwOwogICAgVVdPUkQzMiB1NF9jdHhfaWR4X29mZnNldF9zaWdfY29lZiwgdTRfY3R4X2lkeF9vZmZzZXRfYWJzX2x2bDsKICAgIHBzX2N1cnJfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvOwogICAgcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgdTFfbGVmdF9hY19jc2JwID0gcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwWzBdOwogICAgdTFfdG9wX2FjX2NzYnAgPSBwc190b3BfY3R4dC0+dTFfeXV2X2FjX2NzYnA7CgogICAgaWYgKHU0X2NicCAmIDB4ZikKICAgIHsKICAgICAgICAvKiAgV3JpdGUgbHVtYSByZXNpZHVlICAqLwogICAgICAgIFVXT1JEOCB1MV9vZmZzZXQ7CiAgICAgICAgV09SRDE2ICpwaTJfcmVzX2Jsb2NrOwogICAgICAgIFVXT1JEOCB1MV9zdWJibGtfbnVtOwogICAgICAgIGlmICh1MV9jdHhfY2F0ID09IExVTUFfQUNfQ1RYQ0FUKQogICAgICAgIHsKICAgICAgICAgICAgdTFfb2Zmc2V0ID0gMTsKICAgICAgICAgICAgdTRfY3R4X2lkeF9vZmZzZXRfc2lnX2NvZWYgPSBTSUdfQ09FRkZfQ1RYVF9DQVRfMV9PRkZTRVQ7CiAgICAgICAgICAgIHU0X2N0eF9pZHhfb2Zmc2V0X2Fic19sdmwgPSBDT0VGRl9BQlNfTEVWRUxfTUlOVVMxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0VGRl9BQlNfTEVWRUxfQ0FUXzFfT0ZGU0VUOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB1MV9vZmZzZXQgPSAwOwogICAgICAgICAgICB1NF9jdHhfaWR4X29mZnNldF9zaWdfY29lZiA9IFNJR19DT0VGRl9DVFhUX0NBVF8yX09GRlNFVDsKICAgICAgICAgICAgdTRfY3R4X2lkeF9vZmZzZXRfYWJzX2x2bCA9IENPRUZGX0FCU19MRVZFTF9NSU5VUzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09FRkZfQUJTX0xFVkVMX0NBVF8yX09GRlNFVDsKICAgICAgICB9CgogICAgICAgIGZvciAodTFfc3ViYmxrX251bSA9IDA7IHUxX3N1YmJsa19udW0gPCAxNjsgdTFfc3ViYmxrX251bSsrKQogICAgICAgIHsKICAgICAgICAgICAgVVdPUkQ4IHUxX2IwLCB1MV9iMSwgdTFfYjIsIHUxX2IzLCB1MV9iMmIwLCB1MV9iM2IxLCB1MV9iM2IyOwogICAgICAgICAgICB1MV9iMCA9ICh1MV9zdWJibGtfbnVtICYgMHgxKTsKICAgICAgICAgICAgdTFfYjEgPSAodTFfc3ViYmxrX251bSAmIDB4MikgPj4gMTsKICAgICAgICAgICAgdTFfYjIgPSAodTFfc3ViYmxrX251bSAmIDB4NCkgPj4gMjsKICAgICAgICAgICAgdTFfYjMgPSAodTFfc3ViYmxrX251bSAmIDB4OCkgPj4gMzsKICAgICAgICAgICAgdTFfYjJiMCA9ICh1MV9iMiA8PCAxKSB8ICh1MV9iMCk7CiAgICAgICAgICAgIHUxX2IzYjEgPSAodTFfYjMgPDwgMSkgfCAodTFfYjEpOwogICAgICAgICAgICB1MV9iM2IyID0gKHUxX2IzIDw8IDEpIHwgKHUxX2IyKTsKCiAgICAgICAgICAgIGlmICghKCh1NF9jYnAgPj4gdTFfYjNiMikgJiAweDEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBibG9jayBpcyBub3QgY29kZWQgc28gc2tpcCBhbGwgdGhlIHN1YiBibG9jayAqLwogICAgICAgICAgICAgICAgLyogYW5kIHNldCB0aGUgcG9pbnRlciBvZiBzY2FuIGxldmVsLCBjc2JwIGFjY3JvZGluZ2x5ICAgICAgKi8KICAgICAgICAgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX3RvcF9hY19jc2JwLCB1MV9iMmIwKTsKICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX3RvcF9hY19jc2JwLCAodTFfYjJiMCArIDEpKTsKICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX2xlZnRfYWNfY3NicCwgdTFfYjNiMSk7CiAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV9sZWZ0X2FjX2NzYnAsICh1MV9iM2IxICsgMSkpOwoKICAgICAgICAgICAgICAgIHUxX3N1YmJsa19udW0gKz0gMzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9jc2JmOwoKICAgICAgICAgICAgICAgIFBBUlNFX0NPRUZGX0RBVEFfQkxPQ0tfNHg0KHB2X21iX2NvZWZmX2RhdGEsIHBzX21iX2NvZWZmX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9ubnosIHUyX3NpZ19jb2VmZl9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaTJfcmVzX2Jsb2NrKTsKCiAgICAgICAgICAgICAgICB1MV9jc2JmID0gISEodTFfbm56KTsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBVV09SRDggdTFfYSwgdTFfYjsKICAgICAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICAgICAgICAgICAgICAgICAgdTFfYiA9ICh1MV90b3BfYWNfY3NicCA+PiB1MV9iMmIwKSAmIDB4MDE7CiAgICAgICAgICAgICAgICAgICAgdTFfYSA9ICh1MV9sZWZ0X2FjX2NzYnAgPj4gdTFfYjNiMSkgJiAweDAxOwogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSB1MV9hICsgKHUxX2IgPDwgMSk7CgogICAgICAgICAgICAgICAgICAgIC8qIEVuY29kZSB0aGUgYmluICovCiAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9jc2JmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgQ0JGCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHUxX2N0eF9jYXQgPDwgMikgKyB1NF9jdHhfaW5jKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgICAgICAvKiBXcml0ZSBjb2RlZF9ibG9ja19mbGFnICovCiAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgICAgICBpZiAodTFfY3NiZikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfd3JpdGVfY29lZmY0eDQocGkyX3Jlc19ibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQ4KSAoMTUgLSB1MV9vZmZzZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaWR4X29mZnNldF9hYnNfbHZsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdOSUZJQ0FOVF9DT0VGRl9GTEFHX0ZSQU1FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaWR4X29mZnNldF9zaWdfY29lZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICAgICAgICAgIFNFVEJJVCh1MV90b3BfYWNfY3NicCwgdTFfYjJiMCk7CiAgICAgICAgICAgICAgICAgICAgU0VUQklUKHUxX2xlZnRfYWNfY3NicCwgdTFfYjNiMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfdG9wX2FjX2NzYnAsIHUxX2IyYjApOwogICAgICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX2xlZnRfYWNfY3NicCwgdTFfYjNiMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIC8qICAgICAgICAgICAgICAgICAgIFVwZGF0ZSB0aGUgQUMgY3NicCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwWzBdID0gdTFfbGVmdF9hY19jc2JwICYgMHhmOwogICAgICAgIHUxX3RvcF9hY19jc2JwICY9IDB4MGY7CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCAmPSAweGYwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgfD0gdTFfdG9wX2FjX2NzYnA7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwWzBdID0gMDsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwICY9IDB4ZjA7CiAgICB9CgogICAgLyogICAgIFdyaXRlIGNocm9tYSByZXNpZHVlICovCgogICAgcHNfZW50X2N0eHQtPnB2X21iX2NvZWZmX2RhdGEgPSBwdl9tYl9jb2VmZl9kYXRhOwogICAgewogICAgICAgIFVXT1JEOCB1MV9jYnBfY2hyb21hOwogICAgICAgIHUxX2NicF9jaHJvbWEgPSB1NF9jYnAgPj4gNDsKICAgICAgICBpZiAodTFfY2JwX2Nocm9tYSkKICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY193cml0ZV9jaHJvbWFfcmVzaWR1ZShwc19lbnRfY3R4dCwgdTFfY2JwX2Nocm9tYSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4MTsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCAmPSAweDE7CiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3V2X2FjX2NzYnBbMF0gPSAwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwICY9IDB4ZjsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogRW5jb2RlcyBhIE1vdGlvbiB2ZWN0b3IgKDkuMy4zLjEuMS43ICkKICoKICogQHBhcmFtW2luXSB1MV9tdmQKICogIE1vdGlvbiB2ZWN0b3IgdG8gYmUgZW5jb2RlZAogKgogKiBAcGFyYW1baW5dIHU0X2N0eF9pZHhfb2Zmc2V0CiAqICogIGN0eElkeE9mZnNldCBmb3IgTVZfWCBvciBNVl9ZY29udGV4dAogKgogKiBAcGFyYW1baW5dICB1aTJfYWJzX212ZAogKiBzdW0gb2YgYWJzb2x1dGUgdmFsdWUgb2YgY29ycmVzcG9uZGluZyBuZWlnaGJvcmluZyBtb3Rpb24gdmVjdG9ycwogKgogKiBAcGFyYW1baW5dIHBzX2NhYmFjX2N0eHQKICogIFBvaW50ZXIgdG8gY2FiYWMgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZChXT1JEMTYgdTFfbXZkLCBVV09SRDMyIHU0X2N0eF9pZHhfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQxNiB1aTJfYWJzX212ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCkKewoKICAgIFVXT1JEOCAgdTFfYmluLCB1MV9jdHh0X2luYzsKICAgIFdPUkQ4IGsgPSAzLCB1MV9jb2ZmID0gOTsKICAgIFdPUkQxNiBpMl9hYnNfbXZkLCBpMl9zdWZzOwogICAgVVdPUkQzMiB1NF9jdHhfaW5jOwogICAgVVdPUkQzMiB1NF9iaW5zOwogICAgV09SRDggaTFfYmluc19sZW47CgogICAgLyogaWYgbXZkIDwgdTFfY29mZgogICAgIG9ubHkgUHJlZml4CiAgICAgZWxzZQogICAgIFByZWZpeCArIFN1ZmZpeAoKICAgICBlbmNvZGUgc2lnbiBiaXQKCiAgICAgUHJlZml4IFRVIGVuY29kaW5nIENtYXggPXUxX2NvZmYgYW5kIFN1ZmZpeCAzcmQgb3JkZXIgRXhwLUdvbG9tYgogICAgICovCgogICAgaWYgKHVpMl9hYnNfbXZkIDwgMykKICAgICAgICB1NF9jdHhfaW5jID0gMDsKICAgIGVsc2UgaWYgKHVpMl9hYnNfbXZkID4gMzIpCiAgICAgICAgdTRfY3R4X2luYyA9IDI7CiAgICBlbHNlCiAgICAgICAgdTRfY3R4X2luYyA9IDE7CgogICAgdTRfYmlucyA9IDA7CiAgICBpMV9iaW5zX2xlbiA9IDE7CgogICAgaWYgKHUxX212ZCA9PSAwKQogICAgewogICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZSArIHU0X2N0eF9pZHhfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHU0X2N0eF9pbmMpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGkyX2Fic19tdmQgPSBBQlModTFfbXZkKTsKICAgICAgICBpZiAoaTJfYWJzX212ZCA+PSB1MV9jb2ZmKQogICAgICAgIHsKICAgICAgICAgICAgLyogUHJlZml4IFRVIGkuZSBzdHJpbmcgb2YgOSAxJ3MgKi8KICAgICAgICAgICAgdTRfYmlucyA9IDB4MWZmOwogICAgICAgICAgICBpMV9iaW5zX2xlbiA9IDk7CiAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MDY1NDMwKTsKCiAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaWR4X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgLyogU3VmZml4LCB1c2VzIEVuY29kZUJ5cGFzcyAqLwogICAgICAgICAgICB1NF9iaW5zID0gMDsKICAgICAgICAgICAgaTFfYmluc19sZW4gPSAwOwogICAgICAgICAgICBpMl9zdWZzID0gaTJfYWJzX212ZCAtIHUxX2NvZmY7CiAgICAgICAgICAgIHdoaWxlICgxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaTJfc3VmcyA+PSAoMSA8PCBrKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCAoMzEgLSBpMV9iaW5zX2xlbikpKTsKICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICAgICAgICAgIGkyX3N1ZnMgPSBpMl9zdWZzIC0gKDEgPDwgayk7CiAgICAgICAgICAgICAgICAgICAgaysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGstLSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHUxX2JpbiA9ICgoaTJfc3VmcyA+PiBrKSAmIDB4MDEpOwogICAgICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAodTFfYmluIDw8ICgzMSAtIGkxX2JpbnNfbGVuKSkpOwogICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1NF9iaW5zID4+PSAoMzIgLSBpMV9iaW5zX2xlbik7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYnlwYXNzX2JpbnMocHNfY2FiYWNfY3R4dCwgdTRfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIFByZWZpeCBvbmx5ICovCiAgICAgICAgICAgIC8qIGIwICovCiAgICAgICAgICAgIHU0X2JpbnMgPSAxOwogICAgICAgICAgICBpMl9hYnNfbXZkLS07CiAgICAgICAgICAgIHUxX2N0eHRfaW5jID0gMzsKICAgICAgICAgICAgd2hpbGUgKGkyX2Fic19tdmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGkyX2Fic19tdmQtLTsKICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8ICgxIDw8IGkxX2JpbnNfbGVuKSk7CiAgICAgICAgICAgICAgICBpZiAodTFfY3R4dF9pbmMgPD0gNikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodTFfY3R4dF9pbmMgPDwgKGkxX2JpbnNfbGVuIDw8IDIpKSk7CiAgICAgICAgICAgICAgICAgICAgdTFfY3R4dF9pbmMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogRW5jb2RlIFRlcm1pbmF0aW5nIGJpdCAqLwogICAgICAgICAgICBpZiAoaTFfYmluc19sZW4gPD0gNCkKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8ICh1MV9jdHh0X2luYyA8PCAoaTFfYmluc19sZW4gPDwgMikpKTsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHU0X2N0eF9pZHhfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgfQogICAgICAgIC8qIHNpZ24gYml0LCB1c2VzIEVuY29kZUJ5cGFzcyAqLwogICAgICAgIGlmICh1MV9tdmQgPiAwKQogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2J5cGFzc19iaW4ocHNfY2FiYWNfY3R4dCwgMCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2J5cGFzc19iaW4ocHNfY2FiYWNfY3R4dCwgMSk7CiAgICB9Cn0KCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogRW5jb2RlcyBhbGwgbW90aW9uIHZlY3RvcnMgZm9yIGEgUDE2eDE2IE1CCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHBpMl9tdl9wdHIKICogUG9pbnRlciB0byBhcnJheSBvZiBtb3Rpb24gdmVjdG9ycwogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19tdmRzX3AxNngxNihjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRDE2ICpwaTJfbXZfcHRyKQp7CgoKICAgIC8qIEVuY29kZSB0aGUgZGlmZmVyZW50aWFsIGNvbXBvbmVudCBvZiB0aGUgbW90aW9uIHZlY3RvcnMgKi8KCiAgICB7CiAgICAgICAgVVdPUkQ4IHUxX2Fic19tdmRfeCwgdTFfYWJzX212ZF95OwogICAgICAgIFVXT1JEOCAqcHUxX3RvcF9tdl9jdHh0LCAqcHUxX2xmdF9tdl9jdHh0OwogICAgICAgIFdPUkQxNiB1Ml9tdjsKICAgICAgICB1MV9hYnNfbXZkX3ggPSAwOwogICAgICAgIHUxX2Fic19tdmRfeSA9IDA7CiAgICAgICAgcHUxX3RvcF9tdl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm8tPnUxX212WzBdOwogICAgICAgIHB1MV9sZnRfbXZfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jWzBdOwogICAgICAgIHsKICAgICAgICAgICAgVVdPUkQxNiB1Ml9hYnNfbXZkX3hfYSwgdTJfYWJzX212ZF94X2IsIHUyX2Fic19tdmRfeV9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTJfYWJzX212ZF95X2I7CiAgICAgICAgICAgIHUyX2Fic19tdmRfeF9iID0gKFVXT1JEMTYpIHB1MV90b3BfbXZfY3R4dFswXTsKICAgICAgICAgICAgdTJfYWJzX212ZF95X2IgPSAoVVdPUkQxNikgcHUxX3RvcF9tdl9jdHh0WzFdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3hfYSA9IChVV09SRDE2KSBwdTFfbGZ0X212X2N0eHRbMF07CiAgICAgICAgICAgIHUyX2Fic19tdmRfeV9hID0gKFVXT1JEMTYpIHB1MV9sZnRfbXZfY3R4dFsxXTsKICAgICAgICAgICAgdTJfbXYgPSAqKHBpMl9tdl9wdHIrKyk7CgogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2N0eF9tdmQodTJfbXYsIE1WRF9YLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQxNikgKHUyX2Fic19tdmRfeF9hICsgdTJfYWJzX212ZF94X2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIHUxX2Fic19tdmRfeCA9IENMSVAzKDAsIDEyNywgQUJTKHUyX212KSk7CiAgICAgICAgICAgIHUyX212ID0gKihwaTJfbXZfcHRyKyspOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jdHhfbXZkKHUyX212LCBNVkRfWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVXT1JEMTYpICh1Ml9hYnNfbXZkX3lfYSArIHUyX2Fic19tdmRfeV9iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICB1MV9hYnNfbXZkX3kgPSBDTElQMygwLCAxMjcsIEFCUyh1Ml9tdikpOwogICAgICAgIH0KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIC8qIFN0b3JlIGFic19tdmRfdmFsdWVzIGNhYmFjIGNvbnRleHRzICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICBwdTFfdG9wX212X2N0eHRbMF0gPSBwdTFfbGZ0X212X2N0eHRbMF0gPSB1MV9hYnNfbXZkX3g7CiAgICAgICAgcHUxX3RvcF9tdl9jdHh0WzFdID0gcHUxX2xmdF9tdl9jdHh0WzFdID0gdTFfYWJzX212ZF95OwogICAgfQp9CgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEBicmllZgogKiBFbmNvZGVzIGFsbCBtb3Rpb24gdmVjdG9ycyBmb3IgYSBCIE1CIChBc3N1ZXMgdGhhdCBtYnlwZSBpcyBCX0wwXzE2eDE2LCBCX0wxXzE2eDE2IG9yIEJfQmlfMTZ4MTYKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEBwYXJhbVtpbl0gcGkyX212X3B0cgogKiBQb2ludGVyIHRvIGFycmF5IG9mIG1vdGlvbiB2ZWN0b3JzCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jX212ZHNfYjE2eDE2KGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEMTYgKnBpMl9tdl9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGk0X21iX3BhcnRfcHJlZF9tb2RlICkKewoKICAgIC8qIEVuY29kZSB0aGUgZGlmZmVyZW50aWFsIGNvbXBvbmVudCBvZiB0aGUgbW90aW9uIHZlY3RvcnMgKi8KCiAgICB7CiAgICAgICAgVVdPUkQ4IHUxX2Fic19tdmRfeCwgdTFfYWJzX212ZF95OwogICAgICAgIFVXT1JEOCAqcHUxX3RvcF9tdl9jdHh0LCAqcHUxX2xmdF9tdl9jdHh0OwogICAgICAgIFdPUkQxNiB1Ml9tdjsKICAgICAgICB1MV9hYnNfbXZkX3ggPSAwOwogICAgICAgIHUxX2Fic19tdmRfeSA9IDA7CiAgICAgICAgcHUxX3RvcF9tdl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm8tPnUxX212WzBdOwogICAgICAgIHB1MV9sZnRfbXZfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jWzBdOwogICAgICAgIGlmIChpNF9tYl9wYXJ0X3ByZWRfbW9kZSAhPSBQUkVEX0wxKS8qIHx8IFBSRURfQkkgKi8KICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEMTYgdTJfYWJzX212ZF94X2EsIHUyX2Fic19tdmRfeF9iLCB1Ml9hYnNfbXZkX3lfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3hfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbMF07CiAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iID0gKFVXT1JEMTYpIHB1MV90b3BfbXZfY3R4dFsxXTsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzBdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYSA9IChVV09SRDE2KSBwdTFfbGZ0X212X2N0eHRbMV07CiAgICAgICAgICAgIHUyX212ID0gcGkyX212X3B0clswXTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF94X2EgKyB1Ml9hYnNfbXZkX3hfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF94ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICAgICAgdTJfbXYgPSBwaTJfbXZfcHRyWzFdOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jdHhfbXZkKHUyX212LCBNVkRfWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVXT1JEMTYpICh1Ml9hYnNfbXZkX3lfYSArIHUyX2Fic19tdmRfeV9iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICB1MV9hYnNfbXZkX3kgPSBDTElQMygwLCAxMjcsIEFCUyh1Ml9tdikpOwogICAgICAgIH0KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiBTdG9yZSBhYnNfbXZkX3ZhbHVlcyBjYWJhYyBjb250ZXh0cyAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgcHUxX3RvcF9tdl9jdHh0WzBdID0gcHUxX2xmdF9tdl9jdHh0WzBdID0gdTFfYWJzX212ZF94OwogICAgICAgIHB1MV90b3BfbXZfY3R4dFsxXSA9IHB1MV9sZnRfbXZfY3R4dFsxXSA9IHUxX2Fic19tdmRfeTsKCiAgICAgICAgdTFfYWJzX212ZF94ID0gMDsKICAgICAgICB1MV9hYnNfbXZkX3kgPSAwOwogICAgICAgIGlmIChpNF9tYl9wYXJ0X3ByZWRfbW9kZSAhPSBQUkVEX0wwKS8qIHx8IFBSRURfQkkgKi8KICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEMTYgdTJfYWJzX212ZF94X2EsIHUyX2Fic19tdmRfeF9iLCB1Ml9hYnNfbXZkX3lfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3hfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbMl07CiAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iID0gKFVXT1JEMTYpIHB1MV90b3BfbXZfY3R4dFszXTsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzJdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYSA9IChVV09SRDE2KSBwdTFfbGZ0X212X2N0eHRbM107CiAgICAgICAgICAgIHUyX212ID0gcGkyX212X3B0clsyXTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF94X2EgKyB1Ml9hYnNfbXZkX3hfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF94ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICAgICAgdTJfbXYgPSBwaTJfbXZfcHRyWzNdOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jdHhfbXZkKHUyX212LCBNVkRfWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVXT1JEMTYpICh1Ml9hYnNfbXZkX3lfYSArIHUyX2Fic19tdmRfeV9iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICB1MV9hYnNfbXZkX3kgPSBDTElQMygwLCAxMjcsIEFCUyh1Ml9tdikpOwogICAgICAgIH0KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIC8qIFN0b3JlIGFic19tdmRfdmFsdWVzIGNhYmFjIGNvbnRleHRzICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICBwdTFfdG9wX212X2N0eHRbMl0gPSBwdTFfbGZ0X212X2N0eHRbMl0gPSB1MV9hYnNfbXZkX3g7CiAgICAgICAgcHUxX3RvcF9tdl9jdHh0WzNdID0gcHUxX2xmdF9tdl9jdHh0WzNdID0gdTFfYWJzX212ZF95OwogICAgfQp9CgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBAYnJpZWYKICogIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIENBQkFDIGNvZGVkIGJpdCBzdHJlYW0gZm9yIGFuIEludHJhIFNsaWNlLgogKgogKiBAZGVzY3JpcHRpb24KICogIFRoZSBtYiBzeW50YXggbGF5ZXIgZm9yIGludHJhIHNsaWNlcyBjb25zdGl0dXRlcyBsdW1hIG1iIG1vZGUsIG1iIHFwIGRlbHRhLCBjb2RlZCBibG9jayBwYXR0ZXJuLCBjaHJvbWEgbWIgbW9kZSBhbmQKICogIGx1bWEvY2hyb21hIHJlc2lkdWUuIFRoZXNlIHN5bnRheCBlbGVtZW50cyBhcmUgd3JpdHRlbiBhcyBkaXJlY3RlZCBieSB0YWJsZQogKiAgNy4zLjUgb2YgaDI2NCBzcGVjaWZpY2F0aW9uLgogKgogKiBAcGFyYW1baW5dIHBzX2VudF9jdHh0CiAqICBwb2ludGVyIHRvIGVudHJvcHkgY29udGV4dAogKgogKiBAcmV0dXJucyBlcnJvciBjb2RlCiAqCiAqIEByZW1hcmtzIG5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCklIMjY0RV9FUlJPUl9UIGloMjY0ZV93cml0ZV9pc2xpY2VfbWJfY2FiYWMoZW50cm9weV9jdHh0X3QgKnBzX2VudF9jdHh0KQp7CiAgICAvKiBiaXQgc3RyZWFtIHB0ciAqLwogICAgYml0c3RybV90ICpwc19iaXRzdHJlYW0gPSBwc19lbnRfY3R4dC0+cHNfYml0c3RybTsKICAgIC8qIENBQkFDIGNvbnRleHQgKi8KICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCA9IHBzX2VudF9jdHh0LT5wc19jYWJhYzsKICAgIC8qIHBhY2tlZCBoZWFkZXIgZGF0YSAqLwogICAgVVdPUkQ4ICpwdTFfYnl0ZSA9IHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKICAgIG1iX2hkcl9jb21tb25fdCAqcHNfbWJfaGRyID0gKG1iX2hkcl9jb21tb25fdCAqKXBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKICAgIG1iX2luZm9fY3R4dF90ICpwc19jdXJyX2N0eHQ7CiAgICBXT1JEMzIgbWJfdHBtLCBtYl90eXBlLCBjYnAsIGNocm9tYV9pbnRyYV9tb2RlLCBsdW1hX2ludHJhX21vZGU7CiAgICBXT1JEOCBtYl9xcF9kZWx0YTsKICAgIFVXT1JEMzIgdTRfY2JwX2wsIHU0X2NicF9jOwogICAgV09SRDMyIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQsIGJpdHN0cmVhbV9lbmRfb2Zmc2V0OwoKICAgIGlmICgocHNfYml0c3RyZWFtLT51NF9zdHJtX2J1Zl9vZmZzZXQgKyBNSU5fU1RSRUFNX1NJWkVfTUIpCiAgICAgICAgICAgICAgICAgICAgPj0gcHNfYml0c3RyZWFtLT51NF9tYXhfc3RybV9zaXplKQogICAgewogICAgICAgIC8qIHJldHVybiB3aXRob3V0IGNvcnJ1cHRpbmcgdGhlIGJ1ZmZlciBiZXlvbmQgaXRzIHNpemUgKi8KICAgICAgICByZXR1cm4gKElIMjY0RV9CSVRTVFJFQU1fQlVGRkVSX09WRVJGTE9XKTsKICAgIH0KICAgIC8qIG1iIGhlYWRlciBpbmZvICovCiAgICBtYl90cG0gPSBwc19tYl9oZHItPnUxX21iX3R5cGVfbW9kZTsKICAgIGNicCA9IHBzX21iX2hkci0+dTFfY2JwOwogICAgbWJfcXBfZGVsdGEgPSBwc19tYl9oZHItPnUxX21iX3FwX2RlbHRhOwoKICAgIC8qIG1iIHR5cGUgKi8KICAgIG1iX3R5cGUgPSBtYl90cG0gJiAweEY7CgogICAgaWgyNjRlX2dldF9jYWJhY19jb250ZXh0KHBzX2VudF9jdHh0LCBtYl90eXBlKTsKICAgIHBzX2N1cnJfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvOwoKICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICB1NF9jYnBfYyA9IChjYnAgPj4gNCk7CiAgICB1NF9jYnBfbCA9IChjYnAgJiAweEYpOwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgewogICAgICAgIGx1bWFfaW50cmFfbW9kZSA9ICgobWJfdHBtID4+IDQpICYgMykgKyAxICsgKHU0X2NicF9jIDw8IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICsgKHU0X2NicF9sID09IDE1KSAqIDEyOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGx1bWFfaW50cmFfbW9kZSA9IDA7CiAgICB9CgogICAgY2hyb21hX2ludHJhX21vZGUgPSAobWJfdHBtID4+IDYpOwoKICAgIC8qIEVuY29kZSBJbnRyYSBwcmVkIG1vZGUsIEx1bWEgKi8KICAgIGloMjY0ZV9jYWJhY19lbmNfaW50cmFfbWJfdHlwZShJU0xJQ0UsIGx1bWFfaW50cmFfbW9kZSwgcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9UWVBFX0lfU0xJQ0UpOwoKICAgIGlmIChtYl90eXBlID09IEk0eDQpCiAgICB7CiAgICAgICAgLyogRW5jb2RlIDR4NCBNQiBtb2RlcyAqLwogICAgICAgIG1iX2hkcl9pNHg0X3QgKnBzX21iX2hkcl9pNHg0ID0gKG1iX2hkcl9pNHg0X3QgKilwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGE7CiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY180eDRtYl9tb2Rlcyhwc19jYWJhY19jdHh0LCBwc19tYl9oZHJfaTR4NC0+YXUxX3N1Yl9ibGtfbW9kZXMpOwogICAgfQogICAgLyogRW5jb2RlIGNocm9tYSBtb2RlICovCiAgICBpaDI2NGVfY2FiYWNfZW5jX2Nocm9tYV9wcmVkbW9kZShjaHJvbWFfaW50cmFfbW9kZSwgcHNfY2FiYWNfY3R4dCk7CgogICAgaWYgKG1iX3R5cGUgIT0gSTE2eDE2KQogICAgeyAvKiBFbmNvZGUgTUIgY2JwICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKICAgIH0KCiAgICBpZiAoKGNicCA+IDApIHx8IChtYl90eXBlID09IEkxNngxNikpCiAgICB7CiAgICAgICAgLyogRW5jb2RlIG1iX3FwX2RlbHRhICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSBjYnA7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZV9sdW1hX2RjKHBzX2VudF9jdHh0KTsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfQUNfQ1RYQ0FUKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSBjYnA7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IEk0eDQ7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV80WDRfQ1RYQ0FUKTsKICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJj0gMHg2OwogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgIH0KICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWRlIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgPSAwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgPSAwOwogICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwKSA9IDA7CiAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicCkgPSAwOwogICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKCiAgICAgICAgLyogQ29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdXNlZCB1c2VkIGZvciBlbmNvZGluZyB0aGUgTUIgc3ludGF4ICovCiAgICB9CiAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfY2JwID0gY2JwOwoKICAgIGlmIChtYl90eXBlID09IEkxNngxNikKICAgIHsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfSTE2eDE2OwogICAgICAgIHB1MV9ieXRlICs9IHNpemVvZihtYl9oZHJfaTE2eDE2X3QpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgIHB1MV9ieXRlICs9IHNpemVvZihtYl9oZHJfaTR4NF90KTsKICAgIH0KICAgIHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSA9IHB1MV9ieXRlOwogICAgcmV0dXJuIElIMjY0RV9TVUNDRVNTOwp9CgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQGJyaWVmCiAqICBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBDQUJBQyBjb2RlZCBiaXQgc3RyZWFtIGZvciBJbnRlciBzbGljZXMKICoKICogQGRlc2NyaXB0aW9uCiAqICBUaGUgbWIgc3ludGF4IGxheWVyIGZvciBpbnRlciBzbGljZXMgY29uc3RpdHV0ZXMgbHVtYSBtYiBtb2RlLCBtYiBxcCBkZWx0YSwgY29kZWQgYmxvY2sgcGF0dGVybiwgY2hyb21hIG1iIG1vZGUgYW5kCiAqICBsdW1hL2Nocm9tYSByZXNpZHVlLiBUaGVzZSBzeW50YXggZWxlbWVudHMgYXJlIHdyaXR0ZW4gYXMgZGlyZWN0ZWQgYnkgdGFibGUKICogIDcuMy41IG9mIGgyNjQgc3BlY2lmaWNhdGlvbgogKgogKiBAcGFyYW1baW5dIHBzX2VudF9jdHh0CiAqICBwb2ludGVyIHRvIGVudHJvcHkgY29udGV4dAogKgogKiBAcmV0dXJucyBlcnJvciBjb2RlCiAqCiAqIEByZW1hcmtzIG5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCklIMjY0RV9FUlJPUl9UIGloMjY0ZV93cml0ZV9wc2xpY2VfbWJfY2FiYWMoZW50cm9weV9jdHh0X3QgKnBzX2VudF9jdHh0KQp7CiAgICAvKiBiaXQgc3RyZWFtIHB0ciAqLwogICAgYml0c3RybV90ICpwc19iaXRzdHJlYW0gPSBwc19lbnRfY3R4dC0+cHNfYml0c3RybTsKICAgIC8qIENBQkFDIGNvbnRleHQgKi8KICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCA9IHBzX2VudF9jdHh0LT5wc19jYWJhYzsKCiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfY3Vycl9jdHh0OwoKICAgIFdPUkQzMiBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0LCBiaXRzdHJlYW1fZW5kX29mZnNldDsKICAgIFdPUkQzMiBtYl90cG0sIG1iX3R5cGUsIGNicCwgY2hyb21hX2ludHJhX21vZGUsIGx1bWFfaW50cmFfbW9kZTsKICAgIFdPUkQ4IG1iX3FwX2RlbHRhOwogICAgVVdPUkQzMiB1NF9jYnBfbCwgdTRfY2JwX2M7CiAgICBVV09SRDggKnB1MV9ieXRlID0gcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhOwogICAgbWJfaGRyX2NvbW1vbl90ICpwc19tYl9oZHIgPSAobWJfaGRyX2NvbW1vbl90ICopcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhOwoKICAgIGlmICgocHNfYml0c3RyZWFtLT51NF9zdHJtX2J1Zl9vZmZzZXQgKyBNSU5fU1RSRUFNX1NJWkVfTUIpCiAgICAgICAgICAgICAgICAgICAgPj0gcHNfYml0c3RyZWFtLT51NF9tYXhfc3RybV9zaXplKQogICAgewogICAgICAgIC8qIHJldHVybiB3aXRob3V0IGNvcnJ1cHRpbmcgdGhlIGJ1ZmZlciBiZXlvbmQgaXRzIHNpemUgKi8KICAgICAgICByZXR1cm4gKElIMjY0RV9CSVRTVFJFQU1fQlVGRkVSX09WRVJGTE9XKTsKICAgIH0KICAgIC8qIG1iIGhlYWRlciBpbmZvICovCiAgICBtYl90cG0gPSBwc19tYl9oZHItPnUxX21iX3R5cGVfbW9kZTsKCiAgICAvKiBtYiB0eXBlICovCiAgICBtYl90eXBlID0gbWJfdHBtICYgMHhGOwogICAgLyogQ0FCQUMgY29udGV4dHMgZm9yIHRoZSBNQiAqLwogICAgaWgyNjRlX2dldF9jYWJhY19jb250ZXh0KHBzX2VudF9jdHh0LCBtYl90eXBlKTsKICAgIHBzX2N1cnJfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvOwoKICAgIC8qIGlmIEludHJhIE1CICovCiAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYgfHwgbWJfdHlwZSA9PSBJNHg0KQogICAgewogICAgICAgIGNicCA9IHBzX21iX2hkci0+dTFfY2JwOwogICAgICAgIG1iX3FwX2RlbHRhID0gcHNfbWJfaGRyLT51MV9tYl9xcF9kZWx0YTsKCiAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CgogICAgICAgIC8qIEVuY29kZSBtYl9za2lwX2ZsYWcgKi8KICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3NraXAoMCwgcHNfY2FiYWNfY3R4dCwgTUJfU0tJUF9GTEFHX1BfU0xJQ0UpOwogICAgICAgIHU0X2NicF9jID0gKGNicCA+PiA0KTsKICAgICAgICB1NF9jYnBfbCA9IChjYnAgJiAweEYpOwogICAgICAgIGlmIChtYl90eXBlID09IEkxNngxNikKICAgICAgICB7CiAgICAgICAgICAgIGx1bWFfaW50cmFfbW9kZSA9ICgobWJfdHBtID4+IDQpICYgMykgKyAxICsgKHU0X2NicF9jIDw8IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh1NF9jYnBfbCA9PSAxNSkgKiAxMjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbHVtYV9pbnRyYV9tb2RlID0gMDsKICAgICAgICB9CiAgICAgICAgLyogRW5jb2RlIGludHJhIG1iIHR5cGUgKi8KICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1CX1RZUEVfUF9TTElDRSk7CgogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2ludHJhX21iX3R5cGUoUFNMSUNFLCAoVVdPUkQ4KSBsdW1hX2ludHJhX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LCBNQl9UWVBFX1BfU0xJQ0UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTR4NCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIEludHJhIDR4NCBtb2RlcyAqLwogICAgICAgICAgICBtYl9oZHJfaTR4NF90ICpwc19tYl9oZHJfaTR4NCA9IChtYl9oZHJfaTR4NF90ICopcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhOwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jXzR4NG1iX21vZGVzKHBzX2NhYmFjX2N0eHQsIHBzX21iX2hkcl9pNHg0LT5hdTFfc3ViX2Jsa19tb2Rlcyk7CiAgICAgICAgfQogICAgICAgIGNocm9tYV9pbnRyYV9tb2RlID0gKG1iX3RwbSA+PiA2KTsKCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jaHJvbWFfcHJlZG1vZGUoY2hyb21hX2ludHJhX21vZGUsIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICBpZiAobWJfdHlwZSAhPSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICAvKiBlbmNvZGUgQ0JQICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY2JwKGNicCwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoKGNicCA+IDApIHx8IChtYl90eXBlID09IEkxNngxNikpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3FwX2RlbHRhKG1iX3FwX2RlbHRhLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBSZXNpZHVlICovCiAgICAgICAgICAgIGlmIChtYl90eXBlID09IEkxNngxNikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gKFVXT1JEOCkgY2JwOwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlX2x1bWFfZGMocHNfZW50X2N0eHQpOwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfQUNfQ1RYQ0FUKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gKFVXT1JEOCkgY2JwOwogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gSTR4NDsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfNFg0X0NUWENBVCk7CiAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDY7CiAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWRlIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X3Jlc2lkdWVfYml0c1swXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwKSA9IDA7CiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICB9CgogICAgICAgIG1lbXNldChwc19jdXJyX2N0eHQtPnUxX212LCAwLCAxNik7CiAgICAgICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm8tPnUxX2NicCA9IChVV09SRDgpIGNicDsKCiAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICAgICAgcHUxX2J5dGUgKz0gc2l6ZW9mKG1iX2hkcl9pMTZ4MTZfdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgICAgICBwdTFfYnl0ZSArPSBzaXplb2YobWJfaGRyX2k0eDRfdCk7CiAgICAgICAgfQoKICAgICAgICBwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEgPSBwdTFfYnl0ZTsKCiAgICAgICAgcmV0dXJuIElIMjY0RV9TVUNDRVNTOwogICAgfQogICAgZWxzZSAvKiBJbnRlciBNQiAqLwogICAgewogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgIC8qIEVuY29kaW5nIFAxNngxNiAqLwogICAgICAgIGlmIChtYl90eXBlICE9IFBTS0lQKQogICAgICAgIHsKICAgICAgICAgICAgbWJfaGRyX3AxNngxNl90ICpwc19tYl9oZHJfcDE2eDE2ID0gKG1iX2hkcl9wMTZ4MTZfdCAqKXBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKICAgICAgICAgICAgY2JwID0gcHNfbWJfaGRyLT51MV9jYnA7CiAgICAgICAgICAgIG1iX3FwX2RlbHRhID0gcHNfbWJfaGRyLT51MV9tYl9xcF9kZWx0YTsKCiAgICAgICAgICAgIC8qIEVuY29kaW5nIG1iX3NraXAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19QX1NMSUNFKTsKCiAgICAgICAgICAgIC8qIEVuY29kaW5nIG1iX3R5cGUgYXMgUDE2eDE2ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luY19wOwogICAgICAgICAgICAgICAgdTRfY3R4X2luY19wID0gKDB4MDEwICsgKCgyKSA8PCA4KSk7CgogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKDAsIDMsIHU0X2N0eF9pbmNfcCwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlW01CX1RZUEVfUF9TTElDRV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9QOwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBXT1JEMTYgKnBpMl9tdl9wdHIgPSAoV09SRDE2ICopIHBzX21iX2hkcl9wMTZ4MTYtPmFpMl9tdjsKCiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSAocHNfY3Vycl9jdHh0LT51MV9tYl90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDQUJfTk9OX0JEMTZ4MTYpOwogICAgICAgICAgICAgICAgIC8qIEVuY29kaW5nIG1vdGlvbiB2ZWN0b3IgZm9yIFAxNngxNiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tdmRzX3AxNngxNihwc19jYWJhY19jdHh0LCBwaTJfbXZfcHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBFbmNvZGUgQ0JQICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY2JwKGNicCwgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICBpZiAoY2JwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBlbmNvZGUgbWJfcXBfZGVsdGEgKi8KICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbWJfcXBfZGVsdGEobWJfcXBfZGVsdGEsIHBzX2NhYmFjX2N0eHQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzFdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KICAgICAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0OwoKICAgICAgICAgICAgcHUxX2J5dGUgKz0gc2l6ZW9mKG1iX2hkcl9wMTZ4MTZfdCk7CgogICAgICAgIH0KICAgICAgICBlbHNlLyogTUIgPSBQU0tJUCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDEsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19QX1NMSUNFKTsKCiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9QX1NLSVA7CiAgICAgICAgICAgICgqcHNfZW50X2N0eHQtPnBpNF9tYl9za2lwX3J1bikrKzsKCiAgICAgICAgICAgIG1lbXNldChwc19jdXJyX2N0eHQtPnUxX212LCAwLCAxNik7CiAgICAgICAgICAgIG1lbXNldChwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luYywgMCwgMTYpOwogICAgICAgICAgICBjYnAgPSAwOwoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9oZWFkZXJfYml0c1sxXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgICAgICAvKiBTdGFydGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZHVlICovCgogICAgICAgICAgICBwdTFfYnl0ZSArPSBzaXplb2YobWJfaGRyX3Bza2lwX3QpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNicCA+IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBFbmNvZGUgcmVzaWR1ZSAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV80WDRfQ1RYQ0FUKTsKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkZSBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKCiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4NjsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCAmPSAweDY7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgPSAwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9kY19jc2JwID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnApID0gMDsKICAgICAgICB9CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9pbnRyYXByZWRfY2hyb21hX21vZGUgPSAwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gY2JwOwogICAgICAgIHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSA9IHB1MV9ieXRlOwoKICAgICAgICByZXR1cm4gSUgyNjRFX1NVQ0NFU1M7CiAgICB9Cn0KCgovKiAhIDwgVGFibGUgOS0zNyCWIEJpbmFyaXphdGlvbiBmb3IgbWFjcm9ibG9jayB0eXBlcyBpbiBCIHNsaWNlcyAgaW4gSVRVX1RfSDI2NC0yMDE0MDIKICogQml0cyAwLTcgOiBiaW5hcmlzZWQgdmFsdWUKICogQml0cyA4LTE1OiBsZW5ndGggb2YgYmluYXJ5IHNlcXVlbmNlICovCgoKc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfYl9tYl90eXBlWzI3XSA9IHsgMHgwMTAwLCAweDAzMDEsIDB4MDMwNSwgMHgwNjAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMsIDB4MDYxMywgMHgwNjMzLCAweDA2MGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyYiwgMHgwNjFiLCAweDA2M2IsIDB4MDYxZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzA3LCAweDA3NDcsIDB4MDcyNywgMHgwNzY3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTcsIDB4MDc1NywgMHgwNzM3LCAweDA3NzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwZiwgMHgwNzRmLCAweDA2M2YgfTsKLyogQ3R4SW5jIGZvciBtYiB0eXBlcyBpbiBCIHNsaWNlcyAqLwpzdGF0aWMgY29uc3QgVVdPUkQzMiB1aV9iX21iX3R5cGVfY3R4X2luY1syN10gPSB7IDB4MDAsIDB4MDUzMCwgMHgwNTMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NTQzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU1NDMwLCAweDA1NTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTU0MzAsIDB4MDU1NTU0MzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTU1NTQzMCwgMHgwNTU1NTQzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU1NDMwLCAweDA1NTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTU0MzAsIDB4MDU1NTQzMCB9OwoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgQ0FCQUMgY29kZWQgYml0IHN0cmVhbSBmb3IgQiBzbGljZXMKICoKICogQGRlc2NyaXB0aW9uCiAqICBUaGUgbWIgc3ludGF4IGxheWVyIGZvciBpbnRlciBzbGljZXMgY29uc3RpdHV0ZXMgbHVtYSBtYiBtb2RlLAogKiAgbWIgcXAgZGVsdGEsIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYSBtYiBtb2RlIGFuZAogKiAgbHVtYS9jaHJvbWEgcmVzaWR1ZS4gVGhlc2Ugc3ludGF4IGVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIGRpcmVjdGVkIGJ5IHRhYmxlCiAqICA3LjMuNSBvZiBoMjY0IHNwZWNpZmljYXRpb24KICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgcG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQKICoKICogQHJldHVybnMgZXJyb3IgY29kZQogKgogKiBAcmVtYXJrcyBub25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpJSDI2NEVfRVJST1JfVCBpaDI2NGVfd3JpdGVfYnNsaWNlX21iX2NhYmFjKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCkKewogICAgLyogYml0IHN0cmVhbSBwdHIgKi8KICAgIGJpdHN0cm1fdCAqcHNfYml0c3RyZWFtID0gcHNfZW50X2N0eHQtPnBzX2JpdHN0cm07CiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CgogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKCiAgICBXT1JEMzIgYml0c3RyZWFtX3N0YXJ0X29mZnNldCwgYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICBXT1JEMzIgbWJfdHBtLCBtYl90eXBlLCBjYnAsIGNocm9tYV9pbnRyYV9tb2RlLCBsdW1hX2ludHJhX21vZGU7CiAgICBXT1JEOCBtYl9xcF9kZWx0YTsKICAgIFVXT1JEMzIgdTRfY2JwX2wsIHU0X2NicF9jOwogICAgVVdPUkQ4ICpwdTFfYnl0ZSA9IHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKICAgIG1iX2hkcl9jb21tb25fdCAqcHNfbWJfaGRyID0gKG1iX2hkcl9jb21tb25fdCAqKXBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKCiAgICBpZiAoKHBzX2JpdHN0cmVhbS0+dTRfc3RybV9idWZfb2Zmc2V0ICsgTUlOX1NUUkVBTV9TSVpFX01CKQogICAgICAgICAgICAgICAgICAgID49IHBzX2JpdHN0cmVhbS0+dTRfbWF4X3N0cm1fc2l6ZSkKICAgIHsKICAgICAgICAvKiByZXR1cm4gd2l0aG91dCBjb3JydXB0aW5nIHRoZSBidWZmZXIgYmV5b25kIGl0cyBzaXplICovCiAgICAgICAgcmV0dXJuIChJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVyk7CiAgICB9CiAgICAvKiBtYiBoZWFkZXIgaW5mbyAqLwogICAgbWJfdHBtID0gcHNfbWJfaGRyLT51MV9tYl90eXBlX21vZGU7CgogICAgLyogbWIgdHlwZSAqLwogICAgbWJfdHlwZSA9IG1iX3RwbSAmIDB4RjsKICAgIC8qIENBQkFDIGNvbnRleHRzIGZvciB0aGUgTUIgKi8KICAgIGloMjY0ZV9nZXRfY2FiYWNfY29udGV4dChwc19lbnRfY3R4dCwgbWJfdHlwZSk7CiAgICBwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKCiAgICAvKiBpZiBJbnRyYSBNQiAqLwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2IHx8IG1iX3R5cGUgPT0gSTR4NCkKICAgIHsKICAgICAgICBjYnAgPSBwc19tYl9oZHItPnUxX2NicDsKICAgICAgICBtYl9xcF9kZWx0YSA9IHBzX21iX2hkci0+dTFfbWJfcXBfZGVsdGE7CgogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwoKICAgICAgICAvKiBFbmNvZGUgbWJfc2tpcF9mbGFnICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19CX1NMSUNFKTsKICAgICAgICB1NF9jYnBfYyA9IChjYnAgPj4gNCk7CiAgICAgICAgdTRfY2JwX2wgPSAoY2JwICYgMHhGKTsKICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICBsdW1hX2ludHJhX21vZGUgPSAoKG1iX3RwbSA+PiA0KSAmIDMpICsgMSArICh1NF9jYnBfYyA8PCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodTRfY2JwX2wgPT0gMTUpICogMTI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGx1bWFfaW50cmFfbW9kZSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIEVuY29kZSBpbnRyYSBtYiB0eXBlICovCiAgICAgICAgewogICAgICAgICAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICAgICAgICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYyA9IDA7CgogICAgICAgICAgICBpZiAocHNfbGVmdF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfbGVmdF9jdHh0LT51MV9tYl90eXBlICYgQ0FCX0JEMTZ4MTZfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBDQUJfQkQxNngxNikgPyAxIDogMDsKICAgICAgICAgICAgaWYgKHBzX3RvcF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfdG9wX2N0eHQtPnUxX21iX3R5cGUgJiBDQUJfQkQxNngxNl9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwoKICAgICAgICAgICAgLyogSW50cmEgUHJlZml4IE9ubHkgIjExMTEwMSIgKi8KICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgMHgwNTU1NTQzMCk7CiAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucygweDJmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1CX1RZUEVfQl9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKEJTTElDRSwgKFVXT1JEOCkgbHVtYV9pbnRyYV9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwgTUJfVFlQRV9CX1NMSUNFKTsKCiAgICAgICAgfQoKICAgICAgICBpZiAobWJfdHlwZSA9PSBJNHg0KQogICAgICAgIHsKICAgICAgICAgICAgLyogSW50cmEgNHg0IG1vZGVzICovCiAgICAgICAgICAgIG1iX2hkcl9pNHg0X3QgKnBzX21iX2hkcl9pNHg0ID0gKG1iX2hkcl9pNHg0X3QgKilwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGE7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfNHg0bWJfbW9kZXMocHNfY2FiYWNfY3R4dCwgcHNfbWJfaGRyX2k0eDQtPmF1MV9zdWJfYmxrX21vZGVzKTsKICAgICAgICB9CiAgICAgICAgY2hyb21hX2ludHJhX21vZGUgPSAobWJfdHBtID4+IDYpOwoKICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2Nocm9tYV9wcmVkbW9kZShjaHJvbWFfaW50cmFfbW9kZSwgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgIGlmIChtYl90eXBlICE9IEkxNngxNikKICAgICAgICB7CiAgICAgICAgICAgIC8qIGVuY29kZSBDQlAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKICAgICAgICB9CgogICAgICAgIGlmICgoY2JwID4gMCkgfHwgKG1iX3R5cGUgPT0gSTE2eDE2KSkKICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbWJfcXBfZGVsdGEobWJfcXBfZGVsdGEsIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9oZWFkZXJfYml0c1swXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgICAgICAvKiBTdGFydGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZHVlICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQgPSBiaXRzdHJlYW1fZW5kX29mZnNldDsKCiAgICAgICAgICAgIC8qIEVuY29kaW5nIFJlc2lkdWUgKi8KICAgICAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfSTE2eDE2OwogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSAoVVdPUkQ4KSBjYnA7CiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWVfbHVtYV9kYyhwc19lbnRfY3R4dCk7CiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV9BQ19DVFhDQVQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSAoVVdPUkQ4KSBjYnA7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBJNHg0OwogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0k0eDQ7CiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV80WDRfQ1RYQ0FUKTsKICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4NjsKICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvLT51MV95dXZfZGNfY3NicCAmPSAweDY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZGUgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfcmVzaWR1ZV9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgPSAwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9kY19jc2JwID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnApID0gMDsKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9oZWFkZXJfYml0c1swXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgIH0KCiAgICAgICAgbWVtc2V0KHBzX2N1cnJfY3R4dC0+dTFfbXYsIDAsIDE2KTsKICAgICAgICBtZW1zZXQocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfbXZfY3R4dF9pbmMsIDAsIDE2KTsKICAgICAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfY2JwID0gKFVXT1JEOCkgY2JwOwoKICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfSTE2eDE2OwogICAgICAgICAgICBwdTFfYnl0ZSArPSBzaXplb2YobWJfaGRyX2kxNngxNl90KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0k0eDQ7CiAgICAgICAgICAgIHB1MV9ieXRlICs9IHNpemVvZihtYl9oZHJfaTR4NF90KTsKICAgICAgICB9CgogICAgICAgIHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSA9IHB1MV9ieXRlOwoKICAgICAgICByZXR1cm4gSUgyNjRFX1NVQ0NFU1M7CiAgICB9CgogICAgZWxzZSAvKiBJbnRlciBNQiAqLwogICAgewogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgIC8qIEVuY29kaW5nIEJfRGlyZWN0XzE2eDE2ICovCiAgICAgICAgaWYgKG1iX3R5cGUgPT0gQkRJUkVDVCkKICAgICAgICB7CiAgICAgICAgICAgIGNicCA9IHBzX21iX2hkci0+dTFfY2JwOwogICAgICAgICAgICBtYl9xcF9kZWx0YSA9IHBzX21iX2hkci0+dTFfbWJfcXBfZGVsdGE7CgoKICAgICAgICAgICAgLyogRW5jb2RpbmcgbWJfc2tpcCAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3NraXAoMCwgcHNfY2FiYWNfY3R4dCwgTUJfU0tJUF9GTEFHX0JfU0xJQ0UpOwoKICAgICAgICAgICAgLyogRW5jb2RpbmcgbWJfdHlwZSBhcyBCX0RpcmVjdF8xNngxNiAqLwogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgbWJfaW5mb19jdHh0X3QgKnBzX2xlZnRfY3R4dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICAgICAgICAgICAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhfaW5jID0gMDsKCiAgICAgICAgICAgICAgICBpZiAocHNfbGVmdF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyArPSAoKHBzX2xlZnRfY3R4dC0+dTFfbWJfdHlwZSAmIENBQl9CRDE2eDE2X01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwogICAgICAgICAgICAgICAgaWYgKHBzX3RvcF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyArPSAoKHBzX3RvcF9jdHh0LT51MV9tYl90eXBlICYgQ0FCX0JEMTZ4MTZfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQ0FCX0JEMTZ4MTYpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAvKiBFbmNvZGUgdGhlIGJpbiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfVFlQRV9CX1NMSUNFICsgdTRfY3R4X2luYyk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9CRDE2eDE2OwogICAgICAgICAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgICAgICAgICBtZW1zZXQocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfbXZfY3R4dF9pbmMsIDAsIDE2KTsKCiAgICAgICAgICAgIC8qIEVuY29kZSBDQlAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIGlmIChjYnApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGVuY29kZSBtYl9xcF9kZWx0YSAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KCiAgICAgICAgICAgIHB1MV9ieXRlICs9IHNpemVvZihtYl9oZHJfYmRpcmVjdF90KTsKICAgICAgICB9CgogICAgICAgIGVsc2UgaWYgKG1iX3R5cGUgPT0gQlNLSVApLyogTUIgPSBCU0tJUCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDEsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19CX1NMSUNFKTsKCiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9CX1NLSVA7CgogICAgICAgICAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgICAgICAgICBtZW1zZXQocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfbXZfY3R4dF9pbmMsIDAsIDE2KTsKICAgICAgICAgICAgY2JwID0gMDsKCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwoKICAgICAgICAgICAgcHUxX2J5dGUgKz0gc2l6ZW9mKG1iX2hkcl9ic2tpcF90KTsKICAgICAgICB9CgogICAgICAgIGVsc2UgLyogbWJ5cGUgaXMgQl9MMF8xNngxNiwgQl9MMV8xNngxNiBvciBCX0JpXzE2eDE2ICovCiAgICAgICAgewogICAgICAgICAgICBtYl9oZHJfYjE2eDE2X3QgKnBzX21iX2hkcl9iMTZ4MTYgPSAobWJfaGRyX2IxNngxNl90ICopcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhOwoKICAgICAgICAgICAgV09SRDMyIGk0X21iX3BhcnRfcHJlZF9tb2RlID0gKG1iX3RwbSA+PiA0KTsKICAgICAgICAgICAgVVdPUkQzMiB1NF9tYl90eXBlID0gbWJfdHlwZSAtIEIxNngxNiArIEJfTDBfMTZ4MTYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaTRfbWJfcGFydF9wcmVkX21vZGU7CiAgICAgICAgICAgIGNicCA9IHBzX21iX2hkci0+dTFfY2JwOwogICAgICAgICAgICBtYl9xcF9kZWx0YSA9IHBzX21iX2hkci0+dTFfbWJfcXBfZGVsdGE7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBtYl9za2lwICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcCgwLCBwc19jYWJhY19jdHh0LCBNQl9TS0lQX0ZMQUdfQl9TTElDRSk7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBtYl90eXBlIGFzIEIxNngxNiAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wc19sZWZ0X2N0eHRfbWJfaW5mbzsKICAgICAgICAgICAgICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmMgPSAwOwoKICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfbWJfdHlwZV9iaW5zID0gdTRfYl9tYl90eXBlW3U0X21iX3R5cGVdOwogICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9iaW5fbGVuID0gKHU0X21iX3R5cGVfYmlucyA+PiA4KSAmIDB4MEY7CiAgICAgICAgICAgICAgICB1NF9tYl90eXBlX2JpbnMgPSB1NF9tYl90eXBlX2JpbnMgJiAweEZGOwoKICAgICAgICAgICAgICAgIGlmIChwc19sZWZ0X2N0eHQgIT0gcHNfY2FiYWNfY3R4dC0+cHNfZGVmX2N0eHRfbWJfaW5mbykKICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfbGVmdF9jdHh0LT51MV9tYl90eXBlICYgQ0FCX0JEMTZ4MTZfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQ0FCX0JEMTZ4MTYpID8gMSA6IDA7CiAgICAgICAgICAgICAgICBpZiAocHNfdG9wX2N0eHQgIT0gcHNfY2FiYWNfY3R4dC0+cHNfZGVmX2N0eHRfbWJfaW5mbykKICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfdG9wX2N0eHQtPnUxX21iX3R5cGUgJiBDQUJfQkQxNngxNl9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBDQUJfQkQxNngxNikgPyAxIDogMDsKCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gdTRfY3R4X2luYyB8IHVpX2JfbWJfdHlwZV9jdHhfaW5jW3U0X21iX3R5cGVdOwoKICAgICAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9tYl90eXBlX2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfYmluX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2Jpbl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZVtNQl9UWVBFX0JfU0xJQ0VdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX05PTl9CRDE2eDE2OwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBXT1JEMTYgKnBpMl9tdl9wdHIgPSAoV09SRDE2ICopIHBzX21iX2hkcl9iMTZ4MTYtPmFpMl9tdjsKCiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHByZWQgbW9kZXMgKi8KICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IChwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENBQl9OT05fQkQxNngxNik7CiAgICAgICAgICAgICAgICAvKiBFbmNvZGluZyBtb3Rpb24gdmVjdG9yIGZvciBCMTZ4MTYgKi8KICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbXZkc19iMTZ4MTYocHNfY2FiYWNfY3R4dCwgcGkyX212X3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTRfbWJfcGFydF9wcmVkX21vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEVuY29kZSBDQlAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIGlmIChjYnApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGVuY29kZSBtYl9xcF9kZWx0YSAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgICAgICAgICBwdTFfYnl0ZSArPSBzaXplb2YobWJfaGRyX2IxNngxNl90KTsKICAgICAgICB9CgogICAgICAgIGlmIChjYnAgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgLyogRW5jb2RlIHJlc2lkdWUgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfNFg0X0NUWENBVCk7CiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZGUgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfcmVzaWR1ZV9iaXRzWzFdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CgogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDY7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwKSA9IDA7CiAgICAgICAgfQogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfaW50cmFwcmVkX2Nocm9tYV9tb2RlID0gMDsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX2NicCA9IGNicDsKICAgICAgICBwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEgPSBwdTFfYnl0ZTsKICAgICAgICByZXR1cm4gSUgyNjRFX1NVQ0NFU1M7CiAgICB9Cn0K