LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxOSBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uL1NETF9pbnRlcm5hbC5oIgoKLyoKICogUkxFIGVuY29kaW5nIGZvciBzb2Z0d2FyZSBjb2xvcmtleSBhbmQgYWxwaGEtY2hhbm5lbCBhY2NlbGVyYXRpb24KICoKICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKICoKICogTWF0dGlhcyBFbmdkZWflcmQgKFlvcmljayk6IFJld3JpdGUuIE5ldyBlbmNvZGluZyBmb3JtYXQsIGVuY29kZXIgYW5kCiAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQogKiBmb3JtYXQsIGVuY29kZXIgYW5kIGJsaXR0ZXIuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCiAqIGxlYWRpbmcgdG8gdGhpcyBjb2RlLgogKgogKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KICovCgovKgogKiBUaGUgZW5jb2RpbmcgdHJhbnNsYXRlcyB0aGUgaW1hZ2UgZGF0YSB0byBhIHN0cmVhbSBvZiBzZWdtZW50cyBvZiB0aGUgZm9ybQogKgogKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CiAqCiAqIHdoZXJlIDxza2lwPiBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBpeGVscyB0byBza2lwLAogKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCiAqIGFuZCAgIDxkYXRhPiBhcmUgdGhlIHBpeGVscyB0aGVtc2VsdmVzLgogKgogKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQogKiBiaW5hcnkgdHJhbnNwYXJlbmN5IGFuZCBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgYmxlbmRpbmcsIGFuZCBmb3Igc3VyZmFjZXMKICogd2l0aCBwZXItcGl4ZWwgYWxwaGEuIFRoZSBkZXRhaWxzIGRpZmZlciwgaG93ZXZlcjoKICoKICogRW5jb2Rpbmcgb2YgY29sb3JrZXllZCBzdXJmYWNlczoKICoKICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgogKiAgIDxza2lwPiBhbmQgPHJ1bj4gYXJlIHVuc2lnbmVkIDggYml0IGludGVnZXJzLCBleGNlcHQgZm9yIDMyIGJpdCBkZXB0aAogKiAgIHdoZXJlIHRoZXkgYXJlIDE2IGJpdC4gVGhpcyBtYWtlcyB0aGUgcGl4ZWwgZGF0YSBhbGlnbmVkIGF0IGFsbCB0aW1lcy4KICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUgKgogKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAqCiAqIEVuY29kaW5nIG9mIHN1cmZhY2VzIHdpdGggcGVyLXBpeGVsIGFscGhhOgogKgogKiAgIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCBhIHN0cnVjdCBSTEVEZXN0Rm9ybWF0IGRlc2NyaWJpbmcgdGhlIHRhcmdldAogKiAgIHBpeGVsIGZvcm1hdCwgdG8gcHJvdmlkZSByZWxpYWJsZSB1bi1lbmNvZGluZy4KICoKICogICBFYWNoIHNjYW4gbGluZSBpcyBlbmNvZGVkIHR3aWNlOiBGaXJzdCBhbGwgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzLAogKiAgIGVuY29kZWQgaW4gdGhlIHRhcmdldCBmb3JtYXQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgdGhlbiBhbGwKICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKICogICBpbiB0aGUgZm9sbG93aW5nIDMyLWJpdCBmb3JtYXQ6CiAqCiAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKICogICB0aGUgYWxwaGEgdmFsdWUgb2NjdXB5aW5nIHRoZSBoaWdoZXN0IDggYml0cy4gVGhlIDxza2lwPiBhbmQgPHJ1bj4KICogICBjb3VudHMgYXJlIDE2IGJpdC4KICoKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKI2luY2x1ZGUgIi4uL2NwdWluZm8vU0RMX3NpbWQuaCIKCiNpZm5kZWYgTUlOCiNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgoKI2RlZmluZSBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW4sIGJwcCkgICAgICAgICAgXAogICAgU0RMX21lbWNweSh0bywgZnJvbSwgKHNpemVfdCkobGVuKSAqIChicHApKQoKLyoKICogVmFyaW91cyBjb2xvcmtleSBibGl0IG1ldGhvZHMsIGZvciBvcGFxdWUgYW5kIHBlci1zdXJmYWNlIGFscGhhCiAqLwoKI2RlZmluZSBPUEFRVUVfQkxJVCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgIFwKICAgIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbmd0aCwgYnBwKQoKLyoKICogRm9yIDMyYnBwIHBpeGVscyBvbiB0aGUgZm9ybSAweDAwcnJnZ2JiOgogKiBJZiB3ZSB0cmVhdCB0aGUgbWlkZGxlIGNvbXBvbmVudCBzZXBhcmF0ZWx5LCB3ZSBjYW4gcHJvY2VzcyB0aGUgdHdvCiAqIHJlbWFpbmluZyBpbiBwYXJhbGxlbC4gVGhpcyBpcyBzYWZlIHRvIGRvIGJlY2F1c2Ugb2YgdGhlIGdhcCB0byB0aGUgbGVmdAogKiBvZiBlYWNoIGNvbXBvbmVudCwgc28gdGhlIGJpdHMgZnJvbSB0aGUgbXVsdGlwbGljYXRpb24gZG9uJ3QgY29sbGlkZS4KICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYW55IFJHQiBwZXJtdXRhdGlvbiBvZiBjb3Vyc2UuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQzMl84ODgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyBcCiAgICAgICAgICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IGQxIHwgZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSAoMCkKCi8qCiAqIEZvciAxNmJwcCBwaXhlbHMgd2UgY2FuIGdvIGEgc3RlcCBmdXJ0aGVyOiBwdXQgdGhlIG1pZGRsZSBjb21wb25lbnQKICogaW4gdGhlIGhpZ2ggMTYgYml0cyBvZiBhIDMyIGJpdCB3b3JkLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCiAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4gU2luY2UgdGhlIHNtYWxsZXN0IGdhcCBpcyBoZXJlIGp1c3QKICogNSBiaXRzLCB3ZSBoYXZlIHRvIHNjYWxlIGFscGhhIGRvd24gdG8gNSBiaXRzIGFzIHdlbGwuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjUodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgKz0gKHMgLSBkKSAqIEFMUEhBID4+IDU7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgICAgICAgICAgXAogICAgICAgICAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFRoZSBnZW5lcmFsIHNsb3cgY2F0Y2gtYWxsIGZ1bmN0aW9uLCBmb3IgcmVtYWluaW5nIGRlcHRocyBhbmQgZm9ybWF0cwogKi8KI2RlZmluZSBBTFBIQV9CTElUX0FOWSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqc3JjID0gZnJvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqZHN0ID0gdG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMsIGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnMsIGdzLCBicywgcmQsIGdkLCBiZDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3dpdGNoIChicHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHMgPSAqKFVpbnQxNiAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGQgPSAqKFVpbnQxNiAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzID0gKHNyY1swXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzJdOyBcCiAgICAgICAgICAgICAgICAgICAgZCA9IChkc3RbMF0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFsyXTsgXAogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIHMgPSAoc3JjWzJdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMF07IFwKICAgICAgICAgICAgICAgICAgICBkID0gKGRzdFsyXSA8PCAxNikgfCAoZHN0WzFdIDw8IDgpIHwgZHN0WzBdOyBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzID0gKihVaW50MzIgKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkID0gKihVaW50MzIgKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKHMsIGZtdCwgcnMsIGdzLCBicyk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJkICs9IChycyAtIHJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGdkICs9IChncyAtIGdkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJkICs9IChicyAtIGJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0ZST01fUkdCKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQxNiAqKWRzdCA9IChVaW50MTYpZDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgeyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyYyArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdCArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBTcGVjaWFsIGNhc2U6IDUwJSBhbHBoYSAoYWxwaGE9MTI4KQogKiBUaGlzIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2UgaXQgY2FuIGJlIG9wdGltaXplZCB2ZXJ5IHdlbGwsIGFuZAogKiBzaW5jZSBpdCBpcyBnb29kIGZvciBtYW55IGNhc2VzIG9mIHNlbWktdHJhbnNsdWNlbmN5LgogKiBUaGUgdGhlb3J5IGlzIHRvIGRvIGFsbCB0aHJlZSBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWU6CiAqIEZpcnN0IHplcm8gdGhlIGxvd2VzdCBiaXQgb2YgZWFjaCBjb21wb25lbnQsIHdoaWNoIGdpdmVzIHVzIHJvb20gdG8KICogYWRkIHRoZW0uIFRoZW4gc2hpZnQgcmlnaHQgYW5kIGFkZCB0aGUgc3VtIG9mIHRoZSBsb3dlc3QgYml0cy4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OF81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9ICgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpIFwKICAgICAgICAgICAgICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCwgd2UgY2FuIGFjdHVhbGx5IGJsZW5kIHR3byBwaXhlbHMgaW4gcGFyYWxsZWwsIGlmIHdlIHRha2UKICogY2FyZSB0byBzaGlmdCBiZWZvcmUgd2UgYWRkLCBub3QgYWZ0ZXIuCiAqLwoKLyogaGVscGVyOiBibGVuZCBhIHNpbmdsZSAxNiBiaXQgcGl4ZWwgYXQgNTAlICovCiNkZWZpbmUgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoKCgocyAmIG1hc2spICsgKGQgJiBtYXNrKSkgPj4gMSkgKyAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpOyAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKiBiYXNpYyAxNmJwcCBibGVuZGVyLiBtYXNrIGlzIHRoZSBwaXhlbHMgdG8ga2VlcCB3aGVuIGFkZGluZy4gKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgbWFzaykgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBuID0gKGxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZiAoKCh1aW50cHRyX3Qpc3JjIF4gKHVpbnRwdHJfdClkc3QpICYgMykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub3QgaW4gcGhhc2UsIGJsaXQgb25lIGJ5IG9uZSAqLyBcCiAgICAgICAgICAgIHdoaWxlIChuLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmICgodWludHB0cl90KXNyYyAmIDMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBmaXJzdCBvZGQgcGl4ZWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBuLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvciAoOyBuID4gMTsgbiAtPSAyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgcyA9ICooVWludDMyICopc3JjOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgZCA9ICooVWludDMyICopZHN0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9ICgocyAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpIFwKICAgICAgICAgICAgICAgICAgICArICgoZCAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpOyAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyYyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAvKiBsYXN0IG9kZCBwaXhlbCAqLyBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZjdkZSkKCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU1NV81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICBcCiAgICBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgMHhmYmRlKQoKI2RlZmluZSBDSE9PU0VfQkxJVChibGl0dGVyLCBhbHBoYSwgZm10KSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZiAoYWxwaGEgPT0gMjU1KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3dpdGNoIChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAxOiBibGl0dGVyKDEsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgIFwKICAgICAgICAgICAgY2FzZSAyOiBibGl0dGVyKDIsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgIFwKICAgICAgICAgICAgY2FzZSAzOiBibGl0dGVyKDMsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgIFwKICAgICAgICAgICAgY2FzZSA0OiBibGl0dGVyKDQsIFVpbnQxNiwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3dpdGNoIChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIC8qIE5vIDhicHAgYWxwaGEgYmxpdHRpbmcgKi8gICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHN3aXRjaCAoZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSB7IFwKICAgICAgICAgICAgICAgIGNhc2UgMHhmZmZmOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAoZm10LT5HbWFzayA9PSAweDA3ZTAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDA3ZTAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDA3ZTApIHsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDEyOCkgeyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjVfNTApOyBcCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1KTsgXAogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGdlbmVyYWwxNjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgY2FzZSAweDdmZmY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChmbXQtPkdtYXNrID09IDB4MDNlMCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDNlMCAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDNlMCkgeyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMTI4KSB7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NV81MCk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTUpOyBcCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ2VuZXJhbDE2OyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBnZW5lcmFsMTY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOyAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBibGl0dGVyKDMsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgPT0gMHgwMGZmZmZmZiBcCiAgICAgICAgICAgICAgICAgICAgJiYgKGZtdC0+R21hc2sgPT0gMHhmZjAwIHx8IGZtdC0+Um1hc2sgPT0gMHhmZjAwIFwKICAgICAgICAgICAgICAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4ZmYwMCkpIHsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMTI4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhfNTApOyBcCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4KTsgICBcCiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVRfQU5ZKTsgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBTZXQgYSBwaXhlbCB2YWx1ZSB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0LCBleGNlcHQgdGhhdCB0aGUgYWxwaGEgdmFsdWUgaXMKICogcGxhY2VkIGluIHRoZSB0b3AgYnl0ZS4gVGhpcyBpcyB0aGUgZm9ybWF0IHVzZWQgZm9yIFJMRSB3aXRoIGFscGhhLgogKi8KI2RlZmluZSBSTEVQSVhFTF9GUk9NX1JHQkEoUGl4ZWwsIGZtdCwgciwgZywgYiwgYSkgICAgICAgICAgICAgICAgICAgICAgXAp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBQaXhlbCA9ICgocj4+Zm10LT5SbG9zcyk8PGZtdC0+UnNoaWZ0KXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAoKGc+PmZtdC0+R2xvc3MpPDxmbXQtPkdzaGlmdCl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICgoYj4+Zm10LT5CbG9zcyk8PGZtdC0+QnNoaWZ0KXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKGE8PDI0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfQoKLyoKICogVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSBjYXNlIHdoZW4gdGhlIHN1cmZhY2UgaXMgY2xpcHBlZCBvbiB0aGUgbGVmdCBhbmQvb3IKICogcmlnaHQuIFRvcCBjbGlwcGluZyBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCiAqLwpzdGF0aWMgdm9pZApSTEVDbGlwQmxpdChpbnQgdywgVWludDggKiBzcmNidWYsIFNETF9TdXJmYWNlICogc3VyZl9kc3QsCiAgICAgICAgICAgIFVpbnQ4ICogZHN0YnVmLCBTRExfUmVjdCAqIHNyY3JlY3QsIHVuc2lnbmVkIGFscGhhKQp7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmZtdCA9IHN1cmZfZHN0LT5mb3JtYXQ7CgojZGVmaW5lIFJMRUNMSVBCTElUKGJwcCwgVHlwZSwgZG9fYmxpdCkgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsZWZ0ID0gc3JjcmVjdC0+eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCByaWdodCA9IGxlZnQgKyBzcmNyZWN0LT53OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiAtPSBsZWZ0ICogYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZiAocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKG9mcyA8IHJpZ2h0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0IC0gb2ZzID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxlZnQgLSBvZnM7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBub2NvcHkgIyMgYnBwICMjIGRvX2JsaXQ7ICAgICAgXAogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIHN0YXJ0Y29sID0gb2ZzICsgc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiByaWdodCAtIHN0YXJ0Y29sKSAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSByaWdodCAtIHN0YXJ0Y29sOyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRvX2JsaXQoZHN0YnVmICsgc3RhcnRjb2wgKiBicHAsIHNyY2J1ZiArIHN0YXJ0ICogYnBwLCBcCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgYnBwLCBhbHBoYSk7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBub2NvcHkgIyMgYnBwICMjIGRvX2JsaXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmIChvZnMgPT0gdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoIS0tbGluZWNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgQ0hPT1NFX0JMSVQoUkxFQ0xJUEJMSVQsIGFscGhhLCBmbXQpOwoKI3VuZGVmIFJMRUNMSVBCTElUCgp9CgoKLyogYmxpdCBhIGNvbG9ya2V5ZWQgUkxFIHN1cmZhY2UgKi8KaW50IFNETENBTEwKU0RMX1JMRUJsaXQoU0RMX1N1cmZhY2UgKiBzdXJmX3NyYywgU0RMX1JlY3QgKiBzcmNyZWN0LAogICAgICAgICAgICBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LCBTRExfUmVjdCAqIGRzdHJlY3QpCnsKICAgIFVpbnQ4ICpkc3RidWY7CiAgICBVaW50OCAqc3JjYnVmOwogICAgaW50IHgsIHk7CiAgICBpbnQgdyA9IHN1cmZfc3JjLT53OwogICAgdW5zaWduZWQgYWxwaGE7CgogICAgLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIGlmIChTRExfTG9ja1N1cmZhY2Uoc3VyZl9kc3QpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CiAgICB9CgogICAgLyogU2V0IHVwIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCiAgICB4ID0gZHN0cmVjdC0+eDsKICAgIHkgPSBkc3RyZWN0LT55OwogICAgZHN0YnVmID0gKFVpbnQ4ICopIHN1cmZfZHN0LT5waXhlbHMKICAgICAgICArIHkgKiBzdXJmX2RzdC0+cGl0Y2ggKyB4ICogc3VyZl9zcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzdXJmX3NyYy0+bWFwLT5kYXRhOwoKICAgIHsKICAgICAgICAvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjZXNzYXJ5ICovCiAgICAgICAgaW50IHZza2lwID0gc3JjcmVjdC0+eTsKICAgICAgICBpbnQgb2ZzID0gMDsKICAgICAgICBpZiAodnNraXApIHsKCiNkZWZpbmUgUkxFU0tJUChicHAsIFR5cGUpICAgICAgICAgIFwKICAgICAgICBmb3IoOzspIHsgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IHJ1bjsgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7IFwKICAgICAgICAgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHNpemVvZihUeXBlKSAqIDI7IFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICBcCiAgICAgICAgICAgIGdvdG8gZG9uZTsgICAgICBcCiAgICAgICAgICAgIGlmKG9mcyA9PSB3KSB7ICAgICAgXAogICAgICAgICAgICBvZnMgPSAwOyAgICAgICAgXAogICAgICAgICAgICBpZighLS12c2tpcCkgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgIFwKICAgICAgICB9CgogICAgICAgICAgICBzd2l0Y2ggKHN1cmZfc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgUkxFU0tJUCgxLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgUkxFU0tJUCgyLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgUkxFU0tJUCgzLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgUkxFU0tJUCg0LCBVaW50MTYpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiN1bmRlZiBSTEVTS0lQCgogICAgICAgIH0KICAgIH0KCiAgICBhbHBoYSA9IHN1cmZfc3JjLT5tYXAtPmluZm8uYTsKICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCiAgICBpZiAoc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHN1cmZfc3JjLT53KSB7CiAgICAgICAgUkxFQ2xpcEJsaXQodywgc3JjYnVmLCBzdXJmX2RzdCwgZHN0YnVmLCBzcmNyZWN0LCBhbHBoYSk7CiAgICB9IGVsc2UgewogICAgICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gc3VyZl9zcmMtPmZvcm1hdDsKCiNkZWZpbmUgUkxFQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKFR5cGUpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkb19ibGl0KGRzdGJ1ZiArIG9mcyAqIGJwcCwgc3JjYnVmLCBydW4sIGJwcCwgYWxwaGEpOyBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKG9mcyA9PSB3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoIS0tbGluZWNvdW50KSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKDApCgogICAgICAgIENIT09TRV9CTElUKFJMRUJMSVQsIGFscGhhLCBmbXQpOwoKI3VuZGVmIFJMRUJMSVQKICAgIH0KCiAgZG9uZToKICAgIC8qIFVubG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKHN1cmZfZHN0KTsKICAgIH0KICAgIHJldHVybiAoMCk7Cn0KCiN1bmRlZiBPUEFRVUVfQkxJVAoKLyoKICogUGVyLXBpeGVsIGJsaXR0aW5nIG1hY3JvcyBmb3IgdHJhbnNsdWNlbnQgcGl4ZWxzOgogKiBUaGVzZSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlcyBhcyB0aGUgcGVyLXN1cmZhY2UgYmxpdHRpbmcgbWFjcm9zCiAqLwoKLyoKICogRm9yIDMyYnBwIHBpeGVscywgd2UgaGF2ZSBtYWRlIHN1cmUgdGhlIGFscGhhIGlzIHN0b3JlZCBpbiB0aGUgdG9wCiAqIDggYml0cywgc28gcHJvY2VlZCBhcyB1c3VhbAogKi8KI2RlZmluZSBCTElUX1RSQU5TTF84ODgoc3JjLCBkc3QpICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSBzID4+IDI0OyAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgXAogICAgZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwZmY7ICAgIFwKICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGQgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOyAgICAgIFwKICAgIGRzdCA9IGQxIHwgZCB8IDB4ZmYwMDAwMDA7ICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBGb3IgMTZicHAgcGl4ZWxzLCB3ZSBoYXZlIHN0b3JlZCB0aGUgNSBtb3N0IHNpZ25pZmljYW50IGFscGhhIGJpdHMgaW4KICogYml0cyA1LTEwLiBBcyBiZWZvcmUsIHdlIGNhbiBwcm9jZXNzIGFsbCAzIFJHQiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCiAqLwojZGVmaW5lIEJMSVRfVFJBTlNMXzU2NShzcmMsIGRzdCkgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7ICBcCiAgICBzICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgXAogICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgXAogICAgZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsgICAgICBcCiAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgXAogICAgZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiNkZWZpbmUgQkxJVF9UUkFOU0xfNTU1KHNyYywgZHN0KSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgcyA9IHNyYzsgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gKHMgJiAweDNlMCkgPj4gNTsgIFwKICAgIHMgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICBcCiAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7ICAgICBcCiAgICBkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OyAgICAgIFwKICAgIGQgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICBcCiAgICBkc3QgPSAoVWludDE2KShkIHwgZCA+PiAxNik7ICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyogdXNlZCB0byBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgaW4gdGhlIGVuY29kaW5nLiBEZXNpZ25lZCB0byBiZQogICBtYWNyby1jb21wYXRpYmxlIHdpdGggU0RMX1BpeGVsRm9ybWF0IGJ1dCB3aXRob3V0IHRoZSB1bm5lZWRlZCBmaWVsZHMgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgVWludDggQnl0ZXNQZXJQaXhlbDsKICAgIFVpbnQ4IHBhZGRpbmdbM107CiAgICBVaW50MzIgUm1hc2s7CiAgICBVaW50MzIgR21hc2s7CiAgICBVaW50MzIgQm1hc2s7CiAgICBVaW50MzIgQW1hc2s7CiAgICBVaW50OCBSbG9zczsKICAgIFVpbnQ4IEdsb3NzOwogICAgVWludDggQmxvc3M7CiAgICBVaW50OCBBbG9zczsKICAgIFVpbnQ4IFJzaGlmdDsKICAgIFVpbnQ4IEdzaGlmdDsKICAgIFVpbnQ4IEJzaGlmdDsKICAgIFVpbnQ4IEFzaGlmdDsKfSBSTEVEZXN0Rm9ybWF0OwoKLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlIGNsaXBwZWQgYXQgdGhlIHJpZ2h0IGFuZC9vciBsZWZ0IGVkZ2VzICovCnN0YXRpYyB2b2lkClJMRUFscGhhQ2xpcEJsaXQoaW50IHcsIFVpbnQ4ICogc3JjYnVmLCBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LAogICAgICAgICAgICAgICAgIFVpbnQ4ICogZHN0YnVmLCBTRExfUmVjdCAqIHNyY3JlY3QpCnsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGYgPSBzdXJmX2RzdC0+Zm9ybWF0OwogICAgLyoKICAgICAqIGNsaXBwZWQgYmxpdHRlcjogUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCiAgICAgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZSBtYWNybwogICAgICogdG8gYmxlbmQgb25lIHBpeGVsLgogICAgICovCiNkZWZpbmUgUkxFQUxQSEFDTElQQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKSAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICAgXAogICAgaW50IGxlZnQgPSBzcmNyZWN0LT54OyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCByaWdodCA9IGxlZnQgKyBzcmNyZWN0LT53OyAgICAgICAgICAgICAgICAgICAgXAogICAgZHN0YnVmIC09IGxlZnQgKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8gICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyArPSAoKEN0eXBlICopc3JjYnVmKVswXTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNvZnMgPSBvZnM7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNydW4gPSBydW47ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gLT0gbGVmdCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjb2ZzID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiByaWdodCAtIGNvZnMpICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuID0gcmlnaHQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IDApICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUElYRUxfQ09QWShkc3RidWYgKyBjb2ZzICogc2l6ZW9mKFB0eXBlKSwgICAgIFwKICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArIChjb2ZzIC0gb2ZzKSAqIHNpemVvZihQdHlwZSksIFwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCljcnVuLCBzaXplb2YoUHR5cGUpKTsgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogc2tpcCBwYWRkaW5nIGlmIG5lY2Vzc2FyeSAqLyAgICAgICAgICAgICAgIFwKICAgICAgICBpZihzaXplb2YoUHR5cGUpID09IDIpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovICAgICAgICBcCiAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOyAgICAgICAgICAgICAgICAgXAogICAgICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNvZnMgPSBvZnM7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNydW4gPSBydW47ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gLT0gbGVmdCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjb2ZzID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiByaWdodCAtIGNvZnMpICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuID0gcmlnaHQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IDApIHsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIGNvZnM7ICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopc3JjYnVmICsgKGNvZnMgLSBvZnMpOyAgICBcCiAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY3J1bjsgaSsrKSAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkb19ibGVuZChzcmNbaV0sIGRzdFtpXSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogNDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgtLWxpbmVjb3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICBjYXNlIDI6CiAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQogICAgICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKICAgICAgICBicmVhazsKICAgIH0KfQoKLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlICovCmludCBTRExDQUxMClNETF9STEVBbHBoYUJsaXQoU0RMX1N1cmZhY2UgKiBzdXJmX3NyYywgU0RMX1JlY3QgKiBzcmNyZWN0LAogICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICogc3VyZl9kc3QsIFNETF9SZWN0ICogZHN0cmVjdCkKewogICAgaW50IHgsIHk7CiAgICBpbnQgdyA9IHN1cmZfc3JjLT53OwogICAgVWludDggKnNyY2J1ZiwgKmRzdGJ1ZjsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGYgPSBzdXJmX2RzdC0+Zm9ybWF0OwoKICAgIC8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBpZiAoU0RMX0xvY2tTdXJmYWNlKHN1cmZfZHN0KSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0KCiAgICB4ID0gZHN0cmVjdC0+eDsKICAgIHkgPSBkc3RyZWN0LT55OwogICAgZHN0YnVmID0gKFVpbnQ4ICopIHN1cmZfZHN0LT5waXhlbHMgKyB5ICogc3VyZl9kc3QtPnBpdGNoICsgeCAqIGRmLT5CeXRlc1BlclBpeGVsOwogICAgc3JjYnVmID0gKFVpbnQ4ICopIHN1cmZfc3JjLT5tYXAtPmRhdGEgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CgogICAgewogICAgICAgIC8qIHNraXAgbGluZXMgYXQgdGhlIHRvcCBpZiBuZWNlc3NhcnkgKi8KICAgICAgICBpbnQgdnNraXAgPSBzcmNyZWN0LT55OwogICAgICAgIGlmICh2c2tpcCkgewogICAgICAgICAgICBpbnQgb2ZzOwogICAgICAgICAgICBpZiAoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gMikgewogICAgICAgICAgICAgICAgLyogdGhlIDE2LzMyIGludGVybGVhdmVkIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIC8qIHNraXAgb3BhcXVlIGxpbmUgKi8KICAgICAgICAgICAgICAgICAgICBvZnMgPSAwOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHNyY2J1ZlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gc3JjYnVmWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CgogICAgICAgICAgICAgICAgICAgIC8qIHNraXAgcGFkZGluZyAqLwogICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KSBzcmNidWYgJiAyOwoKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHRyYW5zbHVjZW50IGxpbmUgKi8KICAgICAgICAgICAgICAgICAgICBvZnMgPSAwOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0ICogKHJ1biArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoLS12c2tpcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiB0aGUgMzIvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCiAgICAgICAgICAgICAgICB2c2tpcCA8PD0gMTsgICAgLyogb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBoYXZlIHNhbWUgZm9ybWF0ICovCiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQgKiBydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CiAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXZza2lwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLwogICAgaWYgKHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzdXJmX3NyYy0+dykgewogICAgICAgIFJMRUFscGhhQ2xpcEJsaXQodywgc3JjYnVmLCBzdXJmX2RzdCwgZHN0YnVmLCBzcmNyZWN0KTsKICAgIH0gZWxzZSB7CgogICAgICAgIC8qCiAgICAgICAgICogbm9uLWNsaXBwZWQgYmxpdHRlci4gUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCiAgICAgICAgICogQ3R5cGUgdGhlIHRyYW5zbHVjZW50IGNvdW50IHR5cGUsIGFuZCBkb19ibGVuZCB0aGUKICAgICAgICAgKiBtYWNybyB0byBibGVuZCBvbmUgcGl4ZWwuCiAgICAgICAgICovCiNkZWZpbmUgUkxFQUxQSEFCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8gICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0NPUFkoZHN0YnVmICsgb2ZzICogc2l6ZW9mKFB0eXBlKSwgc3JjYnVmLCBcCiAgICAgICAgICAgICAgICAgICBydW4sIHNpemVvZihQdHlwZSkpOyAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBnb3RvIGRvbmU7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8gICAgICAgICAgICAgIFwKICAgICAgICBpZihzaXplb2YoUHR5cGUpID09IDIpICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8gICAgICAgXAogICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIG9mczsgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIGk7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBydW47IGkrKykgeyAgICAgICAgICAgXAogICAgICAgICAgICAgICAgVWludDMyIHNyYyA9ICooVWludDMyICopc3JjYnVmOyAgICAgIFwKICAgICAgICAgICAgICAgIGRvX2JsZW5kKHNyYywgKmRzdCk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZHN0Kys7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKC0tbGluZWNvdW50KTsgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICAgICAgc3dpdGNoIChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMAogICAgICAgICAgICAgICAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkKICAgICAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NjUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTU1KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBSTEVBTFBIQUJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgZG9uZToKICAgIC8qIFVubG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKHN1cmZfZHN0KTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBBdXhpbGlhcnkgZnVuY3Rpb25zOgogKiBUaGUgZW5jb2RpbmcgZnVuY3Rpb25zIHRha2UgMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCiAqIFRoZSBkZWNvZGluZyBmdW5jdGlvbnMgY29weSB0byAzMmJwcCByZ2IgKyBhLCBhbmQKICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNvdXJjZS4KICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpbiB0aGUgZW5jb2RlciBhbmQgdW4tUkxFIGNvZGUgYW5kIGFyZSB0aGVyZWZvcmUgbm90CiAqIGhpZ2hseSBvcHRpbWlzZWQuCiAqLwoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAxNmJwcCByZ2IsIGxvc2luZyBhbHBoYSAqLwpzdGF0aWMgaW50CmNvcHlfb3BhcXVlXzE2KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MTYgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsKICAgICAgICBSR0JfRlJPTV9QSVhFTCgqc3JjLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQigqZCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiAyOwp9CgovKiBkZWNvZGUgb3BhcXVlIHBpeGVscyBmcm9tIDE2YnBwIHRvIDMyYnBwIHJnYiArIGEgKi8Kc3RhdGljIGludAp1bmNvcHlfb3BhcXVlXzE2KFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MTYgKnMgPSBzcmM7CiAgICB1bnNpZ25lZCBhbHBoYSA9IGRmbXQtPkFtYXNrID8gMjU1IDogMDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOwogICAgICAgIFJHQl9GUk9NX1BJWEVMKCpzLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYWxwaGEpOwogICAgICAgIHMrKzsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogMjsKfQoKCgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NjUgKi8Kc3RhdGljIGludApjb3B5X3RyYW5zbF81NjUodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MTYgcGl4OwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgKmQgPSAoKHBpeCAmIDB4N2UwKSA8PCAxNikgfCAocGl4ICYgMHhmODFmKSB8ICgoYSA8PCAyKSAmIDB4N2UwKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMzJicHAgRzBSQUIgZm9ybWF0IGZvciBibGl0dGluZyBpbnRvIDU1NSAqLwpzdGF0aWMgaW50CmNvcHlfdHJhbnNsXzU1NSh2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQxNiBwaXg7CiAgICAgICAgUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKICAgICAgICAqZCA9ICgocGl4ICYgMHgzZTApIDw8IDE2KSB8IChwaXggJiAweGZjMWYpIHwgKChhIDw8IDIpICYgMHgzZTApOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZGVjb2RlIHRyYW5zbHVjZW50IHBpeGVscyBmcm9tIDMyYnBwIEdPUkFCIHRvIDMyYnBwIHJnYiArIGEgKi8Kc3RhdGljIGludAp1bmNvcHlfdHJhbnNsXzE2KFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKnMgPSBzcmM7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MzIgcGl4ID0gKnMrKzsKICAgICAgICBhID0gKHBpeCAmIDB4M2UwKSA+PiAyOwogICAgICAgIHBpeCA9IChwaXggJiB+MHgzZTApIHwgcGl4ID4+IDE2OwogICAgICAgIFJHQl9GUk9NX1BJWEVMKHBpeCwgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBlbmNvZGUgMzJicHAgcmdiYSBpbnRvIDMyYnBwIHJnYmEsIGtlZXBpbmcgYWxwaGEgKGR1YWwgcHVycG9zZSkgKi8Kc3RhdGljIGludApjb3B5XzMyKHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFJMRVBJWEVMX0ZST01fUkdCQSgqZCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZCsrOwogICAgICAgIHNyYysrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBkZWNvZGUgMzJicHAgcmdiYSBpbnRvIDMyYnBwIHJnYmEsIGtlZXBpbmcgYWxwaGEgKGR1YWwgcHVycG9zZSkgKi8Kc3RhdGljIGludAp1bmNvcHlfMzIoVWludDMyICogZHN0LCB2b2lkICpzcmMsIGludCBuLAogICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpzID0gc3JjOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDMyIHBpeGVsID0gKnMrKzsKICAgICAgICBSR0JfRlJPTV9QSVhFTChwaXhlbCwgc2ZtdCwgciwgZywgYik7CiAgICAgICAgYSA9IHBpeGVsID4+IDI0OwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKI2RlZmluZSBJU09QQVFVRShwaXhlbCwgZm10KSAoKCgocGl4ZWwpICYgZm10LT5BbWFzaykgPj4gZm10LT5Bc2hpZnQpID09IDI1NSkKCiNkZWZpbmUgSVNUUkFOU0wocGl4ZWwsIGZtdCkgICAgXAogICAgKCh1bnNpZ25lZCkoKCgocGl4ZWwpICYgZm10LT5BbWFzaykgPj4gZm10LT5Bc2hpZnQpIC0gMVUpIDwgMjU0VSkKCi8qIGNvbnZlcnQgc3VyZmFjZSB0byBiZSBxdWlja2x5IGFscGhhLWJsaXR0YWJsZSBvbnRvIGRlc3QsIGlmIHBvc3NpYmxlICovCnN0YXRpYyBpbnQKUkxFQWxwaGFTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgU0RMX1N1cmZhY2UgKmRlc3Q7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmOwogICAgaW50IG1heHNpemUgPSAwOwogICAgaW50IG1heF9vcGFxdWVfcnVuOwogICAgaW50IG1heF90cmFuc2xfcnVuID0gNjU1MzU7CiAgICB1bnNpZ25lZCBtYXNrc3VtOwogICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKICAgIGludCAoKmNvcHlfb3BhcXVlKSAodm9pZCAqLCBVaW50MzIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwogICAgaW50ICgqY29weV90cmFuc2wpICh2b2lkICosIFVpbnQzMiAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CgogICAgZGVzdCA9IHN1cmZhY2UtPm1hcC0+ZHN0OwogICAgaWYgKCFkZXN0KQogICAgICAgIHJldHVybiAtMTsKICAgIGRmID0gZGVzdC0+Zm9ybWF0OwogICAgaWYgKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsICE9IDMyKQogICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgIC8qIG9ubHkgMzJicHAgc291cmNlIHN1cHBvcnRlZCAqLwoKICAgIC8qIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIGlzIG9uZSB3ZSBzdXBwb3J0LAogICAgICAgYW5kIGRldGVybWluZSB0aGUgbWF4IHNpemUgb2YgdGhlIGVuY29kZWQgcmVzdWx0ICovCiAgICBtYXNrc3VtID0gZGYtPlJtYXNrIHwgZGYtPkdtYXNrIHwgZGYtPkJtYXNrOwogICAgc3dpdGNoIChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgY2FzZSAyOgogICAgICAgIC8qIDE2YnBwOiBvbmx5IHN1cHBvcnQgNTY1IGFuZCA1NTUgZm9ybWF0cyAqLwogICAgICAgIHN3aXRjaCAobWFza3N1bSkgewogICAgICAgIGNhc2UgMHhmZmZmOgogICAgICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDdlMAogICAgICAgICAgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDdlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKSB7CiAgICAgICAgICAgICAgICBjb3B5X29wYXF1ZSA9IGNvcHlfb3BhcXVlXzE2OwogICAgICAgICAgICAgICAgY29weV90cmFuc2wgPSBjb3B5X3RyYW5zbF81NjU7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4N2ZmZjoKICAgICAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDAzZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5SbWFzayA9PSAweDAzZTAgfHwgZGYtPkJtYXNrID09IDB4MDNlMCkgewogICAgICAgICAgICAgICAgY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKICAgICAgICAgICAgICAgIGNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTU1OwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBtYXhfb3BhcXVlX3J1biA9IDI1NTsgICAvKiBydW5zIHN0b3JlZCBhcyBieXRlcyAqLwoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcGl4ZWxzLAogICAgICAgICAgIHdpdGggcm9vbSBmb3IgYWxpZ25tZW50IHBhZGRpbmcgYmV0d2VlbiBsaW5lcyAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDIgKyAoNCArIDIpICogKHN1cmZhY2UtPncgKyAxKSkgKyAyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAgIGlmIChtYXNrc3VtICE9IDB4MDBmZmZmZmYpCiAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgLyogcmVxdWlyZXMgdW51c2VkIGhpZ2ggYnl0ZSAqLwogICAgICAgIGNvcHlfb3BhcXVlID0gY29weV8zMjsKICAgICAgICBjb3B5X3RyYW5zbCA9IGNvcHlfMzI7CiAgICAgICAgbWF4X29wYXF1ZV9ydW4gPSAyNTU7ICAgLyogcnVucyBzdG9yZWQgYXMgc2hvcnQgaW50cyAqLwoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcGl4ZWxzICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAyICogNCAqIChzdXJmYWNlLT53ICsgMSkgKyA0OwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiBhbnl0aGluZyBlbHNlIHVuc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLwogICAgfQoKICAgIG1heHNpemUgKz0gc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwogICAgcmxlYnVmID0gKFVpbnQ4ICopIFNETF9tYWxsb2MobWF4c2l6ZSk7CiAgICBpZiAoIXJsZWJ1ZikgewogICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgIH0KICAgIHsKICAgICAgICAvKiBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgc28gd2UgY2FuIHVuZG8gdGhlIGVuY29kaW5nIGxhdGVyICovCiAgICAgICAgUkxFRGVzdEZvcm1hdCAqciA9IChSTEVEZXN0Rm9ybWF0ICopIHJsZWJ1ZjsKICAgICAgICByLT5CeXRlc1BlclBpeGVsID0gZGYtPkJ5dGVzUGVyUGl4ZWw7CiAgICAgICAgci0+Um1hc2sgPSBkZi0+Um1hc2s7CiAgICAgICAgci0+R21hc2sgPSBkZi0+R21hc2s7CiAgICAgICAgci0+Qm1hc2sgPSBkZi0+Qm1hc2s7CiAgICAgICAgci0+QW1hc2sgPSBkZi0+QW1hc2s7CiAgICAgICAgci0+Umxvc3MgPSBkZi0+Umxvc3M7CiAgICAgICAgci0+R2xvc3MgPSBkZi0+R2xvc3M7CiAgICAgICAgci0+Qmxvc3MgPSBkZi0+Qmxvc3M7CiAgICAgICAgci0+QWxvc3MgPSBkZi0+QWxvc3M7CiAgICAgICAgci0+UnNoaWZ0ID0gZGYtPlJzaGlmdDsKICAgICAgICByLT5Hc2hpZnQgPSBkZi0+R3NoaWZ0OwogICAgICAgIHItPkJzaGlmdCA9IGRmLT5Cc2hpZnQ7CiAgICAgICAgci0+QXNoaWZ0ID0gZGYtPkFzaGlmdDsKICAgIH0KICAgIGRzdCA9IHJsZWJ1ZiArIHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKCiAgICAvKiBEbyB0aGUgYWN0dWFsIGVuY29kaW5nICovCiAgICB7CiAgICAgICAgaW50IHgsIHk7CiAgICAgICAgaW50IGggPSBzdXJmYWNlLT5oLCB3ID0gc3VyZmFjZS0+dzsKICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKnNmID0gc3VyZmFjZS0+Zm9ybWF0OwogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKSBzdXJmYWNlLT5waXhlbHM7CiAgICAgICAgVWludDggKmxhc3RsaW5lID0gZHN0OyAgLyogZW5kIG9mIGxhc3Qgbm9uLWJsYW5rIGxpbmUgKi8KCiAgICAgICAgLyogb3BhcXVlIGNvdW50cyBhcmUgOCBvciAxNiBiaXRzLCBkZXBlbmRpbmcgb24gdGFyZ2V0IGRlcHRoICovCiNkZWZpbmUgQUREX09QQVFVRV9DT1VOVFMobiwgbSkgICAgICAgICBcCiAgICBpZihkZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0KSB7ICAgICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMV0gPSBtOyAgICAgXAogICAgICAgIGRzdCArPSA0OyAgICAgICAgICAgICAgIFwKICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMF0gPSBuOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzFdID0gbTsgICAgICAgICAgICAgXAogICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgIFwKICAgIH0KCiAgICAgICAgLyogdHJhbnNsdWNlbnQgY291bnRzIGFyZSBhbHdheXMgMTYgYml0ICovCiNkZWZpbmUgQUREX1RSQU5TTF9DT1VOVFMobiwgbSkgICAgIFwKICAgICgoKFVpbnQxNiAqKWRzdClbMF0gPSBuLCAoKFVpbnQxNiAqKWRzdClbMV0gPSBtLCBkc3QgKz0gNCkKCiAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgewogICAgICAgICAgICBpbnQgcnVuc3RhcnQsIHNraXBzdGFydDsKICAgICAgICAgICAgaW50IGJsYW5rbGluZSA9IDA7CiAgICAgICAgICAgIC8qIEZpcnN0IGVuY29kZSBhbGwgb3BhcXVlIHBpeGVscyBvZiBhIHNjYW4gbGluZSAqLwogICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaW50IHJ1biwgc2tpcCwgbGVuOwogICAgICAgICAgICAgICAgc2tpcHN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAhSVNPUEFRVUUoc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIElTT1BBUVVFKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKICAgICAgICAgICAgICAgIGlmIChza2lwID09IHcpCiAgICAgICAgICAgICAgICAgICAgYmxhbmtsaW5lID0gMTsKICAgICAgICAgICAgICAgIHJ1biA9IHggLSBydW5zdGFydDsKICAgICAgICAgICAgICAgIHdoaWxlIChza2lwID4gbWF4X29wYXF1ZV9ydW4pIHsKICAgICAgICAgICAgICAgICAgICBBRERfT1BBUVVFX0NPVU5UUyhtYXhfb3BhcXVlX3J1biwgMCk7CiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBtYXhfb3BhcXVlX3J1bjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF9vcGFxdWVfcnVuKTsKICAgICAgICAgICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKHNraXAsIGxlbik7CiAgICAgICAgICAgICAgICBkc3QgKz0gY29weV9vcGFxdWUoZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIHdoaWxlIChydW4pIHsKICAgICAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfb3BhcXVlX3J1bik7CiAgICAgICAgICAgICAgICAgICAgQUREX09QQVFVRV9DT1VOVFMoMCwgbGVuKTsKICAgICAgICAgICAgICAgICAgICBkc3QgKz0gY29weV9vcGFxdWUoZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlICh4IDwgdyk7CgogICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgb3V0cHV0IGFkZHJlc3MgaXMgMzItYml0IGFsaWduZWQgKi8KICAgICAgICAgICAgZHN0ICs9ICh1aW50cHRyX3QpIGRzdCAmIDI7CgogICAgICAgICAgICAvKiBOZXh0LCBlbmNvZGUgYWxsIHRyYW5zbHVjZW50IHBpeGVscyBvZiB0aGUgc2FtZSBzY2FuIGxpbmUgKi8KICAgICAgICAgICAgeCA9IDA7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgICAgIHNraXBzdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgIUlTVFJBTlNMKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiBJU1RSQU5TTChzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CiAgICAgICAgICAgICAgICBibGFua2xpbmUgJj0gKHNraXAgPT0gdyk7CiAgICAgICAgICAgICAgICBydW4gPSB4IC0gcnVuc3RhcnQ7CiAgICAgICAgICAgICAgICB3aGlsZSAoc2tpcCA+IG1heF90cmFuc2xfcnVuKSB7CiAgICAgICAgICAgICAgICAgICAgQUREX1RSQU5TTF9DT1VOVFMobWF4X3RyYW5zbF9ydW4sIDApOwogICAgICAgICAgICAgICAgICAgIHNraXAgLT0gbWF4X3RyYW5zbF9ydW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfdHJhbnNsX3J1bik7CiAgICAgICAgICAgICAgICBBRERfVFJBTlNMX0NPVU5UUyhza2lwLCBsZW4pOwogICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfdHJhbnNsKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOwogICAgICAgICAgICAgICAgICAgIEFERF9UUkFOU0xfQ09VTlRTKDAsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfdHJhbnNsKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghYmxhbmtsaW5lKQogICAgICAgICAgICAgICAgICAgIGxhc3RsaW5lID0gZHN0OwogICAgICAgICAgICB9IHdoaWxlICh4IDwgdyk7CgogICAgICAgICAgICBzcmMgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKICAgICAgICB9CiAgICAgICAgZHN0ID0gbGFzdGxpbmU7ICAgICAgICAgLyogYmFjayB1cCBwYXN0IHRyYWlsaW5nIGJsYW5rIGxpbmVzICovCiAgICAgICAgQUREX09QQVFVRV9DT1VOVFMoMCwgMCk7CiAgICB9CgojdW5kZWYgQUREX09QQVFVRV9DT1VOVFMKI3VuZGVmIEFERF9UUkFOU0xfQ09VTlRTCgogICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KICAgIGlmICghKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSkgewogICAgICAgIFNETF9TSU1ERnJlZShzdXJmYWNlLT5waXhlbHMpOwogICAgICAgIHN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CiAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9TSU1EX0FMSUdORUQ7CiAgICB9CgogICAgLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLwogICAgewogICAgICAgIFVpbnQ4ICpwID0gU0RMX3JlYWxsb2MocmxlYnVmLCBkc3QgLSBybGVidWYpOwogICAgICAgIGlmICghcCkKICAgICAgICAgICAgcCA9IHJsZWJ1ZjsKICAgICAgICBzdXJmYWNlLT5tYXAtPmRhdGEgPSBwOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgVWludDMyCmdldHBpeF84KFVpbnQ4ICogc3JjYnVmKQp7CiAgICByZXR1cm4gKnNyY2J1ZjsKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfMTYoVWludDggKiBzcmNidWYpCnsKICAgIHJldHVybiAqKFVpbnQxNiAqKSBzcmNidWY7Cn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzI0KFVpbnQ4ICogc3JjYnVmKQp7CiNpZiBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOCiAgICByZXR1cm4gc3JjYnVmWzBdICsgKHNyY2J1ZlsxXSA8PCA4KSArIChzcmNidWZbMl0gPDwgMTYpOwojZWxzZQogICAgcmV0dXJuIChzcmNidWZbMF0gPDwgMTYpICsgKHNyY2J1ZlsxXSA8PCA4KSArIHNyY2J1ZlsyXTsKI2VuZGlmCn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzMyKFVpbnQ4ICogc3JjYnVmKQp7CiAgICByZXR1cm4gKihVaW50MzIgKikgc3JjYnVmOwp9Cgp0eXBlZGVmIFVpbnQzMigqZ2V0cGl4X2Z1bmMpIChVaW50OCAqKTsKCnN0YXRpYyBjb25zdCBnZXRwaXhfZnVuYyBnZXRwaXhlc1s0XSA9IHsKICAgIGdldHBpeF84LCBnZXRwaXhfMTYsIGdldHBpeF8yNCwgZ2V0cGl4XzMyCn07CgpzdGF0aWMgaW50ClJMRUNvbG9ya2V5U3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIFVpbnQ4ICpybGVidWYsICpkc3Q7CiAgICBpbnQgbWF4bjsKICAgIGludCB5OwogICAgVWludDggKnNyY2J1ZiwgKmxhc3RsaW5lOwogICAgaW50IG1heHNpemUgPSAwOwogICAgY29uc3QgaW50IGJwcCA9IHN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKICAgIGdldHBpeF9mdW5jIGdldHBpeDsKICAgIFVpbnQzMiBja2V5LCByZ2JtYXNrOwogICAgaW50IHcsIGg7CgogICAgLyogY2FsY3VsYXRlIHRoZSB3b3JzdCBjYXNlIHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIHN1cmZhY2UgKi8KICAgIHN3aXRjaCAoYnBwKSB7CiAgICBjYXNlIDE6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zcGFyZW50IHBpeGVscywKICAgICAgICAgICBzdGFydGluZyB3aXRoIGFuIG9wYXF1ZSBwaXhlbCAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogMyAqIChzdXJmYWNlLT53IC8gMiArIDEpICsgMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIHNvbGlkIHJ1bnMsIGF0IG1vc3QgMjU1IHBpeGVscyB3aWRlICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoMiAqIChzdXJmYWNlLT53IC8gMjU1ICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1cmZhY2UtPncgKiBicHApICsgMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIHNvbGlkIHJ1bnMsIGF0IG1vc3QgNjU1MzUgcGl4ZWxzIHdpZGUgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICg0ICogKHN1cmZhY2UtPncgLyA2NTUzNSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdXJmYWNlLT53ICogNCkgKyA0OwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJsZWJ1ZiA9IChVaW50OCAqKSBTRExfbWFsbG9jKG1heHNpemUpOwogICAgaWYgKHJsZWJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIFNETF9PdXRPZk1lbW9yeSgpOwogICAgfQoKICAgIC8qIFNldCB1cCB0aGUgY29udmVyc2lvbiAqLwogICAgc3JjYnVmID0gKFVpbnQ4ICopIHN1cmZhY2UtPnBpeGVsczsKICAgIG1heG4gPSBicHAgPT0gNCA/IDY1NTM1IDogMjU1OwogICAgZHN0ID0gcmxlYnVmOwogICAgcmdibWFzayA9IH5zdXJmYWNlLT5mb3JtYXQtPkFtYXNrOwogICAgY2tleSA9IHN1cmZhY2UtPm1hcC0+aW5mby5jb2xvcmtleSAmIHJnYm1hc2s7CiAgICBsYXN0bGluZSA9IGRzdDsKICAgIGdldHBpeCA9IGdldHBpeGVzW2JwcCAtIDFdOwogICAgdyA9IHN1cmZhY2UtPnc7CiAgICBoID0gc3VyZmFjZS0+aDsKCiNkZWZpbmUgQUREX0NPVU5UUyhuLCBtKSAgICAgICAgICAgIFwKICAgIGlmKGJwcCA9PSA0KSB7ICAgICAgICAgICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMV0gPSBtOyAgICAgXAogICAgICAgIGRzdCArPSA0OyAgICAgICAgICAgICAgIFwKICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMF0gPSBuOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzFdID0gbTsgICAgICAgICAgICAgXAogICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgIFwKICAgIH0KCiAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CiAgICAgICAgaW50IHggPSAwOwogICAgICAgIGludCBibGFua2xpbmUgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaW50IHJ1biwgc2tpcCwgbGVuOwogICAgICAgICAgICBpbnQgcnVuc3RhcnQ7CiAgICAgICAgICAgIGludCBza2lwc3RhcnQgPSB4OwoKICAgICAgICAgICAgLyogZmluZCBydW4gb2YgdHJhbnNwYXJlbnQsIHRoZW4gb3BhcXVlIHBpeGVscyAqLwogICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgKGdldHBpeChzcmNidWYgKyB4ICogYnBwKSAmIHJnYm1hc2spID09IGNrZXkpCiAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgIHJ1bnN0YXJ0ID0geDsKICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSAhPSBja2V5KQogICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICBza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CiAgICAgICAgICAgIGlmIChza2lwID09IHcpCiAgICAgICAgICAgICAgICBibGFua2xpbmUgPSAxOwogICAgICAgICAgICBydW4gPSB4IC0gcnVuc3RhcnQ7CgogICAgICAgICAgICAvKiBlbmNvZGUgc2VnbWVudCAqLwogICAgICAgICAgICB3aGlsZSAoc2tpcCA+IG1heG4pIHsKICAgICAgICAgICAgICAgIEFERF9DT1VOVFMobWF4biwgMCk7CiAgICAgICAgICAgICAgICBza2lwIC09IG1heG47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4bik7CiAgICAgICAgICAgIEFERF9DT1VOVFMoc2tpcCwgbGVuKTsKICAgICAgICAgICAgU0RMX21lbWNweShkc3QsIHNyY2J1ZiArIHJ1bnN0YXJ0ICogYnBwLCBsZW4gKiBicHApOwogICAgICAgICAgICBkc3QgKz0gbGVuICogYnBwOwogICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgIHdoaWxlIChydW4pIHsKICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heG4pOwogICAgICAgICAgICAgICAgQUREX0NPVU5UUygwLCBsZW4pOwogICAgICAgICAgICAgICAgU0RMX21lbWNweShkc3QsIHNyY2J1ZiArIHJ1bnN0YXJ0ICogYnBwLCBsZW4gKiBicHApOwogICAgICAgICAgICAgICAgZHN0ICs9IGxlbiAqIGJwcDsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFibGFua2xpbmUpCiAgICAgICAgICAgICAgICBsYXN0bGluZSA9IGRzdDsKICAgICAgICB9IHdoaWxlICh4IDwgdyk7CgogICAgICAgIHNyY2J1ZiArPSBzdXJmYWNlLT5waXRjaDsKICAgIH0KICAgIGRzdCA9IGxhc3RsaW5lOyAgICAgICAgICAgICAvKiBiYWNrIHVwIGJhc3QgdHJhaWxpbmcgYmxhbmsgbGluZXMgKi8KICAgIEFERF9DT1VOVFMoMCwgMCk7CgojdW5kZWYgQUREX0NPVU5UUwoKICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgaXQgZW5jb2RlZCwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgcGl4ZWxzICovCiAgICBpZiAoIShzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykpIHsKICAgICAgICBTRExfU0lNREZyZWUoc3VyZmFjZS0+cGl4ZWxzKTsKICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwogICAgICAgIHN1cmZhY2UtPmZsYWdzICY9IH5TRExfU0lNRF9BTElHTkVEOwogICAgfQoKICAgIC8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KICAgIHsKICAgICAgICAvKiBJZiByZWFsbG9jIHJldHVybnMgTlVMTCwgdGhlIG9yaWdpbmFsIGJsb2NrIGlzIGxlZnQgaW50YWN0ICovCiAgICAgICAgVWludDggKnAgPSBTRExfcmVhbGxvYyhybGVidWYsIGRzdCAtIHJsZWJ1Zik7CiAgICAgICAgaWYgKCFwKQogICAgICAgICAgICBwID0gcmxlYnVmOwogICAgICAgIHN1cmZhY2UtPm1hcC0+ZGF0YSA9IHA7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmludApTRExfUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIGludCBmbGFnczsKCiAgICAvKiBDbGVhciBhbnkgcHJldmlvdXMgUkxFIGNvbnZlcnNpb24gKi8KICAgIGlmICgoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpID09IFNETF9STEVBQ0NFTCkgewogICAgICAgIFNETF9VblJMRVN1cmZhY2Uoc3VyZmFjZSwgMSk7CiAgICB9CgogICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBSTEUgZW5jb2Rpbmcgb2YgYml0bWFwcyAqLwogICAgaWYgKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsIDwgOCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBNYWtlIHN1cmUgdGhlIHBpeGVscyBhcmUgYXZhaWxhYmxlICovCiAgICBpZiAoIXN1cmZhY2UtPnBpeGVscykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGNvbG9ya2V5IG9yIGJsZW5kaW5nLCBub3RoaW5nIHRvIGRvLi4uICovCiAgICBmbGFncyA9IHN1cmZhY2UtPm1hcC0+aW5mby5mbGFnczsKICAgIGlmICghKGZsYWdzICYgKFNETF9DT1BZX0NPTE9SS0VZIHwgU0RMX0NPUFlfQkxFTkQpKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBQYXNzIG9uIGNvbWJpbmF0aW9ucyBub3Qgc3VwcG9ydGVkICovCiAgICBpZiAoKGZsYWdzICYgU0RMX0NPUFlfTU9EVUxBVEVfQ09MT1IpIHx8CiAgICAgICAgKChmbGFncyAmIFNETF9DT1BZX01PRFVMQVRFX0FMUEhBKSAmJiBzdXJmYWNlLT5mb3JtYXQtPkFtYXNrKSB8fAogICAgICAgIChmbGFncyAmIChTRExfQ09QWV9BREQgfCBTRExfQ09QWV9NT0QpKSB8fAogICAgICAgIChmbGFncyAmIFNETF9DT1BZX05FQVJFU1QpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qIEVuY29kZSBhbmQgc2V0IHVwIHRoZSBibGl0ICovCiAgICBpZiAoIXN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgfHwgIShmbGFncyAmIFNETF9DT1BZX0JMRU5EKSkgewogICAgICAgIGlmICghc3VyZmFjZS0+bWFwLT5pZGVudGl0eSkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGlmIChSTEVDb2xvcmtleVN1cmZhY2Uoc3VyZmFjZSkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc3VyZmFjZS0+bWFwLT5ibGl0ID0gU0RMX1JMRUJsaXQ7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzIHw9IFNETF9DT1BZX1JMRV9DT0xPUktFWTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKFJMRUFscGhhU3VyZmFjZShzdXJmYWNlKSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBzdXJmYWNlLT5tYXAtPmJsaXQgPSBTRExfUkxFQWxwaGFCbGl0OwogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyB8PSBTRExfQ09QWV9STEVfQUxQSEFLRVk7CiAgICB9CgogICAgLyogVGhlIHN1cmZhY2UgaXMgbm93IGFjY2VsZXJhdGVkICovCiAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CgogICAgcmV0dXJuICgwKTsKfQoKLyoKICogVW4tUkxFIGEgc3VyZmFjZSB3aXRoIHBpeGVsIGFscGhhCiAqIFRoaXMgbWF5IG5vdCBnaXZlIGJhY2sgZXhhY3RseSB0aGUgaW1hZ2UgYmVmb3JlIFJMRS1lbmNvZGluZzsgYWxsCiAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgcGl4ZWxzIHdpbGwgYmUgbG9zdCwgYW5kIGNvbG9yIGFuZCBhbHBoYSBkZXB0aAogKiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgKHdoZW4gZW5jb2RpbmcgZm9yIDE2YnBwIHRhcmdldHMpLgogKi8Kc3RhdGljIFNETF9ib29sClVuUkxFQWxwaGEoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBVaW50OCAqc3JjYnVmOwogICAgVWludDMyICpkc3Q7CiAgICBTRExfUGl4ZWxGb3JtYXQgKnNmID0gc3VyZmFjZS0+Zm9ybWF0OwogICAgUkxFRGVzdEZvcm1hdCAqZGYgPSBzdXJmYWNlLT5tYXAtPmRhdGE7CiAgICBpbnQgKCp1bmNvcHlfb3BhcXVlKSAoVWludDMyICosIHZvaWQgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwogICAgaW50ICgqdW5jb3B5X3RyYW5zbCkgKFVpbnQzMiAqLCB2b2lkICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCB3ID0gc3VyZmFjZS0+dzsKICAgIGludCBicHAgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKCiAgICBpZiAoYnBwID09IDIpIHsKICAgICAgICB1bmNvcHlfb3BhcXVlID0gdW5jb3B5X29wYXF1ZV8xNjsKICAgICAgICB1bmNvcHlfdHJhbnNsID0gdW5jb3B5X3RyYW5zbF8xNjsKICAgIH0gZWxzZSB7CiAgICAgICAgdW5jb3B5X29wYXF1ZSA9IHVuY29weV90cmFuc2wgPSB1bmNvcHlfMzI7CiAgICB9CgogICAgc3VyZmFjZS0+cGl4ZWxzID0gU0RMX1NJTURBbGxvYyhzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwogICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICByZXR1cm4gKFNETF9GQUxTRSk7CiAgICB9CiAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfU0lNRF9BTElHTkVEOwogICAgLyogZmlsbCBiYWNrZ3JvdW5kIHdpdGggdHJhbnNwYXJlbnQgcGl4ZWxzICovCiAgICBTRExfbWVtc2V0KHN1cmZhY2UtPnBpeGVscywgMCwgc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKCiAgICBkc3QgPSBzdXJmYWNlLT5waXhlbHM7CiAgICBzcmNidWYgPSAoVWludDggKikgKGRmICsgMSk7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgLyogY29weSBvcGFxdWUgcGl4ZWxzICovCiAgICAgICAgaW50IG9mcyA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICB1bnNpZ25lZCBydW47CiAgICAgICAgICAgIGlmIChicHAgPT0gMikgewogICAgICAgICAgICAgICAgb2ZzICs9IHNyY2J1ZlswXTsKICAgICAgICAgICAgICAgIHJ1biA9IHNyY2J1ZlsxXTsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICAgICAgc3JjYnVmICs9IDQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgc3JjYnVmICs9IHVuY29weV9vcGFxdWUoZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykgewogICAgICAgICAgICAgICAgZ290byBlbmRfZnVuY3Rpb247CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKCiAgICAgICAgLyogc2tpcCBwYWRkaW5nIGlmIG5lZWRlZCAqLwogICAgICAgIGlmIChicHAgPT0gMikKICAgICAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3QpIHNyY2J1ZiAmIDI7CgogICAgICAgIC8qIGNvcHkgdHJhbnNsdWNlbnQgcGl4ZWxzICovCiAgICAgICAgb2ZzID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsKICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgIHNyY2J1ZiArPSA0OwogICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gdW5jb3B5X3RyYW5zbChkc3QgKyBvZnMsIHNyY2J1ZiwgcnVuLCBkZiwgc2YpOwogICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwogICAgICAgIGRzdCArPSBzdXJmYWNlLT5waXRjaCA+PiAyOwogICAgfQoKZW5kX2Z1bmN0aW9uOgogICAgcmV0dXJuIChTRExfVFJVRSk7Cn0KCnZvaWQKU0RMX1VuUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UsIGludCByZWNvZGUpCnsKICAgIGlmIChzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgewogICAgICAgIHN1cmZhY2UtPmZsYWdzICY9IH5TRExfUkxFQUNDRUw7CgogICAgICAgIGlmIChyZWNvZGUgJiYgIShzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykpIHsKICAgICAgICAgICAgaWYgKHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyAmIFNETF9DT1BZX1JMRV9DT0xPUktFWSkgewogICAgICAgICAgICAgICAgU0RMX1JlY3QgZnVsbDsKCiAgICAgICAgICAgICAgICAvKiByZS1jcmVhdGUgdGhlIG9yaWdpbmFsIHN1cmZhY2UgKi8KICAgICAgICAgICAgICAgIHN1cmZhY2UtPnBpeGVscyA9IFNETF9TSU1EQWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKICAgICAgICAgICAgICAgIGlmICghc3VyZmFjZS0+cGl4ZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgLyogT2ggY3JhcC4uLiAqLwogICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfU0lNRF9BTElHTkVEOwoKICAgICAgICAgICAgICAgIC8qIGZpbGwgaXQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciAqLwogICAgICAgICAgICAgICAgU0RMX0ZpbGxSZWN0KHN1cmZhY2UsIE5VTEwsIHN1cmZhY2UtPm1hcC0+aW5mby5jb2xvcmtleSk7CgogICAgICAgICAgICAgICAgLyogbm93IHJlbmRlciB0aGUgZW5jb2RlZCBzdXJmYWNlICovCiAgICAgICAgICAgICAgICBmdWxsLnggPSBmdWxsLnkgPSAwOwogICAgICAgICAgICAgICAgZnVsbC53ID0gc3VyZmFjZS0+dzsKICAgICAgICAgICAgICAgIGZ1bGwuaCA9IHN1cmZhY2UtPmg7CiAgICAgICAgICAgICAgICBTRExfUkxFQmxpdChzdXJmYWNlLCAmZnVsbCwgc3VyZmFjZSwgJmZ1bGwpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFVblJMRUFscGhhKHN1cmZhY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgLyogT2ggY3JhcC4uLiAqLwogICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzICY9CiAgICAgICAgICAgIH4oU0RMX0NPUFlfUkxFX0NPTE9SS0VZIHwgU0RMX0NPUFlfUkxFX0FMUEhBS0VZKTsKCiAgICAgICAgU0RMX2ZyZWUoc3VyZmFjZS0+bWFwLT5kYXRhKTsKICAgICAgICBzdXJmYWNlLT5tYXAtPmRhdGEgPSBOVUxMOwogICAgfQp9CgovKiB2aTogc2V0IHRzPTQgc3c9NCBleHBhbmR0YWI6ICovCg==