LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIlNETF9jb25maWcuaCIKCi8qCiAqIFJMRSBlbmNvZGluZyBmb3Igc29mdHdhcmUgY29sb3JrZXkgYW5kIGFscGhhLWNoYW5uZWwgYWNjZWxlcmF0aW9uCiAqCiAqIE9yaWdpbmFsIHZlcnNpb24gYnkgU2FtIExhbnRpbmdhCiAqCiAqIE1hdHRpYXMgRW5nZGVn5XJkIChZb3JpY2spOiBSZXdyaXRlLiBOZXcgZW5jb2RpbmcgZm9ybWF0LCBlbmNvZGVyIGFuZAogKiBkZWNvZGVyLiBBZGRlZCBwZXItc3VyZmFjZSBhbHBoYSBibGl0dGVyLiBBZGRlZCBwZXItcGl4ZWwgYWxwaGEKICogZm9ybWF0LCBlbmNvZGVyIGFuZCBibGl0dGVyLgogKgogKiBNYW55IHRoYW5rcyB0byBYYXJrIGFuZCBqb2hucyBmb3IgaGludHMsIGJlbmNobWFya3MgYW5kIHVzZWZ1bCBjb21tZW50cwogKiBsZWFkaW5nIHRvIHRoaXMgY29kZS4KICoKICogV2VsY29tZSB0byBNYWNybyBNYXloZW0uCiAqLwoKLyoKICogVGhlIGVuY29kaW5nIHRyYW5zbGF0ZXMgdGhlIGltYWdlIGRhdGEgdG8gYSBzdHJlYW0gb2Ygc2VnbWVudHMgb2YgdGhlIGZvcm0KICoKICogPHNraXA+IDxydW4+IDxkYXRhPgogKgogKiB3aGVyZSA8c2tpcD4gaXMgdGhlIG51bWJlciBvZiB0cmFuc3BhcmVudCBwaXhlbHMgdG8gc2tpcCwKICogICAgICAgPHJ1bj4gIGlzIHRoZSBudW1iZXIgb2Ygb3BhcXVlIHBpeGVscyB0byBibGl0LAogKiBhbmQgICA8ZGF0YT4gYXJlIHRoZSBwaXhlbHMgdGhlbXNlbHZlcy4KICoKICogVGhpcyBiYXNpYyBzdHJ1Y3R1cmUgaXMgdXNlZCBib3RoIGZvciBjb2xvcmtleWVkIHN1cmZhY2VzLCB1c2VkIGZvciBzaW1wbGUKICogYmluYXJ5IHRyYW5zcGFyZW5jeSBhbmQgZm9yIHBlci1zdXJmYWNlIGFscGhhIGJsZW5kaW5nLCBhbmQgZm9yIHN1cmZhY2VzCiAqIHdpdGggcGVyLXBpeGVsIGFscGhhLiBUaGUgZGV0YWlscyBkaWZmZXIsIGhvd2V2ZXI6CiAqCiAqIEVuY29kaW5nIG9mIGNvbG9ya2V5ZWQgc3VyZmFjZXM6CiAqCiAqICAgRW5jb2RlZCBwaXhlbHMgYWx3YXlzIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSB0YXJnZXQgc3VyZmFjZS4KICogICA8c2tpcD4gYW5kIDxydW4+IGFyZSB1bnNpZ25lZCA4IGJpdCBpbnRlZ2VycywgZXhjZXB0IGZvciAzMiBiaXQgZGVwdGgKICogICB3aGVyZSB0aGV5IGFyZSAxNiBiaXQuIFRoaXMgbWFrZXMgdGhlIHBpeGVsIGRhdGEgYWxpZ25lZCBhdCBhbGwgdGltZXMuCiAqICAgU2VnbWVudHMgbmV2ZXIgd3JhcCBhcm91bmQgZnJvbSBvbmUgc2NhbiBsaW5lIHRvIHRoZSBuZXh0LgogKgogKiAgIFRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGlzIG1hcmtlZCBieSBhIHplcm8gPHNraXA+LDxydW4+IHBhaXIgYXQgdGhlICoKICogICBiZWdpbm5pbmcgb2YgYSBsaW5lLgogKgogKiBFbmNvZGluZyBvZiBzdXJmYWNlcyB3aXRoIHBlci1waXhlbCBhbHBoYToKICoKICogICBUaGUgc2VxdWVuY2UgYmVnaW5zIHdpdGggYSBzdHJ1Y3QgUkxFRGVzdEZvcm1hdCBkZXNjcmliaW5nIHRoZSB0YXJnZXQKICogICBwaXhlbCBmb3JtYXQsIHRvIHByb3ZpZGUgcmVsaWFibGUgdW4tZW5jb2RpbmcuCiAqCiAqICAgRWFjaCBzY2FuIGxpbmUgaXMgZW5jb2RlZCB0d2ljZTogRmlyc3QgYWxsIGNvbXBsZXRlbHkgb3BhcXVlIHBpeGVscywKICogICBlbmNvZGVkIGluIHRoZSB0YXJnZXQgZm9ybWF0IGFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIHRoZW4gYWxsCiAqICAgcGFydGlhbGx5IHRyYW5zcGFyZW50ICh0cmFuc2x1Y2VudCkgcGl4ZWxzICh3aGVyZSAxIDw9IGFscGhhIDw9IDI1NCksCiAqICAgaW4gdGhlIGZvbGxvd2luZyAzMi1iaXQgZm9ybWF0OgogKgogKiAgIEZvciAzMi1iaXQgdGFyZ2V0cywgZWFjaCBwaXhlbCBoYXMgdGhlIHRhcmdldCBSR0IgZm9ybWF0IGJ1dCB3aXRoCiAqICAgdGhlIGFscGhhIHZhbHVlIG9jY3VweWluZyB0aGUgaGlnaGVzdCA4IGJpdHMuIFRoZSA8c2tpcD4gYW5kIDxydW4+CiAqICAgY291bnRzIGFyZSAxNiBiaXQuCiAqCiAqICAgRm9yIDE2LWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQsIGJ1dCB3aXRoCiAqICAgdGhlIG1pZGRsZSBjb21wb25lbnQgKHVzdWFsbHkgZ3JlZW4pIHNoaWZ0ZWQgMTYgc3RlcHMgdG8gdGhlIGxlZnQsCiAqICAgYW5kIHRoZSBob2xlIGZpbGxlZCB3aXRoIHRoZSA1IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgYWxwaGEgdmFsdWUuCiAqICAgaS5lLiBpZiB0aGUgdGFyZ2V0IGhhcyB0aGUgZm9ybWF0ICAgICAgICAgcnJycnJnZ2dnZ2diYmJiYiwKICogICB0aGUgZW5jb2RlZCBwaXhlbCB3aWxsIGJlIDAwMDAwZ2dnZ2dnMDAwMDBycnJycjBhYWFhYWJiYmJiLgogKiAgIFRoZSA8c2tpcD4gYW5kIDxydW4+IGNvdW50cyBhcmUgOCBiaXQgZm9yIHRoZSBvcGFxdWUgbGluZXMsIDE2IGJpdAogKiAgIGZvciB0aGUgdHJhbnNsdWNlbnQgbGluZXMuIFR3byBwYWRkaW5nIGJ5dGVzIG1heSBiZSBpbnNlcnRlZAogKiAgIGJlZm9yZSBlYWNoIHRyYW5zbHVjZW50IGxpbmUgdG8ga2VlcCB0aGVtIDMyLWJpdCBhbGlnbmVkLgogKgogKiAgIFRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGlzIG1hcmtlZCBieSBhIHplcm8gPHNraXA+LDxydW4+IHBhaXIgYXQgdGhlCiAqICAgYmVnaW5uaW5nIG9mIGFuIG9wYXF1ZSBsaW5lLgogKi8KCiNpbmNsdWRlICJTRExfdmlkZW8uaCIKI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgojaW5jbHVkZSAiU0RMX2JsaXQuaCIKI2luY2x1ZGUgIlNETF9STEVhY2NlbF9jLmgiCgojaWZuZGVmIE1BWAojZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQojZW5kaWYKI2lmbmRlZiBNSU4KI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKI2VuZGlmCgojZGVmaW5lIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbiwgYnBwKSAgICAgICAgICBcCiAgICBTRExfbWVtY3B5KHRvLCBmcm9tLCAoc2l6ZV90KShsZW4pICogKGJwcCkpCgovKgogKiBWYXJpb3VzIGNvbG9ya2V5IGJsaXQgbWV0aG9kcywgZm9yIG9wYXF1ZSBhbmQgcGVyLXN1cmZhY2UgYWxwaGEKICovCgojZGVmaW5lIE9QQVFVRV9CTElUKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICAgXAogICAgUElYRUxfQ09QWSh0bywgZnJvbSwgbGVuZ3RoLCBicHApCgovKgogKiBGb3IgMzJicHAgcGl4ZWxzIG9uIHRoZSBmb3JtIDB4MDBycmdnYmI6CiAqIElmIHdlIHRyZWF0IHRoZSBtaWRkbGUgY29tcG9uZW50IHNlcGFyYXRlbHksIHdlIGNhbiBwcm9jZXNzIHRoZSB0d28KICogcmVtYWluaW5nIGluIHBhcmFsbGVsLiBUaGlzIGlzIHNhZmUgdG8gZG8gYmVjYXVzZSBvZiB0aGUgZ2FwIHRvIHRoZSBsZWZ0CiAqIG9mIGVhY2ggY29tcG9uZW50LCBzbyB0aGUgYml0cyBmcm9tIHRoZSBtdWx0aXBsaWNhdGlvbiBkb24ndCBjb2xsaWRlLgogKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbnkgUkdCIHBlcm11dGF0aW9uIG9mIGNvdXJzZS4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOyAgICAgICAgICAgICBcCiAgICBVaW50MzIgKmRzdCA9IChVaW50MzIgKikodG8pOyAgICAgICAgICAgICAgIFwKICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgIFwKICAgICAgICBkMSA9IChkMSArICgoczEgLSBkMSkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDBmZjsgICAgXAogICAgICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGQgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOyAgICAgIFwKICAgICAgICAqZHN0KysgPSBkMSB8IGQ7ICAgICAgICAgICAgICAgICAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwIHBpeGVscyB3ZSBjYW4gZ28gYSBzdGVwIGZ1cnRoZXI6IHB1dCB0aGUgbWlkZGxlIGNvbXBvbmVudAogKiBpbiB0aGUgaGlnaCAxNiBiaXRzIG9mIGEgMzIgYml0IHdvcmQsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLiBTaW5jZSB0aGUgc21hbGxlc3QgZ2FwIGlzIGhlcmUganVzdAogKiA1IGJpdHMsIHdlIGhhdmUgdG8gc2NhbGUgYWxwaGEgZG93biB0byA1IGJpdHMgYXMgd2VsbC4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU2NSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOyAgICAgICAgIFwKICAgIFVpbnQxNiAqZHN0ID0gKFVpbnQxNiAqKSh0byk7ICAgICAgICAgICBcCiAgICBVaW50MzIgQUxQSEEgPSBhbHBoYSA+PiAzOyAgICAgICAgICBcCiAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgIFwKICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgIFwKICAgICAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICBcCiAgICAgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgXAogICAgICAgIGQgKz0gKHMgLSBkKSAqIEFMUEhBID4+IDU7ICAgICAgICAgIFwKICAgICAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgICAgIFwKICAgICAgICAqZHN0KysgPSAoVWludDE2KShkIHwgZCA+PiAxNik7ICAgICAgICAgXAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgXAogICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgIFwKICAgIFVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7ICAgICAgICAgIFwKICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgXAogICAgICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgIFwKICAgICAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7ICAgICBcCiAgICAgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsgICAgICAgICAgXAogICAgICAgIGQgJj0gMHgwM2UwN2MxZjsgICAgICAgICAgICAgICAgXAogICAgICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBUaGUgZ2VuZXJhbCBzbG93IGNhdGNoLWFsbCBmdW5jdGlvbiwgZm9yIHJlbWFpbmluZyBkZXB0aHMgYW5kIGZvcm1hdHMKICovCiNkZWZpbmUgQUxQSEFfQkxJVF9BTlkodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDggKnNyYyA9IGZyb207ICAgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQ4ICpkc3QgPSB0bzsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzLCBkOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBycywgZ3MsIGJzLCByZCwgZ2QsIGJkOyAgICAgICAgICAgICAgICBcCiAgICAgICAgc3dpdGNoKGJwcCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHMgPSAqKFVpbnQxNiAqKXNyYzsgICAgICAgICAgICAgICAgIFwKICAgICAgICBkID0gKihVaW50MTYgKilkc3Q7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgeyAgICAgICAgICAgXAogICAgICAgICAgICBzID0gKHNyY1swXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzJdOyAgICBcCiAgICAgICAgICAgIGQgPSAoZHN0WzBdIDw8IDE2KSB8IChkc3RbMV0gPDwgOCkgfCBkc3RbMl07ICAgIFwKICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcyA9IChzcmNbMl0gPDwgMTYpIHwgKHNyY1sxXSA8PCA4KSB8IHNyY1swXTsgICAgXAogICAgICAgICAgICBkID0gKGRzdFsyXSA8PCAxNikgfCAoZHN0WzFdIDw8IDgpIHwgZHN0WzBdOyAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzID0gKihVaW50MzIgKilzcmM7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgZCA9ICooVWludDMyICopZHN0OyAgICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFJHQl9GUk9NX1BJWEVMKHMsIGZtdCwgcnMsIGdzLCBicyk7ICAgICAgICAgICAgIFwKICAgICAgICBSR0JfRlJPTV9QSVhFTChkLCBmbXQsIHJkLCBnZCwgYmQpOyAgICAgICAgICAgICBcCiAgICAgICAgcmQgKz0gKHJzIC0gcmQpICogYWxwaGEgPj4gODsgICAgICAgICAgICAgICBcCiAgICAgICAgZ2QgKz0gKGdzIC0gZ2QpICogYWxwaGEgPj4gODsgICAgICAgICAgICAgICBcCiAgICAgICAgYmQgKz0gKGJzIC0gYmQpICogYWxwaGEgPj4gODsgICAgICAgICAgICAgICBcCiAgICAgICAgUElYRUxfRlJPTV9SR0IoZCwgZm10LCByZCwgZ2QsIGJkKTsgICAgICAgICAgICAgXAogICAgICAgIHN3aXRjaChicHApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAqKFVpbnQxNiAqKWRzdCA9IChVaW50MTYpZDsgICAgICAgICAgICAgICAgIFwKICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdFswXSA9IChVaW50OCkoZCA+PiAxNik7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkc3RbMV0gPSAoVWludDgpKGQgPj4gOCk7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdFswXSA9IChVaW50OClkOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdFsxXSA9IChVaW50OCkoZCA+PiA4KTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkc3RbMl0gPSAoVWludDgpKGQgPj4gMTYpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICooVWludDMyICopZHN0ID0gZDsgICAgICAgICAgICAgICAgIFwKICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmMgKz0gYnBwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0ICs9IGJwcDsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBTcGVjaWFsIGNhc2U6IDUwJSBhbHBoYSAoYWxwaGE9MTI4KQogKiBUaGlzIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2UgaXQgY2FuIGJlIG9wdGltaXplZCB2ZXJ5IHdlbGwsIGFuZAogKiBzaW5jZSBpdCBpcyBnb29kIGZvciBtYW55IGNhc2VzIG9mIHNlbWktdHJhbnNsdWNlbmN5LgogKiBUaGUgdGhlb3J5IGlzIHRvIGRvIGFsbCB0aHJlZSBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWU6CiAqIEZpcnN0IHplcm8gdGhlIGxvd2VzdCBiaXQgb2YgZWFjaCBjb21wb25lbnQsIHdoaWNoIGdpdmVzIHVzIHJvb20gdG8KICogYWRkIHRoZW0uIFRoZW4gc2hpZnQgcmlnaHQgYW5kIGFkZCB0aGUgc3VtIG9mIHRoZSBsb3dlc3QgYml0cy4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OF81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOyAgICAgICAgICAgICAgICAgXAogICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgXAogICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKmRzdCsrID0gKCgocyAmIDB4MDBmZWZlZmUpICsgKGQgJiAweDAwZmVmZWZlKSkgPj4gMSkgICBcCiAgICAgICAgICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOyAgICAgICAgICAgICAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCwgd2UgY2FuIGFjdHVhbGx5IGJsZW5kIHR3byBwaXhlbHMgaW4gcGFyYWxsZWwsIGlmIHdlIHRha2UKICogY2FyZSB0byBzaGlmdCBiZWZvcmUgd2UgYWRkLCBub3QgYWZ0ZXIuCiAqLwoKLyogaGVscGVyOiBibGVuZCBhIHNpbmdsZSAxNiBiaXQgcGl4ZWwgYXQgNTAlICovCiNkZWZpbmUgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzaykgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICBcCiAgICAqZHN0KysgPSAoVWludDE2KSgoKChzICYgbWFzaykgKyAoZCAmIG1hc2spKSA+PiAxKSArICAgIFwKICAgICAgICAgICAgICAgICAgICAgIChzICYgZCAmICh+bWFzayAmIDB4ZmZmZikpKTsgICAgICBcCiAgICB9IHdoaWxlKDApCgovKiBiYXNpYyAxNmJwcCBibGVuZGVyLiBtYXNrIGlzIHRoZSBwaXhlbHMgdG8ga2VlcCB3aGVuIGFkZGluZy4gKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgbWFzaykgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIG4gPSAobGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOyAgICAgICAgICAgICAgICAgXAogICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgICAgICAgICAgXAogICAgaWYoKCh1aW50cHRyX3Qpc3JjIF4gKHVpbnRwdHJfdClkc3QpICYgMykgeyAgICAgICAgIFwKICAgICAgICAvKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG5vdCBpbiBwaGFzZSwgYmxpdCBvbmUgYnkgb25lICovICBcCiAgICAgICAgd2hpbGUobi0tKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYoKHVpbnRwdHJfdClzcmMgJiAzKSB7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogZmlyc3Qgb2RkIHBpeGVsICovICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgXAogICAgICAgIG4tLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcig7IG4gPiAxOyBuIC09IDIpIHsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSAqKFVpbnQzMiAqKXNyYzsgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgZCA9ICooVWludDMyICopZHN0OyAgICAgICAgICAgICAgXAogICAgICAgICooVWludDMyICopZHN0ID0gKChzICYgKG1hc2sgfCBtYXNrIDw8IDE2KSkgPj4gMSkgICBcCiAgICAgICAgICAgICAgICAgICAgICAgKyAoKGQgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKSAgIFwKICAgICAgICAgICAgICAgICAgICAgICArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpOyAgXAogICAgICAgIHNyYyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAvKiBsYXN0IG9kZCBwaXhlbCAqLyAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU2NV81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgIFwKICAgIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCAweGY3ZGUpCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICBcCiAgICBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgMHhmYmRlKQoKI2RlZmluZSBDSE9PU0VfQkxJVChibGl0dGVyLCBhbHBoYSwgZm10KSAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYoYWxwaGEgPT0gMjU1KSB7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzd2l0Y2goZm10LT5CeXRlc1BlclBpeGVsKSB7ICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDE6IGJsaXR0ZXIoMSwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgIGNhc2UgMjogYmxpdHRlcigyLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgY2FzZSAzOiBibGl0dGVyKDMsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgIFwKICAgICAgICBjYXNlIDQ6IGJsaXR0ZXIoNCwgVWludDE2LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIE5vIDhicHAgYWxwaGEgYmxpdHRpbmcgKi8gICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3dpdGNoKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgeyAgICAgIFwKICAgICAgICBjYXNlIDB4ZmZmZjogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGZtdC0+R21hc2sgPT0gMHgwN2UwICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDA3ZTAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDA3ZTApIHsgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoYWxwaGEgPT0gMTI4KSAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1XzUwKTsgXAogICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NSk7ICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBnb3RvIGdlbmVyYWwxNjsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNhc2UgMHg3ZmZmOiAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoZm10LT5HbWFzayA9PSAweDAzZTAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDNlMCAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDNlMCkgeyAgICAgICAgICAgXAogICAgICAgICAgICBpZihhbHBoYSA9PSAxMjgpICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTVfNTApOyBcCiAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1KTsgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGdlbmVyYWwxNjogICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7ICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgYmxpdHRlcigzLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOyAgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZigoZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSA9PSAweDAwZmZmZmZmIFwKICAgICAgICAgICAmJiAoZm10LT5HbWFzayA9PSAweGZmMDAgfHwgZm10LT5SbWFzayA9PSAweGZmMDAgXAogICAgICAgICAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4ZmYwMCkpIHsgICAgICAgICAgXAogICAgICAgICAgICBpZihhbHBoYSA9PSAxMjgpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4XzUwKTsgICAgXAogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OCk7ICAgICAgIFwKICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVRfQU5ZKTsgICAgICAgICBcCiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFRoaXMgdGFrZXMgY2FyZSBvZiB0aGUgY2FzZSB3aGVuIHRoZSBzdXJmYWNlIGlzIGNsaXBwZWQgb24gdGhlIGxlZnQgYW5kL29yCiAqIHJpZ2h0LiBUb3AgY2xpcHBpbmcgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mLgogKi8Kc3RhdGljIHZvaWQKUkxFQ2xpcEJsaXQoaW50IHcsIFVpbnQ4ICogc3JjYnVmLCBTRExfU3VyZmFjZSAqIGRzdCwKICAgICAgICAgICAgVWludDggKiBkc3RidWYsIFNETF9SZWN0ICogc3JjcmVjdCwgdW5zaWduZWQgYWxwaGEpCnsKICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gZHN0LT5mb3JtYXQ7CgojZGVmaW5lIFJMRUNMSVBCTElUKGJwcCwgVHlwZSwgZG9fYmxpdCkgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBsZWZ0ID0gc3JjcmVjdC0+eDsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7ICAgICAgICAgICAgICAgICAgICAgXAogICAgZHN0YnVmIC09IGxlZnQgKiBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBmb3IoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLyAgICAgICAgICAgICAgIFwKICAgICAgICBpZihvZnMgPCByaWdodCkgeyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgbGVuID0gcnVuOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IHN0YXJ0Y29sOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGxlZnQgLSBvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3RhcnQgPSBsZWZ0IC0gb2ZzOyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGxlbiAtPSBzdGFydDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZW4gPD0gMCkgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGdvdG8gbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OyAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3RhcnRjb2wgPSBvZnMgKyBzdGFydDsgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZW4gPiByaWdodCAtIHN0YXJ0Y29sKSAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBsZW4gPSByaWdodCAtIHN0YXJ0Y29sOyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRvX2JsaXQoZHN0YnVmICsgc3RhcnRjb2wgKiBicHAsIHNyY2J1ZiArIHN0YXJ0ICogYnBwLCBcCiAgICAgICAgICAgICAgICBsZW4sIGJwcCwgYWxwaGEpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDogICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKG9mcyA9PSB3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RidWYgKz0gZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKCEtLWxpbmVjb3VudCkgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgIENIT09TRV9CTElUKFJMRUNMSVBCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVDTElQQkxJVAoKfQoKCi8qIGJsaXQgYSBjb2xvcmtleWVkIFJMRSBzdXJmYWNlICovCmludApTRExfUkxFQmxpdChTRExfU3VyZmFjZSAqIHNyYywgU0RMX1JlY3QgKiBzcmNyZWN0LAogICAgICAgICAgICBTRExfU3VyZmFjZSAqIGRzdCwgU0RMX1JlY3QgKiBkc3RyZWN0KQp7CiAgICBVaW50OCAqZHN0YnVmOwogICAgVWludDggKnNyY2J1ZjsKICAgIGludCB4LCB5OwogICAgaW50IHcgPSBzcmMtPnc7CiAgICB1bnNpZ25lZCBhbHBoYTsKCiAgICAvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soZHN0KSkgewogICAgICAgIGlmIChTRExfTG9ja1N1cmZhY2UoZHN0KSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFNldCB1cCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycyAqLwogICAgeCA9IGRzdHJlY3QtPng7CiAgICB5ID0gZHN0cmVjdC0+eTsKICAgIGRzdGJ1ZiA9IChVaW50OCAqKSBkc3QtPnBpeGVscwogICAgICAgICsgeSAqIGRzdC0+cGl0Y2ggKyB4ICogc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CiAgICBzcmNidWYgPSAoVWludDggKikgc3JjLT5tYXAtPmRhdGE7CgogICAgewogICAgICAgIC8qIHNraXAgbGluZXMgYXQgdGhlIHRvcCBpZiBuZWNlc3NhcnkgKi8KICAgICAgICBpbnQgdnNraXAgPSBzcmNyZWN0LT55OwogICAgICAgIGludCBvZnMgPSAwOwogICAgICAgIGlmICh2c2tpcCkgewoKI2RlZmluZSBSTEVTS0lQKGJwcCwgVHlwZSkgICAgICAgICAgXAogICAgICAgIGZvcig7OykgeyAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgcnVuOyAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgXAogICAgICAgICAgICBzcmNidWYgKz0gc2l6ZW9mKFR5cGUpICogMjsgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgIFwKICAgICAgICAgICAgZ290byBkb25lOyAgICAgIFwKICAgICAgICAgICAgaWYob2ZzID09IHcpIHsgICAgICBcCiAgICAgICAgICAgIG9mcyA9IDA7ICAgICAgICBcCiAgICAgICAgICAgIGlmKCEtLXZza2lwKSAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgXAogICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAoc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgUkxFU0tJUCgxLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgUkxFU0tJUCgyLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgUkxFU0tJUCgzLCBVaW50OCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgUkxFU0tJUCg0LCBVaW50MTYpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiN1bmRlZiBSTEVTS0lQCgogICAgICAgIH0KICAgIH0KCiAgICBhbHBoYSA9IHNyYy0+bWFwLT5pbmZvLmE7CiAgICAvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLwogICAgaWYgKHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzcmMtPncpIHsKICAgICAgICBSTEVDbGlwQmxpdCh3LCBzcmNidWYsIGRzdCwgZHN0YnVmLCBzcmNyZWN0LCBhbHBoYSk7CiAgICB9IGVsc2UgewogICAgICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gc3JjLT5mb3JtYXQ7CgojZGVmaW5lIFJMRUJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcig7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZG9fYmxpdChkc3RidWYgKyBvZnMgKiBicHAsIHNyY2J1ZiwgcnVuLCBicHAsIGFscGhhKTsgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihvZnMgPT0gdykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZHN0YnVmICs9IGRzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZighLS1saW5lY291bnQpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUoMCkKCiAgICAgICAgQ0hPT1NFX0JMSVQoUkxFQkxJVCwgYWxwaGEsIGZtdCk7CgojdW5kZWYgUkxFQkxJVAogICAgfQoKICBkb25lOgogICAgLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soZHN0KSkgewogICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKGRzdCk7CiAgICB9CiAgICByZXR1cm4gKDApOwp9CgojdW5kZWYgT1BBUVVFX0JMSVQKCi8qCiAqIFBlci1waXhlbCBibGl0dGluZyBtYWNyb3MgZm9yIHRyYW5zbHVjZW50IHBpeGVsczoKICogVGhlc2UgdXNlIHRoZSBzYW1lIHRlY2huaXF1ZXMgYXMgdGhlIHBlci1zdXJmYWNlIGJsaXR0aW5nIG1hY3JvcwogKi8KCi8qCiAqIEZvciAzMmJwcCBwaXhlbHMsIHdlIGhhdmUgbWFkZSBzdXJlIHRoZSBhbHBoYSBpcyBzdG9yZWQgaW4gdGhlIHRvcAogKiA4IGJpdHMsIHNvIHByb2NlZWQgYXMgdXN1YWwKICovCiNkZWZpbmUgQkxJVF9UUkFOU0xfODg4KHNyYywgZHN0KSAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gcyA+PiAyNDsgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgczEgPSBzICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgXAogICAgVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgIFwKICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyAgICBcCiAgICBzICY9IDB4ZmYwMDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkICY9IDB4ZmYwMDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgICAgICBcCiAgICBkc3QgPSBkMSB8IGQgfCAweGZmMDAwMDAwOyAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwIHBpeGVscywgd2UgaGF2ZSBzdG9yZWQgdGhlIDUgbW9zdCBzaWduaWZpY2FudCBhbHBoYSBiaXRzIGluCiAqIGJpdHMgNS0xMC4gQXMgYmVmb3JlLCB3ZSBjYW4gcHJvY2VzcyBhbGwgMyBSR0IgY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgogKi8KI2RlZmluZSBCTElUX1RSQU5TTF81NjUoc3JjLCBkc3QpICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9IGRzdDsgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OyAgXAogICAgcyAmPSAweDA3ZTBmODFmOyAgICAgICAgICAgIFwKICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsgICAgIFwKICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7ICAgICAgXAogICAgZCAmPSAweDA3ZTBmODFmOyAgICAgICAgICAgIFwKICAgIGRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEJMSVRfVFJBTlNMXzU1NShzcmMsIGRzdCkgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7ICBcCiAgICBzICY9IDB4MDNlMDdjMWY7ICAgICAgICAgICAgXAogICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgXAogICAgZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsgICAgICBcCiAgICBkICY9IDB4MDNlMDdjMWY7ICAgICAgICAgICAgXAogICAgZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qIHVzZWQgdG8gc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IGluIHRoZSBlbmNvZGluZy4gRGVzaWduZWQgdG8gYmUKICAgbWFjcm8tY29tcGF0aWJsZSB3aXRoIFNETF9QaXhlbEZvcm1hdCBidXQgd2l0aG91dCB0aGUgdW5uZWVkZWQgZmllbGRzICovCnR5cGVkZWYgc3RydWN0CnsKICAgIFVpbnQ4IEJ5dGVzUGVyUGl4ZWw7CiAgICBVaW50OCBwYWRkaW5nWzNdOwogICAgVWludDMyIFJtYXNrOwogICAgVWludDMyIEdtYXNrOwogICAgVWludDMyIEJtYXNrOwogICAgVWludDMyIEFtYXNrOwogICAgVWludDggUmxvc3M7CiAgICBVaW50OCBHbG9zczsKICAgIFVpbnQ4IEJsb3NzOwogICAgVWludDggQWxvc3M7CiAgICBVaW50OCBSc2hpZnQ7CiAgICBVaW50OCBHc2hpZnQ7CiAgICBVaW50OCBCc2hpZnQ7CiAgICBVaW50OCBBc2hpZnQ7Cn0gUkxFRGVzdEZvcm1hdDsKCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSBjbGlwcGVkIGF0IHRoZSByaWdodCBhbmQvb3IgbGVmdCBlZGdlcyAqLwpzdGF0aWMgdm9pZApSTEVBbHBoYUNsaXBCbGl0KGludCB3LCBVaW50OCAqIHNyY2J1ZiwgU0RMX1N1cmZhY2UgKiBkc3QsCiAgICAgICAgICAgICAgICAgVWludDggKiBkc3RidWYsIFNETF9SZWN0ICogc3JjcmVjdCkKewogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IGRzdC0+Zm9ybWF0OwogICAgLyoKICAgICAqIGNsaXBwZWQgYmxpdHRlcjogUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCiAgICAgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZSBtYWNybwogICAgICogdG8gYmxlbmQgb25lIHBpeGVsLgogICAgICovCiNkZWZpbmUgUkxFQUxQSEFDTElQQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKSAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICAgXAogICAgaW50IGxlZnQgPSBzcmNyZWN0LT54OyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCByaWdodCA9IGxlZnQgKyBzcmNyZWN0LT53OyAgICAgICAgICAgICAgICAgICAgXAogICAgZHN0YnVmIC09IGxlZnQgKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8gICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyArPSAoKEN0eXBlICopc3JjYnVmKVswXTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNvZnMgPSBvZnM7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNydW4gPSBydW47ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gLT0gbGVmdCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjb2ZzID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiByaWdodCAtIGNvZnMpICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuID0gcmlnaHQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IDApICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUElYRUxfQ09QWShkc3RidWYgKyBjb2ZzICogc2l6ZW9mKFB0eXBlKSwgICAgIFwKICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArIChjb2ZzIC0gb2ZzKSAqIHNpemVvZihQdHlwZSksIFwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCljcnVuLCBzaXplb2YoUHR5cGUpKTsgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIGlmKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogc2tpcCBwYWRkaW5nIGlmIG5lY2Vzc2FyeSAqLyAgICAgICAgICAgICAgIFwKICAgICAgICBpZihzaXplb2YoUHR5cGUpID09IDIpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsgICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovICAgICAgICBcCiAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOyAgICAgICAgICAgICAgICAgXAogICAgICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNvZnMgPSBvZnM7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IGNydW4gPSBydW47ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gLT0gbGVmdCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjb2ZzID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiByaWdodCAtIGNvZnMpICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuID0gcmlnaHQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IDApIHsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIGNvZnM7ICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopc3JjYnVmICsgKGNvZnMgLSBvZnMpOyAgICBcCiAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY3J1bjsgaSsrKSAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkb19ibGVuZChzcmNbaV0sIGRzdFtpXSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogNDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiArPSBkc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoLS1saW5lY291bnQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgc3dpdGNoIChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgY2FzZSAyOgogICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkKICAgICAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NjUpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSAqLwppbnQKU0RMX1JMRUFscGhhQmxpdChTRExfU3VyZmFjZSAqIHNyYywgU0RMX1JlY3QgKiBzcmNyZWN0LAogICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICogZHN0LCBTRExfUmVjdCAqIGRzdHJlY3QpCnsKICAgIGludCB4LCB5OwogICAgaW50IHcgPSBzcmMtPnc7CiAgICBVaW50OCAqc3JjYnVmLCAqZHN0YnVmOwogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IGRzdC0+Zm9ybWF0OwoKICAgIC8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhkc3QpKSB7CiAgICAgICAgaWYgKFNETF9Mb2NrU3VyZmFjZShkc3QpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfQoKICAgIHggPSBkc3RyZWN0LT54OwogICAgeSA9IGRzdHJlY3QtPnk7CiAgICBkc3RidWYgPSAoVWludDggKikgZHN0LT5waXhlbHMgKyB5ICogZHN0LT5waXRjaCArIHggKiBkZi0+Qnl0ZXNQZXJQaXhlbDsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzcmMtPm1hcC0+ZGF0YSArIHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKCiAgICB7CiAgICAgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwogICAgICAgIGludCB2c2tpcCA9IHNyY3JlY3QtPnk7CiAgICAgICAgaWYgKHZza2lwKSB7CiAgICAgICAgICAgIGludCBvZnM7CiAgICAgICAgICAgIGlmIChkZi0+Qnl0ZXNQZXJQaXhlbCA9PSAyKSB7CiAgICAgICAgICAgICAgICAvKiB0aGUgMTYvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBvcGFxdWUgbGluZSAqLwogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gc3JjYnVmWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSBzcmNidWZbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gMiAqIHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKCiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBwYWRkaW5nICovCiAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3QpIHNyY2J1ZiAmIDI7CgogICAgICAgICAgICAgICAgICAgIC8qIHNraXAgdHJhbnNsdWNlbnQgbGluZSAqLwogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQgKiAocnVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CiAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXZza2lwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIHRoZSAzMi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIHZza2lwIDw8PSAxOyAgICAvKiBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IGhhdmUgc2FtZSBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBvZnMgPSAwOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNCAqIHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tdnNraXApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCiAgICBpZiAoc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHNyYy0+dykgewogICAgICAgIFJMRUFscGhhQ2xpcEJsaXQodywgc3JjYnVmLCBkc3QsIGRzdGJ1Ziwgc3JjcmVjdCk7CiAgICB9IGVsc2UgewoKICAgICAgICAvKgogICAgICAgICAqIG5vbi1jbGlwcGVkIGJsaXR0ZXIuIFB0eXBlIGlzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCB0eXBlLAogICAgICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlCiAgICAgICAgICogbWFjcm8gdG8gYmxlbmQgb25lIHBpeGVsLgogICAgICAgICAqLwojZGVmaW5lIFJMRUFMUEhBQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKSAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCBvcGFxdWUgcGl4ZWxzIG9uIG9uZSBsaW5lICovICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQSVhFTF9DT1BZKGRzdGJ1ZiArIG9mcyAqIHNpemVvZihQdHlwZSksIHNyY2J1ZiwgXAogICAgICAgICAgICAgICAgICAgcnVuLCBzaXplb2YoUHR5cGUpKTsgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZ290byBkb25lOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovICAgICAgICAgICAgICBcCiAgICAgICAgaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKSAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7ICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovICAgICAgIFwKICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBvZnM7ICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcnVuOyBpKyspIHsgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIFVpbnQzMiBzcmMgPSAqKFVpbnQzMiAqKXNyY2J1ZjsgICAgICBcCiAgICAgICAgICAgICAgICBkb19ibGVuZChzcmMsICpkc3QpOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdCsrOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiArPSBkc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUoLS1saW5lY291bnQpOyAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgICAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQogICAgICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICBkb25lOgogICAgLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soZHN0KSkgewogICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKGRzdCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoKICogQXV4aWxpYXJ5IGZ1bmN0aW9uczoKICogVGhlIGVuY29kaW5nIGZ1bmN0aW9ucyB0YWtlIDMyYnBwIHJnYiArIGEsIGFuZAogKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgogKiBUaGUgZGVjb2RpbmcgZnVuY3Rpb25zIGNvcHkgdG8gMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UuCiAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGVuY29kZXIgYW5kIHVuLVJMRSBjb2RlIGFuZCBhcmUgdGhlcmVmb3JlIG5vdAogKiBoaWdobHkgb3B0aW1pc2VkLgogKi8KCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMTZicHAgcmdiLCBsb3NpbmcgYWxwaGEgKi8Kc3RhdGljIGludApjb3B5X29wYXF1ZV8xNih2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDE2ICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7CiAgICAgICAgUkdCX0ZST01fUElYRUwoKnNyYywgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0IoKmQsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogMjsKfQoKLyogZGVjb2RlIG9wYXF1ZSBwaXhlbHMgZnJvbSAxNmJwcCB0byAzMmJwcCByZ2IgKyBhICovCnN0YXRpYyBpbnQKdW5jb3B5X29wYXF1ZV8xNihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDE2ICpzID0gc3JjOwogICAgdW5zaWduZWQgYWxwaGEgPSBkZm10LT5BbWFzayA/IDI1NSA6IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsKICAgICAgICBSR0JfRlJPTV9QSVhFTCgqcywgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGFscGhhKTsKICAgICAgICBzKys7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDI7Cn0KCgoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTY1ICovCnN0YXRpYyBpbnQKY29weV90cmFuc2xfNTY1KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDE2IHBpeDsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgICpkID0gKChwaXggJiAweDdlMCkgPDwgMTYpIHwgKHBpeCAmIDB4ZjgxZikgfCAoKGEgPDwgMikgJiAweDdlMCk7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NTUgKi8Kc3RhdGljIGludApjb3B5X3RyYW5zbF81NTUodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MTYgcGl4OwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgKmQgPSAoKHBpeCAmIDB4M2UwKSA8PCAxNikgfCAocGl4ICYgMHhmYzFmKSB8ICgoYSA8PCAyKSAmIDB4M2UwKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGRlY29kZSB0cmFuc2x1Y2VudCBwaXhlbHMgZnJvbSAzMmJwcCBHT1JBQiB0byAzMmJwcCByZ2IgKyBhICovCnN0YXRpYyBpbnQKdW5jb3B5X3RyYW5zbF8xNihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpzID0gc3JjOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDMyIHBpeCA9ICpzKys7CiAgICAgICAgYSA9IChwaXggJiAweDNlMCkgPj4gMjsKICAgICAgICBwaXggPSAocGl4ICYgfjB4M2UwKSB8IHBpeCA+PiAxNjsKICAgICAgICBSR0JfRlJPTV9QSVhFTChwaXgsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZW5jb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQKY29weV8zMih2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmQsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGQrKzsKICAgICAgICBzcmMrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZGVjb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQKdW5jb3B5XzMyKFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqcyA9IHNyYzsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQzMiBwaXhlbCA9ICpzKys7CiAgICAgICAgUkdCX0ZST01fUElYRUwocGl4ZWwsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIGEgPSBwaXhlbCA+PiAyNDsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCiNkZWZpbmUgSVNPUEFRVUUocGl4ZWwsIGZtdCkgKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSA9PSAyNTUpCgojZGVmaW5lIElTVFJBTlNMKHBpeGVsLCBmbXQpICAgIFwKICAgICgodW5zaWduZWQpKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSAtIDFVKSA8IDI1NFUpCgovKiBjb252ZXJ0IHN1cmZhY2UgdG8gYmUgcXVpY2tseSBhbHBoYS1ibGl0dGFibGUgb250byBkZXN0LCBpZiBwb3NzaWJsZSAqLwpzdGF0aWMgaW50ClJMRUFscGhhU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIFNETF9TdXJmYWNlICpkZXN0OwogICAgU0RMX1BpeGVsRm9ybWF0ICpkZjsKICAgIGludCBtYXhzaXplID0gMDsKICAgIGludCBtYXhfb3BhcXVlX3J1bjsKICAgIGludCBtYXhfdHJhbnNsX3J1biA9IDY1NTM1OwogICAgdW5zaWduZWQgbWFza3N1bTsKICAgIFVpbnQ4ICpybGVidWYsICpkc3Q7CiAgICBpbnQgKCpjb3B5X29wYXF1ZSkgKHZvaWQgKiwgVWludDMyICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKmNvcHlfdHJhbnNsKSAodm9pZCAqLCBVaW50MzIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwoKICAgIGRlc3QgPSBzdXJmYWNlLT5tYXAtPmRzdDsKICAgIGlmICghZGVzdCkKICAgICAgICByZXR1cm4gLTE7CiAgICBkZiA9IGRlc3QtPmZvcm1hdDsKICAgIGlmIChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSAzMikKICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiBvbmx5IDMyYnBwIHNvdXJjZSBzdXBwb3J0ZWQgKi8KCiAgICAvKiBmaW5kIG91dCB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBvbmUgd2Ugc3VwcG9ydCwKICAgICAgIGFuZCBkZXRlcm1pbmUgdGhlIG1heCBzaXplIG9mIHRoZSBlbmNvZGVkIHJlc3VsdCAqLwogICAgbWFza3N1bSA9IGRmLT5SbWFzayB8IGRmLT5HbWFzayB8IGRmLT5CbWFzazsKICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgIGNhc2UgMjoKICAgICAgICAvKiAxNmJwcDogb25seSBzdXBwb3J0IDU2NSBhbmQgNTU1IGZvcm1hdHMgKi8KICAgICAgICBzd2l0Y2ggKG1hc2tzdW0pIHsKICAgICAgICBjYXNlIDB4ZmZmZjoKICAgICAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkgewogICAgICAgICAgICAgICAgY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKICAgICAgICAgICAgICAgIGNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTY1OwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDdmZmY6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwM2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwM2UwIHx8IGRmLT5CbWFzayA9PSAweDAzZTApIHsKICAgICAgICAgICAgICAgIGNvcHlfb3BhcXVlID0gY29weV9vcGFxdWVfMTY7CiAgICAgICAgICAgICAgICBjb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU1NTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgbWF4X29wYXF1ZV9ydW4gPSAyNTU7ICAgLyogcnVucyBzdG9yZWQgYXMgYnl0ZXMgKi8KCiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscywKICAgICAgICAgICB3aXRoIHJvb20gZm9yIGFsaWdubWVudCBwYWRkaW5nIGJldHdlZW4gbGluZXMgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICsgKDQgKyAyKSAqIChzdXJmYWNlLT53ICsgMSkpICsgMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgICBpZiAobWFza3N1bSAhPSAweDAwZmZmZmZmKQogICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgIC8qIHJlcXVpcmVzIHVudXNlZCBoaWdoIGJ5dGUgKi8KICAgICAgICBjb3B5X29wYXF1ZSA9IGNvcHlfMzI7CiAgICAgICAgY29weV90cmFuc2wgPSBjb3B5XzMyOwogICAgICAgIG1heF9vcGFxdWVfcnVuID0gMjU1OyAgIC8qIHJ1bnMgc3RvcmVkIGFzIHNob3J0IGludHMgKi8KCiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscyAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogMiAqIDQgKiAoc3VyZmFjZS0+dyArIDEpICsgNDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogYW55dGhpbmcgZWxzZSB1bnN1cHBvcnRlZCByaWdodCBub3cgKi8KICAgIH0KCiAgICBtYXhzaXplICs9IHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKICAgIHJsZWJ1ZiA9IChVaW50OCAqKSBTRExfbWFsbG9jKG1heHNpemUpOwogICAgaWYgKCFybGVidWYpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CiAgICB7CiAgICAgICAgLyogc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IHNvIHdlIGNhbiB1bmRvIHRoZSBlbmNvZGluZyBsYXRlciAqLwogICAgICAgIFJMRURlc3RGb3JtYXQgKnIgPSAoUkxFRGVzdEZvcm1hdCAqKSBybGVidWY7CiAgICAgICAgci0+Qnl0ZXNQZXJQaXhlbCA9IGRmLT5CeXRlc1BlclBpeGVsOwogICAgICAgIHItPlJtYXNrID0gZGYtPlJtYXNrOwogICAgICAgIHItPkdtYXNrID0gZGYtPkdtYXNrOwogICAgICAgIHItPkJtYXNrID0gZGYtPkJtYXNrOwogICAgICAgIHItPkFtYXNrID0gZGYtPkFtYXNrOwogICAgICAgIHItPlJsb3NzID0gZGYtPlJsb3NzOwogICAgICAgIHItPkdsb3NzID0gZGYtPkdsb3NzOwogICAgICAgIHItPkJsb3NzID0gZGYtPkJsb3NzOwogICAgICAgIHItPkFsb3NzID0gZGYtPkFsb3NzOwogICAgICAgIHItPlJzaGlmdCA9IGRmLT5Sc2hpZnQ7CiAgICAgICAgci0+R3NoaWZ0ID0gZGYtPkdzaGlmdDsKICAgICAgICByLT5Cc2hpZnQgPSBkZi0+QnNoaWZ0OwogICAgICAgIHItPkFzaGlmdCA9IGRmLT5Bc2hpZnQ7CiAgICB9CiAgICBkc3QgPSBybGVidWYgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CgogICAgLyogRG8gdGhlIGFjdHVhbCBlbmNvZGluZyAqLwogICAgewogICAgICAgIGludCB4LCB5OwogICAgICAgIGludCBoID0gc3VyZmFjZS0+aCwgdyA9IHN1cmZhY2UtPnc7CiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKICAgICAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikgc3VyZmFjZS0+cGl4ZWxzOwogICAgICAgIFVpbnQ4ICpsYXN0bGluZSA9IGRzdDsgIC8qIGVuZCBvZiBsYXN0IG5vbi1ibGFuayBsaW5lICovCgogICAgICAgIC8qIG9wYXF1ZSBjb3VudHMgYXJlIDggb3IgMTYgYml0cywgZGVwZW5kaW5nIG9uIHRhcmdldCBkZXB0aCAqLwojZGVmaW5lIEFERF9PUEFRVUVfQ09VTlRTKG4sIG0pICAgICAgICAgXAogICAgaWYoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gNCkgeyAgICAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVswXSA9IG47ICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsgICAgIFwKICAgICAgICBkc3QgKz0gNDsgICAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzBdID0gbjsgICAgICAgICAgICAgXAogICAgICAgIGRzdFsxXSA9IG07ICAgICAgICAgICAgIFwKICAgICAgICBkc3QgKz0gMjsgICAgICAgICAgICAgICBcCiAgICB9CgogICAgICAgIC8qIHRyYW5zbHVjZW50IGNvdW50cyBhcmUgYWx3YXlzIDE2IGJpdCAqLwojZGVmaW5lIEFERF9UUkFOU0xfQ09VTlRTKG4sIG0pICAgICBcCiAgICAoKChVaW50MTYgKilkc3QpWzBdID0gbiwgKChVaW50MTYgKilkc3QpWzFdID0gbSwgZHN0ICs9IDQpCgogICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKICAgICAgICAgICAgaW50IHJ1bnN0YXJ0LCBza2lwc3RhcnQ7CiAgICAgICAgICAgIGludCBibGFua2xpbmUgPSAwOwogICAgICAgICAgICAvKiBGaXJzdCBlbmNvZGUgYWxsIG9wYXF1ZSBwaXhlbHMgb2YgYSBzY2FuIGxpbmUgKi8KICAgICAgICAgICAgeCA9IDA7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgICAgIHNraXBzdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgIUlTT1BBUVVFKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiBJU09QQVFVRShzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CiAgICAgICAgICAgICAgICBpZiAoc2tpcCA9PSB3KQogICAgICAgICAgICAgICAgICAgIGJsYW5rbGluZSA9IDE7CiAgICAgICAgICAgICAgICBydW4gPSB4IC0gcnVuc3RhcnQ7CiAgICAgICAgICAgICAgICB3aGlsZSAoc2tpcCA+IG1heF9vcGFxdWVfcnVuKSB7CiAgICAgICAgICAgICAgICAgICAgQUREX09QQVFVRV9DT1VOVFMobWF4X29wYXF1ZV9ydW4sIDApOwogICAgICAgICAgICAgICAgICAgIHNraXAgLT0gbWF4X29wYXF1ZV9ydW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfb3BhcXVlX3J1bik7CiAgICAgICAgICAgICAgICBBRERfT1BBUVVFX0NPVU5UUyhza2lwLCBsZW4pOwogICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwogICAgICAgICAgICAgICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKDAsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IG91dHB1dCBhZGRyZXNzIGlzIDMyLWJpdCBhbGlnbmVkICovCiAgICAgICAgICAgIGRzdCArPSAodWludHB0cl90KSBkc3QgJiAyOwoKICAgICAgICAgICAgLyogTmV4dCwgZW5jb2RlIGFsbCB0cmFuc2x1Y2VudCBwaXhlbHMgb2YgdGhlIHNhbWUgc2NhbiBsaW5lICovCiAgICAgICAgICAgIHggPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpbnQgcnVuLCBza2lwLCBsZW47CiAgICAgICAgICAgICAgICBza2lwc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmICFJU1RSQU5TTChzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgSVNUUkFOU0woc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICAgICAgYmxhbmtsaW5lICY9IChza2lwID09IHcpOwogICAgICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwogICAgICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhfdHJhbnNsX3J1bikgewogICAgICAgICAgICAgICAgICAgIEFERF9UUkFOU0xfQ09VTlRTKG1heF90cmFuc2xfcnVuLCAwKTsKICAgICAgICAgICAgICAgICAgICBza2lwIC09IG1heF90cmFuc2xfcnVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOwogICAgICAgICAgICAgICAgQUREX1RSQU5TTF9DT1VOVFMoc2tpcCwgbGVuKTsKICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgd2hpbGUgKHJ1bikgewogICAgICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKICAgICAgICAgICAgICAgICAgICBBRERfVFJBTlNMX0NPVU5UUygwLCBsZW4pOwogICAgICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJsYW5rbGluZSkKICAgICAgICAgICAgICAgICAgICBsYXN0bGluZSA9IGRzdDsKICAgICAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICAgICAgc3JjICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7CiAgICAgICAgfQogICAgICAgIGRzdCA9IGxhc3RsaW5lOyAgICAgICAgIC8qIGJhY2sgdXAgcGFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwogICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKDAsIDApOwogICAgfQoKI3VuZGVmIEFERF9PUEFRVUVfQ09VTlRTCiN1bmRlZiBBRERfVFJBTlNMX0NPVU5UUwoKICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgaXQgZW5jb2RlZCwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgcGl4ZWxzICovCiAgICBpZiAoIShzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykpIHsKICAgICAgICBTRExfZnJlZShzdXJmYWNlLT5waXhlbHMpOwogICAgICAgIHN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CiAgICB9CgogICAgLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLwogICAgewogICAgICAgIFVpbnQ4ICpwID0gU0RMX3JlYWxsb2MocmxlYnVmLCBkc3QgLSBybGVidWYpOwogICAgICAgIGlmICghcCkKICAgICAgICAgICAgcCA9IHJsZWJ1ZjsKICAgICAgICBzdXJmYWNlLT5tYXAtPmRhdGEgPSBwOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgVWludDMyCmdldHBpeF84KFVpbnQ4ICogc3JjYnVmKQp7CiAgICByZXR1cm4gKnNyY2J1ZjsKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfMTYoVWludDggKiBzcmNidWYpCnsKICAgIHJldHVybiAqKFVpbnQxNiAqKSBzcmNidWY7Cn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzI0KFVpbnQ4ICogc3JjYnVmKQp7CiNpZiBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOCiAgICByZXR1cm4gc3JjYnVmWzBdICsgKHNyY2J1ZlsxXSA8PCA4KSArIChzcmNidWZbMl0gPDwgMTYpOwojZWxzZQogICAgcmV0dXJuIChzcmNidWZbMF0gPDwgMTYpICsgKHNyY2J1ZlsxXSA8PCA4KSArIHNyY2J1ZlsyXTsKI2VuZGlmCn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzMyKFVpbnQ4ICogc3JjYnVmKQp7CiAgICByZXR1cm4gKihVaW50MzIgKikgc3JjYnVmOwp9Cgp0eXBlZGVmIFVpbnQzMigqZ2V0cGl4X2Z1bmMpIChVaW50OCAqKTsKCnN0YXRpYyBjb25zdCBnZXRwaXhfZnVuYyBnZXRwaXhlc1s0XSA9IHsKICAgIGdldHBpeF84LCBnZXRwaXhfMTYsIGdldHBpeF8yNCwgZ2V0cGl4XzMyCn07CgpzdGF0aWMgaW50ClJMRUNvbG9ya2V5U3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIFVpbnQ4ICpybGVidWYsICpkc3Q7CiAgICBpbnQgbWF4bjsKICAgIGludCB5OwogICAgVWludDggKnNyY2J1ZiwgKmxhc3RsaW5lOwogICAgaW50IG1heHNpemUgPSAwOwogICAgaW50IGJwcCA9IHN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKICAgIGdldHBpeF9mdW5jIGdldHBpeDsKICAgIFVpbnQzMiBja2V5LCByZ2JtYXNrOwogICAgaW50IHcsIGg7CgogICAgLyogY2FsY3VsYXRlIHRoZSB3b3JzdCBjYXNlIHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIHN1cmZhY2UgKi8KICAgIHN3aXRjaCAoYnBwKSB7CiAgICBjYXNlIDE6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zcGFyZW50IHBpeGVscywKICAgICAgICAgICBzdGFydGluZyB3aXRoIGFuIG9wYXF1ZSBwaXhlbCAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogMyAqIChzdXJmYWNlLT53IC8gMiArIDEpICsgMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIHNvbGlkIHJ1bnMsIGF0IG1vc3QgMjU1IHBpeGVscyB3aWRlICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoMiAqIChzdXJmYWNlLT53IC8gMjU1ICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1cmZhY2UtPncgKiBicHApICsgMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIHNvbGlkIHJ1bnMsIGF0IG1vc3QgNjU1MzUgcGl4ZWxzIHdpZGUgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICg0ICogKHN1cmZhY2UtPncgLyA2NTUzNSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdXJmYWNlLT53ICogNCkgKyA0OwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJsZWJ1ZiA9IChVaW50OCAqKSBTRExfbWFsbG9jKG1heHNpemUpOwogICAgaWYgKHJsZWJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIFNETF9PdXRPZk1lbW9yeSgpOwogICAgfQoKICAgIC8qIFNldCB1cCB0aGUgY29udmVyc2lvbiAqLwogICAgc3JjYnVmID0gKFVpbnQ4ICopIHN1cmZhY2UtPnBpeGVsczsKICAgIG1heG4gPSBicHAgPT0gNCA/IDY1NTM1IDogMjU1OwogICAgZHN0ID0gcmxlYnVmOwogICAgcmdibWFzayA9IH5zdXJmYWNlLT5mb3JtYXQtPkFtYXNrOwogICAgY2tleSA9IHN1cmZhY2UtPm1hcC0+aW5mby5jb2xvcmtleSAmIHJnYm1hc2s7CiAgICBsYXN0bGluZSA9IGRzdDsKICAgIGdldHBpeCA9IGdldHBpeGVzW2JwcCAtIDFdOwogICAgdyA9IHN1cmZhY2UtPnc7CiAgICBoID0gc3VyZmFjZS0+aDsKCiNkZWZpbmUgQUREX0NPVU5UUyhuLCBtKSAgICAgICAgICAgIFwKICAgIGlmKGJwcCA9PSA0KSB7ICAgICAgICAgICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMV0gPSBtOyAgICAgXAogICAgICAgIGRzdCArPSA0OyAgICAgICAgICAgICAgIFwKICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMF0gPSBuOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzFdID0gbTsgICAgICAgICAgICAgXAogICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgIFwKICAgIH0KCiAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CiAgICAgICAgaW50IHggPSAwOwogICAgICAgIGludCBibGFua2xpbmUgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaW50IHJ1biwgc2tpcCwgbGVuOwogICAgICAgICAgICBpbnQgcnVuc3RhcnQ7CiAgICAgICAgICAgIGludCBza2lwc3RhcnQgPSB4OwoKICAgICAgICAgICAgLyogZmluZCBydW4gb2YgdHJhbnNwYXJlbnQsIHRoZW4gb3BhcXVlIHBpeGVscyAqLwogICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgKGdldHBpeChzcmNidWYgKyB4ICogYnBwKSAmIHJnYm1hc2spID09IGNrZXkpCiAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgIHJ1bnN0YXJ0ID0geDsKICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSAhPSBja2V5KQogICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICBza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CiAgICAgICAgICAgIGlmIChza2lwID09IHcpCiAgICAgICAgICAgICAgICBibGFua2xpbmUgPSAxOwogICAgICAgICAgICBydW4gPSB4IC0gcnVuc3RhcnQ7CgogICAgICAgICAgICAvKiBlbmNvZGUgc2VnbWVudCAqLwogICAgICAgICAgICB3aGlsZSAoc2tpcCA+IG1heG4pIHsKICAgICAgICAgICAgICAgIEFERF9DT1VOVFMobWF4biwgMCk7CiAgICAgICAgICAgICAgICBza2lwIC09IG1heG47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4bik7CiAgICAgICAgICAgIEFERF9DT1VOVFMoc2tpcCwgbGVuKTsKICAgICAgICAgICAgU0RMX21lbWNweShkc3QsIHNyY2J1ZiArIHJ1bnN0YXJ0ICogYnBwLCBsZW4gKiBicHApOwogICAgICAgICAgICBkc3QgKz0gbGVuICogYnBwOwogICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgIHdoaWxlIChydW4pIHsKICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heG4pOwogICAgICAgICAgICAgICAgQUREX0NPVU5UUygwLCBsZW4pOwogICAgICAgICAgICAgICAgU0RMX21lbWNweShkc3QsIHNyY2J1ZiArIHJ1bnN0YXJ0ICogYnBwLCBsZW4gKiBicHApOwogICAgICAgICAgICAgICAgZHN0ICs9IGxlbiAqIGJwcDsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFibGFua2xpbmUpCiAgICAgICAgICAgICAgICBsYXN0bGluZSA9IGRzdDsKICAgICAgICB9IHdoaWxlICh4IDwgdyk7CgogICAgICAgIHNyY2J1ZiArPSBzdXJmYWNlLT5waXRjaDsKICAgIH0KICAgIGRzdCA9IGxhc3RsaW5lOyAgICAgICAgICAgICAvKiBiYWNrIHVwIGJhc3QgdHJhaWxpbmcgYmxhbmsgbGluZXMgKi8KICAgIEFERF9DT1VOVFMoMCwgMCk7CgojdW5kZWYgQUREX0NPVU5UUwoKICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgaXQgZW5jb2RlZCwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgcGl4ZWxzICovCiAgICBpZiAoIShzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykpIHsKICAgICAgICBTRExfZnJlZShzdXJmYWNlLT5waXhlbHMpOwogICAgICAgIHN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CiAgICB9CgogICAgLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLwogICAgewogICAgICAgIC8qIElmIHJlYWxsb2MgcmV0dXJucyBOVUxMLCB0aGUgb3JpZ2luYWwgYmxvY2sgaXMgbGVmdCBpbnRhY3QgKi8KICAgICAgICBVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKICAgICAgICBpZiAoIXApCiAgICAgICAgICAgIHAgPSBybGVidWY7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gcDsKICAgIH0KCiAgICByZXR1cm4gKDApOwp9CgppbnQKU0RMX1JMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBpbnQgZmxhZ3M7CgogICAgLyogQ2xlYXIgYW55IHByZXZpb3VzIFJMRSBjb252ZXJzaW9uICovCiAgICBpZiAoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwpIHsKICAgICAgICBTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDEpOwogICAgfQoKICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgUkxFIGVuY29kaW5nIG9mIGJpdG1hcHMgKi8KICAgIGlmIChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDgpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogTWFrZSBzdXJlIHRoZSBwaXhlbHMgYXJlIGF2YWlsYWJsZSAqLwogICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBjb2xvcmtleSBvciBibGVuZGluZywgbm90aGluZyB0byBkby4uLiAqLwogICAgZmxhZ3MgPSBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3M7CiAgICBpZiAoIShmbGFncyAmIChTRExfQ09QWV9DT0xPUktFWSB8IFNETF9DT1BZX0JMRU5EKSkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogUGFzcyBvbiBjb21iaW5hdGlvbnMgbm90IHN1cHBvcnRlZCAqLwogICAgaWYgKChmbGFncyAmIFNETF9DT1BZX01PRFVMQVRFX0NPTE9SKSB8fAogICAgICAgICgoZmxhZ3MgJiBTRExfQ09QWV9NT0RVTEFURV9BTFBIQSkgJiYgc3VyZmFjZS0+Zm9ybWF0LT5BbWFzaykgfHwKICAgICAgICAoZmxhZ3MgJiAoU0RMX0NPUFlfQUREIHwgU0RMX0NPUFlfTU9EKSkgfHwKICAgICAgICAoZmxhZ3MgJiBTRExfQ09QWV9ORUFSRVNUKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBFbmNvZGUgYW5kIHNldCB1cCB0aGUgYmxpdCAqLwogICAgaWYgKCFzdXJmYWNlLT5mb3JtYXQtPkFtYXNrIHx8ICEoZmxhZ3MgJiBTRExfQ09QWV9CTEVORCkpIHsKICAgICAgICBpZiAoIXN1cmZhY2UtPm1hcC0+aWRlbnRpdHkpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpZiAoUkxFQ29sb3JrZXlTdXJmYWNlKHN1cmZhY2UpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+YmxpdCA9IFNETF9STEVCbGl0OwogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyB8PSBTRExfQ09QWV9STEVfQ09MT1JLRVk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChSTEVBbHBoYVN1cmZhY2Uoc3VyZmFjZSkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc3VyZmFjZS0+bWFwLT5ibGl0ID0gU0RMX1JMRUFscGhhQmxpdDsKICAgICAgICBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgfD0gU0RMX0NPUFlfUkxFX0FMUEhBS0VZOwogICAgfQoKICAgIC8qIFRoZSBzdXJmYWNlIGlzIG5vdyBhY2NlbGVyYXRlZCAqLwogICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwoKICAgIHJldHVybiAoMCk7Cn0KCi8qCiAqIFVuLVJMRSBhIHN1cmZhY2Ugd2l0aCBwaXhlbCBhbHBoYQogKiBUaGlzIG1heSBub3QgZ2l2ZSBiYWNrIGV4YWN0bHkgdGhlIGltYWdlIGJlZm9yZSBSTEUtZW5jb2Rpbmc7IGFsbAogKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHBpeGVscyB3aWxsIGJlIGxvc3QsIGFuZCBjb2xvciBhbmQgYWxwaGEgZGVwdGgKICogbWF5IGhhdmUgYmVlbiByZWR1Y2VkICh3aGVuIGVuY29kaW5nIGZvciAxNmJwcCB0YXJnZXRzKS4KICovCnN0YXRpYyBTRExfYm9vbApVblJMRUFscGhhKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgVWludDggKnNyY2J1ZjsKICAgIFVpbnQzMiAqZHN0OwogICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKICAgIFJMRURlc3RGb3JtYXQgKmRmID0gc3VyZmFjZS0+bWFwLT5kYXRhOwogICAgaW50ICgqdW5jb3B5X29wYXF1ZSkgKFVpbnQzMiAqLCB2b2lkICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKnVuY29weV90cmFuc2wpIChVaW50MzIgKiwgdm9pZCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgdyA9IHN1cmZhY2UtPnc7CiAgICBpbnQgYnBwID0gZGYtPkJ5dGVzUGVyUGl4ZWw7CgogICAgaWYgKGJwcCA9PSAyKSB7CiAgICAgICAgdW5jb3B5X29wYXF1ZSA9IHVuY29weV9vcGFxdWVfMTY7CiAgICAgICAgdW5jb3B5X3RyYW5zbCA9IHVuY29weV90cmFuc2xfMTY7CiAgICB9IGVsc2UgewogICAgICAgIHVuY29weV9vcGFxdWUgPSB1bmNvcHlfdHJhbnNsID0gdW5jb3B5XzMyOwogICAgfQoKICAgIHN1cmZhY2UtPnBpeGVscyA9IFNETF9tYWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKICAgIGlmICghc3VyZmFjZS0+cGl4ZWxzKSB7CiAgICAgICAgcmV0dXJuIChTRExfRkFMU0UpOwogICAgfQogICAgLyogZmlsbCBiYWNrZ3JvdW5kIHdpdGggdHJhbnNwYXJlbnQgcGl4ZWxzICovCiAgICBTRExfbWVtc2V0KHN1cmZhY2UtPnBpeGVscywgMCwgc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKCiAgICBkc3QgPSBzdXJmYWNlLT5waXhlbHM7CiAgICBzcmNidWYgPSAoVWludDggKikgKGRmICsgMSk7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgLyogY29weSBvcGFxdWUgcGl4ZWxzICovCiAgICAgICAgaW50IG9mcyA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICB1bnNpZ25lZCBydW47CiAgICAgICAgICAgIGlmIChicHAgPT0gMikgewogICAgICAgICAgICAgICAgb2ZzICs9IHNyY2J1ZlswXTsKICAgICAgICAgICAgICAgIHJ1biA9IHNyY2J1ZlsxXTsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICAgICAgc3JjYnVmICs9IDQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgc3JjYnVmICs9IHVuY29weV9vcGFxdWUoZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykKICAgICAgICAgICAgICAgIHJldHVybiAoU0RMX1RSVUUpOwogICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwoKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVlZGVkICovCiAgICAgICAgaWYgKGJwcCA9PSAyKQogICAgICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdCkgc3JjYnVmICYgMjsKCiAgICAgICAgLyogY29weSB0cmFuc2x1Y2VudCBwaXhlbHMgKi8KICAgICAgICBvZnMgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgdW5zaWduZWQgcnVuOwogICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgc3JjYnVmICs9IDQ7CiAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSB1bmNvcHlfdHJhbnNsKGRzdCArIG9mcywgc3JjYnVmLCBydW4sIGRmLCBzZik7CiAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CiAgICAgICAgZHN0ICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7CiAgICB9CiAgICAvKiBNYWtlIHRoZSBjb21waWxlciBoYXBweSAqLwogICAgcmV0dXJuIChTRExfVFJVRSk7Cn0KCnZvaWQKU0RMX1VuUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UsIGludCByZWNvZGUpCnsKICAgIGlmIChzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgewogICAgICAgIHN1cmZhY2UtPmZsYWdzICY9IH5TRExfUkxFQUNDRUw7CgogICAgICAgIGlmIChyZWNvZGUgJiYgIShzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykpIHsKICAgICAgICAgICAgaWYgKHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyAmIFNETF9DT1BZX1JMRV9DT0xPUktFWSkgewogICAgICAgICAgICAgICAgU0RMX1JlY3QgZnVsbDsKCiAgICAgICAgICAgICAgICAvKiByZS1jcmVhdGUgdGhlIG9yaWdpbmFsIHN1cmZhY2UgKi8KICAgICAgICAgICAgICAgIHN1cmZhY2UtPnBpeGVscyA9IFNETF9tYWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKICAgICAgICAgICAgICAgIGlmICghc3VyZmFjZS0+cGl4ZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgLyogT2ggY3JhcC4uLiAqLwogICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogZmlsbCBpdCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICAgICAgICAgICAgICBTRExfRmlsbFJlY3Qoc3VyZmFjZSwgTlVMTCwgc3VyZmFjZS0+bWFwLT5pbmZvLmNvbG9ya2V5KTsKCiAgICAgICAgICAgICAgICAvKiBub3cgcmVuZGVyIHRoZSBlbmNvZGVkIHN1cmZhY2UgKi8KICAgICAgICAgICAgICAgIGZ1bGwueCA9IGZ1bGwueSA9IDA7CiAgICAgICAgICAgICAgICBmdWxsLncgPSBzdXJmYWNlLT53OwogICAgICAgICAgICAgICAgZnVsbC5oID0gc3VyZmFjZS0+aDsKICAgICAgICAgICAgICAgIFNETF9STEVCbGl0KHN1cmZhY2UsICZmdWxsLCBzdXJmYWNlLCAmZnVsbCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIVVuUkxFQWxwaGEoc3VyZmFjZSkpIHsKICAgICAgICAgICAgICAgICAgICAvKiBPaCBjcmFwLi4uICovCiAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgJj0KICAgICAgICAgICAgfihTRExfQ09QWV9STEVfQ09MT1JLRVkgfCBTRExfQ09QWV9STEVfQUxQSEFLRVkpOwoKICAgICAgICBpZiAoc3VyZmFjZS0+bWFwLT5kYXRhKSB7CiAgICAgICAgICAgIFNETF9mcmVlKHN1cmZhY2UtPm1hcC0+ZGF0YSk7CiAgICAgICAgICAgIHN1cmZhY2UtPm1hcC0+ZGF0YSA9IE5VTEw7CiAgICAgICAgfQogICAgfQp9CgovKiB2aTogc2V0IHRzPTQgc3c9NCBleHBhbmR0YWI6ICovCg==