LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxNyBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uL1NETF9pbnRlcm5hbC5oIgoKLyoKICogUkxFIGVuY29kaW5nIGZvciBzb2Z0d2FyZSBjb2xvcmtleSBhbmQgYWxwaGEtY2hhbm5lbCBhY2NlbGVyYXRpb24KICoKICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKICoKICogTWF0dGlhcyBFbmdkZWflcmQgKFlvcmljayk6IFJld3JpdGUuIE5ldyBlbmNvZGluZyBmb3JtYXQsIGVuY29kZXIgYW5kCiAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQogKiBmb3JtYXQsIGVuY29kZXIgYW5kIGJsaXR0ZXIuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCiAqIGxlYWRpbmcgdG8gdGhpcyBjb2RlLgogKgogKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KICovCgovKgogKiBUaGUgZW5jb2RpbmcgdHJhbnNsYXRlcyB0aGUgaW1hZ2UgZGF0YSB0byBhIHN0cmVhbSBvZiBzZWdtZW50cyBvZiB0aGUgZm9ybQogKgogKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CiAqCiAqIHdoZXJlIDxza2lwPiBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBpeGVscyB0byBza2lwLAogKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCiAqIGFuZCAgIDxkYXRhPiBhcmUgdGhlIHBpeGVscyB0aGVtc2VsdmVzLgogKgogKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQogKiBiaW5hcnkgdHJhbnNwYXJlbmN5IGFuZCBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgYmxlbmRpbmcsIGFuZCBmb3Igc3VyZmFjZXMKICogd2l0aCBwZXItcGl4ZWwgYWxwaGEuIFRoZSBkZXRhaWxzIGRpZmZlciwgaG93ZXZlcjoKICoKICogRW5jb2Rpbmcgb2YgY29sb3JrZXllZCBzdXJmYWNlczoKICoKICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgogKiAgIDxza2lwPiBhbmQgPHJ1bj4gYXJlIHVuc2lnbmVkIDggYml0IGludGVnZXJzLCBleGNlcHQgZm9yIDMyIGJpdCBkZXB0aAogKiAgIHdoZXJlIHRoZXkgYXJlIDE2IGJpdC4gVGhpcyBtYWtlcyB0aGUgcGl4ZWwgZGF0YSBhbGlnbmVkIGF0IGFsbCB0aW1lcy4KICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUgKgogKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAqCiAqIEVuY29kaW5nIG9mIHN1cmZhY2VzIHdpdGggcGVyLXBpeGVsIGFscGhhOgogKgogKiAgIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCBhIHN0cnVjdCBSTEVEZXN0Rm9ybWF0IGRlc2NyaWJpbmcgdGhlIHRhcmdldAogKiAgIHBpeGVsIGZvcm1hdCwgdG8gcHJvdmlkZSByZWxpYWJsZSB1bi1lbmNvZGluZy4KICoKICogICBFYWNoIHNjYW4gbGluZSBpcyBlbmNvZGVkIHR3aWNlOiBGaXJzdCBhbGwgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzLAogKiAgIGVuY29kZWQgaW4gdGhlIHRhcmdldCBmb3JtYXQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgdGhlbiBhbGwKICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKICogICBpbiB0aGUgZm9sbG93aW5nIDMyLWJpdCBmb3JtYXQ6CiAqCiAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKICogICB0aGUgYWxwaGEgdmFsdWUgb2NjdXB5aW5nIHRoZSBoaWdoZXN0IDggYml0cy4gVGhlIDxza2lwPiBhbmQgPHJ1bj4KICogICBjb3VudHMgYXJlIDE2IGJpdC4KICoKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCiNpZm5kZWYgTUlOCiNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgoKI2RlZmluZSBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW4sIGJwcCkgICAgICAgICAgXAogICAgU0RMX21lbWNweSh0bywgZnJvbSwgKHNpemVfdCkobGVuKSAqIChicHApKQoKLyoKICogVmFyaW91cyBjb2xvcmtleSBibGl0IG1ldGhvZHMsIGZvciBvcGFxdWUgYW5kIHBlci1zdXJmYWNlIGFscGhhCiAqLwoKI2RlZmluZSBPUEFRVUVfQkxJVCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgIFwKICAgIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbmd0aCwgYnBwKQoKLyoKICogRm9yIDMyYnBwIHBpeGVscyBvbiB0aGUgZm9ybSAweDAwcnJnZ2JiOgogKiBJZiB3ZSB0cmVhdCB0aGUgbWlkZGxlIGNvbXBvbmVudCBzZXBhcmF0ZWx5LCB3ZSBjYW4gcHJvY2VzcyB0aGUgdHdvCiAqIHJlbWFpbmluZyBpbiBwYXJhbGxlbC4gVGhpcyBpcyBzYWZlIHRvIGRvIGJlY2F1c2Ugb2YgdGhlIGdhcCB0byB0aGUgbGVmdAogKiBvZiBlYWNoIGNvbXBvbmVudCwgc28gdGhlIGJpdHMgZnJvbSB0aGUgbXVsdGlwbGljYXRpb24gZG9uJ3QgY29sbGlkZS4KICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYW55IFJHQiBwZXJtdXRhdGlvbiBvZiBjb3Vyc2UuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQzMl84ODgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+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+eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCByaWdodCA9IGxlZnQgKyBzcmNyZWN0LT53OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiAtPSBsZWZ0ICogYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZiAocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKG9mcyA8IHJpZ2h0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0IC0gb2ZzID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxlZnQgLSBvZnM7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBub2NvcHkgIyMgYnBwICMjIGRvX2JsaXQ7ICAgICAgXAogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIHN0YXJ0Y29sID0gb2ZzICsgc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiByaWdodCAtIHN0YXJ0Y29sKSAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSByaWdodCAtIHN0YXJ0Y29sOyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGRvX2JsaXQoZHN0YnVmICsgc3RhcnRjb2wgKiBicHAsIHNyY2J1ZiArIHN0YXJ0ICogYnBwLCBcCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgYnBwLCBhbHBoYSk7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBub2NvcHkgIyMgYnBwICMjIGRvX2JsaXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmIChvZnMgPT0gdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoIS0tbGluZWNvdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgQ0hPT1NFX0JMSVQoUkxFQ0xJUEJMSVQsIGFscGhhLCBmbXQpOwoKI3VuZGVmIFJMRUNMSVBCTElUCgp9CgoKLyogYmxpdCBhIGNvbG9ya2V5ZWQgUkxFIHN1cmZhY2UgKi8KaW50ClNETF9STEVCbGl0KFNETF9TdXJmYWNlICogc3VyZl9zcmMsIFNETF9SZWN0ICogc3JjcmVjdCwKICAgICAgICAgICAgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwgU0RMX1JlY3QgKiBkc3RyZWN0KQp7CiAgICBVaW50OCAqZHN0YnVmOwogICAgVWludDggKnNyY2J1ZjsKICAgIGludCB4LCB5OwogICAgaW50IHcgPSBzdXJmX3NyYy0+dzsKICAgIHVuc2lnbmVkIGFscGhhOwoKICAgIC8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBpZiAoU0RMX0xvY2tTdXJmYWNlKHN1cmZfZHN0KSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFNldCB1cCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycyAqLwogICAgeCA9IGRzdHJlY3QtPng7CiAgICB5ID0gZHN0cmVjdC0+eTsKICAgIGRzdGJ1ZiA9IChVaW50OCAqKSBzdXJmX2RzdC0+cGl4ZWxzCiAgICAgICAgKyB5ICogc3VyZl9kc3QtPnBpdGNoICsgeCAqIHN1cmZfc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CiAgICBzcmNidWYgPSAoVWludDggKikgc3VyZl9zcmMtPm1hcC0+ZGF0YTsKCiAgICB7CiAgICAgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwogICAgICAgIGludCB2c2tpcCA9IHNyY3JlY3QtPnk7CiAgICAgICAgaW50IG9mcyA9IDA7CiAgICAgICAgaWYgKHZza2lwKSB7CgojZGVmaW5lIFJMRVNLSVAoYnBwLCBUeXBlKSAgICAgICAgICBcCiAgICAgICAgZm9yKDs7KSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBydW47ICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBzaXplb2YoVHlwZSkgKiAyOyBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgXAogICAgICAgICAgICBnb3RvIGRvbmU7ICAgICAgXAogICAgICAgICAgICBpZihvZnMgPT0gdykgeyAgICAgIFwKICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgIFwKICAgICAgICAgICAgaWYoIS0tdnNraXApICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICBcCiAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoIChzdXJmX3NyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIFJMRVNLSVAoMSwgVWludDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIFJMRVNLSVAoMiwgVWludDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIFJMRVNLSVAoMywgVWludDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIFJMRVNLSVAoNCwgVWludDE2KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgojdW5kZWYgUkxFU0tJUAoKICAgICAgICB9CiAgICB9CgogICAgYWxwaGEgPSBzdXJmX3NyYy0+bWFwLT5pbmZvLmE7CiAgICAvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLwogICAgaWYgKHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzdXJmX3NyYy0+dykgewogICAgICAgIFJMRUNsaXBCbGl0KHcsIHNyY2J1Ziwgc3VyZl9kc3QsIGRzdGJ1Ziwgc3JjcmVjdCwgYWxwaGEpOwogICAgfSBlbHNlIHsKICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKmZtdCA9IHN1cmZfc3JjLT5mb3JtYXQ7CgojZGVmaW5lIFJMRUJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcig7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZG9fYmxpdChkc3RidWYgKyBvZnMgKiBicHAsIHNyY2J1ZiwgcnVuLCBicHAsIGFscGhhKTsgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihvZnMgPT0gdykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKCEtLWxpbmVjb3VudCkgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZSgwKQoKICAgICAgICBDSE9PU0VfQkxJVChSTEVCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVCTElUCiAgICB9CgogIGRvbmU6CiAgICAvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBTRExfVW5sb2NrU3VyZmFjZShzdXJmX2RzdCk7CiAgICB9CiAgICByZXR1cm4gKDApOwp9CgojdW5kZWYgT1BBUVVFX0JMSVQKCi8qCiAqIFBlci1waXhlbCBibGl0dGluZyBtYWNyb3MgZm9yIHRyYW5zbHVjZW50IHBpeGVsczoKICogVGhlc2UgdXNlIHRoZSBzYW1lIHRlY2huaXF1ZXMgYXMgdGhlIHBlci1zdXJmYWNlIGJsaXR0aW5nIG1hY3JvcwogKi8KCi8qCiAqIEZvciAzMmJwcCBwaXhlbHMsIHdlIGhhdmUgbWFkZSBzdXJlIHRoZSBhbHBoYSBpcyBzdG9yZWQgaW4gdGhlIHRvcAogKiA4IGJpdHMsIHNvIHByb2NlZWQgYXMgdXN1YWwKICovCiNkZWZpbmUgQkxJVF9UUkFOU0xfODg4KHNyYywgZHN0KSAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gcyA+PiAyNDsgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgczEgPSBzICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgXAogICAgVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgIFwKICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyAgICBcCiAgICBzICY9IDB4ZmYwMDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkICY9IDB4ZmYwMDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgICAgICBcCiAgICBkc3QgPSBkMSB8IGQgfCAweGZmMDAwMDAwOyAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwIHBpeGVscywgd2UgaGF2ZSBzdG9yZWQgdGhlIDUgbW9zdCBzaWduaWZpY2FudCBhbHBoYSBiaXRzIGluCiAqIGJpdHMgNS0xMC4gQXMgYmVmb3JlLCB3ZSBjYW4gcHJvY2VzcyBhbGwgMyBSR0IgY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgogKi8KI2RlZmluZSBCTElUX1RSQU5TTF81NjUoc3JjLCBkc3QpICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9IGRzdDsgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OyAgXAogICAgcyAmPSAweDA3ZTBmODFmOyAgICAgICAgICAgIFwKICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsgICAgIFwKICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7ICAgICAgXAogICAgZCAmPSAweDA3ZTBmODFmOyAgICAgICAgICAgIFwKICAgIGRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEJMSVRfVFJBTlNMXzU1NShzcmMsIGRzdCkgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7ICBcCiAgICBzICY9IDB4MDNlMDdjMWY7ICAgICAgICAgICAgXAogICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgXAogICAgZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsgICAgICBcCiAgICBkICY9IDB4MDNlMDdjMWY7ICAgICAgICAgICAgXAogICAgZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qIHVzZWQgdG8gc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IGluIHRoZSBlbmNvZGluZy4gRGVzaWduZWQgdG8gYmUKICAgbWFjcm8tY29tcGF0aWJsZSB3aXRoIFNETF9QaXhlbEZvcm1hdCBidXQgd2l0aG91dCB0aGUgdW5uZWVkZWQgZmllbGRzICovCnR5cGVkZWYgc3RydWN0CnsKICAgIFVpbnQ4IEJ5dGVzUGVyUGl4ZWw7CiAgICBVaW50OCBwYWRkaW5nWzNdOwogICAgVWludDMyIFJtYXNrOwogICAgVWludDMyIEdtYXNrOwogICAgVWludDMyIEJtYXNrOwogICAgVWludDMyIEFtYXNrOwogICAgVWludDggUmxvc3M7CiAgICBVaW50OCBHbG9zczsKICAgIFVpbnQ4IEJsb3NzOwogICAgVWludDggQWxvc3M7CiAgICBVaW50OCBSc2hpZnQ7CiAgICBVaW50OCBHc2hpZnQ7CiAgICBVaW50OCBCc2hpZnQ7CiAgICBVaW50OCBBc2hpZnQ7Cn0gUkxFRGVzdEZvcm1hdDsKCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSBjbGlwcGVkIGF0IHRoZSByaWdodCBhbmQvb3IgbGVmdCBlZGdlcyAqLwpzdGF0aWMgdm9pZApSTEVBbHBoYUNsaXBCbGl0KGludCB3LCBVaW50OCAqIHNyY2J1ZiwgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwKICAgICAgICAgICAgICAgICBVaW50OCAqIGRzdGJ1ZiwgU0RMX1JlY3QgKiBzcmNyZWN0KQp7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gc3VyZl9kc3QtPmZvcm1hdDsKICAgIC8qCiAgICAgKiBjbGlwcGVkIGJsaXR0ZXI6IFB0eXBlIGlzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCB0eXBlLAogICAgICogQ3R5cGUgdGhlIHRyYW5zbHVjZW50IGNvdW50IHR5cGUsIGFuZCBkb19ibGVuZCB0aGUgbWFjcm8KICAgICAqIHRvIGJsZW5kIG9uZSBwaXhlbC4KICAgICAqLwojZGVmaW5lIFJMRUFMUEhBQ0xJUEJMSVQoUHR5cGUsIEN0eXBlLCBkb19ibGVuZCkgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBsZWZ0ID0gc3JjcmVjdC0+eDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsgICAgICAgICAgICAgICAgICAgIFwKICAgIGRzdGJ1ZiAtPSBsZWZ0ICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCBvcGFxdWUgcGl4ZWxzIG9uIG9uZSBsaW5lICovICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgICAgICAgXAogICAgICAgIHJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7ICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLyAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjb2ZzID0gb2ZzOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjcnVuID0gcnVuOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGxlZnQgLSBjb2ZzID4gMCkgeyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuIC09IGxlZnQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY29mcyA9IGxlZnQ7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gcmlnaHQgLSBjb2ZzKSAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biA9IHJpZ2h0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiAwKSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0NPUFkoZHN0YnVmICsgY29mcyAqIHNpemVvZihQdHlwZSksICAgICBcCiAgICAgICAgICAgICAgICAgICBzcmNidWYgKyAoY29mcyAtIG9mcykgKiBzaXplb2YoUHR5cGUpLCBcCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpY3J1biwgc2l6ZW9mKFB0eXBlKSk7ICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIHNpemVvZihQdHlwZSk7ICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8gICAgICAgICAgICAgICBcCiAgICAgICAgaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7ICAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCB0cmFuc2x1Y2VudCBwaXhlbHMgb24gdGhlIHNhbWUgbGluZSAqLyAgICAgICAgXAogICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsgICAgICAgICAgICAgICAgIFwKICAgICAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLyAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjb2ZzID0gb2ZzOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjcnVuID0gcnVuOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGxlZnQgLSBjb2ZzID4gMCkgeyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuIC09IGxlZnQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY29mcyA9IGxlZnQ7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gcmlnaHQgLSBjb2ZzKSAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biA9IHJpZ2h0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiAwKSB7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBjb2ZzOyAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKXNyY2J1ZiArIChjb2ZzIC0gb2ZzKTsgICAgXAogICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGNydW47IGkrKykgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZG9fYmxlbmQoc3JjW2ldLCBkc3RbaV0pOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIDQ7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoLS1saW5lY291bnQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgc3dpdGNoIChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgY2FzZSAyOgogICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkKICAgICAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NjUpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSAqLwppbnQKU0RMX1JMRUFscGhhQmxpdChTRExfU3VyZmFjZSAqIHN1cmZfc3JjLCBTRExfUmVjdCAqIHNyY3JlY3QsCiAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwgU0RMX1JlY3QgKiBkc3RyZWN0KQp7CiAgICBpbnQgeCwgeTsKICAgIGludCB3ID0gc3VyZl9zcmMtPnc7CiAgICBVaW50OCAqc3JjYnVmLCAqZHN0YnVmOwogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IHN1cmZfZHN0LT5mb3JtYXQ7CgogICAgLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIGlmIChTRExfTG9ja1N1cmZhY2Uoc3VyZl9kc3QpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfQoKICAgIHggPSBkc3RyZWN0LT54OwogICAgeSA9IGRzdHJlY3QtPnk7CiAgICBkc3RidWYgPSAoVWludDggKikgc3VyZl9kc3QtPnBpeGVscyArIHkgKiBzdXJmX2RzdC0+cGl0Y2ggKyB4ICogZGYtPkJ5dGVzUGVyUGl4ZWw7CiAgICBzcmNidWYgPSAoVWludDggKikgc3VyZl9zcmMtPm1hcC0+ZGF0YSArIHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKCiAgICB7CiAgICAgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwogICAgICAgIGludCB2c2tpcCA9IHNyY3JlY3QtPnk7CiAgICAgICAgaWYgKHZza2lwKSB7CiAgICAgICAgICAgIGludCBvZnM7CiAgICAgICAgICAgIGlmIChkZi0+Qnl0ZXNQZXJQaXhlbCA9PSAyKSB7CiAgICAgICAgICAgICAgICAvKiB0aGUgMTYvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBvcGFxdWUgbGluZSAqLwogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gc3JjYnVmWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSBzcmNidWZbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gMiAqIHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKCiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBwYWRkaW5nICovCiAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3QpIHNyY2J1ZiAmIDI7CgogICAgICAgICAgICAgICAgICAgIC8qIHNraXAgdHJhbnNsdWNlbnQgbGluZSAqLwogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQgKiAocnVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CiAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXZza2lwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIHRoZSAzMi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIHZza2lwIDw8PSAxOyAgICAvKiBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IGhhdmUgc2FtZSBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBvZnMgPSAwOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNCAqIHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tdnNraXApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCiAgICBpZiAoc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHN1cmZfc3JjLT53KSB7CiAgICAgICAgUkxFQWxwaGFDbGlwQmxpdCh3LCBzcmNidWYsIHN1cmZfZHN0LCBkc3RidWYsIHNyY3JlY3QpOwogICAgfSBlbHNlIHsKCiAgICAgICAgLyoKICAgICAgICAgKiBub24tY2xpcHBlZCBibGl0dGVyLiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKICAgICAgICAgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZQogICAgICAgICAqIG1hY3JvIHRvIGJsZW5kIG9uZSBwaXhlbC4KICAgICAgICAgKi8KI2RlZmluZSBSTEVBTFBIQUJMSVQoUHR5cGUsIEN0eXBlLCBkb19ibGVuZCkgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgb3BhcXVlIHBpeGVscyBvbiBvbmUgbGluZSAqLyAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAoKEN0eXBlICopc3JjYnVmKVswXTsgICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoQ3R5cGUpOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUElYRUxfQ09QWShkc3RidWYgKyBvZnMgKiBzaXplb2YoUHR5cGUpLCBzcmNidWYsIFwKICAgICAgICAgICAgICAgICAgIHJ1biwgc2l6ZW9mKFB0eXBlKSk7ICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIHNpemVvZihQdHlwZSk7ICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGdvdG8gZG9uZTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogc2tpcCBwYWRkaW5nIGlmIG5lY2Vzc2FyeSAqLyAgICAgICAgICAgICAgXAogICAgICAgIGlmKHNpemVvZihQdHlwZSkgPT0gMikgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOyAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCB0cmFuc2x1Y2VudCBwaXhlbHMgb24gdGhlIHNhbWUgbGluZSAqLyAgICAgICBcCiAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOyAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSA0OyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQdHlwZSAqZHN0ID0gKFB0eXBlICopZHN0YnVmICsgb2ZzOyAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgaTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHJ1bjsgaSsrKSB7ICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgc3JjID0gKihVaW50MzIgKilzcmNidWY7ICAgICAgXAogICAgICAgICAgICAgICAgZG9fYmxlbmQoc3JjLCAqZHN0KTsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkc3QrKzsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUoLS1saW5lY291bnQpOyAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgICAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQogICAgICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICBkb25lOgogICAgLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgU0RMX1VubG9ja1N1cmZhY2Uoc3VyZl9kc3QpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIEF1eGlsaWFyeSBmdW5jdGlvbnM6CiAqIFRoZSBlbmNvZGluZyBmdW5jdGlvbnMgdGFrZSAzMmJwcCByZ2IgKyBhLCBhbmQKICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbi4KICogVGhlIGRlY29kaW5nIGZ1bmN0aW9ucyBjb3B5IHRvIDMyYnBwIHJnYiArIGEsIGFuZAogKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlLgogKiBUaGVzZSBhcmUgb25seSB1c2VkIGluIHRoZSBlbmNvZGVyIGFuZCB1bi1STEUgY29kZSBhbmQgYXJlIHRoZXJlZm9yZSBub3QKICogaGlnaGx5IG9wdGltaXNlZC4KICovCgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDE2YnBwIHJnYiwgbG9zaW5nIGFscGhhICovCnN0YXRpYyBpbnQKY29weV9vcGFxdWVfMTYodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQxNiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOwogICAgICAgIFJHQl9GUk9NX1BJWEVMKCpzcmMsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKCpkLCBkZm10LCByLCBnLCBiKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDI7Cn0KCi8qIGRlY29kZSBvcGFxdWUgcGl4ZWxzIGZyb20gMTZicHAgdG8gMzJicHAgcmdiICsgYSAqLwpzdGF0aWMgaW50CnVuY29weV9vcGFxdWVfMTYoVWludDMyICogZHN0LCB2b2lkICpzcmMsIGludCBuLAogICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQxNiAqcyA9IHNyYzsKICAgIHVuc2lnbmVkIGFscGhhID0gZGZtdC0+QW1hc2sgPyAyNTUgOiAwOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7CiAgICAgICAgUkdCX0ZST01fUElYRUwoKnMsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhbHBoYSk7CiAgICAgICAgcysrOwogICAgICAgIGRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiAyOwp9CgoKCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMzJicHAgRzBSQUIgZm9ybWF0IGZvciBibGl0dGluZyBpbnRvIDU2NSAqLwpzdGF0aWMgaW50CmNvcHlfdHJhbnNsXzU2NSh2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQxNiBwaXg7CiAgICAgICAgUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKICAgICAgICAqZCA9ICgocGl4ICYgMHg3ZTApIDw8IDE2KSB8IChwaXggJiAweGY4MWYpIHwgKChhIDw8IDIpICYgMHg3ZTApOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTU1ICovCnN0YXRpYyBpbnQKY29weV90cmFuc2xfNTU1KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDE2IHBpeDsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgICpkID0gKChwaXggJiAweDNlMCkgPDwgMTYpIHwgKHBpeCAmIDB4ZmMxZikgfCAoKGEgPDwgMikgJiAweDNlMCk7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBkZWNvZGUgdHJhbnNsdWNlbnQgcGl4ZWxzIGZyb20gMzJicHAgR09SQUIgdG8gMzJicHAgcmdiICsgYSAqLwpzdGF0aWMgaW50CnVuY29weV90cmFuc2xfMTYoVWludDMyICogZHN0LCB2b2lkICpzcmMsIGludCBuLAogICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqcyA9IHNyYzsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQzMiBwaXggPSAqcysrOwogICAgICAgIGEgPSAocGl4ICYgMHgzZTApID4+IDI7CiAgICAgICAgcGl4ID0gKHBpeCAmIH4weDNlMCkgfCBwaXggPj4gMTY7CiAgICAgICAgUkdCX0ZST01fUElYRUwocGl4LCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGVuY29kZSAzMmJwcCByZ2JhIGludG8gMzJicHAgcmdiYSwga2VlcGluZyBhbHBoYSAoZHVhbCBwdXJwb3NlKSAqLwpzdGF0aWMgaW50CmNvcHlfMzIodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgUkxFUElYRUxfRlJPTV9SR0JBKCpkLCBkZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBkKys7CiAgICAgICAgc3JjKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGRlY29kZSAzMmJwcCByZ2JhIGludG8gMzJicHAgcmdiYSwga2VlcGluZyBhbHBoYSAoZHVhbCBwdXJwb3NlKSAqLwpzdGF0aWMgaW50CnVuY29weV8zMihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKnMgPSBzcmM7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MzIgcGl4ZWwgPSAqcysrOwogICAgICAgIFJHQl9GUk9NX1BJWEVMKHBpeGVsLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBhID0gcGl4ZWwgPj4gMjQ7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgojZGVmaW5lIElTT1BBUVVFKHBpeGVsLCBmbXQpICgoKChwaXhlbCkgJiBmbXQtPkFtYXNrKSA+PiBmbXQtPkFzaGlmdCkgPT0gMjU1KQoKI2RlZmluZSBJU1RSQU5TTChwaXhlbCwgZm10KSAgICBcCiAgICAoKHVuc2lnbmVkKSgoKChwaXhlbCkgJiBmbXQtPkFtYXNrKSA+PiBmbXQtPkFzaGlmdCkgLSAxVSkgPCAyNTRVKQoKLyogY29udmVydCBzdXJmYWNlIHRvIGJlIHF1aWNrbHkgYWxwaGEtYmxpdHRhYmxlIG9udG8gZGVzdCwgaWYgcG9zc2libGUgKi8Kc3RhdGljIGludApSTEVBbHBoYVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBTRExfU3VyZmFjZSAqZGVzdDsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGY7CiAgICBpbnQgbWF4c2l6ZSA9IDA7CiAgICBpbnQgbWF4X29wYXF1ZV9ydW47CiAgICBpbnQgbWF4X3RyYW5zbF9ydW4gPSA2NTUzNTsKICAgIHVuc2lnbmVkIG1hc2tzdW07CiAgICBVaW50OCAqcmxlYnVmLCAqZHN0OwogICAgaW50ICgqY29weV9vcGFxdWUpICh2b2lkICosIFVpbnQzMiAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgKCpjb3B5X3RyYW5zbCkgKHZvaWQgKiwgVWludDMyICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKCiAgICBkZXN0ID0gc3VyZmFjZS0+bWFwLT5kc3Q7CiAgICBpZiAoIWRlc3QpCiAgICAgICAgcmV0dXJuIC0xOwogICAgZGYgPSBkZXN0LT5mb3JtYXQ7CiAgICBpZiAoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gMzIpCiAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogb25seSAzMmJwcCBzb3VyY2Ugc3VwcG9ydGVkICovCgogICAgLyogZmluZCBvdXQgd2hldGhlciB0aGUgZGVzdGluYXRpb24gaXMgb25lIHdlIHN1cHBvcnQsCiAgICAgICBhbmQgZGV0ZXJtaW5lIHRoZSBtYXggc2l6ZSBvZiB0aGUgZW5jb2RlZCByZXN1bHQgKi8KICAgIG1hc2tzdW0gPSBkZi0+Um1hc2sgfCBkZi0+R21hc2sgfCBkZi0+Qm1hc2s7CiAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICBjYXNlIDI6CiAgICAgICAgLyogMTZicHA6IG9ubHkgc3VwcG9ydCA1NjUgYW5kIDU1NSBmb3JtYXRzICovCiAgICAgICAgc3dpdGNoIChtYXNrc3VtKSB7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApIHsKICAgICAgICAgICAgICAgIGNvcHlfb3BhcXVlID0gY29weV9vcGFxdWVfMTY7CiAgICAgICAgICAgICAgICBjb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU2NTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg3ZmZmOgogICAgICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDNlMAogICAgICAgICAgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDNlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwM2UwKSB7CiAgICAgICAgICAgICAgICBjb3B5X29wYXF1ZSA9IGNvcHlfb3BhcXVlXzE2OwogICAgICAgICAgICAgICAgY29weV90cmFuc2wgPSBjb3B5X3RyYW5zbF81NTU7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIG1heF9vcGFxdWVfcnVuID0gMjU1OyAgIC8qIHJ1bnMgc3RvcmVkIGFzIGJ5dGVzICovCgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBwaXhlbHMsCiAgICAgICAgICAgd2l0aCByb29tIGZvciBhbGlnbm1lbnQgcGFkZGluZyBiZXR3ZWVuIGxpbmVzICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoMiArICg0ICsgMikgKiAoc3VyZmFjZS0+dyArIDEpKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgaWYgKG1hc2tzdW0gIT0gMHgwMGZmZmZmZikKICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAvKiByZXF1aXJlcyB1bnVzZWQgaGlnaCBieXRlICovCiAgICAgICAgY29weV9vcGFxdWUgPSBjb3B5XzMyOwogICAgICAgIGNvcHlfdHJhbnNsID0gY29weV8zMjsKICAgICAgICBtYXhfb3BhcXVlX3J1biA9IDI1NTsgICAvKiBydW5zIHN0b3JlZCBhcyBzaG9ydCBpbnRzICovCgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBwaXhlbHMgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqIDIgKiA0ICogKHN1cmZhY2UtPncgKyAxKSArIDQ7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgdW5zdXBwb3J0ZWQgcmlnaHQgbm93ICovCiAgICB9CgogICAgbWF4c2l6ZSArPSBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CiAgICBybGVidWYgPSAoVWludDggKikgU0RMX21hbGxvYyhtYXhzaXplKTsKICAgIGlmICghcmxlYnVmKSB7CiAgICAgICAgcmV0dXJuIFNETF9PdXRPZk1lbW9yeSgpOwogICAgfQogICAgewogICAgICAgIC8qIHNhdmUgdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCBzbyB3ZSBjYW4gdW5kbyB0aGUgZW5jb2RpbmcgbGF0ZXIgKi8KICAgICAgICBSTEVEZXN0Rm9ybWF0ICpyID0gKFJMRURlc3RGb3JtYXQgKikgcmxlYnVmOwogICAgICAgIHItPkJ5dGVzUGVyUGl4ZWwgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKICAgICAgICByLT5SbWFzayA9IGRmLT5SbWFzazsKICAgICAgICByLT5HbWFzayA9IGRmLT5HbWFzazsKICAgICAgICByLT5CbWFzayA9IGRmLT5CbWFzazsKICAgICAgICByLT5BbWFzayA9IGRmLT5BbWFzazsKICAgICAgICByLT5SbG9zcyA9IGRmLT5SbG9zczsKICAgICAgICByLT5HbG9zcyA9IGRmLT5HbG9zczsKICAgICAgICByLT5CbG9zcyA9IGRmLT5CbG9zczsKICAgICAgICByLT5BbG9zcyA9IGRmLT5BbG9zczsKICAgICAgICByLT5Sc2hpZnQgPSBkZi0+UnNoaWZ0OwogICAgICAgIHItPkdzaGlmdCA9IGRmLT5Hc2hpZnQ7CiAgICAgICAgci0+QnNoaWZ0ID0gZGYtPkJzaGlmdDsKICAgICAgICByLT5Bc2hpZnQgPSBkZi0+QXNoaWZ0OwogICAgfQogICAgZHN0ID0gcmxlYnVmICsgc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwoKICAgIC8qIERvIHRoZSBhY3R1YWwgZW5jb2RpbmcgKi8KICAgIHsKICAgICAgICBpbnQgeCwgeTsKICAgICAgICBpbnQgaCA9IHN1cmZhY2UtPmgsIHcgPSBzdXJmYWNlLT53OwogICAgICAgIFNETF9QaXhlbEZvcm1hdCAqc2YgPSBzdXJmYWNlLT5mb3JtYXQ7CiAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopIHN1cmZhY2UtPnBpeGVsczsKICAgICAgICBVaW50OCAqbGFzdGxpbmUgPSBkc3Q7ICAvKiBlbmQgb2YgbGFzdCBub24tYmxhbmsgbGluZSAqLwoKICAgICAgICAvKiBvcGFxdWUgY291bnRzIGFyZSA4IG9yIDE2IGJpdHMsIGRlcGVuZGluZyBvbiB0YXJnZXQgZGVwdGggKi8KI2RlZmluZSBBRERfT1BBUVVFX0NPVU5UUyhuLCBtKSAgICAgICAgIFwKICAgIGlmKGRmLT5CeXRlc1BlclBpeGVsID09IDQpIHsgICAgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMF0gPSBuOyAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07ICAgICBcCiAgICAgICAgZHN0ICs9IDQ7ICAgICAgICAgICAgICAgXAogICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdFswXSA9IG47ICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMV0gPSBtOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0ICs9IDI7ICAgICAgICAgICAgICAgXAogICAgfQoKICAgICAgICAvKiB0cmFuc2x1Y2VudCBjb3VudHMgYXJlIGFsd2F5cyAxNiBiaXQgKi8KI2RlZmluZSBBRERfVFJBTlNMX0NPVU5UUyhuLCBtKSAgICAgXAogICAgKCgoVWludDE2ICopZHN0KVswXSA9IG4sICgoVWludDE2ICopZHN0KVsxXSA9IG0sIGRzdCArPSA0KQoKICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CiAgICAgICAgICAgIGludCBydW5zdGFydCwgc2tpcHN0YXJ0OwogICAgICAgICAgICBpbnQgYmxhbmtsaW5lID0gMDsKICAgICAgICAgICAgLyogRmlyc3QgZW5jb2RlIGFsbCBvcGFxdWUgcGl4ZWxzIG9mIGEgc2NhbiBsaW5lICovCiAgICAgICAgICAgIHggPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpbnQgcnVuLCBza2lwLCBsZW47CiAgICAgICAgICAgICAgICBza2lwc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmICFJU09QQVFVRShzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgSVNPUEFRVUUoc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICAgICAgaWYgKHNraXAgPT0gdykKICAgICAgICAgICAgICAgICAgICBibGFua2xpbmUgPSAxOwogICAgICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwogICAgICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhfb3BhcXVlX3J1bikgewogICAgICAgICAgICAgICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKG1heF9vcGFxdWVfcnVuLCAwKTsKICAgICAgICAgICAgICAgICAgICBza2lwIC09IG1heF9vcGFxdWVfcnVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwogICAgICAgICAgICAgICAgQUREX09QQVFVRV9DT1VOVFMoc2tpcCwgbGVuKTsKICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X29wYXF1ZShkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgd2hpbGUgKHJ1bikgewogICAgICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF9vcGFxdWVfcnVuKTsKICAgICAgICAgICAgICAgICAgICBBRERfT1BBUVVFX0NPVU5UUygwLCBsZW4pOwogICAgICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X29wYXF1ZShkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gd2hpbGUgKHggPCB3KTsKCiAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgbmV4dCBvdXRwdXQgYWRkcmVzcyBpcyAzMi1iaXQgYWxpZ25lZCAqLwogICAgICAgICAgICBkc3QgKz0gKHVpbnRwdHJfdCkgZHN0ICYgMjsKCiAgICAgICAgICAgIC8qIE5leHQsIGVuY29kZSBhbGwgdHJhbnNsdWNlbnQgcGl4ZWxzIG9mIHRoZSBzYW1lIHNjYW4gbGluZSAqLwogICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaW50IHJ1biwgc2tpcCwgbGVuOwogICAgICAgICAgICAgICAgc2tpcHN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAhSVNUUkFOU0woc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIElTVFJBTlNMKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKICAgICAgICAgICAgICAgIGJsYW5rbGluZSAmPSAoc2tpcCA9PSB3KTsKICAgICAgICAgICAgICAgIHJ1biA9IHggLSBydW5zdGFydDsKICAgICAgICAgICAgICAgIHdoaWxlIChza2lwID4gbWF4X3RyYW5zbF9ydW4pIHsKICAgICAgICAgICAgICAgICAgICBBRERfVFJBTlNMX0NPVU5UUyhtYXhfdHJhbnNsX3J1biwgMCk7CiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBtYXhfdHJhbnNsX3J1bjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKICAgICAgICAgICAgICAgIEFERF9UUkFOU0xfQ09VTlRTKHNraXAsIGxlbik7CiAgICAgICAgICAgICAgICBkc3QgKz0gY29weV90cmFuc2woZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIHdoaWxlIChydW4pIHsKICAgICAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfdHJhbnNsX3J1bik7CiAgICAgICAgICAgICAgICAgICAgQUREX1RSQU5TTF9DT1VOVFMoMCwgbGVuKTsKICAgICAgICAgICAgICAgICAgICBkc3QgKz0gY29weV90cmFuc2woZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFibGFua2xpbmUpCiAgICAgICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBkc3Q7CiAgICAgICAgICAgIH0gd2hpbGUgKHggPCB3KTsKCiAgICAgICAgICAgIHNyYyArPSBzdXJmYWNlLT5waXRjaCA+PiAyOwogICAgICAgIH0KICAgICAgICBkc3QgPSBsYXN0bGluZTsgICAgICAgICAvKiBiYWNrIHVwIHBhc3QgdHJhaWxpbmcgYmxhbmsgbGluZXMgKi8KICAgICAgICBBRERfT1BBUVVFX0NPVU5UUygwLCAwKTsKICAgIH0KCiN1bmRlZiBBRERfT1BBUVVFX0NPVU5UUwojdW5kZWYgQUREX1RSQU5TTF9DT1VOVFMKCiAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGl0IGVuY29kZWQsIHJlbGVhc2UgdGhlIG9yaWdpbmFsIHBpeGVscyAqLwogICAgaWYgKCEoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpKSB7CiAgICAgICAgU0RMX2ZyZWUoc3VyZmFjZS0+cGl4ZWxzKTsKICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwogICAgfQoKICAgIC8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KICAgIHsKICAgICAgICBVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKICAgICAgICBpZiAoIXApCiAgICAgICAgICAgIHAgPSBybGVidWY7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gcDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfOChVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICpzcmNidWY7Cn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzE2KFVpbnQ4ICogc3JjYnVmKQp7CiAgICByZXR1cm4gKihVaW50MTYgKikgc3JjYnVmOwp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8yNChVaW50OCAqIHNyY2J1ZikKewojaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgogICAgcmV0dXJuIHNyY2J1ZlswXSArIChzcmNidWZbMV0gPDwgOCkgKyAoc3JjYnVmWzJdIDw8IDE2KTsKI2Vsc2UKICAgIHJldHVybiAoc3JjYnVmWzBdIDw8IDE2KSArIChzcmNidWZbMV0gPDwgOCkgKyBzcmNidWZbMl07CiNlbmRpZgp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8zMihVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICooVWludDMyICopIHNyY2J1ZjsKfQoKdHlwZWRlZiBVaW50MzIoKmdldHBpeF9mdW5jKSAoVWludDggKik7CgpzdGF0aWMgY29uc3QgZ2V0cGl4X2Z1bmMgZ2V0cGl4ZXNbNF0gPSB7CiAgICBnZXRwaXhfOCwgZ2V0cGl4XzE2LCBnZXRwaXhfMjQsIGdldHBpeF8zMgp9OwoKc3RhdGljIGludApSTEVDb2xvcmtleVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBVaW50OCAqcmxlYnVmLCAqZHN0OwogICAgaW50IG1heG47CiAgICBpbnQgeTsKICAgIFVpbnQ4ICpzcmNidWYsICpsYXN0bGluZTsKICAgIGludCBtYXhzaXplID0gMDsKICAgIGNvbnN0IGludCBicHAgPSBzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CiAgICBnZXRwaXhfZnVuYyBnZXRwaXg7CiAgICBVaW50MzIgY2tleSwgcmdibWFzazsKICAgIGludCB3LCBoOwoKICAgIC8qIGNhbGN1bGF0ZSB0aGUgd29yc3QgY2FzZSBzaXplIGZvciB0aGUgY29tcHJlc3NlZCBzdXJmYWNlICovCiAgICBzd2l0Y2ggKGJwcCkgewogICAgY2FzZSAxOgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBwaXhlbHMsCiAgICAgICAgICAgc3RhcnRpbmcgd2l0aCBhbiBvcGFxdWUgcGl4ZWwgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqIDMgKiAoc3VyZmFjZS0+dyAvIDIgKyAxKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDI1NSBwaXhlbHMgd2lkZSAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDIgKiAoc3VyZmFjZS0+dyAvIDI1NSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdXJmYWNlLT53ICogYnBwKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDY1NTM1IHBpeGVscyB3aWRlICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoNCAqIChzdXJmYWNlLT53IC8gNjU1MzUgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3VyZmFjZS0+dyAqIDQpICsgNDsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBybGVidWYgPSAoVWludDggKikgU0RMX21hbGxvYyhtYXhzaXplKTsKICAgIGlmIChybGVidWYgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgIH0KCiAgICAvKiBTZXQgdXAgdGhlIGNvbnZlcnNpb24gKi8KICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzdXJmYWNlLT5waXhlbHM7CiAgICBtYXhuID0gYnBwID09IDQgPyA2NTUzNSA6IDI1NTsKICAgIGRzdCA9IHJsZWJ1ZjsKICAgIHJnYm1hc2sgPSB+c3VyZmFjZS0+Zm9ybWF0LT5BbWFzazsKICAgIGNrZXkgPSBzdXJmYWNlLT5tYXAtPmluZm8uY29sb3JrZXkgJiByZ2JtYXNrOwogICAgbGFzdGxpbmUgPSBkc3Q7CiAgICBnZXRwaXggPSBnZXRwaXhlc1ticHAgLSAxXTsKICAgIHcgPSBzdXJmYWNlLT53OwogICAgaCA9IHN1cmZhY2UtPmg7CgojZGVmaW5lIEFERF9DT1VOVFMobiwgbSkgICAgICAgICAgICBcCiAgICBpZihicHAgPT0gNCkgeyAgICAgICAgICAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVswXSA9IG47ICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsgICAgIFwKICAgICAgICBkc3QgKz0gNDsgICAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzBdID0gbjsgICAgICAgICAgICAgXAogICAgICAgIGRzdFsxXSA9IG07ICAgICAgICAgICAgIFwKICAgICAgICBkc3QgKz0gMjsgICAgICAgICAgICAgICBcCiAgICB9CgogICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgewogICAgICAgIGludCB4ID0gMDsKICAgICAgICBpbnQgYmxhbmtsaW5lID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgaW50IHJ1bnN0YXJ0OwogICAgICAgICAgICBpbnQgc2tpcHN0YXJ0ID0geDsKCiAgICAgICAgICAgIC8qIGZpbmQgcnVuIG9mIHRyYW5zcGFyZW50LCB0aGVuIG9wYXF1ZSBwaXhlbHMgKi8KICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSA9PSBja2V5KQogICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAoZ2V0cGl4KHNyY2J1ZiArIHggKiBicHApICYgcmdibWFzaykgIT0gY2tleSkKICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICBpZiAoc2tpcCA9PSB3KQogICAgICAgICAgICAgICAgYmxhbmtsaW5lID0gMTsKICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwoKICAgICAgICAgICAgLyogZW5jb2RlIHNlZ21lbnQgKi8KICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhuKSB7CiAgICAgICAgICAgICAgICBBRERfQ09VTlRTKG1heG4sIDApOwogICAgICAgICAgICAgICAgc2tpcCAtPSBtYXhuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heG4pOwogICAgICAgICAgICBBRERfQ09VTlRTKHNraXAsIGxlbik7CiAgICAgICAgICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKICAgICAgICAgICAgZHN0ICs9IGxlbiAqIGJwcDsKICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhuKTsKICAgICAgICAgICAgICAgIEFERF9DT1VOVFMoMCwgbGVuKTsKICAgICAgICAgICAgICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKICAgICAgICAgICAgICAgIGRzdCArPSBsZW4gKiBicHA7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYmxhbmtsaW5lKQogICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBkc3Q7CiAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICBzcmNidWYgKz0gc3VyZmFjZS0+cGl0Y2g7CiAgICB9CiAgICBkc3QgPSBsYXN0bGluZTsgICAgICAgICAgICAgLyogYmFjayB1cCBiYXN0IHRyYWlsaW5nIGJsYW5rIGxpbmVzICovCiAgICBBRERfQ09VTlRTKDAsIDApOwoKI3VuZGVmIEFERF9DT1VOVFMKCiAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGl0IGVuY29kZWQsIHJlbGVhc2UgdGhlIG9yaWdpbmFsIHBpeGVscyAqLwogICAgaWYgKCEoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpKSB7CiAgICAgICAgU0RMX2ZyZWUoc3VyZmFjZS0+cGl4ZWxzKTsKICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwogICAgfQoKICAgIC8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KICAgIHsKICAgICAgICAvKiBJZiByZWFsbG9jIHJldHVybnMgTlVMTCwgdGhlIG9yaWdpbmFsIGJsb2NrIGlzIGxlZnQgaW50YWN0ICovCiAgICAgICAgVWludDggKnAgPSBTRExfcmVhbGxvYyhybGVidWYsIGRzdCAtIHJsZWJ1Zik7CiAgICAgICAgaWYgKCFwKQogICAgICAgICAgICBwID0gcmxlYnVmOwogICAgICAgIHN1cmZhY2UtPm1hcC0+ZGF0YSA9IHA7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmludApTRExfUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIGludCBmbGFnczsKCiAgICAvKiBDbGVhciBhbnkgcHJldmlvdXMgUkxFIGNvbnZlcnNpb24gKi8KICAgIGlmICgoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpID09IFNETF9STEVBQ0NFTCkgewogICAgICAgIFNETF9VblJMRVN1cmZhY2Uoc3VyZmFjZSwgMSk7CiAgICB9CgogICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBSTEUgZW5jb2Rpbmcgb2YgYml0bWFwcyAqLwogICAgaWYgKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsIDwgOCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBNYWtlIHN1cmUgdGhlIHBpeGVscyBhcmUgYXZhaWxhYmxlICovCiAgICBpZiAoIXN1cmZhY2UtPnBpeGVscykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGNvbG9ya2V5IG9yIGJsZW5kaW5nLCBub3RoaW5nIHRvIGRvLi4uICovCiAgICBmbGFncyA9IHN1cmZhY2UtPm1hcC0+aW5mby5mbGFnczsKICAgIGlmICghKGZsYWdzICYgKFNETF9DT1BZX0NPTE9SS0VZIHwgU0RMX0NPUFlfQkxFTkQpKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBQYXNzIG9uIGNvbWJpbmF0aW9ucyBub3Qgc3VwcG9ydGVkICovCiAgICBpZiAoKGZsYWdzICYgU0RMX0NPUFlfTU9EVUxBVEVfQ09MT1IpIHx8CiAgICAgICAgKChmbGFncyAmIFNETF9DT1BZX01PRFVMQVRFX0FMUEhBKSAmJiBzdXJmYWNlLT5mb3JtYXQtPkFtYXNrKSB8fAogICAgICAgIChmbGFncyAmIChTRExfQ09QWV9BREQgfCBTRExfQ09QWV9NT0QpKSB8fAogICAgICAgIChmbGFncyAmIFNETF9DT1BZX05FQVJFU1QpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qIEVuY29kZSBhbmQgc2V0IHVwIHRoZSBibGl0ICovCiAgICBpZiAoIXN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgfHwgIShmbGFncyAmIFNETF9DT1BZX0JMRU5EKSkgewogICAgICAgIGlmICghc3VyZmFjZS0+bWFwLT5pZGVudGl0eSkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGlmIChSTEVDb2xvcmtleVN1cmZhY2Uoc3VyZmFjZSkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc3VyZmFjZS0+bWFwLT5ibGl0ID0gU0RMX1JMRUJsaXQ7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzIHw9IFNETF9DT1BZX1JMRV9DT0xPUktFWTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKFJMRUFscGhhU3VyZmFjZShzdXJmYWNlKSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBzdXJmYWNlLT5tYXAtPmJsaXQgPSBTRExfUkxFQWxwaGFCbGl0OwogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyB8PSBTRExfQ09QWV9STEVfQUxQSEFLRVk7CiAgICB9CgogICAgLyogVGhlIHN1cmZhY2UgaXMgbm93IGFjY2VsZXJhdGVkICovCiAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CgogICAgcmV0dXJuICgwKTsKfQoKLyoKICogVW4tUkxFIGEgc3VyZmFjZSB3aXRoIHBpeGVsIGFscGhhCiAqIFRoaXMgbWF5IG5vdCBnaXZlIGJhY2sgZXhhY3RseSB0aGUgaW1hZ2UgYmVmb3JlIFJMRS1lbmNvZGluZzsgYWxsCiAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgcGl4ZWxzIHdpbGwgYmUgbG9zdCwgYW5kIGNvbG9yIGFuZCBhbHBoYSBkZXB0aAogKiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgKHdoZW4gZW5jb2RpbmcgZm9yIDE2YnBwIHRhcmdldHMpLgogKi8Kc3RhdGljIFNETF9ib29sClVuUkxFQWxwaGEoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBVaW50OCAqc3JjYnVmOwogICAgVWludDMyICpkc3Q7CiAgICBTRExfUGl4ZWxGb3JtYXQgKnNmID0gc3VyZmFjZS0+Zm9ybWF0OwogICAgUkxFRGVzdEZvcm1hdCAqZGYgPSBzdXJmYWNlLT5tYXAtPmRhdGE7CiAgICBpbnQgKCp1bmNvcHlfb3BhcXVlKSAoVWludDMyICosIHZvaWQgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwogICAgaW50ICgqdW5jb3B5X3RyYW5zbCkgKFVpbnQzMiAqLCB2b2lkICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCB3ID0gc3VyZmFjZS0+dzsKICAgIGludCBicHAgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKCiAgICBpZiAoYnBwID09IDIpIHsKICAgICAgICB1bmNvcHlfb3BhcXVlID0gdW5jb3B5X29wYXF1ZV8xNjsKICAgICAgICB1bmNvcHlfdHJhbnNsID0gdW5jb3B5X3RyYW5zbF8xNjsKICAgIH0gZWxzZSB7CiAgICAgICAgdW5jb3B5X29wYXF1ZSA9IHVuY29weV90cmFuc2wgPSB1bmNvcHlfMzI7CiAgICB9CgogICAgc3VyZmFjZS0+cGl4ZWxzID0gU0RMX21hbGxvYyhzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwogICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICByZXR1cm4gKFNETF9GQUxTRSk7CiAgICB9CiAgICAvKiBmaWxsIGJhY2tncm91bmQgd2l0aCB0cmFuc3BhcmVudCBwaXhlbHMgKi8KICAgIFNETF9tZW1zZXQoc3VyZmFjZS0+cGl4ZWxzLCAwLCBzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwoKICAgIGRzdCA9IHN1cmZhY2UtPnBpeGVsczsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSAoZGYgKyAxKTsKICAgIGZvciAoOzspIHsKICAgICAgICAvKiBjb3B5IG9wYXF1ZSBwaXhlbHMgKi8KICAgICAgICBpbnQgb2ZzID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsKICAgICAgICAgICAgaWYgKGJwcCA9PSAyKSB7CiAgICAgICAgICAgICAgICBvZnMgKz0gc3JjYnVmWzBdOwogICAgICAgICAgICAgICAgcnVuID0gc3JjYnVmWzFdOwogICAgICAgICAgICAgICAgc3JjYnVmICs9IDI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gdW5jb3B5X29wYXF1ZShkc3QgKyBvZnMsIHNyY2J1ZiwgcnVuLCBkZiwgc2YpOwogICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgcmV0dXJuIChTRExfVFJVRSk7CiAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CgogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWVkZWQgKi8KICAgICAgICBpZiAoYnBwID09IDIpCiAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KSBzcmNidWYgJiAyOwoKICAgICAgICAvKiBjb3B5IHRyYW5zbHVjZW50IHBpeGVscyAqLwogICAgICAgIG9mcyA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICB1bnNpZ25lZCBydW47CiAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgc3JjYnVmICs9IHVuY29weV90cmFuc2woZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICBkc3QgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKICAgIH0KICAgIC8qIE1ha2UgdGhlIGNvbXBpbGVyIGhhcHB5ICovCiAgICByZXR1cm4gKFNETF9UUlVFKTsKfQoKdm9pZApTRExfVW5STEVTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSwgaW50IHJlY29kZSkKewogICAgaWYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSB7CiAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9STEVBQ0NFTDsKCiAgICAgICAgaWYgKHJlY29kZSAmJiAhKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSkgewogICAgICAgICAgICBpZiAoc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzICYgU0RMX0NPUFlfUkxFX0NPTE9SS0VZKSB7CiAgICAgICAgICAgICAgICBTRExfUmVjdCBmdWxsOwoKICAgICAgICAgICAgICAgIC8qIHJlLWNyZWF0ZSB0aGUgb3JpZ2luYWwgc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gU0RMX21hbGxvYyhzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwogICAgICAgICAgICAgICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICAgICAgICAgICAgICAvKiBPaCBjcmFwLi4uICovCiAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBmaWxsIGl0IHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KICAgICAgICAgICAgICAgIFNETF9GaWxsUmVjdChzdXJmYWNlLCBOVUxMLCBzdXJmYWNlLT5tYXAtPmluZm8uY29sb3JrZXkpOwoKICAgICAgICAgICAgICAgIC8qIG5vdyByZW5kZXIgdGhlIGVuY29kZWQgc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgZnVsbC54ID0gZnVsbC55ID0gMDsKICAgICAgICAgICAgICAgIGZ1bGwudyA9IHN1cmZhY2UtPnc7CiAgICAgICAgICAgICAgICBmdWxsLmggPSBzdXJmYWNlLT5oOwogICAgICAgICAgICAgICAgU0RMX1JMRUJsaXQoc3VyZmFjZSwgJmZ1bGwsIHN1cmZhY2UsICZmdWxsKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghVW5STEVBbHBoYShzdXJmYWNlKSkgewogICAgICAgICAgICAgICAgICAgIC8qIE9oIGNyYXAuLi4gKi8KICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyAmPQogICAgICAgICAgICB+KFNETF9DT1BZX1JMRV9DT0xPUktFWSB8IFNETF9DT1BZX1JMRV9BTFBIQUtFWSk7CgogICAgICAgIFNETF9mcmVlKHN1cmZhY2UtPm1hcC0+ZGF0YSk7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gTlVMTDsKICAgIH0KfQoKLyogdmk6IHNldCB0cz00IHN3PTQgZXhwYW5kdGFiOiAqLwo=